纸上得来终觉浅,绝知此事要躬行。
LVM 是(Logical Volume Manager)逻辑卷管理器的简写,又译为逻辑卷宗管理器、逻辑扇区管理器、逻辑磁盘管理器。是 Linux 核心所提供的逻辑卷管理功能。它在硬盘的硬盘分区之上,又创建了一个逻辑层以方便系统管理硬盘分区系统。
- 需要内核加载一个 dm(device mapper)的逻辑设备的模块
- 在 CentOS6 中使用,而在 CentOS7 中,使用 btrfs 中的 B-tree 本来就支持子卷,无需使用逻辑卷。
- 很多大的公司一般是不会使用这个软件功能的,因为磁盘恢复比较困难,毕竟不是直接写数据到硬盘的,而是通过软件来模拟的。
1. LVM-2 原理图解
2. 命名规范及挂载
创建完 LVM-2 之后,实际的 LVM-2 的创建名称为/dev/dm-#
,而我们实际使用的/dev/mapper/VG_NAME-LV_NAME
(例如:/dev/mapper/vol0-root)和/dev/VG_NAME/LV_NAME
(例如:/dev/vol0/root),就是对其实际指向的两个链接文件而已。
文件系统挂的时候,挂载光盘或者硬盘设备的时候,其实都会生成对于的符号链接文件,将其指向实际设备路径。像光盘设备文件(IDE: /dev/hdc
和 SATA: /dev/sr0
),而连接文件,则有多种,以下举例说明:
符号链接文件
- /dev/cdrom
- /dev/cdrw
- /dev/dvd
- /dev/dvdrw
以只读格式挂载光盘到 /media/cdrom 上
mount -r /dev/cdrom /media/cdrom
卸载
umount /dev/cdrom
# 看见了沒有啊!这就是我们最重要的一步
[root@localhost ~]# ll /dev/vbirdvg/vbirdlv
lrwxrwxrwx 1 root root 27 Mar 11 16:49 /dev/vbirdvg/vbirdlv -> /dev/mapper/vbirdvg-vbirdlv
3. LVM-2 命令使用
3.1 pv 管理工具
pvs 命令
使用 pvs 命令仅能得到物理卷 pv 的概要信息
[root@localhost ~]# pvs #查看物理卷信息
PV VG Fmt Attr PSize PFree
/dev/sda2 vg_s1 lvm2 a-- 465.27g 0
pvdisplay 命令
显示 pv 的详细信息
-s
- 以短格式输出
-m
- 显示 PE 到 LV 和 LE 的映射
[root@localhost ~]# pvdisplay
"/dev/hda6" is a new physical volume of "1.40 GB"
--- NEW Physical volume ---
PV Name /dev/hda6 #实际的 partition 分区名称
VG Name #因为尚未分配出去,所以空白!
PV Size 1.40 GB #就是容量说明
Allocatable NO #是否已被分配,结果是 NO
PE Size (KByte) 0 #在此 PV 內的 PE 大小
Total PE 0 #共分割出几个 PE
Free PE 0 #沒被 LV 用掉的 PE
Allocated PE 0 #尚可分配出去的 PE 数量
PV UUID Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN
pvcreate 命令
创建物理卷,之后直接加设备
-f
- 强制创建物理卷,不需要用户确认
-u
- 指定设备的 UUID
-y
- 所有的问题都回答“yes”
# 将6-9分区转成pv,注意大括号的用途
[root@localhost ~]# pvcreate /dev/hda{6,7,8,9}
Physical volume "/dev/hda6" successfully created
Physical volume "/dev/hda7" successfully created
Physical volume "/dev/hda8" successfully created
Physical volume "/dev/hda9" successfully created
pvscan 命令
pvscan 指令会扫描系统中连接的所有硬盘,列出找到的物理卷列表。
-d
- 调试模式
-e
- 仅显示属于输出卷组的物理卷
-n
- 仅显示不属于任何卷组的物理卷
-s
- 短格式输出
-u
- 显示 UUID
# 这就分別表示每个PV的资讯与系统所有PV的资讯
[root@localhost ~]# pvscan
PV /dev/hda6 lvm2 [1.40 GB]
PV /dev/hda7 lvm2 [1.40 GB]
PV /dev/hda8 lvm2 [1.40 GB]
PV /dev/hda9 lvm2 [1.40 GB]
Total: 4 [5.61 GB] / in use: 0 [0 ] / in no VG: 4 [5.61 GB]
pvck 命令
用来检测物理卷的 LVM 元数据的一致性
-d
- 调试模式
-v
- 详细信息模式
# 使用pvck命令检查物理卷/dev/sda2
[root@localhost ~]# pvck -v /dev/sda2
Scanning /dev/sda2
Found label on /dev/sda2, sector 1, type=LVM2 001
Found text metadata area: offset=4096, size=1044480
Found LVM2 metadata record at offset=7168, size=1536, offset2=0 size2=0
Found LVM2 metadata record at offset=5632, size=1536, offset2=0 size2=0
pvmove 命令
搬移 PV 中的数据(只限于同一 VG 中)
# 将VG中pv中hda5的内容搬移到hda6上
[root@localhost ~]# pvmove /dev/hda5 /dev/hda6
# 也可以这样,lvm决定hda5的内容被复制到哪里
[root@localhost ~]# pvmove /dev/hda5
pvremove 命令
用于删除一个存在的物理卷
-d
- 调试模式
-f
- 强制删除
-y
- 对提问回答“yes”
[root@localhost ~]# pvremove /dev/sdb2 #删除物理卷
Labels on physical volume "/dev/sdb2" successfully wiped
pvchange 命令
允许管理员改变物理卷的分配许可
-u
- 生成新的 UUID
-x
- 是否允许分配 PE
# 禁止分配指定物理卷上的PE
[root@localhost ~]# pvchange -x n /dev/sdb1
Physical volume "/dev/sdb1" changed
1 physical volume changed / 0 physical volumes not changed
3.2 vg 管理工具
vgs 命令
显示有关卷组的信息,具体参数请使用man
命令查看
[root@localhost ~]# vgs #查看逻辑卷组信息
VG #PV #LV #SN Attr VSize VFree
vg_s1 1 3 0 wz--n- 465.27g 0
vgdisplay 命令
用于显示 LVM 卷组的元数据信息
-A
- 仅显示活动卷组的属性
-s
- 使用短格式输出信息
# 最后那三行指的就是 PE 能够使用的情況!由于尚未切出 LV,因此所有的 PE均可自由使用。
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name vbirdvg
System ID
Format lvm2
Metadata Areas 3
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 3
Act PV 3
VG Size 4.17 GB #整个 VG 容量就这么大
PE Size 16.00 MB #內部每个 PE 的大小
Total PE 267 #总共的 PE 数量!
Alloc PE / Size 0 / 0
Free PE / Size 267 / 4.17 GB
VG UUID 4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO
vgcreate 命令
用于创建 LVM 卷组
-l
- 卷组上允许创建的最大逻辑卷数
-p
- 卷组中允许添加的最大物理卷数
-s
- 卷组上的物理卷的 PE 大小
# 将/dev/hda6-8 建立成为一个 VG,且指定 PE 为 16MB
[root@localhost ~]# vgcreate -s 16M vbirdvg /dev/hda{6,7,8}
Volume group "vbirdvg" successfully created
vgscan 命令
查找系统中存在的 LVM 卷组,并显示找到的卷组列表
-d
- 调试模式
--ignorelockingfailure
- 忽略锁定失败的错误
# 确定存在这个vbirdvg的VG
[root@localhost ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vbirdvg" using metadata type lvm2
vgremove 命令
指令用户删除 LVM 卷组
-f
- 强制删除
# 删除卷组"vg1000"
[root@localhost ~]# vgremove vg1000
Volume group "vg1000" successfully removed
vgextend 命令
用于动态的扩展 LVM 卷组,它通过向卷组中添加物理卷来增加卷组的容量
-d
- 调试模式
-t
- 仅测试
# 将剩余的PV(/dev/hda9)分配给vbirdvg
[root@localhost ~]# vgextend vbirdvg /dev/hda9
Volume group "vbirdvg" successfully extended
vgreduce 命令
通过删除 LVM 卷组中的物理卷来减少卷组容量,缩减事先需要先做pvmove
,将设备移除方可移除 vg。
-a
- 如果命令行中没有指定要删除的物理卷,则删除所有的空物理卷
--removemissing
- 删除卷组中丢失的物理卷,使卷组恢复正常状态
# 将物理卷"/dev/sdb2"从卷组"vg2000"中删除
[root@localhost ~]# vgreduce vg2000 /dev/sdb2
removed "/dev/sdb2" from volume group "vg2000"
vgchange 命令
用于修改卷组的属性,经常被用来设置卷组是处于活动状态或者非活动状态
-a
- 设置卷组的活动状态
# 将卷组"vg1000"设置为活动状态
[root@localhost ~]# vgchange -ay vg1000
logical volume(s) in volume group "vg1000" now active
vgconvert 命令
用于转换指定 LVM 卷组的元数据格式,通常将“LVM1”格式的卷组转换为“LVM2”格式。转换卷组元数据前必须保证卷组处于非活动状态,否则无法完成转换操作。
格式:
vgconvert(选项)(参数)
选项:
-M
要转换的卷组格式
参数:
卷组
指定要转换格式的卷组
# 转换卷组为"LVM2"格式
[root@localhost ~]# vgconvert -M2 vg1000
Volume group vg1000 successfully converted
3.3 lv 管理工具
lvdisplay 命令
显示 LVM 逻辑卷空间大小、读写状态和快照信息等属性
[root@www ~]# lvdisplay
--- Logical volume ---
LV Name /dev/vbirdvg/vbirdlv #LV逻辑卷的名字
VG Name vbirdvg
LV UUID 8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0
LV Write Access read/write
LV Status available
# open 0
LV Size 5.56 GB #LV的大小
Current LE 356
Segments 4
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
lvscan 命令
用于扫描当前系统中存在的所有的 LVM 逻辑卷
-b
- 显示逻辑卷的主设备号和次设备号
lvresize 命令
用于调整 LVM 逻辑卷的空间大小,可以增大空间和缩小空间
-L
- 指定逻辑卷的大小,单位为“kKmMgGtT”字节
-l
- 指定逻辑卷的大小(LE 数)
# 利用lvresize的功能來增加LV
[root@www ~]# lvresize -l +179 /dev/vbirdvg/vbirdlv
Extending logical volume vbirdlv to 8.36 GB
Logical volume vbirdlv successfully resized
lvcreate 命令
用于创建 LVM 的逻辑卷
-L
- 指定逻辑卷的大小,单位为“kKmMgGtT”字节
-l
- 指定逻辑卷的大小(LE 数)
-n
- 后面跟逻辑卷名
## 将整个vbirdvg通通分配給vbirdlv,要注意PE共有356个
[root@www ~]# lvcreate -l 356 -n vbirdlv vbirdvg
Logical volume "vbirdlv" created
lvremove 命令
用于删除指定 LVM 逻辑卷
-f
- 强制删除
lvextend 命令
用于在线扩展逻辑卷的空间大小,而不中断应用程序对逻辑卷的访问
-L
- 指定逻辑卷的大小,单位为“kKmMgGtT”字节
-l
- 指定逻辑卷的大小(LE 数)
lvreduce 命令
用于减少 LVM 逻辑卷占用的空间大小
-L
- 指定逻辑卷的大小,单位为“kKmMgGtT”字节
-l
- 指定逻辑卷的大小(LE 数)
3.4 扩展逻辑卷
resize2fs
命令是 ext 系列文件系统的专用大小调整工具,可以扩大可以缩小原 ext 分区,也就是为什么我们在扩大或者缩小分区的时候,需要使用这个命令的原因。
lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME
3.5 缩减逻辑卷
resize2fs
命令是 ext 系列文件系统的专用大小调整工具,可以扩大可以缩小原 ext 分区,也就是为什么我们在扩大或者缩小分区的时候,需要使用这个命令的原因。而e2fsck
用来检测或者修复 ext 文件系统的正确性。
umount /dev/VG_NAME/LV_NAME
e2fsck -f /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
mount dev/VG_NAME/LV_NAME DIR
3.6 快照:snapshot
lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_name original_lv_name
4. dd 命令介绍
转换和拷贝文件
格式:
dd [OPERAND]...
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# block count=#
参数选项:
if=file
- 从 file 中读而不是标准输入
of=file
- 写到 file 里去而不是标准输出。除非指定 conv=notrunc ,否则, dd 将把 file 截为 O 字节(或由 seek= 选项指定的大小)
ibs=bytes
- 一次读 bytes 字节。默认是 512。
obs=bytes
- 一次写 bytes 字节。默认是 512。
bs=bytes
- 一次读和写 bytes 字节。这将覆盖 ibs 和 obs 设定的值(并且,设定 bs 不等于同时将 ibs 和 obs 设为同一个值,至少在 只使用 sync, noerror 或 notrunc 转换时是这样的。因为 bs 规定,每个输入块都应作为单独 的数据块拷贝到输出,而不把较短的块组合到一起)。
cbs=bytes
- 为 block 转换和 unblock 转换指定转换块的大小。
skip=blocks
- 在拷贝之前,跳过输入文件的前 blocks 块,每块大小为 ibs-byte 字节。
seek=blocks
- 在拷贝之前,跳过输出文件的前 blocks 块,每块大小为 obs-byte 字节。
count=blocks
- 只拷贝输入文件的前 blocks 块(每块的大小为 ibs-byte 字节),而不是全部内容,直到文件末尾。
conv=转换[,转换]...
- 将文件按 转换 参数指定的方式转换(在 lq,rq 两边没有空格),这里的转化格式可以在帮助信息中查找相关的参数。
实战演示:
# 磁盘拷贝
[root@localhost ~]# dd if=/dev/sda of=/dev/sdb
# 备份MBR
[root@localhost ~]# dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
# 破坏MBR中的bootloader
[root@localhost ~]# dd if=/dev/zero of=/dev/sda bs=256 count=1
# 将本地的/dev/hdx整盘备份到/dev/hdy
[root@localhost ~]# dd if=/dev/hdx of=/dev/hdy
# 将/dev/hdx全盘数据备份到指定路径的image文件
[root@localhost ~]# dd if=/dev/hdx of=/path/to/image
# 备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
[root@localhost ~]# dd if=/dev/hdx | gzip >/path/to/image.gz
# 将备份文件恢复到指定盘
[root@localhost ~]# dd if=/path/to/image of=/dev/hdx
# 将压缩的备份文件恢复到指定盘
[root@localhost ~]# gzip -dc /path/to/image.gz | dd of=/dev/hdx
# 备份磁盘开始的512Byte大小的MBR信息到指定文件
[root@localhost ~]# dd if=/dev/hdx of=/path/to/image count=1 bs=512
# 拷贝光盘数据到root文件夹下,并保存为cd.iso文件
[root@localhost ~]# dd if=/dev/cdrom of=/root/cd.iso
**Note: ** 两个特殊设备
/dev/null
- 数据黑洞
/dev/zero
- 吐零机