Detaillierte Einführung in grub2

零下一度
零下一度Original
2017-06-30 15:40:077476Durchsuche

Übersetzte den größten Teil des offiziellen Handbuchs von grub2 und sortierte es dann selbst. Da der Inhalt etwas kompliziert ist, ist die Anordnung der Kapitel möglicherweise nicht sehr sinnvoll. Bitte haben Sie daher Verständnis.


Verzeichnis dieses Artikels:

1.1 Grundlegende Inhalte

1.2 Grub2 installieren

1.3 Grub2-Konfigurationsdatei

1.4 Befehle in der Befehlszeile und Menüelementen

1.5 Mehrere häufig verwendete integrierte Variablen

1.6 Grub-Konfigurations- und Installationsbeispiel

1.7 Kurze Einführung in traditionelles Grub


Dieser Artikel stellt hauptsächlich grub2 vor. Am Ende des Artikels wird das traditionelle Grub kurz beschrieben, aber der Inhalt von grub2 enthält viele Vergleiche zwischen grub2 und traditionellem Grub.

Wenn Sie nur die Rolle von boot.img/core.img/diskboot.img/kernel.img in grub2 oder die Rolle von stage1/stage1_5/stage2-Dateien in traditionell wissen möchten grub, bitte direkt zum verwandten Inhalt springen, um ihn zu lesen.


1.1 Grundinhalt

1.1.1 Der Unterschied zwischen grub2 und grub

Offizieller Handbuch-Originaltext:

Erklären Sie nur einige der wichtigsten:

1. Der Name der Konfigurationsdatei hat sich geändert. In Grub heißt die Konfigurationsdatei grub.conf oder menu.lst (ein Softlink zu grub.conf) und wird in grub2 in grub.cfg umbenannt.

2.grub2 fügt viel Syntax hinzu, die einer Skriptsprache näher kommt, wie z. B. unterstützende Variablen, bedingte Beurteilungen und Schleifen.

3. In grub2 beginnt der Gerätename bei 1, in Grub jedoch bei 0.

4.grub2 verwendet IMG-Dateien und verwendet Stage1, Stage1.5 und Stage2 in Grub nicht mehr.

5. Unterstützt die grafische Oberfläche zum Konfigurieren von Grub, Sie müssen jedoch das Grub-Customizer-Paket installieren, das von der Epel-Quelle bereitgestellt wird.

6. Nach dem Aufrufen der Betriebssystemumgebung steht der Grub-Befehl nicht mehr zur Verfügung, das heißt, die interaktive Grub-Schnittstelle kann nur beim Booten des Computers aufgerufen werden, was ein großes Manko darstellt .

7. Es gibt keinen nützlichen Suchbefehl in grub2, was ein weiterer großer Mangel ist.

1.1.2 Benennungsgewohnheiten und Dateipfaddarstellung

Offizieller Handbuch-Originaltext:

(fd0)           :表示第一块软盘
(hd0,msdos2)    :表示第一块硬盘的第二个mbr分区。grub2中分区从1开始编号,传统的grub是从0开始编号的
(hd0,msdos5)    :表示第一块硬盘的第一个逻辑分区
(hd0,gpt1)      :表示第一块硬盘的第一个gpt分区/boot/vmlinuz   :相对路径,基于根目录,表示根目录下的boot目录下的vmlinuz,
                :如果设置了根目录变量root为(hd0,msdos1),则表示(hd0,msdos1)/boot/vmlinuz
(hd0,msdos1)/boot/vmlinuz:绝对路径,表示第一硬盘第一分区的boot目录下的vmlinuz文件

1.1.3 Wie grub2 das Betriebssystem startet

Originaltext des offiziellen Handbuchs:

grub2 unterstützt zwei Möglichkeiten, das Betriebssystem zu starten :

  • Direkter Start: (Direktladen) Starten Sie das in der Standardkonfigurationsdatei geschriebene Betriebssystem direkt über den standardmäßigen Grub2-Bootloader

  • Kettentyp Boot: (Kettenladen) Verwenden Sie den Standard-Bootloader von grub2, um einen anderen Bootloader in der Kette zu booten.

Im Allgemeinen wird nur die erste Methode verwendet Die zweite Methode wird nur verwendet, wenn Sie ein Betriebssystem starten möchten, das Grub nicht standardmäßig unterstützt.

1.1.4 Dateiverteilung nach der Installation des Grub2-Programms und des traditionellen Grub-Programms

Nach der Installation der traditionellen Grub-Software werden einige Phasen im Verzeichnis /usr/share/grub/RELEASE/ generiert. Verzeichnisdokument.

[root@xuexi ~]# ls /usr/share/grub/x86_64-redhat/e2fs_stage1_5      ffs_stage1_5       jfs_stage1_5       reiserfs_stage1_5  stage2             ufs2_stage1_5      xfs_stage1_5
fat_stage1_5       iso9660_stage1_5   minix_stage1_5     stage1             stage2_eltorito    vstafs_stage1_5

Nachdem die Grub2-Software installiert wurde, werden viele Moduldateien und IMG-Dateien im Verzeichnis /usr/lib/grub/i386-pc/ generiert. Verzeichnis, enthält auch einige LST-Listendateien.

