AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-320385

Jürgen's questions

Martin Hope
Jürgen
Asked: 2019-01-14 05:58:30 +0800 CST

e2fsck 没有说什么?

  • 2

摘要: E2fsck 发现-n选项没有错误,但使用-p(preen)。它更正了错误,但没有给出任何错误消息。该错误仅通过退出代码反映。如何解释这个?

我正在使用带有 Ext2 文件系统的 USB 硬盘驱动器来存储多台机器的备份。最近,我在该驱动器上获得了巨大的数据吞吐量,因此我决定进行额外的文件系统检查。总的来说,我e2fsck用不同的选项进行了四次跑步。以下是我(以 root 身份)使用的命令及其输出,其中还包含e2fsck. 不幸的是,有些短语被本地化为德语,但(可能)重要的是英语:

第一次运行,只读:

# e2fsck -nv /dev/sdb1; echo $?
e2fsck 1.41.1 (01-Sep-2008)
WD-Elements: sauber, 709312/61046784 Dateien, 96258851/244182016 Blöcke
0

第二次运行,只读强制:

# e2fsck -nfv /dev/sdb1; echo $?
e2fsck 1.41.1 (01-Sep-2008)
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung

  709312 inodes used (1.16%)
   95492 non-contiguous inodes (13.5%)
         # von Inodes mit ind/dind/tind Blöcken: 109958/2429/7
96258851 blocks used (39.42%)
       0 bad blocks
       8 large files

  564029 regular files
  121351 directories
       0 character device files
       0 block device files
      11 fifos
  506224 links
   23073 symbolic links (19397 fast symbolic links)
     839 sockets
--------
 1215527 files
0

第三次运行,整理:

# e2fsck -pv /dev/sdb1; echo $?
WD-Elements: sauber, 709312/61046784 Dateien, 96258851/244182016 Blöcke
0

第 4 次运行,强制整理:

# e2fsck -pfv /dev/sdb1; echo $?

  709312 inodes used (1.16%)
   95492 non-contiguous inodes (13.5%)
         # von Inodes mit ind/dind/tind Blöcken: 109958/2429/7
96258853 blocks used (39.42%)
       0 bad blocks
       8 large files

  564029 regular files
  121351 directories
       0 character device files
       0 block device files
      11 fifos
  506224 links
   23073 symbolic links (19397 fast symbolic links)
     839 sockets
--------
 1215527 files
1

命令一个接一个地直接发出,中间没有触及任何其他东西。

请注意差异:

  • 在前两次运行中,文件系统以只读方式打开(-n选项),而后两次正在整理运行(-p选项)。

  • 第一次和第三次运行不是强制的,第二次和最后一次运行是(-f)。

  • 所有运行都报告了一致的文件系统数据,但有一个例外:最后一次运行 ( -pfv) 报告了不同数量的“使用的块”。

  • 除了最后一次运行以外的所有运行都以状态 0 退出,最后一次 ( -pfv) 以状态 1 退出。

显然,最后一次强制整理运行 ( -pfv) 发现(并纠正了)其他运行无法找到的文件系统错误。不幸的是,它没有在其输出中给出任何关于该错误的提示。

现在我的问题:

  • 在那里发现并纠正了什么错误?是否像使用过的块数不正确一样简单?

  • 什么可能导致该错误?文件系统总是干净地卸载。

  • 文件系统错误最终由e2fsck. 但是我可以信任其中存储的数据吗?难道不是首先导致该文件系统错误的任何东西也损坏了磁盘上的数据吗?这将使磁盘上的所有数据一文不值。或者这是偏执狂?为什么?

最后一个问题区分文件系统和数据。在这方面,Mikel对“ Do journaling filesystems保证在电源故障后不会损坏? ”的回答具有高度相关性。不幸的是,它专注于日志文件系统,因此不适用于 Ext2。

Gilles对“如何测试 fsck 完成的文件系统更正”的回答也很好读:据此,fsck仅保证文件系统的一致状态,不一定是最新状态。

更新 1

