fsck -p (preen) 在 ext4 上做什么?

fsck -p (preen) 在 ext4 上做什么?

我正在阅读一篇关于文件系统修复的博客文章,作者提出了一个很好的问题……fsck -p应该可以在无需人工干预的情况下自动修复小错误。但是当它被告知要整理文件系统时,它到底会修复什么?它会修复哪些错误,什么会导致它停止并告诉用户他或她必须交互式运行 fsck?有某种清单吗?

我一直在谷歌上搜索,我找到的只是手册页,它并没有真正说明什么-p会修复或什么会触发动手标志。我对 ext4 文件系统特别感兴趣。

答案1

你的问题的答案就在e2fsck/problems.c这个文件里e2fsprogs源代码。寻找PR_PREEN_OK旗帜应该可以帮助您入门。

由于可能会出现多种不同的错误情况,因此完整的错误处理涉及更多一些,因此如果您担心特定情况,建议您仔细查看代码。不过,下面的列表是从错误条件的注释中提取的,应该可以让您大致了解整理模式的效果。

-p当指定标志时,当前会自动处理以下错误/警告:

  • 重新定位提示
  • 日志索引节点无效
  • 日志超级块已损坏
  • Superblock has_journal 标志已清除,但有日志
  • 超级块 need_recovery 标志已设置,但日志不存在
  • 文件系统修订版为 0,但已设置功能标志
  • 外部超级块的超级块提示
  • 组描述符 N 标记为未初始化,没有特征集。
  • N 组块位图未初始化,但 inode 位图正在使用。
  • 组描述符 N 具有无效的未使用 inode 计数。
  • 最后一组块位图未初始化。
  • test_fs 标志已设置(并且 ext4 可用)
  • 上次挂载时间是未来的时间(伪造)
  • 最后写入时间是将来的时间(捏造的)
  • 块组校验和(锁存问题)无效。
  • 根目录已设置 dtime
  • 保留的 inode 模式错误
  • 删除的 inode 的 dtime 为零
  • Inode 正在使用,但 dtime 设置
  • 零长度目录
  • Inode 的 i_size 不正确
  • Inode 有不正确的 i_blocks
  • 组中的坏超级块
  • 组中的坏块组描述符
  • 区块无故被索赔
  • 为重新定位元数据分配块时出错
  • 重定位过程中分配块缓冲区时出错
  • 将元数据组信息从 X 重新定位到 Y
  • 将元数据组信息重新定位到 X
  • 重定位过程中块读取错误
  • 重定位过程中块写入错误
  • 在设备或套接字 inode 上设置的不可变标志
  • 设备、fifo 或套接字 inode 的非零大小
  • 文件系统修订版为 0,但已设置功能标志
  • 日志索引节点未使用,但包含数据
  • 日记的模式很糟糕
  • 在非 HTREE 文件系统上设置 INDEX_FL 标志
  • 在非目录上设置 INDEX_FL 标志
  • HTREE 目录中的根节点无效
  • HTREE 目录中不支持的哈希版本
  • HTREE 根节点中的不兼容标志
  • HTREE 太深
  • 无效的 inode->i_extra_isize
  • 无效的 ea 条目->e_name_len
  • 无效的 ea 条目->e_value_offs
  • 无效的 ea 条目->e_value_block
  • 无效的 ea 条目->e_value_size
  • 无效的 ea 条目->e_hash
  • inode 缺少 EXTENTS_FL,但它是一个盘区 inode
  • Inode 不应设置 EOFBLOCKS_FL
  • 目录条目已删除或未使用的索引节点
  • 未设置目录文件类型
  • 文件系统上设置的目录文件类型
  • HTREE 根节点无效
  • HTREE 限制无效
  • HTREE 计数无效
  • HTREE 内部节点表中的哈希值无序
  • 在设置了 _INODE_UNINIT 的组​​中找到索引节点
  • 在组未使用的索引节点区域中找到索引节点
  • i_blocks_hi 应该为零
  • /lost+found 未找到
  • 未附加的零长度索引节点
  • 索引节点引用计数错误
  • 未设置 inode 位图末尾的填充。
  • 未设置块位图末尾的填充。
  • 块位图差异标头
  • 未使用的块,但在位图中标记
  • 已使用块,但位图中未标记已使用
  • 块位图差异结束
  • inode 位图差异标头
  • 索引节点未使用,但在位图中标记
  • 已使用索引节点,但位图中未标记已使用
  • inode 位图差异结束
  • 组的空闲 inode 计数错误
  • 目录计数为组错误
  • 空闲 inode 计数错误
  • 组的空闲块计数错误
  • 空闲块计数错误
  • 块范围未使用,但在位图中标记
  • 已使用块范围,但未在位图中标记已使用
  • 索引节点范围未使用,但在位图中标记
  • 已使用索引节点范围,但未在位图中标记已使用
  • N 组块正在使用中,但组被标记为 BLOCK_UNINIT
  • N 组 inode 正在使用,但组标记为 INODE_UNINIT
  • 如果设置了 E2F_FLAG_JOURNAL_INODE 标志,则重新创建日志

