1.搭建实验环境
在虚拟机里添加一块10G的磁盘
2.分区和格式化
a. [root@localhost /]# fdisk /dev/sdd------划分一个分区出来,进行实验
Device Boot Start End Blocks Id System
/dev/sdd1 1 1 8001 83 Linux
Command (m for help): w
The partition table has been altered!
b.[root@localhost /]# mkfs.ext4 /dev/sdd1-----格式化成ext4的文件系统
c.[root@localhost /]# mkdir /test
root@localhost /]# mount /dev/sdd1 /test-----创建挂载点,把块设备挂载到目录下
d.[root@localhost test]# dumpe2fs /dev/sdd1-----查看inode的数量
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 2000
Block count: 8000
Reserved block count: 400
Free blocks: 6676
Free inodes: 1989-----此项
e.进入test目录,写一个简单的shell脚本来耗尽所有inode
vi test.sh
-
#!/bin/bash
-
for i in {1..1989}
-
do
-
touch linux$i &
-
done
chmod +x test.sh;./test.sh
现象为:
[root@localhost test]# touch: cannot touch `linux1986': No space left on device
^C
[root@localhost test]# touch e
touch: cannot touch `e': No space left on device
已经无法写入文件!
[root@localhost test]# df -Th------查看分区使用情况,sdd1剩余空间却无法写入文件
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda5 ext4 17G 867M 15G 6% /
tmpfs tmpfs 495M 0 495M 0% /dev/shm
/dev/sda1 ext4 485M 31M 429M 7% /boot
/dev/sda3 ext4 1008M 34M 924M 4% /home
/dev/sr0 iso9660 4.2G 4.2G 0 100% /iso
/dev/sdd1 ext4 7.6M 1.1M 6.1M 16% /test
3.superblock的破坏与恢复
a.[root@localhost /]# mkfs.ext4 /dev/sdd1-----重新格式化sdd1块设备
[root@localhost /]# mkfs.ext4 /dev/sdd1----查看超级块
[root@localhost /]# df -Th
ilesystem Type Size Used Avail Use% Mounted on
/dev/sda5 ext4 17G 867M 15G 6% /
tmpfs tmpfs 495M 0 495M 0% /dev/shm
/dev/sda1 ext4 485M 31M 429M 7% /boot
/dev/sda3 ext4 1008M 34M 924M 4% /home
/dev/sr0 iso9660 4.2G 4.2G 0 100% /iso
/dev/sdd1 ext4 7.6M 1.1M 6.2M 15% /test
b. [root@localhost /]# dd if=/dev/zero of=/dev/sdd1 bs=512 count=8
8+0 records in
8+0 records out
4096 bytes (4.1 kB) copied, 0.0015765 s, 2.6 MB/s
[root@localhost /]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda5 ext4 17G 867M 15G 6% /
tmpfs tmpfs 495M 0 495M 0% /dev/shm
/dev/sda1 ext4 485M 31M 429M 7% /boot
/dev/sda3 ext4 1008M 34M 924M 4% /home
/dev/sr0 iso9660 4.2G 4.2G 0 100% /iso
/dev/sdd1 ext4 16Z 16Z 6.6M 100% /test
[root@localhost /]# ----用dd命令填入第一个块4K的0后,分区使用率达到了100%,超级块在data block 的第一块。
c.恢复
[root@localhost /]# umount /test----先卸载
[root@localhost /]# mount /dev/sdd1 /test
mount: you must specify the filesystem type---再挂载时,文件系统出了问题
[root@localhost /]# dumpe2fs /dev/sdd1|more
dumpe2fs 1.41.12 (17-May-2010)
dumpe2fs: Bad magic number in super-block while trying to open /dev/sdd1
Couldn't find valid filesystem superblock.
[root@localhost /]# fsck /dev/sdd1----修复超级块,当文件系统,块足够多时,超级块不止存在在第一个块,他会备份到一些block group 的块中,所以用
这个命令即可将其他block group 中的超级块数据还原出来。mount 重新挂载即可。
d.superblock(超级块):记录此 file system 的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式
4.破坏/boot分区对应的磁盘分区(超级块)
a.[root@localhost /]# dd if=/dev/zero of=/dev/sda1 bs=512 count=8
b.重启进入营救模式
挂载光盘iso镜像,进入营救模式
fsck -y /dev/sda1恢复超级块,重启,恢复正常。
5.破坏/boot分区对应磁盘分区(inode)
a. 进入boot目录,编写测试脚本参上,修改free inodes即可
b.营救模式下,创建一个目录,挂载/dev/sda1到此目录,进入此目录,进入/boot,编写删除脚本
#!/bin/bash
for i in {1..127978}
do
rm -rf linux$i &
done
或者进入挂载后的boot目录:rm -rf linux*也可。
-----即可修复
6.破坏/分区对应的磁盘分区(超级块)
方法同上
注:
问题:破坏lvm类型分区的/文件系统的时候,修复不了
解决:首先破坏/dev/sda2不正确,牵涉到pv的问题,pv创建vg,然后创建lv ,破坏了sda2对应的pv就等于破坏了swap分区和/分区对应的lv,应该去破坏 lv,不是直接破坏磁盘的sda2分区。然后去修复lv就可以了