首先說一下在縮小邏輯卷的時候要注意的問題:第一步使用resize2fs
命令更改文件系統的容量;第二步使用lvreduce
命令減小邏輯卷的容量。這兩個順序千萬不要搞反了,而且要保證縮減后的邏輯卷容量大於等於實際更改后的文件系統大小,否則你的邏輯卷就不能正常使用了
1 LVM體系結構
LVM(邏輯卷管理器),可以將幾個物理分區(或磁盤)通過軟件組合成為一個看起來獨立的大磁盤,並且可以靈活的調整卷的大小。LVM是由VG(卷組)、PV(物理卷)、LV(邏輯卷)和PE(物理擴展塊)組成。
1.1 物理存儲介質(The Physical Media)
這里指系統的存儲設備,如:/dev/sda、/dev/sdb等等,是存儲系統最低層的存儲單元。
1.2 物理卷(PV, Physical Volume)
物理卷就是指磁盤、磁盤分區或從邏輯上和磁盤分區具有同樣功能的設備(如RAID),是LVM的基本存儲邏輯塊,但和基本的物理存儲介質(如分區、磁盤等)比較,卻包含有和LVM相關的管理參數。
1.3 卷組(VG, Volume Group)
LVM卷組類似於非LVM系統中的物理硬盤,其由物理卷組成。能在卷組上創建一個或多個“LVM分區”(邏輯卷),LVM卷組由一個或多個物理卷組成。
1.4 邏輯卷(LV, Logical Volume)
LVM的邏輯卷類似於非LVM系統中的硬盤分區,在邏輯卷之上能建立文件系統(比如/home或/usr等)。
1.5 PE(physical extent)
每一個物理卷被划分為稱為PE(Physical Extents)的基本單元,具有唯一編號的PE是能被LVM尋址的最小單元。PE的大小是可設置的,默認為4MB。
1.6 LE(logical extent)
邏輯卷也被划分為被稱為LE(Logical Extents) 的可被尋址的基本單位。在同一個卷組中,LE的大小和PE是相同的,並且一一對應。
下面是一個LVM的體系結構圖
創建LV有兩種方式,一種是基於磁盤的,另外一種是基於分區的,如果是基於分區的就必須先通過fdisk或parted方式划分好分區,但不要格式化來進行pvcreate創建處理卷;如果基於磁盤的就不需要創建分區了,直接就可以通過pvcreate來創建物理卷。因為只有創建好了物理卷之后才能添加到卷組,並在卷組里面創建邏輯卷,后格式化才能存放數據。
這里,我以基於磁盤的方式創建LV。
2 創建物理卷PV
假設我們的系統已經掛載了一塊尚未使用的硬盤,通過fdisk -l
命令可以看到系統中所有的硬盤
[root@node1 ~]# fdisk -l | grep sd
Disk /dev/sda: 21.5 GB, 21474836480 bytes
/dev/sda1 * 1 26 204800 83 Linux
/dev/sda2 26 2611 20765696 8e Linux LVM
Disk /dev/sdb: 1073 MB, 1073741824 bytes
Disk /dev/sdc: 1073 MB, 1073741824 bytes
[root@node1 ~]#
這里可以看到我的系統中有三塊硬盤sda、sdb、sdc,其中sda已經被划分成2個分區。
現在我們來利用sdb、sdc這兩塊盤,創建兩個PV
[root@node1 ~]# pvcreate /dev/sdb /dev/sdc
Physical volume "/dev/sdb" successfully created
Physical volume "/dev/sdc" successfully created
[root@node1 ~]#
[root@node1 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 vg_node1 lvm2 a-- 19.80g 3.14g
/dev/sdb vgtest lvm2 a-- 1020.00m 1020.00m
/dev/sdc lvm2 a-- 1.00g 1.00g
[root@node1 ~]# pvscan
PV /dev/sdb VG vgtest lvm2 [1020.00 MiB / 1020.00 MiB free]
PV /dev/sda2 VG vg_node1 lvm2 [19.80 GiB / 3.14 GiB free]
PV /dev/sdc lvm2 [1.00 GiB]
Total: 3 [21.79 GiB] / in use: 2 [20.79 GiB] / in no VG: 1 [1.00 GiB]
[root@node1 ~]#
如上所示,使用pvcreate
命令創建PV,然后使用pvs
或pvscan
可以查看系統中已有的PV。
到這里,物理卷就創建完成了,接下來我們用這兩個PV來創建一個卷組。
3 創建卷組VG
我們先用其中一個PV來創建VG
[root@node1 ~]# vgcreate vgtest /dev/sdb
Volume group "vgtest" successfully created
[root@node1 ~]#
[root@node1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_node1 1 3 0 wz--n- 19.80g 3.14g
vgtest 1 0 0 wz--n- 1020.00m 1020.00m
[root@node1 ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vgtest" using metadata type lvm2
Found volume group "vg_node1" using metadata type lvm2
[root@node1 ~]#
這里,我們 vgcreate
命令創建了一個名叫vgtest的卷組,然后使用vgs
或vgscan
可以查看已創建的vg。
現在我們已經成功創建了一個卷組,接下來就可以根據需要來創建邏輯卷LV了
4 創建邏輯卷LV
[root@node1 ~]# lvcreate -L 1000M -n lvtest vgtest
Logical volume "lvtest" created
[root@node1 ~]#
這里我們使用lvcreate命令創建了一個名叫lvtest的邏輯卷,大小為1000M
簡單介紹一下lvcreate命令的參數
-L:指定邏輯卷的大小,單位為“kKmMgGtT”字節
-l:指定邏輯卷的大小(LE數)
-n: 指定邏輯卷的名字
邏輯卷創建后,還需要進行格式化操作,否則不能使用,使用mkfs
命令來進行格式化,如下所示,我們把這個邏輯卷格式化為ext4文件系統
[root@node1 ~]# mkfs.ext4 /dev/mapper/vgtest-lvtest
mke2fs 1.41.12 (17-May-2010)
文件系統標簽=
操作系統:Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65280 inodes, 261120 blocks
13056 blocks (5.00%) reserved for the super user
第一個數據塊=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
正在寫入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@node1 ~]#
到此為止,邏輯卷建立完成,你可以把它掛載到一個空閑目錄下(注意:如果掛載的非空閑目錄下,原來目錄中的內容會被隱藏,不是覆蓋哦,但你取消掛載后,被隱藏的內容就會再次出現)
[root@node1 ~]# mkdir /test/
[root@node1 ~]# mount /dev/mapper/vgtest-lvtest /test
[root@node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_node1-lvroot 9.7G 3.4G 5.8G 37% /
tmpfs 491M 72K 491M 1% /dev/shm
/dev/sda1 194M 30M 155M 16% /boot
/dev/mapper/vg_node1-lvhome 4.9G 153M 4.5G 4% /home
/dev/mapper/vgtest-lvtest 1000M 18M 936M 2% /test
[root@node1 ~]#
5 邏輯卷LV擴容
假如你的邏輯卷容量不夠了,需要擴容,有兩種情況:一是你的VG中還有剩余空間,那么可以直接使用VG中剩余的空間進行擴容;二是你的VG中沒有空間或者是空間不足了,那你需要先擴容VG,在擴容LV。。第二種只是比第一種情況多了一步擴容VG的操作,所以這里我們以第二種情況為例進行介紹。
這里我們使用剛才未使用的另一塊PV來擴容我們的卷組vgtest。
[root@node1 ~]# vgextend vgtest /dev/sdc
Volume group "vgtest" successfully extended
[root@node1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_node1 1 3 0 wz--n- 19.80g 3.14g
vgtest 2 1 0 wz--n- 1.99g 1020.00m
[root@node1 ~]#
使用vgextend
命令擴容卷組,這里可以看到我們vgtest容量已經增加了一倍,接下來開始擴容邏輯卷
[root@node1 ~]# lvextend -L +500M /dev/mapper/vgtest-lvtest
Extending logical volume lvtest to 1.48 GiB
Logical volume lvtest successfully resized
[root@node1 ~]# df -h /test
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest 1004M 18M 936M 2% /test
[root@node1 ~]#
如上所示,我們使用lvextend
命令將lvtest擴容到1.48G,但是為什么用df -h /test
命令看到的lvtest空間並沒有改變的,這里還需要一步操作才能使lvtest的空間改變生效
[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/vgtest-lvtest is mounted on /test; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/mapper/vgtest-lvtest to 389120 (4k) blocks.
The filesystem on /dev/mapper/vgtest-lvtest is now 389120 blocks long.
[root@node1 ~]#
到此,我們的LV擴容已經成功了
6 縮小LV容量
介紹完LV的擴容,我們再來說說如何縮小LV容量。假設我們想縮小lvtest的容量,並將/dev/sdc從vgtest中抽離出去,我們需要這樣進行:
#首先降低文件系統容量
[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/vgtest-lvtest is mounted on /test; on-line resizing required
On-line shrinking from 389120 to 230400 not supported.
#這里提示我們lvtest已經被掛載,不能在線縮小邏輯卷容量,所以要先取消掛載
[root@node1 ~]# umount /dev/mapper/vgtest-lvtest
[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs 1.41.12 (17-May-2010)
請先運行 'e2fsck -f /dev/mapper/vgtest-lvtest'.
#這里提示我們先運行e2fsck命令,按照提示操作即可
[root@node1 ~]# e2fsck -f /dev/mapper/vgtest-lvtest
e2fsck 1.41.12 (17-May-2010)
第一步: 檢查inode,塊,和大小
第二步: 檢查目錄結構
第3步: 檢查目錄連接性
Pass 4: Checking reference counts
第5步: 檢查簇概要信息
/dev/mapper/vgtest-lvtest: 11/97920 files (0.0% non-contiguous), 10636/389120 blocks
[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mapper/vgtest-lvtest to 230400 (4k) blocks.
The filesystem on /dev/mapper/vgtest-lvtest is now 230400 blocks long.
#這里可以看到文件系統已經成功縮小了,接下來縮小邏輯卷的大小,請注意一定要保證縮小后的邏輯卷空間大於或等於resize2fs命令縮小后的文件系統大小,否則該邏輯卷就出錯不能正常使用了(很不幸,我就是在這里踩雷了~)。我們可以先使用pvdisplay命令查看/dev/sdc的信息
[root@node1 ~]# pvdisplay /dev/sdc
--- Physical volume ---
PV Name /dev/sdc
VG Name vgtest
PV Size 1.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 255
Free PE 255
Allocated PE 0
PV UUID l4VpXe-wbwu-jSkq-jv8J-Qw8X-V5t3-1fAfBE
#可以看到PE塊大小是4M,共有255個PE塊,所以我們可以從lvtest中減小255個PE
[root@node1 ~]# lvreduce -l 255 /dev/mapper/vgtest-lvtest
WARNING: Reducing active logical volume to 1020.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lvtest? [y/n]: y
Reducing logical volume lvtest to 1020.00 MiB
Logical volume lvtest successfully resized
#上面會有告警信息,但是我們實際的數據量(900M)比1020M小,所以按y繼續吧
[root@node1 ~]# mount /dev/mapper/vgtest-lvtest /test
[root@node1 ~]# df -h /test
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest 885M 34M 806M 5% /test
#重新掛載該邏輯卷,查看其大小,
# 接下來就是移除/dev/sdc了
[root@node1 ~]# pvdisplay /dev/sdb /dev/sdc
--- Physical volume ---
PV Name /dev/sdb
VG Name vgtest
PV Size 1.00 GiB / not usable 4.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 255
Free PE 0
Allocated PE 255
PV UUID RUQhfR-5XLv-Xhgg-mbFH-M2dp-Cust-myRojW
--- Physical volume ---
PV Name /dev/sdc
VG Name vgtest
PV Size 1.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 255
Free PE 255
Allocated PE 0
PV UUID l4VpXe-wbwu-jSkq-jv8J-Qw8X-V5t3-1fAfBE
# 使用pvdisplay命令查看/dev/sdb /dev/sdc的信息,可以看到/dev/sdc是完全空閑的,所以可以直接移除
[root@node1 ~]# vgreduce vgtest /dev/sdc
Removed "/dev/sdc" from volume group "vgtest"
[root@node1 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 vg_node1 lvm2 a-- 19.80g 3.14g
/dev/sdb vgtest lvm2 a-- 1020.00m 0
/dev/sdc lvm2 a-- 1.00g 1.00g
#可以看到/dev/sdc 已經不屬於vgtest了
到此為止,lv的縮小就介紹完了,不過我們再小小的擴展一下,假設我們剛才對lvtest進行縮減后,發現/dev/sdc的PE還有被使用的,那這是就不能直接移除sdc了,需要先進行PE的轉移,將/dev/sdc中的已使用PE全部轉移到其他空間充足的PV中,比如說執行pvmove /dev/sdc /dev/sdb
,然后就可以從vgtest中移除/dev/sdc。