cloud-atlas-draft
  • README
  • 服务器
    • 内存
      • MLC - Intel内存延迟测试工具
    • IPMI
      • ipmitool使用tips
      • 服务器oob带外访问设置
      • ipmi操作和对应的sel日志记录
      • BMC故障导致kipmi0极高的CPU使用
      • HP服务器frimware问题导致ACPI缓存大小相关报错
      • server/ipmi/使用ipmitool在Linux平台配置IPMI
      • 系统日志IPMI message handler: BMC returned incorrect response
      • 串口管理程序conman
    • BIOS
      • 通过linux命令行修改服务器BIOS配置
      • 使用AMI SCELNX修改BIOS设置
      • Dell BIOS设置案例(关闭IR-SRV)
      • 在Linux中通过命令行修改BIOS
      • BIOS/UEFI和EDK
    • 传感器
      • 检查CPU温度
    • Open Compute
      • 服务器选型
  • 操作系统
    • Linux
      • 启动
        • RHEL7升级后磁盘设备label识别错误处理
        • 系统重启时间检查
      • 进程
        • 进程管理
          • 进程状态标志的含义
          • 运行队列中进程排查方法
          • ps命令tips
          • 杀掉多个进程的方法
          • 使用nice调整进程优先级
          • 检查进程的内存使用
          • 查看进程的线程方法
          • top命令使用tips
          • 显示最消耗cpu资源的进程
          • 检查进程运行在哪个CPU上
          • 检查进程启动时间
          • 检查进程使用网络端口
          • 控制台输出"INIT: Id "c0" respawning too fast: disabled for 5 minutes"
          • cron定时执行任务
        • SELinux
        • 线程
          • 进程和线程
          • 检查线程的方法
          • 内核线程
      • 日志
        • 日志文件管理
        • logrotate日志轮转工具
        • logwatch日志监视工具
        • mcelog系统硬件诊断日志搜集工具
        • systemd环境syslog-ng启动失败排查
        • syslog-ng部署和维护
        • tmp临时文件目录自动清理
        • 禁止日志打印到控制台
      • 内核
        • Linux资源管理
          • Cgroup快速起步
            • 如何限制进程使用的内存
            • Cgroup的CPU使用统计控制器
            • Cgroup v2简介
          • 在RHEL6中的Cgroups
            • RHEL6 Cgroups概述
            • RHEL6 使用控制组
          • 在RHEL7中的Cgroups
            • RHEL7 Cgroups概述
            • RHEL7 使用控制组
            • RHEL7 使用libcgroup工具
            • libvirtd日志报错virCgroupSetValueStr"No space left on device"
        • 网络
          • 多网卡bonding
            • Linux以太网Bonding驱动
            • 不断网在线修改bonding网卡MTU
          • 系统日志"TCP: time wait bucket table overflow"分析
          • Linux上禁用IPv6
          • 内核参数网络配置案例
          • SYN攻击、SYN cookie和其他
          • dmesg日志"TCP:unexpectedly shrunk window"
          • TCP拥塞控制
          • 通过BBR TCP拥塞控制算法加速Internet速度
          • 在Ubuntu 18上启用TCP BBR加速网络性能
          • ssh连接超时"Connection timed out"和内核tcp_syn_retries
        • 内核中日志模块和参数
          • 系统日志"__ratelimit: N callbacks suppressed"分析
        • cpu
          • CPU型号和分类
          • cpuinfo无法显示部分core
          • cpu_affinity
          • 中断和smp_affinity
          • 内核线程"migration"和CPU使用
          • 软中断
          • IRQ进程
          • 微代码Microcode
          • Linux 时钟管理
          • Intel Turbo Boost技术和intel_pstate
          • intel_pstate驱动详解
          • acpi-cpufreq主频设置
          • 修改ACPI事件:更改电源键默认操作
          • 笔记本suspended后数秒无故wake up问题排查("ACPI: Waking up from system sleep state S3")
          • 系统负载Load Averages的含义
          • 分析Intel CPU Machine Check Exception(MCE)
          • "NOHZ: local_softirq_pending 100"
          • "NETDEV WATCHDOG: slave0 (bnx2): transmit queue 5 timed out"内核Panic排查
          • Intel Skylake/Kaby Lake处理器系列简介
          • Intel Skylake/Kaby Lake处理器超线程bug及处理
          • dmidecode分析
          • "unchecked MSR access error"
          • AMD处理器ZEN一代之国产化海光
        • 内核调度
          • Linux内核调度基础知识
          • unthrottle_cfs_rq错误修复
        • 内核模块
          • 内核模块参数
          • 内核模式设置KMS
          • DKMS动态内核模块支持
          • dracut简介
        • 内存
          • 内存管理技术简介
            • 概述
          • 透明大页(Transparent Hugepages, THP)
            • 透明大页(Transparent Hugepage)
            • 在Red Hat Enterprise Linux 6/7中使用、监控和禁用透明大页
          • NUMA
            • NUMA node interleaving
            • 从UMA到NUMA
          • RDT
          • order 1内存页分配错误
          • 内核同页合并
          • 检查进程使用内存
          • 缓存清理(drop_caches)和内存压缩(compact_memory)
        • 存储
          • 块设备持久化命名
          • 块设备阻塞事件
          • kworker任务阻塞超过120秒
          • 热插拔磁盘识别
        • 内核跟踪排查
          • 为什么会发生segfault
          • 内核bug排查方法
          • 调试系统错误(Debugging System Faults)
          • 获取内核core dump
          • "Uhhuh. NMI received for unknown reason NN on CPU X"
          • kdump over nfs
          • kdump之后挂起启动而不重启
          • 获取XEN内核core dump
          • Core dump分析
          • 在core文件生成过程中压缩生成的core文件
          • 高Sys CPU的排查
          • debug呆滞的进程
          • 排查XEN服务器hang机core dump
          • vmcore分析案例:"kernel BUG at fs/buffer.c:1270"
          • 获取MySQL core
          • 在CentOS 5.11中编译crash
          • "Kernel panic - not syncing: stack-protector: Kernel stack is corrupted"
          • "hrtimer: interrupt took xxxx ns"和"NOHZ: local_softirq_pending 100"
          • "AER: Multiple Corrected error received"
          • top始终显示load 1
          • gdb和debuginfo
        • Kernel Panic案例
          • not syncing: Attempted to kill init! exitcode=0x00007f00
        • 性能
          • perf-tools性能工具
          • "perf samples too long"是什么?
          • Perf案例(译)
        • 补丁
          • ksplice, kpatch,kexec 技术简介
      • 设备管理
        • 随机数生成器RNG
        • udev
          • udev设备管理架构
        • pcie
          • 深入TLP:PCI exporess设备通讯原理
      • 存储
        • 磁盘
          • IO scheduler
          • 持久化块设备命名
          • parted磁盘工具
          • 磁盘分区4k对齐优化性能
          • Linux分区破坏的修复
          • 混合HDD/SDD的IO scheduler设置
          • 通过block_dump实时监测LinuxIO
          • 检查磁盘I/O负载
          • iotop监视磁盘访问
        • RAID
          • 在Linux中构建RAID
        • LVM
          • Linux卷管理
          • 扩展lvm卷
          • 缩小lvm卷
          • 在Gentoo上使用LVM
          • 执行pvcreate报错"Device /dev/XXX excluded by a filter."
        • 文件系统
          • Linux文件系统的未来
          • EXT文件系统
            • EXT文件系统文件数
            • EXT文件系统误删文件恢复
            • noatime参数挂载文件系统降低IO
            • 获取文件系统挂载的时间点
            • EXT3文件系统转换成EXT4
            • EXT4文件系统优化
            • EXT3文件系统报错"block bitmap and bg descriptor inconsistent"
            • EXT文件系统坏超级块恢复
            • EXT4根文件系统resize
            • EXT4文件系统dioread_nolock + nodelalloc 挂载选项异步写性能问题
            • disk label
            • 找出使用inode最多的文件目录
          • Btrfs文件系统
            • Btrfs文件系统快速起步
          • XFS文件系统
            • 重命名home目录提示"Device or resource busy"
            • xfs文件系统挂载参数
          • ZFS文件系统
            • ZFS dataset丢失排查
            • ZFS替换故障磁盘
            • ZFS高速IO缓存配置
          • FAT文件系统
            • 在Fedora中访问ExFAT文系统
          • 性能
            • iowait
        • 网络块设备(Network Block Device, nbd)
          • nbd概览
      • 网络
        • 网络协议
          • ARP
            • "arp incomplete"问题排查
        • iproute2
          • ip
        • 多网卡bonding
          • suse操作系统多网卡bonding
        • 可伸缩网络堆栈
          • RSS
        • 防火墙
          • Iptables
            • Iptables简易指南
            • CentOS设置HTTP访问iptables
          • Firewalld
            • 在CentOS7上添加防火墙端口允许访问
            • Firewalld丰富而直接的规则:设置Fedora/CentOS 7作为路由器
          • ufw
            • 使用ufw配置NAT masquerade
        • 交换机
          • 构建Linux三层交换机
          • USB over IP
          • Ethernet over USB
      • 备份
        • 使用tar备份完整Linux操作系统
        • 使用rsync备份完整Linux操作系统
      • 安全
        • 审核
          • 系统审核架构
          • 系统审计部署
          • 找出瞬间消失的TCP网络连接进程
          • 找出inode消耗原因
        • 防火墙
          • Linux防火墙简介
      • Red Hat
        • Fedora
          • 在MacBook Pro上实现Fedora和macOS双启动
          • 使用dnf对Fedora进行系统大版本升级
          • 升级到Fedora 27之后内核安装后不更新grub问题处理
          • Fedora x86_64操作系统兼容运行32位程序
          • 使用dnf安装源代码rpm
          • 在Fedora中使用BCM4360无线网卡
          • Fedora设置fcitx中文输入
          • GoldenDict和英中字典设置
          • 在Fedora中使用LXQt桌面
          • 定制LXQt桌面菜单(添加新应用启动)
          • 使用ImageMagick截屏
          • 在LXQt桌面平铺窗口
          • 在Fedora中切换桌面环境
          • 在Xfce桌面禁用alt+鼠标左键移动窗口功能
          • nVidia GT 750M显卡
          • 在Fedora中播放mp4视频
          • 在Fedora的chromium中播放flash
        • CentOS
        • 系统管理
          • CentOS/RHEL周期性自动清理/tmp目录
          • Linux操作系统登录超时设置
          • Grub 2 boot loader
            • Grub快速起步
            • 在grub2中切换默认启动内核
            • 修改grub2启动内核参数
            • 启动进入终端模式
            • EFI系统分区
          • OpenMLI
          • Systemd
            • 创建systemd服务单元
            • systemd修改主机名
            • systemd清理journal日志
            • systemd管理cpupower
            • systemd管理rc.local启动
            • 使用journalctl检查和维护systemd日志文件
            • 通过systemd设置禁止合上笔记本屏幕suspend
            • 合上笔记本屏幕时关闭屏幕
            • 通过systemd设置fedora系统hibernate休眠
            • systemd-logind高负载和内存泄漏问题排查
            • syslog-ng和systemd-journal远程日志存储
            • systemd-journal日志转发syslog
            • 在远程NFS存储上保存Linux系统日志
            • systemd-resolvd本地网络域名解析服务
            • 排查systemd-networkd配置问题
          • Network
            • CentOS7关闭IPv6
            • CentOS 7设置静态IP
            • NetworkManager命令行配置
            • 在NetworkManager管理的网络连接保持DHCP同时添加静态IP地址
            • 修改默认ens33网卡命名为传统eth0
        • rpm软件包管理
          • "无法获得metalink"错误
          • rpm使用tips
          • 检查和解压缩rpm包内容
          • 定时yum更新系统
          • 最小化安装后的yum安装
          • yum使用tips
          • 使用源代码RPMs
          • 使用dnf管理软件包
          • 转换AliOS到CentOS
          • 绝对不要删除keyutils-libs软件包
          • 无需安装的解压缩rpm文件
          • CentOS 5平台通过yum安装git
          • 跨OS平台构建rpm包
          • 升级CentOS 5系统的autoconf和automake工具
          • 通过yum-builddep安装所有从SRPM编译RPM包所依赖软件包
          • 执行"dnf upgrade"时报错"Error unpacking rpm package"处理
          • 执行"rpm -Uvh --force xxx.rpm --nodeps"返回错误码135
          • rpm命令报错"error: Failed to initialize NSS library"
          • 清理系统不使用的旧内核
        • RHEL/CentOS启动服务Tips
      • Debian
        • deb软件包管理
          • Debian最小化安装后的软件包安装建议
          • Debian安装源修改
          • Debian apt-get update出现软件包Hash Sum mismatch处理
          • 升级Debian 8 Jessie到Debian 9 Stretch
          • DEB和RPM安装包互相转换
      • Ubuntu
        • Ubuntu安装部署
          • 使用tar方式备份和恢复系统
          • 使用tar包手工安装多重启动的ubuntu
          • Ubuntu的Hardware Enablement(HWE)内核
          • "admin"账号已被Ubuntu保留无法使用
          • 在U盘上安装Ubuntu
          • Ubuntu 18.10安装NVIDIA驱动
          • 创建具有持久化存储的Live Ubuntu U盘
          • 安装XUbuntu
          • 在MacBook Pro上安装Ubuntu Server
          • 在MacBook Air上运行Ubuntu
          • 在MacBook Pro上运行ubuntu设置WIFI
          • apt upgrade之后提示"you may need to re-run your boot loader[grub]"
          • 设置apt通过代理安装软件
          • 选择最快的apt镜像网站
          • 升级Ubuntu系统到18.04 LTS Bionic Beaver
          • 避免Ubuntu内核升级
          • 使用.iso镜像或U盘作为APT软件仓库
          • 升级提示"packages have been kept back"
        • Ubuntu系统管理
          • 检查Ubuntu系统版本
          • sudo NOPASSWD不工作问题处理
          • Ubuntu启动字符模式
          • Ubuntu字符终端字体大小调整
          • Ly字符终端显示管理器
          • tessellimage进程
          • 网络
            • Ubuntu基本网络配置
            • 802.1x网络认证
      • Arch
        • Arch Linux包管理
        • Arch Linux本地化
        • 将Linux主机模拟成蓝牙键盘和鼠标
        • Arch Linux静态IP和动态IP配置
        • unblock wifi in rfkill
      • Kali
        • Kali Linux基础
        • 创建Kali镜像仓库
        • Kali Linux初始化
        • 通过VNC访问Kali Linux
        • 矫正Kali Linux时间
        • 定制Kali Linux桌面i3窗口管理器
        • 定制Kali Linux桌面fluxbox窗口管理器
        • 在Kali Linux中修改网卡Mac地址
        • 使用终端方式在Kali Linux中配置Wi-Fi网络
      • Gentoo
        • 在MacBook上安装Gentoo
        • Portage包管理
        • gcc-config错误处理一例
        • nVidia显卡
        • intel显卡
        • 混合显卡切换
        • 从KDE桌面转向Xfce桌面
        • 安装Xfce工作平台
        • 中文输入
        • 安装Broadcom无线网卡
        • 电源管理:suspend和hibernate
        • emerge包管理tips
      • SuSE
        • 在SuSE中安装软件包
        • 在SuSE中设置rc.local
      • Linux From Scratch(LFS)
        • 前言
        • 介绍
        • 准备
        • 构建临时系统
      • X window
        • 从ma上访问远程X window
        • 使用macOS的Homebrew X window远程访问Linux
        • 在macOS上使用homebrew-xorg
        • 向X window程序发送字符串
        • 配置Ubuntu平台VNC服务
        • lightdm图形登陆管理器
        • X无法启动'drmSetMaster failed'
        • noVNC:在浏览器中运行VNC
        • Xpra跨平台远程显示服务器
        • Linux的鼠标采样率
    • FreeBSD
      • FreeBSD介绍
      • FreeBSD安装
      • 在FreeBSD上安装软件:Packages和Ports
      • 在ThinkPad上运行FreeBSD
      • FreeBSD无线网络
      • 基于FreeBSD的防火墙pfSense
    • Windows
      • firewall
        • 在Event Viewer中查看Firewall和IPsec事件
      • Windows 10
        • 不同版本Windows 10区别
        • 清理Windows 10磁盘空间
        • 压缩NTFS驱动器
      • Windoes 2012
        • 在Windows Server 2012安装和卸载GUI
      • Windows 2016
        • 在Windows Server 2016 1709上安装OpenSSH
        • 在Windows服务器上安装Windows Subsystem For Linux(WSL)
        • 在Windows上运行OpenSSH
        • 在Windows上后台运行命令(类似Linux的nohup)
      • rdesktop
        • Mac平台远程桌面
      • IIS Web服务
        • 设置IIS下载.iso文件
      • DEBUG
        • 触发Windows Crash(获取memory dump)
        • Windows异常的debug方法简介
      • Windows脚本
        • Windows的无限循环脚本
  • 数据库
    • mysql
      • 安装和升级
        • CentOS 5安装MySQL 5.7
        • 创建MySQL数据库和授权
        • MySQL数据库密码安全策略返回错误"ERROR 1819"
        • 允许ROOT用户远程访问MySQL
      • 快速起步
        • mysql查询命令输出无表格线
        • mysql启动报错"Another MySQL daemon already running with the same unix socket."
        • 查询最近一小时的数据行
      • MySQL脚本
        • 在Shell脚本中使用mysql
        • 使用my.cnf作为mysql命令行配置
      • SQL
        • 查询结果排序
        • 修改表结构
        • 查询当天数据
        • 查询当前时间之前X分钟
      • 磁盘I/O
        • 什么时候MySQL执行IO
        • 如何解决MySQL IOWait过高问题
      • 索引
        • 检查MySQL表索引
      • 备份
        • 使用mysqldump备份和恢复MySQL数据库
      • 主从同步
        • 如何诊断同步备库延迟
        • MySQL多线程复制
      • 故障排查
        • MySQL Root用户密码重置
    • Oracle
      • ARM环境Oracle客户端
  • 网络
    • TCP/IP
      • TCP连接数检查
      • traceroute检查网络可达性
    • 链路聚合
      • LACP
        • LACP原理
        • LACP的ad_select参数
        • LACP数据包分析
        • bonding网卡链路down
    • 网络数据包分析
      • tcpdump
        • tcpdump
        • tcpdump实例介绍
        • tcpdump避免"packets dropped by kernel"
        • 分析跟踪失败的TCP连接和RST数据包(TCP重传率高)
        • tcpdump在启用TCP卸载功能的网卡上报告"checksum error"
        • 结合ping和tcpdump快速定位网络问题
      • wireshark
        • 使用wireshark分析TCP重传
        • 以普通用户身份运行wireshark
        • 在macOS中同时运行多个wireshark
      • ntop
        • ntop架构
        • 在CentOS 7上安装ntop
        • ntopng开源替代
      • 网络数据包分析工具
        • iftop网络流量(ip+port)分析工具
        • tcptrack网络流量(ip+port)分析工具
        • nethogs网络流量分析工具
      • Cisco
        • Overlay Transport Virtualization (OTV)
        • 交换机
          • 小型商业用交换机
            • Cisco SLM2008 8端口小型千兆交换机
          • 数据中心交换机
            • Cisco Nexus交换机延迟监控工具
        • 防火墙
          • Cisco防火墙DoS防护
      • 服务质量(QoS)
        • QoS技术简介
  • 存储
    • 服务器直连存储DAS
      • mpt2sas
        • LSI SAS2308控制芯片
        • mpt2sas驱动系统日志分析
        • mpt2sas系统日志"0x3003010a"和奇怪的sdm磁盘设备
        • mpt2sas故障排查
          • mpt2sas驱动报错案例
          • mpt2sas故障磁盘剔除
      • S.M.A.R.T.
      • 磁盘检测技术
        • 磁盘健康检查
    • GlusterFS
      • GlusterFS服务器端Quorum
    • Ceph
      • Ceph架构
        • Ceph统一存储解决架构
        • Ceph RADOS
      • Ceph硬件
        • Ceph个人存储硬件选择
      • Ceph部署
        • 在树莓派上部署Ceph集群
      • Ceph配置
      • Ceph操作
      • Ceph监控
      • Ceph和OpenStack
      • Ceph性能优化
        • Ceph性能分析
    • SPDK
      • spoold的cpu affinity
    • VDO
  • 服务技术
    • Sendmail
      • Sendmail队列异常处理
    • ssh
      • ssh密钥
      • ssh客户端配置
      • ssh-keygen生成新的SSH密钥
      • ssh指定私钥和生成无密码密钥
      • ssh端口转发
      • ssh多路传输multiplexing加速
      • 使用sslh在443端口提供多种协议服务
      • sshd服务不能加载主机key
      • sshfs远程访问服务器文件系统
      • https服务访问报错"fips_pkey_signature_test:test failure"
      • 属于多个用户组的用户ssh登陆仅显示主用户组问题
      • 加速ssh登陆
      • sshd服务多端口设置
      • ssh登陆报错"PTY allocation request failed on channel 0"
    • DNS
      • DNSmasq
        • DNSmasq快速起步
      • DNS over HTTPS
        • 一份DNS over HTTPS的卡通化介绍
    • Nginx
      • 在Mac OS X环境使用HomeBrew安装Nginx
      • 在CentOS 5环境手工安装Nginx
      • CentOS快速部署nginx+php
      • h5ai-时尚的HTTP服务器索引
      • 排查Nginx应用响应时间
      • 设置Django和Nginx uWSGI
      • Nginx uWSGI错误日志"(13: Permission denied) while reading upstream"
      • 设置Django和Nginx uWSGI的多站点
      • Docker容器迁移后uWSGI运行报错"ImportError: No module named datetime"
      • Nginx的root和alias
    • OpenResty
      • OpenResty安装
      • OpenResty快速起步
    • HAProxy
      • HAProxy和Nginx软件负载均衡对比
      • 在CentOS7中部署HAProxy
      • 使用HAProxy实现MySQL负载均衡
    • Varnish
      • 在Ubuntu上部署Varnish
      • 在Mac上部署Varnish
    • Proxy
      • Squid vs. Varnish vs. Nginx
      • Polipo:小巧的web代理服务器
      • 设置代理服务器和匿名上网
      • 在macOS上部署squid
    • FTP
      • vsftpd
    • NFS
      • CentOS 7 NFS设置
      • Ubuntu 16 NFS设置
      • NFS挂载超时排查
    • Samba
      • CentOS 7 Samba配置
    • NTP
      • NTP服务基础配置
      • 快速校准时间
      • ntpq错误"Request timed out"排查
      • ntp_gettime() returns code 5 (ERROR)
      • 在Ubuntu系统部署NTP服务
      • 命令行设置系统时间
    • aria2
      • 使用多协议多线程下载工具aria2
      • 使用aria2 WEB前端yaaw
    • 流媒体
      • OBS Studio广播
  • 消息队列
    • RabbitMQ
      • 安装RabbitMQ
      • AMQP简介
    • kafka
    • Redis
  • 安全
    • VPN
      • OpenConnect
        • 在Android上使用OpenConnect连接ocserv
        • 安装使用OpenConnect
        • 部署ocserv VPN服务器
        • 部署支持证书的OpenConnect VPN服务器(ocserv)
        • 在Ubuntu上部署OpenConnect VPN服务器(ocserv)
        • 修订ocserv端口
      • Shadowsocks
        • Shadowsocks原理
        • 部署Shadowsocks服务器
        • 在CentOS 7上部署ShadowSocks服务器
        • 安装shadowsocks客户端
    • 无线安全
      • Captive Portal
        • Captive Portal简介
        • 部署WiFiDog实现Captive Portal
      • Linux 802.1x网络认证
  • 虚拟化
    • Captive portal认证
    • Intel
      • VT-x
      • VT-d
        • Intel虚拟化技术Directed I/O架构
      • 内存虚拟化:扩展页表EPT
      • I/O虚拟化:SR-IOV
        • SR-IOV技术介绍
        • 在CentOS中部署SR-IOV
      • I/O虚拟化:数据直接I/O(DDIO)
      • 网络数据虚拟化:DPDK
        • 如何判断网卡是否支持DPDK技术
        • 在Linux中使用DPDK
        • 使用Open vSwith实现DPDK加速虚拟机网络性能
      • GPU虚拟化:GVT
    • kvm
      • kvm虚拟化架构
      • kvm嵌套虚拟化
        • CentOS7的嵌套虚拟化(nested virtualization)部署实践
      • qemu
        • QEMU的vt-d
        • vIOMMU架构
        • qemu监控指令
      • virtio
        • virtio规格
        • virtio guest端实现:PCI, virtio设备,virtio网络和virtqueue
        • Windows虚拟机virtio驱动版本
      • kvm快速起步
        • 一:基于内核的虚拟机(KVM)概览
        • 二:Redhat企业Linux安装KVM
        • 三:RHEL 7.2 配置KVM主机
        • 四:使用命令行启动第一个KVM实例
        • 五:使用Virt-Manger(VMM)部署KVM实例
        • 六:如何克隆一个KVM虚拟机并重置该虚拟机
        • 七:如何在线添加/更改虚拟磁盘
        • 八:如何在线添加/移除虚拟机的内存
        • 九:如何在线添加/移除虚拟机的vCPU
        • 十:更改libvirt虚拟机镜像存储路径
        • 十一:实现Linux KVM在线迁移
        • 十二:RHEL7 Pacemaker - 配置高可用KVM虚拟机
        • kvm快速起步实战
          • 在CentOS中部署KVM
          • 在Ubuntu中部署KVM
          • 访问VM控制台
          • 访问(修改)虚拟机镜像
          • 使用libguestfs+NBD远程访问磁盘镜像
          • KVM libvirt静态IP地址和端口映射
          • 在Gentoo中部署KVM
          • 使用Btrfs部署KVM
          • Clone KVM虚拟机实战
          • 动态调整KVM虚拟机内存和vcpu实战
          • 添加和动态调整虚拟机数据磁盘
          • 调整虚拟机btrfs文件系统大小
          • 添加和更新虚拟机设备
          • Linux KVM在线迁移实战
          • 高可用KVM虚拟机实战
          • 使用virsh删除运行的KVM VM
          • KVM虚拟机vnc远程访问鼠标偏移修复
      • kvm虚拟化部署和管理
        • kvm guest虚拟机时间管理
        • 通过QEMU guest agent和spice agent增强虚拟化
      • Ubuntu环境KVM
        • 安装
        • 网络
        • 创建虚拟机
      • kvm虚拟化存储
        • KVM虚拟机磁盘镜像修改指南(libguestfs:译+实践)
      • kvm性能
        • KVM性能调优实战
          • KVM性能优化架构简述
          • 性能监控工具
          • 多队列virtio-net
          • 使用virtio模式安装Windows
          • 在虚拟化中使用NUMA
        • KVM网络性能调优
          • KVM halt polling系统
        • kvm性能优化
        • kvm最佳实践(汇总)
        • 对于虚拟CPU的KVM性能限制
        • 大页内存技术
        • 透明大页内存技术
        • 大页内存和透明大页内存技术对比
        • Intel VT技术中的Preemption Timer
      • kvm热迁移
        • Ubuntu Guest操作系统热迁移vm内部进程OOM
        • virsh保存和恢复虚拟机状态
      • kvm DEBUG
        • kvm vcpu unhandled rdmsr/wrmsr
        • 在KVM中运行windows 10响应缓慢且CPU sys占用严重的解决方法
      • kvm测试
        • kvm单元测试
    • libvirt
      • 开发
        • 编译libvirt
          • 在CentOS 5环境中编译libvirt
          • 使用src rpm编译libvirt
          • libvirt调试排错
        • 使用Python开发Libvirt应用
          • 热迁移
      • hook
        • 通过libvirt hooks实现特定系统管理
      • Qemu
        • Qemu镜像
        • libvirt pvpanic
        • CentOS pvpanic实现和测试
        • Windows pvpanic实现
        • Windows pvpanic测试
        • 虚拟机core dump引发时间偏移和矫正方法
        • nemu - 面向云计算的轻量版QEMU
      • 设备
        • 虚拟机串口控制台
        • 检查块设备任务
      • Libvirt网络
        • libvirt网络架构
        • libvirt中的防火墙和网络过滤
        • libvirtd无法初始化ip6tables table 'filter'
      • Libvirt日志
        • libvirt日志
        • libvirtd.log日志显示"warning : qemuDomainObjTaint"
        • libvirtd.log日志显示"invalid argument: disk hdc does not currently have a source assigned"
      • NAT网络
      • 远程访问VNC
      • virsh使用
    • 虚拟网络
      • vxlan
        • vxlan概览
      • 故障排查
        • 使用tcpdump排查虚拟机网络不通
        • 虚拟机ping延迟问题排查
    • 性能
      • CPU steal
    • docker
      • Docker for Mac
        • Docker for Mac快速起步
      • Docker Engine
        • 安装
          • 在RedHat安装Docker
          • 在Docker中运行CentOS
          • 在Gentoo安装Docker
            • Docker内核支持参数说明
          • 在Ubuntu安装Docker
          • 在OS X安装Docker
        • Docker 存储
          • Docker应用程序数据
          • 调整dokcer容器可用磁盘空间
      • Docker Debugging
        • 系统日志:"new mount options do not match the existing superblock"
      • Docker开发指南(学习和实践)
        • 容器技术简介
        • 安装Docker
        • Docker快速起步
        • Docker启动容器报错"error response from daemon: secret store is not initialized"
        • 使用Docker快速部署不同版本CentOS容器
        • Docker容器启动时启动服务
        • 操作系统重启时自动启动Docker容器
        • 在Docker容器中部署Python virtualenv环境
        • 映射Docker容器内服务端口提供外部服务
        • Docker卷
        • Docker架构
        • 在开发中应用Docker
        • Docker编排(compose)
        • 运行docker ce
        • 导入和到处Docker容器(跨主机迁移)
        • 从主机视角找出Docker容器的进程
        • 检查Docker日志
        • 在Docker容器中执行命令
    • CoreOS
      • CoreOS架构
    • Kata Containers
    • xen
      • xen架构
        • Xen Hypervisor
        • Xen Hypervisor Debug
        • XenStore和xenstored
        • Xen网络概述
        • Xen内存调优
      • xen快速起步
        • xen动态添加或移除guest内存或CPU
        • xen动态添加usb设备到guest操作系统
      • xen网络
        • Amzaon VPC XEN SR-IOV性能
        • Xen多个VLANs的网络配置
      • xen存储
        • blktap块设备
        • 在Xen中挂载iso镜像文件
      • xen Debug
        • 配置XEN虚拟机Kernel core dump
        • xm list执行报错"int exceeds XML-RPC limits"
    • VMware
      • VMware虚拟机的计时
      • VMware Fusion使用指南
      • 在VMware Fusion虚拟机CentOS Guest中安装Vmware Tool
      • 在VMware Fusion虚拟机中安装macOS
      • 在VMware虚拟机中使用UEFI firmware
      • 在VMware Fusion中复制虚拟机
      • 备份VMware虚拟机
      • VMware headless模式运行虚拟机
      • VMware Fusion虚拟机磁盘空间爆满
      • VMware无法启动macOS APFS文件系统的Time Machine备份恢复
    • PowerVM
      • PowerVM介绍
    • Anbox
      • Anbox架构简介
      • 在Fedora中部署Anbox
    • Atomic
    • LXD
    • VirtualBox
      • VirtualBox使用Tips
    • bhyve
    • xhyve
      • OS X操作系统Hypervisor框架简介
      • 在OS X中部署xhyve
      • 在OS X中部署hyperkit
      • 在xhyve中运行RHEL/CentOS
      • 在xhyve中运行Debian/Ubuntu
      • 进入xhyve的docker虚拟机
    • Vagrant
      • 使用Vagrant部署开发测试环境
      • 使用Vagrant Package打包VirtualBox环境
      • 使用Vagrant部署kvm虚拟化(libVirt)
      • Vagrant Box管理
      • 使用Vagrant Snapshot创建快照备份
      • vagrant up下载镜像失败无法断点续传处理
      • vboxsf模块安装和挂载共享目录
    • 杂项
      • 如何检测虚拟或物理主机
      • 轻量级虚拟化
  • IaaS
    • MAAS
      • Intel SGX安全隔离技术
    • Amazon
      • EC2
        • 如何ssh登陆AWS的EC2实例
    • Microsoft
      • Azure
        • 在Azure上创建Linux虚拟机
    • Google
      • compute
    • Kubernetes
      • Kubernetes设计架构
      • Kubernetes快速起步
        • Hello Minikube
        • 检查kubernetes版本
      • Kubernetes故障排查
        • 排查Kubernetes集群容器重启原因
    • DC/OS
    • OpenStack
      • DevStack
        • DevStack开发环境
      • 安装指南
        • 环境
          • 安全
          • 主机网络
          • 网络时间协议
          • OpenStack软件包
          • SQL数据库
          • 消息队列
          • Memcached
      • Red Hat OpenStack
        • 架构
          • 组件
          • 架构案例
      • 华为OpenStack
    • oVirt
      • oVirt架构
      • oVirt存储管理
      • 部署oVirt
      • oVirt升级
      • oVirt的VNC密码设置
    • 腾讯云
      • 云API SDK
        • 腾讯云Python API SDK快速起步
    • 云存储
      • Dropbox
        • 在墙内如何使用Dropbox
  • 监控
    • IaaS类监控
      • skinken
      • sensu
  • 性能
    • web
      • Progressive JPEG
    • 网络
      • 网络性能优化
      • 网络工具
        • ping检查网络连通性
        • tcpreplay - 网络流量编辑和重放工具
        • netperf网络带宽测试
        • iperf网络测试
        • 使用iperf3测试网络带宽
        • ping时间戳
        • 使用sar显示网络流量
      • 网络故障排查
        • "IO error: Broken Pipe"是什么意思
    • 云计算
      • PerfKit Benchmarker
        • PerfKit Benchmaker快速起步
        • 配置PerfKit Benchmarker
        • PerfKit Benchmarker增加新的云服务商
        • 谷歌云gcp
        • 微软云azure
          • Azure起步
        • 腾讯云qcloud
          • QcloudApi起步
    • 实用工具
      • fio存储性能测试
        • fio快速起步
          • fio指南
            • fio编译和安装
      • iostat
      • tsar
      • linpack
      • dd测试磁盘性能
      • 通过sheel计算pi测试CPU性能
      • Unixbench性能测试工具
      • sysbench性能测试工具
      • SPEC CPU测试CPU性能
  • 开发
    • C
      • 编译
        • make程序时ld报错的DEBUG方法
        • gcc编译显示"cc1: warnings being treated as errors"处理方法
        • c语言中的单行注释和多行注释方法
        • 编译c程序调用Python
      • 网络
        • HTTP
          • 使用C实现一个简单的HTTP POST并处理相应
      • 打印输出
        • 重定向printf()到文件
    • Swift
      • 在Linux上安装swift 3
      • Swift服务器开发
    • Java
      • java的胡思乱想(白日梦)
        • [Java简单案例]](develop/java/java_daydream/java_simple_example.md)
        • Java输入输出
        • Java循环
        • Java数组
        • Java面向对象编程
      • 快速起步的一个例子:猜数字
      • jshell
      • groovy
        • 安装groovy
        • groovy简单语法
        • groovy字符串分隔
        • groovy时间处理
        • groovy对象比较
      • Java Trouble Shoot
        • Druid连接池"druid.pool.GetConnectionTimeoutException"
    • Go
      • Fedora环境下Go快速起步
      • macOS环境下Go快速起步
      • Go起步
      • Go测试库testify
    • iOS
      • iPhone 3GS:十年后经典再现
      • iOS6拟物化
      • iPhone 4S越狱、降级和其他
      • 新安装App提示"Verification Required"的解决
      • USIM卡
    • Android
      • 学习Android开发
        • Android应用是如何编译和运行的
        • Android开发环境
        • adb(Android Debug Bridge)和Android数据存储
        • 在Android模拟器上运行应用
        • 离线(手工)安装Android System Image
        • 配置Android模拟器使用硬件加速
      • Android起步
        • Android One和Android Go
        • Nexus 5系统升级
        • Root Android(Nexus 5)
        • Android文件传输
        • Android文件管理和apk安装
        • Android文件系统读写挂载
        • Android截屏和录屏
        • 在Google Play购买软件
        • Android开发环境准备
        • Jetbrains Idea快捷键
        • Gentoo Linux安装idea Jetbrains开发环境
        • 在Nexus上安装Android 7 Nougat
        • 在Nexus 6P上安装LineageOS 15.1
        • Nexus 6P工厂镜像恢复
        • Nexus 6P通过Full OTA镜像恢复
        • 修复Nexus 6P无限循环重启
        • 安装Elemental X内核
        • 使用MultiROM在Nexus 5上安装多操作系统
      • LineageOS
        • 构建hammerhead(Nexus 5)的LineageOS ROM
        • 构建marlin(Pixel XL)的LineageOS ROM
        • 在hammerhead(Nexus 5)上安装LineageOS
        • 在hammerhead(Nexus 5)构建Android Go
      • 我的Android设备
        • Nokia中端高可玩X7
        • Nexus 6P
        • 真正原生Android: Pixel系列
        • Pixel设置VoLTE
      • Android和Linux合体
        • 在Android中运行Linux
        • 在Android中部署ssh服务
        • 在Android上部署Linux开发环境
        • 容器模式在Linux中安装和运行Android Apps(APKs)
        • Anbox - 运行在Linux中的Android容器
          • 在Anbox容器中运行Android程序
      • BlueTooth
        • 通过蓝牙共享网络
      • NFC近场通讯
        • NFC技术概览
        • 日常生活NFC使用介绍
        • NFC开发基础
    • Raspberry Pi
      • 树莓派快速起步
      • 树莓派计算模块
      • 从USB存储启动树莓派
      • 树莓派4的USB接口问题汇总
      • 树莓派视频输出配置
      • 树莓派作为Cisco Console服务器
      • 树莓派Zero设置USB网络通讯(Ethernet Gadget)
      • 在树莓派Zero W上运行Kali Linux
    • Ubuntu Touch
      • 在Nexus 5上安装Ubuntu Touch系统
      • Ubuntu Touch使用tips
      • Ubuntu Touch手机设置802.1x无线网络
      • Ubuntu Touch运行sshd服务
      • Ubuntu Touch设置网络Proxy方法
      • 在Ubuntu Touch中运行Android程序
    • BlackBerry
      • 黑莓bb10系统运行微信
    • Meego和Sailfish
      • sfdroid:Sailfish/Android合体
      • sailfish和meego系统的第三方软件仓库
    • WebOS
      • Palm Veer共享移动internet
    • Python
      • Python开发风格
        • 开源Python项目结构
      • Python快速起步
        • pip包管理
        • 在古老的CentOS 5上安装Python 2.7以及virtualenv环境
        • 在CentOS 6上安装Python 2.7以及virtualenv环境
        • 在CentOS 7上安装Python 2.7以及virtualenv环境
        • Ubuntu环境安装virualenv和virtualenvwrapper
        • 在CentOS上安装Python3和virtualenv环境
        • 在macOS上安装Python3和virtualenv环境
        • 重建Python的virtualenv环境
        • pip升级Python软件包
        • 激活python解释器的自动完成功能
        • init.py文件
        • python编程风格
        • python中文本编码
        • 检查python对象类型
        • python处理文本
        • python中main函数作用
        • python日志
        • python日期
        • python变量写文件
        • python同时读取2个文件
        • python列表
        • python数组
        • python字典
        • Python的map函数
        • lambda语法糖:无需定义函数名的简便方法
        • python过滤字符
        • python百分比
        • python三元运算
        • python创建其他用户可写文件
        • python清空文件内容
        • python删除文件中某行
        • python列表字符串转浮点数
        • python多层嵌套字典KeyError
        • "PEP 8(E731): do not assign a lambda expression, use a def"
        • python的模块和包
        • python获取系统cpu数量
        • python nohup后台运行进程
        • 使用Graphviz模块绘制图形
        • python字典内容添加到列表
        • python site-packages简介
        • python去除字符串换行
        • Python程序Daemon化
        • Python函数返回多个值
        • Python执行外部命令subprocess
        • Python实现case/switch
        • Python使用环境变量
        • 将JSON字符串转换成Python字典
        • 本地变量分配前被引用报错"local variable 'XXX' referenced before assignment"
        • Python中对应于'null'的是什么?
        • 在Python分割字符串
        • 在Python中检查字符串是否被包含在另一个字符串中
        • 在Python中执行命令的利器"subprocess"
        • Python日志功能
        • Python处理XML
        • 安装阿里云对象存储OSS Python SDK和osscmd
        • 阿里云日志服务SLS python SDK和CLI
      • Python网络编程
        • Python WEB编程
          • 创建URL查询字符串
      • Python日志处理
        • Python日志基础
        • 在python日志中使用轮转和压缩
        • python处理systemd journal日志
      • Python文件系统
        • Python's Watchdog模块实现文件系统变化触发操作
      • Python网络开发模块Twisted
        • Twisted起步和FTP实现
      • Flask开发Web
        • 安装Flask开发环境
        • 基于Flask的Dashboard - Dash
      • DJongo开发Web
        • Django快速起步
          • 快速安装Django
          • Django项目代码架构风格
          • 使用MySQL作为Django数据库
          • 设置django的允许主机
          • 第一个Django应用
          • 离线安装Django
          • 完整uninstall一个Django app
          • 'module' object has no attribute 'views'
          • 使用django-tables2展示HTML表
          • django特定model保存记录时触发动作
          • django前端案例--Portal
          • django过滤当天发生事件
          • django实现select count(*) group by和order by
          • django缓存
        • Django DEBUG
          • "UnicodeDecodeError: 'ascii' codec can't decode byte"
        • 轻量级Django
          • Hello World
        • Django REST framework
          • Django REST framework概述
          • Django REST framework快速起步
          • 修改Django REST framework的默认title
          • Django REST framework序列化
          • Django REST framwork过滤
          • django REST Framework的时区,视图和模型刷新debug
        • Django Dashboard案例
          • 结合d3.js/reactive.js/leaflet实现Django Dashboard
        • django-dash控制台(废弃)
          • 本地运行django-dash demo
          • 使用django-dash快速构建控制台
        • 安装Django测试驱动开发环境
        • TTD(测试驱动):开发环境第一个测试
        • TTD(测试驱动):使用单元测试测试简单首页
      • Python学习案例
        • youtuble-dl下载视频网站内容
    • Ruby
      • Ruby快速起步
        • Fedora环境下Ruby快速起步
        • RubyGems安装和使用
    • JavaScript
      • jQuery
      • D3.js数据可视化
    • Node.js
      • Node.js快速起步
        • Node.js开发环境准备
        • Fedora环境下Node.js快速起步
        • Node.js开发WEB框架
        • 在Mac OS X下卸载Node.js
      • npm包管理
        • npm使用tips
        • svg2png
    • 浏览器
      • Firefox
        • 设置Firefox默认页面缩放比例zoom
        • Firefox的Dark风格设置(styelish)
        • Firefox自动代理切换
      • Chrome
        • 设置Chrome代理
      • Min
    • PHP
      • Nginx php-fpm配置优化Tips
    • Mac
      • 在mac上从iso镜像创建启动U盘
      • 从macOS Recovery中重新安装macOS
      • 从Time Machine备份中恢复Mac数据
      • 检测Time Machine备份的Mac OS X版本
      • 降级macOS
      • 在VMware虚拟机中运行Mavericks
      • 中文输入法
      • macOS内建的文本朗读(英语)
      • Mac平台使用VLC播放器的中文字幕显示
      • Mac平台最佳视频播放器iina
      • TextMate 2使用Tips
      • Sublime 3使用Tips
      • 在Mac OS X上安装Java多个版本
      • 使用MacBook键盘在移动设备输入
      • Mac网络
      • macOS上使用ftp
      • 从safari中导出打开的tab
      • bird进程
      • 在Mac上双启动方式安装Linux
      • 创建macOS启动安装U盘
      • 在Mac上使用Boot Camp Assistant安装Windows 10
      • rEFInd工具详解
      • 加速Time Machine备份速度
      • 在mac上输入特殊字符
      • Mac锁屏
      • Mac吸入式光驱强制弹出光盘
      • 为旧主机选择最快的Mac OS X版本
      • 通过Reset NVRAM来恢复触控板
      • Apple文件系统apfs
      • 苹果充电器指示灯闪烁无法充电
      • 通过SSHFS在Mac上远程开发Linux服务器程序
      • 在macOS上安装配置vsftpd
      • 清理macOS上的Purgeable磁盘空间
      • 调整macOS的apfs容器空间
      • 调整APFS文件系统出现"APFS Container Resize error code is 49153"
      • Mac OS X挂载NFS共享
      • MacOS快捷键
      • 从Time Machine中恢复隐藏文件
      • iTerm2中文显示问题处理
      • iTerm2黑暗模式
      • 安装使用GNU sed
      • 具有BouchBar的新款MacBook和Linux
      • 在Mac OS X中通过CLI命令行获取CPU信息
      • 不能运行"not from a verified developer"程序
      • Mac OS X Mavericks和iOS 6组合(体验最后的拟物化苹果生态)
      • 将iPad作为Mac的第二块屏幕(sidecar)
      • MacBook Pro 2018使用外接显示器
      • macOS安装冻结问题处理
      • macOS的磁盘工具First Aid功能
      • 查找macOS的IP地址
      • 升级macOS之后运行程序报错"missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcru"
      • 在Mac上使用checksum校验文件
    • shell
      • bash
        • bash快捷键
        • shell的特殊变量
        • 判断shell变量是否空字符串
        • 字符串比较错误提示"unary operator expected"
        • shell脚本中使用source和使用./cmd.sh区别
        • here document用法(cat << EOF)
        • 根据命令返回结果做if判断
        • 使用sudo在文件中添加内容
        • shell中的环境变量
        • shell函数tips
        • 生成随机数和随机字符串
        • shell中使用数组
        • shell中读取文件到bash数组
        • 列出所有cron定时任务
        • 在shell中计算
        • 在bash计算
        • shell中的break和continue指令
        • 读取文件逐行处理元素
        • 两个文件相减
        • 在shell中使用while循环
        • 在while循环中执行ssh中断循环的解决方法
        • shell中调用函数返回值的方法
        • shift的用法
        • 移除换行
        • 删除字符串最后n个字符
        • 删除一个文件的最后一行
        • 替换多个空格成为一个空格
        • ``符号和脚本进程
        • 同时赋值给多个变量
        • 在shell中比较小数的大小
        • sudo执行bash脚本报错"sudo: unable to execute"
        • 获取字符串最后几个字母
        • 对比目录文件异同
        • 文件对比
        • 判断字符串包含关系的方法
        • 检查字符串长度
        • "exec"指令的含义
        • 从函数返回
        • 检查变量是否是一个数值
        • shell中判断字符串null值
        • 删除文件名中包含"--"的文件
        • 使用nohup执行while循环
        • 修改nohup命令默认输出文件名"nohup.out"
        • 通过SSH远程写入文件
        • ping测试记录时间戳
        • 软链接和文件名
        • shell中字符串大写和小写转换
        • shell中处理json数据工具jq
        • shell检查主机是否alive
        • shell中检查服务器进程使用cpu
        • 获取网卡IP地址
        • 高效清理文件系统大量文件的方法
        • 找出系统端口监听服务进程
        • 判断文件是否为空
        • 执行rm,cp,mv命令出现"Argument list too long"报错的解决方法
        • 切分字符串赋值给多个变量
        • 计算字符串长度(字符数量)
        • 删除字符串的最后字符
        • 补全字符串
        • 检查数字是偶数还是奇数
        • 转换Linux uptime时间到易于理解的格式
      • zsh
        • oh-my-zsh
      • sed和awk
        • awk和shell之间的变量传递
        • 打印列中包含某个字符串的列
        • awk处理字符串搜索
        • sed举例
        • 如何避免sed -i破坏文件的软链接
        • sed替换行首和行尾
        • 使用sed修改配置文件到键值
        • Mac平台sed命令使用-i参数失败及解决方法
        • 删除文件的首行和尾行
        • 删除文件的最后一列
        • 累加所有行的每一列数值
      • 实用工具
        • sudo切换账号运行程序
        • 修改用户帐号名/uid/gid的工具usermod和groupmod
        • 脚本作为daemon运行
        • cut使用举例
        • sort排序
        • 对cpu施加负载
        • 多路复用终端管理器screen
        • 多路复用终端管理器"增强版"byobu
        • 随机输出文本文件中的行:shuf
        • 使用usermod禁用帐号
        • 使用tree展示目录结构树
        • 根据进程名pgrep和pkill
        • wget下载文件tips
        • HTTP协议利器curl
        • 命令执行超时检查工具timeout
        • 脚本使用ssh的密码认证工具sshpass
        • 并行执行ssh命令工具pssh
        • 命令输出处理工具xargs
        • 文件查找工具find
        • parallel利用多核CPU加速Linux命令
        • 命令速查表cheat
        • 语音合成工具espeak
        • 网络万能工具nc
        • 限制命令的io调度和权重
        • 配置修改工具augeas
        • 高效压缩工具xz
        • tar命令再认识
        • echo命令再认识
    • vim
      • vim快速起步
      • vim 跳转到函数、变量定义处
      • vim tips
      • vim树形导航插件NERDtree
      • vim编译配置"YouCompleteMe"
      • vim结合ctags作为开发平台
      • vim开发内核环境
      • 将Vim打造成Python开发平台
      • 使用vim作为c/c++ IDE
      • 使用vim作为c/c++ IDE(again)
      • 使用vim作为IDE
      • 在macOS平台使用vim作为IDE
      • vim大小写转换
      • 设置vim缩进和TAB
      • vim列编辑
      • vim并列视图编辑和查看同一文件(viewports)
      • 卸载macvim
    • 文档
      • dot
        • 使用Graphviz生成系统诊断图
      • GitBook
        • 使用GitBook撰写书籍
        • 如何在一台主机同时运行多个GitBook
        • GitBook评论插件
        • GitBook单章节展开插件
        • GitBook代码段添加文件名
        • GitBook多国语言
        • GitBook嵌入视频
      • MkDocs
        • 使用MkDocs撰写书籍
      • Hugo
        • 使用Hugo撰写文档
      • Hexo
        • 使用hexo撰写blog
        • 使用hexo theme tranquilpeak
      • Sphinx
        • 使用Sphinx构建Python程序文档
        • 使用Sphinx构建Django程序文档
        • sphinx中文文档在readthedocs编译PDF失败的处理
        • 结合plantuml使用sphinx撰写时序图文档
        • sphinx文档的代码展示
        • sphinx文档的footer定制
        • sphinx图片
        • 'redrawtime' exceeded, syntax highlighting disabled
      • MoinMoin
        • MoinMoin 2安装
        • MoinMoin 1安装
        • 配置Moin
        • Moin Themes
      • Office
        • 在Linux中使用Sozi制作PPT
        • Linux演示工具(PPT)
      • OmniGraffle
      • Sketch
    • 编程架构
      • 统一建模语言UML
        • 看懂UML类图和时序图
      • RESTful开发架构
        • RESTful简介
        • 理解RESTful架构
        • RESTful认证和权限机制浅析
    • 机械键盘
  • DevOps
    • 基础架构工程师视角的DevOps
    • 持续集成/交付/部署
      • 持续集成/交付/部署概述
    • Git
      • git代理配置
      • git分支的新建与合并
      • git的tag和branch
      • git pull覆盖本地文件(完全舍弃本地文件)
      • git合并时冲突放弃本地修改方法
      • git远程操作
      • git和dropbox冲突
      • 针对不同域名git push时使用指定SSH key
      • git忽略文件mode修改
      • git重新基于master开发分支
      • 合并多个commit
      • git色彩显示
      • 在不同git仓库代码使用不同用户名
      • [git合并冲突解决](devops/git/git _merge_fix_conflicts.md)
      • git checkout指定tag
      • 从git仓库中清理敏感信息(如密码))
      • git通过SSH Tunnel代理访问
      • git文件的执行属性
      • 修改git commit消息
    • Gerrit
    • Gitlab
      • 部署使用的ssh key
      • gitlab Wiki系统gollum
    • Gogs
    • Jenkins
    • Ansible
      • 起步
        • Ansible快速教程
        • 安装
        • 快速起步
        • 清单
        • 动态清单
        • Patterns
        • Ad-Hoc命令
      • Playbooks
        • Playbooks入门
        • 案例:升级CentOS操作系统
        • 案例:通过sudo安装rpm包
      • 模块
        • command - 在远程节点执行一个命令
        • shell - 在远程节点执行命令
      • Dashboard
        • Ansible Tower开源替代:semaphore
      • 问题排查
        • TAB键导致"Syntax Error while loading YAML"
        • paramiko主机认证报错
        • paramiko主机认证报错
        • playbook执行报错"requires the stdlib json or simplejson module"
      • Tips
        • Ansible模块shell,command
        • 如果软件包没有安装则执行命令
        • 不检查SSH主机fingerprint
        • 变量和引号
        • ansible性能优化
        • 使用ansible.cfg
        • 安装rpm报错"unfinished transactions remainin"
        • yum安装报错"Package XXX is not signed"
        • yum安装报错"No Package matching"
        • Ansible批量复制文件
    • Puppet
  • 大数据
    • Hadoop
      • 快速起步
        • 单机安装部署Hadoop
      • 故障排查
        • RHEL6环境下透明大页和Hadoop高CPU sys
    • Flink
      • flink流处理架构
    • Spark
      • 快速起步
        • 单机安装部署Spark
      • Spark机器学习
    • Elasticsearch
      • ESK简介
      • ESK快速安装
    • ZooKeeper
  • 机器学习
    • 斯坦福机器学习(CS229)
      • 机器学习介绍
      • 监督学习介绍
      • 无监督学习介绍
      • 单变量线性回归
      • 多变量线性回归
    • 单变量的线性回归
    • TensorFlow
      • 面向机器智能的TensorFlow
    • 机器翻译
      • moses
    • GPU计算
      • nVidia CUDA
      • AMD ROCm
    • Jetson Nano
      • vpi1-demos报错可忽略
  • 学习
    • 慕课(mooc)
      • 我的慕课
    • 天堂电影院
      • 使用VLC播放加密蓝光碟片
    • Kindle在,人未老
      • 重置Kindle Paperwhite
      • 使用calibre去除kindle DRM
      • 备份Kindle电子书
      • 电子书阅读软件
      • Kindle个人文档
      • 制作合适kindle的pdf:pdf切边和重排
      • 使用Kindle阅读pdf文档
    • GTD: Getting Things Done
  • 附录:个人工作室构建
    • MacBook双操作系统启动macOS+Linux
    • 使用Fedora作为开发平台
    • 无线网络设置
    • 帐号、ssh和sudo设置
    • 部署kvm虚拟化
    • 部署docker容器
    • 部署OpenStack
    • 远程开发Linux服务器程序
    • NFS设置和共享目录
    • Django开发设置
    • 部署Nginx+uwsgi运行Django
    • HAProxy端口转发
    • 使用wekan作为Trello类型的"看板"管理自己的工作
  • Who am I?
