使用 LVM 為根文件系統創建快照
本文描述如何在系統啟動時為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
恢復快照,在下次系統啟動時快照會被合併到正常卷中,創建快照之後所有對正常卷的修改均被撤消。