Answers:
一旦GRUB放弃了引导到内核的启动,内核就不知道启动它的原因,并且/boot
可能不是GRUB使用的那个。您可以检查boot/grub/grub.cfg
每个分区中的访问时间,以查看最近访问过的分区。这样可以告诉您使用了哪个分区的配置文件GRUB。
stat -c %x /boot/grub/grub.cfg
如果访问时间未更新,则必须查找各种GRUB配置文件使用的内核参数中的任何差异。如果您可以更改它们,例如将foo=1
,foo=2
等等添加到其中GRUB_CMDLINE_LINUX
的每一个中sudo update-grub2
,然后运行并重新启动,则可以查看/proc/cmdline
是否使用了这些值。
/boot
的位置,但这可能不是grub所使用的分区,而您和Katu发现安装在/
其上的分区已安装,但是,正如Ravexina指出的那样,甚至更少的联系
/
。查找引导时使用了哪个分区的GRUB配置?我不知道这有什么关系。
众所周知,您要查找的文件位于/boot
运行系统的目录中。要么/boot
是一个单独的分区,要么不是;如果您/boot
是一个单独的分区,则应查找:
$ lsblk -r | grep '/boot'
sda2 8:1 0 400M 0 part /boot
意味着grub.cfg
它被用于位于sda2
。
否则,您应该寻找root
:
$ lsblk -r | grep '/$'
sda1 8:1 0 121.2G 0 part /
这次它位于中sda1
。
甚至为了娱乐,我们可以检查启动时间参数:
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-686-pae root=UUID=938495-1fe2-3302 ro quiet
然后使用UUID
找出哪个分区是您的根。
$ sudo blkid | grep 938495-1fe2-3302
/dev/sda1: UUID="938495-1fe2-3302"
意思是从sda1
。
您还可以检查这些引导参数,以查看其中的一个grub.cfg
文件包含它们,这仅在您的引导参数grub.cfg
彼此不同时才有效。
readlink -f /dev/disk/by-uuid/<UUID>
。
要显示保存当前安装的根文件系统的设备:
awk '$2=="/"{print $1}' /proc/mounts
要显示当前正在运行的Ubuntu发行版本:
lsb_release -rs
lsb_release -rs
每次都会使用的相同版本号。KISS
我们可以在每个操作系统中添加一个简单的自定义菜单项,然后在Grub菜单中看到Grub从哪个OS加载了它的配置文件。
例:
我们启动到16.04,然后编辑文件/etc/grub.d/40_custom
以添加菜单项。
#!/ bin / sh exec tail -n +3 $ 0 #此文件提供了一种添加自定义菜单项的简便方法。只需键入 您要在此注释后添加的#个菜单项。注意不要改变 #上面的'exec tail'行。 # menuentry'从16.04加载的grub.conf'{ 重启 }
我们确保该文件是可执行文件并可以运行sudo update-grub
。
然后,我们在其他操作系统中进行相同的更改,我们仅对菜单项使用不同的名称,例如,我们更改16.04
为15.04
等等。
如果在引导过程中在Grub菜单中选择此菜单项,则计算机将仅重新引导,我们创建它们不是引导任何操作系统,而是查看实际用于加载的操作系统grub.conf
。
附加信息
当我们安装都使用Grub的多个操作系统,并且在安装操作系统期间,我们选择相同的引导加载程序位置时,就会出现这种混乱。实际上,我们仅需要一个安装Grub的操作系统,Grub可以引导到任何Linux发行版中,因此,如果我们安装了一个发行版(包括Grub),则可以安装其他操作系统而不安装Grub。
在旧版安装中,很容易处理引导加载程序的安装位置,因为我们可以选择partition-boot-record作为位置,但是我们必须小心选择正确的分区。因此,一个操作系统将引导加载程序安装到MBR,其他操作系统将引导加载程序安装到OS分区的PBR。仅Something else
在安装过程中使用-option时才有这种可能性。
在UEFI安装中,这有点奇怪,引导加载程序将安装到EFI系统分区(ESP)中的文件夹中,并且多个引导加载程序可以轻松共存。这里的问题是,所有的Ubuntu版本和其他一些Linux发行版都将Grub安装到ESP中的同一文件夹中,我们别无选择。因此,安装其他Linux发行版将覆盖我们已经存在的引导加载程序。我知道避免这种情况的唯一方法是启动到实时会话,然后使用启动启动安装程序sudo ubiquity -b
。
另一个简单的解决方案
假设我们在分区上安装了三个Linux发行版sda1
,sda2
并且sda3
。现在,我们来看一下Grub的启动菜单项。在启动过程中,我们将看到以下内容:
1个Ubuntu 2 Ubuntu的高级选项 3内存测试(memtest86 +) 4内存测试(memtest86 +,串行控制台115200) 5 Ubuntu(在/ dev / sda2上) Ubuntu的6个高级选项(在/ dev / sda2上) 7 Ubuntu 17.04(在/ dev / sda3上) Ubuntu的8个高级选项(在/ dev / sda3上)
前两个条目是用于操作系统的条目,该操作系统生成了grub.conf
我们实际使用的-file。条目#3和#4目前并不有趣。条目#5,#6,#7和#8是使用OS-prober生成的条目,我们看到这些条目的OS驻留在哪个分区上。因此,在这个小例子的情况下,我们可以得出结论:grub.config
我们实际使用的-file不属于OS sda2
或属于sda3
OS sda1
。如果使用单独的/boot
-partition 安装了一个或多个OS,则我们必须检查哪个/boot
-partition属于哪个OS,但这可以通过findmnt
在每个OS中运行-command 来轻松实现。
要知道用户是从哪个分区引导的,请在引导任何已安装的系统之前查看引导加载程序菜单。不查看引导加载程序菜单就很难分辨。
在哪里看
在下面的组合屏幕截图中,我标记了三个提示,一个提示可能知道用户从哪个分区启动。
标签(1):第一个条目下方的GNU GRUB菜单条目
标签(2):GNU GRUB版本位于引导加载程序菜单顶部
标签(3):GNU GRUB背景图片(需要手动设置)
最明显的提示是标签(3),该标签用于在具有引导加载程序菜单控制的系统上更改GNU GRUB背景图像。如果用户事先进行设置,这是最容易告诉的。
标签(1)解释
查找第一个条目下方的菜单条目中未列出的分区。在屏幕截图中,仅安装了两个操作系统,即“ Ubuntu”和“ Ubuntu 14.04.5 LTS”。
Ubuntu
Advanced options for Ubuntu
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Ubuntu 14.04.5 LTS (14.04) (on /dev/sda3)
Advanced options for Ubuntu 14.04.5 LTS (14.04) (on /dev/sda3)
后者已经提到(on /dev/sda3)
,这意味着前者可能位于/dev/sda2
或上/dev/sda1
。可以肯定的是,在启动系统即“ Ubuntu”后,运行相关命令列出可用分区(lsblk
似乎是最简单的方法)。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 13G 0 disk
├─sda1 8:1 0 976M 0 part [SWAP]
├─sda2 8:2 0 6G 0 part /
└─sda3 8:3 0 6G 0 part
sr0 11:0 1 55.7M 0 rom
仅在与的输出进行比较之后lsblk
,我们知道可以在其中管理引导加载程序菜单的系统/dev/sda2
(未在菜单条目中列出)中找到“ Ubuntu” 。
标签(2)解释
查找在引导加载程序菜单顶部打印的GRUB版本。请注意该版本,并将其与已引导系统(即“ Ubuntu”)上找到的GRUB版本进行比较。
在屏幕截图(下半部分)中: GNU GRUB version 2.02~beta2-9
引导系统即“ Ubuntu”后,运行相关命令以检查GRUB软件包的版本(grub-install --version
相关且最直接)。
$ grub-install --version
grub-install (GRUB) 2.02~beta2-9
这有什么关系?因为grub-install
和update-grub
命令都由同一软件包提供grub2-common
。假设使用同一软件包中的工具创建和更新了引导加载程序菜单,则引导加载程序菜单顶部的印刷版本将相同。
标签(3)解释
由于引导加载程序菜单的默认背景图片为none(纯黑色),因此需要手动设置此提示。背景图像必须为8位深度。
如果desktop-base
您的系统上安装了软件包,则可以*grub.png
在目标目录中轻松找到带有GRUB的背景图像,并且文件名后缀为。
$ ls /usr/share/images/desktop-base/*grub.png
/usr/share/images/desktop-base/desktop-grub.png
/usr/share/images/desktop-base/joy-grub.png
/usr/share/images/desktop-base/moreblue-orbit-grub.png
/usr/share/images/desktop-base/spacefun-grub.png
设置背景图像:
/etc/default/grub
以超级用户身份打开文件,然后将GRUB_BACKGROUND=
带有完整路径的行添加到所选图像并加引号。
$ sudo nano /etc/default/grub
...
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
# Show background in GRUB boot menu
GRUB_BACKGROUND="/usr/share/images/desktop-base/spacefun-grub.png"
...
然后,运行sudo update-grub
以进行更新/boot/grub/grub.cfg
,其中包括引导加载程序菜单。用户将看到与以下类似的输出。
$ sudo update-grub
Generating grub configuration file ...
Found background: /usr/share/images/desktop-base/spacefun-grub.png
Found background image: /usr/share/images/desktop-base/spacefun-grub.png
Found linux image: /boot/vmlinuz-3.13.0-24-generic
Found initrd image: /boot/initrd.img-3.13.0-24-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
Found Ubuntu 14.04.5 LTS (14.04) on /dev/sda3
done
重新引导机器,并查看引导加载程序菜单是否有系统中的update命令对显示的任何更改。
否则,对其他系统重复一次,一次。如果用户知道哪个系统可以控制引导加载程序菜单(同样,这取决于安装方式),则不需要重复这些步骤。
免责声明
该答案说明了使用GNU GRUB PC / BIOS版本进行多重引导设置的BIOS系统的可靠且经过测试的标准。以下例外适用。
对于使用GNU GRUB EFI版本UEFI系统对应,则不能保证或不如果标准将出现如上述是相同的公知的。
重点放在引导加载程序菜单的外观上(它看起来可能与屏幕截图的上半部分不同),而不是演示链加载的工作方式。这样,关于“如何设置屏幕快照中所示的多重启动”将不会在此答案中进行解释。
如果多重启动设置是由相似操作系统(例如Ubuntu 14.04,Kubuntu 14.04,Xubuntu 14.04等)的完全相同的副本组成的,则知道用户从哪个分区启动的唯一可靠方法是标签(3)。
标签(3)可能会使用自定义背景图像来更好地工作,该背景图像会显式地从中进行引导,即“从/ dev / sda1管理此引导菜单”。同样,关于“如何为GRUB创建自定义背景图片”的内容也不会在此答案中进行解释。
TL; DR 在引导任何已安装的系统之前,请查看引导加载程序菜单。最简单,最可靠的了解方法是标签(3),它是手动设置GRUB背景图像。
/boot/grub/grub.cfg
用于引导的文件可能已被删除,该分区可能已从分区表中删除,并且该磁盘已从系统中物理删除。