如何使用 Btrfs 快照進行備份

BTRFS 是一個開源的現代文件系統,具有高級功能。 它適用於寫時復制 (CoW) 機制。

它包含在主線 Linux 內核中。 Btrfs 的顯著特點是寫時復制數據和元數據、快照、內置 RAID 支持、在線調整大小和碎片整理、透明壓縮、小文件的高效存儲等。

快照 是 Btrfs 的給定時間副本 子卷. 默認情況下,快照是可寫的。 Btrfs 允許創建可讀的快照,這有助於備份。

在本教程中,我們學習如何創建 Btrfs 快照、增量備份和恢復它。

系統信息

我在用 Fedora 現在 Fedora 33 默認有 Btrfs。 我的系統有 20GB 的啟動盤和 10GB 的附加磁盤,上面有 Btrfs 文件系統。

這裡 sda 是啟動盤,而 sdb 是我們將用於 btrfs 快照的附加磁盤。

列出磁盤信息:

$ ls -l /dev | grep sd
brw-rw----. 1 root disk 8, 0 Nov 21 08:42 sda
brw-rw----. 1 root disk 8, 1 Nov 21 08:42 sda1
brw-rw----. 1 root disk 8, 2 Nov 21 08:42 sda2
brw-rw----. 1 root disk 8, 16 Nov 21 08:57 sdb
brw-rw----. 1 root disk 8, 17 Nov 21 08:57 sdb1

為了解釋一下,我創建了 LVM 並將其安裝在 /mnt/linoxide_btrfs1 和 btrfs 文件系統。

創建的列表 PV、VG 和 LV:

$ pvs && vgs && lvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 linoxide_vg lvm2 a-- <10.00g <5.00g
VG #PV #LV #SN Attr VSize VFree
linoxide_vg 1 1 0 wz--n- <10.00g <5.00g
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
linoxide_lv1 linoxide_vg -wi-a----- 5.00g

掛載信息輸出:

$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 286M 0 286M 0% /dev
tmpfs 294M 0 294M 0% /dev/shm
tmpfs 294M 4.5M 289M 2% /run
tmpfs 294M 0 294M 0% /sys/fs/cgroup
/dev/sda2 20G 2.3G 18G 12% /
/dev/sda1 200M 12M 189M 6% /boot/efi
tmpfs 59M 0 59M 0% /run/user/1000
tmpfs 59M 0 59M 0% /run/user/0
/dev/mapper/linoxide_vg-linoxide_lv1 5.0G 17M 4.5G 1% /mnt/linoxide_btrfs1

Btrfs 快照

為了創建 btrfs 快照,首先創建一個 子卷.

步驟 1. 創建子卷

要創建名為“/mnt/linoxide_btrfs1/subvol1”的子卷,請運行:

$ sudo btrfs subvolume create /mnt/linoxide_btrfs1/subvol1

步驟 2. 將文件複製到子卷

讓我們將一些數據文件複製到子卷。 以下命令將一些文件從 /etc/ 複製到 subvol1。

$ cd /mnt/linoxide_btrfs1/subvol1
$ cp /etc/[abc]* .
$ ls -l
-rw-r--r--. 1 root root 16 Nov 21 09:25 adjtime
-rw-r--r--. 1 root root 1529 Nov 21 09:25 aliases
-rw-r--r--. 1 root root 12288 Nov 21 09:25 aliases.db
-rw-------. 1 root root 541 Nov 21 09:25 anacrontab
-rw-r--r--. 1 root root 55 Nov 21 09:25 asound.conf
-rw-r--r--. 1 root root 2853 Nov 21 09:25 bashrc
-rw-r--r--. 1 root root 112 Nov 21 09:25 boto.cfg
-rw-r--r--. 1 root root 37 Nov 21 09:25 centos-release
-rw-r--r--. 1 root root 51 Nov 21 09:25 centos-release-upstream
-rw-r--r--. 1 root root 1053 Nov 21 09:25 chrony.conf

步驟 3. 創建快照

讓我們創建 subvolume1 (/mnt/linoxide_btrfs1/subvol1) 的快照。

請注意 -r 只讀標誌。 如果喜歡使用發送/接收命令(在下一節中解釋),請確保將快照創建為只讀。

要在“/mnt/linoxide_btrfs1/.snapshots/subvol1-day1”中創建“/mnt/linoxide_btrfs1/subvol1”的只讀快照,請運行:

$ sudo btrfs subvolume snapshot -r /mnt/linoxide_btrfs1/subvol1 /mnt/linoxide_btrfs1/.snapshots/subvol1-day1

檢查快照的內容:

$ cd .snapshots/
$ ls -l
drwxr-xr-x. 1 root root 446 Nov 21 09:25 subvol1-day1
$ cd subvol1-day1/
$ ls -l
-rw-r--r--. 1 root root 16 Nov 21 09:25 adjtime
-rw-r--r--. 1 root root 1529 Nov 21 09:25 aliases
-rw-r--r--. 1 root root 12288 Nov 21 09:25 aliases.db
-rw-------. 1 root root 541 Nov 21 09:25 anacrontab
-rw-r--r--. 1 root root 55 Nov 21 09:25 asound.conf
-rw-r--r--. 1 root root 2853 Nov 21 09:25 bashrc
-rw-r--r--. 1 root root 112 Nov 21 09:25 boto.cfg
-rw-r--r--. 1 root root 37 Nov 21 09:25 centos-release
-rw-r--r--. 1 root root 51 Nov 21 09:25 centos-release-upstream
-rw-r--r--. 1 root root 1053 Nov 21 09:25 chrony.conf

使用發送的 Btrfs 快照

我們在與子卷相同的磁盤上拍攝了快照,這不利於備份策略,如果發生磁盤損壞等災難,將失去恢復選項。

BTRFS 有一個解決方案。 我們可以使用命令 btrfs send 和 btrfs receive 將快照發送到遠程系統或外部硬盤驅動器。 它們基於 SSH。 遠程系統也應格式化為 BTRFS。

讓我解釋一下 example.

使用掛載在 /mnt/linoxide_btrfs2 的 btrfs 文件系統創建一個新磁盤。

$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 286M 0 286M 0% /dev
tmpfs 294M 0 294M 0% /dev/shm
tmpfs 294M 4.5M 289M 2% /run
tmpfs 294M 0 294M 0% /sys/fs/cgroup
/dev/sda2 20G 2.3G 18G 12% /
/dev/sda1 200M 12M 189M 6% /boot/efi
tmpfs 59M 0 59M 0% /run/user/1000
tmpfs 59M 0 59M 0% /run/user/0
/dev/mapper/linoxide_vg-linoxide_lv1 5.0G 17M 4.5G 1% /mnt/linoxide_btrfs1
/dev/mapper/linoxide_vg2-linoxide_lv2 5.0G 17M 4.5G 1% /mnt/linoxide_btrfs2

在這 example, 這 目標 Btrfs 卷 是安裝為 /mnt/linoxide_btrfs2 的第二個 btrfs 磁盤。

以下命令將快照發送到遠程目標:

$ sudo sudo btrfs send /mnt/linoxide_btrfs1/.snapshots/subvol1-day1 | sudo btrfs receive /mnt/linoxide_btrfs2
At subvol /mnt/linoxide_btrfs1/.snapshots/subvol1-day1
At subvol subvol1-day1

驗證數據文件:

$ cd /mnt/linoxide_btrfs2/
$ ls -l
drwxr-xr-x. 1 root root 446 Nov 21 09:25 subvol1-day1
$ cd subvol1-day1/
$ ls -l
-rw-r--r--. 1 root root 16 Nov 21 09:25 adjtime
-rw-r--r--. 1 root root 1529 Nov 21 09:25 aliases
-rw-r--r--. 1 root root 12288 Nov 21 09:25 aliases.db
-rw-------. 1 root root 541 Nov 21 09:25 anacrontab
-rw-r--r--. 1 root root 55 Nov 21 09:25 asound.conf
-rw-r--r--. 1 root root 2853 Nov 21 09:25 bashrc
-rw-r--r--. 1 root root 112 Nov 21 09:25 boto.cfg
-rw-r--r--. 1 root root 37 Nov 21 09:25 centos-release
-rw-r--r--. 1 root root 51 Nov 21 09:25 centos-release-upstream
-rw-r--r--. 1 root root 1053 Nov 21 09:25 chrony.conf

現在,你有一個 完整備份 也可以用作DR。

增量備份

快照還可以增量方式發送備份。 當某個目錄被重命名時,Rsync 會刪除該目錄並再次傳輸所有數據,而 BTRFs 只是傳輸一些字節的元數據。

讓我們再拍一張。

$ sudo btrfs subvolume snapshot -r /mnt/linoxide_btrfs1/subvol1 /mnt/linoxide_btrfs1/.snapshots/subvol1-day2

使用 -p 您需要指定基本快照的標誌,並且此快照必須存在於源和目標中。 以下命令將兩個基本快照之間的差異發送到目標。

$ sudo btrfs send -p /mnt/linoxide_btrfs1/.snapshots/subvol1-day1 /mnt/linoxide_btrfs1/.snapshots/subvol1-day2 | sudo btrfs receive /mnt/linoxide_btrfs2

如何恢復 Btrfs 快照

在本節中,我將解釋如何從之前拍攝的快照中恢復數據。 讓我們假設文件被錯誤刪除的場景。 您可以將其取回上次快照,甚至可以從較舊的快照中恢復文件的較舊版本。

你可以簡單地使用 cp 命令來恢復被刪除的文件:

$ sudo cp /mnt/linoxide_btrfs1/.snapshots/subvol1-day1/chrony.conf /mnt/linoxide_btrfs1/subvol1

假設您刪除了整個子卷,即使在這種情況下,使用 cp 命令,您也可以從快照中恢復整個內容:

$ sudo cp -r /mnt/linoxide_btrfs1/.snapshots/subvol1-day1 /mnt/linoxide_btrfs1/subvol1

或者您可以使用 btrfs 快照命令恢復子卷:

$ sudo btrfs subvolume snapshot /mnt/linoxide_btrfs1/.snapshots/subvol1-day1 /mnt/linoxide_btrfs1/subvol1

快照清理

當您使用 btrfs 快照進行定期增量備份時,您可能會堆積很多。 這會造成混亂並佔用大量磁盤空間。 您還可以使用快照刪除清除舊的不需要的快照。 清除時請記住,為了執行增量發送,您需要最後一個快照。

$ sudo btrfs subvolume delete /mnt/linoxide_btrfs1/.snapshots/subvol1-day1

結論

Btrfs 已經快速成熟。 今天,它具有廣泛的功能,如壓縮、快照、數據完整性和性能,使其成為生產就緒的文件系統。 我希望這篇文章對使用 BTRFS 的快照有所幫助。 在評論部分讓我知道你的看法。