Powered by GitBook
On this page
  • 简介
  • VM功能
  • LVM实现
  • Logical Volume Management解释
  • 定义
  • 映射模式(线性/条带化)
  • 快照snapshot
  • 单个LV的最大容量
  • 使用限制
  • LVM原理
  • LVM构架概览
  • 集群化逻辑卷管理(Clustered Logical Volume Manager, CLVM)
  • LVM组件
  • LVM管理概览
  • 在集群创建LVM卷
  • 逻辑卷创建概览
  • 在逻辑卷上扩展文件系统
  • 逻辑卷备份
  • 日志
  • LVM管理命令
  • 物理卷管理
  • 卷组管理
  • 逻辑卷管理
  • 实践案例
  • 文件系统格式化
  • 挂载
  • LVM2常见FAQ摘要
  • 参考

Was this helpful?

  1. 操作系统
  2. Linux
  3. 存储
  4. LVM

Linux卷管理

简介

Wikipedia:

LVM是基于Linux kernel的逻辑卷管理,通过将多个磁盘或类似的存储设备组合成大存储。LVM最初由Heinz Mauelshagen公司开发,基于HP-UX的LVM设计。多个Linux发行版本已经支持在逻辑卷上的根文件系统上安装一个启动系统。

LVM适合以下情况:

  • 管理大容量磁盘集,允许增加磁盘、替换磁盘、复制和共享磁盘,但不需要停止服务

  • 对于小型系统如桌面系统,可以方便进行磁盘分区调整

  • 可以通过快照方式进行备份

  • 在多个物理磁盘卷或整个磁盘驱器上创建单一的逻辑卷(类似RAID 0),可以动态改变卷大小。

