LVM 初體驗 (Logical Volume Manager)

常言道:『飲水思源』,在 Open Source 的世界裡,我們常常需要別人的幫助,但是在您有所心得的時候請記得分享給大家,『幫助人是快樂的喔』。歡迎您在使用 debian 的過程中的任何心得分享給大家。

LVM 初體驗 (Logical Volume Manager)

文章louie » 週一 6月 14, 2004 5:00 pm

在 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 不夠大,得將資料搬來搬去做轉移了。
louie
快樂的大學生
快樂的大學生
 
文章: 593
註冊時間: 週一 9月 09, 2002 7:58 pm

re:LVM 初體驗 (Logical Volume Manager)

文章kanru » 週一 6月 14, 2004 5:29 pm

感謝分享 :finger1:
我有幾個問題...
1. 如果加入 pv 的硬碟原本已經分割過,例如 hda 分成 hda1 跟 hda2
然後又把 hda 加入 pv 中接著又做出 vg 與 lv 且格式化,那原來的分割表會變成怎樣?
2. 有沒有辦法把 hda1 hdb1 等分割區加入 pv 中?之前試過好像不成功
3. sarge 可以在安裝的時候就用 lvm,那有沒有辦法把根目錄也放入 lvm 中?
圖檔
頭像
kanru
榮譽學長
榮譽學長
 
文章: 578
註冊時間: 週六 7月 12, 2003 12:09 pm

re:LVM 初體驗 (Logical Volume Manager)

文章阿信 » 週二 6月 15, 2004 5:20 pm

頭像
阿信
版面大總管
版面大總管
 
文章: 4756
註冊時間: 週二 9月 03, 2002 11:58 pm
來自: 台灣 - 嘉義

re:LVM 初體驗 (Logical Volume Manager)

文章louie » 週二 6月 15, 2004 5:36 pm

一個 partition 是一個 pv,所以沒辦法將二個 partitions 變成一個 pv,先將 pvcreate /dev/hda1 /dev/hdb1 後,再將二個 pv 加入 vg 中即可。
另外分割表沒有變,還是一樣二個 partitions。
louie
快樂的大學生
快樂的大學生
 
文章: 593
註冊時間: 週一 9月 09, 2002 7:58 pm

re:LVM 初體驗 (Logical Volume Manager)

文章阿信 » 週二 6月 15, 2004 5:38 pm

補充一點,在vgcreate 的時候沒有指定 Physical Extent 的話,最大的LV只能到 255GB,硬碟大的朋友可以用 vgcreate -s 32Mb,將 physical extent 加到到32mb,這樣的 max lv size 可以到 2 tera bytes
代碼: 選擇全部
--- Volume group ---
VG Name               idedisk
VG Access             read/write
VG Status             available/resizable
VG #                  0
MAX LV                256
Cur LV                1
Open LV               1
MAX LV Size           2 TB
Max PV                256
Cur PV                4
Act PV                4
VG Size               302.22 GB
PE Size               32 MB
Total PE              9671
Alloc PE / Size       9671 / 302.22 GB
Free  PE / Size       0 / 0
VG UUID               lWUus5-86t0-khXQ-uaLf-9oRy-aa7v-8hyMUn

小弟使用的是 LVM1,因為用很久了,不太敢直接升級...LVM HOWTO 有講解許多系統轉移或是 LVM on root 的方法。
頭像
阿信
版面大總管
版面大總管
 
文章: 4756
註冊時間: 週二 9月 03, 2002 11:58 pm
來自: 台灣 - 嘉義


回到 share

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客