LVM是逻辑卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制。LVM通过在硬盘和文件系统之间添加一个逻辑层,来为文件系统屏蔽下层硬盘分区布局,提高硬盘分区管理的灵活性,
名词解释
物理存储介质(The physical media)
:指系统的物理存储设备,如硬盘,系统中为/dev/hda
、/dev/sda
、/dev/vda
等等,是存储系统最低层的存储单元。
NOTE: /dev/sda
和 /dev/sda1
是有区别的。 /dev/sda
表示整个sda
整个硬盘, /dev/sda1
表示的是硬盘上的一个分区。
好比你的电脑是256的固态, 然后划分成C, D两个盘。 sda指固态, sda1指C盘, sda2指D盘。
PV: 物理卷(Physical Volume)
:指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID), 是LVM的基本存储逻辑块。物理卷包括一个特殊的标签,该标签默认存放在第二个 512 字节扇区,但也可以将标签放在最开始的四个扇区之一。该标签包含物理卷的随机唯一识别符(UUID),记录块设备的大小和LVM元数据在设备中的存储位置。
VG: 卷组(Volume Group)
:由物理卷组成,屏蔽了底层物理卷细节。可在卷组上创建一个或多个逻辑卷且不用考虑具体的物理卷信息。
LV: 逻辑卷(Logical Volume)
:卷组不能直接用,需要划分成逻辑卷才能使用。逻辑卷可以格式化成不同的文件系统,挂载后直接使用。
PE: 物理块(Physical Extent)
:物理卷以大小相等的“块”为单位存储,块的大小与卷组中逻辑卷块的大小相同。
LE: 逻辑块(Logical Extent,)
:逻辑卷以“块”为单位存储,在一卷组中的所有逻辑卷的块大小是相同的
使用LVM管理硬盘的基本过程如下:
- 1.将硬盘创建为物理卷
- 2.将多个物理卷组合成卷组
- 3.在卷组中创建逻辑卷
- 4.在逻辑卷之上创建文件系统
通过LVM管理硬盘之后,文件系统不再受限于硬盘的大小,可以分布在多个硬盘上,也可以动态扩容。
情形一: 根目录扩容(常见于CentOS)
格式化磁盘并修改分区格式
fdisk /dev/sdb [n, p, 1, size, t, 8e, w]
创建 PV
pvcreate /dev/sdb
扩展 VG
vgextend centos /dev/sdb1
扩展LV
lvextend -l +100%FREE /dev/centos/root
刷新
xfs_growfs /dev/centos/root
情形二: 根目录扩容(常见于Ubuntu)
格式化磁盘并修改分区格式
fdisk /dev/sdb [n, p, 1, size, t, 8e, w]
创建 PV
pvcreate /dev/sdb
扩展 VG
vgextend ubuntu-vg /dev/sdb1
扩展LV
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
刷新
resize2fs /dev/ubuntu-vg/ubuntu-lv
P.S 如果碰到 xfs 提示 xfs_growfs: /dev/centos/root is not a mounted XFS filesystem
对于 xfs : xfs_growfs + 挂载点
对于 ext2/3/4: resize2fs + 挂载点
df -Thl
lsblk
情形三: 一块磁盘做成lvm单独挂载某个目录
将新磁盘分成两个区,一个挂载/data; 一个挂载/var/lib/docker
pvcreate /dev/sdb1
vgcreate vg0 /dev/sdb1
lvcreate -l 50%FREE -n lv0 vg0
lvcreate -l 100%FREE -n lv1 vg0
mkfs.xfs /dev/vg0/lv0 mkfs.xfs /dev/vg0/lv0
echo "/dev/vg0/lv0 /data/ xfs defaults 0 0" >> /etc/fstab echo "/dev/vg0/lv1 /var/lib/docker xfs defaults 0 0" >> /etc/fstab
|
情形四: 缩减/删除某个lv
- xfs不支持缩减 (其实是支持缩减, 但是需要mkfs强制格式化)
- ext4支持缩减
- 缩减逻辑卷之前卸载该逻辑卷所在分区(强制缩减XFS例外)
检查某个目录相关的进程
yum install psmisc
fuser -m -v -i -k /home
4.1 逻辑卷删除
- 以
CentOS7
系统 XFS
文件系统为例, 删除 home
分区, 并将其空间扩充到 /
[root@centos7 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 60G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 59G 0 part ├─centos-root 253:0 0 37G 0 lvm / ├─centos-swap 253:1 0 3.9G 0 lvm [SWAP] └─centos-home 253:2 0 18.1G 0 lvm /home sr0 11:0 1 973M 0 rom [root@centos7 ~]#
|
卸载 home
分区
umount /home
移除 home
逻辑卷
lvremove /dev/centos/home
调整 root
逻辑卷的大小
lvresize -l +100%FREE /dev/centos/root
更新分区
xfs: xfs_growfs /
ext4: resize2fs /dev/centos/root
编辑 fstab
删除 /home
更新 /
4.2 EXT4根逻辑卷
缩减
关闭Ubuntu系统, 插入CD并设置第一启动顺序
选择第一个启动项
右上角 help
–>enter shell
使用 lvreduce 缩减 /
lvreduce --resizefs --size -50G /dev/ubuntu-vg/ubuntu-lv
注意事项
- 注意缩减前后
UUID
是否变化
Live CD
是否包含 lvm工具, 没有的话需 apt install lvm2
4.3 EXT4非根逻辑卷
缩减
以ubuntu
系统 ext4
文件系统为例, 从/home
缩减5G
- 卸载
/home
umount /home
- 缩减
/home
lvreduce --resizefs --size -5G /dev/ubuntu-vg/ubuntu-home
4.4 XFS缩减
以 CentOS7
系统 XFS
文件系统为例, 将/home
缩至10G
前面说了XFS不支持缩减, 下面会解释
[root@centos7 ~]# [root@centos7 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 60G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 59G 0 part ├─centos-root 253:0 0 37G 0 lvm / ├─centos-swap 253:1 0 3.9G 0 lvm [SWAP] └─centos-home 253:2 0 18.1G 0 lvm /home sr0 11:0 1 973M 0 rom [root@centos7 ~]# [root@centos7 ~]# lvreduce -L 10G /dev/mapper/centos-home WARNING: Reducing active and open logical volume to 10.00 GiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce centos/home? [y/n]: y Size of logical volume centos/home changed from <18.09 GiB (4630 extents) to 10.00 GiB (2560 extents). Logical volume centos/home successfully resized. [root@centos7 ~]# [root@centos7 ~]# [root@centos7 ~]# [root@centos7 ~]# [root@centos7 ~]# [root@centos7 ~]# xfs_growfs /dev/centos/home meta-data=/dev/mapper/centos-home isize=512 agcount=5, agsize=1185024 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=4741120, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data size 2621440 too small, old size is 4741120 [root@centos7 ~]# [root@centos7 ~]# [root@centos7 ~]# [root@centos7 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 60G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 59G 0 part ├─centos-root 253:0 0 37G 0 lvm / ├─centos-swap 253:1 0 3.9G 0 lvm [SWAP] └─centos-home 253:2 0 10G 0 lvm /home sr0 11:0 1 973M 0 rom [root@centos7 ~]#
|
- 缩减后重启失败进入救援模式
- 使用
lvresize
还原逻辑卷/home
原来的大小后重启顺利进入系统
4.5 XFS 强制缩减逻辑卷
直接 shrink, 不需要先卸载
缩减成功后uuid
会发生变化
直接缩减
lvreduce -L -5G /dev/centos/home
文件系统的大小调整为其底层逻辑卷的实际大小
xfs_growfs /dev/centos/home
卸载 /home
umount /home/
强制格式化 /home
为 xfs
mkfs.xfs -f /dev/centos/home
重新挂载 /home
mount /dev/centos/home /home/
[root@centos7 ~]# [root@centos7 ~]# lvreduce -L -5G /dev/centos/home WARNING: Reducing active and open logical volume to <13.09 GiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce centos/home? [y/n]: y Size of logical volume centos/home changed from <18.09 GiB (4630 extents) to <13.09 GiB (3350 extents). Logical volume centos/home successfully resized. [root@centos7 ~]# xfs_growfs /dev/centos/home meta-data=/dev/mapper/centos-home isize=512 agcount=4, agsize=1185280 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=4741120, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data size 3430400 too small, old size is 4741120 [root@centos7 ~]# [root@centos7 ~]# [root@centos7 ~]# umount /home/ [root@centos7 ~]# [root@centos7 ~]# mkfs.xfs -f /dev/centos/home Discarding blocks...Done. meta-data=/dev/centos/home isize=512 agcount=4, agsize=857600 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=3430400, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@centos7 ~]# [root@centos7 ~]# mount /dev/centos/home /home/ [root@centos7 ~]#
|