邏輯卷管理---LVM2

lovestanford發表於2014-07-22

邏輯卷管理(LVM)指系統將物理卷管理抽象到更高的層次,常常會形成更簡單的管理模式。透過使用 LVM,所有物理磁碟和分割槽,無論它們的大小和分佈方式如何,都被抽象為單一儲存(single storage)源。例如,在圖 1 所示的物理到邏輯對映佈局中,最大的磁碟是 80GB 的,那麼使用者如何建立更大(比如 150GB)的檔案系統呢?

圖 1. 物理到邏輯的對映 物理到邏輯的對映

LVM 可以將分割槽和磁碟聚合成一個虛擬磁碟(virtual disk),從而用小的儲存空間組成一個統一的大空間。這個虛擬磁碟在 LVM 術語中稱為卷組(volume group)

建立比最大的磁碟還大的檔案系統並不是這種高階儲存管理方法的惟一用途。還可以使用 LVM 完成以下任務:

  • 在磁碟池中新增磁碟和分割槽,對現有的檔案系統進行線上擴充套件
  • 用一個 160GB 磁碟替換兩個 80GB 磁碟,而不需要讓系統離線,也不需要在磁碟之間手工轉移資料
  • 當儲存空間超過所需的空間量時,從池中去除磁碟,從而縮小檔案系統
  • 使用快照(snapshot)執行一致的備份(本文後面會進一步討論)

LVM2 是一個新的使用者空間工具集,它為 Linux 提供邏輯卷管理功能。它完全向後相容原來的 LVM 工具集。在本文中,將介紹 LVM2 最有用的特性以及幾種簡化系統管理任務的方法。(隨便說一句,如果您正在尋找關於 LVM 的基本指南,那麼可以看看 參考資料 中列出的 LVM HowTo。)

我們來看看 LVM 的結構是什麼樣子的。

LVM 的結構

LVM 被組織為三種元素:

  • 卷(Volume):物理邏輯卷卷組
  • 區段(Extent):物理邏輯區段
  • 裝置對映器(Device mapper):Linux 核心模組

Linux LVM 組織為物理卷(PV)、卷組(VG)和邏輯卷(LV)。物理卷 是物理磁碟或物理磁碟分割槽(比如 /dev/hda 或 /dev/hdb1)。卷組 是物理卷的集合。卷組 可以在邏輯上劃分成多個邏輯卷。

圖 2 顯示一個三個磁碟構成的佈局。

圖 2. 物理到邏輯卷的對映 物理到邏輯卷的對映

物理磁碟 0 上的所有四個分割槽(/dev/hda[1-4])以及完整的物理磁碟 1(/dev/hdb)和物理磁碟 2(/dev/hdd)作為物理卷新增到卷組 VG0 中。

卷組是實現 n-to-m 對映的關鍵(也就是,將 n 個 PV 看作 m 個 LV)。在將 PV 分配給卷組之後, 就可以建立任意大小的邏輯卷(只要不超過 VG 的大小)。在圖 2 的示例中,建立了一個稱為 LV0 的卷組,並給其他 LV 留下了一些空間(這些空間也可以用來應付 LV0 以後的增長)。

LVM 中的邏輯卷就相當於物理磁碟分割槽;在實際使用中,它們就是 物理磁碟分割槽。

在建立 LV 之後,可以使用任何檔案系統對它進行格式化並將它掛載在某個掛載點上,然後就可以開始使用它了。圖 3 顯示一個經過格式化的邏輯卷 LV0 被掛載在 /var。

圖 3. 物理捲到檔案系統的對映 物理捲到檔案系統的對映

區段

為了實現 n-to-m 物理到邏輯卷對映,PV 和 VG 的基本塊必須具有相同的大小;這些基本塊稱為物理區段(PE)邏輯區段(LE)。儘管 n 個物理卷對映到 m 個邏輯卷,但是 PE 和 LE 總是一對一對映的。

在 使用 LVM2 時,對於每個 PV/LV 的最大區段數量並沒有限制。預設的區段大小是 4MB,對於大多數配置不需要修改這個設定,因為區段的大小並不影響 I/O 效能。但是,區段數量太多會降低 LVM 工具的效率,所以可以使用比較大的區段,從而降低區段數量。但是注意,在一個 VG 中不能混用不同的區段大小,而且用 LVM 修改區段大小是一種不安全的操作,會破壞資料。所以建議在初始設定時選擇一個區段大小,以後不再修改。