可以将LVM视为硬件驱动器和分区之上的一个很薄的软件层,可以创造出持续和易于使用的硬件驱动器替换,重新分区和备份的模拟。

VM功能

  • 通过加入新的物理卷(physical volumes, PV)或弹出已加入物理卷来实现在线重设置卷组(volume groups)大小。

  • 通过连接在线扩展逻辑卷(logical volume, LV)以及通过收缩逻辑卷来减小逻辑卷大小。

  • LVM1支持创建只读快照(snapshots)

  • LVM2支持创建读写快照

  • 通过条带化或串联在多个PV上创建逻辑卷,实现和RAID 0类似功能。

  • 通过镜像整个或部分逻辑卷,实现和RAID 1类似功能。

  • 在线在不同PV间迁移逻辑卷

  • 分割或合并卷组,用于将整个逻辑卷从离线存储迁入或迁出。

LVM也可以工作于一个共享存储的集群(磁盘由PV处理,并在多台主机间共享),不过这需要一个附加daemon来处理不同群集节点的状态。

LVM不能实现基于校验的冗余,也就是不能实现RAID 4 - RAID 6的冗余类型。这种校验类型的冗余是通过Linux metadisks来实现的,然后将其作为LVM的物理卷(PV)。

LVM实现

LVM在每个物理卷的开头部分维护一个metadata头,每个metadata头通过UUID来唯一标识。每个PV头部包含一个完整的整个卷组布局的副本,包括所有其他PV的UUID,以及所有逻辑卷的UUID和PE至LE的分配映射关系表。这实现了当PV损坏时候可以实现简单的数据恢复。

