1. 程式人生 > >Linux 磁盤與文件系統(EXT2)簡介

Linux 磁盤與文件系統(EXT2)簡介

height this 位置 border eve short hash 號碼 sata

  Linux 中,一切(或幾乎一切)都是文件

一、Linux 磁盤分區與文件系統

1.1 磁盤分區

  磁盤的分區主要分為主分區和擴展分區

1)主分區:總共最多只能有四個主分區;

2)擴展分區:只能有一個,也算是主分區的一種,即:主分區 + 擴展分區最多只能有四個。但是擴展分區不能存儲數據和格式化,必須將其再劃分為邏輯分區才能使用;

3)邏輯分區 :邏輯分區是在擴展分區中劃分的,如果是 IDE 硬盤,Linux 最多支持 59 個邏輯分區,如果是 SCSI 硬盤,Linux 最多支持 11 個邏輯分區

1.2 設備文件名

  Linux 中一切都是文件,包括硬盤、鼠標、打印機等硬件設備也通常被表示(映射)為文件,用來表示這些硬件設備的文件的名字即為“設備文件名”。一般,設備文件名保存在 /dev/ 目錄下,Linux 中常見的硬件設備的設備文件名如下:

硬件設備 設備文件名
IDE硬盤 /dev/hd[a-d]
SCSI/SATA/USB硬盤 /dev/sd[a-p]
光驅 /dev/cdrom 或 /dev/hdc
軟盤 /dev/fd[0-1]
打印機(25針) /dev/lp[0-2]
打印機(USB) /dev/usb/lp[0-15]
鼠標 /dev/mouse

  以 SATA 硬盤為例,sda 表示計算機的第一塊硬盤,sdb 表示計算機的第二塊硬盤,sdc 表示第三塊硬盤。如果對硬盤進行了分區,以 sda 為例,則,sda1、sda2、sda3 和 sda4 分別用來表示該硬盤的四個主分區,sda5、sda6、... 、sda15 則用來表示邏輯分區(SATA硬盤最多支持 11 個邏輯分區)。

  用 ls 命令查看 /dev/ 目錄下的具體文件,如下:

技術分享圖片

  在上圖中,黃色字體即為設備文件。可以看到有:sda、sda1、sda2,這裏,sda 表示計算機的第一塊硬盤、sda1、sda2 分別代表第一塊硬盤的兩個主分區。

1.3 Linux 文件系統的類型

1)EXT 文件系統:

  EXT -- 擴展文件系統,是於 1992 年 4 月發表的一種文件系統,是為 Linux 核心所做的第一個文件系統,最大可支持 2GB 的文件系統。

  EXT2:是 EXT文件系統的升級版,最大支持 16TB 的分區和最大 2TB 的文件;

  EXT3:是 EXT2文件系統的升級版,最大的區別是帶有日誌功能,以在系統突然崩潰時提高文件系統的可靠性,最大支持 16TB 的分區和最大 2TB 的文件;

  EXT4:是 EXT3文件系統的升級版,EXT4在性能、伸縮性、可靠性上進行了大量的改進。它向下兼容 EXT3,最大支持 1EB(1024 * 1024TB) 的分區和 16TB 文件,更快,更安全。

2)XFS 文件系統:

  XFS 是一種高性能的日誌文件系統 ,Centos 7 默認使用的就是 XFS 文件系統。

3)如何查看文件系統的類型:

  可以使用 df -T 指令來查看文件系統的類型:

技術分享圖片

  筆者所用的是 Centos 7 系統,可以看到 /dev/sda1 是 XFS 文件系統。

二、簡單了解一下 Linux 的 EXT2 文件系統

   EXT2 -- 第二代擴展文件系統,是 Linux 內核使用的一種以 inode 為基礎的一種文件系統。在 EXT2 文件系統中,我們需要要了解幾個概念:

2.1、block

  我們知道,文件是存儲在硬盤上的,硬盤的最小存儲單位是扇區(sector)”,每個扇區可以存儲 512 個字節(0.5KB)。但操作系統在讀取硬盤的時候,不是一個扇區一個扇區地讀取,這樣效率會很低,而是會一次性連續讀取多個扇區,即一個“塊(block)”,這種由多個扇區組成的“塊”是文件存取的最小單位。在 EXT2 文件系統中,使用 data block 來記錄文件的實際內容

1)每個 block 都有編號,方便 inode 記錄查找;

2)一個文件可能占用多個 block,沒讀取一個 block 就會消耗一個磁盤 I/O;

3)如果 block 太大,則存放小文件時會造成磁盤空間的浪費;如果 block 太小,則存取文件的效率會變低(消耗更多的磁盤 I/O);

4)EXT2 文件系統支持的 block 有 1KB、2KB、4KB三種,默認一個 block 為 1KB;

5)block 的大小是在格式化時就已經確定了的,除非重新格式化(或者使用 resize2fs 等命令改變文件系統大小),否則 block 的大小固定後就不再改變;

6)block 大小的不同,會導致文件系統能夠支持的最大磁盤容量及最大單一文件容量不相同,在 EXT2 文件系統中:

block大小 1KB 2KB 4KB
最大單一文件大小 16GB 256GB 2TB
最大文件系統容量 2TB 8TB 16TB