不同的區段大小意味著不同的 VG 粒度。例如,如果選擇的區段大小是 4GB,那麼只能以 4GB 的整數倍縮小或擴充套件 LV。

圖 4 用 PE 和 LE 顯示與前一個示例相同的佈局(VG0 中的空閒空間也由空閒 LE 組成,儘管圖中沒有顯示它們)。

圖 4. 物理到邏輯區段的對映 物理到邏輯區段的對映

另外,請注意圖 4 中的區段分配策略。LVM2 並非總是連續分配 PE;細節參見關於 lvm 的 Linux 手冊頁(見 參考資料 中的連結)。系統管理員可以設定不同的分配策略,但是一般不需要這麼做,因為預設策略(名為一般分配策略(normal allocation policy))使用符合常規的規則,比如不把並行的條帶放在同一物理捲上。

如果決定建立第二個 LV(LV1),那麼最終的 PE 佈局可能像圖 5 這樣。

圖 5. 物理到邏輯區段的對映 物理到邏輯區段的對映

裝置對映器

裝置對映器(也稱為 dm_mod)是一個 Linux 核心模組(也可以是內建的),最早出現在 2.6.9 核心中。它的作用是對裝置進行對映 —— LVM2 必須使用這個模組。

在大多數主流發行版中,裝置對映器會被預設安裝,常常會在引導時或者在安裝或啟用 LVM2/EVMS 包時自動裝載(EVMS 是一種替代 LVM 的工具,更多資訊見 參考資料)。如果沒有啟用這個模組,那麼對 dm_mod 執行 modprobe 命令,在發行版的文件中查詢在引導時啟用它的方法:modprobe dm_mod。

在建立 VG 和 LV 時, 可以給它們起一個有意義的名稱(而不是像前面的示例那樣使用 VG0、LV0 和 LV1 等名稱)。裝置對映器的作用就是將這些名稱正確地對映到物理裝置。對於前面的示例,裝置對映器會在 /dev 檔案系統中建立下面的裝置節點:

  • /dev/mapper/VG0-LV0
    • /dev/VG0/LV0 是以上節點的連結
  • /dev/mapper/VG0-LV1
    • /dev/VG0/LV1 是以上節點的連結

(注意名稱的格式標準:/dev/{vg_name}/{lv_name} -> /dev/mapper/{vg_name}{lv_name})。

與物理磁碟相反,無法直接訪問卷組(這意味著沒有 /dev/mapper/VG0 這樣的檔案,也不能執行 dd if=/dev/VG0 of=dev/VG1)。常常使用 lvm(8) 命令訪問卷組。

常見任務

在使用 LVM2 時常常執行的任務包括系統檢驗(是否安裝了 LVM2)以及建立、擴充套件和管理卷。

系統準備好執行 LVM2 了嗎?

檢查您的 Linux 發行版是否安裝了 LVM2 軟體包。如果還沒有,就安裝它(最好安裝發行版附帶的軟體包)。

裝置對映器模組必須在系統啟動時裝載。用 lsmod | grep dm_mod 命令檢查當前是否裝載了這個模組。如果沒有裝載,那麼可能需要安裝並配置更多的軟體包(文件會說明如何啟用 LVM2)。

如果只是想測試一下(或者挽救某個系統),那麼可以使用以下命令啟動 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

如果打算將根檔案系統放在一個 LVM LV 中,那麼還要注意 initial-ramdisk 映像。同樣,發行版常常會負責處理這個問題 —— 在安裝 LVM2 包時,它們常常會重新構建或更新 initrd 映像,在其中新增適當的核心模組和啟動指令碼。但是,可能需要檢視發行版的文件,確保系統支援 LVM2 根檔案系統。

注意,通常只有當探測到根檔案系統在一個 VG 中時,initial-ramdisk 映像才會啟用 LVM。這種探測常常是透過分析 root= 核心引數執行的。不同的發行版以不同的方式判斷根檔案系統是否在卷組中。細節參見發行版的文件。如果不確定的話,就需要檢查 initrd 或 initramdisk 的配置。

建立新的卷