为了将一个卷组online,vgchange工具完成:

  • 搜索所有可用块设备上的PV

  • 对每个找到的PV分析metadata头部

  • 计算所有可访问逻辑卷组的布局

  • loop over卷组中每个逻辑卷,使之在线并且:

    • 检查已经online的逻辑卷确保所有的PV可用

    • 创建一个新的,空的设备映射

    • 映射PV的数据区域到逻辑卷。

为了将一个在线逻辑卷在不同PV间迁移,pvmove工具完成:

  • 创建一个新的,空的设备映射

  • 在源和目的创建一个mirror映射。内核将开始在degraded模式下启动镜像并且从源盘向目标盘复制数据。

  • 当同步完成,以目标盘替换源盘。

Logical Volume Management解释

逻辑卷管理提供了磁盘存储的高层视图,以便管理员能够灵活分配存储给应用程序和用户。 逻辑卷是使用逻辑卷管理器来进行大小分配。

逻辑卷管理允许以用户定义组来分配存储卷,允许将存储设置为卷组名如"development"和"sales",而不用使用设备名,如"sda"和"sdb"。

  • LVM示意图

    hda1   hdc1      (PV:s on partitions or whole disks)                        
       \   /                                                                    
        \ /                                                                     
       diskvg        (VG)                                                       
       /  |  \                                                                  
      /   |   \                                                                 
  usrlv rootlv varlv (LV:s)
    |      |     |                                                              
 ext2  reiserfs  xfs (filesystems)

