逻辑卷详解
许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份、删除相关数据,甚至被迫重新规划分区并重装操作系统,以满足应用系统的需要。
比如很多人在使用
win
的时候,都会遇见C盘分小了
的情况,磁盘不够用!
这个时候使用就要使用逻辑卷技术了!
1、逻辑卷简介
LVM将存储虚拟化,使用逻辑卷,你不会受限于物理磁盘的大小,另外,与硬件相关的存储设置被其隐藏,你可以不用停止应用或卸载文件系统来调整卷大小或数据迁移,这样可以减少操作成本。
逻辑卷相比物理卷的优点:
灵活的容量 可伸缩的存储池 在线数据迁移 方便的设备命名 磁盘条块化 提供如镜像卷,快照卷,精简缓存卷等多种类型和功能的卷
2、逻辑卷的组成
块设备(block)
- 硬盘
- 分区
物理卷Physical volume(PV)
- 物理卷在逻辑卷管理系统最底层,LVM逻辑卷要使用这些设备,这些设备必需要被初始化为PV
- 我们实际的 partition (或 Disk) 需要调整系统识别码 (system ID) 成为 8e (LVM 的识别码)
- 使用gdisk/fdisk创建
将一个磁盘做成PV之后,该磁盘的数据就丢了。
卷组Volume group (VG)
- 许多个物理卷组成卷组。这样创建了一个硬盘空间池可供逻辑卷使用。
- VG 就是 LVM 组合起来的大磁盘!
- LVM 默认使用 4MB 的 PE 区块,而 LVM 的 LV 在 32 位系统上最多仅能含有 65534 个 PE (lvm1 的格式),因此默认的 LVM 的 LV 会有 4M*65534/(1024M/G)=256G(限于lvm1版本)。
物理区域Physical extent (PE):逻辑卷最小单位,具有唯一编号,可以被LVM寻址。
逻辑卷Logical volume (LV)
- 虚拟分区,由物理区域(physical extents)组成。
- 由大VG切分而成
- 支持在线扩展,不影响业务,可以进行快照,还原

