> For the complete documentation index, see [llms.txt](https://handbook.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://handbook.bsdcn.org/di-29-zhang-usb-she-bei-mo-shi-usb-otg/29.4.-usb-xu-ni-cun-chu-she-bei.md).

# 29.4.USB 虚拟存储设备

> **注意**
>
> [cfumass(4)](https://man.freebsd.org/cgi/man.cgi?query=cfumass\&sektion=4\&format=html) 驱动程序是 USB 设备模式驱动程序，首次在 FreeBSD 12.0 中提供。

大容量存储目标由模板 0 和 10 提供。必须加载 [usb\_template(4)](https://man.freebsd.org/cgi/man.cgi?query=usb_template\&sektion=4\&format=html) 和 [cfumass(4)](https://man.freebsd.org/cgi/man.cgi?query=cfumass\&sektion=4\&format=html) 内核模块。[cfumass(4)](https://man.freebsd.org/cgi/man.cgi?query=cfumass\&sektion=4\&format=html) 连接到 CTL 子系统，该子系统与用于 iSCSI 或光纤通道目标的子系统相同。在主机端，USB 大容量存储发起者只能访问单个 LUN，LUN 0。

## 29.4.1. 使用 cfumass 启动脚本配置 USB 大容量存储目标

设置只读 USB 存储目标的最简单方法是使用 **cfumass** rc 脚本。要通过这种方式配置，请将要提供给 USB 主机的文件复制到 **/var/cfumass** 目录，并在 **/etc/rc.conf** 中添加以下行：

```sh
cfumass_enable="YES"
```

要在不重启的情况下配置目标，运行以下命令：

```sh
# service cfumass start
```

与串口和网络功能不同，模板不应在 **/boot/loader.conf** 中设置为 0 或 10，因为在设置模板之前，LUN 必须先设置。**cfumass** 启动脚本启动时会自动设置正确的模板编号。

## 29.4.2. 使用其他方式配置 USB 大容量存储

本章其余部分详细说明了如何在不使用 **cfumass** rc 文件的情况下设置目标。例如，如果需要提供可写的 LUN，就必须使用这种方式。

USB 大容量存储不需要运行 [ctld(8)](https://man.freebsd.org/cgi/man.cgi?query=ctld\&sektion=8\&format=html) 守护进程，尽管如果需要，可以使用它。这与 iSCSI 不同。因此，配置目标有两种方式：使用 [ctladm(8)](https://man.freebsd.org/cgi/man.cgi?query=ctladm\&sektion=8\&format=html) 或 [ctld(8)](https://man.freebsd.org/cgi/man.cgi?query=ctld\&sektion=8\&format=html)。两者都需要加载 **cfumass.ko** 内核模块。可以手动加载模块：

```sh
# kldload cfumass
```

如果 **cfumass.ko** 未编译到内核中，可在 **/boot/loader.conf** 中设置，使其在引导时加载：

```sh
cfumass_load="YES"
```

可以通过以下命令创建 LUN 而不需要 [ctld(8)](https://man.freebsd.org/cgi/man.cgi?query=ctld\&sektion=8\&format=html) 守护进程：

```sh
# ctladm create -b block -o file=/data/target0
```

这将镜像文件 **/data/target0** 的内容作为 LUN 提供给 USB 主机。该文件必须在执行命令之前存在。要在系统引导时配置 LUN，请将命令添加到 **/etc/rc.local**。

[ctld(8)](https://man.freebsd.org/cgi/man.cgi?query=ctld\&sektion=8\&format=html) 也可以用来管理 LUN。创建 **/etc/ctl.conf** 文件，向 **/etc/rc.conf** 中添加一行以确保 [ctld(8)](https://man.freebsd.org/cgi/man.cgi?query=ctld\&sektion=8\&format=html) 在引导时自动启动，然后启动该守护进程。

这是一个简单的 **/etc/ctl.conf** 配置文件的示例。有关选项的完整说明，请参考 [ctl.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=ctl.conf\&sektion=5\&format=html)。

```sh
target naa.50015178f369f092 {
	lun 0 {
		path /data/target0
		size 4G
	}
}
```

此示例创建了带单个 LUN 的目标。`naa.50015178f369f092` 是由 32 个随机十六进制数字组成的设备标识符。`path` 行定义了作为 LUN 后端存储的文件或 zvol 的完整路径。该文件必须在启动 [ctld(8)](https://man.freebsd.org/cgi/man.cgi?query=ctld\&sektion=8\&format=html) 之前存在。`size` 行是可选的，指定了 LUN 的大小。

要确保 [ctld(8)](https://man.freebsd.org/cgi/man.cgi?query=ctld\&sektion=8\&format=html) 守护进程在引导时启动，请在 **/etc/rc.conf** 中添加以下行：

```sh
ctld_enable="YES"
```

要立即启动 [ctld(8)](https://man.freebsd.org/cgi/man.cgi?query=ctld\&sektion=8\&format=html) 守护进程，运行以下命令：

```sh
# service ctld start
```

当 [ctld(8)](https://man.freebsd.org/cgi/man.cgi?query=ctld\&sektion=8\&format=html) 守护进程启动时，它会读取 **/etc/ctl.conf** 文件。如果守护进程启动后又编辑了此文件，请重新加载更改以立即生效：

```sh
# service ctld reload
```
