国家优质校建设网站网站文章超链接怎么做
前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君**耐其心性,忘却杂尘,道有所长!!!!
《C语言》
《C++深度学习》
《Linux》
《数据结构》
《数学建模》
文章目录
- 1. 初识文件系统:硬盘的"整理术"
- 1.1 分区:给仓库画格子
- 1.2 数据块:文件内容的"集装箱"
- 2. inode:文件的"身份证"
- 2.1 inode的关键特性
- 2.2 查看inode的命令
- 3. 目录:文件名的"通讯录"
- 3.1 目录的inode和数据块
- 3.2 路径解析:从"/"到文件
- 4. 超级块(Super Block):文件系统的"户口本"
- 4.1 为什么需要备份超级块?
- 4.2 查看超级块信息
- 5. 挂载:给分区"安个门牌号"
- 5.1 挂载步骤示例
- 5.2 开机自动挂载
- 6. 软硬链接:文件的"分身术"
- 6.1 软链接(符号链接):快捷方式
- 6.2 硬链接:文件别名
- 6.3 链接数的奥秘
- 7. 内核的小优化:dentry缓存
- 总结:文件系统的核心逻辑
- 1.3 磁盘物理结构与分区表
- 2.3 inode的15个指针
- 3.3 块组的6大组成部分
- 4.3 目录项缓存(dentry cache)
- 5.3 VFS:虚拟文件系统
- 6.3 硬链接数实验
- 7.1 Super Block损坏修复
1. 初识文件系统:硬盘的"整理术"
想象你有一个巨大的仓库(硬盘),要存放各种箱子(文件)。如果随便堆放在一起,找东西会很麻烦。文件系统就是给仓库画格子、贴标签的"整理术",让每个文件都有自己的位置和编号。
1.1 分区:给仓库画格子
硬盘需要先分成多个分区(类似仓库的不同区域),每个分区独立管理。分区后还需要格式化——写入文件系统的"管理规则",包括:
- 数据块(存放文件内容的4KB小格子)
- inode(文件的身份证,记录属性和数据块位置)
- 超级块(整个分区的"户口本")
1.2 数据块:文件内容的"集装箱"
所有文件内容都存在数据块(Data Blocks)中,每个块固定4KB大小。小文件可能占1块,大文件会占用多个块,这些块可以分散在磁盘的不同位置。
2. inode:文件的"身份证"
每个文件都有一个inode(索引节点),相当于"身份证",包含:
- 文件大小、权限、创建时间等属性
- 指向数据块的指针(告诉系统去哪里找内容)
2.1 inode的关键特性
- 唯一编号:每个分区内inode编号唯一,类似身份证号
- 跨区编号:inode和数据块在整个分区内统一编号(如1-10000)
- 不能跨分区:inode编号只在本分区有效,就像小区门牌号不能跨小区使用
2.2 查看inode的命令
ls -i filename # 查看文件的inode编号
stat filename # 查看inode详细属性
执行效果:
12345 filename # ls -i输出,12345是inode编号
3. 目录:文件名的"通讯录"
你可能会问:文件名存在哪里?
答案是:目录里。目录本身也是一种特殊文件,它的inode指向的数据块中,存储着"文件名→inode编号"的映射表,就像通讯录记录"姓名→电话"。
3.1 目录的inode和数据块
- 目录的数据块内容示例:
. → inode 100 (当前目录自身) .. → inode 50 (父目录) file1.txt → inode 12345 doc/ → inode 67890
3.2 路径解析:从"/"到文件
找文件的过程就像查地图:
- 从根目录(/)开始,根目录的inode编号是固定的(通常是2)
- 逐层解析路径(如
/home/user/file.txt
) - 每个目录的"通讯录"找到下一级目录/文件的inode
- 最终通过目标文件的inode找到数据块
4. 超级块(Super Block):文件系统的"户口本"
超级块存储整个分区的关键信息:
- 总块数、空闲块数、inode总数
- 块大小、inode大小、挂载时间
4.1 为什么需要备份超级块?
超级块一旦损坏,整个分区的数据可能丢失!因此系统会在多个分组中备份超级块,就像重要文件多存几份副本。
4.2 查看超级块信息
dumpe2fs /dev/sda1 | grep -i superblock # 查看ext系列文件系统的超级块
5. 挂载:给分区"安个门牌号"
硬盘分区就像未开封的快递箱,需要挂载到一个目录(挂载点)才能使用,这个目录就成了分区的"门牌号"。
5.1 挂载步骤示例
# 1. 创建挂载点目录
mkdir /mnt/mydisk# 2. 将/dev/sdb1分区挂载到/mnt/mydisk
mount /dev/sdb1 /mnt/mydisk# 3. 查看挂载情况
df -h # 显示分区使用情况
mount # 列出所有挂载点
5.2 开机自动挂载
修改/etc/fstab
文件(需root权限):
# 格式:设备路径 挂载点 文件系统类型 选项 备份 自检
/dev/sdb1 /mnt/mydisk ext4 defaults 0 2
6. 软硬链接:文件的"分身术"
Linux有两种链接方式,就像文件的不同分身术:
6.1 软链接(符号链接):快捷方式
- 相当于Windows的"快捷方式",有独立inode
- 内容存储目标文件的路径,删除原文件后链接失效
ln -s 原文件路径 软链接名 # 创建软链接
ln -s /home/user/file.txt link.txt
6.2 硬链接:文件别名
- 没有独立inode,只是给原文件新增一个文件名(共享inode)
- 原文件删除后,别名仍可访问(需引用计数>0)
ln 原文件路径 硬链接名 # 创建硬链接
ln file.txt hardlink.txt
6.3 链接数的奥秘
- 文件的"链接数"就是指向该inode的文件名数量
- 目录默认链接数是2(
.
和..
),创建子目录后会增加
ls -l # 查看链接数(第2列数字)
# 示例输出:drwxr-xr-x 2 user user 4096 目录(链接数2)
7. 内核的小优化:dentry缓存
操作系统为了加快文件查找速度,会把常用目录的"文件名→inode"映射缓存到内存中,这就是dentry结构体(目录项缓存)。
- 作用:第二次查找同一目录时,直接从内存读取,无需访问磁盘
- 验证:
find
命令第一次慢、第二次快,就是因为dentry缓存生效
总结:文件系统的核心逻辑
- 存储三要素:分区(容器)、inode(身份证)、数据块(内容箱)
- 查找流程:路径→目录→inode→数据块
- 关键技术:挂载(分区入门)、链接(文件分身)、缓存(加速访问)
通过这些机制,Linux能高效管理成千上万的文件,即使你每天用ls
、cd
命令,背后都藏着这些精妙的设计!
1.3 磁盘物理结构与分区表
硬盘的物理结构包括盘片、磁道和扇区,每个扇区通常为512字节。分区是将磁盘划分为独立区域的过程,常见的分区表有两种:
MBR分区表:
- 最多支持4个主分区
- 每个分区最大容量2TB
- 位于磁盘的第一个扇区(512字节)
GPT分区表:
- 支持无限多个分区(取决于操作系统,通常256个)
- 支持大于2TB的分区
- 有备份分区表,提高可靠性
使用gdisk
工具创建GPT分区表的界面,支持大磁盘和多分区
实战代码:创建GPT分区
# 查看磁盘信息
fdisk -l /dev/sdb# 使用gdisk创建GPT分区表
gdisk /dev/sdb
# 按提示操作:o(新建GPT)→ n(新建分区)→ 回车(默认起始扇区)→ +10G(分区大小)→ w(保存)
2.3 inode的15个指针
inode包含15个指针,决定了文件能使用的数据块:
- 前12个直接指针:每个指向一个数据块(4KB),直接访问小文件(≤48KB)
- 一级间接指针:指向一个"指针块",可存储1024个数据块地址(4KB/4B=1024),支持4MB
- 二级间接指针:指向一个"指针块的指针块",支持4GB
- 三级间接指针:指向一个"二级指针块的指针块",支持4TB
inode的多级指针结构,使小文件快速访问,大文件无限扩展
计算最大文件大小:
block_size = 4096 # 4KB/块
direct = 12 * block_size
single = (block_size // 4) * block_size # 1024块
double = (block_size // 4) ** 2 * block_size # 1024²块
triple = (block_size // 4) ** 3 * block_size # 1024³块max_size = direct + single + double + triple
print(f"最大文件大小: {max_size / (1024**4):.2f} TB") # 输出:4.00 TB
3.3 块组的6大组成部分
每个块组就像一个独立的"小区",包含:
- Super Block:小区总览图
- GDT(组描述符表):每个块组的详细信息
- inode位图:记录哪些inode已使用
- 数据块位图:记录哪些数据块已使用
- inode表:存储inode的具体内容
- 数据块:实际存储文件内容
块组的6个组成部分,每个部分负责不同的管理功能
空闲块管理:
数据块位图使用1位表示一个块的状态:
- 0:空闲(可用)
- 1:已占用
例如,一个4KB的位图可以管理32768个数据块(4KB×8=32768位),轻松定位空闲块。
4.3 目录项缓存(dentry cache)
Linux内核为加速路径解析,将常用目录项缓存在内存中,称为dentry缓存:
- 结构:哈希表+链表,支持快速查找和LRU淘汰
- 命中率:缓存命中率高时,文件访问速度显著提升
dentry结构体包含指向inode的指针和目录项关系
验证缓存存在:
# 第一次执行,无缓存,较慢
time find / -name "passwd"# 第二次执行,利用缓存,较快
time find / -name "passwd"
5.3 VFS:虚拟文件系统
VFS是Linux的"文件系统翻译官",使不同文件系统(ext4、xfs等)呈现统一接口:
- 核心对象:超级块对象、inode对象、文件对象、目录项对象
- 作用:用户无需关心底层文件系统类型,统一使用open/read/write等系统调用
VFS位于用户空间和具体文件系统之间,提供统一接口
安全挂载选项:
# 以只读方式挂载U盘,防止病毒写入
mount -o ro /dev/sdb1 /mnt/usb# 禁止在分区上执行程序,提高安全性
mount -o noexec /dev/sdb1 /mnt/usb
6.3 硬链接数实验
创建硬链接后,inode的链接数会增加:
# 创建文件,初始链接数1
touch file.txt
ls -li file.txt # 输出:12345 -rw-r--r-- 1 user user ... file.txt# 创建硬链接,链接数变为2
ln file.txt link.txt
ls -li file.txt link.txt # 两者inode相同,链接数2# 删除原文件,链接数变为1,link.txt仍可访问
rm file.txt
cat link.txt # 仍能读取内容
硬链接创建后,链接数从1变为2,删除原文件后链接数减为1
7.1 Super Block损坏修复
Super Block损坏会导致分区无法挂载,可使用备份恢复:
# 查看分区的超级块备份位置
mke2fs -n /dev/sda1 # 模拟格式化,显示超级块备份信息# 使用备份超级块修复
e2fsck -b 32768 /dev/sda1 # 32768是备份超级块的块地址
Super Block在多个块组中备份,确保损坏后可恢复