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

来源:https://www.cnblogs.com/tongye/archive/2019/02/21/9837665.html
-Advertisement-
Play Games

Linux 中,一切(或幾乎一切)都是文件。 一、Linux 磁碟分區與文件系統 1.1 磁碟分區 磁碟的分區主要分為主分區和擴展分區 1)主分區:總共最多只能有四個主分區; 2)擴展分區:只能有一個,也算是主分區的一種,即:主分區 + 擴展分區最多只能有四個。但是擴展分區不能存儲數據和格式化,必須 ...


  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 程式設計 第四版》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.索引 索引是許多數據存儲中的常見概念。雖然它們在數據存儲中的實現可能會有所不同,但它們可用於更有效地基於列(或列集)進行查找。按照約定,用作外鍵每個屬性 (或組的屬性) 會自動創建索引。無法使用數據註釋創建索引。 1.1 非唯一索引 Fluent API 在單個屬性上指定索引。預設情況下,索引是 ...
  • 個人覺得比較好用的縮略圖方法,用在每次從FTP服務端下載圖片,之後引用該方法進行壓縮圖片; 轉載自:http://www.wxzzz.com/1413.html ...
  • 由於功能變數名稱閑置,正好也有伺服器空間,短期內開發了一個博客系統。 大家都來談 http://www.djdlt.com 目前是開放註冊,免費發佈。(限於空間有限,圖片還是儘量少傳些) 網站架構: ASP.NET SQLSERVER2008 支持多屏幕響應。如。平板、手機。自適應所有平臺。 網站能幹什麼: ...
  • c# jobject 數據結構的解析:首先下載Newtonsoft.Json,增加引用using Newtonsoft.Json.Linq;把jobject的內容提取出來,Jobject的內容格式如下: { "code": 200, "msg": "SUCCESS", "data": { "id": ...
  • using System.Collections; using System.Collections.Generic; using UnityEngine; public class ButtonCll : MonoBehaviour { private int countint = 0; publ... ...
  • 隨著Windows10的普及,Microsoft Edge自帶瀏覽器使用頻率逐漸提升,在日常使用過程中我們會發現一個常規的問題是使用Edge進行日常文件下載的時候,N多情況下可能都是亂碼,同樣的下載鏈接在Chrome\Firefox\IE等等都是沒有問題的,這就很尷尬了,今天簡單介紹下處理方法,具體... ...
  • 摘要 通過前面一系列的鋪墊,相信大家對整個miiboo機器人的DIY有了一個清晰整體的認識。接下來就正式進入機器人大腦(嵌入式主板:樹莓派3)的開發。本章將從樹莓派3的開發環境搭建入手,為後續ros開發、slam導航及語音交互演算法做準備。本章內容: 1.安裝系統ubuntu_mate_16.04 2 ...
  • 摘要 通過前面一系列的鋪墊,相信大家對整個miiboo機器人的DIY有了一個清晰整體的認識。接下來就正式進入機器人大腦(嵌入式主板:樹莓派3)的開發。本章將從樹莓派3的開發環境搭建入手,為後續ros開發、slam導航及語音交互演算法做準備。本章內容: 1.安裝系統ubuntu_mate_16.04 2 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...