总的来说,我对 Linux 还很陌生,但我可以使用命令行来做一些基本的事情。目前我正在使用 Manjaro KDE。昨天我跟着书《Linux from Scratch》学习了更多关于Linux的知识。我做的最后一件事是将主分区缩小了 25 GB 并创建了一个新分区(使用 cfdisk)。一切都很好,没想到当我今天登录 Manjaro 时,我收到了错误:
mount: /new_root: wrong fs type, bad superblock on /dev/nvme0n1p4, missing codepage or helper program, or other error.
和
sh: can't access tty: job control turned off
并被扔进紧急外壳。正如我所说,我可以使用命令行来创建、复制和编辑文件,但这对我来说看起来太高级了。
编辑
在一切崩溃之前我做的最后一件事是:
第一次我使用 cfdisk 将主分区缩小了 25.6 GB。
第二,我使用 cfdisk 创建了一个新分区(20 GB)。
第三,我安装了新分区。
第四,我在新分区上创建了一个新的 ext4 文件系统。
然后我关闭了电脑,今天启动时,它直接进入了紧急 shell
我已经尝试过:
mount /dev/nvme0n1p4 / (in the recovery shell, same Error).
mount /dev/nvme0n1p4 /media/nvme (from a live usb stick, same Error).
有谁知道为什么会发生此错误以及如何挽救我的数据?
答案1
如果在使用收缩文件系统所在分区之前没有使用resize2fs
收缩文件系统,则会导致文件系统的尾部被切断。cfdisk
系统现在检测到文件系统声称大于其所在的分区,这是一个错误。
虽然 ext2/3/4 文件系统可以放大的当它被使用时,缩小仍然需要先卸载它。它看起来像是/dev/nvme0n1p4
你的根文件系统,它不能轻易地卸载,/
并且需要特殊的步骤来安装/
(将其安装到其他地方,最小化正在运行的进程数量,并使用pivot_root
切换到新的根文件系统),因此机会太高,您没有使用正确的程序来调整您的大小根文件系统。
调整根文件系统大小的最简单方法是从外部实时媒体启动,并在完全卸载时使用它来调整已安装操作系统的根文件系统的大小。另一种选择是确保文件系统大小调整工具存在于 中initramfs
,然后使用引导选项在 initramfs 引导阶段中断引导,同时根文件系统尚未安装,并在生成的紧急 shell 中缩小文件系统。
现在的问题是,调整文件系统的大小首先要求它没有错误。暴力切断文件系统的一部分绝对是一个错误。
您需要从实时媒体启动系统,然后使用它来安装和备份您创建的新分区(如果有)的内容,然后删除该分区并将分区恢复/dev/nvme0n1p4
到其原始大小。然后您应该能够运行e2fsck -C0 /dev/nvme0n1p4
它来检查错误(并希望修复可能由文件系统尾部部分覆盖引起的任何错误)。
然后,仍然在实时媒体环境中,将根文件系统挂载到临时位置
mkdir /media/nvme
mount /dev/nvme0n1p4 /media/nvme
并使用它来编辑/etc/fstab
已安装操作系统的(现在位于/media/nvme/etc/fstab
),以暂时注释掉对您创建的新分区的任何引用。
然后您可以退出实时媒体并验证您安装的操作系统再次正常启动。
然后再次使用实时媒体启动以正确调整根文件系统的大小:
1.) 首先用于resize2fs /dev/nvme0n1p4 <new-size>
调整分区内文件系统的大小。如果您知道调整大小后分区将具有的确切扇区数,则可以使用该值作为值<new-size>
。否则,您应该稍微缩小文件系统较小大小比您打算将分区缩小到的大小,以防止单位转换中的舍入(以及基数 2 与基数 10)错误。
2.) 然后收缩包含文件系统的分区。作为此步骤的一部分,您还可以使用可用空间创建新分区。
3.) 退出实时媒体并启动到已安装的操作系统以确认其仍然正常工作。如果您将文件系统的大小调整为小于新分区大小,您现在可以使用resize2fs /dev/nvme0n1p4
自动检测当前分区大小并扩展文件系统以使其完全匹配。 (是的,您可以在安装文件系统时执行此操作。)
4.) 现在您可以继续在新分区上创建文件系统,取消注释/添加该/etc/fstab
行,然后安装新文件系统。