LVM 是 "逻辑卷管理 (Logical Volume Manager)" 的简称。简单点说,就是将多个 "物理卷(Physical Volume, PV, 通常是物理硬盘分区)" 合并成一个更大的 "逻辑卷组(Volume Group, VG)",然后在其上切分和传统分区相同用途的 "逻辑卷 (Logical Volume, LV)"。逻辑卷允许我们在不中断系统运行的情况随时调整文件系统容量大小,理论上具备 "无限" 的热扩容能力。
操作步骤:
(1) 物理硬盘分区(fdisk)
(2) 创建物理卷(pvcreate)
(3) 创建卷组(vgcreate)
(4) 激活卷组(vgchange)
(5) 创建逻辑卷(lvcreate)
(6) 卷组扩容(vgextend) 或 逻辑卷扩容(lvextent)
下面是一个在虚拟机上的操作演示。
1. 对新硬盘分区
将新硬盘 /dev/sdb 划分为一个独立主分区。
$ sudo fdisk /dev/sdb Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2610, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): Using default value 2610 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. $ sudo fdisk -l Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xe7b472ca Device Boot Start End Blocks Id System /dev/sdb1 1 2610 20964793+ 83 Linux
2. 创建卷组
实际操作时,我们可以省略用 "sudo pvcreate /dev/sdb1" 创建物理卷的过程。
创建名为 myvg 的卷组,并将物理卷 /dev/sdb1 添加到该组。卷组使用前需要激活。
$ sudo vgcreate myvg /dev/sdb1 No physical volume label read from /dev/sdb1 Physical volume "/dev/sdb1" successfully created Volume group "myvg" successfully created $ sudo vgchange -a y myvg 0 logical volume(s) in volume group "myvg" now active $ sudo vgdisplay --- Volume group --- VG Name myvg 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 19.99 GiB PE Size 4.00 MiB Total PE 5118 Alloc PE / Size 0 / 0 Free PE / Size 5118 / 19.99 GiB VG UUID O7APOI-T0b1-T1my-PkKg-zbu3-ZBHn-KX7hCm
3. 创建逻辑卷
创建一个名为 mywww 大小 10G 的逻辑卷,用于 /var/www 数据存储。别忘了创建文件系统,否则无法使用。建议使用 ext4 或 reiserfs,否则热扩容可能失败。
$ sudo lvcreate -L 10G -n mywww myvg Logical volume "mywww" created $ sudo lvdisplay --- Logical volume --- LV Name /dev/myvg/mywww VG Name myvg LV UUID dK9aNo-0GDu-2sxP-i1kM-Nni6-u58k-IMWAtT LV Write Access read/write LV Status available # open 0 LV Size 10.00 GiB Current LE 2560 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 251:2 $ sudo mkfs -t ext4 -j /dev/myvg/mywww mke2fs 1.41.11 (14-Mar-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 655360 inodes, 2621440 blocks 131072 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2684354560 80 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 39 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
4. 挂载逻辑卷
将 /dev/myvg/mywww 挂载到 /var/www。
$ sudo mkdir -p /var/www $ sudo mount /dev/myvg/mywww /var/www $ df -h /var/www Filesystem Size Used Avail Use% Mounted on /dev/mapper/myvg-mywww 9.9G 23M 9.4G 1% /var/www $ mount /dev/mapper/myvg-mywww on /var/www type ext4 (rw)
当然,我们可以将其加入 /etc/fstab 中,以便开机后自动挂载。
$ sudo cat /etc/fstab # /etc/fstab: static file system information. # # Use 'blkid -o value -s UUID' to print the universally unique identifier # for a device; this may be used with UUID= as a more robust way to name # devices that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> /dev/myvg/mywww /var/www auto defaults 0 0
5. 新增物理卷
将新的物理分区 /dev/sdc1 添加到卷组中进行扩容。
$ sudo vgdisplay --- Volume group --- VG Name myvg System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 1 Act PV 1 VG Size 19.99 GiB PE Size 4.00 MiB Total PE 5118 Alloc PE / Size 2560 / 10.00 GiB Free PE / Size 2558 / 9.99 GiB VG UUID qWjob5-j7VY-uOnp-BMoH-7TV0-nwJA-mghxk8 $ sudo vgextend myvg /dev/sdc1 No physical volume label read from /dev/sdc1 Physical volume "/dev/sdc1" successfully created Volume group "myvg" successfully extended $ sudo vgdisplay --- Volume group --- VG Name myvg System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 2 Act PV 2 VG Size 39.98 GiB PE Size 4.00 MiB Total PE 10236 Alloc PE / Size 2560 / 10.00 GiB Free PE / Size 7676 / 29.98 GiB VG UUID qWjob5-j7VY-uOnp-BMoH-7TV0-nwJA-mghxk8
通过查看 "VG Size" 和 "Free PE / Size" 可以确认扩容成功。
6. 对逻辑卷扩容
为 /dev/myvg/www 新增 5GB 空间。
$ sudo lvextend -L +5G /dev/myvg/mywww Extending logical volume mywww to 15.00 GiB Logical volume mywww successfully resized $ sudo resize2fs -f /dev/myvg/mywww resize2fs 1.41.11 (14-Mar-2010) Filesystem at /dev/myvg/mywww is mounted on /var/www; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/myvg/mywww to 3932160 (4k) blocks. The filesystem on /dev/myvg/mywww is now 3932160 blocks long. $ df -h /var/www Filesystem Size Used Avail Use% Mounted on /dev/mapper/myvg-mywww 15G 153M 14G 2% /var/www
扩容成功!
7. 删除逻辑卷
解除挂载,删除 /dev/myvg/mywww 逻辑卷。
$ sudo umount /var/www $ sudo lvremove /dev/myvg/mywww Do you really want to remove active logical volume mywww? [y/n]: y Logical volume "mywww" successfully removed $ sudo vgdisplay --- Volume group --- VG Name myvg System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 6 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size 39.98 GiB PE Size 4.00 MiB Total PE 10236 Alloc PE / Size 0 / 0 Free PE / Size 10236 / 39.98 GiB VG UUID qWjob5-j7VY-uOnp-BMoH-7TV0-nwJA-mghxk8
--------- 分隔线 ----------------
建议在安装 Linux Server 时,除了为基本系统(/, /boot, swap) 划出几个总容量不超过 5GB 的分区,其他剩余空间统统纳入 LVM (/home, /var),如此以后扩容就非常方便了。
参考文档:
《通用线程: 学习 Linux LVM,第 1 部分》
《通用线程: 学习 Linux LVM,第 2 部分》
《逻辑卷管理 (LVM)》
《创建和管理 LVM》