Luciano Andress Martini在他的评论中指出,观察到且明显令人费解的行为e2fsck可能是由执行机器中的 RAM 错误引起的。虽然在可比较的情况下是一个高度相关的方面,但它似乎不适用于这里:我用“memtest86+”检查了 RAM 过夜,它完成了 16 次通过而没有错误。此外,我使用另一台机器(不同的硬件、内核和版本)在被测驱动器上执行e2fsck -nfv、e2fsck -pfv和运行。这些没有发现任何文件系统错误,并确认了上次报告的文件系统数据e2fsck -fve2fscke2fsck上面显示的命令,特别是使用的块数。还确认了非强制检查报告的块总数(244182016)。

更新 2

telcoM 的回答表明,观察到的行为e2fsck可以用e2fsck处理非常旧的文件系统时文件系统功能设置的更改来解释。不幸的是,这种非常一致的解释在这里并不适用:文件系统实际上是用更新版本的mke2fs(1.42.8) 创建的,它启用了特性ext_attr, resize_inode, dir_index, filetype, 。上述运行并未改变这一点。sparse_superlarge_filee2fsck

更新 3

同时,USB 驱动器成功通过了无损读写坏块测试(耗时 3 天,是的:指定的块大小(-b)和块数(-c)很重要)和几次离线 SMART 测试。

linux e2fsck
  • 2 个回答
  • 1667 Views
Martin Hope
Jürgen
Asked: 2018-11-14 04:53:05 +0800 CST

我们可以信任 e2fsck 修复的文件系统中的文件吗?

  • 2

话题

如果一个文件系统被 e2fsck 成功修复,它保证它处于一致(干净)状态。但是,在修复后评估文件本身的可靠性并不容易。

本题旨在根据标准来判断存储在 ext2 和 ext4 文件系统中的数据的完整性,这些文件系统在特定故障场景中损坏后被修复。


背景

我在外部 USB 硬盘(即基于盘片,无闪存)中使用 ext2 文件系统来备份几台 Linux 机器。为此,我使用选项rw, relatime(总共)手动安装驱动器,因此不sync使用任何选项。

就在最近,在从 openSUSE 13.1 系统(Linux 内核 3.11.6-4)进​​行大型备份(几个 100 GB)之后,在完成所有对 USB 硬盘的写入活动之后,我无法卸载该驱动器:umount命令被挡住了,没有回来。这同样适用于随后发出的sync命令,该命令进入不间断睡眠(ps状态 D)。

这是当我拔下 USB 硬盘时,它没有释放块。

此后通过标准方式(pm-utils)关闭机器电源的尝试也被卡住了。为了让机器停机,我使用了 SysRq 敬礼r, e, i, s, u, b. 但即使在那里,请求s(sync) 和u(remount read-only) 也没有成功:根据sysrq.c (sysrq.txt) 的内核文档,这些请求在明确宣布它们之前没有完成,其中没有一个他们在这种情况下做到了。因此,当 SysRq b(重新启动)命中时,没有一个已安装的文件系统被确认被完全卸载,最终启动了完全重新启动。

检查所有涉及的文件系统(根分区上的 ext4 和 USB HDD 上的 ext2)e2fsck,我幸运地发现根文件系统是干净的,并且 USB HDD 上的文件系统只显示错误的空闲块和空闲 inode 计数,可以通过 e2fsck 修复。

此处使用的机器的 Systemd 日志没有显示任何与阻止 umount 和同步相关的条目。特别是没有与 IO 问题相关的条目。除了 SysRqs 之外,USB 拔出事件和我的其他措施都已正确记录。

事件发生后对 USB 硬盘执行的SMART 和badblocks测试未发现任何异常。大约 5 个月大的驱动器现在似乎工作正常。


变化

在过去的几年里,我在不同的 USB 硬盘(没有一个超过 16 个月)和运行不同内核版本的不同 Linux 机器上遇到过同样的情况。我处理的唯一偏差是我有时使用电源按钮而不是 SysRq 来关闭机器。

在这些事件中,我检查了所有可能受影响的文件系统(所有 ext2 和 ext4)e2fsck,发现它们都处于以下错误状态之一:

  1. 清理文件系统。

  2. e2fsck 可以通过重播日志 (ext4) 来修复不干净的文件系统。

  3. 显示错误计数的可用块和可用 inode 的文件系统可以由 e2fsck 纠正。

  4. 包含 e2fsck 连接到 lost+found 的孤立 inode 的文件系统。

  5. 包含由 e2fsck 克隆的多重声明 inode(由多个文件声明)的文件系统。


