最佳化的 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 結構的其餘部分。