操作系统如何访问存储在硬盘上的文件?

操作系统如何访问存储在硬盘上的文件?

我知道操作系统在硬盘上访问的第一个东西是超级块。

但然后呢?

答案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

相关内容