我目前正在 Linux 機器上進行一些作業系統開發。在此過程中,我想在檔案(例如 Disk.img)上建立 FAT12 檔案系統。我使用 mkfs 命令如下:
touch Disk.img
truncate Disk.img -s 1M
mkfs.vfat -F12 Disk.img
使用十六進位編輯器查看時,我發現“SECTORS_PER_FAT”預設為 2。我想讓它變成9..我該怎麼做?
編輯:BIOS 參數區塊具有以下資訊(我只是不想手動操作,而是想使用 mkfs)
(這是來自的彙編片段http://www.brokenthorn.com/Resources/OSDev5.html)
bpbBytesPerSector: DW 512
bpbSectorsPerCluster: DB 1
bpbReservedSectors: DW 1
bpbNumberOfFATs: DB 2
bpbRootEntries: DW 224
bpbTotalSectors: DW 2880
bpbMedia: DB 0xF0
bpbSectorsPerFAT: DW 9 ;!!!!This is the thing I want to control!!!!
bpbSectorsPerTrack: DW 18
bpbHeadsPerCylinder: DW 2
bpbHiddenSectors: DD 0
bpbTotalSectorsBig: DD 0
bsDriveNumber: DB 0
bsUnused: DB 0
bsExtBootSignature: DB 0x29
bsSerialNumber: DD 0xa0a1a2a3
bsVolumeLabel: DB "MOS FLOPPY "
bsFileSystem: DB "FAT12 "
順便說一句...我認為簇和每個簇的扇區總數應該自動確定FAT的大小(以扇區數為單位)...因此在BPB中定義sectors_per_fat可能是多餘的...這意味著它不能採取任何任意值....
答案1
我觀察到“SECTORS_PER_FAT”預設為 2。我想做9。
看來這個數字是自動計算的。由於檔案分配表每個簇有一個條目,且簇的數量是有限的且是預先已知的,因此沒有必要向 FAT 分配更多磁區。
在您的情況下 2 不是“預設情況下”,它主要由檔案系統大小( 的大小Disk.img
)和簇大小決定。
取最小可能的簇大小(即最小邏輯扇區大小 ( -S512
) 和每個簇的最小扇區數 ( -s1
)):
# 'touch' is not needed, 'truncate' is enough
truncate Disk.img -s 1M
mkfs.vfat -F12 -S512 -s1 Disk.img
# the below line extracts the value we're after
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'
這給出了給定檔案大小的最大簇數、FAT 中的最大條目數、最大 FAT 大小以及每個 FAT 所需的最大扇區數。但仍然只有6個。
我認為理論上你可以正式分配更多扇區並且檔案系統將是有效的。重點是 FAT 中的任何附加磁區都不會被使用,因為所有群集都已被這 6 個磁區中的條目覆蓋。實際上mkfs.vfat
不會浪費這樣的扇區。
粗糙的計算 1 MiB 並-S512 -s1
為每個 FAT 提供 6 個磁區:
- 我們忽視簇以外的結構,就好像所有空間都貢獻於簇。一個
-S512 -s1
集群需要 0.5 KiB。 1 MiB 正好容納 2 Ki 的這類簇。請注意,在此計算中簇的數量是膨脹的相對於嚴格值。 - 在 FAT12 中,一個條目佔用 12 位元(每 3 個位元組 2 個條目),因此 1.5 B。 2 Ki 的條目佔 3 KiB。所以 FAT 應該要佔 3 KiB,這個數字也是膨脹的。
- 單一扇區為 0.5 KiB。您需要 6 個扇區才能容納 3 KiB。由於 3 KiB 有點膨脹,您需要最多6個部門。
該工具更嚴格地計算這個數字。
FAT 的數量 ( -f
) 並不重要。並不是簇被劃分在單獨的 FAT 中。額外的 FAT 只是副本,每個 FAT 仍然服務所有叢集。更多 FAT 佔用更多空間,這會稍微減少簇的數量。對於檔案系統的某些“閾值大小”,此現象會影響每個 FAT 的磁區數。然而,對於 1 MiB,-S512 -s1
每個 FAT 所需的扇區數為 6 -f
(注意:在我的測試中mkfs.vfat
拒絕創建超過 4 個 FAT)。
在我們最大化給定檔案系統大小的簇數之後,增加每個 FAT 磁區數的最簡單方法是增大檔案系統。 1 MiB 可以得到 6 個,因此 1.5 MiB 可能可以得到 9 個。的確:
truncate Disk.img -s 1536k
mkfs.vfat -F12 -S512 -s1 Disk.img
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'
請注意,1536k
這不是獲得 9 的最小1389k
尺寸。 For (預設值)給出 9並給出8。1388k
-f
1389k
-f2
-f3
1388k
-f1
-f2
我的測試台:
- Debian GNU/Linux 9
mkfs.vfat
作為符號連結mkfs.fat
mkfs.fat
版本:4.1(2017-01-24)
參考:
- FAT 檔案系統作者:Andries Brouwer
(這是 2002 年的內容,但我認為 FAT12 從那時起沒有顯著變化) - FAT檔案系統的設計在維基百科上