$ touch foo bar baz $ echo"Lorem ipsum dolor sit amet, " > foo
你的目录现在看起来像这样:
1 2 3 4 5 6
$ ls -l total 4 -rw-r--r--. 1 hartan hartan 0 Dec 20 08:11 bar -rw-r--r--. 1 hartan hartan 0 Dec 20 08:11 baz -rw-r--r--. 1 hartan hartan 29 Dec 20 08:11 foo
让我们从这里创建第一次快照:
1 2 3 4
$ cd .. $ sudo btrfs subvolume snapshot demo demo-1 Create a snapshotof'demo'in'./demo-1'
这就好了。让我们看看发生了什么:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
$ ls -l total 0 drwxr-xr-x. 1 hartan hartan 18 Dec 20 08:11 demo drwxr-xr-x. 1 hartan hartan 18 Dec 20 08:11 demo-1 $ tree . ├── demo │ ├── bar │ ├── baz │ └── foo └── demo-1 ├── bar ├── baz └── foo
2 directories, 6 files
这看起来是一份拷贝!为了验证,我们从快照里读取 foo 的内容:
1 2 3 4 5
$ cat demo/foo Lorem ipsum dolor sit amet, $ cat demo-1/foo Lorem ipsum dolor sit amet,
当我们修改原始文件时,真正的效果变得明显:
1 2 3 4 5 6 7
$ echo"consectetur adipiscing elit, " >> demo/foo $ cat demo/foo Lorem ipsum dolor sit amet, consectetur adipiscing elit, $ cat demo-1/foo Lorem ipsum dolor sit amet,
$ echo"sed do eiusmod tempor incididunt" >> demo-1/foo $ cat demo-1/foo Lorem ipsum dolor sit amet, sed do eiusmod tempor incididunt
但是在底层,我们的快照实际上是一个新的 Btrfs 子卷。你可以通过下面的命令来验证这一点:
1 2 3 4
$ sudo btrfs subvolume list -o . ID 259 gen 265 top level256path home/hartan/btrfs-snapshot-test/demo ID 260 gen 264 top level256path home/hartan/btrfs-snapshot-test/demo-1
$ mkdir backup-drive $ sudo mount btrfs_filesystem.img backup-drive $ sudo chown -R $(id -u):$(id -g) backup-drive $ ls -lh total 4.7M drwxr-xr-x. 1 hartan hartan 0 Dec 20 08:35 backup-drive -rw-r--r--. 1 hartan hartan 8.0G Dec 20 08:37 btrfs_filesystem.img drwxr-xr-x. 1 hartan hartan 32 Dec 20 08:14 demo drwxr-xr-x. 1 hartan hartan 18 Dec 20 08:11 demo-1 drwxr-xr-x. 1 hartan hartan 32 Dec 20 08:14 demo-2
$ sudo btrfs send demo | sudo btrfs receive backup-drive/ ERROR: subvolume /home/hartan/btrfs-snapshot-test/demo is not read-only ERROR: empty stream is not considered valid
$ ls backup-drive/ demo-3-ro demo-4-ro $ ls -lR backup-drive/demo-4-ro/ backup-drive/demo-4-ro/: total 524296 -rw-r--r--. 1 hartan hartan 0 Dec 20 08:11 bar -rw-r--r--. 1 hartan hartan 0 Dec 20 08:11 baz -rw-r--r--. 1 hartan hartan 536870945 Dec 21 10:49 bigfile -rw-r--r--. 1 hartan hartan 59 Dec 20 08:13 foo
但你怎样知道增量发送只传输了子卷间的差异呢?让我们传输数据流到一个文件里然后看看它有多大:
1 2 3 4 5
$ sudo btrfs send -f demo-4-ro-diff.btrfs -p demo-3-ro demo-4-ro At subvol demo-4-ro $ ls -l demo-4-ro-diff.btrfs -rw-------. 1 root root 315 Dec 2110:55demo-4-ro-diff.btrfs
根据 ls ,这个文件仅仅只有 315 字节大小!这意味着增量传输只传输子卷间的差异,和额外的 Btrfs 相关的元数据。
从快照中恢复子卷
在继续之前,让我们清理掉这时候不再需要的东西:
1 2 3 4 5 6 7 8
$ sudo rm -rf demo-4-ro-diff.btrfs demo-3-ro-subvolume.btrfs $ sudo btrfs subvolume deletedemo-1demo-2demo-3-ro demo-4-ro $ ls -l total 531516 drwxr-xr-x. 1 hartan hartan 36 Dec 2110:50 backup-drive -rw-r--r--. 1 hartan hartan 8589934592 Dec 2110:51 btrfs_filesystem.img drwxr-xr-x. 1 hartan hartan 32 Dec 2008:14demo
$ sudo btrfs subvolume snapshot demo-4-ro demo Create a snapshot of 'demo-4-ro' in './demo' $ ls backup-drive btrfs_filesystem.img demodemo-4-ro demo-broken