[root@server7 ~]# ls /usr/lib/grub/i386-pc/*.mod | wc -l257[root@server7 ~]# ls -lh /usr/lib/grub/i386-pc/*.lst   
-rw-r--r--. 1 root root 3.7K Nov 24  2015 /usr/lib/grub/i386-pc/command.lst
-rw-r--r--. 1 root root  936 Nov 24  2015 /usr/lib/grub/i386-pc/crypto.lst
-rw-r--r--. 1 root root  214 Nov 24  2015 /usr/lib/grub/i386-pc/fs.lst
-rw-r--r--. 1 root root 5.1K Nov 24  2015 /usr/lib/grub/i386-pc/moddep.lst
-rw-r--r--. 1 root root  111 Nov 24  2015 /usr/lib/grub/i386-pc/partmap.lst
-rw-r--r--. 1 root root   17 Nov 24  2015 /usr/lib/grub/i386-pc/parttool.lst
-rw-r--r--. 1 root root  202 Nov 24  2015 /usr/lib/grub/i386-pc/terminal.lst
-rw-r--r--. 1 root root   33 Nov 24  2015 /usr/lib/grub/i386-pc/video.lst[root@server7 ~]# ls -lh /usr/lib/grub/i386-pc/*.img-rw-r--r--. 1 root root  512 Nov 24  2015 /usr/lib/grub/i386-pc/boot_hybrid.img
-rw-r--r--. 1 root root  512 Nov 24  2015 /usr/lib/grub/i386-pc/boot.img
-rw-r--r--. 1 root root 2.0K Nov 24  2015 /usr/lib/grub/i386-pc/cdboot.img
-rw-r--r--. 1 root root  512 Nov 24  2015 /usr/lib/grub/i386-pc/diskboot.img
-rw-r--r--. 1 root root  28K Nov 24  2015 /usr/lib/grub/i386-pc/kernel.img
-rw-r--r--. 1 root root 1.0K Nov 24  2015 /usr/lib/grub/i386-pc/lnxboot.img
-rw-r--r--. 1 root root 2.9K Nov 24  2015 /usr/lib/grub/i386-pc/lzma_decompress.img
-rw-r--r--. 1 root root 1.0K Nov 24  2015 /usr/lib/grub/i386-pc/pxeboot.img

1.1.5 boot loader和grub的关系

当使用grub来管理启动菜单时,那么boot loader都是grub程序安装的。

传统的grub将stage1转换后的内容安装到MBR(VBR或EBR)中的boot loader部分,将stage1_5转换后的内容安装在紧跟在MBR后的扇区中,将stage2转换后的内容安装在/boot分区中。

grub2将boot.img转换后的内容安装到MBR(VBR或EBR)中的boot loader部分,将diskboot.img和kernel.img结合成为core.img,同时还会嵌入一些模块或加载模块的代码到core.img中,然后将core.img转换后的内容安装到磁盘的指定位置处。

它们之间更具体的关系见下文。

1.1.6 grub2的安装位置

官方手册原文:

严格地说是core.img的安装位置,因为boot.img的位置是固定在MBR或VBR或EBR上的。

(1).MBR

MBR格式的分区表用于PC BIOS平台,这种格式允许四个主分区和额外的逻辑分区。使用这种格式的分区表,有两种方式安装GURB:

  1. 嵌入到MBR和第一个分区中间的空间,这部分就是大众所称的"boot track","MBR gap"或"embedding area",它们大致需要31kB的空间;

  2. 将core.img安装到某个文件系统中,然后使用分区的第一个扇区(严格地说不是第一个扇区,而是第一个block)存储启动它的代码。

这两种方法有不同的问题。

使用嵌入的方式安装grub,就没有保留的空闲空间来保证安全性,例如有些专门的软件就是使用这段空间来实现许可限制的;另外分区的时候,虽然会在MBR和第一个分区中间留下空闲空间,但可能留下的空间会比这更小。

方法二安装grub到文件系统,但这样的grub是脆弱的。例如,文件系统的某些特性需要做尾部包装,甚至某些fsck检测,它们可能会移动这些block。

GRUB开发团队建议将GRUB嵌入到MBR和第一个分区之间,除非有特殊需求,但仍必须要保证第一个分区至少是从第31kB(第63个扇区)之后才开始创建的。

现在的磁盘设备,一般都会有分区边界对齐的性能优化提醒,所以第一个分区可能会自动从第1MB处开始创建。

(2).GPT

一些新的系统使用GUID分区表(GPT)格式,这种格式是EFI固件所指定的一部分。但如果操作系统支持的话,GPT也可以用于BIOS平台(即MBR风格结合GPT格式的磁盘),使用这种格式,需要使用独立的BIOS boot分区来保存GRUB,GRUB被嵌入到此分区,不会有任何风险。

当在gpt磁盘上创建一个BIOS boot分区时,需要保证两件事:(1)它最小是31kB大小,但一般都会为此分区划分1MB的空间用于可扩展性;(2)必须要有合理的分区类型标识(flag type)。

例如使用gun parted工具时,可以设置为bios_grub标识:

# parted /dev/sda toggle partition_num bios_grub
# parted /dev/sda set partiton_num bios_grub on

