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

Bar*_*rim 17 linux ext4 fsck

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

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

Noa*_*oah 18

您的问题的答案在于e2fsprogs源代码e2fsck/problems.c文件。寻找标志应该让你开始。PR_PREEN_OK

由于完整的错误处理涉及更多,由于可能发生的多种不同的错误情况,如果您担心特定情况,建议您仔细查看代码。但是,下面的列表摘自对错误条件的评论,应该可以让您大致了解 preen-mode 的影响。

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

  • 搬迁提示
  • 日志 inode 无效
  • 日志超级块已损坏
  • Superblock has_journal 标志清晰但有日志
  • 设置了超级块需要恢复标志但不存在日志
  • 文件系统修订版为 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,但设置了功能标志
  • 日志 inode 未使用,但包含数据
  • 日志有坏模式
  • 在非 HTREE 文件系统上设置 INDEX_FL 标志
  • 在非目录上设置 INDEX_FL 标志
  • HTREE 目录中的根节点无效
  • HTREE 目录中不受支持的哈希版本
  • HTREE 根节点中的不兼容标志
  • HTREE 太深
  • 无效的 inode->i_extra_isize
  • 无效的 ea 条目->e_name_len
  • 无效的 ea entry->e_value_offs
  • 无效的 ea entry->e_value_block
  • 无效的 ea 条目->e_value_size
  • 无效的 ea 条目->e_hash
  • inode 缺少 EXTENTS_FL,但它是一个范围 inode
  • inode 不应设置 EOFBLOCKS_FL
  • 目录条目已删除或未使用的 inode
  • 未设置目录文件类型
  • 在文件系统上设置的目录文件类型
  • 无效的 HTREE 根节点
  • HTREE 限制无效
  • HTREE 计数无效
  • HTREE 内部节点在表中有乱序哈希
  • 在设置了 _INODE_UNINIT 的组​​中找到 Inode
  • 在组未使用的 inode 区域中找到 inode
  • i_blocks_hi 应该为零
  • /lost+found 未找到
  • 未附加的零长度 inode
  • inode 引用计数错误
  • 未设置 inode 位图末尾的填充。
  • 未设置块位图末尾的填充。
  • 块位图差异标头
  • 块未使用,但在位图中标记
  • 块已使用,但未在位图中标记为已使用
  • 块位图差异结束
  • inode 位图差异标头
  • 未使用 inode,但在位图中标记
  • inode 已使用,但未在位图中标记为已使用
  • inode 位图差异结束
  • 组错误的空闲 inode 计数
  • 目录计数为组错误
  • 空闲 inode 计数错误
  • 组错误的空闲块计数
  • 空闲块数错误
  • 未使用块范围,但在位图中标记
  • 块范围已使用,但未在位图中标记为已使用
  • 未使用 inode 范围,但在位图中标记
  • 已使用 inode 范围,但未在位图中标记为已使用
  • 组 N 块正在使用,但组被标记为 BLOCK_UNINIT
  • 组 N inode(s) 正在使用,但组被标记为 INODE_UNINIT
  • 如果设置了 E2F_FLAG_JOURNAL_INODE 标志,则重新创建日志

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

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