使用LVM為根文件系統創建快照

出自 Arch Linux 中文维基

本文描述如何在系統啟動時為root文件系統做LVM快照,這些快照可以用來在最短時間內進行全系統備份,或者是測試系統的更新以便於按需回滾。

前提條件[編輯 | 編輯原始碼]

你需要一個root文件系統為LVM分區並且利用systemd進行引導的系統,確認LVM快照相關的前提條件已經正確安裝。

安裝[編輯 | 編輯原始碼]

在系統啟動過程中,利用一個新的systemd service創建一個乾淨的root卷的快照,創建/etc/systemd/system/mk-lvm-snapshots.service 包含以下內容:

[Unit]
Description=make LVM snapshots
Requires=local-fs-pre.target
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs-pre.target
Before=local-fs.target

[Install]
WantedBy=make-snapshots.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/lvcreate -L10G -n snap-root -s lvmvolume/root

將上述lvcreate命令中的root卷的卷組名和卷名改成你系統中的相關名字,如有必要修改上述快照的大小。如果還有其它的文件系統需要進行快照,則將上述ExecStart屬性擴展為多條命令,用分號隔開(注意在分號前後均要留有一個空格,詳見systemd service manual)。

注意: 你可以在運行的系統上測試一下# lvcreate命令直到得到的結果如你所需。可以用# lvremove刪除此快照。在運行的系統上做的快照不如在單用戶模式下或是在系統啟動時做的快照一致性更好。

創建一個新的systemd target /etc/systemd/system/make-snapshots.target:

[Unit]
Description=Make Snapshots
Requires=multi-user.target

如果multi-user.target不是你的預設target,則進行相應的修改。

將此新的服務生效:# systemctl enable mk-lvm-snapshots.service

如果系統啟動一個新的target,LVM快照會在掛載完本地文件系統後進行創建,為此,創建一個GRUB menu entry來啟動這個新的target,基於正常啟動的grub.cfg創建/boot/grub/custom.cfg,並在其中傳遞給內核啟動make-snapshots.target的參數。

### make snapshots ###
menuentry 'Arch GNU/Linux, make snapshots' --class arch --class gnu-linux --class gnu --class os {
...
        echo    'Loading Linux core repo kernel ...'
        linux   /boot/vmlinuz-linux root=/dev/mapper/lvmvolume-root ro systemd.unit=make-snapshots.target
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initramfs-linux.img
} 

如果{{ic|grub.cfg}發生了變更,記著相應修正custom.cfg

系統通過此grub entry啟動後# lvs應該可以看到新創建的快照。

提示:利用# journalctl -u mk-lvm-snapshots.service命令可以看到新的服務啟動過程的相關輸出。

用法[編輯 | 編輯原始碼]

備份[編輯 | 編輯原始碼]

如要進行全系統的備份,首先以上述創建快照的target重啟系統,掛載快照卷(and further volumes, if required),最好以只讀的方式 (-o) 掛載,便可以進行全系統備份,例如可以採用Full system backup with tar文章中的辦法進行備份。

在備份的過程中並不影響現有系統的使用,因為所有正常卷的修改都反應在了快照裡了。備份完後不要忘記刪除這個快照,copy-on-write的快照模式會使正常root卷的所有修改用光你的快照卷空間。如果快照卷空間用光,LVM並不能自動增長快照空間,則LVM會拒絕進一步向正常卷中寫入數據或者直接丟掉快照,都應該避免。

更新回滾[編輯 | 編輯原始碼]

另外一個LVM快照的用法是進行系統更新的測試和回滾,即為已知正常使用的系統先做一個快照,再進行更新。

如果想要固化更新的內容,則可以通過# lvremove刪除快照的方式;如果想要回滾到更新前的狀態,可以通過# lvconvert --merge恢復快照,在下次系統啟動時快照會被合併到正常卷中,創建快照之後所有對正常卷的修改均被撤消。

注意: 快照合併會快照卷也將不復存在,如果想進一步測試則必須再創建一個快照卷。