这可能听起来很愚蠢,而且似乎有很多重复,但我已经花了将近 3 天的时间寻找解决方案,没有看,我意外地在 /dev/sda2 而不是 /dev/sdd2 上发出了 mkfs.xfs 命令并完全擦除了我的 /boot 分区(以及所有 vmlinuz 和 initrd 文件),所以我尝试了从实时媒体进行标准恢复方法(由于我的系统是使用 LVM 分区和 EFI 模式安装的,因此进行了一些更改):
mkdir /mnt/fedsys
mount /dev/fedora/root /mnt/fedsys
mount /dev/sda2 /mnt/fedsys/boot
mkdir /mnt/fedsys/boot/efi (I had to create a new efi dir since it was lost)
mount /dev/sda1 /mnt/fedsys/boot/efi
mount --bind /proc/ /mnt/fedsys/proc
mount --bind /sys/ /mnt/fedsys/sys
mount --bind /dev/ /mnt/fedsys/dev
chroot /mnt/fedsys
到目前为止它运行良好,然后我尝试重新生成 grub.cfg 文件:
grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
但是它失败并显示以下消息:
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
device-mapper: reload ioctl on osprober-linux-sdd1 failed: Invalid argument
Command failed
done
然后我忽略错误并继续安装 grub:
grub2-install /dev/sda
输出结果如下:
Installing for x86_64-efi platform.
EFI variables are not supported on this system.
EFI variables are not supported on this system.
Installation finished. No error reported.
当我重新启动时,我得到了 grub 提示符。现在,我认为问题在于 vmlinuz 和 initrd 都找不到(当然,因为我删除了 /dev/sda2),但我找不到重建它们或使系统启动的方法。
我能做什么?有没有办法从实时媒体重建这些文件?我试图挽救的系统在 EFI 模式和 LVM 上运行 Fedora 25 64 位。
答案1
这是您可以尝试修复系统的通用方法。软件包名称可能因发行版而异,因此您可能需要谷歌搜索一些具体信息。
- 启动到实时媒体
- 将您的硬盘根分区挂载到某处(例如
/mnt
)。 - 在此根目录内安装所有系统必需的分区 - 您的分区
/boot
以及您可能拥有的任何其他分区。 -o bind
使用文件夹安装/dev
,/proc
并/sys
从实时媒体根目录进入您的硬盘根目录/mnt
- 现在你可以安全地 chroot 到你的
/mnt
。它应该会给你一个功能齐全的系统。 - 重新安装 grub 包并运行 mkinitramfs 或者更好的是重新安装 linux 内核。
- 生成你的 grub 配置并将 grub 安装到 MBR(如果你使用它),你现在应该拥有所有必要的内容。
- 退出 chroot 返回实时媒体并以相反的顺序卸载所有内容。
- 尝试重新启动进入原来的系统。
编辑:
通过 chrooting,您可以进入本地可写磁盘安装的环境。除了已运行的进程和内核之外,所有库和可执行文件都在此环境中使用 - 因此您将能够使用已安装的包管理器和包数据库。安装/dev
和/proc
是/sys
必要的,以便您能够访问硬件并控制进程,您需要它才能在 中生成新的 linux 映像/boot
、正确配置 grub 并访问网络以下载包。如果您必须使用来自其他发行版的实时媒体,则 Chrooting 特别有用。
至于重新安装 grub - 不同发行版的软件包名称可能不同,但重新安装 grub* 不会造成任何损害。不要忘记,仅安装软件包可能还不够。您可能还需要grub-install
在设置配置后运行。
答案2
我遇到过类似的问题,我意外删除了启动分区。@Marek 的回答对我而言非常有用。作为参考,我将写下我使用的命令(因为 @Marek 的回答很笼统,所以我不得不在线搜索一些命令)
我有一台 Fedora 30 PC。启动分区已打开/dev/sda3
,根分区位于名为 的 LVLM 上Fedora-root
。我使用 root 帐户运行了所有命令。
我从 Fedora Live 媒体启动(来自 USB 驱动器)
挂载我的根分区
mount /dev/mapper/Fedora-root /mnt
- 挂载我的启动分区
mount /dev/sda3 /mnt/boot
- 将内核从活动分区复制到目标启动分区
cp /boot/vmlinuz-$(uname -r) /mnt/boot/
- 挂载系统分区
mount --bind /dev /mnt/dev mount --bind /sys /mnt/sys mount --bind /proc /mnt/proc
- 将 root 更改为
/mnt
chroot /mnt
- 生成
initramfs
dracut /boot/initramfs-$(uname -r).img $(uname -r) -v
- 重新安装 grub 并重新配置
grub2-mkconfig -o /boot/grub2/grub.cfg
由于某种我不知道的原因,生成过程initramfs
非常缓慢,无法在我的系统上完成(步骤 6)。但是,当我没有 chroot 文件系统时,该命令可以正常工作。因此,我跳过了从 3 开始的步骤。我还必须修改配置dracut
以指向根系统。
因此,新的步骤是:
- 指向
dracut
配置 中的根位置echo "root=/dev/mapper/Fedora/root" > /etc/dracut.conf.d/kernel.conf
- 重新安装
kernel
并生成initramfs
dracut /dev/sda/initramfs-$(uname -r).img $(uname -r) -v
- 然后我按照上面的步骤 3-6 进行操作,这样我就可以重建 grub 配置(这一步可能不需要,因为我太谨慎了)
mount /dev/mapper/Fedora-root /mnt` mount /dev/sda3 /mnt/boot cp /boot/vmlinuz-$(uname -r) /mnt/boot/ mount --bind /dev /mnt/dev mount --bind /sys /mnt/sys mount --bind /proc /mnt/proc chroot /mnt
- 重新安装 grub 并重新配置
grub2-install /dev/sda grub2-mkconfig -o /boot/grub2/grub.cfg
NVIDIA 用户须知
我有一块 NVIDIA GPU,在事故发生前我安装了专有驱动程序。
从实时媒体恢复的内核使用了 Nouveau 驱动程序(因为它是 Fedora 中的默认驱动程序)。恢复的内核也不是最新版本。当我kernel
之后使用 GUI 界面更新时,它使用了 NVIDIA 专有驱动程序。
答案3
我建议您首先尝试启动修复磁盘,它将修复大多数 MBR 问题。本文可能也会派上用场。https://www.linux.com/learn/how-rescue-non-booting-grub-2-Linux