# 23.2 Linux 文件系统

跨平台文件系统兼容性是异构计算环境中的重要技术挑战。FreeBSD 通过 FUSE（Filesystem in Userspace，用户空间文件系统）框架，实现了对 Linux 原生文件系统（如 EXT 系列、Btrfs、XFS 等）的访问支持。FUSE 允许在用户空间实现文件系统，无需修改内核代码，为跨平台文件系统访问提供了灵活的解决方案。本节系统阐述这些文件系统在 FreeBSD 上的挂载方法与技术要点，包括安装、配置和故障排除。

为便于演示挂载操作，本节预设一个包含多种 Linux 文件系统分区的示例环境，用于验证各挂载方法的正确性。

```sh
# gpart show -p nda1        # 显示设备 nda1 的分区信息
=>      34  41942973    nda1  GPT  (20G)
        34      2014          - free -  (1.0M)
      2048   1339392  nda1p5  linux-data  (654M) # ext2
   1341440  19630080  nda1p1  linux-data  (9.4G) # ext4
  20971520   8388608  nda1p2  linux-data  (4.0G) # btrfs
  29360128   4194304  nda1p3  ms-basic-data  (2.0G) # fat32
  33554432   8386560  nda1p4  linux-data  (4.0G) # xfs
  41940992      2015          - free -  (1.0M)
```

`-p` 参数用于显示完整设备路径。示例分区中预先配置了一些文件和目录，用于后续验证挂载操作的正确性。

目录结构如下：

```sh
/
├── usr
│   └── ports
│       └── filesystems
│           ├── ext2                  # fusefs-ext2 Ports 目录
│           └── lkl                   # fusefs-lkl Ports 目录
├── home
│   └── ykla
│       ├── test                      # EXT2/3/4 挂载点
│       ├── btrfs                     # Btrfs 挂载点
│       └── xfs                        # XFS 挂载点
└── etc
    └── fstab                          # 持久化挂载配置文件
```

## EXT 系列文件系统

fusefs-ext2 是一个基于 FUSE 的文件系统实现，尽管名称为 ext2，但该模块通过兼容 ext3/ext4 的磁盘格式，同样支持对 ext3 和 ext4 文件系统的访问。

### 安装 fusefs-ext2

fusefs-ext2 可以通过两种方式安装：

* 使用 pkg 包管理器进行二进制安装：

```sh
# pkg install fusefs-ext2
```

* 或通过 Ports 系统进行源代码编译安装：

```sh
# cd /usr/ports/filesystems/ext2/ 
# make install clean
```

### 加载内核模块

首先，确保加载 FUSE 内核模块，它为所有基于 FUSE 的文件系统提供底层支持。将 ext2fs 和 fusefs 内核模块添加至开机加载列表：

```sh
# sysrc kld_list+="fusefs"
# sysrc kld_list+="ext2fs"
```

### 测试挂载 Ext 分区

* 创建挂载目录 `/home/ykla/test`：

```sh
$ mkdir -p /home/ykla/test # 创建示例挂载目录，请根据实际路径调整，下同
```

* 将 `nda1p1` 分区挂载至 `/home/ykla/test`：

```sh
# fuse-ext2 /dev/nda1p1 /home/ykla/test # 挂载分区，默认只读
Mounting /dev/nda1p1 Read-Only.
Use 'force' or 'rw+' options to enable Read-Write mode
# ls /home/ykla/test/ # 列出挂载目录内容
lost+found	test		test.pdf
```

fusefs-ext2 默认以只读模式挂载，这是为了防止写入操作可能导致的文件系统损坏风险。

* 将 `nda1p1` 分区以读写模式挂载至 `/home/ykla/test`：

```sh
# fuse-ext2 -o rw+ /dev/nda1p1 /home/ykla/test # 挂载磁盘分区为可写
# ls /home/ykla/test/ # 查看挂载目录内容
lost+found	test		test.pdf
# cd /home/ykla/test/ # 切换到挂载路径
root@ykla:/home/ykla/test # touch my.txt # 创建测试文件以验证写入操作
root@ykla:/home/ykla/test # ls # 列出挂载目录内容
lost+found	my.txt		test		test.pdf
```

