问题描述
我的 /home 分区由整个物理磁盘组成。它被格式化为 btrfs。我想截图。我对子卷命名感到困惑,特别是。
我知道有类似的问题,但每个类似的问题似乎都在问与我所问的不同的问题(而且它们更旧,这意味着考虑到 btrfs 的快速发展,这意味着可能已经过时了)。例如,this question 的答案显然不是我问题的答案,因为我的 /home 分区是一个单独的卷,而 btrfs 的手册页显示了现在用于创建快照的不同命令。
another similar problem, no solid solution。 someone else as confused as me on the naming issues
我的问题:
从简单开始:这是对我的主分区进行简单快照的正确命令吗?
btrfs subvolume snapshot /home/@home /home/@home_snapshot_20120421
我真的很勇敢并对其进行了测试,但它不起作用。错误是 error accessing /home/@home
。如下图,列出了@home。
我显然对子卷名称感到困惑。我需要在创建快照时使用它们吗?一些示例显示使用 /home
作为源参数拍摄家庭快照,但基于根卷的示例,在我看来,我需要使用 /home/@home
。
这个命令能用吗?如果不是,为什么?
btrfs subvolume snapshot /home /home/@home_snapshot_20120421
@
只是一个命名约定吗?有意义吗?
以下是一些可能相关的输出:
btrfs subvolume list /home
ID 256 top level 5 path @home
我不确定这到底是什么意思。当我尝试 btrfs device scan
时,它给出了一个错误(例如,无法扫描设备 /dev/sda1)。我的文件系统没有任何错误。一切顺利。
这是我的分区。在回复一个回复时,没有 /home 不是我唯一的 btrfs 分区。
/dev/sda1: (boot partition) TYPE="ext2"
/dev/sda2: (root partition) TYPE="btrfs"
/dev/sdb1: (home partition) TYPE="btrfs"
/dev/sdc1: (shared partition) TYPE="btrfs"
/dev/sdc2: TYPE="swap"
最佳方案
在 Ubuntu 12.04 上创建我的主分区快照的正确命令是什么?
鉴于 home 位于 btrfs 分区上并且它被挂载为 /home,正确的命令是:
sudo btrfs subvolume snapshot /home/ /home/<any_name_you_choose_for_the_snapshot>
这是我的结果:
在今天运行命令之前:
$ btrfs subvolume list /home
ID 256 top level 5 path @home
ID 257 top level 5 path @home/@snapshot_20120521_1936
命令:
$ sudo btrfs subvolume snapshot /home/ /home/@snapshot_20120611_1307
Create a snapshot of '/home/' in '/home/@snapshot_20120611_1307'
今天运行命令后:
$ btrfs subvolume list /home
ID 256 top level 5 path @home
ID 257 top level 5 path @home/@snapshot_20120521_1936
ID 258 top level 5 path @home/@snapshot_20120611_1307
此方法的唯一问题是当您 ls (list) /home 时会显示快照。
Ubuntu 社区 Wiki 已更新为解决方案。这里是:
如何在 Ubuntu 的布局中使用快照
为了在 Ubuntu 布局中使用 /或 /home 的快照,将 btrfs 文件系统安装在单独的位置非常方便,并且从 btrfs 树的顶部工作,而不是从安装的子卷。 <– 这就是解决方案。不幸的是,这并不方便。
sudo mount /dev/sdX# /mnt
要创建快照,请使用我在上面使用的相同语法:
sudo btrfs subvolume snapshot /mnt/@ /mnt/@_snapshot
这将创建名为@_snapshot 的@subvolume 的快照,该快照也位于 btrfs 树的顶部。由于它位于树的顶部,因此在列出已安装卷中的文件时不会显示它。
要回滚到快照,您只需将其名称更改为 ubuntu 挂载并重新启动的名称。更改名称的方法如下:
sudo mv /mnt/@ /mnt/@_badroot
sudo mv /mnt/@_snapshot /mnt/@
要删除快照,请使用:
sudo btrfs subvolume delete /mnt/@_badroot
btrfs 快照本身就是子卷,而 self-contained,像这样删除旧的 @ 子卷就可以了,只要我们有替代品。
注意: btrfs-tools 命令 set-default
会破坏 Ubuntu 的布局。
次佳方案
首先确定:
-
您正在查看的子卷的名称是
@home
,如btrfs subvolume list /home
所示。它安装在/home
中。 @home 是子卷的名称,它的 ID 也是 256,所以很可能只有你的 /home 被格式化为 btrfs。 -
现在要创建@home 的快照,您必须发出:
sudo btrfs subvolume snapshot /home/ /home/@home_snapshot_20120421
-
子卷可以有任何名称。 @ 是 Ubuntu 在安装时的约定。 (如果您使用
apt-btrfs-snapshot
,则根子卷必须命名为@
顺便说一句。)community wiki 强烈建议将@
保留为根目录,将@home
保留为 home,因为它以这种方式安装。如果您想回滚,这一点尤其重要:您不应该使用 btrfs 子卷 set-default(不是有意强调的语法)。 -
对于
btrfs device scan
你必须使用sudo
。 -
要删除子卷,您可以使用
sudo btrfs subvolume delete @home_snapshot_20120421
所有 btrfs 命令都可以缩写,只要它们是明确的,例如 sudo btrfs device scan
可以被截断为 sudo btrfs d s
、 sudo btrfs dev sc
或两者之间的任何内容。
我希望回答了你的问题。有一些工具可以进行定期备份,btrfs-snapshot-rotation 就是一个例子。谨慎使用它们,因为它们都不是真正成熟的或获得足够的牵引力,即它们很可能包含错误。
第三种方案
安装 apt-btrfs-snapshot
包,并使用其子命令 list
、 snapshot
、 delete
和 set-default
。
这是一个包装较低级别 btrfs
命令的脚本。它的工作原理是首先将 btrfs 根文件系统挂载到某处。我的意思是真正的根,而不是通常安装为 /
的 /@
子卷。换句话说,您需要运行 mount /dev/sda1 /mnt
以便您可以查看将列为 /mnt/@
、 /mnt/@home
以及您创建的任何其他子卷的子卷。从那里你可以 btrfs subvolume snapshot /mnt/@home @snapshot-today
,这将创建 /@home
的快照,名为 /@snapshot-today
。将此与运行 btrfs subvolume snapshot /home /home/@snapshot_today
进行比较,后者将快照创建为 /@home
的子项,因此它会在您 ls /home
时显示,其真实名称为 /@home/@snapshot-today
。
回滚快照只是一个简单的重命名操作: mv /mnt/@home @backup ; mv /mnt/@snapshot-today @home
。下次启动时,当它在 /home
中挂载 /@home
时,它会找到快照。
绕开你的头有点棘手,因为你必须记住 btrfs 如何看待事物与内核如何看待事物之间的区别,这受到挂载选项(特别是 subvol= 参数)的影响。