VFAT

使用 VFAT

要使用 vfat 檔案系統,請使用檔案系統型別 “vfat”。例如:

mount -t vfat /dev/fd0 /mnt

不需要特殊的磁碟格式化工具,如果你想在 Linux 中格式化,可以使用 “mkdosfs”。

VFAT 掛載選項

uid=###

設定此檔案系統上所有檔案的所有者。預設值為當前程序的 uid。

gid=###

設定此檔案系統上所有檔案的組。預設值為當前程序的 gid。

umask=###

許可權掩碼(用於檔案和目錄,請參閱 umask(1))。預設值為當前程序的 umask。

dmask=###

目錄的許可權掩碼。預設值為當前程序的 umask。

fmask=###

檔案的許可權掩碼。預設值為當前程序的 umask。

allow_utime=###

此選項控制 mtime/atime 的許可權檢查。

-20:如果當前程序位於檔案組 ID 的組中,則可以更改時間戳。

-2:其他使用者可以更改時間戳。

預設值從 dmask 選項設定。如果目錄可寫,則 utime(2) 也被允許。即 ~dmask & 022。

通常,utime(2) 檢查當前程序是否為檔案的所有者,或者它是否具有 CAP_FOWNER 功能。但是 FAT 檔案系統在磁碟上沒有 uid/gid,因此正常的檢查過於死板。使用此選項,您可以放鬆它。

codepage=###

設定內碼表編號,用於在 FAT 檔案系統上轉換為短檔名字元。預設情況下,使用 FAT_DEFAULT_CODEPAGE 設定。

iocharset=<name>

字元集,用於使用者可見檔名和 16 位 Unicode 字元之間的轉換。長檔名以 Unicode 格式儲存在磁碟上,但 Unix 在很大程度上不知道如何處理 Unicode。預設情況下,使用 FAT_DEFAULT_IOCHARSET 設定。

還可以選擇使用 utf8 選項進行 UTF-8 轉換。

注意

iocharset=utf8 不推薦使用。如果不確定,您應該考慮使用 utf8 選項。

utf8=<bool>

UTF-8 是控制檯使用的 Unicode 檔案系統安全版本。可以使用此選項為檔案系統啟用或停用它。如果設定了 “uni_xlate”,則 UTF-8 將被停用。預設情況下,使用 FAT_DEFAULT_UTF8 設定。

uni_xlate=<bool>

將未處理的 Unicode 字元轉換為特殊的轉義序列。這將允許您備份和還原使用任何 Unicode 字元建立的檔名。在 Linux 真正支援 Unicode 之前,這為您提供了一種替代方案。如果沒有此選項,則在無法進行轉換時使用 “?”。跳脫字元是 “:”,因為它在 vfat 檔案系統上是非法的。使用的轉義序列是 “:” 和十六進位制 Unicode 的四位數字。

nonumtail=<bool>

建立 8.3 別名時,通常別名將以 “~1” 或波浪線後跟某個數字結尾。如果設定了此選項,則如果檔名為 “longfilename.txt” 並且目錄中當前不存在 “longfile.txt”,則 longfile.txt 將是短別名,而不是 longfi~1.txt。

usefree

使用儲存在 FSINFO 上的“空閒簇”值。它將用於確定空閒簇的數量,而無需掃描磁碟。但預設情況下不使用它,因為最近的 Windows 在某些情況下無法正確更新它。如果您確定 FSINFO 上的“空閒簇”是正確的,則可以透過此選項避免掃描磁碟。

quiet

停止列印某些警告訊息。

check=s|r|n

大小寫敏感性檢查設定。

s:嚴格,區分大小寫

r:寬鬆,不區分大小寫

n:正常,預設設定,目前不區分大小寫

nocase

此選項已棄用,請用於 vfat。請改用 shortname=win95

shortname=lower|win95|winnt|mixed

短檔名顯示/建立設定。

lower:轉換為小寫以進行顯示,模擬 Windows 95 的建立規則。

win95:模擬 Windows 95 的顯示/建立規則。

winnt:模擬 Windows NT 的顯示/建立規則。

mixed:模擬 Windows NT 的顯示規則,模擬 Windows 95 的建立規則。

預設設定為 mixed

tz=UTC

將時間戳解釋為 UTC 而不是本地時間。此選項停用本地時間(Windows 在 FAT 上使用)和 UTC(Linux 在內部使用)之間的時間戳轉換。這在掛載設定為 UTC 的裝置(如數碼相機)時特別有用,以避免本地時間的陷阱。

time_offset=minutes