定义

  • physical volume (PV) 物理卷通常指硬盘,但也可能指已经建立底层RAID的设备(包括软RAID和硬RAID)

  • physical extent (PE) 每个物理卷被划分为数据集,称为physical extents,这些扩展在VG中大小相同。

  • volume group (VG) 卷组是LVM中的最高抽象层,将一组逻辑卷和物理卷包含到一个管理单元。

  • logical volume (LV) 相当于磁盘分区,LV可以被视为标准的块设备。

  • ogical extent (LE) 每个逻辑卷被分割为数据块,视为logical extent。这个逻辑扩展大小在相同的逻辑卷组中的所有逻辑卷相同。

映射模式(线性/条带化)

有两种使用逻辑卷管理的映射逻辑扩展(LE)和物理扩展的方法(PE)

  • 线性映射: 将一系列PE安装线性顺序映射为LV

  • 条带化映射:交叉把逻辑块存放到不同的物理卷

快照snapshot

LVM的一个优点是可以使用snapshot,管理员可以创建一个新的块设备来表示一个逻辑卷的实际副本,在时间的一些节点上冻结。

通常是用于一些批处理,备份会话,但是不希望在备份的时候在线系统仍在更改数据。当一个snapshot设备设备完成后,管理员也可以删除该设备。这个情况需要snapshot在逻辑卷上处于consistent(一致性)状态 -- LVM1的VFS-lock补丁可以确保在snapshot创建时文件系统保持,而2.6系列内核可以不需要补丁也可以在snapshot创建时自动完成持续状态。

