首頁 > 軟體

Linux 磁碟與檔案系統(EXT2)簡介

2020-06-16 16:38:05

  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 號碼的使用與未使用。 


IT145.com E-mail:sddin#qq.com