設定用於將 FAT 使用的本地時間轉換為 UTC 的時間戳偏移量。即,將從每個時間戳中減去 <minutes> 分鐘,以將其轉換為 Linux 內部使用的 UTC。當 sys_tz 中設定的時區不是檔案系統使用的時區時,此選項很有用。請注意,即使存在 DST,此選項仍然無法在所有情況下提供正確的時間戳 - 不同 DST 設定中的時間戳將相差一小時。

showexec

如果設定,則僅當名稱的擴充套件部分為 .EXE、.COM 或 .BAT 時,才允許檔案的執行許可權位。預設情況下未設定。

debug

可以設定,但當前實現未使用。

sys_immutable

如果設定,則 FAT 上的 ATTR_SYS 屬性將作為 Linux 上的 IMMUTABLE 標誌處理。預設情況下未設定。

flush

如果設定,檔案系統將嘗試比正常情況更早地重新整理到磁碟。預設情況下未設定。

rodir

FAT 具有 ATTR_RO(只讀)屬性。在 Windows 上,目錄的 ATTR_RO 將被忽略,並且僅由應用程式用作標誌(例如,為自定義資料夾設定)。

如果您希望將 ATTR_RO 用作只讀標誌,即使對於目錄也是如此,請設定此選項。

errors=panic|continue|remount-ro

指定 FAT 在發生嚴重錯誤時的行為:panic,繼續不執行任何操作,或以只讀模式重新掛載分割槽(預設行為)。

discard

如果設定,則在釋放塊時向塊裝置發出 discard/TRIM 命令。這對於 SSD 裝置和稀疏/精簡配置的 LUN 非常有用。

nfs=stale_rw|nostale_ro

僅當您要透過 NFS 匯出 FAT 檔案系統時才啟用此功能。

stale_rw:此選項維護目錄 inodes 的索引(快取),該索引由 i_logstart 使用,供 nfs 相關程式碼用於改進查詢。支援透過 NFS 的完整檔案操作(讀/寫),但如果 NFS 伺服器發生快取驅逐,則可能導致 ESTALE 問題。

nostale_ro:此選項基於 MS-DOS 目錄條目中檔案的磁碟位置,設定 inode 編號和檔案控制代碼。這確保了在檔案從 inode 快取中驅逐後不會返回 ESTALE。但是,這意味著重新命名、建立和取消連結等操作可能會導致先前指向一個檔案的檔案控制代碼指向另一個檔案,從而可能導致資料損壞。因此,此選項還會以只讀方式掛載檔案系統。

為了保持向後相容性,也接受 '-o nfs',預設為 “stale_rw”。

dos1xfloppy <bool>: 0,1,yes,no,true,false

如果設定,請使用回退預設 BIOS 引數塊配置,該配置由備份裝置大小確定。這些靜態引數與 DOS 1.x 為 160 kiB、180 kiB、320 kiB 和 360 kiB 軟盤和軟盤映像假定的預設值匹配。

限制

當使用 fallocate 與 FALLOC_FL_KEEP_SIZE 時,檔案的 fallocated 區域在 umount/evict 時間被丟棄。因此,使用者應假定如果存在記憶體壓力導致從記憶體中驅逐 inode,則 fallocated 區域可以在最後關閉時被丟棄。因此,對於任何依賴於 fallocated 區域的使用者,應確保在重新開啟檔案後重新檢查 fallocate。

待辦事項

需要擺脫原始掃描的東西。相反,始終使用獲取下一個目錄條目的方法。唯一剩下的使用原始掃描的是目錄重新命名程式碼。

可能的問題

  • vfat_valid_longname 沒有正確檢查保留名稱。

  • 當卷名稱與檔案系統根目錄中的目錄名稱相同時,目錄名稱有時會顯示為空檔案。

  • autoconv 選項無法正常工作。

測試套件

如果您計劃對 vfat 檔案系統進行任何修改,請獲取 vfat 發行版附帶的測試套件,網址為

http://web.archive.org/web/*/http://bmrc.berkeley.edu/people/chaffee/vfat.html

這將測試 vfat 檔案系統的許多部分,並且歡迎對新功能或未經測試的功能進行額外測試。

關於 VFAT 檔案系統結構的說明

本文件由 Galen C. Hunt gchunt@cs.rochester.edu 提供,並由 Gordon Chaffee 進行了輕微註釋。

本文件對我所知的 Windows NT 3.5 和 Windows 95 中使用的擴充套件 FAT 檔案系統進行了非常粗略的技術概述。我不保證以下任何內容是正確的,但似乎如此。

擴充套件 FAT 檔案系統幾乎與 DOS 版本中使用的 FAT 檔案系統相同,包括 6.223410239847 :-)。 重要的變化是增加了長檔名。 這些名稱最多支援 255 個字元,包括空格和大小寫字元,而不是傳統的 8.3 短名稱。

