大容量儲存小工具 (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 緩衝區。