我怎么知道我从哪个分区启动?


12

我有一台具有多重启动分区的机器。我在一个分区上具有Ubuntu 14.04,在第二个分区上具有Ubuntu 15.04,在第三个分区上具有Ubuntu 16.04。有什么办法可以从命令行知道我从哪个分区引导,以便找到/boot/grub/grub.cfg用于引导过程的分区?我/boot/grub/grub.cfg 在三个分区中的每一个上都有。


3
您无法做到绝对的普遍性和可靠性。众所周知,/boot/grub/grub.cfg用于引导的文件可能已被删除,该分区可能已从分区表中删除,并且该磁盘已从系统中物理删除。
Federico Poloni's

Answers:


10

一旦GRUB放弃了引导到内核的启动,内核就不知道启动它的原因,并且/boot可能不是GRUB使用的那个。您可以检查boot/grub/grub.cfg每个分区中的访问时间,以查看最近访问过的分区。这样可以告诉您使用了哪个分区的配置文件GRUB。

stat -c %x /boot/grub/grub.cfg

如果访问时间未更新,则必须查找各种GRUB配置文件使用的内核参数中的任何差异。如果您可以更改它们,例如将foo=1foo=2等等添加到其中GRUB_CMDLINE_LINUX的每一个中sudo update-grub2,然后运行并重新启动,则可以查看/proc/cmdline是否使用了这些值。


有趣!这是否意味着我的解决方案也比Ravexina和Katu的准确率更高?
tatsu

@tatsu IMO所有其他答案都不正确-Ravexina正在定位分区所在/boot的位置,但这可能不是grub所使用的分区,而您和Katu发现安装在/其上的分区已安装,但是,正如Ravexina指出的那样,甚至更少的联系
大师

1
是的,但是除了挂载的分区发生故障之外,如何进行卸载可能会做其他事情:磁盘会提供以下信息:已安装设备的地址,可能需要的任何id信息,以及您刚刚尝试卸载的ID信息。我是第一个承认我的解决方案很丑陋,但确实有100%的成功率吗?
tatsu

1
@tatsu成功率是多少?确定已找到安装在上的分区/。查找引导时使用了哪个分区的GRUB配置?我不知道这有什么关系。
muru

4
鉴于grub是自己的DOS且不受Linux文件系统驱动程序约定的约束,因此grub是否会实际设置该访问时间戳?
rackandboneman's

4

众所周知,您要查找的文件位于/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彼此不同时才有效。


2
在文件系统UUID后面查找设备节点的更简单方法(不需要超级用户特权)是readlink -f /dev/disk/by-uuid/<UUID>
大卫·佛斯特

3

要显示保存当前安装的根文件系统的设备:

awk '$2=="/"{print $1}' /proc/mounts

要显示当前正在运行的Ubuntu发行版本:

lsb_release -rs

实际上,该问题引起了很多关注,似乎是最合适的答案。我敢打赌,没有两个发行版的发行版具有lsb_release -rs每次都会使用的相同版本号。KISS

不幸的是,这不起作用。我在具有多个操作系统的机器上测试了您的命令,只有我的“主操作系统”在MBR中安装了grub,其他操作系统在PBR中安装了Grub,该命令似乎显示了操作系统中安装了Grub的位置,但没有显示显示从哪个OS Grub加载配置文件
mook765 '17

@ mook765:我的回答与Grub或MBR(或任何引导加载程序或分区表类型)绝对无关。我不确定您到底尝试了什么以及希望看到什么。
大卫·佛斯特

那么这个答案与问题无关...
mook765 '17

@ mook765:如果按字面意思讲,那么可以。但是对我来说,OP似乎想知道他当前正在启动多个Ubuntu安装中的哪个安装,对此我的回答应该还不错。
大卫·佛斯特

2

我们可以在每个操作系统中添加一个简单的自定义菜单项,然后在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.0415.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发行版sda1sda2并且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或属于sda3OS sda1。如果使用单独的/boot-partition 安装了一个或多个OS,则我们必须检查哪个/boot-partition属于哪个OS,但这可以通过findmnt在每个OS中运行-command 来轻松实现。


+1尽管冗长,但该答案实际上包含了相关要点。对于BIOS系统,进行多次引导的用户应该在安装程序中更喜欢“其他”,以具有更多控制权。无需强制“不安装GRUB引导加载程序”(请参阅我的旧答案)。对于UEFI系统,多重引导设置似乎无法解释或未经测试。
clearkimura

1
lsblk

并检查安装在哪个磁盘上/。如果您有意见,请阅读以下评论或Ravexina的回答/boot

如果不确定,请检查UUID

lsblk -o UUID,NAME,SIZE,MOUNTPOINT

2
这不是真的,如果我/boot是一个单独的分区怎么办?然后/boot/grub/grub.cfg不在/分区中。
拉韦西纳

@Ravexina获取技术知识,这可能是正确的。但是,出于该用户的目的,/分区不计数吗?

@MarkYisri我想我应该说这并不总是正确的,但是OP告诉我们他将文件放在三个不同的分区上,所以我认为最好先检查一个单独的文件/boot
拉韦西纳

1
感谢您指出@Ravexina,我已经更新了答案。
卡图

0

要知道用户是从哪个分区引导的,请在引导任何已安装的系统之前查看引导加载程序菜单。不查看引导加载程序菜单就很难分辨。

在哪里看

在下面的组合屏幕截图中,我标记了三个提示,一个提示可能知道用户从哪个分区启动。

使用带有注释的GNU GRUB PC / BIOS版本的多重启动菜单

标签(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-installupdate-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

设置背景图像:

  1. /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"
    ...
    
  2. 然后,运行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
    
  3. 重新引导机器,并查看引导加载程序菜单是否有系统中的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背景图像。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.