20.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** 内核中的。对于定制内核,要确保在内核配置文件中存在以下几行: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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 识别,以及如何配置使用该设备。 20.4.1.设备配置 --------------- 要测试 USB 的配置,请插上 USB 设备。使用 ``dmesg`` 确认该驱动器出现在系统信息缓冲区中。它应该看起来像这样: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session umass0: 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: 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 品牌、设备节点(\ **da0**\ )、速率和大小将因设备而异。 由于 USB 设备被看作是 SCSI 设备,可以用 ``camcontrol`` 列出连接到系统的 USB 存储设备: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # camcontrol devlist at scbus4 target 0 lun 0 (pass3,da0) 另外,可以用 ``usbconfig`` 列出设备。请参考 `usbconfig(8) `__ 以了解关于这个命令的更多信息。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # usbconfig ugen0.3: at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (2mA) 如果设备还没有被格式化,请参阅“\ `添加磁盘 `__\ ”,了解如何在 U 盘上格式化和创建分区。如果设备带有文件系统,可以使用“\ `挂载和卸载文件系统 `__\ ”中的说明在 ``root`` 用户下挂载。 **警告** 通过启用下面介绍的 ``vfs.usermount``\ ,以允许不受信的用户挂载任意的设备是不安全的。大多数文件系统都不是为了防范恶意设备而建立的。 为了使普通用户可以挂载设备,可以使用 `pw(8) `__ 使设备的所有用户成为 ``operator`` 组的成员。接下来,通过在 **/etc/devfs.rules** 中添加这几行,确保 ``operator`` 能够读写设备: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session [localrules=5] add path 'da*' mode 0660 group operator .. **注意** 如果系统中也内置安装了 SCSI 磁盘,请将第二行修改如下: .. code:: shell-session add path 'da[3-9]*' mode 0660 group operator 这将使前三个 SCSI 磁盘(从 **da0** 到 **da2**\ )脱离 ``operator`` 组。用内置 SCSI 磁盘的数量来替换数字 *3*\ 。参考 `devfs.rules(5) `__ 以了解更多关于这个文件的信息。 接下来,在 **/etc/rc.conf** 中启用该规则集: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session devfs_system_ruleset="localrules" 然后,在 **/etc/sysctl.conf** 中添加以下一行,让系统允许普通用户挂载文件系统: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session vfs.usermount=1 因为这只在下次重启后生效,可以使用 ``sysctl`` 来立即设置这个变量: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sysctl vfs.usermount=1 vfs.usermount: 0 -> 1 最后一步是创建一个挂载文件系统的目录。这个目录需要由要挂载文件系统的用户拥有。一种方法是让 ``root`` 创建一个由该用户拥有的 **/mnt/username** 子目录。在下面的例子中,用用户的登录名代替 ``username``\ ,用用户的主组代替 ``usergroup``\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # mkdir /mnt/username # chown username:usergroup /mnt/username 假设一个 U 盘被插入,并且出现了一个设备 **/dev/da0s1**\ 。如果该设备是用 FAT 文件系统格式化的,用户可以用以下方法挂载它: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % mount -t msdosfs -o -m=644,-M=755 /dev/da0s1 /mnt/username 在拔出设备之前,\ *必须* 先将其卸载: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % umount /mnt/username 移除设备后,系统信息缓冲区将显示类似以下的信息: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session umass0: at uhub3, port 2, addr 3 (disconnected) da0 at umass-sim0 bus 0 scbus4 target 0 lun 0 da0: s/n WD-WXE508CAN263 detached (da0:umass-sim0:0:0:0): Periph destroyed 20.4.2.自动挂载可移动媒体 ------------------------- 通过取消对 **/etc/auto_master** 中这一行的注释,可以自动挂载 USB 设备: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session /media -media -nosuid 然后在 **/etc/devd.conf** 中添加这几行: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session notify 100 { match "system" "GEOM"; match "subsystem" "DEV"; action "/usr/sbin/automount -c"; }; 如果 `autofs(5) `__ 和 `devd(8) `__ 已经在运行,可以重新加载配置: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service automount restart # service devd restart 可以通过在 **/etc/rc.conf** 中添加这行来设置为在启动时启动 `autofs(5) `__\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session autofs_enable="YES" `autofs(5) `__ 需要启用 `devd(8) `__\ ,它在默认情况下是启用的。 使用如下命令立即启动服务: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service automount start # service automountd start # service autounmountd start # service devd start 每个可以自动挂载的文件系统在 **/media/** 中都显示为一个目录。该目录是以文件系统的标签命名的。如果标签缺失,该目录就以设备节点命名。 文件系统在第一次访问时被自动挂载,并在一段时间未使用后被取消挂载。也可以手动卸载自动挂载的设备: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # automount -fu 这种机制通常用于存储卡和 U 盘。它可以用于任何块设备,包括光驱或 iSCSILUN。