本文的所有操作屆在Ubuntu 12.04 LTS上驗證成功,其他發行版請自行查閱相關命令。
給某臺服務器或者虛擬機VM進行LVM擴容的前提是,這臺機器在安裝創建的時候開啓了LVM功能。
對於服務器來說,需要擴容時,你可能已經準備好了一個新的磁盤,系統檢測到爲/sdb,而對於雲服務器或者虛擬機來說,可能是vm控制器已經將你的虛擬物理磁盤擴容了,只不過你的系統還沒有利用到這些空間而已。比如用vmware fusion,點擊擴容功能之後進入系統輸入fdisk,發現磁盤分區沒有變化,但是多出了一塊未使用的物理空間。
首先介紹LVM的幾個概念:
1. 物理卷Physical volume (PV):可以在上面建立卷組的媒介,可以是硬盤分區,也可以是硬盤本身或者回環文件(loopback file)。物理捲包括一個特殊的header,其餘部分被切割爲一塊塊物理區域(physical extents)。 Think of physical volumes as big building blocks which can be used to build your hard drive.
2. 卷組Volume group (VG):將一組物理卷收集爲一個管理單元。Group of physical volumes that are used as storage volume (as one disk). They contain logical volumes. Think of volume groups as hard drives.
3. 邏輯卷Logical volume (LV):虛擬分區,由物理區域(physical extents)組成。A "virtual/logical partition" that resides in a volume group and is composed of physical extents. Think of logical volumes as normal partitions.
4. 物理區域Physical extent (PE):硬盤可供指派給邏輯卷的最小單位(通常爲4MB)。A small part of a disk (usually 4MB) that can be assigned to a logical Volume. Think of physical extents as parts of disks that can be allocated to any partition.
02@02-vm:~$ sudo df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/02--vm--vg-root 38057472 3501084 32802424 10% /
udev 1011124 4 1011120 1% /dev
tmpfs 204196 500 203696 1% /run
none 5120 0 5120 0% /run/lock
none 1020968 0 1020968 0% /run/shm
cgroup 1020968 0 1020968 0% /sys/fs/cgroup
/dev/sda1 240972 34482 194049 16% /boot
/dev/loop0 4872572 32928 4839644 1% /srv/node/vdb
輸入df可發現,/掛載點使用的設備是/dev/mapper/xxx,並不是傳統的/dev/sdax。
輸入lvdisplay,顯示當前正在使用的logical volume(注意這裏目前有兩個,一個是文件系統所在的volume,另一個是swap分區使用的volume,當然,我們需要擴容的是第一個):
02@02-vm:~$ sudo lvdisplay
--- Logical volume ---
LV Name /dev/02-vm-vg/root
VG Name 02-vm-vg
LV UUID vC3dCP-ynJq-qwbf-ZwwX-T1ca-tOo6-5FYVNg
LV Write Access read/write
LV Status available
# open 1
LV Size 19.00 GiB
Current LE 9472
Segments 3
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0
--- Logical volume ---
LV Name /dev/02-vm-vg/swap_1
VG Name 02-vm-vg
LV UUID PT5spg-Ll4p-WAij-g2QB-PSmu-qaIr-gxc6Nf
LV Write Access read/write
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 511
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:1
輸入vgdisplay,顯示當前的volume group,注意VG SIZE,這裏應該是你當前的可用空間大小,待擴容完畢,這裏顯示的應該是最終的大小。
02@02-vm:~$ sudo vgdisplay
--- Volume group ---
VG Name 02-vm-vg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 19.75 GiB
PE Size 4.00 MiB
Total PE 10177
Alloc PE / Size 9983 / 39.00 GiB
Free PE / Size 194 / 776.00 MiB
VG UUID GFrHkW-EZFQ-vuCo-b4Pp-F1Lm-FV8B-NcbMmD
輸入pvdisplay,顯示當前的physical volume,
02@02-vm:~$ sudo pvdisplay
--- Physical volume ---
PV Name /dev/sda5
VG Name 02-vm-vg
PV Size 19.76 GiB / not usable 2.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 5058
Free PE 0
Allocated PE 5058
PV UUID RsGi6C-g0lm-SzJ1-9rw4-dMEi-Q633-9wo1Gd
現在開始進行LVM擴容:
1. 首先查看fdisk
$ sudo fdisk -l
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 499711 248832 83 Linux
/dev/sda2 501760 41940991 20719616 5 Extended
/dev/sda5 501760 41940991 20719616 8e Linux LVM
因爲這臺機器默認開啓了LVM,所以目前有一個extended分區和一個LVM分區,並且他們是完全重疊的。
這是因爲,LVM分區作爲一個虛擬的分區,完全佔用了這個extended分區,原理圖見下:
因此,現在需要做的就是將extended partition (sda2)擴展到最大,然後創建一個新的LVM logical partition (sda6),用它來填滿sda2。
使用parted命令來擴展sd2:進入parted交互模式後,可以使用help xxx來提示幫助。
help resize
resize NUMBER START END resize partition NUMBER and its file system
這裏number輸入2, start和end參見fdisk的數據(不過parted已經足夠智能地將start默認值設置成了sda5的結束,end默認值設置成物理磁盤的末尾)
接着,回到fdisk,使用它創建一個新的logical分區
n(new) -> l(logical);再選擇t,更改這個分區的類型id,設置成8e,即LVM,默認創建的類型不是LVM;w,保存退出;重啓。
這時候,再查看fdisk,發現已經多了一個sda6了,現在要做的就是將sda6作爲一個pv,加入到vg裏來,從而能夠給lv擴容。(忘了關鍵詞的話請查上文)
sudo pvcreate /dev/sda6
pvdisplay
# vgextend - add physical volumes to a volume group
# 將新的pv加入到原有的vg
sudo vgextend your_vg_name /dev/sda6
vgdisplay,發現free size多了一塊。
# lvresize - resize a logical volume
# 擴大當前正在使用的lv,從vg中取剩餘空間
最後一步,磁盤擴容完畢了,需要擴容文件系統。目前較新的內核都支持在線擴容了,不需要像以前那樣mount umount來回折騰了。
resize2fs [ -fFpPM ] [ -d debug-flags ] [ -S RAID-stride ] device [ size ]
只需要輸入device就行了,size參數不填的話,默認使用整個分區的size。
注意這裏的device是虛擬設備lv的名稱,並不是sdax這樣的物理設備了,我的環境下是/dev/02-vm-vg/root
擴容完文件系統後重啓,再查看df命令,發現佔用量百分比降低了,新的空間生效了。