在 Linux 中,lvm 還分成 lvm1 及 lvm2,想當然爾,lvm2 就是第二代的 lvm,功能上當然比較好,一般能用 lvm2 就
用 lvm2,但是也要考慮到其他因素。lvm2 由於開發時間不久,某些工具尚未開發完整,因此管理上會麻煩一些。
以下所說的為 debian 的現況,如果用的不是 debian,則自行閱讀相關文件。但由於軟體是隨時在更新的,所以有可能閣下在使用時已經有所不同,某些限制沒有了,這點要注意。(本文件寫作時間為 93年04月17日)
要用 lvm2,則 kernel 要用 2.6 以上比較方便,否則得自行 patch 過才行。另外 lvm2 目前並無法和 e2fsadm 相結合,所以使用上會有點麻煩。
lvm1 使用的 module 為 lvm-mod,lvm2 則為 dm-mod,兩者可以同時存在,沒有問題,因此系統中可以同時有 lvm1 及
lvm2 格式的 vg 一起使用,但是一般並不需要同時安裝,基本上 lvm2 的工具相容於 lvm1。(但是 lvm2 不支援 lvm1 的 snapshot )
由於 LVM 的技術層面滿複雜的,請自行 K 相關文件。這邊純粹以範例來說明,講述如何實作而已。
假設目前核心已是 2.6 或是經過 patch 的 2.4,我們使用 lvm2 來實作,如果用 lvm1 的話,大部份的指令和操作方法都相同,只是 lvm2 有些限制,現在要講的是不用 e2fsadm 的方式,比較麻煩,但 lvm1 及 lvm2 均可通用。基本上 lvm 支援的裝置,可以是任何的 block device,所以用 loop 裝置當然也行,因此不需要額外的harddisk 或 partition。如果使用的是真實的裝置,請跳過 losetup 這條指令,但是必須要用 fdisk 將 partition ID 設為 0x8e 才能正常運作。
首先裝上 lvm2:
apt-get install lvm2
製作二個檔案系統,用來模擬二個 block device。(17M 及25M),檔案系統大小內定是以 4M 為一個單位,但 lvm 會用去一些,因此我設為 n * 4 + 1,否則如果用剛好 16M 及 24M,則會變成 12M 及 20M,浪費比較多。
dd if=/dev/zero of=/image0 bs=1M count=17
dd if=/dev/zero of=/image1 bs=1M count=25
分別將二個 loop device 連結到二個檔案
losetup /dev/loop0 /image0
losetup /dev/loop1 /image1
此時已有二個 block device: /dev/loop0 /dev/loop1 來供我們實作。
建立 PV(PhysicalVolume):
pvcreate /dev/loop0 /dev/loop1
顯示有那些 PV 可用:
oberon:/# pvscan
PV /dev/loop0 lvm2 [16.00 MB]
PV /dev/loop1 lvm2 [24.00 MB]
Total: 2 [40.00 MB] / in use: 0 [0 ] / in no VG: 2 [40.00 MB]
以上例子顯示目前有二個 PV,各為 16MB 及 24MB,in user: 0 表示目前尚未使用到,no VG 代表並未加入任何 VG(VolumeGroup)
接著由二個 PV 來建立一個名為 vg1 的 VG
vgcreate vg1 /dev/loop0 /dev/loop1
顯示 VG 的資訊
ap200:~# vgdisplay -v
Finding all volume groups
Finding volume group "vg1"
--- Volume group ---
VG Name vg1 VG 的名稱
System ID
Format lvm2 格式為 lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 255
Cur LV 0
Open LV 0
Max PV 255 一個 VG 最多可包含 255個 PV
Cur PV 2 目前有二個 PV
Act PV 2 二個 PV 均啟動中
VG Size 32.00 MB VG 的大小為 32M
PE Size 4.00 MB Physical Extent 的大小內定為 4M,可在 vgcreate 時指定
Total PE 8 共有 8 個 PE(VG size / PE size 32 / 4 = 8 )
Alloc PE / Size 0 / 0 已配置的 PE
Free PE / Size 8 / 32.00 MB 可用的 PE
VG UUID fAYOUz-12lS-8xF6-g56M-Wa6K-kUlw-yNs6EH
--- Physical volumes ---
PV Name /dev/loop0
PV UUID ULdoIc-8nnl-WQII-jhdO-16wu-9kHA-AujU1x
PV Status allocatable
Total PE / Free PE 3 / 3
PV Name /dev/loop1
PV UUID A1EDbc-HTQS-Of0o-b9Yd-9xv0-V7wz-bgh4Ss
PV Status allocatable
Total PE / Free PE 5 / 5
啟動 VG (有時候不需這個步驟)
vgchange --available y (or vgchange -ay)
接著使用已有的 vg1 來建立 LV(Logical Volume)
ap200:~# lvcreate --name lv1 --extents 7 vg1 從 vg1 建立一個名叫 lv1 大小為 7 LE(Logical Extent) 的 LV (7*4M=28M )
Logical volume "lv1" created
pa200:~# lvdisplay
--- Logical volume ---
LV Name /dev/vg1/lv1 LV 的名稱
VG Name vg1 使手 VG 的名稱
LV UUID sOqV1I-tazw-BwRi-chR4-oCRs-A1Vw-2i2Ofz
LV Write Access read/write
LV Status available
# open 0
LV Size 28.00 MB LV 的大小
Current LE 7 佔掉多少個 LE( 1LE = 1PE)
Segments 2
Allocation next free (default)
Read ahead sectors 0
Block device 254:0
此時我們再回頭去看 vg1 的狀況:
ap200:~# vgdisplay -v
Finding all volume groups
Finding volume group "vg1"
--- Volume group ---
VG Name vg1
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 255
Cur LV 1
Open LV 0
Max PV 255
Cur PV 2
Act PV 2
VG Size 32.00 MB
PE Size 4.00 MB
Total PE 8
Alloc PE / Size 7 / 28.00 MB 剛才建立 lv1 用去 7 個 PE
Free PE / Size 1 / 4.00 MB 賸下 1 PE 目前沒用到
VG UUID fAYOUz-12lS-8xF6-g56M-Wa6K-kUlw-yNs6EH
--- Physical volumes ---
PV Name /dev/loop0
PV UUID ULdoIc-8nnl-WQII-jhdO-16wu-9kHA-AujU1x
PV Status allocatable
Total PE / Free PE 3 / 0 目前 /dev/loop0 的三個 PE 已全部用完
PV Name /dev/loop1
PV UUID A1EDbc-HTQS-Of0o-b9Yd-9xv0-V7wz-bgh4Ss
PV Status allocatable
Total PE / Free PE 5 / 1 而 /dev/loop1 的五個 PE 用去四個,還賸一個
建立好 lv1 之後,我們就可以開始來建立檔案系統了,但是名稱則是要用完整的 block device 名稱(完整的裝置名為
/dev/VG名稱/LV名稱)
ap200:~# mke2fs /dev/vg1/lv1
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
7168 inodes, 28672 blocks
1433 blocks (5.00%) reserved for the super user
First data block=1
4 block groups
8192 blocks per group, 8192 fragments per group
1792 inodes per group
Superblock backups stored on blocks:
8193, 24577
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
接著 mount 起來就可以和一般的狀況一樣的操作了。
mount /dev/vg1/lv1 /mnt
ap200:~# ls /mnt
lost+found
ap200:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda6 5223712 326256 4632104 7% /
/dev/mapper/vg1-lv1 27761 13 26315 1% /mnt
由於在 mke2fs 時,內定保留 5% 給系統用,因此賸下約 26M。
這時拷些東西進去,等一下我們要做大小調整。
ap200:~# dd if=/dev/zero of=/mnt/testfile bs=1M count=20
20+0 records in
20+0 records out
20971520 bytes transferred in 0.353689 seconds (59293654 bytes/sec)
ap200:~# ls -l /mnt
total 20573
drwx------ 2 root root 12288 Apr 17 10:55 lost+found
-rw-r--r-- 1 root root 20971520 Apr 17 11:01 testfile
ap200:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda6 5223712 326256 4632104 7% /
/dev/mapper/vg1-lv1 27761 20574 5754 79% /mnt
用 dd 建立了一個 20M 的檔案,因此空間只賸 5M 多。
假設現在硬碟空間不夠了,我們又去買了一顆 50M 的硬碟,要如何加到目前的檔案系統中呢 ?
ap200:~# dd if=/dev/zero of=/image2 bs=1M count=50 建立另一個 50M 的新檔
50+0 records in
50+0 records out
52428800 bytes transferred in 0.558095 seconds (93942433 bytes/sec)
ap200:~# losetup /dev/loop2 /image2 用 losetup 指定 /image2 為 /dev/loop2
ap200:~# pvcreate /dev/loop2 建立 PV
No physical volume label read from /dev/loop2
Physical volume "/dev/loop2" successfully created
ap200:~# vgextend vg1 /dev/loop2 將 /dev/loop2 加入 vg1 中
Volume group "vg1" successfully extended
ap200:~# vgdisplay -v
Finding all volume groups
Finding volume group "vg1"
--- Volume group ---
VG Name vg1
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 255
Cur LV 1
Open LV 0
Max PV 255
Cur PV 3
Act PV 3
VG Size 80.00 MB
PE Size 4.00 MB
Total PE 20 20 PE,由於加了 /dev/loop2 的 12 個 PE(8+12=20)
Alloc PE / Size 7 / 28.00 MB 已使用了 7 PE
Free PE / Size 13 / 52.00 MB 還賸下 13 PE (1+12)
VG UUID fAYOUz-12lS-8xF6-g56M-Wa6K-kUlw-yNs6EH
--- Physical volumes ---
PV Name /dev/loop0
PV UUID ULdoIc-8nnl-WQII-jhdO-16wu-9kHA-AujU1x
PV Status allocatable
Total PE / Free PE 3 / 0
PV Name /dev/loop1
PV UUID A1EDbc-HTQS-Of0o-b9Yd-9xv0-V7wz-bgh4Ss
PV Status allocatable
Total PE / Free PE 5 / 1
PV Name /dev/loop2
PV UUID Cii6Sd-4rHD-o1rJ-anug-7EfX-9vWM-ZMvFuD
PV Status allocatable
Total PE / Free PE 12 / 12
這時我們要將 lv1 給變大一些,得先 umount
ap200:~# umount /dev/vg1/lv1
ap200:~# lvextend --extents +13 /dev/vg1/lv1 我們將 lv1 再加上 13 LE 因此大小為 7+13=20 PE
Extending logical volume lv1 to 80.00 MB 20PE * 4M = 80M
Logical volume lv1 successfully resized 注意 +13 表示目前大小再加上 13 LE(共 80M) 而只寫 13 則表示大小為 13 個 LE(13LE * 4M = 52M)
ap200:~# e2fsck -f /dev/vg1/lv1 要放大或縮小檔案系統前得先檢查(必須用 -f 強迫檢查)
e2fsck 1.35 (28-Feb-2004)
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/vg1/lv1: 12/7168 files (0.0% non-contiguous), 21485/28672 blocks
ap200:~# resize2fs /dev/vg1/lv1 將 lv1 填滿整個 block device
resize2fs 1.35 (28-Feb-2004)
Resizing the filesystem on /dev/vg1/lv1 to 81920 (1k) blocks.
The filesystem on /dev/vg1/lv1 is now 81920 blocks long.
ap200:~# mount /dev/vg1/lv1 完成後掛上檔案系統
mount /dev/vg1/lv1 /mnt 檢查大小約為 55M
ap200:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda6 5223712 377528 4580832 8% /
/dev/mapper/vg1-lv1 79647 20574 55797 27% /mnt
ap200:~# ls -l /mnt 看裡面的檔案都還好好的,沒被破壞
total 20573
drwx------ 2 root root 12288 Apr 17 10:55 lost+found
-rw-r--r-- 1 root root 20971520 Apr 17 11:01 testfile
這樣就完成了硬碟擴充的功能了。
有時候我們想把空間空出來給其他的 LV 用:
p200:~# umount /mnt 先 umount
ap200:~# e2fsck -f /dev/vg1/lv1 要調整 filesystem 大小前得先強迫檢查
e2fsck 1.35 (28-Feb-2004)
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/vg1/lv1: 12/17920 files (0.0% non-contiguous), 22847/81920 blocks
ap200:~# resize2fs /dev/vg1/lv1 31000 將 filesystem 調整為約 31M(共 80M - 48M = 32M)
resize2fs 1.35 (28-Feb-2004) 原來 lv1 為 80M, 而 /dev/loop2 為 48M(12PE * 4)
Resizing the filesystem on /dev/vg1/lv1 to 31000 (1k) blocks. 因為沒辦法準確的調到 loop1 及 loop2
The filesystem on /dev/vg1/lv1 is now 31000 blocks long. 的邊界,因此要調小一些。(如果用 e2fsadm
就可以準確的達成)
ap200:~# mount /dev/vg1/lv1 /mnt
ap200:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda6 5223712 377528 4580832 8% /
/dev/mapper/vg1-lv1 30089 20574 8585 71% /mnt 這時掛上檢查果然大小有縮小為 30M 多
再來就可將 /dev/loop2 從 lv1 中取出
ap200:~# umount /mnt 記得先 umount
ap200:~# vgdisplay -v 看看要將 /dev/loop2 拿掉要多大
.
.
.
PV Name /dev/loop2
PV UUID Cii6Sd-4rHD-o1rJ-anug-7EfX-9vWM-ZMvFuD
PV Status allocatable
Total PE / Free PE 12 / 0 要減掉 12 個 PE
ap200:~# lvreduce --extents -12 /dev/vg1/lv1 縮小 lv1 用 lvreduce,減去 loop2 大小(12LE)
WARNING: Reducing active logical volume to 32.00 MB 記得 要用 -12(不可只下 --extents 12)
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv1? [y/n]: y
Logical volume lv1 successfully resized
p200:~# e2fsck -f /dev/vg1/lv1 要調整檔案系統之前先 check filesystem
e2fsck 1.35 (28-Feb-2004)
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/vg1/lv1: 12/7168 files (0.0% non-contiguous), 21485/31000 blocks
ap200:~# resize2fs /dev/vg1/lv1 將檔案系統填滿
resize2fs 1.35 (28-Feb-2004)
Resizing the filesystem on /dev/vg1/lv1 to 32768 (1k) blocks.
The filesystem on /dev/vg1/lv1 is now 32768 blocks long.
ap200:~# mount /dev/vg1/lv1 /mnt 掛上看看大小及內容
ap200:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda6 5223712 377536 4580824 8% /
/dev/mapper/vg1-lv1 31857 20574 10300 67% /mnt 這個大小約是 loop0 + loop1 沒錯
ap200:~# vgdisplay -v 看看要將 /dev/loop2 拿掉要多大
.
.
.
--- Physical volumes ---
PV Name /dev/loop0
PV UUID ULdoIc-8nnl-WQII-jhdO-16wu-9kHA-AujU1x
PV Status allocatable
Total PE / Free PE 3 / 0
PV Name /dev/loop1
PV UUID A1EDbc-HTQS-Of0o-b9Yd-9xv0-V7wz-bgh4Ss
PV Status allocatable
Total PE / Free PE 5 / 0
PV Name /dev/loop2
PV UUID Cii6Sd-4rHD-o1rJ-anug-7EfX-9vWM-ZMvFuD
PV Status allocatable
Total PE / Free PE 12 / 12 看,loop2 的 12PE 已經完全空出來了
這樣子就大功告成,再也不怕 filesystem 不夠大,得將資料搬來搬去做轉移了。