我运行了一个命令来释放空间,但在执行此操作时,该命令却讽刺地耗尽了空间。
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 中,并且失败的方式与尚未缓存的命令不同。例如:
- 由于文件系统信息已被删除,操作系统甚至无法找到该文件。您会收到“文件未找到”(ENOENT) 信息。
- 操作系统仍可根据 RAM 中的缓存目录信息找到该文件,但无法读取文件自身的元数据(范围列表),因为它已被删除。您会收到“结构需要清理”(EUCLEAN/EFSCORRUPTED)信息。
- 操作系统可以打开并读取 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
)