我正在阅读一篇关于文件系统修复的博客文章,作者提出了一个很好的问题……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 位图中复制时出错
- 在替换块位图中复制时出错