如果使用gdisk分区工具时,则分类类型设置为"EF02"。

如果使用其他的分区工具,可能需要指定guid,则可以指定其guid为"21686148-6449-6e6f-744e656564454649"。

下图是某个bios/gpt格式的bios boot分区信息,从中可见,它大小为1M,没有文件系统,分区表示为bios_grub。

下图为gpt磁盘在图形界面下安装操作系统时创建的Bios boot分区。

1.1.7 进入grub命令行

在传统的grub上,可以直接在bash下敲入grub命令进入命令交互模式,但grub2只能在系统启动前进入grub交互命令行。

按下e见可以编辑所选菜单对应的grub菜单配置项,按下c键可以进入grub命令行交互模式。


1.2 安装grub2

官方手册原文:

这里的安装指的不是安装grub程序,而是安装Boot loader,但一般都称之为安装grub,且后文都是这个意思。

1.2.1 grub安装命令

安装方式非常简单,只需调用grub2-install,然后给定安装到的设备名即可。

shell> grub2-install /dev/sda

这样的安装方式,默认会将img文件放入到/boot目录下,如果想自定义放置位置,则使用--boot-directory选项指定,可用于测试练习grub的时候使用,但在真实的grub环境下不建议做任何改动。

shell> grub2-install --boot-director=/mnt/boot /dev/fd0

如果是EFI固件平台,则必须挂载好efi系统分区,一般会挂在/boot/efi下,这是默认的,此时可直接使用grub2-install安装。

shell> grub2-install

如果不是挂载在/boot/efi下,则使用--efi-directory指定efi系统分区路径。

shell> grub2-install --efi-directory=/mnt/efi

grub2-install ist eigentlich ein Shell-Skript, das zum Aufrufen anderer Tools verwendet wird. Die eigentlichen Funktionen werden von anderen Tools ausgeführt. Wenn Sie also mit den internen Befehlen und Mechanismen von Grub sehr vertraut sind, benötigen Sie grub2-install überhaupt nicht.

Der entsprechende herkömmliche Grub-Installationsbefehl ist grub-install und seine Verwendung ist die gleiche wie grub2-install.


1.2.2 Beschreibung verschiedener IMG- und Stage-Dateien

Offizieller Handbuch-Originaltext:

Die IMG-Datei wird von Grub2 generiert und die Stage-Datei wird von herkömmlichem Grub generiert. Nachfolgend finden Sie Beschreibungen der verschiedenen Dateien.

1.2.2.1 IMG-Dateien in Grub2

Grub2 generiert mehrere IMG-Dateien, einige werden im Verzeichnis /usr/lib/grub/i386-pc und andere in /boot/ verteilt. Ich glaube, dass Sie die Beziehung zwischen ihnen im Verzeichnis grub2/i386-pc verstehen werden, nachdem Sie das Folgende gelesen haben.

Die folgende Abbildung beschreibt die Beziehung zwischen verschiedenen IMG-Dateien. Unter diesen wird core.img dynamisch generiert und der Pfad lautet /boot/grub2/i386-pc/core.img, während andere img im Verzeichnis /usr/lib/grub/i386-pc vorhanden sind. Bei der Installation von Grub wird boot.img natürlich in das Verzeichnis /boot/grub2/i386-pc kopiert.

(1)boot.img

Unter der BIOS-Plattform ist boot.img die erste von Grub gestartete IMG-Datei und wird in In geschrieben der MBR oder der Bootsektor der Partition, da die Größe des Bootsektors 512 Byte beträgt, beträgt die Größe der IMG-Datei ebenfalls 512 Byte.

Die einzige Funktion von boot.img besteht darin, den ersten Sektor zu lesen, der zu core.img gehört, und zu ihm zu springen, wodurch die Kontrolle an das IMG dieses Sektors übergeben wird. Aufgrund von Größenbeschränkungen kann boot.img die Struktur des Dateisystems nicht verstehen, daher codiert grub2-install den Speicherort von core.img fest in boot.img, sodass der Speicherort von core.img gefunden werden kann.

(2)core.img

core.img wird dynamisch vom Programm grub2-mkimage basierend auf diskboot.img, kernel.img und einer Reihe von Modulen erstellt. In core.img sind genügend Funktionsmodule eingebettet, um sicherzustellen, dass Grub auf /boot/grub zugreifen kann, und relevante Module können geladen werden, um verwandte Funktionen zu implementieren, z. B. das Laden des Startmenüs, das Laden von Informationen über das Zielbetriebssystem usw. Seitdem grub2 wird häufig verwendet. Das dynamische Funktionsmodul macht die Größe von core.img klein genug.

core.img enthält den Inhalt mehrerer IMG-Dateien, einschließlich diskboot.img/kernel.img usw.

Der Installationsort von core.img variiert je nach MBR-Festplatte und GPT-Festplatte, was oben erläutert wurde.

(3)diskboot.img

Wenn das Startgerät eine Festplatte ist, d. h. beim Booten von der Festplatte, ist der Inhalt des ersten Sektors in core.img diskboot. Bild. Die Funktion von diskboo.img besteht darin, die verbleibenden Teile von core.img in den Speicher einzulesen und die Kontrolle an kernel.img zu übertragen. Da das Dateisystem zu diesem Zeitpunkt nicht erkannt wird, werden alle Speicherorte von core.img in der Blockliste aufgeführt. So codiert, dass diskboot.img den restlichen Inhalt finden kann.

Da die IMG-Datei einen Sektor belegt, beträgt die Größe 512 Byte.

(4)cdboot.img

Wenn das Startgerät ein optisches Laufwerk (CD-ROM) ist, d. h. beim Booten vom optischen Laufwerk der Inhalt des ersten Sektors im Kern .img ist cdboo .img. Seine Funktion ist die gleiche wie diskboot.img.

(5)pexboot.img

Beim Booten aus der PXE-Umgebung des Netzwerks ist der Inhalt des ersten Sektors in core.img pxeboot.img.

(6)kernel.img

Die Datei kernel.img enthält die grundlegende Laufzeitumgebung von Grub: Geräteframework, Dateihandle, Umgebungsvariablen, Befehlszeilenparser im Rettungsmodus usw. . Sie werden selten direkt verwendet, da sie vollständig in core.img eingebettet sind. Beachten Sie, dass kernel.img der Kernel von Grub ist und nichts mit dem Kernel des Betriebssystems zu tun hat.

Wenn Sie vorsichtig sind, werden Sie feststellen, dass kernel.img selbst 28 KB Speicherplatz einnimmt, die Datei core.img jedoch nach der Einbettung in core.img nur 26 KB groß ist. Dies liegt daran, dass kernel.img in core.img komprimiert ist.

(7)lnxboot.img

Die IMG-Datei wird vor core.img platziert, wodurch Grub dem Linux-Kernel ähnelt, sodass core.img von LILOs „Image“ verwendet werden kann ="identifizieren. Natürlich wird dies in Verbindung mit LILO verwendet, aber wer nutzt LILO jetzt noch?

(8)*.mod

Verschiedene Funktionsmodule, von denen einige in core.img eingebettet sind oder automatisch von Grub geladen werden, aber manchmal ist es auch notwendig, das zu verwenden insmod-Befehl, um sie manuell zu laden.

1.2.2.2 传统grub中的stage文件

grub2的设计方式和传统grub大不相同,因此和stage之间的对比关系其实没那么标准,但是将它们拿来比较也有助于理解img和stage文件的作用。

stage文件也分布在两个地方:/usr/share/grub/RELEASE目录下和/boot/grub目录下,/boot/grub目录下的stage文件是安装grub时从/usr/share/grub/RELEASE目录下拷贝过来的。

(1)stage1

stage1文件在功能上等价于boot.img文件。目的是跳转到stage1_5或stage2的第一个扇区上。

(2)*_stage1_5

*stage1_5文件包含了各种识别文件系统的代码,使得grub可以从文件系统中读取体积更大功能更复杂的stage2文件。从这一方面考虑,它类似于core.img中加载对应文件系统模块的代码部分,但是core.img的功能远比stage1_5多。

stage1_5一般安装在MBR后、第一个分区前的那段空闲空间中,也就是MBR gap空间,它的作用是跳转到stage2的第一个扇区。

其实传统的grub在某些环境下是可以不用stage1_5文件就能正常运行的,但是grub2则不能缺少core.img。

(3)stage2

stage2的作用是加载各种环境和加载内核,在grub2中没有完全与之相对应的img文件,但是core.img中包含了stage2的所有功能。

当跳转到stage2的第一个扇区后,该扇区的代码负责加载stage2剩余的内容。

注意,stage2是存放在磁盘上的,并没有像core.img一样嵌入到磁盘上。

(4)stage2_eltorito

功能上等价于grub2中的core.img中的cdboot.img部分。一般在制作救援模式的grub时才会使用到cd-rom相关文件。

(5)pxegrub

功能上等价于grub2中的core.img中的pxeboot.img部分。

1.2.3 安装grub涉及的过程

安装grub2的过程大体分两步:一是根据/usr/lib/grub/i386-pc/目录下的文件生成core.img,并拷贝boot.img和core.img涉及的某些模块文件到/boot/grub2/i386-pc/目录下;二是根据/boot/grub2/i386-pc目录下的文件向磁盘上写boot loader。

当然,到底是先拷贝,还是先写boot loader,没必要去搞清楚,只要/boot/grub2/i386-pc下的img文件一定能通过grub2相关程序再次生成boot loader。所以,既可以认为/boot/grub2/i386-pc目录下的img文件是boot loader的特殊备份文件,也可以认为是boot loader的源文件。

不过,img文件和boot loader的内容是不一致的,因为img文件还要通过grub2相关程序来转换才是真正的boot loader。

对于传统的grub而言,拷贝的不是img文件,而是stage文件。

以下是安装传统grub时,grub做的工作。很不幸,grub2上没有该命令,也没有与之等价的命令。

grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.

首先检测各stage文件是否存在于/boot/grub目录下,随后嵌入stage1_5到磁盘上,该文件系统类型的stage1_5占用了15个扇区,最后安装stage1,并告知stage1 stage1_5的位置是第1到第15个扇区,之所以先嵌入stage1_5再嵌入stage1就是为了让stage1知道stage1_5的位置,最后还告知了stage1 stage2和配置文件menu.lst的路径。


1.3 grub2配置文件

grub2的默认配置文件为/boot/grub2/grub.cfg,该配置文件的写法弹性非常大,但绝大多数需要修改该配置文件时,都只需修改其中一小部分内容就可以达成目标。

grub2-mkconfig程序可用来生成符合绝大多数情况的grub.cfg文件,默认它会自动尝试探测有效的操作系统内核,并生成对应的操作系统菜单项。使用方法非常简单,只需一个选项"-o"指定输出文件即可。

shell> grub2-mkconfig -o /boot/grub2/grub.cfg

1.3.1 通过/etc/default/grub文件生成grub.cfg

官方手册原文:

grub2-mkconfig是根据/etc/default/grub文件来创建配置文件的该文件中定义的是grub的全局宏,修改内置的宏可以快速生成grub配置文件。实际上在/etc/grub.d/目录下还有一些grub配置脚本,这些shell脚本读取一些脚本配置文件(如/etc/default/grub),根据指定的逻辑生成grub配置文件。若有兴趣,不放读一读/etc/grub.d/10_linux文件,它指导了创建grub.cfg的细节,例如如何生成启动菜单。

[root@xuexi ~]# ls /etc/grub.d/00_header  00_tuned  01_users  10_linux  20_linux_xen  20_ppc_terminfo  30_os-prober  40_custom  41_custom  README

在/etc/default/grub中,使用"key=vaule"的格式,key全部为大小字母,如果vaule部分包含了空格或其他特殊字符,则需要使用引号包围。

例如,下面是一个/etc/default/grub文件的示例:

[root@xuexi ~]# cat /etc/default/grubGRUB_TIMEOUT=5GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=trueGRUB_TERMINAL_OUTPUT="console"GRUB_CMDLINE_LINUX="crashkernel=auto biosdevname=0 net.ifnames=0 rhgb quiet"GRUB_DISABLE_RECOVERY="true"

虽然可用的宏较多,但可能用的上的就几个:GRUB_DEFAULT、GRUB_TIMEOUT、GRUB_CMDLINE_LINUX和GRUB_CMDLINE_LINUX_DEFAULT。

以下列出了部分key。

(1).GRUB_DEFAULT

默认的菜单项,默认值为0。其值可为数值N,表示从0开始计算的第N项是默认菜单,也可以指定对应的title表示该项为默认的菜单项。使用数值比较好,因为使用的title可能包含了容易改变的设备名。例如有如下菜单项:

menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux {
    ...
}

如果想将此菜单设为默认菜单,则可设置"GRUB_DEFAULT=example-gnu-linux"。

如果GRUB_DEFAULT的值设置为"saved",则表示默认的菜单项是"GRUB_SAVEDEFAULT"或"grub-set-default"所指定的菜单项。

(2).GRUB_SAVEDEFAULT

默认该key的值未设置。如果该key的值设置为true时,如果选定了某菜单项,则该菜单项将被认为是新的默认菜单项。该key只有在设置了"GRUB_DEFAULT=saved"时才有效。

不建议使用该key,因为GRUB_DEFAULT配合grub-set-default更方便。

(3).GRUB_TIMEOUT

在开机选择菜单项的超时时间,超过该时间将使用默认的菜单项来引导对应的操作系统。默认值为5秒。等待过程中,按下任意按键都可以中断等待。

设置为0时,将不列出菜单直接使用默认的菜单项引导与之对应的操作系统,设置为"-1"时将永久等待选择。

是否显示菜单,和"GRUB_TIMEOUT_STYLE"的设置有关。

(4).GRUB_TIMEOUT_STYLE

如果该key未设置值或者设置的值为"menu",则列出启动菜单项,并等待"GRUB_TIMEOUT"指定的超时时间。

如果设置为"countdown"和"hidden",则不显示启动菜单项,而是直接等待"GRUB_TIMEOUT"指定的超时时间,如果超时了则启动默认菜单项并引导对应的操作系统。在等待过程中,按下"ESC"键可以列出启动菜单。设置为countdown和hidden的区别是countdown会显示超时时间的剩余时间,而hidden则完全隐藏超时时间。

(5).GRUB_DISTRIBUTOR

设置发行版的标识名称,一般该名称用来作为菜单的一部分,以便区分不同的操作系统。

(6).GRUB_CMDLINE_LINUX

添加到菜单中的内核启动参数。例如:

GRUB_CMDLINE_LINUX="crashkernel=ro root=/dev/sda3 biosdevname=0 net.ifnames=0 rhgb quiet"

(7).GRUB_CMDLINE_LINUX_DEFAULT

除非"GRUB_DISABLE_RECOVERY"设置为"true",否则该key指定的默认内核启动参数将生成两份,一份是用于默认启动参数,一份用于恢复模式(recovery mode)的启动参数。

该key生成的默认内核启动参数将添加在"GRUB_CMDLINE_LINUX"所指定的启动参数之后。

(8).GRUB_DISABLE_RECOVERY

该项设置为true时,将不会生成恢复模式的菜单项。

(9).GRUB_DISABLE_LINUX_UUID

默认情况下,grub2-mkconfig在生产菜单项的时候将使用uuid来标识Linux 内核的根文件系统,即"root=UUID=..."。

例如,下面是/boot/grub2/grub.cfg中某菜单项的部分内容。

menuentry 'CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8' {

        ......

        linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 ro crashkernel=auto biosdevname=0 net.ifnames=0 quiet LANG=en_US.UTF-8

        initrd16 /initramfs-3.10.0-327.el7.x86_64.img

}

虽然使用UUID的方式更可靠,但有时候不太方便,所以可以设置该key为true来禁用。

(10).GRUB_BACKGROUND

Legen Sie das Hintergrundbild fest. Das Suffix der Bilddatei muss „.png“, „.tga“, „.jpg“, „.jpeg“ sein Verkleinern Sie die Größe des Bildes, damit es auf den Bildschirm passt.

(11).GRUB_THEME

Legen Sie das Thema des Grub-Menüs fest.

(12).GRUB_GFXPAYLOAD_LINUX

Bei Einstellung auf „Text“ wird der Start von Linux im Textmodus erzwungen. In einigen Fällen wird der Grafikmodus möglicherweise nicht unterstützt.

(13).GRUB_DISABLE_OS_PROBER

Standardmäßig versucht grub2-mkconfig, das Programm os-prober zu verwenden (falls es bereits installiert ist, sollte es standardmäßig installiert sein), um andere verfügbare Programme zu erkennen Betriebssystemkerne und generieren entsprechende Startmenüelemente dafür. Auf „true“ setzen, um die automatische Erkennung zu deaktivieren.

(14).GRUB_DISABLE_SUBMENU

Wenn grub2-mkconfig mehrere Kernel derselben Version oder einer niedrigeren Version findet, wird standardmäßig nur ein Menü der obersten Ebene für die höchste Version von generiert Alle anderen Kernel-Menüs niedrigerer Versionen werden in Untermenüs platziert, und wenn Sie sie auf „y“ setzen, werden sie alle als Menüs der obersten Ebene generiert.

(15).GRUB_HIDDEN_TIMEOUT (veraltet, aber aus Gründen der Abwärtskompatibilität immer noch gültig)

Verwenden Sie „GRUB_TIMEOUT_STYLE={countdown|hidden}“, um dieses Element zu ersetzen

( 16) .GRUB_HIDDEN_TIMEOUT_QUIET (veraltet, aber aus Gründen der Abwärtskompatibilität immer noch gültig)

In Verbindung mit GRUB_HIDDEN_TIMEOUT können Sie GRUB_TIMEOUT_STYLE=countdown verwenden, um diese beiden Elemente zu ersetzen.

1.3.2 Datei grub.cfg direkt im Skript schreiben

