我安装了带有 ZFS-on-root 的 antergos Linux。系统已启动并运行,我很高兴,因为仅凭这一点对我来说就已经很成功了。现在,ZFS 显然主要用于 NAS、RAID、服务器配置等(我完全明白并理解为什么),但我仍然想在我的桌面上尝试它,因为它在稳定性(在断电方面更是如此 [我住的地方最担心的问题])、性能和处理方面据称优于 BTRFS。
现在,我对 BTRFS 中的 COW 和快照完全不熟悉,但我认为它们根本不容易理解,即使在 ZFS 的情况下只有两个命令需要掌握。
我的机器里有:
A三星 850 Evo 250GB由 antergos 配置的带有 ZFS 的 SSD
# lsblk
NAME MOUNTPOINT
sda
├─sda1 /boot/efi
├─sda2 /boot
└─sda3
# zfs list
NAME MOUNTPOINT
antergos_6g9t /
antergos_6g9t/swap
AWDC WD30EZRX 3TB自己配置的硬盘
# lsblk
NAME FSTYPE MOUNTPOINT
sdb
├─sdb1 vfat
├─sdb2 ext4 /run/media/username/masstorage
├─sdb3 ext4 /home
└─sdb4 ext4 /run/media/username/snapshots
我想要实现的目标
如您所见,我设置了更大的驱动器来保存大量数据(工作、电影、音乐等)的分区,一个用于家庭,一个用于快照。sdb1 被认为是可能的 ESP,因为:
- 我想将根 (antergos_6g9t) 的增量快照备份到 sdb4
- 我希望能够从这些快照启动
- 我希望能够将这些快照恢复到 sda,如果我的根目录损坏
问题
- 我需要使用哪些日常命令来完成上述操作?(网络上几乎所有指南都与 NAS 和 RAID 相关或通过 SSH 进行克隆)
- /home 可以与 ZFS 根结合吗?
- 我是否必须将 sdb4 格式化为 ZFS?
- 也许对此有完全不同的方法?(请注意,我想要一个单独的分区用于 /home 和大容量存储,并具有可靠的向后兼容性,这就是我在这里选择 ext4 的原因)
非常感谢任何帮助、评论或建议。
答案1
我需要使用哪些日常命令来完成上述操作?(网络上几乎所有指南都与 NAS 和 RAID 相关或通过 SSH 进行克隆)
通过网络复制和本地复制之间没有什么区别 - 而不是zfs send | ssh zfs recv
您只是拥有zfs send | zfs recv
- 或者您甚至可以以流形式存储备份(没有zfs recv
,并且有一些缺点)并且仅在需要时扩展它。
/home 可以使用 ext4 与 ZFS 根目录结合吗?我是否必须将 sdb4 格式化为 ZFS?
您使用 ext4 分区的目的究竟是什么?您可以这样做,但您将错过快照和用户数据的完整性检查。在我看来,任何系统都可以廉价地恢复,但用户数据丢失将永远丢失。如果必须选择,我会将 ZFS 用于我的用户数据,将 ext4 用于(毫无价值的)系统分区,而不是相反。
也许对此有完全不同的方法?(请注意,我想要一个单独的分区用于 /home 和大容量存储,并具有可靠的向后兼容性,这就是我在这里选择 ext4 的原因)
- 如果您将向后兼容性视为“我想测试 ZFS,然后在不复制数据的情况下返回到 ext4”,那么您将一无所获:您将看不到 ZFS 的好处,并且仍然具有 ext4 的缺点。此外,与使用 ZFS 设置用户数据的简单数据分区相比,在 Linux 上创建可启动的 ZFS 系统(尽管您在本例中已经这样做了)需要做的工作更多。
- 如果您看到“我想使用其他系统访问它”,我建议使用 NFS、SMB、AFP 或 SSH(或同时使用所有这些)。
- 如果这是用于与不支持 ZFS 的系统进行双启动,那么这将是您的布局完全合理的少数星座之一。
- 如果您不相信 ZFS 可以保证数据安全,或者不相信 Linux 版本,请使用 Solaris/illumos/*BSD,或者将备份保存在 ext4 上。这样,您将失去简单的发送/接收备份实用程序,但至少您知道您只备份了好的数据。
从您目前的描述来看,您仍然可以实现所有目标,但按照您所描述的方式,这将是次优的,而且更加困难。
相反,考虑在所有磁盘上使用 ZFS,如果可能的话添加冗余(也可以稍后通过添加镜像磁盘来完成),使用 ZFS 文件系统而不是分区(以分离关注点),并定期在不同的磁盘上备份快照(以防止因缺少 ECC 内存而可能造成的损坏)。
跟进您的评论:
您介意在回答中详细说明这种情况,并提供快照管理的详细信息(如结构)以及如何启动其中一个或将快照还原到根目录吗?我会将整个 3TB 分区为 ZFS,然后从我的 ZFS 操作系统添加数据池和数据集,我想这是用于我的存储、主分区和快照分区。但从那以后我就无能为力了。
是的,基本就是这样。我不知道您的硬件选项,但假设您有您描述的磁盘,我会执行以下操作:
设置和布局
硬件和泳池布局
通常情况下,您会使用 SSD 作为读取缓存,但在桌面上,您会失去 L2ARC 缓存的所有优势(Solaris 11.3 除外,在该缓存中它是持久的并且可以在重启后继续存在)。
因此,您可以将所有内容放在 HDD 上,并将 SSD 用作 SLOG 设备(仅用于同步写入);或者您可以将它们分开,并将系统数据(根池)放在 SSD 上,其余部分放在 HDD 上。
理论上,第一种解决方案可以实现更好的性能,但在台式机上,我怀疑你的系统在线时间是否足够长以注意到这一点。因此,第二种解决方案麻烦较少,你的 SSD 使用寿命更长。
因此,您创建了两个池 - 一个根池(假设其名为rpool
)位于 250 GB 的 SSD 上,另一个数据池(data
)位于 3000 GB 的 HDD 上。两者都是非冗余的,因为它们每个只有 1 个 vdev,但稍后您可以添加额外的 HDD 或 SSD 以使它们成为镜像zpool attach data /dev/<old_disk> /dev/<new_disk>
(因此可以自动更正错误)。这是可选的,但建议这样做(如果您只能添加一个磁盘,请添加数据镜像,因为无论如何您的数据比克隆到的系统更有价值data
)。
您不需要任何额外的分区(除了交换和/或启动分区,但这将在安装时自动完成),因为您的 ZFS 文件系统将填补这个角色。
ZFS 文件系统布局
现在您有两个池 -rpool
已从您的安装中填充(抱歉,我无法在此详细说明,因为 Linux 与 illumos/Solaris 不同) - 您无需在此处更改任何内容。您可以检查zfs mount
文件系统是否已正确安装。
data
另一方面仍然是空的,所以你添加一些文件系统:
# zfs create data/home
# zfs create data/home/alice
# zfs create data/sysbackup
# zfs create data/pictures
...
检查zfs mount
它们是否已正确安装,如果没有,则使用 进行安装zfs mount
(和/或在 fstab 中,这在 Linux 上可能再次有所不同)。如果目录结构类似于文件系统结构(但这不是必需的),我发现会更容易:/home/alice
对应于data/home/alice
。
ACL 和网络共享
现在是考虑权限和共享的一个好时机(因为两者都包含在您未来的快照中,因为它们是特定时间点的快照文件系统的属性)。
您的所有文件和目录都将具有文件 ACL(访问控制列表)。此外,您的所有 Windows 网络共享 (SMB/CIFS) 都将具有共享 ACL。这是一个广泛的话题,但对于桌面系统,您可以保持简单:按照您想要授予权限的方式设置文件 ACL(仅使用允许, 不否定),并将共享权限保留为默认设置(所有人都可以访问)。因此,它们将被忽略,您只需管理一组在本地工作并适用于所有网络共享协议(AFP、SMB、NFS)的权限。
要显示 ACL,请ls -Vd /home/alice
对目录本身及其ls -V /home/alice
内的所有文件使用。根据您的系统,ls
可能是错误版本(GNUls
而不是 Solaris ls
),因此您可能需要完整路径。
要修改 ACL,请使用chmod
(与列表相同),一份好的文档是这里。
如果需要,您还应该在文件系统上设置任何 ZFS 属性(zfs get
和)。zfs set
快照
快照的背景
每个快照只是给定文件系统在创建时保存的原子状态。它就像一台时光机,您可以回到一天或一年前查看它的状态。它们是只读的,因此您无法修改它们(只能完全删除它们),并且它们仅占用自创建以来已更改的块的空间。
这意味着每个快照开始时的大小为(几乎)零字节,并且每个更改、添加或删除的块都会被记录和保留,这意味着快照开始增长(由于 ZFS 的写时复制属性)。
如果您将数据想象成从左到右的一条线(就像时间线一样),那么新块将写入最后一个旧块的右侧。如果在块 5 之后设置快照,最初没有任何变化。然后在右侧添加块 6,但快照仍然只引用了块 0 到 5。如果删除了块 3,则在快照被销毁之前不会回收任何空间,因为它仍然引用块 0 到 5。修改块 4(CoW!)与在写入操作后添加块 6 并移动引用相同 - 但同样,不会释放任何空间,因为快照仍然需要保存原始块 0 到 5。如果我们最终销毁快照,我们将回收块 4 和 5,从而导致出现漏洞(碎片),稍后可能会用其他块填充。
这是块级别,每个文件可以由整个磁盘上的多个块组成。对于文件级别,您可以看到过去某个时间点的文件,好像什么都没有改变。尝试一下快照并添加/编辑/删除简单的文本文件可能会有所帮助,这样您就可以对此有所了解。这个想法很简单,但工作效率很高。
自动快照旋转
IIRC,在 Linux 上你可以使用zfs 自动快照自动执行此操作,或者您可以设置自己的脚本并cron
定期调用(用于创建快照和销毁快照)。
至于好的轮换,这取决于您的使用模式和需求。我会从大量的开始,这样您就可以根据需要减少。删除快照很容易,但事后创建快照是不可能的。如果您的性能下降,请减少间隔。
- 系统数据:用于“rm -rf /”时刻和不需要的/错误的更新,也用于稍后出现的错误
- 每小时一次,保留12
- 每天一次,保留7
- 每月一次,保留12
- 个人数据:用户目录和网络共享,本质上是最有价值的数据
- 每五分钟保留12
- 每小时,保留 24
- 每天保留30
- 每月保留 12
- 每年保留 10
- 废弃数据:用于存储不应传播的私人数据、临时数据以及发生很大变化但在重启后无用的工作数据集
- 没有任何
- Sysbackup:这里不需要快照,因为你已经启用了它们
rpool
,它们只是被复制过来- 没有任何
备份还原
基本上,随着时间的推移,您的快照会累积起来,并在一段时间内提供数据的滑动视图。由于硬件可能会发生故障,因此您需要将这些数据备份到另一个磁盘或系统。如果您使用zfs send
和zfs recv
,您的临时快照和 ACL 和属性将被保留,这意味着备份只是完整递归快照和递归发送/接收的组合,无论目标是什么(可以是另一个磁盘作为扩展文件系统、另一个 ZFS 系统、支持 ZFS 的云存储,甚至是任何其他系统上的 tarball)。
此轮换与常规快照不同,应使用不同的名称,例如使用与日期或递增数字相结合的前缀,例如data@offsitebackup_217
。名称在内部并不重要,但如果您编写脚本,则需要快速找到最新的现有备份(或在其他地方记住名称),因为您需要最后传输的快照与新创建的快照之间的差异:
# full initial send, destroy all filesystems on the destination
# which are not present on the source
zfs snapshot -r data@offsite_backup_1
zfs send -R data@offsite_backup_1 | ssh user@host zfs recv -Fdu data
# incremental send, destroy all filesystems on the destination
# which are not present on the source
zfs snapshot -r data@offsite_backup_2
zfs send -R -I data@offsite_backup_1 data@offsite_backup_2 | ssh user@host zfs recv -Fdu data
zfs destroy data@offsite_backup_1
至于根池,只有一点不同:如果您需要更换磁盘,您必须首先创建启动/交换并像往常一样写入引导加载程序,然后恢复快照,还可以恢复挂载点。我认为beadm
在 Solaris 上基本上也是这样做的。当然,在本地您会忽略这ssh user@host
部分。同样,首先使用少量数据进行测试(需要进行实际测试,该-n
标志在这里不起作用)。
复制数据
现在您可以复制或移动所有数据(通常的方式,例如cp
或rsync
)。