mergerfs 是什么:
我们有很多中方式管理并使用硬盘,如下面几种:
- raid,其中细分的有 RAID 0、RAID 1、RAID 5、RAID 6、RAID 7、RAID 01、RAID 10、RAID 50、RAID 60
- lvm
- Btrfs
- zfs
- JBOD
等等,他们之间每一个的特点这里不细讲,他们各有优劣,也并不是完全互斥的关系,有些可以组合使用,总之应该都耳熟能详的。这里将补充另外一种稍微少见的、特别的文件系统 mergerfs。
mergerfs 的官方介绍如下:
mergerfs 是一个联合文件系统,旨在简化跨众多品类存储设备的文件存储和管理。
假设这样一种场景:
你有几块不同品牌的硬盘,容量不一,且文件系统有 ntfs, xfs, ext4 等几种,里面都有一个 videos 文件夹,里面有你存放的视频/照片。现在想装在服务器内,提供一个统一的入口访问这些散落在各个硬盘上的文件。以上面所说的几种组织数据的方式来说(raid, lvm, zfs...),倒腾数据,重新建立文件系统是避免不了的。那有没有更简单的方法呢?mergerfs 可以做到,其效果如下, A 文件系统内的 /disk1 和 B 文件系统内的 /disk2 通过一种方式挂载到一个新的目录 /merged:
A + B = C
/disk1 /disk2 /merged
| | |
+-- /dir1 +-- /dir1 +-- /dir1
| | | | | |
| +-- file1 | +-- file2 | +-- file1
| | +-- file3 | +-- file2
+-- /dir2 | | +-- file3
| | +-- /dir3 |
| +-- file4 | +-- /dir2
| +-- file5 | |
+-- file6 | +-- file4
|
+-- /dir3
| |
| +-- file5
|
+-- file6
此方式无视了文件系统种类,已经硬盘大小,建立了一个新的“存储池”,访问这个存储池能读写各个硬盘上的文件系统,且建立过程中对数据无任何变动。
相对于 LVM/ZFS/BTRFS/RAID0 驱动器串联/条带化 的优势是:
对于简单的 JBOD/驱动器串联/剥离/RAID0,单个驱动器故障将导致整个池故障。 mergefs 执行类似的功能,并且不会出现灾难性故障和恢复困难。 驱动器可能会出现故障,但是所有其他数据将继续可访问。
相对于 ZFS 的优势则是:
mergefs 与 ZFS 并非替代关系。 mergefs 旨在提供任意文件系统(本地或远程)、任意大小和任意文件系统的灵活池化。 对于一次写入,可以读取许多用例,例如大容量媒体存储。 通过其他方式管理数据完整性和备份。 在这种情况下,ZFS 可能会引入许多成本和限制(ecc 内存&高容量内存等)
但也有明显的缺点:
性能不够好,像数据库,虚拟机的虚拟硬盘不适合存放在 mergerfs 挂载的目录上,这可能与其基于 FUSE 实现而非在内核实现有关系。
下面讲一下安装使用方式:
如果不确定自己的使用场景,下面两个 mount 选项任选一种就行
需要 mmap
( rtorrent 和很多基于 sqlite3 的应用需要用到)
cache.files=partial,dropcacheonclose=true,category.create=mfs
You don't need mmap
cache.files=off,dropcacheonclose=true,category.create=mfs
mergerfs -o cache.files=partial,dropcacheonclose=true,category.create=mfs /mnt/hdd0:/mnt/hdd1 /media
/mnt/hdd0:/mnt/hdd1 /media fuse.mergerfs cache.files=partial,dropcacheonclose=true,category.create=mfs 0 0
[Unit]
Description=mergerfs service
[Service]
Type=simple
KillMode=none
ExecStart=/usr/bin/mergerfs \
-f \
-o cache.files=partial \
-o dropcacheonclose=true \
-o category.create=mfs \
/mnt/hdd0:/mnt/hdd1 \
/media
ExecStop=/bin/fusermount -uz /media
Restart=on-failure
[Install]
WantedBy=default.target
podman volume create --opt device=/path1:/path2 --opt type=fuse.mergerfs --opt o=cache.files=partial,dropcacheonclose=true,category.create=mfs
merged_volume_name