BTRFS
BTRFS
BTRFS是一个现代的COW(Copy On Write)Linux文件系统,旨在提供现代文件系统提供的高级功能的同时保持高效、高容错和易管理特性。
写时复制(Copy On Write)
在非写时复制的文件系统中,覆盖一个已存在的数据会对原始数据块进行覆写。而在一个写时复制的文件系统中,文件会使用元数据标记实际物理块,写入已存在数据时会寻找新的可用物理块写入并更改文件元数据指向新物理块,若原始物理块未被任何文件引用则被标记为空闲块以被重新利用。复制这个词可能比较令人迷惑因为整个过程并没有进行文件复制,而仅仅是更新了文件的元数据,但从结果上来看文件的原始物理数据块并没有抹除,相当于对原始数据进行了一次复制然后对复制数据进行了修改😅。
若我们先前存储了文件的原始物理块引用信息可以随时对文件进行恢复,BTRFS正是利用这个特性实现文件快照的。当你对一个文件进行了快照时,原始文件和快照文件都共享同一份物理块引用,当你对快照文件或原始文件进行修改时都会触发上边提到的写时复制机制,若此时需要对原始文件或快照文件进行复原时,只须使用对方的元数据覆盖更新即可。
写时复制的特性很棒,它很灵活而且磁盘空间利用率也非常高,但它也不是十全十美的。针对虚拟机虚拟磁盘这类又大而且读写十分频繁的文件,写时复制的特性会导致这个文件变得十分碎片化,进而影响文件系统的读写性能。值得注意的是,即使是普通文件的读写也存在文件碎片化问题,因为一个文件会是存储在多个物理数据块中的,当文件发生更改时可能仅更新的是文件的部分数据块引用。值得庆幸的是,BTRFS提供了对文件关闭写时复制的方法,但关闭写时复制特性同时也意味着放弃文件快照功能。
BTRFS子卷(Subvolume)
BTRFS子卷(Subvolume)是一个可挂载的POSIX文件树或POSIX文件命名空间,它属于文件系统层级不属于块设备层级。传统Linux文件系统仅包含一个POSIX文件树,在Linux启动时被挂载到根目录也就是我们熟悉的"/“目录,而BTRFS可以创建多个subvolume
子卷,即多个POSIX文件树。当对一个分区进行BTRFS文件系统格式化后,分区默认有一个根或顶层subvolume
,ID编号为5,该subvolume
不能修改和删除,subvolume
内部支持嵌套创建subvolume
。以下展示根subvolume
下的所有subvolume
:
按照惯例将根目录和用户目录存储于@和@home两个不同的subvolume
以实现隔离快照,将系统安装在BTRFS subvolume
上可以实现秒级文件系统级别系统回滚。《秒级文件系统级别系统回滚》这几个字的含金量不必我多说并且支持系统从快照中启动,系统安全问题?不存在的。Linux在启动时会使用类似以下方式挂载subvolume
到根目录和用户目录:
配合timeshift
可以实现系统自动备份,在grub中选择挂载到”/“和”/home"的subvolume
(即上述挂载命令中的subvol=部分),可实现快照启动。
BTRFS命令行操作
将Linux安装在BTRFS上
请在Linux系统上操作,为了保险起见我们使用虚拟硬盘来进行操作。
fallocate
生成一个空文件,磁盘配额并不会减少。gdisk
对虚拟磁盘进行分区。w
命令则磁盘是安全的,不会进行任何更改)。losetup
绑定虚拟硬盘到环回设备-fP
参数自动选择一个未被使用的环回设备。不出意外的话,通过gdisk
或lsblk
可看到虚拟硬盘内部的分区。~/mnt
完成对应Linux发行版的初始化。针对ArchLinux用户,可以使用arch-install-scripts
初始化根目录,并使用arch-chroot ~/mnt
进入新系统的终端。