我有一个运行 Ubuntu 16.04 的非常基本的系统(这个问题不是特定于 Ubuntu,而是特定于ext4
分区),1 个 HDD,运行几个分区:
sda1-EXT4-100G-/ sda2 - EXT4 - 723.5G - /home sda3-NTFS-100G-(Windows) sda5-交换-8G
每当我尝试访问/home
分区中特定目录中的 3-4 个文件之一(导致问题的特定文件夹是/home/path/to/broken/folder
)时,该/home
分区就会出错并以只读方式重新挂载。dmesg
显示以下错误:
EXT4-fs 错误(设备 sda2):ext4_ext_check_inode:497:inode第1415章: comm rm: pblk 0 错误标头/范围:无效魔法 - 魔法 0、条目 0、最大 0(0)、深度 0(0) 正在中止设备 sda2-8 上的日志。 EXT4-fs (sda2):以只读方式重新挂载文件系统 EXT4-fs 错误(设备 sda2):ext4_ext_check_inode:497:inode第1417章: comm rm: pblk 0 错误标头/范围:无效魔法 - 魔法 0、条目 0、最大 0(0)、深度 0(0) EXT4-fs 错误(设备 sda2):ext4_ext_check_inode:497:inode第1416章: comm rm: pblk 0 错误标头/范围:无效魔法 - 魔法 0、条目 0、最大 0(0)、深度 0(0)
所以我明白发生了什么......一些坏块导致错误并正在以只读方式重新安装驱动器以防止进一步损坏。我知道是这些特定文件,因为我可以通过以下方式撤消错误
- 以 root 身份登录
- 跑步
sync
- 停止
lightdm
(以及所有子进程) /home
通过查找它们来停止所有剩余的打开文件lsof | grep /home
- 卸载
/home
- 运行
fsck /home
(修复错误) - 重新安装
/home
一切又好起来了,读书写字,直到我尝试再次访问相同的文件,然后重复整个过程以再次修复它。
我尝试访问文件的方式是通过运行ls /home/path/to/broken/folder
和rm -r /home/path/to/broken/folder
,因此似乎对驱动器该部分的任何类型的 HDD 操作都会出错并再次将其置于只读状态。
老实说,我并不关心这些文件,我只是希望它们消失。我愿意删除整个/home/path/to/broken/folder
文件夹,但每次尝试此操作时,它都会失败并陷入只读状态。
我badblocks -v /dev/sda2
在硬盘上运行,但结果是干净的,没有坏块。任何帮助仍然将不胜感激。
仍在寻找解决方案。以下一些可能有用的信息:
$ debugfs -R 'stat <1415>' /dev/sda2 debugfs 1.42.13(2015 年 5 月 17 日) 索引节点:1415 类型:常规模式:0644 标志:0x80000 代:0 版本:0x00000000 用户:0 组:0 大小:0 文件 ACL:0 目录 ACL:0 链接:1 块数:0 片段: 地址:0 数量:0 大小:0 ctime: 0x5639ad86 -- 2015 年 11 月 4 日星期三 01:02:30 atime: 0x5639ad86 -- 2015 年 11 月 4 日星期三 01:02:30 时间: 0x5639ad86 -- 2015 年 11 月 4 日星期三 01:02:30 额外索引节点字段的大小:0 范围:
现在我自己查看了这个并将其与我怀疑的未损坏的索引节点进行了比较:
$ debugfs -R 'stat <1410>' /dev/sda2 debugfs 1.42.13(2015 年 5 月 17 日) 索引节点:1410 类型:常规模式:0644 标志:0x80000 代:0 版本:0x00000000 用户: 0 组: 0 大小:996 文件 ACL:0 目录 ACL:0 链接:1 块数:0 片段: 地址:0 数量:0 大小:0 ctime: 0x5639ad31 -- 2015 年 11 月 4 日星期三 01:01:05 atime: 0x5639ad31 -- 2015 年 11 月 4 日星期三 01:01:05 时间: 0x5639ad31 -- 2015 年 11 月 4 日星期三 01:01:05 额外索引节点字段的大小:0 范围: (0):46679378
我已将我认为的关键差异加粗。我查看了其他未损坏的索引节点,它们显示的内容类似于1410
具有非零大小和范围的内容。
错误的标头/范围在这里有意义...它没有范围...如何在不重新格式化整个/home
分区的情况下修复此问题?
我真的感觉这个问题已经交给了一个比我更聪明的人,我只是不知道这顿饭(答案)是什么!
答案1
终于在另一个站点上找到了其他人的答案,只需将索引节点归零并重新检查系统,仅此而已!
debugfs -w /dev/sda2 :clri<1415> :clri <1416> :clri<1417> :q fsck -y /dev/sda2
对于遇到此问题的其他人,我发现我的坏 inodefind
在坏安装上使用,然后检查dmesg
坏 inode 上的错误。