![单个驱动器上的 btrfs 子卷策略](https://linux22.com/image/1181518/%E5%8D%95%E4%B8%AA%E9%A9%B1%E5%8A%A8%E5%99%A8%E4%B8%8A%E7%9A%84%20btrfs%20%E5%AD%90%E5%8D%B7%E7%AD%96%E7%95%A5.png)
我刚刚在单个 SSD 驱动器上安装了 Ubuntu 21.04(这是我第一次安装),在 EFI 之外还有一个 BTRFS 格式的分区。过去运行 Windows 时,我通常会将驱动器划分为一个系统分区,操作系统和程序将存放在该分区中,然后是数据分区,数据将存放在该分区中。这样,操作系统的重新安装就不会影响我的数据,而且我可以为两者制定不同的备份策略。
据我所知,使用 ext4 的 Linux 用户经常会做同样的事情,将 /home 放在单独的分区上。但是,我认为 btrfs 提供了一种更好的方法,即使用子卷。如果我有子卷,那么我就不必担心调整分区大小——它们都共享单个驱动器的全部空间。
当我安装 Ubuntu 并选择 btrfs 格式时,它为我创建了“@”和“@/home”子卷,并安装在 / 和 /home 上。
这引出了我的问题:
如果我重新安装操作系统,“@/home”中的任何内容都不会被删除,这是真的吗?
我应该在哪里(以及如何)创建其他子卷,这些子卷也以这种方式受到保护,以免被重新安装?例如,假设我想创建一个名为“sdata”的子卷(它将有自己的文件夹结构)。在哪里/如何创建它,以保证它的安全?
如果我这样做,
sudo btrfs subvolume create sdata
它将在“@/home/username/sdata”中创建一个子文件夹如果我这样做,
sudo btrfs subvolume create /mnt/@sdata
它将在 mnt/@sdata 中创建一个子文件夹。如果我这样做,
sudo btrfs subvolume create /sdata
它将在 ?? 中创建一个子文件夹
我想我的问题与在单驱动器系统上使用 btrfs 的“最佳”实践有关。我喜欢将我的数据与操作系统隔离开来,并为它们甚至我的数据的不同子集采用不同的备份/快照策略。
答案1
假设您想要在与 root 和 home 相同的位置创建子卷:
将驱动器临时安装到某个新文件夹
sudo mkdir /my_disk sudo mount /dev/sda1 /my_disk # sda1 will need to be your partition name sudo ls -la /my_disk # you should see your subvolumes now
现在您可以在已安装的磁盘内创建新的子卷
sudo btrfs subvolume create /my_disk/sdata sudo ls -la /my_disk # you should see sdata here now
启动时挂载 sdata 需要编辑 /etc/fstab 文件
blkid # use this to get the needed UUID for your disk sudo nano /etc/fstab
添加有关磁盘、挂载点和标签的必要信息。下面是将 sdata 挂载到根目录的示例,其中还包含了用于挂载 btrfs 的选项。
# /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> UUID=???? /sdata btrfs defaults,subvol=sdata,ssd,noatime,space_cache,commit=120,compress=zstd 0 0
我从Willi Mutschler 的 btrfs + luks 安装指南其中有许多不同操作系统的安装步骤。这些指南中的一个建议是将根子卷重命名为“@”,以便应用程序时间移位工作正常。
尽管如此,我的回答并没有涵盖重新安装相同或新操作系统的过程,以及如何使用 btrfs 子卷来处理。我自己也不确定。无论如何,我希望这能有所帮助。