最佳化的 MPEG 檔案系統 (OMFS)¶
概述¶
OMFS 是 SonicBlue 建立的檔案系統,用於 ReplayTV DVR 和 Rio Karma MP3 播放器。該檔案系統基於區段,使用 2k 到 8k 的塊大小,並具有基於雜湊的目錄。此檔案系統驅動程式可用於讀取和寫入這些裝置上的磁碟。
請注意,不建議將此檔案系統用於您自己的流媒體媒體裝置的通用檔案系統。原生 Linux 檔案系統可能會表現更好。
更多資訊請訪問
各種實用程式,包括 mkomfs 和 omfsck,都包含在 omfsprogs 中,可在此處獲得
說明包含在其 README 中。
選項¶
OMFS 支援以下掛載時選項
uid=n
使所有檔案都歸指定使用者所有
gid=n
使所有檔案都歸指定組所有
umask=xxx
將許可權 umask 設定為 xxx
fmask=xxx
為檔案將 umask 設定為 xxx
dmask=xxx
為目錄將 umask 設定為 xxx
磁碟格式¶
OMFS 區分“sysblock”和普通資料塊。 sysblock 組包含超級塊資訊、檔案元資料、目錄結構和區段。每個 sysblock 都有一個包含整個 sysblock 的 CRC 的標頭,並且可以在磁碟上的連續塊中映象。 sysblock 的大小可能小於資料塊,但由於它們都由相同的 64 位塊號定址,因此較小的 sysblock 中任何剩餘空間都未使用。
Sysblock 標頭資訊
struct omfs_header {
__be64 h_self; /* FS block where this is located */
__be32 h_body_size; /* size of useful data after header */
__be16 h_crc; /* crc-ccitt of body_size bytes */
char h_fill1[2];
u8 h_version; /* version, always 1 */
char h_type; /* OMFS_INODE_X */
u8 h_magic; /* OMFS_IMAGIC */
u8 h_check_xor; /* XOR of header bytes before this */
__be32 h_fill2;
};
檔案和目錄都由 omfs_inode 表示
struct omfs_inode {
struct omfs_header i_head; /* header */
__be64 i_parent; /* parent containing this inode */
__be64 i_sibling; /* next inode in hash bucket */
__be64 i_ctime; /* ctime, in milliseconds */
char i_fill1[35];
char i_type; /* OMFS_[DIR,FILE] */
__be32 i_fill2;
char i_fill3[64];
char i_name[OMFS_NAMELEN]; /* filename */
__be64 i_size; /* size of file, in bytes */
};
OMFS 中的目錄實現為大型雜湊表。檔名經過雜湊處理,然後預先新增到從 OMFS_DIR_START 開始的桶列表中。查詢需要對檔名進行雜湊處理,然後跨 i_sibling 指標進行搜尋,直到找到 i_name 上的匹配項。空桶由全 1 (~0) 的塊指標表示。
檔案是一個 omfs_inode 結構,後跟一個從 OMFS_EXTENT_START 開始的區段表
struct omfs_extent_entry {
__be64 e_cluster; /* start location of a set of blocks */
__be64 e_blocks; /* number of blocks after e_cluster */
};
struct omfs_extent {
__be64 e_next; /* next extent table location */
__be32 e_extent_count; /* total # extents in this table */
__be32 e_fill;
struct omfs_extent_entry e_entry; /* start of extent entries */
};
每個區段都包含塊偏移量,後跟分配給該區段的塊數。每個表中的最後一個區段是一個終止符,其中 e_cluster 為 ~0,e_blocks 為表中塊總數的補碼。
如果此表溢位,則會寫入一個延續 inode 並由 e_next 指向。這些有標頭,但缺少 inode 結構的其餘部分。