![操作系统如何访问存储在硬盘上的文件?](https://linux22.com/image/191867/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%A6%82%E4%BD%95%E8%AE%BF%E9%97%AE%E5%AD%98%E5%82%A8%E5%9C%A8%E7%A1%AC%E7%9B%98%E4%B8%8A%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我知道操作系统在硬盘上访问的第一个东西是超级块。
但然后呢?
答案1
操作系统依赖于内核,而内核又使用各种文件系统的驱动程序进行读/写。文件的处理是通过驱动程序和系统调用通过接口进行抽象的,因此当您说open("file.txt")
您不需要知道文件如何存储在磁盘上等时。文件系统有很多种,每种都有自己的方式处理事情的方法。这是 ext 系统上的通用片段。
分机示例。
- 积木: 磁盘分为积木的连续空间。
- 块组:块被分成组。
- 索引节点:有关条目(例如文件、目录等)的结构化信息集。
- 目录: 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