LVM邏輯卷管理器
實戰場景:對於生產環境下的服務器來說,如果存儲數據的分區磁盤空間不夠了怎么辦?

答:只能換一個更大的磁盤。如果用了一段時間后,空間又不夠了,怎么辦?再加一塊更大的?換磁盤的過程中,還需要把數據從一個硬盤復制到另一個硬盤,過程太慢了。
解決方案:使用LVM在線動態擴容
邏輯卷管理器是Linux系統用於對硬盤分區進行管理的一種機制,理論性較強,其創建初衷是為了解決硬盤設備在創建分區后不易修改分區大小的缺陷。盡管對傳統的硬
盤分區進行強制擴容或縮容從理論上來講是可行的,但是卻可能造成數據的丟失。而LVM技術是在硬盤分區和文件系統之間添加了一個邏輯層,它提供了一個抽象的卷
組,可以把多塊硬盤進行卷組合並。這樣一來,用戶不必關心物理硬盤設備的底層架構和布局,就可以實現對硬盤分區的動態調整。LVM的技術架構如圖所示。

一、LVM常用的術語
物理存儲介質(The physical media):LVM存儲介質可以是磁盤分區,整個磁盤,RAID陣列或SAN磁盤,設備必須初始化為LVM物理卷,才能與LVM結合使用
物理卷PV(physical volume) :物理卷就是LVM的基本存儲邏輯塊,但和基本的物理存儲介質(如分區、磁盤等)比較,卻包含有與LVM相關的管理參數,創建物理卷它可以用硬盤分區,也可以用硬盤本身;
卷組VG(Volume Group) :一個LVM卷組由一個或多個物理卷組成
邏輯卷LV(logical volume) :LV建立在VG之上,可以在LV之上建立文件系統
PE(physical extents) :PV物理卷中可以分配的最小存儲單元,PE的大小是可以指定的,默認為4MB
LE(logical extent) : LV邏輯卷中可以分配的最小存儲單元,在同一個卷組中,LE的大小和PE是相同的,並且一一對應
二、部署邏輯卷
常用的LVM部署命令
| 功能/命令 |
物理卷管理 | 卷組管理 | 邏輯卷管理 |
| 掃描 |
pvscan | vgscan | lvscan |
| 建立 |
pvcreate | vgcreate | lvcreate |
| 顯示 |
pvdisplay | vgdisplay | lvdisplay |
| 刪除 |
pvremove | vgremove | lvremove |
| 擴展 |
vgextend | lvextend | |
| 縮小 |
vgreduce | lvreduce |
第一步:添加兩塊磁盤

