
我正在嘗試將虛擬 vfat 驅動器安裝到 Raspberry Pi。這個解決方案有效,然後我們透過 USB OTG 格式化了虛擬 vfat 驅動器,現在我無法將驅動器安裝回 pi,但我仍然可以將其安裝到另一個 USB 裝置。
這是配置。
僅運行一次進行配置
dd if=/dev/zero of=/dir/to/data/data.bin bs=512 count=7680000
mkdosfs /dir/to/data/data.bin
kpartx -a /dir/to/data/data.bin
初始配置後每次啟動時運行
kpartx -a /dir/to/data/data.bin
其餘命令由 OTG USB 管理應用程式執行
安裝到自身
mount -o rw,umask=0000 -t vfat /dev/mapper/loop0p1 /mnt/data
從自身卸載
umount /mnt/data
安裝到 USB
modprobe g_mass_storage file=/dir/to/data/data.bin stall=0
從 USB 卸載
modprobe g_mass_storage file=/dir/to/data/data.bin stall=0
當 vfat 虛擬磁碟安裝到 USB OTG 時,我們從連接到它的裝置對其進行格式化,看看會發生什麼。
現在我們無法將虛擬磁碟機安裝回自己。即使刪除虛擬磁碟機並重建它之後也是如此。
mount -o rw,umask=0000 -t vfat /dev/mapper/loop0p1 /mnt/data
mount: wrong fs type, bad option, bad superblock on /dev/mapper/loop0p1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
或者
mount -o rw,umask=0000 -t vfat /dev/mapper/loop0p1 /mnt/data
mount: special device /dev/mapper/loop0p1 does not exist
我嘗試過的
modprobe -r g_mass_storage //Unmount from usb
umount /mnt/data //Unmount from itself
kpartx -dv /dir/to/data.bin //unmap virtual drive
rm /dir/to/data.bin //delete the virtual file system
dd if=/dev/zero of=/dir/to/data.bin bs=512 count=7680000 //Create a new virtual drive
mkdosfs /dir/to/data/data.bin //Format to vfat
kpartx -av /dir/to/data.bin //Map to dev
mount -o rw,umask=0000 -t vfat /dev/mapper/loop0p1 /mnt/data //Mount to itself
仍然收到兩個錯誤訊息之一,但我仍然可以將其安裝到 USB 並使用 Windows 10 將其作為胖驅動器讀取
我們正在運行 Raspbian(基於 Debian)
感謝您的閱讀。
答案1
這個命令
mkdosfs /dir/to/data/data.bin
在上建立一個檔案系統全部的"裝置" data.bin
.裡面沒有分區表。這種設定稱為超級軟碟。我的總體意見是應該避免,除非您知道可能存在的陷阱並接受它們。
我希望 Windows 在格式化透過模組共享的超級軟碟時保持這種方式g_mass_storage
。
沒有分區表,所以kpartx
沒有必要。您應該掛載整個文件。現代mount
實作應該會自動關聯循環設備:
mount -o rw,umask=0000 -t vfat /dir/to/data/data.bin /mnt/data
(如果您mount
不這樣做,請使用losetup
或甚至kpartx
。但生成的設備將類似於loop0
;例如/dev/loop0
;安裝此設備,而不是loop0p1
)。
mount ... /dev/mapper/loop0p1 /mnt/data
當你第一次運行它時,我很驚訝地工作了。很腥。從一開始就應該掛載整個文件,因為mkdosfs
對整個文件進行操作。
我相信我解決了根本問題。下面對接下來發生的事情的解釋可能是完全錯誤的。
請注意,這種問題是可能的:Windows 不掛載 USB NTFS 超級軟碟。在你的情況下,它是 FAT32 超級軟盤,雖然 Windows 似乎沒有問題,但kpartx
可能是這樣。
這是因為FAT32引導記錄將可執行程式碼儲存在 MBR 中的分割表所在的位置。該代碼可以是任何東西。您運行它kpartx
,它期望 MBR 具有有效的分區表。相反,它獲取 FAT32 引導記錄。然後:
- 要么它沒有找到像分區表這樣的東西,所以
special device /dev/mapper/loop0p1 does not exist
之後; - 或者它找到一個半有效的分區,創建
/dev/mapper/loop0p1
(也許loop0p2
等等)指向文件的某些部分,但由於文件系統位於整個文件上,因此這個“分區”沒有任何意義,具有wrong fs type, bad option, bad superblock
.
這個故事類似於我對已經連結的問題的回答。我想在你的情況下,這會kpartx
讓人感到困惑。
如果您在檔案內建立了分割表(例如使用fdisk data.bin
),定義了一個或多個分割區,運行kpartx -a ...
並建立了一個檔案系統/dev/mapper/loop0p1
- 那麼您應該像 一樣掛載它mount ... /dev/mapper/loop0p1 /mnt/data
。
我認為在這種情況下你可以運行modprobe g_mass_storage
- Windows
file=/dir/to/data/data.bin
會看到整個「裝置」及其分割區表; - 或者
file=/dev/mapper/loop0p1
Windows 會看到一個“裝置”,即超級軟碟。