「Ext4」- 找到受坏块影响的文件 @20210419

问题描述

若是在物理磁盘中出现了坏块,那么使用该坏块的文件将没法正常读取(好比在复制时会显示I/O错误)。那么咱们该如何定位受坏块影响的文件呢?node

本文将经过一系列方法在文件系统中找到受坏块影响的文件。linux

注意事项

进行坏块检测是文件系统无关的,而文件定位是文件系统相关的。因此,不一样文件系统要使用不一样处理工具。例如,在ext2/ext3/ext4中使用debugfs命令,而其余的文件系统要使用其余工具。ide

针对磁盘操做具备必定的危险性,注意数据备份!!!工具

本文内容是对「archlinux/Identify damaged files」的学习与整理,并未进行实际操做与验证。咱们的目的是了解”查找受坏块影响的文件的“方法。学习

环境概述

本文是针对Ext4文件系统。debug

肯定文件系统的块大小

使用tune2fs命令肯定文件系统块大小:调试

#!/bin/sh

tune2fs -l /dev/sdxy | grep -i Block

找到文件系统的坏块值

你可能已经使用badblock命令找到坏块值,可是该值不必定是文件系统坏块值。这是因为badblock命令所使用的块大小,与文件系统的块大小不一样(或者说不必定相同)。因此有如下两个选择。日志

使用相同块大小

#!/bin/sh

badblock -b "<file system block size>" -v /dev/sdxy

该命令扫描特定分区,而且使用文件系统块大小,因此输出的坏块位置便是文件系统中的坏块值。it

使用不一样块大小

若是已经使用badblock扫描磁盘,可是扫描时的块大小并非文件系统的块大小,则须要进行转换:class

	(original block number) / (filesystem_block_size / badblocks_block_size)
	original block number * badblocks_block_size / filesystem_block_size

上面的两个公式是等价的,都基于「相同位置 = 块位置 x 块大小 = 文件系统块大小 * 文件系统块位置」这一点。

开始文件系统调试

进入debugfs交互模式

执行debugfs命令,进入debugfs的交互模式:

# debugfs
debugfs 1.45.4 (23-Sep-2019)
debugfs: open /dev/sdxy


ncheck inodenumber

打开分区

debugfs的交互模式中,使用open命令打开分区:

debugfs: open /dev/sdxy

获取特定块的信息

而后,使用debugfstestb命令获取坏块的信息:

debugfs: testb <blocknumber>

!!!将<blocknumber>替换为前面获得的坏块值。

若是debugfs提示块未被使用,则表示该块出于空闲状态。也就是说,目前没有文件被该块损坏。这是一个好消息。

获取inode值

若是debugfs提示块已被使用,则须要使用以下命令获取对应的inode值:

debugfs: icheck <blocknumber>

该命令将会返回两个值:「块值」与「inode值」。

得到文件名(最终步骤)

debugfs: ncheck <inodenumber>

<inodenumber>替换为上面icheck输出的第二个值。

例外状况

若是inode很是小而且ncheck没法返回文件名,那么多是日志(journal)自己损坏。经过运行下面命令删除日志:

#!/bin/sh

tune2fs -O ^has_journal /dev/sdxy

再次运行testb命令:

debugfs: testb <blocknumber>

若是确实被日志使用,因为前面清除动做,则上述命令执行后应该提示块未被使用。

构建新的日志:

#!/bin/sh

tune2fs -j /dev/sdxy

 

参考文献

archlinux/Identify damaged filesFind which files are affected by bad blocks on ext4 filesystem

相关文章
相关标签/搜索