我有一个非常基本的系统,运行 Ubuntu 16.04,1 个硬盘,运行几个分区:
sda1-EXT4-100G-/ sda2 - EXT4 - 723.5G - /主页 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:通信 rm:pblk 0 坏头/范围:无效魔法 - 魔法 0,条目 0,最大值 0(0),深度 0(0) 中止设备 sda2-8 上的日志。 EXT4-fs(sda2):以只读方式重新挂载文件系统 EXT4-fs 错误(设备 sda2):ext4_ext_check_inode:497:inode#1417:通信 rm:pblk 0 坏头/范围:无效魔法 - 魔法 0,条目 0,最大值 0(0),深度 0(0) EXT4-fs 错误(设备 sda2):ext4_ext_check_inode:497:inode#1416:通信 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
文件夹,但每次我尝试这样做时,它都会失败并变成只读。
我该如何修复此问题而无需重新格式化整个/home
驱动器?
编辑1:
我badblocks -v /dev/sda2
在我的硬盘上运行了它,但结果很干净,没有坏块。任何帮助仍然会非常感激。
编辑2:
仍在寻找解决方案。以下信息可能有用:
$ debugfs -R 'stat <1415>' /dev/sda2 debugfs 1.42.13(2015年5月17日) Inode: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 mtime:0x5639ad86——2015 年 11 月 4 日星期三 01:02:30 额外 inode 字段的大小:0 范围:
现在我自己查看了这个,并将其与我怀疑未损坏的 inode 进行了比较:
$ debugfs -R 'stat <1410>' /dev/sda2 debugfs 1.42.13(2015年5月17日) Inode: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 mtime:0x5639ad31——2015 年 11 月 4 日星期三 01:01:05 额外 inode 字段的大小:0 范围: (0):46679378
我用粗体标出了我认为的关键差异。我查看了其他未损坏的 inode,它们显示的内容与1410
具有非零大小和范围的内容类似。
坏的标题/范围在这里是有意义的...它没有范围....我该如何解决这个问题?
我真的觉得我把这个问题交给了一个比我更聪明的人,我只是不知道答案是什么!
答案1
最后从另一个网站上的其他人那里找到了答案,只需将 inode 清零并重新检查系统,就这样!
调试文件系统-w /dev/sda2 :clri <1415> :clri <1416> :clri <1417> :问 fsck -y /dev/sda2
对于遇到此问题的任何人来说,我发现我的坏 inodefind
在坏的挂载上使用,然后检查dmesg
坏 inode 上是否存在错误。