3、制作逻辑卷
1、做成PV
对磁盘分区
$ fdisk /dev/sdb
# 分出下面sdb1,sdb2两个分区
Command (m for help): p
Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x8b10ccd0
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux
/dev/sdb2 10487808 31459327 10485760 83 Linux
将标识更改标识为Linux LVM
# sdb1,sdb2都改为8e标识
Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): p
Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x64427aee
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 8e Linux LVM
/dev/sdb2 10487808 31459327 10485760 8e Linux LVM
最后保存分区
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
做成PV,并查看
$ pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
$ pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created.
# 查看物理卷
$ pvdisplay
2、做成VG
$ vgcreate vg0 /dev/sdb1 /dev/sdb2
Volume group "vg0" successfully created
# 查看卷组
$ vgdisplay
3、做成LV
$ lvcreate -L 8G -n lv0 vg0
Logical volume "lv0" created.
# 查看逻辑卷
$ lvdisplay
4、使用逻辑卷
要使用,跟普通文件系统一样,格式化即可。
$ mkfs.ext4 /dev/vg0/lv0
meta-data=/dev/vg0/lv0 isize=512 agcount=4, agsize=524288 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=2097152, 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
然后挂载在一个目录
$ mount /dev/vg0/lv0 /data/
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg0-lv0 8.0G 33M 8.0G 1% /data
是
/dev/mapper/vg0-lv0
是一个链接(l)设备
开机自动挂载,写入/etc/fstab
echo "/dev/vg0/lv0 /data xfs defaults 0 0" >>/etc/fstab
5、逻辑卷扩容
首先使用
dd
命令配合/dev/zero
命令模拟/data
空间不够
$ dd if=/dev/zero of=/data/test5 bs=1M count=7168
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg0-lv0 8.0G 7.1G 982M 89% /data
扩容步骤:
1、查看逻辑卷所在的卷组
$ vgdisplay vg0
--- Volume group ---
...
Free PE / Size 1790 / 6.99 GiB # 从这里可以看到,还剩下7G
...
假设现在需要扩容10G,原本的7G是不够扩的。
2、分一个/dev/sdb3分区
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sdb3 31459328 52430847 10485760 8e Linux LVM
Command (m for help): w
3、做成PV,加入VG中
$ pvcreate /dev/sdb3
Physical volume "/dev/sdb3" successfully created.
$ vgextend vg0 /dev/sdb3
Volume group "vg0" successfully extended
$ vgdisplay vg0
--- Volume group ---
...
Free PE / Size 4349 / <16.99 GiB #还剩17G,扩容Vg成功
...
4、扩容LV
$ lvextend -L +10G /dev/vg0/lv0
Size of logical volume vg0/lv0 changed from 8.00 GiB (2048 extents) to 18.00 GiB (4608 extents).
Logical volume vg0/lv0 successfully resized.
$ lvdisplay
...
--- Logical volume ---
LV Path /dev/vg0/lv0
LV Name lv0
VG Name vg0
LV UUID jNXzjd-P5HZ-UWLk-kWzQ-6wj7-ViYR-2o4odz
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2020-09-21 17:38:41 +0800
LV Status available
# open 1
LV Size 18.00 GiB #扩容成功,由8G扩为18G
...
5、扩展文件系统
$ df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/vg0-lv0 8.0G 7.1G 982M 89% /data #发现/data并没有扩容
...
原因是新加入的10G没有格式化!没有格式化没有文件系统怎么可以使用呢?
执行调整
$ resize2fs /dev/vg0/lv0
$ df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/vg0-lv0 18G 7.1G 11G 40% /data
...
resize2fs 命令 针对的是ext2、ext3、ext4文件系统xfs_growfs 命令 针对的是xfs文件系统
6、逻辑卷缩容
一定要停掉业务,最好进行备份 xfs不支持缩容,强行缩容后,需要格式化后才能挂载
缩小/data
,先弄一点文件在data目录下,模拟资源数据
$ ls /data/
Bzm etc lost+found test5
1、取消挂载
$ umount /data
2、扫描逻辑卷
$ e2fsck -f /dev/vg0/lv0
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg0/lv0: 12/1310720 files (0.0% non-contiguous), 1961320/5242880 blocks
3、缩小文件系统
$ resize2fs /dev/vg0/lv0 10G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/vg0/lv0 to 2621440 (4k) blocks.
The filesystem on /dev/vg0/lv0 is now 2621440 blocks long.
4、逻辑卷缩小
$ lvreduce -L 10G /dev/vg0/lv0
WARNING: Reducing active logical volume to 10.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg0/lv0? [y/n]: y
Size of logical volume vg0/lv0 changed from 20.00 GiB (5120 extents) to 10.00 GiB (2560 extents).
Logical volume vg0/lv0 successfully resized.
5、检查缩容结果
$ lvdisplay
--- Logical volume ---
LV Path /dev/vg0/lv0
LV Name lv0
VG Name vg0
...
LV Size 10.00 GiB #缩为10G
...
重新挂载,查看文件是否存在
$ mount -a
$ ls /data/
Bzm etc lost+found test5
缩小,只要缩小后的逻辑卷大小比数据占用的空间大,一般不会丢失。
7、更换物理卷
必须在同一个卷组中,而且移动后的设备必须要大于等于之前设备
$ pvdisplay
--- Physical volume ---
PV Name /dev/sdb1
VG Name vg0
PV Size 5.00 GiB / not usable 4.00 MiB
...
--- Physical volume ---
PV Name /dev/sdb2
VG Name vg0
PV Size 10.00 GiB / not usable 4.00 MiB
...
--- Physical volume ---
PV Name /dev/sdb3
VG Name vg0
PV Size 10.00 GiB / not usable 4.00 MiB
...
查看物理卷PV发现,10G都是使用的,
/dev/sdb2
,如果遇到什么情况需要更换它,但是又不能影响业务。
1、新的磁盘加入卷组VG
加入过程略...
$ vgdisplay vg0 -v
--- Volume group ---
VG Name vg0
...
VG Size 34.98 GiB
...
--- Physical volumes ---
PV Name /dev/sdb1
PV UUID eGfgMo-J9AX-U9kr-rVuV-UCp0-uv5c-AIsIru
PV Status allocatable
Total PE / Free PE 1279 / 1279
PV Name /dev/sdb2
PV UUID 1Dg6Kw-kzUe-3o0p-lhZe-O1s7-MaPt-eQWG1R
PV Status allocatable
Total PE / Free PE 2559 / 0
PV Name /dev/sdb3
PV UUID ydGSmi-81qo-KMDO-jULF-UMSa-znYO-XbeIKF
PV Status allocatable
Total PE / Free PE 2559 / 2558
PV Name /dev/sdc1 #新的PV
PV UUID Ph1ARr-Jxod-HyGH-dr4r-eTjc-v8PM-fD1536
PV Status allocatable
Total PE / Free PE 2559 / 2559
2、更换PV
移动数据
$ pvmove /dev/sdb2 /dev/sdc1
/dev/sdb2: Moved: 2.46%
/dev/sdb2: Moved: 100.00%
从卷组移除物理卷
$ vgreduce vg0 /dev/sdb2
Removed "/dev/sdb2" from volume group "vg0"
3、删除物理卷
$ pvremove /dev/sdb2
Labels on physical volume "/dev/sdb2" successfully wiped.
就变成了块设备
8、移动卷组
在真实环境的,可能会遇见各种原因,逻辑卷需要需要从一台服务器转移到另外一台服务器上,硬盘的直接转移逻辑卷是识别不到的
1、导出卷组
$ umount /data
# 将逻辑卷变为非激活状态
$ lvchange -a n /dev/vg0/lv0
-a :activate
# 将VG更改为导出状态
$ vgexport vg0
Volume group "vg0" successfully exported
导出状态,可以为VG提供一些保护机制,防止被意外使用
2、导入卷组
然后将硬盘插入另外一台服务器,或者将存储映射到另外一台服务器。
#硬盘识别到之后,扫描物理卷
$ pvscan
PV /dev/sda2 VG centos lvm2 [58.00 GiB / 4.00 MiB free]
PV /dev/sdb1 is in exported VG vg0 [<5.00 GiB / <5.00 GiB free]
PV /dev/sdb3 is in exported VG vg0 [<10.00 GiB / 9.99 GiB free]
PV /dev/sdc1 is in exported VG vg0 [<10.00 GiB / 0 free]
Total: 4 [<82.99 GiB] / in use: 4 [<82.99 GiB] / in no VG: 0 [0 ]
# 将VG更改为导入状态
$ vgimport vg0
Volume group "vg0" successfully imported
$ lvscan
ACTIVE '/dev/centos/root' [50.00 GiB] inherit
ACTIVE '/dev/centos/swap' [<8.00 GiB] inherit
inactive '/dev/vg0/lv0' [10.00 GiB] inherit
$ lvchange -a y /dev/vg0/lv0
3、挂载查看
$ mount -a
$ df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/vg0-lv0 9.8G 7.1G 2.2G 77% /data




