關於linux檔案系統的一些資料
http://dev.21tx.com/2005/09/20/15997_8.html
垃圾廣告.com/content/develop/joyfire/kernel/7.html
http://www.ibm.com/developerworks/cn/linux/l-cn-ext4resize/
翻譯過來的文章都比較差
不過如果清楚一些東西,大概能看明白.
關於檔案系統,對我們的啟示目前只能大概列出幾點:
1, 儲存小檔案(比如mail, 商品描述,圖片,文章)儘量採用reiserfs ( btree儲存資料塊,利於查詢,不利於增刪改)
適用於絕大部分請求是讀的情況.
2, 如果要穩妥,安全可靠,還是採用ext3吧.
如果追求速度,則採用ext2是不錯的選擇,畢竟少了journal.
如果需要動態resize, list, rm大量檔案(對操作inode的最佳化),則需要使用最新的ext4, 它提供了很好的維護工具.
3, 建議將預設的os io block改成4096bytes; 用空間換時間.
這樣,在inode直接塊為12個的情況下, 可直接由指標訪問的檔案大小上限是 48k
4, 如果需要,儘量在單使用者模式下進行fsck
在運營環境下,一定要禁止重啟後fsck(預設情況),禁止方法如下
. 將/sbin/fsck備份成/sbin/fsck.bak
. 建立link #ln -s /bin/true /sbin/fsck
搞明白ext2的基本結構就差不多了,我想ext3,ext4跟ext2應該差不了多少.
主要是inode, super block, block group, vfs, 檔案系統緩衝儲存方法及LRU淘汰機制.
然後需要明白 glibc提供的系統呼叫是怎樣對映到vfs的 system call的, 再對映到特定檔案系統的操作方法的.
reiserfs會有比較大的差別,比如,它不是based on inode的; 資料塊以btree來組織.
而ext2的資料塊是儲存在連結串列中(? )
/*
* Structure of an inode on the disk
*/
struct ext2_inode {
__le16 i_mode; /* File mode */
__le16 i_uid; /* Low 16 bits of Owner Uid */
__le32 i_size; /* Size in bytes */
__le32 i_atime; /* Access time */
__le32 i_ctime; /* Creation time */
__le32 i_mtime; /* Modification time */
__le32 i_dtime; /* Deletion Time */
__le16 i_gid; /* Low 16 bits of Group Id */
__le16 i_links_count; /* Links count */
__le32 i_blocks; /* Blocks count */
__le32 i_flags; /* File flags */
union {
struct {
__le32 l_i_reserved1;
} linux1;
struct {
__le32 h_i_translator;
} hurd1;
struct {
__le32 m_i_reserved1;
} masix1;
} osd1; /* OS dependent 1 */
__le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
__le32 i_generation; /* File version (for NFS) */
__le32 i_file_acl; /* File ACL */
__le32 i_dir_acl; /* Directory ACL */
__le32 i_faddr; /* Fragment address */
union {
struct {
__u8 l_i_frag; /* Fragment number */
__u8 l_i_fsize; /* Fragment size */
__u16 i_pad1;
__le16 l_i_uid_high; /* these 2 fields */
__le16 l_i_gid_high; /* were reserved2[0] */
__u32 l_i_reserved2;
} linux2;
struct {
__u8 h_i_frag; /* Fragment number */
__u8 h_i_fsize; /* Fragment size */
__le16 h_i_mode_high;
__le16 h_i_uid_high;
__le16 h_i_gid_high;
__le32 h_i_author;
} hurd2;
struct {
__u8 m_i_frag; /* Fragment number */
__u8 m_i_fsize; /* Fragment size */
__u16 m_pad1;
__u32 m_i_reserved2[2];
} masix2;
} osd2; /* OS dependent 2 */
};
/*
* Structure of the super block
*/
struct ext2_super_block {
__le32 s_inodes_count; /* Inodes count */
__le32 s_blocks_count; /* Blocks count */
__le32 s_r_blocks_count; /* Reserved blocks count */
__le32 s_free_blocks_count; /* Free blocks count */
__le32 s_free_inodes_count; /* Free inodes count */
__le32 s_first_data_block; /* First Data Block */
__le32 s_log_block_size; /* Block size */
__le32 s_log_frag_size; /* Fragment size */
__le32 s_blocks_per_group; /* # Blocks per group */
__le32 s_frags_per_group; /* # Fragments per group */
__le32 s_inodes_per_group; /* # Inodes per group */
__le32 s_mtime; /* Mount time */
__le32 s_wtime; /* Write time */
__le16 s_mnt_count; /* Mount count */
__le16 s_max_mnt_count; /* Maximal mount count */
__le16 s_magic; /* Magic signature */
__le16 s_state; /* File system state */
__le16 s_errors; /* Behaviour when detecting errors */
__le16 s_minor_rev_level; /* minor revision level */
__le32 s_lastcheck; /* time of last check */
__le32 s_checkinterval; /* max. time between checks */
__le32 s_creator_os; /* OS */
__le32 s_rev_level; /* Revision level */
__le16 s_def_resuid; /* Default uid for reserved blocks */
__le16 s_def_resgid; /* Default gid for reserved blocks */
/*
* These fields are for EXT2_DYNAMIC_REV superblocks only.
*
* Note: the difference between the compatible feature set and
* the incompatible feature set is that if there is a bit set
* in the incompatible feature set that the kernel doesn't
* know about, it should refuse to mount the filesystem.
*
* e2fsck's requirements are more strict; if it doesn't know
* about a feature in either the compatible or incompatible
* feature set, it must abort and not try to meddle with
* things it doesn't understand...
*/
__le32 s_first_ino; /* First non-reserved inode */
__le16 s_inode_size; /* size of inode structure */
__le16 s_block_group_nr; /* block group # of this superblock */
__le32 s_feature_compat; /* compatible feature set */
__le32 s_feature_incompat; /* incompatible feature set */
__le32 s_feature_ro_compat; /* readonly-compatible feature set */
__u8 s_uuid[16]; /* 128-bit uuid for volume */
char s_volume_name[16]; /* volume name */
char s_last_mounted[64]; /* directory where last mounted */
__le32 s_algorithm_usage_bitmap; /* For compression */
/*
* Performance hints. Directory preallocation should only
* happen if the EXT2_COMPAT_PREALLOC flag is on.
*/
__u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/
__u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */
__u16 s_padding1;
/*
* Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.
*/
__u8 s_journal_uuid[16]; /* uuid of journal superblock */
__u32 s_journal_inum; /* inode number of journal file */
__u32 s_journal_dev; /* device number of journal file */
__u32 s_last_orphan; /* start of list of inodes to delete */
__u32 s_hash_seed[4]; /* HTREE hash seed */
__u8 s_def_hash_version; /* Default hash version to use */
__u8 s_reserved_char_pad;
__u16 s_reserved_word_pad;
__le32 s_default_mount_opts;
__le32 s_first_meta_bg; /* First metablock block group */
__u32 s_reserved[190]; /* Padding to the end of the block */
};
/*
* second extended-fs super-block data in memory
*/
struct ext2_sb_info {
unsigned long s_frag_size; /* Size of a fragment in bytes */
unsigned long s_frags_per_block;/* Number of fragments per block */
unsigned long s_inodes_per_block;/* Number of inodes per block */
unsigned long s_frags_per_group;/* Number of fragments in a group */
unsigned long s_blocks_per_group;/* Number of blocks in a group */
unsigned long s_inodes_per_group;/* Number of inodes in a group */
unsigned long s_itb_per_group; /* Number of inode table blocks per group */
unsigned long s_gdb_count; /* Number of group descriptor blocks */
unsigned long s_desc_per_block; /* Number of group descriptors per block */
unsigned long s_groups_count; /* Number of groups in the fs */
unsigned long s_overhead_last; /* Last calculated overhead */
unsigned long s_blocks_last; /* Last seen block count */
struct buffer_head * s_sbh; /* Buffer containing the super block */
struct ext2_super_block * s_es; /* Pointer to the super block in the buffer */
struct buffer_head ** s_group_desc;
unsigned long s_mount_opt;
uid_t s_resuid;
gid_t s_resgid;
unsigned short s_mount_state;
unsigned short s_pad;
int s_addr_per_block_bits;
int s_desc_per_block_bits;
int s_inode_size;
int s_first_ino;
spinlock_t s_next_gen_lock;
u32 s_next_generation;
unsigned long s_dir_count;
u8 *s_debts;
struct percpu_counter s_freeblocks_counter;
struct percpu_counter s_freeinodes_counter;
struct percpu_counter s_dirs_counter;
struct blockgroup_lock s_blockgroup_lock;
};
注意super block在磁碟和記憶體中的結構體是有區別的
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/94384/viewspace-600319/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於Linux系統中檔案系統路徑的理解(轉)Linux
- Linux磁碟管理與檔案系統(關於磁碟方面)Linux
- oracle 關於-資料檔案Oracle
- Linux 系統中一些針對檔案系統的節能技巧Linux
- linux系統配置及相關檔案Linux
- Linux 檔案系統相關的基本概念Linux
- 關於資料庫檔案最大數資料庫
- 有關於Linux系統資料--解釋GNU(轉)Linux
- 關於SCO unix 系統下定時備份oracle資料庫dmp檔案(轉)Oracle資料庫
- 關於收縮資料檔案的嘗試
- linux的檔案系統Linux
- 關於Linux作業系統下檔案特殊許可權的解釋Linux作業系統
- 關於資料庫系統的學習資料庫
- 關於檔案系統在建立目錄檔案和普通檔案時的區別
- Linux系統篇-檔案系統&虛擬檔案系統Linux
- 關於學習 Linux 系統結構的一些總結Linux
- ASM與檔案系統之間copy資料檔案--檔案系統到ASMASM
- linux下Oracle RAC檔案系統相關的文章LinuxOracle
- 關於控制檔案與資料檔案頭資訊的說明(zt)
- 關於作業系統的一些思考作業系統
- 4.3.2.3 關於PDB$SEED資料檔案的屬性
- 關於資料檔案autoextend on的一點記錄
- 關於資料檔案頭的檢查點SCN
- Linux檔案系統Linux
- linux 檔案系統Linux
- 細說GNU/Linux系統的檔案及檔案系統(轉)Linux
- 作業系統層恢復非關鍵資料檔案作業系統
- 關於學習-Linux-系統結構的一些總結Linux
- Linux下資料檔案刪除檔案系統空間不釋放的問題Linux
- 隱藏屬性ID和保留特大資料夾名稱都是關於檔案系統中檔案和資料夾管理的不同方面。大資料
- Linux系統檔案系統及檔案基礎篇Linux
- Linux 2.4.30 核心檔案系統學習(多圖) 1 : 關鍵資料結構Linux資料結構
- 把檔案系統的資料檔案遷移到ASM儲存ASM
- 關於linux類系統的操作Linux
- 移動資料檔案從ASM到檔案系統ASM
- 如何遷移ASM資料檔案到檔案系統ASM
- 開源大資料檔案系統大資料
- 關於許可權系統的一些思考