目录

1.实验1: 格式化U盘为ext2文件系统

First inode

2.实验2: 超级块的重要性

存入文件

破坏主超级块

主超级块存放的位置

人为修改超级块的数据

​编辑

分析超级块信息的方法

超级块的分类

主超级块

备份超级块

两种超级块之间的关系

修改超级块的数据

发现U盘文件系统损坏

从备份的超级块中恢复主超级块

方法1: 使用e2fsck命令

方法2: 使用dd命令按扇区级别写入

EXT2文件系统分区恢复正常


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
264760Unused - 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的文件内容是正常的

更多推荐