17.4. USB 存储设备

Contributed by Marc Fonvieille.

许多外部存储解决方案(如移动硬盘,U 盘,CD/DVD刻录机)使用通用串行总线(Universal Serial Bus,USB)。FreeBSD 支持使用 USB 1.x,2.x 和 3.x 设备。

注意:

部份硬件尚不兼容USB 3.0,包含Haswell(Lynx point)晶片组,若FreeBSD开机出现failed with error 19信息,请在系统BIOS关闭xHCI/USB3。

GENERIC内核中已支持 USB 设备。如果要在定制内核中加入 USB 支持,请确保内核配置文件中包含下列行:

device scbus	# SCSI bus (required for ATA/SCSI)
device da	# Direct Access (disks)
device pass	# Passthrough device (direct ATA/SCSI access)
device uhci	# provides USB 1.x support
device ohci	# provides USB 1.x support
device ehci	# provides USB 2.0 support
device xhci	# provides USB 3.0 support
device usb	# USB Bus (required)
device umass	# Disks/Mass storage - Requires scbus and da
device cd	# needed for CD and DVD burners

FreeBSD 使用umass(4)驱动程序,它使用 SCSI 子系统来访问USB存储设备。因此,所有USB存储设备将被识别为SCSI存储设备。如果USB设备是 CD/DVD 刻录机,请不要将device atapicam写入内核配置文件中。

本章的其他部分将介绍如何查看USB设备是否被 FreeBSD 识别,以及如何正确配置 USB 设备。

17.4.1. 设备配置

欲查看USB是否正确设置,插入USB设备,然后使用dmesg查看设备信息是否出现在系统消息缓冲区中。像这样:

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 存储设备:

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

usbconfig也可以查看 USB 设备,此命令的更多信息请参阅usbconfig(8)

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

如果设备没有被格式化,请参阅第 17.2 节 “添加磁盘”来了解如何格式化USB磁盘上的分区。如果设备中已有文件系统,可以以 root用户挂载它,更多信息请参阅第 3.7 节 “挂载和卸载文件系统”.。

警告:

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

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

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

注意:

如果系统中还安装了其他 SCSI磁盘,请更改第二行,如下所示:

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

这将排除属于 operator 组的前三个 SCSI 磁盘 (da0da2) 。将 3 替换为内部 SCSI 磁盘的数量。有关此文件的详细信息, 请参阅 devfs.rules(5)

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

devfs_system_ruleset="localrules"

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

vfs.usermount=1

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

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

最后一步是创建将要挂接文件系统的目录。这个目录必须是属于将要挂接文件系统的用户的。以 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

在拔出设备前一定要先卸载(unmount):

% umount /mnt/username

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

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

17.4.2. 自动挂载可移动设备

USB可以被自动挂载,欲启动此功能,在/etc/auto_master文件中去掉下面这行的注释:

/media		-media		-nosuid

然后添加下列行到/etc/devd.conf

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

如果autofs(5)devd(8)已在运行,请重启它们来让配置文件生效:

# service automount restart
# service devd restart

autofs(5)设置成跟随系统一起启动,请在/etc/rc.conf中添加下列行:

autofs_enable="YES"

autofs(5)默认要求启用devd(8)

用下列命令启动这些服务:

# service automount start
# service automountd start
# service autounmountd start
# service devd start

每个可以自动挂载的文件系统都显示为 /media/ 中的目录。该目录以文件系统标签命名。如果缺少标签, 则该目录将以设备节点命名。

文件系统在第一次访问上透明地装载,并在一段时间不活动后卸载。也可以手动卸载自动装载的驱动器:

# automount -fu

此机制通常用于存储卡和 U 盘。它可以与任何块设备一起使用,包括光驱或 iSCSI LUN

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

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

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