第二步:讓兩塊硬盤支持LVM技術
[root@ken ~]# pvcreate /dev/sdb /dev/sdc Physical volume "/dev/sdb" successfully created. Physical volume "/dev/sdc" successfully created.
第三步:創建卷組
[root@ken ~]# vgcreate ken /dev/sdb /dev/sdc Volume group "ken" successfully created
第四步:創建邏輯卷
切割出一個100M的邏輯卷設備
這里需要注意切割單位的問題。在對邏輯卷進行切割時有兩種計量單位。第一種是以容量為單位,所使用的參數為-L。例如,使用-L 150M生成一個大小為150MB的邏
輯卷。另外一種是以基本單元的個數為單位,所使用的參數為-l。每個基本單元的大小默認為4MB。例如,使用-l 37可以生成一個大小為37×4MB=148MB的邏輯卷。
[root@ken ~]# lvcreate -n ken1 -L 100M ken Logical volume "ken1" created.
第五步:把生成好的邏輯卷進行格式化
[root@ken ~]# mkfs.ext4 /dev/ken/ken1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33685504
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
第六步:掛載使用
[root@ken ~]# mkdir /test1 [root@ken ~]# mount /dev/ken/ken1 /test1 [root@ken ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.2G 16G 7% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.7M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/ken-ken1 93M 1.6M 85M 2% /test1
三、Linux擴容邏輯卷ext4格式
第一步:卸載
[root@ken ~]# umount /test1
第二步:把ken1邏輯卷擴展到300M
[root@ken ~]# umount /test1 [root@ken ~]# lvextend -L 300M /dev/ken/ken1 Size of logical volume ken/ken1 changed from 100.00 MiB (25 extents) to 300.00 MiB (75 extents). Logical volume ken/ken1 successfully resized.
第三步:檢查磁盤完整性
[root@ken ~]# e2fsck -f /dev/ken/ken1 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/ken/ken1: 11/25688 files (9.1% non-contiguous), 8896/102400 blocks
第四步:重置硬盤容量
[root@ken ~]# resize2fs /dev/ken/ken1 resize2fs 1.42.9 (28-Dec-2013) Resizing the filesystem on /dev/ken/ken1 to 307200 (1k) blocks. The filesystem on /dev/ken/ken1 is now 307200 blocks long.
第五步:重新掛載
可以發現現在已經是300M了
[root@ken ~]# mount /dev/ken/ken1 /test1 [root@ken ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.2G 16G 7% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.7M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/ken-ken1 287M 2.0M 266M 1% /test1
四、Linux擴容邏輯卷xfs格式
1. xfs格式只能擴容,不能減小!
2. xfs格式無需卸載,支持在線擴容
第一步:創建一個邏輯卷並格式化為xfs格式
[root@ken ~]# lvcreate -n lv_xfs -L 300M ken
Logical volume "lv_xfs" created.
[root@ken ~]# mkfs.xfs /dev/ken/lv_xfs
meta-data=/dev/ken/lv_xfs isize=512 agcount=4, agsize=19200 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=76800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
第二步:掛載使用
[root@ken ~]# mount /dev/ken/lv_xfs /ken [root@ken ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.4G 16G 8% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.7M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/ken-lv_xfs 297M 16M 282M 6% /ken
第三步:在線擴容至600M
[root@ken ~]# lvextend -L 600M /dev/ken/lv_xfs
Size of logical volume ken/lv_xfs changed from 300.00 MiB (75 extents) to 600.00 MiB (150 extents).
Logical volume ken/lv_xfs successfully resized.
[root@ken ~]# xfs_growfs /dev/ken/lv_xfs
meta-data=/dev/mapper/ken-lv_xfs isize=512 agcount=4, agsize=19200 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=76800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 76800 to 153600
第四步:查看磁盤信息
發現xfs格式的邏輯卷已經擴容至600M
[root@ken ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.4G 16G 8% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.7M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/ken-lv_xfs 597M 16M 582M 3% /ken
五、Linux縮小邏輯卷
相較於擴容邏輯卷,在對邏輯卷進行縮容操作時,其丟失數據的風險更大。所以在生產環境中執行相應操作時,一定要提前備份好數據。另外Linux系統規定,在對LVM
邏輯卷進行縮容操作之前,要先檢查文件系統的完整性(當然這也是為了保證我們的數據安全)。在執行縮容操作前記得先把文件系統卸載掉。
第一步:卸載
[root@ken ~]# umount /test1/
第二步:檢查系統完整性
[root@ken ~]# e2fsck -f /dev/ken/ken1 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/ken/ken1: 11/75088 files (9.1% non-contiguous), 15637/307200 blocks
第三步:大小重置
[root@ken ~]# resize2fs /dev/ken/ken1 200M resize2fs 1.42.9 (28-Dec-2013) Resizing the filesystem on /dev/ken/ken1 to 204800 (1k) blocks. The filesystem on /dev/ken/ken1 is now 204800 blocks long.
第四步:縮小到200M
[root@ken ~]# lvreduce -L 200M /dev/ken/ken1 WARNING: Reducing active logical volume to 200.00 MiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce ken/ken1? [y/n]: y Size of logical volume ken/ken1 changed from 300.00 MiB (75 extents) to 200.00 MiB (50 extents). Logical volume ken/ken1 successfully resized.
第五步:重新掛載使用
[root@ken ~]# mount /dev/ken/ken1 /test1/ [root@ken ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.2G 16G 7% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.7M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/ken-ken1 190M 1.6M 175M 1% /test1
六、Linux刪除邏輯卷
第一步:取消掛載
[root@ken ~]# umount /test1/
第二步:刪除邏輯卷設備
[root@ken ~]# lvremove /dev/ken/ken1 Do you really want to remove active logical volume ken/ken1? [y/n]: y Logical volume "ken1" successfully removed
第三步:刪除卷組
[root@ken ~]# vgremove ken Volume group "ken" successfully removed
第四步:刪除物理卷
[root@ken ~]# pvremove /dev/sdb /dev/sdc Labels on physical volume "/dev/sdb" successfully wiped. Labels on physical volume "/dev/sdc" successfully wiped.