## Btrfs、XFS 和 Ext4 文件系统

fusefs-lkl 是基于 Linux 内核库（LKL，Linux Kernel Library）的 FUSE 实现，通过在用户空间运行 Linux 内核代码，提供对 Btrfs、XFS 等更多 Linux 文件系统的完整支持。与 fusefs-ext2 相比，fusefs-lkl 支持的文件系统类型更广泛，但性能可能略低。

### 安装 fusefs-lkl

fusefs-lkl 可以通过两种方式安装：

* 使用 pkg 包管理器进行二进制安装：

```sh
# pkg install fusefs-lkl
```

* 或通过 Ports 系统进行源代码编译安装：

```sh
# cd /usr/ports/filesystems/lkl/ 
# make install clean
```

### 加载 FUSE 内核模块

fusefs 是 FreeBSD 的 FUSE 框架内核模块，为所有基于 FUSE 的文件系统提供底层支持。在安装 fusefs-ext2 时已经加载了该模块，如果尚未加载，可以执行以下命令：

```sh
# sysrc kld_list+="fusefs"
```

### 测试挂载 Btrfs 分区

使用 `lklfuse` 将 Btrfs 分区 `nda1p2` 挂载至 `/home/ykla/btrfs`：

```sh
# mkdir -p /home/ykla/btrfs # 创建挂载目录
# lklfuse -o type=btrfs /dev/nda1p2 /home/ykla/btrfs # 挂载磁盘分区
# ls /home/ykla/btrfs # 查看挂载目录内容
test1	test2	test3	test4
```

### 测试挂载 XFS 分区

使用 `lklfuse` 将 XFS 分区 `nda1p4` 挂载至 `/home/ykla/xfs`：

```sh
# mkdir -p /home/ykla/xfs # 创建挂载目录
# lklfuse -o type=xfs /dev/nda1p4 /home/ykla/xfs # 挂载磁盘分区
# ls /home/ykla/xfs # 查看挂载目录内容
cfc	test1	test2
```

## 故障排除与未竟事宜

### 文件系统的卸载方法

文件系统卸载操作可通过 `umount` 命令完成。卸载前应确保没有进程正在访问挂载点，否则卸载会失败。其基本语法为：

```sh
# umount /home/ykla/test    # 卸载指定挂载点的文件系统
```

### 持久化挂载配置

持久化挂载可通过将挂载配置写入 `/etc/fstab` 文件实现。对于 FUSE 文件系统，需特别注意挂载参数与延迟挂载选项 `late` 的使用。具体实现方法可参考 23.4 章节中 NTFS 文件系统的持久化挂载配置示例。

## 参考文献

* FreeBSD Forums. mount linux ext4 drives on Freebsd\[EB/OL]. (2020-03-10)\[2026-03-25]. <https://forums.freebsd.org/threads/mount-linux-ext4-drives-on-freebsd.74414/>. FreeBSD 论坛讨论文章，详述 fusefs-ext2 在 FreeBSD 上挂载 EXT4 文件系统的实践方案
* FreeBSD Forums. XFS support\[EB/OL]. \[2026-03-25]. <https://forums.freebsd.org/threads/xfs-support.61449/>. FreeBSD 论坛 XFS 支持讨论，探讨 XFS 文件系统在 FreeBSD 上的兼容性与挂载方法

## 课后习题

1. 在 FreeBSD 上配置 EXT4 分区的持久化挂载，修改 `/etc/fstab` 添加延迟挂载选项，重启系统后验证挂载是否正常，并测试文件读写操作。
2. 对比 fusefs-ext2 和 fusefs-lkl 的实现机制，重构一个最小化的 FUSE 文件系统挂载脚本。
3. 将一个 EXT4 分区从只读挂载模式切换为读写挂载模式，创建并修改文件后验证数据一致性。
