> 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-21-zhang-cun-chu/21.4.-usb-cun-chu-she-bei.md).

# 21.4.USB 存储设备

许多外部存储解决方案，如硬盘、U 盘、CD 和 DVD 刻录机，都使用通用串行总线（USB）。FreeBSD 支持 USB 1.x、2.0 和 3.0 设备。

> **注意**
>
> USB 3.0 支持与某些硬件不兼容，包括 Haswell（Lynx point）芯片组。如果 FreeBSD 引导时出现 `failed with error 19` 消息，请在系统 BIOS 中禁用 xHCI/USB3。

USB 存储设备的支持内建在 `GENERIC` 内核中。对于定制内核，请确保在内核配置文件中包含以下行：

```sh
device scbus	# SCSI 总线（ATA/SCSI 必需）
device da	# 直接访问（磁盘）
device pass	# 透传设备（直接 ATA/SCSI 访问）
device uhci	# 提供 USB 1.x 支持
device ohci	# 提供 USB 1.x 支持
device ehci	# 提供 USB 2.0 支持
device xhci	# 提供 USB 3.0 支持
device usb	# USB 总线（必需）
device umass	# 磁盘/大容量存储 - 需要 scbus 和 da
device cd	# 需要用于 CD 和 DVD 刻录机
```

FreeBSD 使用 [umass(4)](https://man.freebsd.org/cgi/man.cgi?query=umass\&sektion=4\&format=html) 驱动程序，通过 SCSI 子系统访问 USB 存储设备。由于任何 USB 设备都会被系统视为 SCSI 设备，因此如果 USB 设备是 CD 或 DVD 刻录机，*不要* 在定制内核配置文件中包含 `device atapicam`。

本节的其余部分演示了如何验证 USB 存储设备是否被 FreeBSD 识别，并如何配置该设备以便使用。

## 21.4.1. 设备配置

要测试 USB 配置，插入 USB 设备。使用 `dmesg` 确认驱动器出现在系统消息缓冲区中。它应类似如下所示：

```sh
umass0: <STECH Simple Drive, class 0/0, rev 2.00/1.04, addr 3> on usbus0
umass0:  SCSI over Bulk-Only; quirks = 0x0100
umass0:4:0:-1: Attached to scbus4
da0 at umass-sim0 bus 0 scbus4 target 0 lun 0
da0: <STECH Simple Drive 1.04> Fixed Direct Access SCSI-4 device
da0: Serial Number WD-WXE508CAN263
da0: 40.000MB/s transfers
da0: 152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)
da0: quirks=0x2<NO_6_BYTE>
```

品牌、设备节点（`da0`）、速度和大小会根据设备不同而有所不同。

由于 USB 设备被视为 SCSI 设备，因此可使用 `camcontrol` 列出连接到系统的 USB 存储设备：

```sh
# camcontrol devlist
<STECH Simple Drive 1.04>          at scbus4 target 0 lun 0 (pass3,da0)
```

或者，可使用 `usbconfig` 列出设备。有关此命令的更多信息，请参考 [usbconfig(8)](https://man.freebsd.org/cgi/man.cgi?query=usbconfig\&sektion=8\&format=html)。

```sh
# usbconfig
ugen0.3: <Simple Drive STECH> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (2mA)
```

如果设备尚未格式化，请参考 [添加磁盘](/di-21-zhang-cun-chu/21.2.-tian-jia-ci-pan.md) 了解如何在 USB 驱动器上格式化并创建分区。如果驱动器包含文件系统，可由 `root` 按照 [挂载和卸载文件系统](/di-3-zhang-freebsd-ji-chu/3.7.-wen-jian-xi-tong-de-gua-zai-yu-xie-zai.md) 中的说明挂载。

> **警告**
>
> 通过如下所述启用 `vfs.usermount` 让不受信任的用户挂载任意设备，从安全角度而言并不可取。大多数文件系统并非为防范恶意设备而设计。

为了使设备能作为普通用户挂载，一种解决方案是将所有使用该设备的用户添加到 `operator` 组中，使用 [pw(8)](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html)。接下来，确保 `operator` 组能读写设备，可在 **/etc/devfs.rules** 中添加以下行：

```sh
[localrules=5]
add path 'da*' mode 0660 group operator
```

> **注意**
>
> 如果系统中还安装了内置 SCSI 磁盘，请将第二行修改如下：
>
> ```sh
> add path 'da[3-9]*' mode 0660 group operator
> ```
>
> 这将把前三个 SCSI 磁盘（`da0` 到 `da2`）排除出 `operator` 组。请将 *3* 替换为内置 SCSI 磁盘的数量。有关此文件的更多信息，请参考 [devfs.rules(5)](https://man.freebsd.org/cgi/man.cgi?query=devfs.rules\&sektion=5\&format=html)。

接下来，在 **/etc/rc.conf** 中启用规则集：

```sh
devfs_system_ruleset="localrules"
```

然后，通过在 **/etc/sysctl.conf** 中添加以下行，指示系统让普通用户可挂载文件系统：

```sh
vfs.usermount=1
```

由于此设置只在下次重启后生效，可立即使用 `sysctl` 设置此变量：

```sh
# sysctl vfs.usermount=1
vfs.usermount: 0 -> 1
```

最后一步是创建目录，在该目录下挂载文件系统。此目录需要由将要挂载文件系统的用户拥有。可通过 `root` 创建由该用户拥有的子目录，如 **/mnt/username**。在以下示例中，将 *username* 替换为用户的登录名，将 *usergroup* 替换为用户的主组：

```sh
# mkdir /mnt/username
# chown username:usergroup /mnt/username
```

假设插入了 USB 闪存驱动器，出现了设备 **/dev/da0s1**。如果该设备格式化为 FAT 文件系统，用户可使用以下命令挂载：

```sh
% mount -t msdosfs -o -m=644,-M=755 /dev/da0s1 /mnt/username
```

在设备被拔出之前，必须首先卸载它：

```sh
% umount /mnt/username
```

拔出设备后，系统消息缓冲区将显示类似以下内容的消息：

```sh
umass0: at uhub3, port 2, addr 3 (disconnected)
da0 at umass-sim0 bus 0 scbus4 target 0 lun 0
da0: <STECH Simple Drive 1.04> s/n WD-WXE508CAN263          detached
(da0:umass-sim0:0:0:0): Periph destroyed
```

## 21.4.2. 自动挂载可移动媒体

USB 设备可通过取消注释 **/etc/auto\_master** 中的这一行来自动挂载：

```sh
/media		-media		-nosuid
```

然后，将以下内容添加到 **/etc/devd.conf** 文件中：

```sh
notify 100 {
	match "system" "GEOM";
	match "subsystem" "DEV";
	action "/usr/sbin/automount -c";
};
```

如果 [autofs(5)](https://man.freebsd.org/cgi/man.cgi?query=autofs\&sektion=5\&format=html) 和 [devd(8)](https://man.freebsd.org/cgi/man.cgi?query=devd\&sektion=8\&format=html) 正在运行，则重新加载配置：

```sh
# service automount restart
# service devd restart
```

通过将以下行添加到 **/etc/rc.conf** 文件中，可设置 [autofs(5)](https://man.freebsd.org/cgi/man.cgi?query=autofs\&sektion=5\&format=html) 在引导时启动：

```sh
autofs_enable="YES"
```

[autofs(5)](https://man.freebsd.org/cgi/man.cgi?query=autofs\&sektion=5\&format=html) 需要启用 [devd(8)](https://man.freebsd.org/cgi/man.cgi?query=devd\&sektion=8\&format=html)，而 `devd` 默认是启用的。

立即启动服务：

```sh
# service automount start
# service automountd start
# service autounmountd start
# service devd start
```

每个可自动挂载的文件系统都会作为 **/media/** 下的目录出现。该目录以文件系统标签命名。如果标签缺失，目录名称将以设备节点命名。

文件系统会在首次访问时透明地挂载，并在一段时间的非活动后卸载。自动挂载的驱动器也可手动卸载：

```sh
# automount -fu
```

该机制通常用于内存卡和 U 盘。它也可用于任何块设备，包括光驱或 iSCSI LUN。
