若是在物理磁盘中出现了坏块,那么使用该坏块的文件将没法正常读取(好比在复制时会显示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 1.45.4 (23-Sep-2019) debugfs: open /dev/sdxy ncheck inodenumber
在debugfs的交互模式中,使用open命令打开分区:
debugfs: open /dev/sdxy
而后,使用debugfs的testb命令获取坏块的信息:
debugfs: testb <blocknumber>
!!!将<blocknumber>替换为前面获得的坏块值。
若是debugfs提示块未被使用,则表示该块出于空闲状态。也就是说,目前没有文件被该块损坏。这是一个好消息。
若是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