今天我们来聊聊,文件系统的修复:
文件系统损坏,多是由于突然断电或者设备读写数据异常等原因导致的文件系统损坏。
也遇到过文件系统变为只读,一般是因为多机写入时同步机制出现问题,或者单机写入时断电。
常见使用的修复命令为: fsck
本文采用的系统为:
[root@xinsz08-15 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@xinsz08-15 ~]# uname -r
2.6.32-696.el6.x86_64
增加了一块硬盘方便做实验用
这种情况我们可以修改/etc/fstab文件,将受损的文件的开机自动挂载先注释掉,然后使用rw的方式进行挂载。
mount -o remount rw /dev/sdb1 /mnt
实验步骤:
a. 创建一个1G的分区
b. 对分区进行格式化
c. 破坏文件系统并重新挂载
d. 修复超级快
e.查看修复成功的效果
[root@xinsz08-15 ~]# fdisk /dev/sdb
[root@xinsz08-15 ~]# mkfs.ext4 /dev/sdb1
[root@xinsz08-15 ~]# ll /dev/sdb*
brw-rw---- 1 root disk 8, 16 7月 1 22:59 /dev/sdb
brw-rw---- 1 root disk 8, 17 7月 1 23:01 /dev/sdb1
[root@xinsz08-15 ~]# mkdir /sdb1
[root@xinsz08-15 ~]# mount /dev/sdb1 /sdb1 ##挂载分区
[root@xinsz08-15 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 5.5G 13G 31% /
tmpfs 491M 72K 491M 1% /dev/shm
/dev/sda1 190M 35M 146M 20% /boot
/dev/sdb1 988M 1.3M 935M 1% /sdb1
查看是否可以写入内容
[root@xinsz08-15 ~]# cp /etc/passwd /sdb1/
[root@xinsz08-15 ~]# cd /sdb1/
[root@xinsz08-15 sdb1]# ls
lost+found passwd
[root@xinsz08-15 sdb1]#
[root@xinsz08-15 ~]# dd if=/dev/zero of=/dev/sdb1 bs=512 count=4
记录了4+0 的读入
记录了4+0 的写出
2048字节(2.0 kB)已复制,0.00266775 秒,768 kB/秒
[root@xinsz08-15 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 5.5G 13G 31% /
tmpfs 491M 72K 491M 1% /dev/shm
/dev/sda1 190M 35M 146M 20% /boot
/dev/sdb1 64Z 64Z 986M 100% /sdb1
可以看到 /dev/sdb1的大小变成了64Z ,我们看看还能否写入
[root@xinsz08-15 sdb1]# touch aaa
touch: 无法创建"aaa": 输入/输出错误
[root@xinsz08-15 sdb1]# pwd
/sdb1
可以看到已经无法写入了,现在我们进入下一步开始修复,使用fsck命令
[root@xinsz08-15 ~]# umount /dev/sdb1 #切记一定要先卸载在修复
[root@xinsz08-15 ~]# fsck -y -t ext4 /dev/sdb1
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
fsck.ext4: 超级块无效, trying backup blocks...
超级块 needs_recovery flag is clear, but 日志 has data.
Recovery flag not set in backup 超级块, so running 日志 anyway.
/dev/sdb1: 正在修复日志
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
Free 块s count wrong for 簇 #1 (32702, counted=32701).
处理? 是
Free 块s count wrong (252369, counted=252368).
处理? 是
Free inodes count wrong for 簇 #0 (7365, counted=7364).
处理? 是
Free inodes count wrong (66373, counted=66372).
处理? 是
/dev/sdb1: ***** 文件系统已修改 *****
/dev/sdb1: 12/66384 files (0.0% non-contiguous), 12696/265064 blocks
[root@xinsz08-15 ~]#
可以看到文件系统已修复的提示,我们重新挂载来试一下
[root@xinsz08-15 ~]# mount /dev/sdb1 /sdb1 ##挂载
[root@xinsz08-15 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 5.5G 13G 31% /
tmpfs 491M 72K 491M 1% /dev/shm
/dev/sda1 190M 35M 146M 20% /boot
/dev/sdb1 988M 1.3M 935M 1% /sdb1
[root@xinsz08-15 ~]# cd /sdb1
[root@xinsz08-15 sdb1]# touch aaa #可以看到已经能够重新创建文件
[root@xinsz08-15 sdb1]# ls
aaa lost+found passwd
[root@xinsz08-15 sdb1]#
作用: 用来检查和维护不一致的文件系统,若系统断电或者磁盘发生异常,可以使用fsck 来检查和修复
常见的参数
参数 | 作用 |
---|---|
a | 自动修复文件系统,不询问任何问题 |
A | 依照/etc/fstab配置文件内容,检查文件内所列的全部文件系统 |
P | 与-A搭配使用,会检查所有的文件系统 |
-r | 互动模式,让用户确认 |
-t | 指定要检查的文件系统类型 |
-V | 显示指令执行的过程 |
-y | 关闭互动模式 |
-f | 强制检查 |
-C | 显示完整的检查进度 |
-p | 自动修复文件系统的错误 |
[root@xinsz08-15 sdb1]# fsck /dev/sdb1
[root@xinsz08-15 sdb1]# fsck -f /dev/sdb1
[root@xinsz08-15 sdb1]# fsck -t ext4 -a /dev/sdb1
特别说明的是尽量不要使用 -f -y 这样的强制自动修复功能,或者fsck 提示大量的inode错误,就不要强制修复了,需要以只读的方式仔细查看修复过程。
我是高胜寒,一个在教培行业不忘初心的人。欢迎点赞收藏,我们下篇文章见!