7)EXT2 文件系統在格式化時,會將磁盤分為多個塊組(block group),每個 block group 都有獨立的inode/block/super block 。

2.2、inode(索引節點)

  既然我們已經知道文件數據存放在 block 中,那麽如何找到所需的 block 呢,這就需要用到 inode 了。 inode 是文件系統中的一個特殊的數據塊,存放了文件屬性相關的信息,包括文件的創建/修改日期、文件的創建者、文件的大小、文件在磁盤上的存放位置以及文件的訪問權限等。在 Linux kernel 2.6.34 版本, /include/linux/fs.h 文件中有對 inode 結構體的定義,可以作為參考:

struct inode {
    struct hlist_node   i_hash;
    struct list_head    i_list;        /* backing dev IO list */
    struct list_head    i_sb_list;
    struct list_head    i_dentry;
    unsigned long       i_ino;
    atomic_t            i_count;
    unsigned int        i_nlink;
    uid_t               i_uid;
    gid_t               i_gid;
    dev_t               i_rdev;
    unsigned int        i_blkbits;
    u64                 i_version;
    loff_t              i_size;
#ifdef __NEED_I_SIZE_ORDERED
    seqcount_t          i_size_seqcount;
#endif
    struct timespec     i_atime;
    struct timespec     i_mtime;
    struct timespec     i_ctime;
    blkcnt_t            i_blocks;
    unsigned short      i_bytes;
    umode_t             i_mode;
    spinlock_t          i_lock;    /* i_blocks, i_bytes, maybe i_size */
    struct mutex        i_mutex;
    struct rw_semaphore i_alloc_sem;
    const struct inode_operations    *i_op;
    const struct file_operations     *i_fop;    /* former ->i_op->default_file_ops */
    struct super_block               *i_sb;
    struct file_lock                 *i_flock;
    struct address_space             *i_mapping;
    struct address_space             i_data;
#ifdef CONFIG_QUOTA
    struct dquot        *i_dquot[MAXQUOTAS];
#endif
    struct list_head    i_devices;
    union {
        struct pipe_inode_info    *i_pipe;
        struct block_device       *i_bdev;
        struct cdev               *i_cdev;
    };

    __u32                i_generation;

#ifdef CONFIG_FSNOTIFY
    __u32                i_fsnotify_mask; /* all events this inode cares about */
    struct hlist_head    i_fsnotify_mark_entries; /* fsnotify mark entries */
#endif

#ifdef CONFIG_INOTIFY
    struct list_head     inotify_watches; /* watches on this inode */
    struct mutex         inotify_mutex;    /* protects the watches list */
#endif

    unsigned long        i_state;
    unsigned long        dirtied_when;    /* jiffies of first dirtying */

    unsigned int         i_flags;

    atomic_t             i_writecount;
#ifdef CONFIG_SECURITY
    void                 *i_security;
#endif
#ifdef CONFIG_FS_POSIX_ACL
    struct posix_acl     *i_acl;
    struct posix_acl     *i_default_acl;
#endif
    void                 *i_private; /* fs or device private pointer */
};

  可以看到,inode 結構體中有許多文件屬性相關的變量,關於 inode,有:

1)inode 是一種用於存放文件屬性信息的特殊數據塊;

2)每個文件僅占有一個 inode,因此,文件系統所能夠創建的文件數量與 inode 的數量有關

3)每個 inode 都有一個編號,實際上,操作系統就是使用這個 inode 編號來識別不同的文件的。對於操作系統來說,文件名只是 inode 編號的一個別稱,便於用戶識別;

4)inode 的數量與大小在格式化時就已經確定了,不能再做更改;

5)EXT2 中,inode 的大小默認為 128Byte;

6)系統在讀取文件時,先找到 inode 編號,然後獲取 inode 裏面的文件屬性和權限,匹配正確後才能夠開始讀取 block 的內容。

  可以使用 ls -i 命令來查看文件名對應的 inode 編號:

技術分享圖片

  如圖,第一列即為文件名所對應的 inode 號。

2.3、super block(超級塊)

  Super block 用於記錄文件系統的整體信息,其大小為 1024Byte,主要包括:

1)block/inode 的總量;

2)block/inode 的使用量;

3)block/inode 的剩余量;

4)block/inode 的大小;

5)文件系統的掛載時間、最後一次寫入數據的時間等文件系統相關信息

2.4、File System Description(文件系統描述)

   這個區段可以描述每個 block group 的開始與結束的 block 號碼,並說明每個區段分別介於哪個 block 號碼之間。

2.5、block bitmap(塊對照表)

  由於一個 block 只能被一個文件使用,因此新添加一個文件時,就會用到新的 block 來記錄文件數據。可以使用 block bitmap 來確認哪些 block 是空的,哪些是被使用了的,這樣系統就可以快速的找到可使用的 block 來處理文件。同樣,當刪除某個文件時,該文件原本占用的 block 號碼就會被釋放,並在 block bitmap 中把該 block 號碼所對應的標誌更新為未使用狀態,然後釋放 block、

2.6、inode bitmap (inode 對照表)

  功能與 block bitmap 類似,用於記錄 inode 號碼的使用與未使用。

  寫的比較亂,還請見諒。

參考資料:

《鳥哥的 Linux 私房菜 第三版》

《Linux 程序設計 第四版》

Linux 磁盤與文件系統(EXT2)簡介