完全snapshot是自动禁止的

如果一个snapshot逻辑卷被填充满了,则该snapshot将被抛弃(因为已经不可用了)所以分配充足的空间是非常重要的。需要的空间取决于snapshot的使用,所以没有明确的规则。不过,如果snapshot和原来系统大小相同,则永远不会overflow。

注:使用Linux的LVM做快照进行数据备份的时候,一定要估算好空间,确保在整个备份过程中,源LVM卷的数据变化不超过分配的snapshot空间,否则就会发生数据还没有备份完,快照就因为源LVM卷变化量超出预设容量而报废,这样备份也就不完整了。

LVM1使用只读(read-only)snapshot。只读snapshot通过创建一个例外表(exception table)来实现,该表跟踪哪些块被修改了。如果一个块在原有基础上被修改,则该数据库被复制到snapshot中,在exception table中被标记,然后新的数据被写入到原来的卷上。

LVM2系统中,默认的snapshot是可读写的。可读写snapshot工作方式和只读的snapshot类似,但增加了附加功能,即在exception table中标记为已使用,但并不从原始卷中复制过来。这种工作方式提供了很多LVM1只读snapshot中所没有的特性。例如,对以前工作不满意,可以unmount这个snapshot,删除这个snapshot,然后把原始文件系统挂载在这个位置。并且可以创建用于Xen的卷。可以创建一个disk image,然后snapshot这个磁盘映像,再针对一个domU会话修改snapshot。然后又可以从原始卷上创建另外一个snapshot,并将其用于其他的domU会话。由于存储仅消耗和原始卷不同的snapshot块,则主要的卷是在不同的domU上共享的。

当前的LVM2/device-mapper代码限制,原始的卷可以增长,但是不能缩减。对于LVM1,则不能调整卷大小。(这句话翻译自2010年,请自行参考当前资料)

单个LV的最大容量

单个LV的最大容量取决于CPU的构架和运行的内核

  • 2.4系列内核,最大的LV是2TB。从Red Hat Enterprise Linux 3 Update 5可以较好支持2TB LVs。

  • 2.6系列内核,32位系统,最大支持16TB的LV。

  • 2.6系列内核,64位系统,最大支持8EB的LV。

使用限制

  • boot目录不能包括在LV中,这是因为当前的bootloader不能理解LVM卷。

  • 在LVM上建立root分区需要内核具备 initrd image。如果内核升级没有包含需要的initrd image,则内核将不能启动。较新的发行版本大多包含了initrd image。

译注:没有永远的金科玉律,所有的知识以自己实践为准 ^_^

LVM原理

本段落翻译自《Redhat Logical Volume Manager Administration手册》

卷管理在物理存储之上创建了一个抽象层,允许创建逻辑存储卷。逻辑卷功能比直接使用物理存储提供一系列更具伸缩性。当使用逻辑卷,可以不受到物理磁盘大小的限制。并且,由于物理存储的配置被软件所隐蔽,所以可以不停止应用程序或不unmount文件系统进行卷扩展或移动。

逻辑卷提供以下优于直接使用物理存储的优点:

  • 可伸缩的容量 - 当使用逻辑卷,文件系统可以跨多个磁盘,所以可以集聚多个磁盘和分区为一个逻辑卷。

  • 改变存储池大小 - 可以扩大和缩小逻辑卷,而不需要重新分区底层磁盘设备。

  • 在线数据重定位 - 在部署了较新和较快存储子系统,可以在系统工作时移动数据。数据将重新分布到磁盘。例如,可以在移动hot-swap磁盘前清理。

  • 转换设备命名 - 逻辑存储卷可以在用户定义组中使用,可以按照需要命名逻辑卷。

  • 磁盘条带化 - 可以把逻辑卷条带化到多个磁盘上,这样会戏剧化地增强存储性能。

  • 镜像卷 - 逻辑卷提供了一个配置镜像的转换方法。

  • 卷snapshot - 使用逻辑卷的snapshot功能可以一致性备份或进行测试而不会影响真实数据。

LVM构架概览

从RHEL 4开始,原始的LVM1被LVM2所替代。LVM2向后兼容LVM1,并提供了snapshot和cluster支持。

可以使用命令vgconvert命令把LVM1格式转换为LVM2格式。

集群化逻辑卷管理(Clustered Logical Volume Manager, CLVM)

集群化逻辑卷管理(Clustered Logical Volume Manager, CLVM)是LVM的一系列集群化扩展。这些扩展允许一个群集使用LVM(例如,在SAN上)。

是否使用CLVM取决于系统要求:

  • 如果只有一个系统请求访问存储,则可以只配置LVM,此时可以使用LVM而不用CLVM扩展并且这个节点创建的逻辑卷只是该节点本地使用。

  • 如果是一个failover方式的群集系统,即在任何时间只有一个节点实际访问存储,则需要使用高可用逻辑卷管理代理(High Availability Logical Volume Management agents,HA-LVM)。有关配置HA-LVM参考Configuring and Managing a Red Hat Cluster。

  • 当群集中有多个节点同时访问存储,并且存储是在多个活跃节点共享的,则 必须 使用CLVM。CLVM允许用户在配置一个逻辑卷的时候通过锁定物理存储来配置共享存储上的逻辑卷,并且,还需要使用群集锁服务来管理共享的存储。

要使用CLVM,Red Hat Cluster Suite软件,包含了 clvmd 服务,该服务必须运行。

这个 clvmd 服务是LVM的群集扩展的关键因素。这个 clvmd 服务在每个群集节点上运行并且在一个群集中分发LVM metadata更新,这样可以对每个群集节点显示相同的逻辑卷视图。

有关安装和管理Red Hat Cluster Suite,参考 《Configuring and Managing a Red Hat Cluster》。

要确保 clvmd 在启动时运行,使用以下命令

chkconfig clvmd on

要启动clvmd使用命令

service clvmd start

在群集环境创建LVM逻辑卷和单一节点创建LVM没有什么命令或管理界面的区别。不过,在群集中创建LVM要确保群集基础构架已经运行并且群集处于quorate状态。

默认,在共享存储上使用CLVM创建的逻辑卷对整个存储共享存储的各节点都是可见的。当群集中只有一个节点可以访问共享存储,可以创建卷组。并且,也可以把本地卷组的状态改为群集状态卷组。

  • CLVM构架

警告:

在Red Hat Cluster Suite中使用的共享存储要求在群集节点上运行 群集逻辑卷管理服务进程(cluster logical volume manager daemon, clvmd) 或 高可用逻辑卷管理代理 (High Availability Logical Volume Management agents, HA-LVM)。

