Linux的LVM工具


纸上得来终觉浅,绝知此事要躬行。

Linux的LVM工具


LVM 是(Logical Volume Manager)逻辑卷管理器的简写,又译为逻辑卷宗管理器、逻辑扇区管理器、逻辑磁盘管理器。是 Linux 核心所提供的逻辑卷管理功能。它在硬盘的硬盘分区之上,又创建了一个逻辑层以方便系统管理硬盘分区系统。

  • 需要内核加载一个 dm(device mapper)的逻辑设备的模块
  • 在 CentOS6 中使用,而在 CentOS7 中,使用 btrfs 中的 B-tree 本来就支持子卷,无需使用逻辑卷。
  • 很多大的公司一般是不会使用这个软件功能的,因为磁盘恢复比较困难,毕竟不是直接写数据到硬盘的,而是通过软件来模拟的。

1. LVM-2 原理图解

Linux的LVM工具

Linux的LVM工具


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/hdcSATA: /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
    • 吐零机

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录