Offizieller Handbuch-Originaltext:

  • Kommentarzeichen: Zeichen, die mit # beginnen, werden als Kommentare betrachtet, daher unterstützt Grub Inline-Kommentare

  • Verbindungsoperatoren: { } | b9933e791c881d97cf21f51be602eea1 string2

    string1 ist alphabetisch größer als string2

    string1 >= string2

    string1 ist alphabetisch größer oder gleich string2

    integer1 - eq integer2

    integer1 gleich integer2

    integer1 -ge Ganzzahl2

    Ganzzahl1 ist größer oder gleich Ganzzahl2

    Ganzzahl1 -gt Ganzzahl2

    Ganzzahl1 ist größer als Ganzzahl2

    integer1 -le integer2

    integer1 ist kleiner oder gleich integer2

    Ganzzahl1 -lt Ganzzahl2

    Ganzzahl1 ist kleiner als Ganzzahl2

    Ganzzahl1 -ne Ganzzahl2

    Ganzzahl1 ist nicht gleich Ganzzahl2

    prefixinteger1 -pgt prefixinteger2

    Nach dem Entfernen des Präfixteils der nicht numerischen Zeichenfolge ist integer1 größer als integer2

    prefixinteger1 - plt prefixinteger2

    Nach dem Entfernen des Präfixteils der nicht numerischen Zeichenfolge ist Ganzzahl1 kleiner als Ganzzahl2

    Datei1 - NT-Datei2

    Die Änderungszeit von Datei1 ist neuer als die von Datei2

    Datei1 -ot Datei2

    Die Änderungszeit von Datei1 ist älter als die von Datei2

    -d-Datei

    Datei existiert und ist ein Verzeichnis

    -e Datei

    Datei existiert

    -f-Datei

    Datei existiert und ist kein Verzeichnis

    -s-Datei

    Datei existiert und der von der Datei belegte Speicherplatz ist größer als Null

    -n Zeichenfolge

    Die Länge der Zeichenfolge ist größer als Null

    string

    Die Länge des Strings ist größer als Null, was äquivalent zu -n string

    -z string

    Die Länge der Zeichenfolge ist gleich Null

    ( Ausdruck)

    Nehmen Sie Ausdruck als Ganzes

    Ausdruck >Ausdruck1 -ein Ausdruck2

    AND (AND), Sie können auch expression1 expression2 verwenden, dies wird jedoch nicht empfohlen

    Ausdruck1 -o Ausdruck2

    oder (ODER)

    1.4.10 cat命令

    读取文件内容,借此可以帮助判断哪个是boot分区,哪个是根分区。

    交互式命令行下使用。

    1.4.11 clear命令

    清屏。

    1.4.12 configfile命令

    立即装载一个指定的文件作为grub的配置文件。但注意,导入的文件中的环境变量不在当前生效。

    在grub.cfg丢失时,该命令将排上用场。

    1.4.13 echo命令

    echo [-n] [-e] string

    "-n"和"-e"用法同shell中echo。如果要引用变量,使用${var}的方式。

    1.4.14 export命令

    导出环境变量,若在configfile的file中导出环境变量,将会在当前环境也生效。

    1.4.15 halt和reboot命令

    关机或重启

    1.4.16 ls命令

    ls [args]

    如果不给定任何参数,则列出grub可见的设备。

    如果给定的参数是一个分区,则显示该分区的文件系统信息。

    如果给定的参数是一个绝对路径表示的目录,则显示该目录下的所有文件。

    例如:

    1.4.17 probe命令

    probe [--set var] --partmap|--fs|--fs-uuid|--label device

    探测分区或磁盘的属性信息。如果未指定--set,则显示指定设备对应的信息。如果指定了--set,则将对应信息的值赋给变量var。

    --partmap:显示是gpt还是mbr格式的磁盘。

    --fs:显示分区的文件系统。

    --fs-uuid:显示分区的uuid值。

    --label:显示分区的label值。

    1.4.18 save_env和list_env命令

    将环境变量保存到环境变量块中,以及列出当前的环境变量块中的变量。

    1.4.19 loopback命令

    loopback [-d] device file

    将file映射为回环设备。使用-d选项则是删除映射。

    例如:

    loopback loop0 /path/to/imagels (loop0)/

    1.4.20 normal和normal_exit命令

    进入和退出normal模式,normal是相对于救援模式而言的,只要不是在救援模式下,就是在normal模式下。

    救援模式下,只能使用非常少的命令,而normal模式下则可以使用非常多的命令。

    1.4.21 password和password_pbkdf2命令

    password user clear-password
    password_pbkdf2 user hashed-password

    前者使用明文密码定义一个名为user的用户。不建议使用此命令。

    后者使用哈希加密后的密码定义一个名为user的用户,加密的密码通过"grub-mkpasswd-pbkdf2"工具生成。建议使用该命令。


    1.5 几个常设置的内置变量

    1.5.1 chosen变量

    当开机时选中某个菜单项启动时,该菜单的title将被赋值给chosen变量。该变量一般只用于引用,而不用于修改。

    1.5.2 cmdpath变量

    grub2加载的core.img的目录路径,是绝对路径,即包括了设备名的路径,如(hd0,gpt1)/boot/grub2/。该变量值不应该修改。

    1.5.3 default变量

    指定默认的菜单项,一般其后都会跟随timeout变量。

    default指定默认菜单时,可使用菜单的title,也可以使用菜单的id,或者数值顺序,当使用数值顺序指定default时,从0开始计算。

    1.5.4 timeout变量

    设置菜单等待超时时间,设置为0时将直接启动默认菜单项而不显示菜单,设置为"-1"时将永久等待手动选择。

    1.5.5 fallback变量

    当默认菜单项启动失败,则使用该变量指定的菜单项启动,指定方式同default,可使用数值(从0开始计算)、title或id指定。

    1.5.6 grub_platform变量

    指定该平台是"pc"还是"efi",pc表示的就是传统的bios平台。

    该变量不应该被修改,而应该被引用,例如用于if判断语句中。

    1.5.7 prefix变量

    在grub启动的时候,grub自动将/boot/grub2目录的绝对路径赋值给该变量,使得以后可以直接从该变量所代表的目录下加载各文件或模块。

    例如,可能自动设置为:

    set prefix = (hd0,gpt1)/boot/grub2/

    所以可以使用"$prefix/grubN.cfg"来引用/boot/grub2/grubN.cfg文件。

    该变量不应该修改,且若手动设置,则必须设置正确,否则牵一发而动全身。

    1.5.8 root变量

    该变量指定根设备的名称,使得后续使用从"/"开始的相对路径引用文件时将从该root变量指定的路径开始。一般该变量是grub启动的时候由grub根据prefix变量设置而来的。

    例如prefix=(hd0,gpt1)/boot/grub2,则root=(hd0,gpt1),后续就可以使用相对路径/vmlinuz-XXX表示(hd0,gpt1)/vmlinuz-XXX文件。

    注意:在Linux中,从根"/"开始的路径表示绝对路径,如/etc/fstab。但grub中,从"/"开始的表示相对路径,其相对的基准是root变量设置的值,而使用"(dev_name)/"开始的路径才表示绝对路径。

    一般root变量都表示/boot所在的分区,但这不是绝对的,如果设置为根文件系统所在分区,如root=(hd0,gpt2),则后续可以使用/etc/fstab来引用"(hd0,gpt2)/etc/fstab"文件。

    该变量在grub2中一般不用修改,但若修改则必须指定正确。

    另外,root变量还应该于linux或linux16命令所指定的内核启动参数"root="区分开来,内核启动参数中的"root="的意义是固定的,其指定的是根文件系统所在分区。例如:

    set root='hd0,msdos1'

    linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 ro crashkernel=auto quiet LANG=en_US.UTF-8

    initrd16 /initramfs-3.10.0-327.el7.x86_64.img

    一般情况下,/boot都会单独分区,所以root变量指定的根设备和root启动参数所指定的根分区不是同一个分区,除非/boot不是单独的分区,而是在根分区下的一个目录。


    1.6 grub配置和安装示例

    首先写一个grub.cfg。例如此处,在msdos磁盘上安装了两个操作系统,CentOS 7和CentOS 6。

    # 设置一些全局环境变量
    set default=0set fallback=1set timeout=3# 将可能使用到的模块一次性装载完
    # 支持msdos的模块insmod part_msdos
    # 支持各种文件系统的模块insmod exfatinsmod ext2insmod xfsinsmod fatinsmod iso9660
    
    # 定义菜单
    menuentry 'CentOS 7' --unrestricted {
            search --no-floppy --fs-uuid --set=root 367d6a77-033b-4037-bbcb-416705ead095
            linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 ro biosdevname=0 net.ifnames=0 quiet
            initrd16 /initramfs-3.10.0-327.el7.x86_64.img
    }
    menuentry 'CentOS 6' --unrestricted {
            search --no-floppy --fs-uuid --set=root f5d8939c-4a04-4f47-a1bc-1b8cbabc4d32
            linux16 /vmlinuz-2.6.32-504.el6.x86_64 root=UUID=edb1bf15-9590-4195-aa11-6dac45c7f6f3 ro quiet
            initrd16 /initramfs-2.6.32-504.el6.x86_64.img
    }

    然后执行grub安装操作。

    shell> grub2-install /dev/sda


    1.7 传统grub简述

    因为本文主要介绍grub2,所以传统的grub只简单介绍下,其实前面已经提及了很多传统grub和grub2的比较了。另外,传统grub已足够强大,足够应付一般的需求。

    1.7.1 grub安装

    例如安装到/dev/sda上。

    shell> grub-install /dev/sda

    1.7.2 grub.conf配置

    default=0  # 默认启动第一个系统
    timeout=5  # 等待超时时间5秒
    splashimage=(hd0,0)/grub/splash.xpm.gz  # 背景图片
    hiddenmenu  # 隐藏菜单,若要显式,在启动时按下ESC
    title Red Hat Enterprise Linux AS (2.6.18-92.el5)  # 定义操作系统的说明信息
        root (hd0,0) 
        kernel /vmlinuz-2.6.18-92.el5 ro root=/dev/sda2 rhgb quiet
        initrd /initrd-2.6.18-92.el5.img

    Bevor die Konfigurationsmethode erläutert wird, muss ein wichtiger Punkt erläutert werden: ob es sich beim Booten um eine unabhängige Partition handelt, was sich auf die Konfiguration nachfolgender Pfade auswirkt.

    Überprüfen Sie die Datei /boot/grub/grub.conf in einem normalen Betriebssystem. Im Abschnitt „HINWEIS“ wird eine Frage angezeigt, ob Sie eine unabhängige Boot-Partition haben. Wenn dies der Fall ist, bedeutet dies, dass die Pfade von Kernel und Initrd bei / und nicht bei /boot beginnen, z. B. bei /vmlinuz-xxx. Wenn keine unabhängige Startpartition vorhanden ist, muss der Startpfad in den Pfaden von Kernel und Initrd angegeben werden . Boot hat beispielsweise kein Verzeichnis unter dem Dateisystem /, dann /boot/vmlinuz-xxx.

    root (hd0,0) definiert den von Grub erkannten Root. Im Allgemeinen ist die Partition, auf der sich Boot befindet, nur für HD geeignet, sodass hier nur HD0 verwendet werden kann. Die zweite 0 von HD0 bedeutet, dass sich Boot auf der ersten Partition befindet .grub2 Die Berechnung der Partitionen beginnt bei 1, was den Unterschied zwischen herkömmlichem Grub und Grub2 darstellt.

    kernel definiert den Pfad und die Startparameter der Kerneldatei, was dem Befehl grub2 linux oder dem Befehl linux16 entspricht. Erklären Sie zunächst die Parameter. ro bedeutet schreibgeschützt. oder root=UUID="device_uuid_num" gibt die Partition an, in der sich das Root-Dateisystem befindet. rhgb bedeutet, dass während des Startvorgangs des Betriebssystems einige Informationen über die grafische Benutzeroberfläche ausgegeben werden. Das Weglassen kann die Startgeschwindigkeit beschleunigen. Lassen Sie uns den Pfad noch einmal erklären. Wenn es sich beim Booten um eine unabhängige Partition handelt, ist der Kernel-Pfad als /vmlinuz-xxx definiert. Es handelt sich normalerweise um ein Verzeichnis unter dem Root-Dateisystem ist normalerweise /boot/vmlinuz-xxx.

    initrd definiert den Pfad der Init-Ramdisk. Der Pfad wird auf die gleiche Weise wie der Kernel definiert. Es gibt keine Parameter außer dem Pfad.

    Oder verwenden Sie die UUID-Methode wie unten gezeigt.

    Wenn die Option root= nicht angegeben ist, wird der Fehler „no or empty root...dracut...kernel panic“ gemeldet. Wie unten gezeigt.

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in grub2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn