lsblk:结构需要清理

lsblk:结构需要清理

我运行了一个命令来释放空间,但在执行此操作时,该命令却讽刺地耗尽了空间。

root@server:~# dd if=/dev/zero bs=4k | pv | dd bs=4k of=/dev/sda1
dd: error writing '/dev/sda1': No space left on device                                                                              <=>                                                                                                      ]
2096881+0 records in
2096880+0 records out
8588820480 bytes (8.6 GB, 8.0 GiB) copied, 77.2844 s, 111 MB/s
   8GiB 0:01:17 [ 106MiB/s] [                                                                                             <=>                                                                                                               ]

现在我无法运行任何命令,因为结构需要清理。

root@server:~# lsblk
bash: /bin/lsblk: Structure needs cleaning
root@server:~# ls
bash: /bin/ls: Structure needs cleaning

但是 cat 和 df 命令给出不同的消息:

root@server:~# cat /proc/stat
bash: cat: command not found
root@server:~# df
Segmentation fault

消息来源建议运行 fsck 但是我不能,因为我的系统不支持该命令:

root@server:~# fsck /
bash: fsck: command not found
root@server:~# fsck.ext4 /
bash: fsck.ext4: command not found

推荐的行动诅咒是什么?

答案1

我运行了一条命令来释放空间,

这不是释放空间的命令——这是销毁“sda1”分区上所有数据的命令。因此,虽然技术上正确您现在有 8 GiB 的可用空间,这也意味着系统上没有剩余任何其他内容。

但讽刺的是,在执行此操作时,命令却耗尽了空间。

这里预计会出现该消息,因为您正在将无限长度的源(/dev/zero 会永远产生数据)写入固定大小的目标(/dev/sda1 分区,其大小正好为 8 GiB)。

[各种错误信息]

根据哪些数据恰好在操作系统保存的 RAM 缓存中幸存,哪些数据需要从磁盘重新读取,您会收到不同的错误消息。最近使用的命令仍缓存在 RAM 中,并且失败的方式与尚未缓存的命令不同。例如:

  1. 由于文件系统信息已被删除,操作系统甚至无法找到该文件。您会收到“文件未找到”(ENOENT) 信息。
  2. 操作系统仍可根据 RAM 中的缓存目录信息找到该文件,但无法读取文件自身的元数据(范围列表),因为它已被删除。您会收到“结构需要清理”(EUCLEAN/EFSCORRUPTED)信息。
  3. 操作系统可以打开并读取 RAM 中仍完整的程序开头,但必须从磁盘加载剩余部分,这要么失败,要么返回因已被擦除而产生的垃圾数据。您会遇到各种崩溃。

消息来源建议运行 fsck 但是我不能,因为我的系统不支持该命令:

它可能一直持续到您删除所有内容为止。

然而,如果/文件系统确实损坏,通常的建议是运行 fsck来自另一个系统(即从救援 liveCD 中),它通常包含所有必要的工具,无论原始系统是否具有这些工具。它在实际修复文件系统方面也具有更大的灵活性,因为在文件系统仍处于挂载状态时通常无法进行修复。

推荐的行动诅咒是什么?

推荐的咒语是[省略]。

推荐课程操作是从备份恢复系统,或者重新安装系统。

答案2

尝试进一步解释:

我运行了一个命令来释放空间,但在执行此操作时,该命令却讽刺地耗尽了空间。

root@server:~# dd if=/dev/zero bs=4k | pv | dd bs=4k of=/dev/sda1

of=/dev/sda1这里是针对第一个磁盘上的整个第一个分区,其名称前缀为“sd”(可能会出现其他前缀,具体取决于您连接磁盘的位置)。
对于较新的硬件,“sda”通常是第一个磁盘。因此,这里它很可能是系统的可启动(根)分区。

如果你只写了of=/DUMPFILE,情况就会[1] 截然不同;磁盘根目录中会有一个用零填充的文件(大小与操作系统允许的大小相同),而其他所有文件都完好无损[2]。

[1] 如果上一句我的猜测是正确的/dev/sda1 曾是等于/
[2] DUMPFILE 将占用磁盘上所有可分配的空间,“清理”磁盘该部分的内容。注意:这作为准备是有意义的;如果您打算将分区/磁盘“dd”到压缩文件中(例如dd ... | gzip -best backup.dd.gz

相关内容