不小心删除了EFI分区,系统仍在运行!

我正在使用Ubuntu 20.04,不小心删除了EFI分区(该死的GParted!) 系统仍在运行。我能否在现在未使用的区域创建一个新的分区,设置EFI标志和引导标志,然后只需运行update-grub命令? update-grub命令会重新填充EFI分区吗?我能否从另一个Ubuntu安装中使用DD命令复制EFI分区?
快速回复将不胜感激!

5也许你很幸运,只需要重置分区的起始/结束和标志。update-grub不会复制新的引导程序,你需要使用grub-install。你有Windows双启动吗?EFI引导程序只是FAT文件系统上的文件,你可以将它们复制进去,但是.../EFI/ubuntu/grub.cfg三行小节有一个UUID,你需要编辑为你的根UUID。 - ubfan1
1谢谢,但是要复制哪些文件,从哪里复制? - Dennis D
1没关系,我从另一台机器上复制了文件,并按照你指示更新了UUID。谢谢。 - Dennis D
9如果这对你有用的话,你可以回答自己的问题,并在几天后接受它以标记为已解决,这样可以帮助他人并为自己赢得一些声望点数。 - ubfan1
1@ubfan1: 严格来说,只有当有人给你的答案点赞时,你才能从回答自己的问题中获得声望 - 接受自己的答案并不会给你带来声望提升,而接受他人的答案或者他人接受你的答案才会给你带来声望提升。 - Vikki
在你修复这个问题之前,请不要重启/关闭电脑...如果你这样做的话,它根本无法启动。 - Logan
4个回答

感谢ubfan1,我成功修复并重新启动了。我按照以下步骤进行操作:
  1. 使用GParted在删除原始EFI分区后创建一个新的分区。
  2. 选择FAT32,管理标志并设置"boot"标志。
  3. 使用blkid命令找到新分区的UUID
  4. 编辑/etc/fstab,以便使用新的UUID挂载/boot/efi
  5. 挂载/boot/efi
  6. 将另一台Ubuntu机器上的/boot/efi中的所有文件复制到新的/boot/efi
  7. 编辑/boot/efi/EFI/ubuntu/grub.cfg,将root分区的UUID修复为正确的值。
  8. Penguin神祈祷,并重新启动。

现在一切都好。


1我在步骤6上遇到了一个错误: 6. 使用以下命令安装grub:sudo grub-install /dev/sdXsudo grub-install --efi-directory=/boot/efi 我的输出是:grub-install: error: failed to get canonical path of /cow'`。请帮忙解决 :/ - omerorkn
@omerorkn 这个回答中并没有第6步。 - Organic Marble

@Dennis D,只是为了补充你的回答,不是每个人都会有另一台*nix机器..所以
1. 使用Gparted在通过删除原始EFI分区创建的"未分配"部分中重新创建一个分区。 2. 选择FAT32,管理标志并设置"引导"标志。 3. 使用blkid查找新分区的UUID。 4. 编辑/etc/fstab,以便使用新的UUID挂载/boot/efi。 5. 挂载/boot/efi。 6. 使用以下命令安装grub: sudo grub-install /dev/sdX 和 sudo grub-install --efi-directory=/boot/efi。 7. 运行sudo update-grub。
在第6步中,请确保选择正确的设备(/dev/sda、/dev/sdb等)。

1谢谢,我不知道那些程序是否会重新安装那些文件。听起来你知道它们会这样做。另外,尽管我有很多冗余备份系统,但我没有备份/boot/efi目录。现在我已经备份了! - Dennis D
这是一个更有用的答案,因为它不需要其他Linux实例才能从中复制efi目录内容,并且不涉及手动调整grub.cfg。 - oᴉɹǝɥɔ

我知道解决问题有点晚了,因为你已经让系统正常运行了,但是我提供两种不同的解决方案。
1. 移除分区并不会删除数据。将磁盘视为一片连续的扇区空间(大约每个扇区长512或4096字节)。关于磁盘分区的信息存储在磁盘的第一个扇区(MBR,也称为DOS分区表)或者(对于GPT)存储在磁盘的起始和结束位置。磁盘的其余部分留给分区使用。移除分区只是在存储有关该分区信息的区域中删除了它的记录,但并没有删除实际的分区数据。只有当你在相同的区域(或其中的一部分)创建另一个分区并写入数据时,原来的分区数据才会被覆盖。所以,当你再次创建相同的分区时,一切都会正常工作。只需确保它具有相同的UUID(或在GRUB配置和fstab中更改UUID)、类型、位置等。
2. 使用安装光盘进行修复。Debian安装光盘,如果我没记错的话,Ubuntu安装光盘的文本模式变体中有一个专门用于解决这些问题的工具。它可以重新安装GRUB或LILO,或将其添加到已移动的安装中。它还可以重新安装核心系统包等。

对于第一个解决方案,您应该说明如何在不格式化分区的情况下进行恢复,例如使用testdisk。 - Didier L
@DidierL,不需要使用testdisk,因为您知道原始EFI分区存储的位置(通常在磁盘的开头或结尾,其他分区随后出现,或者位于多个分区之间)。手动创建分区(例如使用提问者使用的GParted)就足够了。(testdisk只会做同样的事情。) - jiwopene
使用GParted创建一个新的分区将会分配一个新的、空的FAT,所以它不会恢复任何数据,对吗?实际上,如果不是这样的话,在已经存在的空间上进行分配很可能会创建损坏的分区。然而,testdisk可以恢复先前存在的分区。 - Didier L
我不再使用GParted,但如果我记得正确的话,创建一个FAT分区而不格式化它(我确定GParted允许这样做),FAT是没有被分配(格式化)的,只是创建了一个msdos分区表(“MBR”)条目或GPT分区记录。当您设置相同的参数(起始和结束扇区,类型以及使用GPT还有UUID),您可以将分区恢复到未更改的状态。(通常我使用fdisk来完成这个操作,我更喜欢它。)testdisk试图做同样的事情,但只是猜测正确的参数。 - jiwopene

救回被删除分区的简单解决方案存在,使用 parted

  • 启动一个 Linux 安装 USB 键(如 Ubuntu Live USB 尝试或安装)
  • 在终端中运行 sudo parted
  • print devices 列出您的设备
  • 使用 select 命令选择正确的设备
  • print 显示已删除分区的空白位置
  • 然后使用上面打印的界限使用 rescue 命令

分区将被恢复,其 UUID 未更改。只需重新启动即可。