访问特定文件时出现分区错误并重新以只读方式挂载

访问特定文件时出现分区错误并重新以只读方式挂载

我有一个非常基本的系统,运行 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)

所以我明白发生了什么……一些坏块导致错误,并正在以只读方式重新安装驱动器以防止进一步损坏。我知道这是这些特定文件,因为我可以通过以下方式撤消错误

  1. 以 root 身份登录
  2. 跑步sync
  3. 停止lightdm(及所有子流程)
  4. /home通过使用以下方法查找所有剩余打开的文件来停止它们lsof | grep /home
  5. 卸载/home
  6. 运行fsck /home(修复错误)
  7. 重新挂载/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 上是否存在错误。

相关内容