OS38.【Linux】EXT2文件系统实验1 格式化+超级块的重要性
目录
1.实验1: 格式化U盘为ext2文件系统
博主准备了一个厂商标记为8GB的空U盘
进入Linux mint桌面系统,打开终端
1.格式化U盘前一定要先确认U盘挂载的位置,看清楚,不要格式化错盘了!
lsblk -p

得知U盘挂载在/dev/sdb处
2.卸载挂载点,防止操作系统占用,需要root权限
sudo umount /dev/sdb*

3.先备份U盘的数据,之后对该U盘格式化为EXT2文件系统,需要root权限
sudo mkfs.ext2 /dev/sdb

无论如何也要继续?(y,N) 输入y
运行结果:

1.每块4K
1966080个块,那么一共1966080*4K=7864320K=7680M=7.5G
2.inode编号的个数在分区被格式化时就已经写死了,无法修改
3.超级块被备份了多份,足见超级块在文件系统中的重要性
4.tune2fs命令查看创建好的文件系统的详细信息
tune2fs -l /dev/sdb

得知
1.该文件系统的魔数为0xEF53
该魔数标识EXT2或EXT3文件系统,放在0x438处(参考资料: https://comp.os.linux.misc.narkive.com/Mree4Eax/file-systems-magic-number)
可以使用hexdump命令查看U盘的数据
读取U盘的前2048个字节
hexdump -C -n 2048 /dev/sdb
2.预留块的个数为98304
3.First inode: 指第一个非保留的inode号,该处是11
4.不是每个块组都有备份的超级块
早期Linux的EXT2文件系统中,每个块组的最开始处都都是超级块,但这样有些浪费空间,因此之后的EXT2文件系统版本选择一些特定的块组备份超级块
First inode
First inode指的是第一个非保留的inode号,即第一个可以被普通文件或目录使用的inode编号
2.实验2: 超级块的重要性
存入文件
向实验1格式化好的EXT2文件系统分区中存入一个test.txt文本文件:

![]()
第一个非保留的inode号是11,但是发现test.txt的inode编号并不是11:

lost+found是EXT2文件系统的一个特殊目录,
在网站有采纳的回答:

提炼重要的信息:
某些有问题的文件系统会出现有inode但没有文件名的一些文件,文件内容还在分区上,这些文件在正常访问文件系统的时候是看不到的
可以使用fsck命令来解决上述问题,其作用是检查和修复文件系统,会将上述说到的有问题的文件会变回正常的文件,存储在lost+found目录下
注: 出现在lost+found目录中的文件通常是已经取消链接的文件,即它们的名称已被删除,但在系统突然停止(例如内核死机或电源故障)时仍被某个进程打开,因此数据尚未被删除
如果意外删除了lost+found目录,不要使用mkdir重新创建,使用mklost+fond命令!
那inode编号为12对应的苏哪个文件呢?
用find命令搜索inode编号为12的文件:
find <搜索路径> -inum <inode号码>
但没有显示任何结果:
![]()
结论: 文件分配到的inode编号不一定是连续的
破坏主超级块
主超级块存放的位置
需要知道主超级块存储在U盘的哪个位置,占用多少字节
《The Second Extended File System Internal Layout Dave Poirier <ekscrypto@gmail.com>》Chapter 2. Definitions Superblocks给出了主超级块存放的位置:设备开始的,偏移为1024字节处

《The Second Extended File System Internal Layout Dave Poirier <ekscrypto@gmail.com>》Chapter 3. Disk Organization Superblock Table 3.3. Superblock Structure给出了超级块的大小:
注:表种Offset(bytes)一列的数据是十进制的

表的最底下是:
| Offset (bytes) | Size (bytes) | Description |
| 264 | 760 | Unused - reserved for future revisions |
从264字节开始,存放大小为760字节的未使用区域,那么264+760==1024字节就是主超级块的大小,占用两个逻辑扇区
人为修改超级块的数据
Windows上以管理员运行SectorEditor.exe工具(需要访问互联网下载)以十六进进制按扇区打开U盘的数据:
第0x0扇区和第0x1扇区都是全0字节


原因:从《Understanding The Linux Kernel》书的CHAPTER 18 The Ext2 and Ext3 Filesystems
的Figure 18-1. Layouts of an Ext2 partition and of an Ext2 block group图得知:前两个扇区是留给启动块Boot Block的

主超级块存放在第0x2和0x3扇区:

分析超级块信息的方法
例如从第0x2扇区的偏移量为0x0088处开始存放的是字符串"/media/zhang/b99a92c4-6769-4e57-b5cf-ab8d1b986f31"字符串
0x0088是十进制的136,对照Table 3.3. Superblock Structure的描述:
表示最后挂载的位置

Windows上可以用Active@ Partition Manager看看超级块的信息:
首先来到主界面:
之后选中U盘,右击选择"Edit Boot Records..."

下面画红框的部分是超级块的信息:

可以使用SectorEditor.exe验证:

超级块的分类
分两类: 1.主超级块 2.备份超级块
主超级块
主超级块的位置紧邻启动块,即编号为0的块组中的超级块

备份超级块
文章上面给出了备份超级块的块号:
![]()
使用SectorEditor.exe找到32768号块,默认每个块的大小是4KB,看看是不是备份的超级块
算出32768号块位于的扇区:
4KB=1024*4B=4096B
由于一个扇区占用512字节,那么在第32768*4096B/512B=262144扇区
使用SectorEditor.exe的指定扇区功能


两种超级块之间的关系
从上图会发现: 备份的超级块不是对主超级块的完全拷贝(即不是逐字节的精确拷贝),只拷贝了关键的信息.
进一步得出: 主超级块拷贝了备份超级块的内容,然后主超极块在此基础上修改,可以理解为主超级块继承了备份超级块的信息
其次分区在使用时,主超级块的内容是动态变化的
Active@ Partition Manager给出主超级块和备份超级块的区别:
因为分区在使用时,用户可能会创建新文件,这会导致"Free blocks count"和"Free inodes count"字段的值减小,那么需要修改主超级块,这样主超级块就和备份超级块的内容有一些不同了

使用SectorEditor.exe找到98304号块,那么在第786432扇区:

会发现: 备份的超级块之间的数据是相同的
修改超级块的数据
使用SectorEditor.exe的批量填充功能,将超级块的内容清零:

点击确定:



发现U盘文件系统损坏
查看U盘是否正常挂载:
dmesg

lsblk

系统识别了U盘,挂载在sdb处
使用fdisk的-l选项查看U盘的分区表:
fdisk -l

发现U盘的文件系统无法识别,因此U盘的文件系统处于损坏状态
从备份的超级块中恢复主超级块
方法1: 使用e2fsck命令
使用e2fsck命令的-b选项指定备份超级块来恢复主超级块

文章上面给出了备份超级块的块号,任意选一个来恢复主超级块:

e2fsck -b /dev/sdb

方法2: 使用dd命令按扇区级别写入
dd命令的选项比较多,分析需要用到那些选项
目的:
由于超级块占两个扇区,那么:
1.将U盘的262144号扇区的数据复制到2号扇区
2.将U盘的262145号扇区的数据复制到3号扇区
由于一切皆文件,那么U盘设备也是文件,需要给出需要复制的文件和需要写入的文件,在这里它们都是U盘文件,那么:

if=/dev/sdb of=/dev/sdb
扇区实际上是一些数据的集合,那么需要告知dd命令扇区的大小:

bs=512 #一个数据块的大小是512字节
还需要告知dd命令写入多少个扇区:
![]()
由于超级块占两个扇区,那么:
count=2
还需要告知从需要复制的文件的哪个位置开始复制
![]()
skip=262144 #跳过前262144个扇区
还需要告知从需要写入的文件的哪个位置开始写入
![]()
seek=2 #跳过前2个扇区
完整的命令为
dd bs=512 if=/dev/sdb skip=262144 of=/dev/sdb seek=2 count=2

EXT2文件系统分区恢复正常
正常打开U盘:

test.txt的文件内容是正常的

更多推荐



所有评论(0)