我們來看看 LVM 的結(jié)構(gòu)是什么樣子的。
LVM 的結(jié)構(gòu)
LVM 被組織為三種元素:
- 卷(Volume):物理 和邏輯卷 和卷組
- 區(qū)段(Extent):物理 和邏輯區(qū)段
- 設備映射器(Device mapper):Linux 內(nèi)核模塊
卷
Linux LVM 組織為物理卷(PV)、卷組(VG)和邏輯卷(LV)。物理卷 是物理磁盤或物理磁盤分區(qū)(比如 /dev/hda 或 /dev/hdb1)。卷組 是物理卷的集合。卷組 可以在邏輯上劃分成多個邏輯卷。
圖 2 顯示一個三個磁盤構(gòu)成的布局。
圖 2. 物理到邏輯卷的映射
物理磁盤 0 上的所有四個分區(qū)(/dev/hda[1-4])以及完整的物理磁盤 1(/dev/hdb)和物理磁盤 2(/dev/hdd)作為物理卷添加到卷組 VG0 中。
卷組是實現(xiàn) n-to-m 映射的關鍵(也就是,將 n 個 PV 看作 m 個 LV)。在將 PV 分配給卷組之后, 就可以創(chuàng)建任意大小的邏輯卷(只要不超過 VG 的大?。?。在圖 2 的示例中,創(chuàng)建了一個稱為 LV0 的卷組,并給其他 LV 留下了一些空間(這些空間也可以用來應付 LV0 以后的增長)。
LVM 中的邏輯卷就相當于物理磁盤分區(qū);在實際使用中,它們就是 物理磁盤分區(qū)。
在創(chuàng)建 LV 之后,可以使用任何文件系統(tǒng)對它進行格式化并將它掛載在某個掛載點上,然后就可以開始使用它了。圖 3 顯示一個經(jīng)過格式化的邏輯卷 LV0 被掛載在 /var。
圖 3. 物理卷到文件系統(tǒng)的映射
區(qū)段
為了實現(xiàn) n-to-m 物理到邏輯卷映射,PV 和 VG 的基本塊必須具有相同的大小;這些基本塊稱為物理區(qū)段(PE)和邏輯區(qū)段(LE)。盡管 n 個物理卷映射到 m 個邏輯卷,但是 PE 和 LE 總是一對一映射的。
在使用 LVM2 時,對于每個 PV/LV 的最大區(qū)段數(shù)量并沒有限制。默認的區(qū)段大小是 4MB,對于大多數(shù)配置不需要修改這個設置,因為區(qū)段的大小并不影響 I/O 性能。但是,區(qū)段數(shù)量太多會降低 LVM 工具的效率,所以可以使用比較大的區(qū)段,從而降低區(qū)段數(shù)量。但是注意,在一個 VG 中不能混用不同的區(qū)段大小,而且用 LVM 修改區(qū)段大小是一種不安全的操作,會破壞數(shù)據(jù)。所以建議在初始設置時選擇一個區(qū)段大小,以后不再修改。
不同的區(qū)段大小意味著不同的 VG 粒度。例如,如果選擇的區(qū)段大小是 4GB,那么只能以 4GB 的整數(shù)倍縮小或擴展 LV。
圖 4 用 PE 和 LE 顯示與前一個示例相同的布局(VG0 中的空閑空間也由空閑 LE 組成,盡管圖中沒有顯示它們)。
圖 4. 物理到邏輯區(qū)段的映射
另外,請注意圖 4 中的區(qū)段分配策略。LVM2 并非總是連續(xù)分配 PE;細節(jié)參見關于 lvm 的 Linux 手冊頁(見 參考資料 中的鏈接)。系統(tǒng)管理員可以設置不同的分配策略,但是一般不需要這么做,因為默認策略(名為一般分配策略(normal allocation policy))使用符合常規(guī)的規(guī)則,比如不把并行的條帶放在同一物理卷上。
如果決定創(chuàng)建第二個 LV(LV1),那么最終的 PE 布局可能像圖 5 這樣。
圖 5. 物理到邏輯區(qū)段的映射
設備映射器
設備映射器(也稱為 dm_mod)是一個 Linux 內(nèi)核模塊(也可以是內(nèi)置的),最早出現(xiàn)在 2.6.9 內(nèi)核中。它的作用是對設備進行映射 —— LVM2 必須使用這個模塊。
在大多數(shù)主流發(fā)行版中,設備映射器會被默認安裝,常常會在引導時或者在安裝或啟用 LVM2/EVMS 包時自動裝載(EVMS 是一種替代 LVM 的工具,更多信息見 參考資料)。如果沒有啟用這個模塊,那么對 dm_mod 執(zhí)行 modprobe 命令,在發(fā)行版的文檔中查找在引導時啟用它的方法:modprobe dm_mod。
在創(chuàng)建 VG 和 LV 時, 可以給它們起一個有意義的名稱(而不是像前面的示例那樣使用 VG0、LV0 和 LV1 等名稱)。設備映射器的作用就是將這些名稱正確地映射到物理設備。對于前面的示例,設備映射器會在 /dev 文件系統(tǒng)中創(chuàng)建下面的設備節(jié)點:
- /dev/mapper/VG0-LV0
- /dev/VG0/LV0 是以上節(jié)點的鏈接
- /dev/mapper/VG0-LV1
- /dev/VG0/LV1 是以上節(jié)點的鏈接
(注意名稱的格式標準:/dev/{vg_name}/{lv_name} -> /dev/mapper/{vg_name}{lv_name})。
與物理磁盤相反,無法直接訪問卷組(這意味著沒有 /dev/mapper/VG0 這樣的文件,也不能執(zhí)行 dd if=/dev/VG0 of=dev/VG1)。常常使用 lvm(8) 命令訪問卷組。
常見任務
在使用 LVM2 時常常執(zhí)行的任務包括系統(tǒng)檢驗(是否安裝了 LVM2)以及創(chuàng)建、擴展和管理卷。
系統(tǒng)準備好運行 LVM2 了嗎?
檢查您的 Linux 發(fā)行版是否安裝了 LVM2 軟件包。如果還沒有,就安裝它(最好安裝發(fā)行版附帶的軟件包)。 設備映射器模塊必須在系統(tǒng)啟動時裝載。用 lsmod | grep dm_mod 命令檢查當前是否裝載了這個模塊。如果沒有裝載,那么可能需要安裝并配置更多的軟件包(文檔會說明如何啟用 LVM2)。 如果只是想測試一下(或者挽救某個系統(tǒng)),那么可以使用以下命令啟動 LVM2: 清單 1. 啟動 LVM2 的基本命令 #this should load the Device-mapper module modprobe dm_mod #this should find all the PVs in your physical disks pvscan #this should activete all the Volume Groups vgchange -ay | 如果打算將根文件系統(tǒng)放在一個 LVM LV 中,那么還要注意 initial-ramdisk 映像。同樣,發(fā)行版常常會負責處理這個問題 —— 在安裝 LVM2 包時,它們常常會重新構(gòu)建或更新 initrd 映像,在其中添加適當?shù)膬?nèi)核模塊和啟動腳本。但是,可能需要查看發(fā)行版的文檔,確保系統(tǒng)支持 LVM2 根文件系統(tǒng)。 注意,通常只有當探測到根文件系統(tǒng)在一個 VG 中時,initial-ramdisk 映像才會啟用 LVM。這種探測常常是通過分析 root= 內(nèi)核參數(shù)執(zhí)行的。不同的發(fā)行版以不同的方式判斷根文件系統(tǒng)是否在卷組中。細節(jié)參見發(fā)行版的文檔。如果不確定的話,就需要檢查 initrd 或 initramdisk 的配置。 |
創(chuàng)建新的卷
使用您喜歡的分區(qū)工具(比如 fdisk、parted 或 gparted),創(chuàng)建一個供 LVM 使用的新分區(qū)。盡管 LVM 支持在整個磁盤上使用 LVM,但是不 建議這么做:其他操作系統(tǒng)可能認為這個磁盤沒有初始化,可能會破壞它!更好的方法是創(chuàng)建一個覆蓋整個磁盤的分區(qū)。 大多數(shù)分區(qū)工具常常默認使用分區(qū) ID 0x83(或 Linux)來創(chuàng)建新分區(qū)??梢允褂眠@個默認 ID,但是為了便于組織,最好將它改為 0x8e(或 Linux LVM)。 在創(chuàng)建分區(qū)之后,應該會在分區(qū)表中看到一個(或多個)Linux LVM 分區(qū): root@klausk:/tmp/a# fdisk -l Disk /dev/hda: 80.0 GB, 80026361856 bytes 255 heads, 63 sectors/track, 9729 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 1623 13036716 7 HPFS/NTFS /dev/hda2 1624 2103 3855600 8e Linux LVM /dev/hda3 2104 2740 5116702+ 83 Linux /dev/hda4 3000 9729 54058725 5 Extended /dev/hda5 9569 9729 1293232+ 82 Linux swap / Solaris /dev/hda6 3000 4274 10241374+ 83 Linux /dev/hda7 4275 5549 10241406 83 Linux /dev/hda8 5550 6824 10241406 83 Linux /dev/hda9 6825 8099 10241406 83 Linux /dev/hda10 8100 9568 11799711 8e Linux LVM Partition table entries are not in disk order root@klausk:/tmp/a# | 現(xiàn)在用 pvcreate 對每個分區(qū)進行初始化: 清單 2. 分區(qū)初始化 root@klausk:/tmp/a# pvcreate /dev/hda2 /dev/hda10 Physical volume "/dev/hda2" successfully created Physical volume "/dev/hda10" successfully created root@klausk:/tmp/a# | 在一個步驟中同時創(chuàng)建 PV 和 VG:vgcreate : 清單 3. 創(chuàng)建 PV 和 VG root@klausk:~# vgcreate test-volume /dev/hda2 /dev/hda10 Volume group "test-volume" successfully created root@klausk:~# | 上面的命令創(chuàng)建一個稱為 test-volume 的邏輯卷,它使用 /dev/hda2 和 /dev/hda10 作為最初的 PV。 在創(chuàng)建 VG test-volume 之后,使用 vgdisplay 命令查看剛創(chuàng)建的 VG 的基本信息: 清單 4. 查看剛創(chuàng)建的 VG 的基本信息 root@klausk:/dev# vgdisplay -v test-volume Using volume group(s) on command line Finding volume group "test-volume" --- Volume group --- VG Name test-volume System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size 14.93 GB PE Size 4.00 MB Total PE 3821 Alloc PE / Size 0 / 0 Free PE / Size 3821 / 14.93 GB VG UUID lk8oco-ndQA-yIMZ-ZWhu-LtYX-T2D7-7sGKaV --- Physical volumes --- PV Name /dev/hda2 PV UUID 8LTWlw-p1OJ-dF6w-ZfMI-PCuo-8CiU-CT4Oc6 PV Status allocatable Total PE / Free PE 941 / 941 PV Name /dev/hda10 PV UUID vC9Lwb-wvgU-UZnF-0YcE-KMBb-rCmU-x1G3hw PV Status allocatable Total PE / Free PE 2880 / 2880 root@klausk:/dev# | 在清單 4 中,可以看到有兩個 PV 被分配給這個 VG,總大小為 14.93GB,有 3,821 個 4MB 的 PE,這些 PE 都是空閑的! 既然卷組已經(jīng)準備好了,就可以像使用磁盤一樣用它創(chuàng)建分區(qū)(LV)、刪除分區(qū)和重新設置分區(qū)大小 —— 注意,卷組是一個抽象實體,只有 LVM 工具集能夠看到它們。使用 lvcreate 創(chuàng)建一個新的邏輯卷: 清單 5. 創(chuàng)建新的邏輯卷(分區(qū)) root@klausk:/# lvcreate -L 5G -n data test-volume Logical volume "data" created root@klausk:/# | 清單 5 創(chuàng)建一個名為 data 的 5GB LV。創(chuàng)建這個 LV 之后,可以檢查它的設備節(jié)點: 清單 6. 檢查 LV 的設備節(jié)點 root@klausk:/# ls -l /dev/mapper/test--volume-data brw-rw---- 1 root disk 253, 4 2006-11-28 17:48 /dev/mapper/test--volume-data root@klausk:/# ls -l /dev/test-volume/data lrwxrwxrwx 1 root root 29 2006-11-28 17:48 /dev/test-volume/data -> /dev/mapper/test--volume-data root@klausk:/# | 還可以用 lvdisplay 命令查看 LV 的屬性: 清單 7. 查看 LV 的屬性 root@klausk:~# lvdisplay /dev/test-volume/data --- Logical volume --- LV Name /dev/test-volume/data VG Name test-volume LV UUID FZK4le-RzHx-VfLz-tLjK-0xXH-mOML-lfucOH LV Write Access read/write LV Status available # open 0 LV Size 5.00 GB Current LE 1280 Segments 1 Allocation inherit Read ahead sectors 0 Block device 253:4 root@klausk:~# | 在這里可以看到,在實際使用時 LV 的名稱/路徑是 /dev/{VG_name}/{LV_name},比如 /dev/test-volume/data。除了用作 /dev/{VG_name}/{LV_name} 鏈接的目標之外,不應該在其他地方使用 /dev/mapper/{VG_name}-{LV_name} 文件。大多數(shù) LVM 命令要求以 /dev/{vg-name}/{lv-name} 格式指定操作的目標。 建立邏輯卷之后,可以使用任何文件系統(tǒng)對它進行格式化,然后將它掛載在某個掛載點上: 清單 8. 掛載 LV root@klausk:~# mkfs.reiserfs /dev/test-volume/data root@klausk:~# mkdir /data root@klausk:~# mount -t reiserfs /dev/test-volume/data /data/ root@klausk:~# df -h /data Filesystem Size Used Avail Use% Mounted on /dev/mapper/test--volume-data 5.0G 33M 5.0G 1% /data root@klausk:~# | 還可以編輯 fstab(5) 文件,從而在引導時自動掛載這個文件系統(tǒng): 清單 9. 自動掛載 LV #mount Logical Volume 'data' under /data /dev/test-volume/data /data reiserfs defaults 0 2 | 在實際使用中,邏輯卷的表現(xiàn)就像一個塊設備,比如可以將它用作數(shù)據(jù)庫的原始分區(qū)。實際上,如果希望對數(shù)據(jù)庫執(zhí)行一致的備份,那么使用 LVM 快照是標準的最佳實踐。 |
擴展卷
擴展卷是非常容易的。如果卷組中有足夠的空閑空間,那么只需使用 lvextend 來擴展卷,不需要卸載它。然后,還要擴展邏輯卷中的文件系統(tǒng)(請記住,它們是兩回事兒)。根據(jù)所用文件系統(tǒng)的不同,也可以進行在線擴展(即在掛載狀態(tài)下進行擴展)。 如果 VG 中沒有足夠的空間,那么首先需要添加更多的物理磁盤。步驟如下: - 使用一個物理磁盤創(chuàng)建一個分區(qū)。建議將分區(qū)類型改為 0x8e(Linux LVM),這樣便于識別 LVM 分區(qū)/磁盤。使用
pvcreate 對物理磁盤進行初始化:pvcreate /dev/hda3 。 - 然后,使用
vgextend 將它添加到現(xiàn)有的 VG 中:vgextend test-volume /dev/hda2 。 還可以同時創(chuàng)建或添加多個物理磁盤: pvcreate /dev/hda2 /dev/hda3 /dev/hda5 vgextend test-volume /dev/hda2 /dev/hda3 /dev/hda5 | 添加了 PV 之后,就有了足以擴展邏輯卷的空間,就可以使用 lvextend 擴展邏輯卷了:lvextend -L 8G /dev/test-volume/data 。這個命令將 /dev/test-volume/data LV 的大小擴展到 8GB。 lvextend 有一些有用的參數(shù): - 如果希望讓 LV 增加 5GB,那么可以使用
-L +5G 。 - 可以指定擴展部分的位置(也就是,用哪些 PV 提供新的空間);只需將希望使用的 PV 附加在命令后面。
- 還可以以 PE 為單位指定絕對/相對擴展大小。
細節(jié)參見 lvextend(8) 。 在擴展 LV 之后,不要忘記擴展文件系統(tǒng)(這樣才能實際使用增加的空間)。根據(jù)文件系統(tǒng)類型,這個操作可以在文件系統(tǒng)掛載狀態(tài)下在線執(zhí)行。 清單 10 是一個用 resize_reiserfs 重新設置 LV 大小的示例(隨便說一句,可以在掛載的文件系統(tǒng)上使用這個命令):resize_reiserfs /dev/test-volume/data 。 |
管理卷
為了管理卷,需要知道如何減小 LV 和刪除 PV。
減小邏輯卷
可以按照擴展 LV 的方式使用 lvreduce
命令減小 LV。從 LVM 的角度來說,這個操作可以在卷在線的情況下執(zhí)行;但是,大多數(shù)文件系統(tǒng)不支持縮小在線文件系統(tǒng)。清單 10 給出這個過程的示例:
#unmount LV umount /path/to/mounted-volume #shrink filesystem to 4G resize_reiserfs -s 4G /dev/test-volume/data #reduce LV lvreduce -L 4G /dev/vg00/test |
請注意大小和單位:文件系統(tǒng)不應該比 LV 大!
刪除物理卷
假設出現(xiàn)了以下情況:一個卷組包含兩個 80GB 的磁盤,希望將它們替換為 160GB 的磁盤。在使用 LVM 時,可以按照添加 PV 的方式從 VG 中刪除 PV(即在在線情況下執(zhí)行刪除)。但是注意,不能刪除 LV 中正在使用的 PV。對于這些情況,可以使用 pvmove
,它可以釋放在線的 PV,這樣就可以輕松地替換它們。在熱交換環(huán)境中,甚至可以交換所有磁盤,而根本不需要停機!
pvmove
的惟一要求是,VG 中連續(xù)空閑區(qū)段的數(shù)量必須等于要從 PV 中刪除的區(qū)段數(shù)量。沒有直接判斷連續(xù)空閑 PE 的最大數(shù)量的簡便方法,但是可以使用 pvdisplay -m
顯示 PV 分配圖:
#shows the allocation map pvdisplay -m --- Physical volume --- PV Name /dev/hda6 VG Name test-volume PV Size 4.91 GB / not usable 1.34 MB Allocatable yes (but full) PE Size (KByte) 4096 Total PE 1200 Free PE 0 Allocated PE 1200 PV UUID BA99ay-tOcn-Atmd-LTCZ-2KQr-b4Z0-CJ0FjO --- Physical Segments --- Physical extent 0 to 2367: Logical volume /dev/test-volume/data Logical extents 5692 to 8059 Physical extent 2368 to 2499: Logical volume /dev/test-volume/data Logical extents 5560 to 5691 --- Physical volume --- PV Name /dev/hda7 VG Name test-volume PV Size 9.77 GB / not usable 1.37 MB Allocatable yes PE Size (KByte) 4096 Total PE 2500 Free PE 1220 Allocated PE 1280 PV UUID Es9jwb-IjiL-jtd5-TgBx-XSxK-Xshj-Wxnjni --- Physical Segments --- Physical extent 0 to 1279: Logical volume /dev/test-volume/LV0 Logical extents 0 to 1279 Physical extent 1280 to 2499: FREE |
清單 11 顯示有 2,499-1,280 = 1,219 個連續(xù)空閑區(qū)段,這表示最多能夠?qū)?1,219 個區(qū)段從另一個 PV 轉(zhuǎn)移到 /dev/hda7。
如果希望釋放一個 PV 以便進行替換,那么最好禁止它的分配,這樣就可以在從卷組中刪除它之前確保它一直是空閑的。在轉(zhuǎn)移數(shù)據(jù)之前,執(zhí)行以下命令:
#Disable /dev/hda6 allocation pvchange -xn /dev/hda6 |
釋放之后,PV /dev/hda6 的大小為 1,200 個區(qū)段,沒有空閑區(qū)段了。使用以下命令將數(shù)據(jù)轉(zhuǎn)移出這個 PV:
#Move allocated extents out of /dev/hda6 pvmove -i 10 /dev/hda6 |
清單 13 中的 -i 10
參數(shù)指示 pvmove
每 10 秒報告一次狀態(tài)。根據(jù)要轉(zhuǎn)移的數(shù)據(jù)量,這個操作可能要花費幾分鐘(甚至幾小時)。還可以使用 -b
參數(shù)將這個操作轉(zhuǎn)到后臺執(zhí)行。在后臺執(zhí)行的情況下,狀態(tài)報告會發(fā)送到系統(tǒng)日志。
如果沒有足以進行 pvmove
操作的連續(xù)空閑區(qū)段,那么可以在 VG 中添加 一個或多個磁盤/分區(qū),從而形成 pvmove
所需的連續(xù)空間。
其他有用的 LVM 操作
關于下面這些 LVM 操作的細節(jié),請查閱手冊頁:
pvresize
:如果底層分區(qū)也已經(jīng)擴展了,那么可以用這個操作擴展 PV;如果分配圖允許的話,它也可以縮小 PV。 pvremove
:銷毀 PV(清空它的元數(shù)據(jù))。只有在用 vgreduce
從 VG 中刪除 PV 之后,才能使用這個操作。 vgreduce
:從卷組中刪除未分配的 PV,這會減小 VG。 vgmerge
:將兩個 VG 合并成一個。目標 VG 可以是在線的! vgsplit
:分割一個卷組。 vgchange
:修改一個 VG 的屬性和權限。 lvchange
:修改一個 LV 的屬性和權限。 lvconvert
:在線性卷和鏡像或快照之間進行轉(zhuǎn)換。
用快照執(zhí)行備份
如果在備份過程期間數(shù)據(jù)沒有發(fā)生變化,那么就能夠獲得一致的備份。如果不在備份期間停止系統(tǒng),就很難保證數(shù)據(jù)沒有變化。 Linux LVM 實現(xiàn)了一種稱為快照(Snapshot)的特性,它的作用就像是 “拍攝” 邏輯卷在某一時刻的照片。通過使用快照, 可以獲得同一 LV 的兩個拷貝 —— 一個可以用于備份,另一個繼續(xù)用于日常操作。 快照有兩大優(yōu)點: - 快照的創(chuàng)建非???,不需要停止生產(chǎn)環(huán)境。
- 建立兩個拷貝,但是它們的大小并不一樣??煺帐褂玫目臻g僅僅是存儲兩個 LV 之間的差異所需的空間。
快照由一個例外列表(exception list)來實現(xiàn),每當 LV 之間出現(xiàn)差異時就會更新這個列表(正式的說法是 CoW,Copy-on-Write)。 創(chuàng)建新的快照 創(chuàng)建新的快照 LV 也是使用 lvcreate 命令,但是要指定 -s 參數(shù)和原來的 LV。在這種情況下,-L size 指定例外列表的大小,這影響快照支持的最大差異量,如果差異超過這個量,就無法保持一致性。 清單 14. 建立快照 #create a Snapshot LV called 'snap' from origin LV 'test' lvcreate -s -L 2G -n snap/dev/test-volume/test | 可以使用 lvdisplay 查詢特殊信息,比如 CoW 的大小和使用情況: 清單 15. CoW 的大小和使用情況 lvdisplay /dev/vg00/snap --- Logical volume --- LV Name /dev/vg00/snap VG Name vg00 LV UUID QHVJYh-PR3s-A4SG-s4Aa-MyWN-Ra7a-HL47KL LV Write Access read/write LV snapshot status active destination for /dev/vg00/test LV Status available # open 0 LV Size 4.00 GB Current LE 1024 COW-table size 2.00 GB COW-table LE 512 Allocated to snapshot 54.16% Snapshot chunk size 8.00 KB Segments 1 Allocation inherit Read ahead sectors 0 Block device 254:5 | 清單 15 表明這個 CoW 的大小為 2GB,其中的 54.16 % 已經(jīng)使用了。 對于所有日常操作,快照看起來就是 原 LV 的一個拷貝。如果已經(jīng)建立了文件系統(tǒng)的話,可以用以下命令掛載它: #mount snapshot volume mount -o ro /dev/test-volume/test /mnt/snap | 在這個命令中,ro 標志表示將它掛載為只讀的。可以在 lvcreate 命令后面加上 -p r ,這樣就在 LVM 級將它設置為只讀的。 掛載文件系統(tǒng)之后,就可以用 tar 、rsync 或其他備份工具執(zhí)行備份。如果 LV 不包含文件系統(tǒng),或者需要原始備份,那么也可以在這個設備節(jié)點上直接使用 dd 。 復制過程完成之后,就不需要快照了,這時只需用 lvremove 卸載并銷毀它: #remove snapshot lvremove /dev/test-volume/snap | 如果數(shù)據(jù)庫建立在 LV 上,并且需要一個一致的備份,那么一定要刷新表并在獲得讀取鎖(read-lock)的情況下建立快照卷(見下面的偽代碼): SQL> flush tables read lock {create Snapshot} SQL> release read lock {start copy process from the snapshot LV} | 備份腳本示例 清單 16 中的腳本直接取自我的筆記本電腦,我在這個腳本中使用 rsync 向一臺遠程服務器執(zhí)行每日備份。這個腳本并不適合企業(yè)環(huán)境;在企業(yè)環(huán)境中,帶歷史記錄的增量備份更合適,但概念是相同的。 清單 16. 簡單的備份腳本示例 #!/bin/sh # we need the dm-snapshot module modprobe dm-snapshot if [ -e /dev/vg00/home-snap ] then # remove left-overs, if any umount -f /mnt/home-snap && true lvremove -f /dev/vg00/home-snap fi # create snapshot, 1GB CoW space # that should be sufficient for accommodating changes during copy lvcreate -vs -p r -n home-snap -L 1G /dev/vg00/home mkdir -p /mnt/home-snap # mount recently-created snapshot as read-only mount -o ro /dev/vg00/home-snap /mnt/home-snap # magical rsync command__rsync -avhzPCi --delete -e "ssh -i /home/klausk/.ssh/id_rsa" --filter '- .Trash/' --filter '- *~' --filter '- .local/share/Trash/' --filter '- *.mp3' --filter '- *Cache*' --filter '- *cache*' /mnt/home-snap/klausk klausk2@pokgsa.ibm.comThis e-mail address is being protected from spam bots, you need JavaScript enabled to view it :bkp/ # unmount and scrap snapshot LV umount /mnt/home-snap lvremove -f /dev/vg00/home-snap | 在某些特殊情況下,無法估計備份周期或者復制過程很長,那么腳本可以用 lvdisplay 查詢 Snapshot CoW 的使用情況并根據(jù)需要擴展這個 LV。在極端情況下, 可以讓快照與原 LV 同樣大 —— 這樣就不需要執(zhí)行查詢,因為變化量不會比整個卷更大! |
其他 LVM2 系統(tǒng)管理技巧
最后, 我要介紹一些可以用 LVM2 執(zhí)行的系統(tǒng)管理任務,包括按需虛擬化、用鏡像提高容錯能力以及透明地對塊設備執(zhí)行加密。 快照和虛擬化 在使用 LVM2 時,快照可以不是只讀的。這意味著,在創(chuàng)建快照之后, 可以像常規(guī)塊設備一樣掛載和讀寫快照。 因為流行的虛擬化系統(tǒng)(比如 Xen、VMWare、Qemu 和 KVM)可以將塊設備用作 guest 映像,所以可以創(chuàng)建這些映像的完整拷貝,并根據(jù)需要使用它們,它們就像是內(nèi)存占用量很低的虛擬機。這樣做的好處是部署迅速(創(chuàng)建快照的時間常常不超過幾秒)和節(jié)省空間(guest 共享原映像的大多數(shù)數(shù)據(jù))。 設置的步驟如下: - 為原映像創(chuàng)建一個邏輯卷。
- 使用這個 LV 作為磁盤映像安裝 guest 虛擬機。
- 暫停這個虛擬機。內(nèi)存映像可以是一個常規(guī)文件,所有其他快照都放在里面。
- 為原 LV 創(chuàng)建一個可讀寫的快照。
- 使用快照卷作為磁盤映像生成一個新的虛擬機。如果需要的話,要修改網(wǎng)絡/控制臺設置。
- 登錄已經(jīng)創(chuàng)建的虛擬機,修改網(wǎng)絡設置/主機名。
完成這些步驟之后, 就可以讓用戶訪問剛創(chuàng)建的虛擬機了。如果需要另一個虛擬機,那么只需重復步驟 4 到 6(所以不需要重新安裝虛擬機)。還可以用一個腳本自動執(zhí)行這些步驟。 在使用完虛擬機之后, 可以停止虛擬機并銷毀快照。 更好的容錯能力 最近的 LVM2 開發(fā)成果為邏輯卷提供了高可用性。邏輯卷可以有兩個或更多的鏡像,鏡像可以放在不同的物理卷(或不同的設備)上。當在設備上發(fā)現(xiàn) I/O 錯誤時,可以使用 dmeventd 讓一個 PV 離線,而不會影響服務。更多信息請參考 lvcreate(8) 、lvconvert(8) 和 lvchange(8) 手冊頁。 如果硬件能夠支持的話,可以用 dm_multipath 通過不同的通道訪問同一設備,這樣的話在一個通道發(fā)生故障時,可以轉(zhuǎn)移到另一個通道。更多細節(jié)請參考 dm_multipath 和 multipathd 的文檔。 透明的設備加密 可以用 dm_crypt 對塊設備或邏輯卷執(zhí)行透明的加密。更多信息請參考 dm_crypt 的文檔和 cryptsetup(8) 手冊頁。 |
迅雷專鏈 gJ89XhWC.gif (6.8 KB)
邏輯卷管理:使用LVM2工具執(zhí)行卷的構(gòu)建和管理、建立備份快照等各種功能
迅雷專鏈 OIyVgJRM.gif (7.75 KB)
邏輯卷管理:使用LVM2工具執(zhí)行卷的構(gòu)建和管理、建立備份快照等各種功能
迅雷專鏈 iyRQWf8G.gif (9.72 KB)
邏輯卷管理:使用LVM2工具執(zhí)行卷的構(gòu)建和管理、建立備份快照等各種功能
迅雷專鏈 eEpCuYoq.gif (10.84 KB)
邏輯卷管理:使用LVM2工具執(zhí)行卷的構(gòu)建和管理、建立備份快照等各種功能