作業系統如何存取儲存在硬碟上的檔案?

作業系統如何存取儲存在硬碟上的檔案?

我知道作業系統在硬碟上存取的第一個東西是超級塊。

但然後呢?

答案1

作業系統依賴內核,而內核使用各種檔案系統的驅動程式進行讀/寫。檔案的處理是透過驅動程式和系統呼叫透過介面進行抽象的,因此當您說open("file.txt")您不需要知道檔案如何儲存在磁碟上等時。 。這是 ext 系統上的通用片段。


分機範例。

  1. 積木: 磁碟分為積木的連續空間。
  2. 區塊組:塊被分成組。
  3. 索引節點:有關條目(例如檔案、目錄等)的結構化資訊集。
  4. 目錄: inode <–> 名稱列表

每個區塊組有一個屬於該群組的 inode 結構表。


核心佈局:

                     Padding  1024 bytes
                 Super-Block  1 block          *
Block Group Descriptor Table  many blocks      *
                    Reserved  many blocks
           Data Block Bitmap  1 block          *
                inode Bitmap  1 block          *
                 inode Table  many blocks      *
                 Data Blocks  many more blocks *

超級塊包含以下資訊:

  • 索引節點總數
  • 區塊總數
  • 組中的區塊數
  • 群組中的 inode 數量

除了儲存在區塊組 0 中之外,冗餘副本還儲存在其他地方作為備份(以防損壞)。


區塊組描述符表直接在超級街區。除此之外,它還包括:

  • 數量區塊組在分區中
  • 每個描述符區塊組

每個描述符都包含有關該描述符的資料結構的信息區塊組位於。


區塊組除其他事項外,還成立:

  • inode表開始的區塊位址
  • 組內目錄數

點陣圖保存有關使用的資訊。0未使用和1已使用。


索引節點(索引節點)

inode 結構的作用是不是抓住:

  • 姓名
  • 文件數據

索引節點保存以下資訊:

  • 類型、權限、使用者、日期…指向資料的指針

文件的資料保存在區塊中。索引節點保存有關檔案佔用哪些區塊的資訊。這是透過 inode 中的指標完成的。還有不只一個類型的指針。如果我們呼叫指向資料 PTR 的指針,則:

[PTR] 資料塊的位址

  • 12 - 直接指針:
    • [PTR] 資料塊的位址
  • 1 - 單間接指針:
    • [S_PTR] 包含 PTR 清單的區塊位址
  • 1 - 雙重間接指標:
    • [D_PTR] 包含 S_PTR 清單的區塊位址
  • 1 - 三重間接指標:
    • [T_PTR] 包含 D_PTR 清單的區塊位址

一個指針的數量堵塞取決於區塊大小


目錄

目錄是一個索引節點。它的數據保存有關文件的資訊。每個條目都連結一個名稱和一個索引節點。每個目錄.本身也有 , 並..有效連結到父目錄。這些無法刪除。

根目錄始終在分機上有 inode 2。做stat /cd /; stat .看。它的..連結是.

建立檔案後,它會以芳香方式添加到其正確的目錄中。


索引節點號碼是索引。它們是索引節點表中的有序索引到索引節點結構。由於索引節點結構的大小是固定的,因此可以計算索引節點結構的位置。

由於超級塊有一個每個群組的索引節點可以透過以下方式找到塊組:

block_group = (inode - 1) / inodes_per_group;

然後找到索引:

inode_index = (inode - 1) % inodes_per_group;

閱讀結構和資料連結。讀取資料。

偵錯檔案

可以用來debugfs提取有關檔案系統的各種資訊。

-w如果您關心數據,請確保不使用該標誌。

可以選擇建立一個小樣本來玩。

truncate -s 2M test
mkfs.ext4 -F test
mkdir x
sudo mount test x
sudo chown me x
cd x
echo "Hello Disk" >hello.txt
mkdir a b c
echo "Hello Bee" >b/hib.txt
sudo unount x
debugfs test

輸入?命令列表。


debugfs: stats(縮小)

Inode count:              256
Block count:              2048
Reserved block count:     102
Free blocks:              953
Free inodes:              240
First block:              1
Block size:               1024
Fragment size:            1024
Group descriptor size:    64
Blocks per group:         8192
Inodes per group:         256
Inode blocks per group:   32
First inode:              11
Inode size:               128
Directories:              5
 Group  0: block bitmap at 18, inode bitmap at 34, inode table at 50
           953 free blocks, 240 free inodes, 5 used directories, 240 unused inodes
           [Checksum 0x055a]
...
debugfs:  imap hello.txt
Inode 12 is part of block group 0
    located at block 51, offset 0x0180

其他例子: https://www.cs.montana.edu/courses/309/topics/4-disks/debugfs_example.html

相關內容