如果不运行clvmd或HA-LVM或者不具备等同服务,则不能在共享磁盘上使用单会话LVM,否则可能导致数据损坏。

LVM组件

物理卷(Physical Volumes)

一个LVM逻辑卷的底层物理存储单元是一个块设备,可以是一个分区或整个磁盘。要在LVM逻辑卷中使用块设备,该设备必须作为一个物理卷(physical volume, PV)来进行初始化。把一个块设备初始化为一个物理卷会在设备的起始部分增加一个标签。

默认,LVM标签位于存储块设备的 第2个扇区(the second 512-byte sector)。也可以修改这个默认配置,把LVM标签存放到块设备的前4个扇区中的一个。这样,可以允许LVM和其他使用这些扇区的应用程序共存。

一个LVM标记提供一个物理驱动器的正确标识和设备顺序,因为当系统启动时,设备的启动是随机的。一个LVM标记可以保证在一个cluster中,重启后仍然以一致的表达方式标记该设备。( 译注: 这点非常重要! )

LVM标记标识了设备作为一个LVM物理卷。LVM标记包含一个随机的唯一标识(UUID),并且也把块设备的大小以字节方式记录下来,并且记录了设备的存储LVM元数据的位置。

LVM元数据包含了系统中LVM卷的配置详细信息。默认情况下,有一个元数据标记副本在卷组的每个物理卷上的每个元数据区域上存储着。LVM元数据是ASCII编码的小数据。

当前LVM允许在每个物理卷上存储0个,1个或2个标志副本。默认是1个副本。 一旦在物理卷上配置元数据副本的数量,以后就不能再修改这个元数据副本的数量了。

第一个元数据副本存储在设备的开始部分,位于label之后。如果有第2个副本,则存放在设备的结尾。如果由于写入一个不同的磁盘,偶尔覆盖了磁盘开始部分的元数据区域,则设备末尾的元数据副本可以用来恢复元数据。

  • LVM物理卷布局

  • 一个磁盘上的多分区

LVM允许使用磁盘分区来创建物理卷。 通常建议使用整个磁盘创建一个单一的磁盘分区并将其作为一个LVM的物理卷 ,原因如下:

  • 管理便捷性

在系统中如果每个物理磁盘只出现一次,则容易跟踪。特别是当一个磁盘故障时更是如此。此外,在一个物理磁盘上构建多个物理卷可能导致启动时内核告警unknown partition。

  • 条带化性能

LVM不会提示两个物理卷被创建在相同的物理磁盘上。如果在相同的物理磁盘上使用两个物理卷(这两个物理卷实际上是这个磁盘的两个分区)来创建一个条带化逻辑卷。这将导致磁盘性能的下降而不是常规的条带化提高磁盘性能。

卷组(Volume Groups)

物理卷组合成卷组(volume groups,VGs),卷组是准备用于分配逻辑卷的磁盘空间池。

在一个卷组,磁盘空间分配是基于划分为一个固定大小的单元extent来实现的。一个extent是磁盘分配的最小空间单元。在一个物理卷中,extent就是物理extent。

一个逻辑卷所使用的逻辑extent和物理extent的大小相同。

在一个卷组中,所有逻辑卷的extent的大小都是相同的。卷组把逻辑extent映射到物理extent。

LVM逻辑卷

在LVM中,一个卷组划分到逻辑卷。有3种类型的LVM逻辑卷:

  • 线性逻辑卷

  • 条带化逻辑卷

  • 镜像逻辑卷

  • 线性逻辑卷

一个线性逻辑卷就是聚合多个物理卷成为一个逻辑卷,目的就是扩展磁盘空间。

在线性逻辑卷配置中,不要求每个物理卷的大小一致。

  • 条带化逻辑卷

当在LVM逻辑卷上写入数据,文件系统把数据分布到底层的物理卷。可以通过创建一个条带化的逻辑卷来控制数据写入到物理卷。对于大型的顺序读写,可以提高数据I/O的效率。

条带化通过round-round方式将数据写入不同物理卷,磁盘I/O是并行的。某些情况下,可以达到物理卷性能的线性叠加。

要扩展一个条带化逻辑卷,必须有足够的磁盘来完成条带化分布。例如,如果已经使用了一个2路条带化的磁盘构建的卷组,则添加一块物理磁盘是无法扩展条带化的,必须添加至少2块磁盘到卷组。

  • 镜像逻辑卷

镜像逻辑卷是在不同的磁盘设备上构建数据副本。当数据写入到一个磁盘设备,会同时写入到第二块设备,以镜像数据。这种方式在设备故障时可以保护数据。

LVM支持镜像卷。当创建一个镜像逻辑卷,LVM确保数据以镜像方式写入到独立的物理卷。使用LVM可以在多个镜像磁盘上再创建镜像逻辑卷。

一个LVM镜像通常以512KB为单位划分镜像块。LVM会维护一个小型日志用于跟踪镜像块是否完成了镜像同步。这个镜像日志可以可以保存于磁盘,这样可以在重启后继续访问,或者将日志维持在内存中。

从RHEL 5.3开始,支持在群集中镜像逻辑卷。

  • 快照卷

snapshot提供了不中断服务的情况下瞬间创建一个设备虚拟映像的方式。如果在一个snapshot执行之后对原始设备进行的修改,则snapshot将生成一个变化数据区域的副本,这样可以用来重构设备的状态。

注意:LVM snapshot不支持在集群中访问,所以不能在集群卷组上创建snapshot。

由于一个snapshot副本只是snapshot创建后数据变化的区域,所以snapshot功能只要求最少的存储。 例如,对于一个很少修改的系统,3-5%的空间就能够满足维护snapshot。

注意:snapshot只是一个文件系统的虚拟copy,并不是实际备份文件系统,所以不能作为备份手段。

snapshot占用的磁盘空间大小取决于原始卷的数据变化。

如果被填满,则该snapshot将损坏,此时这个snapshot将不能跟踪原始卷的变化。需要经常监控snapshot的大小。snapshot支持完善的重定义大小,所以,如果存储空间充足可以增加snapshot的大小来避免该snapshot被破坏。相反,如果发现snapshot比需要的大,则可以缩减snapshot的大小。

有关snapshot的一些有用的特性:

  • 多数情况下,一个snapshot可以用来执行原始逻辑卷的备份,而不需要停止在线系统。

  • 可以在一个snapshot文件系统上执行fsck命令来检查文件系统的完整性和检查是否需要修复系统。

  • 由于snapshot是可以读写的,可以在snapshot上测试生产环境数据的应用程序,运行在线测试,而不会影响真实的生产数据。

  • 可以配合Xen虚拟机管理创建卷,使用snapshot来创建一个磁盘映像,然后snapshot,并修改snapshot作为另一个domU会话。然后再创建另外一个snapshot并修改用于另一个domU会话。由于存储使用只修改原始数据或snapshot,所以主卷可以作为共享。

LVM管理概览

在集群创建LVM卷

在集群环境上创建逻辑卷,需要使用集群化逻辑卷管理(Clustered Logical Volume Manager, CLVM),这是一个LVM的集群化扩展。CLVM扩展允许一个主机集群管理共享存储(例如,在一个SAN)来使用LVM。为了使用CLVM,Red Hat Cluster Suite软件,包括 clvmd 服务,必须在启动时候启动。

在集群环境中创建LVM逻辑卷和在单一主机上创建LVM逻辑卷是相同的。整个LVM命令没有区别,在LVM GUI接口上也是相同的。为了在集群创建LVM卷,在集群上必须运行cluster infrastructure,并且cluster必须是法定的(quorate)。

CLVM需要修改lvm.conf配置文件以便集群范围锁定。在配置文件lvm.conf配置信息支持集群锁也是由lvm.conf来提供的。

默认, 由CLVM在共享存储上创建逻辑卷对于所有访问共享存储的系统都是可见的,但是只有一个节点在某个时间点访问存储。

逻辑卷创建概览

以下步骤创建LVM逻辑卷:

  • 初始化分区用于LVM卷作为物理卷

  • 创建卷组

  • 创建逻辑卷

在创建逻辑卷之后可以创建和挂载文件系统。例如创建GFS文件系统:

  • 使用gfs_mkfs命令在逻辑卷上创建GFS文件系统。

  • 使用mkdir命令创建挂载点。在一个集群系统中,需要在所有节点上创建挂载点。

  • 故在文件系统。可能需要在系统的每个节点上添加fstab配置项。

创建LVM卷是主机无关的,这是因为LVM卷设置信息是存储在物理卷上的,而不是存放在当时创建卷的主机上。使用存储的服务器会具备LVM的本地配置信息,但是也可以从物理卷重新创建配置。只要LVM版本兼容,可以把物理卷连接到不同的服务器。

在逻辑卷上扩展文件系统

要扩展一个逻辑卷上的文件系统,执行以下步骤:

  • 创建一个物理卷

  • 扩展包含文件系统的卷组以包含这个新的物理卷

  • 扩展逻辑卷包含新的物理卷

  • 扩展文件系统

逻辑卷备份

metadata备份和归档是由每个卷组和逻辑卷配置更改时自动完成的,除非在lvm.conf配置中禁止。默认情况下,metadata数据备份存储在/etc/lvm/backup文件而metadata归档存储在/etc/lvm/archive文件。至于存储在/etc/lvm/archive的metadata归档时间和多少个归档会保留则取决于lvm.conf配置。一个每日的系统备份应该包括备份/etc/lvm目录下的内容。

注意,metadata的备份并不包括逻辑卷中的用户和系统数据。

可以通过vgcfbackup命令手工备份metadata数据到/etc/lvm/backup文件。并且,可以通过vgcfgrestore命令恢复metadata。

日志

所有数据消息通过一个日志模块根据记录级别记录:

  • standard output/error

  • syslog

  • log file

  • external log function

日志级别设置位于 /etc/lvm/lvm.conf 配置。

LVM管理命令

在运行LVM命令时,可以添加 -v,-vv,-vvv 或 -vvvv,分别可以打印不同级别的显示信息。

物理卷管理

可以通过以下命令删除磁盘现存的分区表信息(译注:请参考前述有关物理卷的说明)

dd if=/dev/zero of=PhysicalVolume bs=512 count=1
  • 初始化物理卷 - 以下命令初始化 /dev/sdd1, /dev/sde1, and /dev/sdf1

      pvcreate /dev/sdd1 /dev/sde1 /dev/sdf1
  • 扫描可以用于物理卷的块设备

      lvmdiskscan
  • 显示物理卷

      pvdisplay

输出类似

--- Physical volume ---
PV Name               /dev/sdb1
VG Name               VGvms
PV Size               372.52 GiB / not usable 1.28 MiB
Allocatable           yes 
PE Size               4.00 MiB
Total PE              95366
Free PE               59526
Allocated PE          35840
PV UUID               e8dnaG-VgJZ-oKFp-ZPbv-jhKv-mO6C-Xp222z 
  • 如果需要扫描所有系统中的物理卷

      pvscan

输出显示

PV /dev/sdb1   VG VGvms   lvm2 [372.52 GiB / 232.52 GiB free]
  Total: 1 [372.52 GiB] / in use: 1 [372.52 GiB] / in no VG: 0 [0   ] 
  • 重定义物理卷大小

可以采用pvresize命令更新LVM物理卷的大小。并且可以在LVM使用这个物理卷的时候操作。

  • 删除物理卷

      pvremvoe /dev/ram15

