19.5. USB 存储设备

Contributed by Marc Fonvieille.

到目前为止,有许多外部外部存储解决方案, 例如:通用串行总线 (USB):硬盘、USB thumbdrives、CD-R burners 等等。 FreeBSD 为这些设备提供了支持。

19.5.1. 配置

USB 大容量存储设备驱动,在 umass(4), 中提供了对 USB 存储设备的支持。如果您使用 GENERIC 内核,您不必要改变配置文件里的任何内容。 如果您使用了定制的内核,就要确定下面的行出现在您的内核配置文件里:

device scbus
device da
device pass
device uhci
device ohci
device ehci
device usb
device umass

umass(4) 驱动程序使用 SCSI 子系统来访问 USB 存储设备, 您的 USB 设备将被系统看成为一个 SCSI 设备。依靠您主板上的 USB 芯片, 您只须选择 device uhci 或用于 USB 1.X 支持的 device ohci 二者之一即可, 但是两者都加入内核配置文件当中也是无害的。 对于 USB 2.X 控制器的支持由 ehci(4) 提供 (device ehci 这一行)。 不要忘了如果您加入了上面的几行要重新编译和安装内核。

注意:

如果您的 USB 设备是一个 CD-R 或 DVD 刻录机, SCSI CD-ROM 驱动程序, cd(4), 就必须加入内核中通过下面这行:

device cd

由于刻录机被视为 SCSI 设备, 因此, 不应该在内核配置文件中使用 atapicam(4) 驱动程序。

19.5.2. 测试配置

配置好后准备进行测试:插入您的 USB 设备, 在系统信息中 (dmesg(8)), 应该会出现像下面的设备:

umass0: USB Solid state disk, rev 1.10/1.00, addr 2
GEOM: create disk da0 dp=0xc2d74850
da0 at umass-sim0 bus 0 target 0 lun 0
da0: <Generic Traveling Disk 1.11> Removable Direct Access SCSI-2 device
da0: 1.000MB/s transfers
da0: 126MB (258048 512 byte sectors: 64H 32S/T 126C)

当然啦,商标,设备标识 (da0) 和其它的细节信息会根据您的配置不同 而有所不同。

因为 USB 设备被看作 SCSI 设备中的一个, camcontrol 命令也能够用来列出 USB 存储设备和系统的关联:

# camcontrol devlist
<Generic Traveling Disk 1.11>      at scbus0 target 0 lun 0 (da0,pass0)

如果设备上已经包含了文件系统, 现在应该就可以挂接它了。 如果需要, 请参阅 第 19.3 节 “添加磁盘” 来了解如何在 USB驱动器上格式化和创建分区。

警告:

允许非可信用户挂载任意介质, 例如通过使用前面介绍的 vfs.usermount 来启用的功能, 从安全角度来看是很不保险的。 FreeBSD 中的绝大多数文件系统并不提供针对恶意设备的内建防护能力。

如果希望设备能够被普通用户挂接, 还需要做一些其它操作。 首先, 在 USB 存储设备连接到计算机上时, 系统自动生成的设备文件, 必须是该用户能够读写的。 一种做法是让所有属于 operator 组的用户都可以访问该设备。 要完成这项工作, 首先需要用 pw(8) 来给用户指定组。 其次, 在生成设备文件时, operator 组应能读写它们。 这可以通过在 /etc/devfs.rules 中增加一些相应的设置来实现:

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

注意:

如果系统中已经有其它 SCSI 磁盘, 则上述操作必须做一些变化。 例如, 如果系统中已经存在了设备名为 da0da2 的磁盘, 则第二行应改为:

add path 'da[3-9]*' mode 0660 group operator

这会将系统中已经存在的磁盘, 排除在属于 operator 组的设备之外。

另外, 您还需要在 /etc/rc.conf 文件中, 启用 devfs.rules(5) 规则集:

devfs_system_ruleset="localrules"

接下来, 需要配置内核, 令普通用户能够挂接文件系统。 最简单的方法是将下面的配置加入到 /etc/sysctl.conf

vfs.usermount=1

注意, 这个设置只有在下次重启系统时才会生效。 另外, 您也可以使用 sysctl(8) 来设置这个变量。

最后一步是创建将要挂接文件系统的目录。 这个目录必须是属于将要挂接文件系统的用户的。 以 root 身份为用户建立属于该用户的 /mnt/username (此处 username 应替换成用户的登录名, 并把 usergroup 替换成用户所属的组):

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

假设已经插入了一个 USB 读卡设备, 并且系统将其识别为 /dev/da0s1, 由于这些设备通常是 FAT 文件系统, 用户可以这样挂接它们:

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

如果拔出设备 (必须首先将其对应的磁盘卷卸下), 则您会在系统消息缓冲区中看到类似下面的信息:

umass0: at uhub0 port 1 (addr 2) disconnected
(da0:umass-sim0:0:0:0): lost device
(da0:umass-sim0:0:0:0): removing device entry
GEOM: destroy disk da0 dp=0xc2d74850
umass0: detached

19.5.3. 深入阅读

除了 Adding DisksMounting and Unmounting File Systems 章之外, 阅读各种手册页也是有益的: umass(4), camcontrol(8), 和 FreeBSD  8.X 的 usbconfig(8) 或者对于更早期 FreeBSD 版本的 usbdevs(8)

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.