我最近买了一个新的 SSD,并将我的旧 HDD 克隆到我的新 SSD 中。
克隆过程完成后,我可以启动 Ubuntu 16.04 LTS,但是当我将旧硬盘放回计算机时,计算机使用旧硬盘启动,而不是像应有的那样使用新的固态硬盘启动。
我使用启动修复并选择我的 SSD 作为“默认启动操作系统”,它修复了 grub。现在,当我在更新的 grub 菜单中选中 SSD 时,它会从 HDD 启动。
我该如何解决?
笔记:
- 我认为这可能与 UUID 有关。
- 我的旧硬盘位于 /dev/sda2。
- 我目前已安装 Windows 7,并且可以使用 grub 菜单从新的 SSD 正确启动,并且 Windows 没有任何问题。
答案1
您可能是对的...重复的 UUID。
您需要更改 HDD 或 SSD 上的 UUID,然后编辑您的/etc/fstab
。
- 断开硬盘
- 启动至 SSD
在terminal
...
sudo blkid
# 确定 Ubuntu 分区的 /dev/sdaN 和旧 UUIDsudo cp /etc/fstab /etc/fstab.bck
# 备份此文件sudo pico /etc/fstab
# 编辑 fstab 文件- 更改
UUID=the_old_UUID
为读取/dev/sdaN
,其中 N 是 Ubuntu 分区的编号,用于启动驱动器挂载- control+ o# 保存编辑
- return# 确认文件名
- control+ x# 退出编辑器
reboot
# 确保它仍然正常启动
启动至 Ubuntu Live DVD...
在terminal
...
sudo blkid
# 确定 Ubuntu 分区的 /dev/sdaN 和旧 UUIDsudo uuidgen -t
# 生成新的基于时间的 UUID(记下这个新的UUID)sudo tune2fs -U new_UUID /dev/sdaN
# 使用您自己的新 UUID 和 /dev/sdaN 编号reboot
# 重新启动 SSD 并确认操作
更新#1:由于 UUID 的变化,Ubuntu 有可能无法在这里启动,所以您可能需要编辑一次 GRUB 启动命令。
如果是的话,在 GRUB 菜单中...
- 突出显示适当的 Ubuntu 启动选择
- 按下e键来编辑 GRUB 命令行
- 使用箭头键移动到包含“splash quiet”的行
- 手动将旧 UUID 更改为之前记下的新 UUID
- control+x继续启动
重新启动 SSD...
在terminal
...
sudo blkid
# 获取新的 UUIDsudo pico /etc/fstab
# 编辑文件- 将
/dev/sdaN
(其中 N 是 Ubuntu 分区的编号)改回UUID=the_new_UUID
,用于启动驱动器挂载- control+ o# 保存编辑
- return# 确认文件名
- control+ x# 退出编辑器
sudo update-grub
# 更新 grubreboot
# 确保它仍然正常启动
如果需要,重新安装 HDD。
答案2
如果您使用 GRUB 2 作为引导加载程序,则可以使用 GRUB 的命令行来选择从哪个分区引导以及以 root 身份挂载哪个分区。
我假设您的最终目标是重新格式化旧驱动器,最好不使用实时媒体。如果您尝试在克隆磁盘之间设置多重启动系统,这将允许您启动其中一个,但我不建议将其作为永久解决方案。
1. 启动时显示 GRUB 菜单
如果您的系统未设置执行此操作,您可以按以下方式进行:
- 通过 BIOS 启动时按住Shift,或
- Esc通过 UEFI 启动时按下
2.打开 GRUB 命令提示符
GRUB 菜单出现后,按c。这将带您进入 GRUB 命令行。我还发现,在不断按 的过程中Esc,您可能最终还是会进入 GRUB 命令行。您应该会看到类似以下内容:
Minimal BASH-like line editing is supported. For the first word,
TAB lists possible command completions. Anywhere else TAB lists
possible device or file completions. ESC at any time exits.
grub> _
3. 在新 SSD 上找到根目录
用于ls
列出驱动器和分区:
grub> ls
(proc) (hd0) (hd0,gpt2) (hd0,gpt1) (hd1) (hd1,gpt2) (hd1,gpt2)
这大致相当于 BASH 命令的输出lsblk
,其中(hd0)
将是/dev/sda
,(hd0,gpt1)
将是/dev/sda1
,等等。
然后,您可以使用该ls
命令在新 SSD 上找到您的根目录。请务必包含结尾/
,否则该命令将仅显示有关分区的一些信息,而不是其中包含的文件。
grub> ls (hd0,gpt2)/
lost+found/ boot/ dev/ proc/ run/ sys/ bin lib lib32 lib64 libx32 sbin etc/
home/ media/ mnt/ opt/ root/ snap/ srv/ tmp/ usr/ var/
4.设置根目录
一旦找到根目录,就可以设置它:
grub> set root=(hd0,gpt2)
其中(hd0,gpt2)
是根目录的绝对路径。
5. 获取内核和 initrd 映像
这些文件通常位于您的启动目录中。下一步您将需要文件名(包括内核版本)。
grub> ls /boot/
efi/ initrd.img initrd.img.old vmlinuz vmlinuz.old grub/
config-5.13.0-27-generic vmlinuz-5.13.0-27-generic memtest86+.bin
memtest86+.elf memtest86+_multiboot.bin System.map-5.13.0-27-generic
initrd.img-5.13.0-27-generic
在这种情况下,我使用的文件是vmlinuz-5.13.0-27-generic
和initrd.img-5.13.0-27-generic
。您可能也可以使用 vmlinuz
和initrd.img
,但我尚未测试过。
6. 引导
使用以下命令,使用新的 SSD 启动系统:
grub> linux /boot/vmlinuz-X.XX.X-XX-generic root=/dev/sd##
grub> initrd /boot/initrd.img-X.XX.X-XX-generic
grub> boot
其中vmlinuz-X.XX.X-XX-generic
和initrd.img-X.XX.X-XX-generic
是您在上一步中找到的内核版本,##
是新 SSD 上根目录所在分区的字母和数字组合。我根据(hd0,gpt2)
大致等于来确定这一点/dev/sda2
。
此时,您应该已启动到新 SSD。就我而言,我想擦除旧驱动器以将其用作存储,因此我能够从新 SSD 重新格式化它。