2,170 瀏覽數

LVM(Logical Volume Manager)

什麼是 LVM

LVM(Logical Volume Manager)是一種可以動態變更 volume (由 LVM 所切割出來的空間被稱為 volume)大小的方式,可以讓你能更容易利用管理你的硬碟.傳統的硬碟空間在切割完時就決定了大小,如果要重新規劃必須將資料先備份下來,硬碟磁區重 新切割才可能有改變原來的硬碟磁區環境.不過 LVM(Logical Volume Manager) 就不同了,如果磁區空間不夠了,你可以隨意將空間放大或是磁區的使用率太低也可以將空間縮小.當我們在放大縮小時這都不影響原先在硬碟上的資料,聽起來很 神奇吧!!

LVM:重要名詞
下面這一段是直接取用LVM官方說明,這裡只做簡單的中文翻譯.
Physical Volume (PV)
A physical volume is typically a hard disk, though it may well just be a device that ‘looks’ like a hard disk (eg. a software raid device).
這就是硬碟切割出來的實體partition(/dev/sdb1,/dev/sdc1)

volume group (VG)

The Volume Group is the highest level abstraction used within the LVM. It gathers together a collection of Logical Volumes and Physical Volumes into one administrative unit.
接下來再由多個 PV(/dev/sdb1,/dev/sdc1)建立出的磁區再組合成一個虛擬的磁碟(/dev/volum00,將來使用時這就像是/dev/sda一個真實的磁碟機一樣,但不同於一般磁碟機的是他的大小是可以縮放)

Logical Volume (LV)
The equivalent of a disk partition in a non-LVM system. The LV is visible as a standard block device; as such the LV can contain a file system (eg. /home).
由VG這個虛擬磁碟所切割出來的 partition(/dev/volum00/LVOL1,將來使用時就像/dev/sda1一個真實的磁區一樣,但不同於一般磁區他是可以縮放的)

Physical Extent (PE)

Each physical volume is divided chunks of data, known as physical extents, these extents have the same size as the logical extents for the volume group.
PE就如同是磁碟機在格式化時,每個block的大小.而 PE系統預設大小為4M而一個VG最多可以擁有65534個PE,所以當系統預設時,ㄧ個VG最大尺寸為65534*4M大概為256G.對於現在大硬碟 的狀況下很快就無法再延伸了.所以建議在設定PE時指定大小.除了預設的4M外只要是2的倍數在8k-16GB都是可以的範圍.

LVM 的整個架構如下:

lvm00

整個架構就是將許多的 partition(/dev/sdb1 /dev/sdc1) 組成一個虛擬的磁碟(/dev/vg).之後就可以將它動態切割成你需要大小的 partition(/dev/vg/lv1,/dev/vg/lv2).就可以像一般的 partition 來使用.

系統是否有支援 LVM2
並不是每一個版本的核心都有支援 LVM 的功能,最簡單的方式就是檢查目前核心是否有支援.

[root@benjr ~]# cat /boot/config-kernel-version | grep -i lvm
#Multi-device support (RAID and LVM)
CONFIG_BLK_LVM=m
CONFIG_LVM_PROC_FS=m

此時如果能看到上敘幾項功能已經編譯至核心中,那你的檔案系統已經有支援 LVM 的功能
如果沒有那請自己編譯一個含有上敘功能的模組吧!!這些功能在編譯核心選項中的 Multi-device support (RAID and LVM) 下的 Logical volume manager(LVM) support 可以找到.

LVM2 還需要 Device Mapper的模組才成使用

[root@benjr ~]# cat /boot/config-kernel-version | grep -i BLK_DEV_DM
CONFIG_BLK_DEV_DM=m

如果你在編譯核心時找不到上敘功能的模組,請至 RedHat 的官方網站來安裝 LVM
LVM1:ftp://sources.redhat.com/pub/lvm/current
LVM2:ftp://sources.redhat.com/pub/lvm2

如果你的  “/  (root)" 是掛在 LVM 下請確定你的 LVM 是編譯在核心下的,如果是編譯模組也沒關係,請重做你的 initrd .
在模組下加入兩行

[root@benjr ~]# vi /etc/modules.conf
alias   block-major-58    lvm-mod
alias   char-major-109    lvm-mod

關於重做 initrd, 請參考系統重要檔案 initrd

note: 除了 boot 外其他的檔案系統能掛在 LVM 上.

Physical Volume (PV) 的建立
PV 的建立如同切割 partition 假設我要建立 3 個 PV,請自行建立 3 個 partition (sdb1 , sdc1 ,sdd1) ,最重要的是要將他的 type 改成 8e (LVM 磁區型態代號)

[root@benjr ~]# fdisk -L
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            1        1217     9775521   8e  Linux LVMDevice Boot      Start         End      Blocks   Id  System
/dev/sdc1            1        1217     9775521   8e  Linux LVM
Device Boot      Start         End      Blocks   Id  System
/dev/sdd1            1        1217     9775521   8e  Linux LVM

因為 /etc/lvmtab 一開始並不存在所以我們會先用  “#vgscan"  來自己建立.

[root@benjr ~]# vgscan
vgscan — reading all physical volumes (this may take a while…)
vgscan — “/etc/lvmtab" and “/etc/lvmtab.d" successfully created
vgscan — WARNING: This program does not do a VGDA backup of your volume group

我們還需要將剛剛建立的 partition 做 LVM 的初始化

[root@benjr ~]# pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1
pvcreate — physical volume “/dev/sdb1″ successfully created
pvcreate — physical volume “/dev/sdc1″ successfully created
pvcreate — physical volume “/dev/sdd1″ successfully created

如果你不確定是否建立成功,你可以使用下面指令來察看

[root@benjr ~]# pvscan
PV /dev/sdb1 lvm2 [9.32GB]
PV /dev/sdc1 lvm2 [9.32GB]
PV /dev/sdd1 lvm2 [9.32GB]
Total:3[27.97GB] / in use:0[0GB] /in no VG:3[27.97 GB]

還可以用pvdisplay來察看.

Volume Group (VG) 的建立
現在我要將剛剛建立好的 3 個 PV(sdb1,sdc1,sdd1) 集合成一個 VG(vg1)

vg1

[root@benjr ~]# vgcreate -s 32M vg1 /dev/sdb1 /dev/sdc1 /dev/sdd1
vgcreate — INFO: using default physical extent size 32 MB
vgcreate — INFO: maximum logical volume size is 2 Terabyte
vgcreate — doing automatic backup of volume group “vg1″
vgcreate — volume group “vg1″ successfully created and activated

關於PE限制住 VG 的大小,這裡就可以考慮將PE設大一點.使用參數 -s (只要是2的倍數在 8k-16GB 都是可以的範圍),看一下 VG 是否建立了 vg1

[root@benjr ~]# vgscan
vgscan — reading all physical volumes (this may take a while…)
vgscan — found active volume group “vg1″
vgscan — “/etc/lvmtab" and “/etc/lvmtab.d" successfully created
vgscan — WARNING: This program does not do a VGDA backup of your volume group

再來看看 volume 的詳細資料

[root@benjr ~]# vgdisplay -v vg1
— Volume group —
VG Name vg1
VG Access read/write
……….略……………….
— No logical volumes defined in “vg1″ —
— Physical volumes —
PV Name (#) /dev/sdb1 (1)
PV Status available / allocatable
Total PE / Free PE 297 / 297
……….略……………….

Logical Volume (LV) 的建立
LVM 提供了三種硬碟對應( mapping )方式,1.Linear 2.Mirrored 3.Striped 預設是 Linear 如果系統只有單獨一個 PV(Physical Volume) 時的唯一選擇.當你系統 VG(Volume Group) 是由多個 PV(Physical Volume) 時就可以使用另外兩種 2.Mirrored 3.Striped 他們跟 RAID 的概念一致,你可以把它想像成 Soft RAID 的 方式.Mirrored 就像是 RAID 1 ,Striped 就像是 RAID 0.
1.Linear 
我的環境是利用兩個硬碟 sdb1,sdc1組合成一個 Linear LVM Disk,資料的讀寫時系統會依序下去,當 sdb1 空間用完時才會寫到 sdc1 的硬碟裡面.
lvm_linear
2.Mirrored 
我的環境是利用兩個硬碟 sdb1,sdc1組合成一個 Mirrored LVM Disk,當資料的讀寫時系統會同時在 sdb1 sdc1 都寫入相同的資料.這就像是 RAID 1.適用於當資料不能遺失的重要資料.
lvm_mirrored
3.Striped 
我的環境是利用兩個硬碟 sdb1,sdc1組合成一個 Striped LVM Disk,當資料的讀寫時系統會依序sdb1 ,sdc1 交錯寫入.這就像是 RAID 0.因為資料是交錯的寫入所以在讀寫時可以快速從不同硬碟讀到所需的資料.也因此適用於當負載比較重的資料儲存庫.
lvm_striped
系統預設會建立成 linear 模式

[root@benjr ~]# lvcreate -L 15G -n LVOL1 vg1
lvcreate — doing automatic backup of “vg1
lvcreate — logical volume “/dev/vg1/LVOL1″ successfully created

note:如果你沒設定名字,系統會直接幫你取名為 LVOL1 , LVOL2 …. 看一下 LV 是否建立了 LVOL1

[root@benjr ~]# lvscan
lvscan — ACTIVE “/dev/vg1/LVOL1″ [15 GB]
lvscan — 1 logical volumes with 15 GB total in 1 volume group
lvscan — 1 active logical volumes

再來看看 LVOL1 的詳細資料

[root@benjr ~]# lvdisplay /dev/vg1/LVOL1
— Logical volume —
LV Name /dev/vg1/LVOL1
VG Name vg1
LV Write Access read/write
……….略……………….

最後, 我們把這個利用 LVM 模式建立的分割區格式化就可以使用了.:

[root@benjr ~]# mkfs.ext3 /dev/vg1/LVOL1
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
……….略……………….
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

掛載在你想要的目錄上就可以使用了

[root@benjr ~]# mount /dev/vg1/LVOL1 /mnt

動態縮放 LV (Logical Volume)磁碟系統大小
下面所使用的指令適用於LVM1,但要先 umount 才能動態縮放磁碟系統.

[root@benjr ~]# umount /mnt/

動態縮放磁碟系統的指令為 e2fsadm

[root@benjr ~]# e2fsadm -L +10G /dev/vg1/LVOL1
e2fsck 1.32 (09-Nov-2002)
……….略……………….
The filesystem on /dev/vg1/LVOL1 is now 6553600 blocks long.
e2fsadm — ext2fs in logical volume /dev/vg1/LVOL1 successfully extended to 25 GB

檢查一下的確 “/dev/vg1/LVOL1″ 變成 25 GB 了(原先的)

[root@benjr ~]# lvscan
lvscan — ACTIVE “/dev/vg1/LVOL1″ [25 GB]
lvscan — 1 logical volumes with 25 GB total in 1 volume group
lvscan — 1 active logical volumes

相對的將剛才的指令改為 “-" 就可以縮小

[root@benjr ~]# e2fsadm -L -10G /dev/vg1/LVOL1

掛載在你想要的目錄上就可以使用了

[root@benjr ~]# mount /dev/vg1/LVOL1 /mnt

LVM2不再需要將磁碟umount了可以直接放大. 所以要將指令改成

[root@benjr ~]# lvextend -L +10G /dev/vg1/LVOL1
[root@benjr ~]# ext2online -L +10G /dev/vg1/LVOL1

動態縮放 VG(Volume Group)磁碟系統大小
如果你的 VG 已經沒有空間,則剛剛的方法也無用武之地,所以現在要將 VG 加大.請建立 1 個 partition ,最重要的是要將他的 type 改成 8e(LVM 磁區型態代號),我們還需要將剛剛建立的 partition 做 LVM 的初始化.

[root@benjr ~]# pvcreate /dev/sde1
pvcreate — physical volume “/dev/sdb1″ successfully created

將 /dev/sde1 加入 vg1

[root@benjr ~]# vgextend vg1 /dev/sde1
vgextend — INFO: maximum logical volume size is 2 Terabyte
vgextend — doing automatic backup of volume group “vg1″
vgextend — volume group “vg1″ successfully extended
[root@benjr ~]# vgdisplay vg1
— Volume group —
VG Name vg1
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
Cur LV 1
Open LV 0
MAX LV Size 2 TB
Max PV 256
Cur PV 4
Act PV 4
VG Size 37.12 GB
……….略……………….

很明顯的 VG Size 變大了,接下來你可以再用 #e2fsadm 來動態縮放 LV 檔案系統

移除 LV,VG
要移除 LV要先將他 umount

[root@benjr ~]# umount /mnt

接下來就可以移除 LV 了

[root@benjr ~]# lvremove /dev/vg1/LVOL1

要移除 VG 要先將他 deactive

[root@benjr ~]# vgchange -a n volume
vgchange — volume group “vg1″ successfully deactivated

接下來就可以移除 VG 了

[root@benjr ~]# vgremove vg1
vgremove — volume group “vg1″ successfully removed

其他常用指令
下面是LVM相關的指令,方法就不多說明了.請參考 manpage
I. PV 常用指令
pvchange pvdata pvm pvscan
pvcreate pvdisplay pvmove pv.sh

II. VG 常用指令
vgcfgbackup vgcreate vgmerge vgscan
vgcfgrestore vgdisplay vgmknodes vgscan.static
vgchange vgexport vgreduce vgsplit
vgchange.static vgextend vgremove vgwrapper
vgck vgimport vgrename

III.LV 常用指令
lvchange lvdisplay lvmchange lvmsadc lvreduce lvrename
lvcreate lvextend lvmdiskscan lvmsar lvremove lvscan

LVM mapping modes (linear/striped) 的功能
前面介紹 LV Properties 時說到 LVM 提供了三種硬碟對應( mapping )方式,1.Linear 2.Mirrored 3.Striped 預設是 Linear 剛剛前面的範例都是使用 Linear ,如果系統只有單獨一個 PV(Physical Volume) 時的唯一選擇.當你系統 VG(Volume Group) 是由多個PV(Physical Volume) 時就可以使用另外兩種 2.Mirrored 3.Striped 他們跟 RAID 的概念一致,你可以把它想像成 Soft RAID 的 方式.Mirrored 就像是 RAID 1 ,Striped 就像是 RAID 0.

Striped:
Striped(RAID 0) 最少需要 2 個 PV(Physical Volume) 存在 VG(Volume Group) 中,這邊有三顆 PV(Physical Volume) 我通通都把他指定下去,下面可以看到 LV(Logical Volume) 真正對應到實體 PV(Physical Volume) 的狀態.

[root@benjr ~]# lvcreate -i 3 -I 4 -L 15G -n striped vg1
lvcreate — doing automatic backup of “vg1″
lvcreate — logical volume “/dev/vg1/striped" successfully created

note:系統會將 striped 建立成 striped 模式,如同上面的舉例,-i 3 那 3 筆資料是分散在那 3 個磁碟(/dev/sdb1 , /dev/sdc1, /dev/sdd1)之內的.-I 則是 stripesize 大小為(2的n次方,n=2 to 9).

Mirrored:

[root@benjr ~]# lvcreate -L 15G -m1 -n mirrored  vg1 –corelog
lvcreate — doing automatic backup of “vg1″
lvcreate — logical volume “/dev/vg1/mirrored" successfully created

note:系統會將 mirrored 建立成 mirrored 模式,–corelog 需要另外一顆 PV(Physical Volume) 存放 Mirrored Log,當有這個 Log 的時候系統會在每次重新開機都會先同步 mirror 的資料.
看一下 LV 是否建立了striped , mirrored

[root@benjr ~]# lvscan
lvscan — ACTIVE “/dev/vg1/striped" [15 GB] inherit
lvscan — ACTIVE “/dev/vg1/mirrored" [15 GB] inherit
lvscan — 2 logical volumes with 30 GB total in 1 volume group
lvscan — 2 active logical volumes

測試一下效能,可以看到 striped 的效能的確較好.

[root@benjr ~]# hdparm -t /dev/vg1/mirrored
Timing buffered disk reads:  182 MB in  3.01 seconds =  60.49 MB/sec
HDIO_DRIVE_CMD(null) (wait for flush complete) failed: Inappropriate ioctl for device
[root@benjr ~]# hdparm -t /dev/vg1/striped
/dev/vg1/striped:
Timing buffered disk reads:  702 MB in  3.01 seconds = 233.54 MB/sec
HDIO_DRIVE_CMD(null) (wait for flush complete) failed: Inappropriate ioctl for device

Snapshots 快照
什麼是 snapshot ,基本上 snapshot 照字面的意思是快照,就如同它的意思它幫我們的 LV(Logical Volume) 照相.它可以幫 LV(Logical Volume) 記錄下當時 LV(Logical Volume) 的資料,但是它不是做備份,snapshot 採用的方式叫做寫時複寫(copy on write),當 LV(logical Volume) 產生一個 snapshot 時.LV(Logical Volume) 和 snapshot 同時都是指向同一筆資料,一開始 LV(Logical Volume) 和 snapshot 都是指向同一個區塊的資料,所以 snapshot 一開始自己磁區是空的.只有當 LV(Logical Volume) 的資料備有寫入會是修改時,才會將資料原始資料複製到 snapshot ,之後才將 LV(logical Volume) 的資料做寫入或是修改. <所以 snapshot 很適合用在資料庫備份先行將資料做 snapshot(快照),之後只要針對 snapshot 磁區做備份即可.原先的資料還是可以進行讀寫不會受到備份的影響,不需要在進行備份時還要將資料庫所在的目錄先行離線.LVM 1 sanpshot 只能夠唯讀不過在 LVM2 的 snapshot 就可以讀寫了.

建立 snapshot LV
在建立 snapshot LV(logical Volume) 時要與原先的資料處於在同一個 VG(Volume Group),建議空間為原資料 LV 大小的 15-20 %.假設我要備份上一個例子 /dev/vg1/striped 大小 15 GB的資料,那我要建立大小為 3G 的 snapshot 的空間.首先將你的資料夾掛載起來,最好先將 LV 掛載成 read only 的方式.以防止有人此時使用此 LV.

[root@benjr ~]# mount -o ro /dev/vg1/LVOL1 /databse

如果你的 /dev/vg1/striped 已經掛載在某一個目錄下,你可以使用

[root@benjr ~]# mount -o remount,ro /database
[root@benjr ~]# lvcreate -s -L 3G -n sanpshot /dev/vg1/striped
lvcreate — WARNING: the snapshot must be disabled if it gets full
lvcreate — INFO: using default snapshot chunk size of 64 KB for “/dev/vg1/sanpshot"
lvcreate — doing automatic backup of “vg1″
lvcreate — logical volume “/dev/vg1/snapshot" successfully created

不要忘記將原先的 LV 恢復成 Read/Write 模式.

[root@benjr ~]# mount -o remount,rw /database

掛載你的 snapshot
因為資料是要備份的,所以掛載成 read only 的即可.

[root@benjr ~]# mkdir /backup
[root@benjr ~]# mount -o ro /dev/vg1/snapshot /backup

接下來就可以開始備份資料了

[root@benjr ~]# tar -cf /dev/st0 /backup

Snapshot 的原理
從剛才的步驟可以發現 snapshot 也是一個磁區 (partion) 但是一開始他並不佔有任何空間. snapshot 的作法是當原有的磁區 /dev/vg1/striped 資料有變動(新增,移除,變更)時,他會複製一份原始的檔案到  /dev/vg1/snapshot 磁區,然後才會讓更新的資料寫到原本的磁區.看一下下面的實驗吧!!

[root@benjr ~]# ls /database
total 13
-rw-r–r–    1 root     root            1 Apr  2 00:28 a.test.file
drwxr-xr-x    2 root     root        12288 Apr  2 00:28 lost+found
[root@benjr ~]# ls /backup
total 13
-rw-r–r–    1 root     root            1 Apr  2 00:28 a.test.file
drwxr-xr-x    2 root     root        12288 Apr  2 00:28 lost+found

可以到無論是 /database 或是 /backup的資料都是一樣,現在移除 /database/a.test.file 檔案.

[root@benjr ~]# rm /database/a.test.file
[root@benjr ~]# ls /backup
total 13
-rw-r–r–    1 root     root            1 Apr  2 00:28 a.test.file
drwxr-xr-x    2 root     root        12288 Apr  2 00:28 lost+found

你還是可以發現檔案 a.test.file 還是存在於 /dev/vg1/snapshot 磁區.這時的 snapshot 也開始使用到磁區的空間了.
note:
當我們移除 a.test.file 時,相對應的 inode 也跟著移除. 這時系統會將 a.test.fil 所在的 chunk(64KB) 標記成 ‘dirty’ 並將他複製一份到 ‘snapshot’ volume. 這邊要提的是 snapshot 並不是以檔案為單位,而是以 PE(chunks,blocks) 為標記單位.有一點要注意當 snapshot 的空間用完時,此時的 snapshot也失去作用(deactivated).

移除 snapshot
備份完就可以將 snapshot 移除

[root@benjr ~]# umount /backup
[root@benjr ~]# lvremove /dev/vg1/snapshot
lvremove — do you really want to remove “/dev/vg1/snapshot"? [y/n]: y
lvremove — doing automatic backup of volume group “vg1″
lvremove — logical volume “/dev/vg1/snapshot" successfully removed

更多的 LVM 的應用請參考下面網站
http://www.tldp.org/HOWTO/LVM-HOWTO/

網友的想法

  1. 自動參照通知: 放大縮小 Linux 磁區 – Benjr.tw

發表迴響