我们正在考虑构建一个约 16TB 的存储服务器。目前,我们正在考虑将 ZFS 和 XFS 作为文件系统。有什么优点、缺点?我们需要寻找什么?还有第三种更好的选择吗?
我在 zpool 中有几 TB 的非常有价值的个人数据,由于数据损坏,我无法访问这些数据。该池最初是在 2009 年左右在 FreeBSD 7.2 系统上建立的,该系统在 Ubuntu 8.04 系统之上的 VMWare 虚拟机内运行。FreeBSD VM 仍然可用并且运行良好,只有主机操作系统现在已更改为 Debian 6。通过 VMWare 通用 SCSI 设备,来宾 VM 可以访问硬盘驱动器,总共 12 个。
有2个游泳池:
有效的那个是空的,破碎的保存着所有重要的数据:
[user@host~]$ uname -a
FreeBSD host.domain 7.2-RELEASE FreeBSD 7.2-RELEASE #0: \
Fri May 1 07:18:07 UTC 2009 \
root@driscoll.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
[user@host ~]$ dmesg | grep ZFS
WARNING: ZFS is considered to be an experimental feature in FreeBSD.
ZFS filesystem version 6
ZFS storage pool version 6 …
Run Code Online (Sandbox Code Playgroud) 我试图将主目录的层次结构暴露给许多 FreeBSD 监狱。主目录的配置使得每个目录都是唯一的 ZFS 数据集。监狱用于开发工作,因此会定期创建和销毁。
我的第一个想法是简单地使用nullfs挂载/home
到 jail,但nullfs不提供任何访问从属文件系统的方法。
我的第二个想法是通过 NFS 导出目录,然后在每个 jail 中运行自动挂载程序守护程序 (amd)。如果可以在监狱内执行 NFS 挂载,这将是有效的。但事实并非如此。
我的第三个想法是在主机上运行 amd 并将nullfs挂载到监狱中……但是 amd 对nullfs 的支持不存在。
我的第四个想法是回到使用 NFS 导出目录,因为 amd 当然可以与 NFS 一起使用,对吗?不幸的是,amd 不是在目标挂载点上挂载目录,而是喜欢在临时位置 ( /.amd_mnt/...
)挂载东西,然后创建符号链接……当然,这在 jail 环境中是无用的。
那么也许您可以使用nullfs将 的子目录暴露/.amd_mnt
给监狱?不!这让我们回到了我的第一次尝试,我们发现无法使用nullfs访问从属文件系统。
然后我的头爆炸了。
我正在尝试做的事情有没有好的解决方案?一个糟糕的解决方案是在启动 jail 之后运行一个脚本,该脚本将为每个主目录创建多个nullfs挂载点,但这非常笨拙——它需要定期运行以考虑新目录或删除的目录。所以基本上我将不得不编写一个糟糕的自动挂载程序。
一定会有更好的办法。帮助我,Serverfault,你是我唯一的希望!
更新 1:我突然想到我可以用 解决部分问题pam_mount
,尽管这充其量是不完整的。此外,文档中不清楚是否pam_mount
可以自动创建目标挂载点。如果它需要先验存在挂载点,那么这个解决方案不会比我已经提出的坏自动挂载器更好。
更新 2:如下面的答案中所讨论的,VFCF_JAIL
NFS 文件系统上的设置确实允许 jails 执行 NFS 挂载。不幸的是,自动挂载程序继续无用的行为,并且当在监狱中运行时,它似乎非常擅长以这样的方式陷入困境,以至于需要重新启动系统才能删除进程条目。
在我在网上看到的几乎每个 ZFS 使用示例(包括这里的几个问题)中,zpool 都被命名为“tank”。为什么?这个名字是否有某种意义,或者只是原始文档使用了“tank”,所以其他人也使用“tank”?如果您在一个系统上有多个 zpool,将其中一个命名为“tank”是很常见的,还是“tank”只是单池系统的约定?
我的用例:我在 M.2 SSD 上安装了 Ubuntu Server 18.04。我有一个 4TB 硬盘,我想添加为存储。由于它主要用于大型媒体文件和备份,因此不会经常写入。
您认为哪种文件系统最适合此用例?
我的主要候选者是 Ext3/4、XFS、Btrfs 和 ZFS(随意争论另一个)。
我不是在问“什么是最好的文件系统?”——没有“最好的”这样的东西。 我只是问人们哪个文件系统可能最适合这个用例。请尝试包括:
谢谢你的建议。
我目前每晚和每周都对我的基于 ZFS 的 NAS 进行快照,这个过程已经救了我好几次了。然而,虽然快照的创建是自动的(来自 cron),但删除旧快照仍然是一项手动任务。显然,如果我被公共汽车撞到,或者没有执行手动任务,NAS 的磁盘空间就会耗尽。
有没有人有任何好的方法/脚本来管理存储在其 ZFS 系统上的快照数量?理想情况下,我想要一个脚本来遍历给定 ZFS 文件系统的所有快照,并删除该文件系统的最后n 个快照以外的所有快照。
例如,我有两个文件系统,一个tank
称为sastank
. 快照以它们的创建日期命名:sastank@AutoD-2011-12-13
因此一个简单的sort
命令应该按顺序列出它们。我希望将过去 2 周的每日快照保持在 上tank
,但仅将过去两天的快照保持在 上sastank
。
我写了一个错误的程序,它在 /tmp 下意外创建了大约 30M 的文件。(这个错误是几周前引入的,它每秒创建几个子目录。)我可以将 /tmp 重命名为 /tmp2,现在我需要删除这些文件。系统是 FreeBSD 10,根文件系统是 zfs。
与此同时,镜像中的一个驱动器出现问题,我已经更换了它。该驱动器有两个 120GB SSD 磁盘。
问题是:更换硬盘驱动器和重新同步整个阵列用了不到一个小时。删除文件 /tmp2 是另一回事。我写了另一个程序来删除文件,它每秒只能删除 30-70 个子目录。删除所有文件需要 2-4 天。
重新同步整个阵列需要一个小时,而从磁盘中删除需要 4 天,这怎么可能?为什么我的表现这么差?70 次删除/秒似乎非常非常糟糕的性能。
我可以手动删除 /tmp2 的 inode,但这不会释放空间,对吗?
这可能是 zfs 或硬盘驱动器的问题还是什么?
一位朋友正在和我谈论位腐烂的问题 - 驱动器上的位随机翻转,破坏数据。非常罕见,但如果有足够的时间,它可能会成为一个问题,并且不可能被发现。
驱动器不会认为它是坏扇区,备份只会认为文件已更改。不涉及校验和来验证完整性。即使在 RAID 设置中,也会检测到差异,但无法知道哪个镜像副本是正确的。
这是一个真正的问题吗?如果是这样,可以做些什么呢?我的朋友推荐 zfs 作为解决方案,但我无法想象在工作中扁平化我们的文件服务器,安装 Solaris 和 zfs ..
据我所知,LVM 可以拍摄卷的快照。还有许多支持快照的文件系统(ZFS、Btrfs、reiserfs 等)。
但是,我一直不明白 LVM 快照和文件系统快照之间的区别。如果可以使用 LVM 拍摄快照,为什么有人要花时间在文件系统中实现它?
编辑:在某些情况下,他们中的任何一个是首选吗?为什么?
zfs ×10
freebsd ×3
btrfs ×2
hard-drive ×2
raid ×2
snapshot ×2
storage ×2
xfs ×2
automount ×1
ext4 ×1
filesystems ×1
jail ×1
lvm ×1
performance ×1
solaris ×1