以下是當前 Windows 95 檔案系統中傳統 FAT 條目的描述

struct directory { // Short 8.3 names
        unsigned char name[8];          // file name
        unsigned char ext[3];           // file extension
        unsigned char attr;             // attribute byte
        unsigned char lcase;            // Case for base and extension
        unsigned char ctime_ms;         // Creation time, milliseconds
        unsigned char ctime[2];         // Creation time
        unsigned char cdate[2];         // Creation date
        unsigned char adate[2];         // Last access date
        unsigned char reserved[2];      // reserved values (ignored)
        unsigned char time[2];          // time stamp
        unsigned char date[2];          // date stamp
        unsigned char start[2];         // starting cluster number
        unsigned char size[4];          // size of the file
};

lcase 欄位指定 8.3 名稱的基本名和/或副檔名是否應大寫。 Windows 95 似乎沒有使用此欄位,但 Windows NT 使用了它。 檔名的大小寫從 Windows NT 到 Windows 95 並不完全相容。 但是,在相反的方向上並不完全相容。 在 Windows NT 上寫入的小寫的 8.3 名稱空間中的檔名將在 Windows 95 上顯示為大寫。

注意

請注意,startsize 值實際上是小端整數值。 此結構中欄位的描述是眾所周知的,可以在其他地方找到。

使用擴充套件 FAT 系統,Microsoft 為任何具有副檔名稱的檔案插入了額外的目錄條目。 (任何合法地適合舊 8.3 編碼方案的名稱都沒有額外的條目。)我將這些額外的條目稱為插槽。 基本上,插槽是一種特殊格式的目錄條目,最多可以容納副檔名的 13 個字元。 將插槽視為與其對應的檔案的目錄條目的額外標籤。 Microsoft 喜歡將檔案的 8.3 條目稱為其別名,並將擴充套件插槽目錄條目稱為檔名。

插槽目錄條目的 C 結構如下

struct slot { // Up to 13 characters of a long name
        unsigned char id;               // sequence number for slot
        unsigned char name0_4[10];      // first 5 characters in name
        unsigned char attr;             // attribute byte
        unsigned char reserved;         // always 0
        unsigned char alias_checksum;   // checksum for 8.3 alias
        unsigned char name5_10[12];     // 6 more characters in name
        unsigned char start[2];         // starting cluster number
        unsigned char name11_12[4];     // last 2 characters in name
};

如果插槽的佈局看起來有點奇怪,那只是因為 Microsoft 努力保持與舊軟體的相容性。 必須偽裝這些插槽以防止舊軟體崩潰。 為此,採取了許多措施

  1. 插槽目錄條目的屬性位元組始終設定為 0x0f。 這對應於具有“隱藏”、“系統”、“只讀”和“卷標”屬性的舊目錄條目。 大多數舊軟體會忽略任何設定了“卷標”位的目錄條目。 真正的卷標條目沒有設定其他三個位。

  2. 起始簇始終設定為 0,這是 DOS 檔案的不可能的值。

由於擴充套件 FAT 系統是向後相容的,因此舊軟體可以修改目錄條目。 必須採取措施以確保插槽的有效性。 擴充套件 FAT 系統可以透過以下方式驗證插槽是否確實屬於 8.3 目錄條目

  1. 定位。 檔案的插槽始終緊隨其對應的 8.3 目錄條目。 此外,每個插槽都有一個 ID,用於標記其在擴充套件檔名中的順序。 這是 8.3 目錄條目的非常簡短的檢視及其對應的長名稱插槽,用於檔案 “My Big File.Extension which is long”

    <proceeding files...>
    <slot #3, id = 0x43, characters = "h is long">
    <slot #2, id = 0x02, characters = "xtension whic">
    <slot #1, id = 0x01, characters = "My Big File.E">
    <directory entry, name = "MYBIGFIL.EXT">
    

    注意

    請注意,插槽從最後一個到第一個儲存。 插槽編號從 1 到 N。第 N 個插槽 或與 0x40 一起標記為最後一個。

  2. 校驗和。 每個插槽都有一個 alias_checksum 值。 校驗和使用以下演算法從 8.3 名稱計算

    for (sum = i = 0; i < 11; i++) {
            sum = (((sum&1)<<7)|((sum&0xfe)>>1)) + name[i]
    }
    
  3. 如果最後一個插槽中有可用空間,則 Unicode NULL (0x0000) 儲存在最後一個字元之後。 之後,最後一個插槽中所有未使用的字元都設定為 Unicode 0xFFFF。

最後,請注意,副檔名以 Unicode 儲存。 每個 Unicode 字元佔用兩個或四個位元組,以 UTF-16LE 編碼。