FreeBSD使用Linux XFS文件系统

xfsprogs

第三方在FreeBSD上移植了 xfsprogs Utilities for managing XFS filesystems

  • 安装 xfsprogs :

安装 xfsprogs
pkg install xfsprogs
  • 格式化XFS文件系统:

格式化XFS文件系统
mkfs.xfs /dev/diskid/DISK-Y39B70RTK7ASp6

输出信息:

格式化XFS文件系统
meta-data=/dev/diskid/DISK-Y39B70RTK7ASp6 isize=512    agcount=4, agsize=16777216 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1
data     =                       bsize=4096   blocks=67108864, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=32768, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

挂载XFS

很不幸,FreeBSD内核已经移除了XFS支持,所以不能直接挂载,需要通过 FUSE 来实现XFS挂载

  • 安装 fusefs-lkl :

安装 fusefs-lkl
pkg install fusefs-lkl
  • 加载 fusefs 内核模块

加载 fusefs 内核模块
kldload fusefs

# 要在启动时加载fuse内核模块
echo 'fusefs_load="YES"' >> /boot/loader.conf
# 或者设置 rc.conf
# 注意: 如果需要在启动时使用fusefs,则应该使用 /boot/loader.conf
sysrc kld_list="fusefs"
  • 挂载磁盘分区:

使用 lklfuse 挂载XFS文件系统
lklfuse -o type=xfs,allow_other,uid=501,gid=501 /dev/diskid/DISK-Y39B70RTK7ASp6 /lfs

需要注意:

  • 由于是 fuse 方式挂载目录,所以需要指定 uid,gid ,例如这里指定 admin 用户的 uid (501) 和 gid (501),这样所有存放到该目录下的用户的属主都会自动映射为 admin 用户属主,就能以该用户来访问该目录读写

  • 这里通过 root 用户执行挂载命令时,由于是将目录指定给 admin 用户使用,必须使用 allow_other 参数,否则即使挂载后该 /lfs 目录属主是 admin 用户,该 admin 用户也无法进入目录,会提示错误 cd: /lfs: Operation not permitted

但是如果以 admin 用户去执行 lklfuse 命令来挂载磁盘分区,会提示对磁盘分区没有操作权限:

/dev/diskid/DISK-Y39B70RTK7ASp6: Permission denied

检查 /dev/diskid/DISK-Y39B70RTK7ASp6 设备的属主是 root operator ,我尝试将 admin 用户假如到 operator 组,但是发现仅仅绕过了 /dev/diskid/DISK-Y39B70RTK7ASp6 权限限制,但是依然无法将 /dev/fuse 设备绑定 /lfs 目录:

$ mount_fusefs: /dev/fuse on /lfs: Operation not permitted

最终验证发现,采用 root 身份来挂载,在使用了 uid=501,gid=501 同时配套使用 allow_other 选项,就能够正确挂载目录,并且让 admin 用户访问和读写

备注

我这里有一个乌龙,我忘记执行 mkfs.xfs 格式化XFS文件系统,而直接使用了上述 lklfuse 来挂载一个EXT4文件系统作为XFS来挂载。结果导致该挂载目录hang死了,连 df 都出不来

  • 配置 /etc/fstab 没有找到如何在/etc/fstab中配置xfs以fuse方式挂载的方法

异常挂起

我在配置了 在Linux Jail中使用XFS文件系统 之后发现一个奇怪的现象,一旦执行fuse挂载

使用 lklfuse 挂载XFS文件系统
lklfuse -o type=xfs,allow_other,uid=501,gid=501 /dev/diskid/DISK-Y39B70RTK7ASp6 /lfs

则访问 /lfs 目录会导致出现进程D住(所以也无法执行 df ),这让我非常困扰,所以我放弃了FUSE方式来使用Linux文件系统,而采用比较成熟的FreeBSD内核级别 FreeBSD使用Linux EXT4文件系统

下一步

我的目标是

参考