使用您喜歡的分割槽工具(比如 fdisk、parted 或 gparted),建立一個供 LVM 使用的新分割槽。儘管 LVM 支援在整個磁碟上使用 LVM,但是 建議這麼做:其他作業系統可能認為這個磁碟沒有初始化,可能會破壞它!更好的方法是建立一個覆蓋整個磁碟的分割槽。

大多數分割槽工具常常預設使用分割槽 ID 0x83(或 Linux)來建立新分割槽。可以使用這個預設 ID,但是為了便於組織,最好將它改為 0x8e(或 Linux LVM)。

在建立分割槽之後,應該會在分割槽表中看到一個(或多個)Linux LVM 分割槽:

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#

現在用 pvcreate 對每個分割槽進行初始化:

清單 2. 分割槽初始化
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#

在一個步驟中同時建立 PV 和 VG:vgcreate:

清單 3. 建立 PV 和 VG
root@klausk:~# vgcreate test-volume /dev/hda2 /dev/hda10
  Volume group "test-volume" successfully created
root@klausk:~#

上面的命令建立一個稱為 test-volume 的邏輯卷,它使用 /dev/hda2 和 /dev/hda10 作為最初的 PV。

在建立 VG test-volume 之後,使用 vgdisplay 命令檢視剛建立的 VG 的基本資訊:

清單 4. 檢視剛建立的 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 都是空閒的!

既然卷組已經準備好了,就可以像使用磁碟一樣用它建立分割槽(LV)、刪除分割槽和重新設定分割槽大小 —— 注意,卷組是一個抽象實體,只有 LVM 工具集能夠看到它們。使用 lvcreate 建立一個新的邏輯卷:

清單 5. 建立新的邏輯卷(分割槽)
root@klausk:/# lvcreate -L 5G -n data test-volume
  Logical volume "data" created
root@klausk:/#

清單 5 建立一個名為 data 的 5GB LV。建立這個 LV 之後,可以檢查它的裝置節點:

清單 6. 檢查 LV 的裝置節點
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} 檔案。大多數 LVM 命令要求以 /dev/{vg-name}/{lv-name} 格式指定操作的目標。

建立邏輯卷之後,可以使用任何檔案系統對它進行格式化,然後將它掛載在某個掛載點上:

清單 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) 檔案,從而在引導時自動掛載這個檔案系統:

清單 9. 自動掛載 LV
#mount Logical Volume 'data' under /data
/dev/test-volume/data   /data   reiserfs        defaults        0 2

在實際使用中,邏輯卷的表現就像一個塊裝置,比如可以將它用作資料庫的原始分割槽。實際上,如果希望對資料庫執行一致的備份,那麼使用 LVM 快照是標準的最佳實踐。

擴充套件卷

擴充套件卷是非常容易的。如果卷組中有足夠的空閒空間,那麼只需使用 lvextend 來擴充套件卷,不需要解除安裝它。然後,還要擴充套件邏輯卷中的檔案系統(請記住,它們是兩回事兒)。根據所用檔案系統的不同,也可以進行線上擴充套件(即在掛載狀態下進行擴充套件)。

如果 VG 中沒有足夠的空間,那麼首先需要新增更多的物理磁碟。步驟如下:

  • 使用一個物理磁碟建立一個分割槽。建議將分割槽型別改為 0x8e(Linux LVM),這樣便於識別 LVM 分割槽/磁碟。使用 pvcreate 對物理磁碟進行初始化:pvcreate /dev/hda3。
  • 然後,使用 vgextend 將它新增到現有的 VG 中:vgextend test-volume /dev/hda2。

還可以同時建立或新增多個物理磁碟:

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 有一些有用的引數:

  • 如果希望讓 LV 增加 5GB,那麼可以使用 -L +5G。
  • 可以指定擴充套件部分的位置(也就是,用哪些 PV 提供新的空間);只需將希望使用的 PV 附加在命令後面。
  • 還可以以 PE 為單位指定絕對/相對擴充套件大小。

細節參見 lvextend(8)。

在擴充套件 LV 之後,不要忘記擴充套件檔案系統(這樣才能實際使用增加的空間)。根據檔案系統型別,這個操作可以在檔案系統掛載狀態下線上執行。

清單 10 是一個用 resize_reiserfs 重新設定 LV 大小的示例(隨便說一句,可以在掛載的檔案系統上使用這個命令):resize_reiserfs /dev/test-volume/data。