实际问题

受上述情况影响并随后被 e2fsck 成功修复的 ext2 或 ext4 文件系统肯定处于一致(干净)状态。

但是该文件系统中文件的内容和元数据呢?

e2fsck 发现的文件系统损坏与数据损坏之间是否存在独特的相关性?例如像:

如果在文件系统中没有发现错误计数以外的其他损坏,则实际文件数据是可以的。

或者:

如果文件系统包含多次声明的 inode,则至少一个文件的内容已损坏。

还是相反:文件系统和文件数据是独立的,因为我们无法从其中一方的损害与另一方的损害中得出结论——至少在不确切了解导致设备通信级别损害的原因的情况下?

在后一种情况下,即使后来发现文件系统是干净的,所描述的场景也可能损坏了文件内容。正确的?

是否有任何经验值或合理的标准可用于根据 e2fsck 发现的文件系统错误来评估文件的完整性?

在这种情况下,Gilles 对“如何测试 fsck 完成的文件系统更正”的回答是一本好书。

文件系统和数据完整性之间的区别也在ext4 文件系统的内核文档中的“数据模式”部分中进行了说明。对于后者,Mikel的出色回答指出了我对“日志文件系统是否保证电源故障后不会损坏?”的出色回答。,这也与这个话题非常相关。


自己的猜测和影响

Systemd 提供服务单元(模板)[email protected],默认情况下,它会passno在启动时“整理”/etc/fstab 中选择的文件系统。根据-p手册页e2fsck(8)中选项的描述,整理“自动修复 [es] 任何无需人工干预即可安全修复的文件系统问题”。不幸的是,该描述没有指定“安全”是指单独的文件系统一致性还是还包括文件的内容和元数据。

但是,由于此 Systemd 服务以对用户完全透明的方式启动整理,因此至少有一些专家充分信任相应文件系统修复的结果。

因此,基于一种模糊的感觉(!),我会说对于干净的文件系统(上述错误状态 1)以及可以通过重播日志(错误状态 2)来修复的文件系统,可以安全地假设文件本身即使发生此类事件,也不会损坏。

另一方面,对于处于错误状态 5 的文件系统,我会参考备份。

那么,为什么要大惊小怪呢?同意:如果是标准主文件系统或根文件系统,我只会将其内容与最新备份进行比较。但在这种情况下,这些备份位于受影响的 USB 硬盘本身上。如果对其完整性存在疑问,则需要立即再次备份几台机器此外,这会呈现在该驱动器上循环备份策略期间累积的旧备份,否则这些备份可能已用作相应数据的快照, 无意义的。

因此,有一些合理且可靠的标准来确定我们可以在多大程度上信任 ext2 或 ext4 文件系统上的数据,这些数据在受到所述场景影响后被修复。


进一步的发现

试图自己解决这个问题,我在 Oracles System Administration Guide for Sun 中找到了关于 fsck 的精彩章节。尽管它描述了 fsck 的 USF 版本,但总体思路也适用于 e2fsck。但这份非常详细的文档也侧重于 fsck 的使用和文件系统本身,而不是考虑后者的有效负载。

在这个回答“fsck -p (preen) 在 ext4 上做什么?” , Noah 发布了一个文件系统错误列表,这些错误可以通过 fsck 整理 ext4 文件系统和那些不能自动处理的错误进行处理。拥有这样一个文件系统错误列表会很棒,该列表指示其中哪些暗示了文件数据的损坏,哪些暗示了文件数据的损坏——当然只有当这种相关性存在时……

在他的回答中,Michael Prokopec 提到了写缓存对这个问题的重要性。在这方面,我在Tall Jeff 对“正确处理写入缓存的 SATA 磁盘?”的回答中找到了答案。至少大多数 SATA 驱动器默认启用了写入缓存。但是,根据同一篇文章,驱动器会尽可能快地刷新这些缓存。但是当然不能保证...

linux synchronization
  • 1 个回答
  • 423 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve