大容量存储小工具 (MSG)¶
概述¶
大容量存储小工具(或 MSG)作为 USB 大容量存储设备,在主机看来是一个磁盘或 CD-ROM 驱动器。它支持多个逻辑单元 (LUN)。每个 LUN 的后端存储由一个常规文件或一个块设备提供,访问可以限制为只读,并且小工具可以指示它是可移动和/或 CD-ROM(后者意味着只读访问)。
它的要求不高;只需要一个批量输入和批量输出端点。内存需求为两个 16K 缓冲区。支持全速、高速和超高速操作。
请注意,该驱动程序略微不具备可移植性,因为它假定一个单一的内存/DMA 缓冲区可用于批量输入和批量输出端点。对于大多数设备控制器来说,这不是问题,但有些硬件限制可能会阻止缓冲区被多个端点使用。
本文档描述了如何从用户空间使用该小工具,它与大容量存储功能(或 MSF)以及使用它的不同小工具的关系,以及它与文件存储小工具(或 FSG)(已不再包含在 Linux 中)的区别。它将简要介绍如何在复合小工具中使用 MSF。
模块参数¶
大容量存储小工具接受以下特定于大容量存储的模块参数
file=文件名[,文件名...]
此参数列出了用于每个逻辑单元后端存储的文件或块设备的路径。最多可设置 FSG_MAX_LUNS (8) 个 LUN。如果指定了更多文件,它们将被静默忽略。另请参阅“luns”参数。
注意,如果一个文件用作后端存储,则不能被任何其他进程修改。这是因为主机假定数据在未经其知晓的情况下不会改变。它可能被读取,但(如果逻辑单元是可写的)由于主机端的缓冲,内容可能未明确定义。
逻辑单元的大小将向下舍入到完整的逻辑块。对于模拟 CD-ROM 的 LUN,逻辑块大小为 2048 字节;如果后端文件是块设备,则为设备的块大小;否则为 512 字节。
removable=b[,b...]
此参数指定每个逻辑单元是否应可移动。“b”在此处表示“y”、“Y”或“1”表示真,或“n”、“N”或“0”表示假。
如果为逻辑单元设置此选项,则小工具将接受“弹出”SCSI 请求(启动/停止单元)。当它被发送时,后端文件将被关闭以模拟弹出,并且在用户空间在设备上指定新的后端文件之前(参见“sysfs 条目”部分),主机将无法挂载该逻辑单元。
如果一个逻辑单元不可移动(默认值),则在模块加载时必须使用“file”参数为其指定一个后端文件。如果模块是内置的,也同样适用,没有例外。
该标志的默认值为 false,但是它曾经为 true。这已更改为更好地匹配文件存储小工具,并且毕竟似乎是一个更合理的默认值。因此,为了保持与旧内核的兼容性,最好指定默认值。此外,如果依赖旧默认值,现在需要明确指定“n”。
请注意,“可移动”表示逻辑单元的介质可以弹出或移除(如 CD-ROM 驱动器或读卡器)。它不表示整个小工具可以从主机上拔下;正确的术语是“热插拔”。
cdrom=b[,b...]
此参数指定每个逻辑单元是否应模拟 CD-ROM。默认值为 false。
ro=b[,b...]
此参数指定每个逻辑单元是否应报告为只读。这将阻止主机修改后端文件。
请注意,如果给定逻辑单元的此标志为 false,但后端文件无法以读/写模式打开,则小工具无论如何都会回退到只读模式。
非 CD-ROM 逻辑单元的默认值为 false;对于模拟 CD-ROM 的逻辑单元,它被强制为 true。
nofua=b[,b...]
此参数指定在发送到给定逻辑单元的 SCSI Write10 和 Write12 命令中是否应忽略 FUA 标志。
MS Windows 默认以“优化移除模式”挂载可移动存储。所有对介质的写入都是同步的,这是通过在 SCSI Write(10,12) 命令中设置 FUA(强制单元访问)位来实现的。这会强制每次写入都等到数据实际写入完成,并阻止块层中的 I/O 请求聚合,从而显著降低性能。
请注意,这可能意味着如果设备由 USB 供电,并且用户在未先卸载设备的情况下拔下设备(至少有些 Windows 用户会这样做),数据可能会丢失。
默认值为 false。
luns=N
此参数指定小工具将拥有的逻辑单元数量。它受 FSG_MAX_LUNS (8) 限制,更高值将被限制。
如果提供了此参数,并且“file”参数中指定的文件数量大于“luns”的值,则所有多余的文件都将被忽略。
如果此参数不存在,则逻辑单元的数量将从“file”参数中指定的文件数量推断。如果文件参数也缺失,则假定为 1。
stall=b
指定小工具是否允许停止批量端点。默认值根据 USB 设备控制器的类型确定,但通常为 true。
除了上述参数外,该小工具还接受复合框架定义的以下参数(它们是所有复合小工具共有的,因此在此快速列出)
idVendor -- USB 供应商 ID (16 位整数)
idProduct -- USB 产品 ID (16 位整数)
bcdDevice -- USB 设备版本 (BCD) (16 位整数)
iManufacturer -- USB 制造商字符串 (字符串)
iProduct -- USB 产品字符串 (字符串)
iSerialNumber -- 序列号字符串 (字符串)
sysfs 条目¶
对于每个逻辑单元,小工具在 sysfs 层次结构中创建一个目录。其中创建了以下三个文件
file
读取时,它返回给定逻辑单元后端文件的路径。如果没有后端文件(仅当逻辑单元可移动时才可能),则内容为空。
写入时,它会更改给定逻辑单元的后端文件。即使给定逻辑单元未指定为可移动,也可以执行此更改(但这可能对主机看起来很奇怪)。但是,如果主机使用“阻止-允许介质移除”SCSI 命令禁用了介质移除,则可能会失败。
ro
反映给定逻辑单元的 ro 标志状态。可以随时读取,并且在给定逻辑单元没有打开的后端文件时可以写入。
nofua
反映给定逻辑单元的 nofua 标志状态。可以读写。
forced_eject
写入时,它会导致后端文件被强制从 LUN 中分离,无论主机是否允许。内容无关紧要,任何非零字节的写入都将导致弹出。
无法读取。
除此之外,与往常一样,模块参数的值可以从 /sys/module/g_mass_storage/parameters/* 文件中读取。
使用大容量存储功能的其他小工具¶
大容量存储小工具使用大容量存储功能来处理大容量存储协议。作为一种复合功能,MSF 也可以被其他小工具使用(例如 g_multi 和 acm_ms)。
前面部分中的所有信息都适用于使用 MSF 的其他小工具,除了可能缺少对大容量存储相关模块参数的支持,或者参数可能带有前缀。要弄清楚这些是否属实,需要查阅该小工具的文档或其源代码。
有关如何在小工具中包含大容量存储功能的示例,可以查看 mass_storage.c、acm_ms.c 和 multi.c(按复杂性排序)。
与文件存储小工具的关系¶
大容量存储功能以及大容量存储小工具是基于文件存储小工具的。两者之间的区别在于 MSG 是一个复合小工具(即,使用复合框架),而文件存储小工具是一个传统小工具。从用户空间的角度来看,这种区别并不重要,但从内核黑客的角度来看,这意味着 (i) MSG 不会重复处理基本 USB 协议命令所需的代码,并且 (ii) MSF 可以用于任何其他复合小工具。
因此,文件存储小工具已在 Linux 3.8 中移除。所有用户都需要过渡到大容量存储小工具。除了以下几点,这两个小工具在外部行为上大多相同
在 FSG 中,“removable”和“cdrom”模块参数为所有逻辑单元设置标志,而在 MSG 中,它们接受每个逻辑单元的 y/n 值列表。如果只使用一个逻辑单元,这无关紧要,但如果有多个,则需要为每个逻辑单元重复 y/n 值。
FSG 的“serial”、“vendor”、“product”和“release”模块参数在 MSG 中由复合层的相应参数处理,分别为:“iSerialNumber”、“idVendor”、“idProduct”和“bcdDevice”。
MSG 不支持 FSG 的测试模式,因此不支持 FSG 的“transport”、“protocol”和“buflen”模块参数。MSG 总是使用 SCSI 协议,采用仅批量传输模式和 16 KiB 缓冲区。