管理卷

為了管理卷,需要知道如何減小 LV 和刪除 PV。

減小邏輯卷
可以按照擴充套件 LV 的方式使用 lvreduce 命令減小 LV。從 LVM 的角度來說,這個操作可以在卷線上的情況下執行;但是,大多數檔案系統不支援縮小線上檔案系統。清單 10 給出這個過程的示例:

清單 10. 減小 LV
#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

請注意大小和單位:檔案系統不應該比 LV 大!

刪除物理卷
假設出現了以下情況:一個卷組包含兩個 80GB 的磁碟,希望將它們替換為 160GB 的磁碟。在使用 LVM 時,可以按照新增 PV 的方式從 VG 中刪除 PV(即在線上情況下執行刪除)。但是注意,不能刪除 LV 中正在使用的 PV。對於這些情況,可以使用 pvmove,它可以釋放線上的 PV,這樣就可以輕鬆地替換它們。在熱交換環境中,甚至可以交換所有磁碟,而根本不需要停機!

pvmove 的惟一要求是,VG 中連續空閒區段的數量必須等於要從 PV 中刪除的區段數量。沒有直接判斷連續空閒 PE 的最大數量的簡便方法,但是可以使用 pvdisplay -m 顯示 PV 分配圖:

清單 11. 顯示 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 個連續空閒區段,這表示最多能夠將 1,219 個區段從另一個 PV 轉移到 /dev/hda7。

如果希望釋放一個 PV 以便進行替換,那麼最好禁止它的分配,這樣就可以在從卷組中刪除它之前確保它一直是空閒的。在轉移資料之前,執行以下命令:

清單 12. 在釋放之前禁止 PV 的分配
#Disable /dev/hda6 allocation
pvchange -xn /dev/hda6

釋放之後,PV /dev/hda6 的大小為 1,200 個區段,沒有空閒區段了。使用以下命令將資料轉移出這個 PV:

清單 13. 從釋放的 PV 移出資料
#Move allocated extents out of /dev/hda6
pvmove -i 10 /dev/hda6

清單 13 中的 -i 10 引數指示 pvmove 每 10 秒報告一次狀態。根據要轉移的資料量,這個操作可能要花費幾分鐘(甚至幾小時)。還可以使用 -b 引數將這個操作轉到後臺執行。在後臺執行的情況下,狀態報告會傳送到系統日誌。

如果沒有足以進行 pvmove 操作的連續空閒區段,那麼可以在 VG 中新增 一個或多個磁碟/分割槽,從而形成 pvmove 所需的連續空間。

其他有用的 LVM 操作
關於下面這些 LVM 操作的細節,請查閱手冊頁:

  • pvresize:如果底層分割槽也已經擴充套件了,那麼可以用這個操作擴充套件 PV;如果分配圖允許的話,它也可以縮小 PV。
  • pvremove:銷燬 PV(清空它的後設資料)。只有在用 vgreduce 從 VG 中刪除 PV 之後,才能使用這個操作。
  • vgreduce:從卷組中刪除未分配的 PV,這會減小 VG。
  • vgmerge:將兩個 VG 合併成一個。目標 VG 可以是線上的!
  • vgsplit:分割一個卷組。
  • vgchange:修改一個 VG 的屬性和許可權。
  • lvchange:修改一個 LV 的屬性和許可權。
  • lvconvert:線上性卷和映象或快照之間進行轉換。

用快照執行備份

如果在備份過程期間資料沒有發生變化,那麼就能夠獲得一致的備份。如果不在備份期間停止系統,就很難保證資料沒有變化。

Linux LVM 實現了一種稱為快照(Snapshot)的特性,它的作用就像是 “拍攝” 邏輯卷在某一時刻的照片。透過使用快照, 可以獲得同一 LV 的兩個複製 —— 一個可以用於備份,另一個繼續用於日常操作。

快照有兩大優點:

  1. 快照的建立非常快,不需要停止生產環境。
  2. 建立兩個複製,但是它們的大小並不一樣。快照使用的空間僅僅是儲存兩個 LV 之間的差異所需的空間。

快照由一個例外列表(exception list)來實現,每當 LV 之間出現差異時就會更新這個列表(正式的說法是 CoW,Copy-on-Write)。