-p即使设置了该标志,以下错误情况也会导致非交互式 fsck 进程中止:

  • 块位图不在组中
  • 索引节点位图不在组中
  • 索引节点表不在组中
  • 文件系统大小错误
  • 超级块中的索引节点计数不正确
  • Hurd 不支持文件类型功能
  • 日志具有未知的超级块类型
  • 询问我们是否应该清除日志
  • 日志超级块具有未知的只读功能标志集
  • 日志超级块具有未知的不兼容功能标志集
  • 期刊的版本号不受支持
  • 询问我们是否应该运行该期刊
  • 不带 resize_inode 的保留块
  • Resize_inode 未启用,但调整 inode 大小非零
  • 调整 inode 大小无效
  • 最后一次挂载时间是将来的时间
  • 最后写入时间是将来的时间
  • 组描述符 N 校验和无效。
  • 根目录不是 inode
  • 块位图与其他一些 fs 块冲突
  • Inode 位图与其他一些 fs 块冲突
  • Inode 表与其他一些 fs 块冲突
  • 块位图位于坏块上
  • 索引节点位图位于坏块上
  • inode 中的块号非法
  • 块号与 fs 元数据重叠
  • inode有非法块(latch问题)
  • inode 坏块过多
  • 坏块 inode 中的非法块号
  • 坏块inode有非法块(latch问题)
  • 坏块用作坏块间接块
  • 不一致无法修复提示
  • 主块错误提示
  • 禁止消息提示
  • 当文件系统不支持时,在 inode 上设置 Imagic 标志
  • 当文件系统不支持时,在 inode 上设置压缩标志
  • 处理属于孤立链表一部分的索引节点
  • 处理属于损坏的孤立链表一部分的索引节点(闩锁问题)
  • 读取扩展属性块时出错
  • 无效的扩展属性块
  • 扩展属性引用计数不正确
  • 不支持多个 EA 块
  • 错误 EA 分配冲突
  • 错误的扩展属性名称
  • 错误的扩展属性值
  • 索引节点太大(闩锁问题)
  • 目录太大
  • 常规文件太大
  • 符号链接太大
  • 坏块具有与文件系统块冲突的间接块
  • 调整 inode 大小失败
  • inode 似乎是一个目录
  • 读取范围树时出错
  • 无法迭代范围
  • 范围内的起始块错误
  • 范围超出文件系统范围
  • 在非扩展文件系统上设置 EXTENTS_FL 标志
  • inode 有范围,超级块缺少 INCOMPAT_EXTENTS 功能
  • 快速符号链接已设置 EXTENTS_FL
  • 范围不正常
  • Inode 有一个无效的盘区节点
  • 克隆重复/坏块?
  • “.”的索引节点号错误
  • 目录条目的索引节点号错误
  • 直接条目链接到“.”
  • 指向 inode 的目录条目现在位于坏块中
  • 目录条目包含目录的链接
  • 目录条目包含到根目录的链接
  • 目录条目名称中包含非法字符
  • 丢失的 '。'在目录索引节点中
  • 目录 inode 中缺少“..”
  • 目录 inode 中的第一个条目不包含“.”
  • 目录 inode 中的第二个条目不包含“..”
  • i_faddr 应该为零
  • i_file_acl 应该为零
  • i_dir_acl 应该为零
  • i_frag 应该为零
  • i_fsize 应该为零
  • inode 模式错误
  • 目录损坏
  • 文件名太长
  • 目录 inode 缺少块(洞)
  • '.'不是 NULL 终止的
  • '..' 不是 NULL 终止的
  • 非法字符设备索引节点
  • 非法块设备索引节点
  • 复制 '。'入口
  • 双重输入
  • 最终rec_len错误
  • 读取目录块时出错
  • 写入目录块时出错
  • “.”的目录条目很大。分裂?
  • 非法 FIFO 索引节点
  • 非法套接字索引节点
  • 目录文件类型不正确
  • 目录文件名为空
  • 无效的符号链接
  • i_file_acl(扩展属性块)不好
  • 文件系统包含大文件,但 sb 中没有这样的标志
  • 清除无效的HTREE目录
  • htree 内部节点中的坏块
  • 发现重复的目录条目
  • 发现文件名不唯一
  • i_blocks_hi 应该为零
  • 意外的 HTREE 块
  • 根 inode 未分配
  • 失物招领处没有房间
  • 未连接的目录 inode
  • ..输入不正确
  • 丢失+发现不是目录
  • 未附加的索引节点
  • 超级块损坏
  • 不支持片段
  • 确定文件系统的物理设备大小时出错
  • 外部日志有(不支持的)多个文件系统
  • 找不到外部期刊
  • 外部日志有坏的超级块
  • Superblock 的日志 UUID 错误
  • 分配 inode 位图时出错
  • 分配块位图时出错
  • 分配 icount 链接信息时出错
  • 分配目录块数组时出错
  • 扫描 inode 时出错
  • 迭代块时出错
  • 存储 inode 计数信息时出错
  • 存储目录块信息时出错
  • 读取 inode 时出错(用于清除)
  • 分配引用计数结构时出错
  • 修复引用计数时读取扩展属性块时出错
  • 修复引用计数时写入扩展属性块时出错
  • 分配 EA 区域分配结构时出错
  • 扫描 inode 时出错
  • 分配 inode 位图时出错
  • 内部错误:找不到 dir_info
  • 分配 icount 结构时出错
  • 遍历目录块时出错
  • 取消分配 inode 时出错
  • 调整 EA 引用计数时出错
  • 分配 inode 位图时出错
  • 创建根目录时出错
  • 根 inode 不是目录;中止
  • 如果没有根 inode,则无法继续。
  • 内部错误:找不到 dir_info
  • 编程错误:位图端点不匹配
  • 内部错误:伪造位图末尾
  • 在替换 inode 位图中复制时出错
  • 在替换块位图中复制时出错

相关内容