卷组管理

  • 创建卷组

      vgcreate vg1 /dev/sdd1 /dev/sde1

当物理卷用于创建卷组的时候,它的磁盘空间默认被划分为以4MB为单位的extent。这个extent是用于逻辑卷增长和缩减的最小大小。extent的数量不会影响逻辑卷的I/O性能。

在使用vgcreate命令时可以添加-s参数来设置extent的大小。并且可以通过使用-p和-l参数来限制用于卷组的物理卷活逻辑卷的数量。

默认,卷组分配物理extent的规则遵循一些常规,如不将条带化分布在相同的物理卷。这是常规的分配规则。

在集群创建卷组

和在单一节点创建卷组方式相同,使用vgcreate命令在集群环境创建卷组。

默认情况下,使用CLVM方式可以在集群共享存储上创建卷组,该卷组对可以访问这个共享存储的所有节点都是存取的。然而,也可以创建一个卷组作为本地卷组,只能在一个节点访问,只要附加参数 -c n。

以下命令是在集群环境创建一个本地卷组

vgcreate -c n vg1 /dev/sdd1 /dev/sde1

任何时候,都可以使用 -c 参数的vgchange命令将卷组由本地模式改为集群模式。

通过 vgs 命令可以检查一个现存卷组是本地还是集群卷组,卷组的属性如果带有 c 则表明是集群模式卷组。

在卷组中添加物理卷

以下命令在vg1卷组中添加/dev/sdf1物理卷来扩展卷组的大小

vgextend vg1 /dev/sdf1

卷组显示、卷组扫描和删除物理卷

显示卷组

vgdisplay new_vg

扫描卷组

vgscan

删除物理卷

vgreduce my_volume_group /dev/hda1

激活或非激活卷组

以下命令deactivate卷组my_volume_group

vgchange -a n my_volume_group

合并卷组

可以使用 vgmerge 命令来合并两个现存卷组。可以合并一个非活跃卷组到一个活跃卷组

vgmerge -v database my_vg

逻辑卷管理

创建线性逻辑卷

以下命令在vg1卷组上创建10G大小的逻辑卷

lvcreate -L 10G vg1

以下命令在testvg卷组上创建名字为test1v的逻辑卷,大小是50GB

lvcreate -L 50G -n test1v testvg

也支持按照百分比来创建逻辑卷,例如60%

lvcreate -l 60%VG -n mylv testvg

或者将剩余所有空间都分配给需要创建的逻辑卷(100%FREE)

lvcreate -l 100%FREE -n yourlv testvg

创建条带化逻辑卷

对于大型的顺序读写,创建条带化逻辑卷可以提升数据I/O性能。

要创建条带化逻辑卷,需要使用参数-i来指定条带化的条带数量。这个参数将基于将要被条带化的逻辑卷的物理卷数量。注意,条带数量不能大于卷组的物理卷的数量(除非使用了--alloc anywehre参数)

如果构建一个条带化逻辑卷的底层物理设备具有不同的大小,则条带化卷的条带最大大小取决于最小的底层设备的条带化卷。例如,对于two-legged(双设备)条带化,最大的条带就较小的设备的两倍。在three-legged(3设备)条带化,条带大小则是最小设备的三倍大小。

以下命令在两个物理卷创建条带为64KB的条带的条带化逻辑卷。这个逻辑卷的大小是50G,名字是gfslv,创建在卷组vg0上

lvcreate -L 50G -i2 -I64 -n gfslv vg0

作为线性卷,可以设置用于条带化的物理卷的扩展,以下命令创建一个大小是100扩展在2个物理卷上条带化的条带化卷,名字是stripelv,位于卷组testvg,这样条带将使用/dev/sda1的第0-49个扇区和/dec/sdb1的第50-99扇区

lvcreate -l 100 -i2 -nstripelv testvg /dev/sda1:0-49 /dev/sdb1:50-99

创建镜像卷

当创建镜像卷的时候,需要使用-m参数设置数据镜像的副本数量,例如-m1则创建1个镜像,也就是文件系统的双副本:一个线性逻辑卷加一个副本;类似,设置-m2则创建2个镜像,也就是文件系统的3副本设置

lvcreate -L 50G -m1 -n mirrorlv vg0

LVM维护了一个小的日志来跟踪镜像的同步,这个镜像位于磁盘可以确保服务器重启不丢失,这样重启或crash不需要执行re-synced

实践案例

这里举例一个实际的部署案例

按照第三方软件安装要求,需要建立如下类似的LVM卷

/dev/mapper/VG-pamtlv        14G  164M   13G    2% /cnaps/pamt
/dev/mapper/VG-pmtslv        14G  276M   13G    3% /pmts
/dev/mapper/VG-pmtsloglv     56G  189M   53G    1% /pmts/log
/dev/mapper/VG-mqmlv         14G  180M   13G    2% /var/mqm
/dev/mapper/VG-mqmpmtslv     14G  164M   13G    2% /var/mqm/pmts
/dev/mapper/VG-mqpmtsloglv   14G  164M   13G    2% /var/mqm/pmts/log

初始化物理卷 - 即在物理分区或物理磁盘上标记,这里案例我们是对/dev/sda4的LVM分区进行

pvcreate /dev/sda4

提示

Physical volume "/dev/sda4" successfully created

扫描可以用于物理卷的块设备

lvmdiskscan

提示可以看到/dev/dsa4是可用的LVM物理卷

/dev/sda1 [     255.00 MiB]
/dev/root [      50.00 GiB]
/dev/sda3 [       2.00 GiB]
/dev/sda4 [       1.04 TiB] LVM physical volume
1 disk
2 partitions
0 LVM physical volume whole disks
1 LVM physical volume

显示物理卷

pvdisplay

显示输出

"/dev/sda4" is a new physical volume of "1.04 TiB"
--- NEW Physical volume ---
PV Name               /dev/sda4
VG Name
PV Size               1.04 TiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               An0rGY-5XqT-HLKZ-OFIV-QJf7-eDJ0-TLYxj6

如果需要扫描所有系统中的物理卷

pvscan

显示输出

PV /dev/sda4                      lvm2 [1.04 TiB]
Total: 1 [1.04 TiB] / in use: 0 [0   ] / in no VG: 1 [1.04 TiB]

创建逻辑组 - 逻辑组建立在物理卷上,请注意软件安装要求该卷组的名字是VG

vgcreate VG /dev/sda4

vgdisplay查看逻辑组,可以看到总共的可用空间是 1.04 T

--- Volume group ---
VG Name               VG
System ID
Format                lvm2
Metadata Areas        1
Metadata Sequence No  1
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                0
Open LV               0
Max PV                0
Cur PV                1
Act PV                1
VG Size               1.04 TiB
PE Size               4.00 MiB
Total PE              272770
Alloc PE / Size       0 / 0
Free  PE / Size       272770 / 1.04 TiB
VG UUID               tdq3Zc-16z2-ZMo1-H7xM-EHaJ-GC8d-YFNjTY

创建逻辑卷

/dev/mapper/VG-pamtlv        14G  164M   13G    2% /cnaps/pamt
/dev/mapper/VG-pmtslv        14G  276M   13G    3% /pmts
/dev/mapper/VG-pmtsloglv     56G  189M   53G    1% /pmts/log
/dev/mapper/VG-mqmlv         14G  180M   13G    2% /var/mqm
/dev/mapper/VG-mqmpmtslv     14G  164M   13G    2% /var/mqm/pmts
/dev/mapper/VG-mqpmtsloglv   14G  164M   13G    2% /var/mqm/pmts/log

lvcreate --size 30G -n pamtlv VG
lvcreate --size 30G -n pmtslv VG
lvcreate --size 100G -n pmtsloglv VG
lvcreate --size 30G -n mqmlv VG
lvcreate --size 30G -n mqmpmtslv VG
lvcreate --size 30G -n mqpmtsloglv VG
lvcreate --size 600G -n home VG

通过vgdisplay可以看到还剩余200G作为机动预留

文件系统格式化

mkfs.ext3 -L mqmpmtslv /dev/VG/mqmpmtslv
mkfs.ext3 -L mqmpmtsloglv /dev/VG/mqmpmtsloglv
mkfs.ext3 -L pmtslv /dev/VG/pmtslv
mkfs.ext3 -L pmtsloglv /dev/VG/pmtsloglv
mkfs.ext3 -L mqmlv /dev/VG/mqmlv
mkfs.ext3 -L pamtlv /dev/VG/pamtlv

文件系统格式化要使用-L参数提供label,后续文件系统挂载都是使用label来标记要挂载的逻辑卷

挂载

在/etc/fstab中添加以下内容

LABEL=mqmlv          /var/mqm             ext3       acl,user_xattr        1 2
LABEL=mqmpmtslv      /var/mqm/pmts        ext3       acl,user_xattr        1 2
LABEL=mqmpmtsloglv   /var/mqm/pmts/log    ext3       acl,user_xattr        1 2
LABEL=pamtlv         /cnaps/pamt          ext3       acl,user_xattr        1 2
LABEL=pmtslv         /pmts                ext3       acl,user_xattr        1 2
LABEL=pmtsloglv      /pmts/log            ext3       acl,user_xattr        1 2

挂载

mv /var/mqm /var/mqm.local
mkdir /var/mqm
mount /var/mqm
mkdir /var/mqm/pmts
mount /var/mqm/pmts
mkdir /var/mqm/pmts/log
mount /var/mqm/pmts/log
mkdir -p /cnaps/pamt
mount /cnaps/pamt

目录挂载有依赖关系,请注意/etc/fstab配置按顺序排列,确保上级目录挂载后再创建子目录,再挂子文件系统

完成后检查df -h可以看到如下输出

/dev/mapper/VG-mqmlv          30G  222M   28G   1% /var/mqm
/dev/mapper/VG-mqmpmtslv      30G  173M   28G   1% /var/mqm/pmts
/dev/mapper/VG-mqmpmtsloglv   30G  173M   28G   1% /var/mqm/pmts/log
/dev/mapper/VG-pamtlv         30G  173M   28G   1% /cnaps/pamt
/dev/mapper/VG-pmtslv         30G  173M   28G   1% /pmts
/dev/mapper/VG-pmtsloglv      99G  188M   94G   1% /pmts/log

LVM2常见FAQ摘要

参考

  • 「Logical_Volume_Manager_Administration.pdf」 - Redhat文档(结合LVM和GFS集群文件系统)

PreviousLVMNext扩展lvm卷

Last updated 4 years ago

Was this helpful?

在2.6系列的Linux内核中,LVM实现是通过一个 概念来实现的,这是一个简单的基于块级别的方案,实现通过创建虚拟块设备和映射这些块内容到另外其他块设备。LVM的这种device mapper也允许I/O重定向服务,这样可以和其他卷管理共享(如EVMS)。

LVM示意图( )

[Logical Volume Manager (Linux)]())

这个文档比较详细介绍原理和备份快照方法,可以参考。

device mapper
A Beginner's Guide To LVM
http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux
A Beginner's Guide To LVM
Linux Logical Volume Manager (LVM) on Software RAID
Managing RAID and LVM with Linux (v0.5)
LVM HOWTO
学习Linux LVM
逻辑卷管理-使用 LVM2 工具执行卷的构建和管理、建立备份快照等各种功能
LVM示意图
CLVM示意图
LVM物理卷
线性逻辑卷
条带化逻辑卷
镜像逻辑卷