建立新的快照

建立新的快照 LV 也是使用 lvcreate 命令,但是要指定 -s 引數和原來的 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 % 已經使用了。

對於所有日常操作,快照看起來就是 原 LV 的一個複製。如果已經建立了檔案系統的話,可以用以下命令掛載它:

#mount snapshot volume
mount -o ro /dev/test-volume/test /mnt/snap

在這個命令中,ro 標誌表示將它掛載為只讀的。可以在 lvcreate 命令後面加上 -p r,這樣就在 LVM 級將它設定為只讀的。

掛載檔案系統之後,就可以用 tar、rsync 或其他備份工具執行備份。如果 LV 不包含檔案系統,或者需要原始備份,那麼也可以在這個裝置節點上直接使用 dd。

複製過程完成之後,就不需要快照了,這時只需用 lvremove 解除安裝並銷燬它:

#remove snapshot
lvremove /dev/test-volume/snap

如果資料庫建立在 LV 上,並且需要一個一致的備份,那麼一定要重新整理表並在獲得讀取鎖(read-lock)的情況下建立快照卷(見下面的虛擬碼):

SQL> flush tables read lock
{create Snapshot}
SQL> release read lock
{start copy process from the snapshot LV}

備份指令碼示例

清單 16 中的指令碼直接取自我的膝上型電腦,我在這個指令碼中使用 rsync 向一臺遠端伺服器執行每日備份。這個指令碼並不適合企業環境;在企業環境中,帶歷史記錄的增量備份更合適,但概念是相同的。

清單 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 的使用情況並根據需要擴充套件這個 LV。在極端情況下, 可以讓快照與原 LV 同樣大 —— 這樣就不需要執行查詢,因為變化量不會比整個卷更大!

其他 LVM2 系統管理技巧

最後, 我要介紹一些可以用 LVM2 執行的系統管理任務,包括按需虛擬化、用映象提高容錯能力以及透明地對塊裝置執行加密。

快照和虛擬化

在使用 LVM2 時,快照可以不是隻讀的。這意味著,在建立快照之後, 可以像常規塊裝置一樣掛載和讀寫快照。

因為流行的虛擬化系統(比如 Xen、VMWare、Qemu 和 KVM)可以將塊裝置用作 guest 映像,所以可以建立這些映像的完整複製,並根據需要使用它們,它們就像是記憶體佔用量很低的虛擬機器。這樣做的好處是部署迅速(建立快照的時間常常不超過幾 秒)和節省空間(guest 共享原映像的大多數資料)。

設定的步驟如下:

  1. 為原映像建立一個邏輯卷。
  2. 使用這個 LV 作為磁碟映像安裝 guest 虛擬機器。
  3. 暫停這個虛擬機器。記憶體映像可以是一個常規檔案,所有其他快照都放在裡面。
  4. 為原 LV 建立一個可讀寫的快照。
  5. 使用快照卷作為磁碟映像生成一個新的虛擬機器。如果需要的話,要修改網路/控制檯設定。
  6. 登入已經建立的虛擬機器,修改網路設定/主機名。

完成這些步驟之後, 就可以讓使用者訪問剛建立的虛擬機器了。如果需要另一個虛擬機器,那麼只需重複步驟 4 到 6(所以不需要重新安裝虛擬機器)。還可以用一個指令碼自動執行這些步驟。

在使用完虛擬機器之後, 可以停止虛擬機器並銷燬快照。

更好的容錯能力

最近的 LVM2 開發成果為邏輯卷提供了高可用性。邏輯卷可以有兩個或更多的映象,映象可以放在不同的物理卷(或不同的裝置)上。當在裝置上發現 I/O 錯誤時,可以使用 dmeventd 讓一個 PV 離線,而不會影響服務。更多資訊請參考 lvcreate(8)、lvconvert(8) 和 lvchange(8) 手冊頁。

如果硬體能夠支援的話,可以用 dm_multipath 透過不同的通道訪問同一裝置,這樣的話在一個通道發生故障時,可以轉移到另一個通道。更多細節請參考 dm_multipath 和 multipathd 的文件。

http://www.ibm.com/developerworks/cn/linux/l-lvm2/index.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21754115/viewspace-1224651/,如需轉載,請註明出處,否則將追究法律責任。

相關文章