亲爱的程序员和用户们,大家好。这将是一个很长的描述性问题,其中有一系列较小的问题,最后才是主要问题,所以请耐心阅读。我有一台双启动的笔记本电脑,上面安装了 Windows 10 和 Ubuntu 20.04。我一直在关注这些答案(第二个答案基本上是第一个答案的改进版本)-无法获取 /cow 的规范路径,无法获取 /cow 的规范路径尝试 chroot 到安装 Ubuntu 的分区,以便我可以修改 /etc/default/grub,然后运行 update-grub。
我最大的问题是,安装 Ubuntu 后,应该显示 Ubuntu 和 Windows 的 Grub 菜单没有出现,笔记本电脑直接启动到 Windows 10。我尝试运行以下命令 -
bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi
从 Windows 10 命令提示符以管理员身份运行,但不清楚它是否有效。这是因为另一个更紧迫的问题是 /etc/default/grub 中的配置选项设置为在启动时不显示 Grub 菜单。我已经更改了配置选项 -
GRUB_TIMEOUT_STYLE=menu #changed from hidden
GRUB_TERMINAL=console #uncommented this line
到目前为止一切顺利。我已将这些步骤记录在此答案中以帮助未来的人。现在谈到我的问题,我正尝试从 Live Ubuntu USB chroot 到安装 Ubuntu 的分区,因为我无法访问已安装的 Ubuntu 系统,因为 Grub 菜单未显示。我打算在更改的 /etc/default/grub 文件上运行 update-grub,以便新的配置选项反映在系统中,并且 GRUB 菜单开始显示。
现在,我对 Linux 终端命令还很陌生,所以我需要一位有经验的人提供一份好的命令列表。我可以为您提供有关我的系统的所有信息。
安装Ubuntu的分区是/dev/sdb6。/boot/所在的分区是/dev/sdb1。
到目前为止我已经运行过的命令列表,除了一个错误外,其他都正常工作 -
sudo mkdir /mnt/chrootdir
sudo mkdir /mnt/chrootdir/boot
sudo mount /dev/sdb6 /mnt/chrootdir/
sudo mount /dev/sdb1 /mnt/chrootdir/boot/
最后一个命令,挂载 /dev/sdb1 /boot/ 分区,产生错误 -
Mount is denied because the NTFS volume is already exclusively opened. The volume may be already mounted, or another software may use it which could be identified for example by the help of the 'fuser' command.
那么,/dev/sdb1 不是 Ubuntu 的启动分区,而是 Windows 10 的启动分区吗?它说的是 NTFS,所以我猜是这个方向。以下是“sudo fdisk -l”的输出 -
Disk /dev/sda: 223.58 GiB, 240057409536 bytes, 468862128 sectors
Disk model: KINGSTON SA400S3
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0385685f
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 466750024 466747977 222.6G 7 HPFS/NTFS/exFAT
/dev/sda2 466751488 467804159 1052672 514M 27 Hidden NTFS WinRE
/dev/sda3 467806208 468856831 1050624 513M 27 Hidden NTFS WinRE
Disk /dev/sdb: 298.9 GiB, 320072933376 bytes, 625142448 sectors
Disk model: TOSHIBA MK3265GS
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x405647f3
Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 2048 206847 204800 100M 7 HPFS/NTFS/exFAT
/dev/sdb2 206848 204802047 204595200 97.6G 7 HPFS/NTFS/exFAT
/dev/sdb3 204802048 231920606 27118559 13G 7 HPFS/NTFS/exFAT
/dev/sdb4 231921662 625141759 393220098 187.5G 5 Extended
/dev/sdb5 231921664 232972287 1050624 513M b W95 FAT32
/dev/sdb6 232974336 625141759 392167424 187G 83 Linux
Disk /dev/sdc: 14.33 GiB, 15376318464 bytes, 30031872 sectors
Disk model: Cruzer Blade
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x2cf4ba3a
Device Boot Start End Sectors Size Id Type
/dev/sdc1 * 0 5999871 5999872 2.9G 0 Empty
/dev/sdc2 5271500 5279499 8000 3.9M ef EFI (FAT-12/16/32)
/dev/sdc3 6000640 30031871 24031232 11.5G 83 Linux
我已经通过在文件管理器上安装并检查各种文件系统文件夹(例如 /etc/、/dev/、/run/ 等)来验证,/dev/sdb6 是 200 GB 的 Ubuntu 分区。我完全确定这一点。因此,我假设位于同一硬盘驱动器上且大小为 100MB、在 Boot 列下带有 * 标记的 /dev/sdb1... 是已安装的 Ubuntu 系统的 /boot/ 分区。我说得对吗?请询问确定这一点所需的任何其他信息。
我还尝试在不挂载 /boot/ 分区的情况下 chroot 进入系统,因为第一个答案没有挂载它。运行命令时 -
sudo mkdir /mnt/chrootdir
sudo mount /dev/sdb6 /mnt/chrootdir/
sudo for dir in proc dev sys etc bin sbin var usr lib lib64 tmp; do mkdir /mnt/chrootdir/$dir && mount --bind /$dir /mnt/chrootdir/$dir; done
最后一个命令给了我错误 -
bash: syntax error near unexpected token `do'.
那么上面的命令有错误吗?这似乎不太可能,因为我从中得到的答案有 45 个赞成票,而且没有人评论过这个错误。这可能是因为 Windows 上的 CRLF 和 Linux 上的 LF。这指的是行尾。我在一个答案中读到了这一点,不太确定细节。如果有人能让这个 mount 命令正常工作而没有语法错误,那将会很有帮助。
我在这里卡住了,否则我真的很接近通过实时 USB 运行 update-grub 并在启动时显示 GRUB 菜单。请帮忙。我将提供您需要的任何信息,以便给我正确的安装命令。再次,启动分区是 /dev/sdb1,安装 Ubuntu 的分区是 /dev/sdb6。
编辑 1:执行“sudo su”并运行后,命令就会运行。
现在,当我跑步时 -
sudo su
mkdir /mnt/chrootdir/
mount /dev/sdb6 /mnt/chrootdir/
我收到以下错误信息 -
mkdir: cannot create directory ‘/mnt/chrootdir/proc’: File exists
mkdir: cannot create directory ‘/mnt/chrootdir/dev’: File exists
mkdir: cannot create directory ‘/mnt/chrootdir/sys’: File exists
mkdir: cannot create directory ‘/mnt/chrootdir/etc’: File exists
mkdir: cannot create directory ‘/mnt/chrootdir/bin’: File exists
mkdir: cannot create directory ‘/mnt/chrootdir/sbin’: File exists
mkdir: cannot create directory ‘/mnt/chrootdir/var’: File exists
mkdir: cannot create directory ‘/mnt/chrootdir/usr’: File exists
mkdir: cannot create directory ‘/mnt/chrootdir/lib’: File exists
mkdir: cannot create directory ‘/mnt/chrootdir/lib64’: File exists
mkdir: cannot create directory ‘/mnt/chrootdir/tmp’: File exists
那么我应该将 /dev/sdb6 中的每个目录挂载 --bind 到这些已经存在的目录中吗?
一位用户询问了目标。目标,用一行代码来概括,就是从实时 USB 中为已安装的 Ubuntu 系统运行 update-grub2,以便更改的 /etc/default/grub 配置选项反映在已安装的 Ubuntu 系统中,并且 GRUB 菜单在启动时开始出现。我怀疑我是否需要 boot-repair 来实现这一点,因为完成此任务的答案有 45 个赞成票,并且没有提到 boot-repair。它只是 chroot 到已安装的 Ubuntu 分区并运行 update-grub2。
编辑2:这是我的启动修复生成的启动信息摘要-https://paste.ubuntu.com/p/3csmQVFqTT/
编辑 3 :使用以下方法后,chroot 到 /dev/sdb6 就可以了 -
for dir in proc dev sys etc bin sbin var usr lib lib64 tmp; do mount --bind /$dir /mnt/chrootdir/$dir; done
然后我 chroot 到 /mnt/chrootdir/ 并运行 update-grub,但奇怪的是,运行完成后,它只在 sda 和 /dev/sdb 上显示 Windows 10。它应该在 /dev/sdb 上显示 Ubuntu。也许 Grub 中的描述是错误地将已安装的 Ubuntu 写成了“Windows 10”?
重新启动后,Grub 菜单没有出现,但我发现了 Legacy BIOS/MBR 的快捷方式,即在启动期间按住 Shift 键(在 BIOS 菜单出现之前和整个过程中)。这样就会出现 GRUB 菜单,我将使用此解决方法。我仍然不明白为什么 GRUB 菜单没有自动出现。我也尝试使用 Windows 命令提示符中的 bcdedit 命令编辑 /etc/default/grub。这很神秘。