ホームページ  >  記事  >  運用・保守  >  grub2 の詳細な紹介

grub2 の詳細な紹介

零下一度
零下一度オリジナル
2017-06-30 15:40:077377ブラウズ

grub2公式マニュアルの大部分を翻訳し、それを自分で整理しました。内容がやや複雑なため、章立てがあまり合理的ではないかもしれませんが、ご了承ください。


この記事のディレクトリ:

1.1 基本コンテンツ

1.2 grub2をインストールする

1.3 grub 2 設定ファイル

1.4 コマンドラインとメニュー項目

1.5 のコマンド いくつかの一般的な組み込み変数

1.6 grub の設定とインストールの例

1.7 従来の grub の簡単な紹介


これこの記事では主に grub2 について紹介します。記事の最後に従来の grub について簡単に説明しますが、grub2 の内容には grub2 と従来の grub の比較が多く含まれています。

grub2 の boot.img/core.img/diskboot.img/kernel.img または従来の grub の stage1/stage1_5/stage2 ファイルの役割だけを知りたい場合は、 関連のページに直接ジャンプしてください。コンテンツ 読んでください。


1.1 基本的な内容

1.1.1 grub2 と grub の違い

公式マニュアル原文:

いくつかの主要なもののみを説明します:

1.設定ファイルが変更されました。 grub では、設定ファイルは grub.conf または menu.lst (grub.conf へのソフト リンク) であり、grub2 では grub.cfg に名前変更されます。

2.grub2 は、変数、条件判断、ループのサポートなど、スクリプト言語に近い構文を多数追加します。

3. grub2ではデバイス名は1から始まりますが、grubでは0から始まります。

4.grub2 は img ファイルを使用し、grub で stage1、stage1.5、および stage2 を使用しなくなりました。

5. grub を設定するためのグラフィカル インターフェイスをサポートしますが、epel ソースによって提供される grub-customizer パッケージをインストールする必要があります。

6. オペレーティング システム環境に入ると、grub コマンドは提供されなくなります。つまり、grub 対話型インターフェイスに入ることができなくなります。これは大きな欠点です。

7. grub2 には便利な find コマンドがありません。これも大きな欠点です。命1.1.2 命名規則とファイルパス表現

公式マニュアル原文:

R

(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文件
E
1.1.3 GRUB2ガイダンスオペレーティングシステムメソッド

公式マニュアル原文:

Grub2のサポート2オペレーティング システムをブートする方法:

    ダイレクト ブート: (direct-load) デフォルトの grub2 ブート ローダーを通じて、デフォルト設定ファイルに書き込まれたオペレーティング システムを直接ブートします。
  • チェーン ブート: (chain-load)デフォルトの grub2 ブート ローダーは、別のブート ローダーをチェーン ブートします。通常、2 番目の方法は、grub がサポートしていないオペレーティング システムをブートする場合にのみ使用されます。デフォルトの方法。
  • 1.1.4 grub2 プログラムと従来の grub プログラムのインストール後のファイル配布

  • 従来の grub ソフトウェアがインストールされると、いくつかのステージ ファイルが /usr/share/grub/RELEASE/ ディレクトリに生成されます。

[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

grub2 ソフトウェアがインストールされると、いくつかの lst リスト ファイルを含む多くのモジュール ファイルと img ファイルが /usr/lib/grub/i386-pc/ ディレクトリに生成されます。

りー

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 は実際には他のツールを呼び出すために使用されるシェル スクリプトであり、実際の機能は他のツールによって実行されるため、grub の内部コマンドとメカニズムに精通している場合は、grub2-install はまったく必要ありません。

対応する従来の grub インストール コマンドは grub-install で、その使用法は grub2-install と同じです。


1.2.2 各種 img および stage ファイルの説明

公式マニュアル原文:

Img ファイルは grub2 によって生成され、stage ファイルは従来の grub によって生成されます。以下に、さまざまなファイルの説明を示します。 grub2 の

1.2.2.1 img ファイル

grub2 はいくつかの img ファイルを生成し、一部は /usr/lib/grub/i386-pc ディレクトリに配布され、一部は /boot/grub2/i386-pc ディレクトリに配布されます。以下をお読みいただくと、両者の関係が理解できると思います。

次の図は、さまざまな img ファイル間の関係を示しています。このうち、core.img は動的に生成され、パスは /boot/grub2/i386-pc/core.img ですが、他の img は /usr/lib/grub/i386-pc ディレクトリに存在します。もちろん、grub をインストールすると、boot.img は /boot/grub2/i386-pc ディレクトリにコピーされます。

(1)boot.img

BIOS プラットフォームでは、boot.img は grub によって開始される最初の img ファイルで、ブートのサイズにより MBR またはパーティションのブート セクターに書き込まれます。セクターは 512 バイトなので、img ファイルのサイズも 512 バイトになります。

boot.img の唯一の機能は、core.img に属する最初のセクターを読み取り、そこにジャンプし、そのセクターの img に制御を与えることです。サイズ制限により、boot.img はファイル システムの構造を理解できないため、grub2-install は core.img の場所を boot.img にハードコーディングして、core.img の場所を見つけられるようにします。

(2)core.img

core.img は、diskboot.img、kernel.img、および一連のモジュールに基づいて grub2-mkimage プログラムによって動的に作成されます。 core.img には、grub が /boot/grub にアクセスできるようにするために十分な機能モジュールが埋め込まれており、関連するモジュールをロードして、ブート メニューのロード、ターゲット オペレーティング システムに関する情報のロードなどの関連機能を実装できます。 grub2 が広く使用されています。 動的関数モジュールにより、core.img のサイズが十分に小さくなります。

core.img には、diskboot.img/kernel.img などを含む複数の img ファイルの内容が含まれています。

core.img のインストール場所は、MBR ディスクと GPT ディスクによって異なります。これについては上で説明しました。

(3)diskboot.img

ブートデバイスがハードディスクの場合、つまりハードディスクからブートする場合、core.imgの最初のセクターの内容はdiskboot.imgになります。 discboo.img の機能は、core.img の残りの部分をメモリに読み取り、制御を kernel.img に転送することです。この時点ではファイル システムが認識されないため、core.img のすべての場所がブロック リストにリストされます。 diskboot.img が残りのコンテンツを見つけられるような方法でエンコードされます。

imgファイルは1セクターを占有するため、サイズは512バイトです。

(4)cdboot.img

ブートデバイスが CD-ROM ドライブの場合、つまり CD-ROM ドライブからブートする場合、core.img の最初のセクターの内容は cdboo.img です。機能はdiskboot.imgと同じです。

(5)pexboot.img

ネットワークのPXE環境から起動する場合、core.imgの最初のセクターの内容はpxeboot.imgになります。

(6)kernel.img

kernel.img ファイルには、デバイス フレームワーク、ファイル ハンドル、環境変数、レスキュー モードのコマンド ライン パーサーなど、grub の基本的なランタイム環境が含まれています。これらは core.img に完全に埋め込まれているため、直接使用されることはほとんどありません。 kernel.img は grub のカーネルであり、オペレーティング システムのカーネルとは関係がないことに注意してください。

注意して見ると、kernel.img 自体は 28 KB のスペースを占有しますが、core.img に埋め込まれた後の core.img ファイルのサイズはわずか 26 KB であることがわかります。これは、core.img 内の kernel.img が圧縮されているためです。

(7)lnxboot.img

imgファイルをcore.imgの先頭に配置して、Linuxカーネルのようにgrubを作り、LILOの「image=」でcore.imgを認識できるようにしています。もちろんLILOと併用しますが、今でもLILOを使っている人はいるでしょうか?

(8)*.mod

さまざまな機能モジュール。その一部は core.img に埋め込まれているか、grub によって自動的にロードされますが、場合によっては insmod コマンドを使用して手動でロードする必要もあります。

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

背景画像を設定します。画像ファイル名のサフィックスは、必要に応じて縮小されます。画像を画面サイズに合わせて調整します。

(11).GRUB_THEME

grubメニューのテーマを設定します。

(12).GRUB_GFXPAYLOAD_LINUX

「text」に設定すると、Linux は強制的にテキスト モードで起動します。場合によっては、グラフィックス モードがサポートされていない可能性があります。

(13).GRUB_DISABLE_OS_PROBER

デフォルトでは、grub2-mkconfig は os-prober プログラム (既にインストールされている場合は、デフォルトでインストールする必要があります) を使用して、他の利用可能なオペレーティング システム カーネルを検出し、対応するスタートアップを生成しようとします。それらのメニュー項目。自動検出を無効にするには、「true」に設定します。

(14).GRUB_DISABLE_SUBMENU

デフォルトでは、grub2-mkconfig が同じバージョンまたはそれ以下のバージョンの複数のカーネルを検出した場合、カーネルの最上位バージョンのトップレベル メニューのみが生成され、その他すべての下位バージョンは生成されます。カーネル メニューが生成され、サブメニューに配置されます。すべてをトップレベル メニューとして生成するには、「y」に設定します。

(15).GRUB_HIDDEN_TIMEOUT (非推奨ですが、下位互換性のためにまだ有効です)

代わりに「GRUB_TIMEOUT_STYLE={countdown|hidden}」を使用してください

(16).GRUB_HIDDEN_TIMEOUT_QUIET (非推奨ですが、下位互換性のためにまだ有効です) 互換性があり、まだ有効です有効)

GRUB_HIDDEN_TIMEOUT とともに使用すると、GRUB_TIMEOUT_STYLE=countdown を使用してこれら 2 つの項目を置き換えることができます。

1.3.2 grub.cfgファイルをスクリプト内に直接記述する

公式マニュアル原文:

  • コメント文字: #で始まる文字はコメントとみなされ、grubはインラインコメントをサポートします

  • 接続演算子: { } | & $ ; 6d267e5fab17ea8bc578f9e7e5e1570b

  • 予約済みのキーワードと記号: ! [[ ]] { } 関数の場合は doned elif else esac fi if in menuentry select then time until while。 すべてのキーワードが役立つわけではなく、将来の機能拡張のために事前に提供されているだけです。

  • 引用符とエスケープ文字

特殊文字はエスケープする必要があります。エスケープするには、バックスラッシュを使用する方法、一重引用符を使用する方法、および二重引用符を使用する方法の 3 つがあります。

バックスラッシュのエスケープ方法はシェルと同じです。

一重引用符内のすべての文字列はリテラルであり、特別な意味はありません。一重引用符内のエスケープ文字も純粋な文字とみなされます。したがって、'''' は一重引用符を保持できません。シングルクォーテーションはダブルクォーテーションを使用して転送する必要があるため、「'」を記述する必要があります。

二重引用符は一重引用符と同じ効果がありますが、「$」や「」などの特定の特殊文字をエスケープすることはできません。二重引用符内の「$」記号は、常に元の意味を保持します。 "" の場合、バックスラッシュ以降の文字は、'$'、'"'、' のみです。また、行がバックスラッシュで終わる場合は、行継続を意味しますが、公式には推奨されていません。 grub.cfg の継続文字

  • 変数の拡張

変数を参照するには $ 記号を使用します。また、${var} を使用して var 変数を参照することもできます。たとえば、$1 は参照します。最初のパラメータ

は、最後のコマンドの終了ステータス コードを表す $? などの特殊変数もサポートします。位置変数が使用される場合、すべてのパラメータは次のようにサポートされます。 $@ もサポートされており、各パラメータは分割できません。$@ もすべての変数を表しますが、$@ の各パラメータは分割可能です。$# はパラメータの数を表します

    簡単なコマンド
  • を使用できます。 grub.cfg では単純なコマンドを使用します。各コマンドの間に改行またはセミコロンを使用してコマンドの終了を示します。コマンドの前に「!」を使用すると、単語の名前が反転されます。 ; 完了

ループ構造: while cond; do リスト; 完了

  • ;] … [else list;] fi

  • 関数構造: 関数名 { command; … }

  • メニュー項目コマンド: menuentry title [--class=class …] [- -users=users] [- -unrestricted] [--hotkey=key] [--id=id] { command; … }

  • これは grub.cfg の最も重要な項目です、公式原文:

    该命令定义了一个名为title的grub菜单项。当开机时选中该菜单项时,grub会将chosen环境变量的值赋给"--id"(如果给定了"--id"的话),执行大括号中的命令列表,如果直到最后一个命令都全部执行成功,且成功加载了对应的内核后,将执行boot命令。随后grub就将控制权交给了操作系统内核。

    --class:该选项用于将菜单分组,从而使得grub可以通过主题样式为不同组的菜单显示不同的样式风格。一个menuentry中,可以使用多次class表示将该菜单分到多个组中去。

    --users:该选项限定只有此处列出的用户才能访问该菜单项,不指定该选项时将表示所有用户都能访问该菜单。

    --unrestricted:该选项表示所有用户都有权访问该菜单项。

    --hotkey:该选项为该菜单项关联一个热键,也就是快捷键,关联热键后只要按下该键就会选中该菜单。热键只能是字母键、backspace键、tab键或del键。

    --id:该选项为该菜单关联一个唯一的数值。id的值可以由ASCII字母、数字//下划线组成,且不得以数字开头。

    所有其他的参数包括title都被当作位置参数传递给大括号中的命令,但title总是$1,除title外的其余参数,位置值从前向后类推。

    • break [n]:强制退出for/while/until循环

    • continue [n]:跳到下一次迭代,即进入下一次循环

    • return [n]:指定返回状态码

    • setparams [arg] …:从$1开始替换位置参数

    • shift [n]:踢掉前n个参数,使得第n+1个参数变为$1,但和shell中不一样的是,踢掉了前n个参数后,从$#-n+1到$#这些参数的位置不变

    具体如何编写grub.cfg文件,继续看下文的命令和变量。


    1.4 命令行和菜单项中的命令

    官方手册原文:

    grub2支持很多命令,有些命令只能在交互式命令行下使用,有些命令可用在配置文件中。在救援模式下,只有insmod、ls、set和unset命令可用。

    无需掌握所有的命令,掌握用的上的几个命令即可。

    1.4.1 help命令

    help [pattern]

    显示能匹配到pattern的所有命令的说明信息和usage信息,如果不指定patttern,将显示所有命令的简短信息。

    例如"help cmos"。

    1.4.2 boot命令

    用于启动已加载的操作系统。

    只在交互式命令行下可用。其实在menuentry命令的结尾就隐含了boot命令。

    1.4.3 set和unset命令

    set [envvar=value]
    unset envvar

    前者设置环境变量envvar的值,如果不给定参数,则列出当前环境变量。

    后者释放环境变量envvar。

    1.4.4 lsmod命令和insmod命令

    分别用于列出已加载的模块和调用指定的模块。

    注意,若要导入支持ext文件系统的模块时,只需导入ext2.mod即可,实际上也没有ext3和ext4对应的模块。

    1.4.5 linux和linux16命令

    linux file [kernel_args]
    linux16 file [kernel_args]

    都表示装载指定的内核文件,并传递内核启动参数。linux16表示以传统的16位启动协议启动内核,linux表示以32位启动协议启动内核,但linux命令比linux16有一些限制。但绝大多数时候,它们是可以通用的。

    在linux或linux16命令之后,必须紧跟着使用init或init16命令装载init ramdisk文件。

    一般为/boot分区下的vmlinuz-RELEASE_NUM文件。

    但在grub环境下,boot分区被当作root分区,即根分区,假如boot分区为第一块磁盘的第一个分区,则应该写成:

    linux (hd0,msdos1)/vmlinuz-XXX

    或者相对路径的:

    set root='hd0,msdos1'

    linux /vmlinuz-XXX

    在grub阶段可以传递内核的启动参数(内核的参数包括3类:编译内核时参数,启动时参数和运行时参数),可以传递的启动参数非常非常多,完整的启动参数列表见:。这里只列出几个常用的:

    init=   :指定Linux启动的第一个进程init的替代程序。
    root=   :指定根文件系统所在分区,在grub中,该选项必须给定。
    ro,rw   :启动时,根分区以只读还是可读写方式挂载。不指定时默认为ro。
    initrd  :指定init ramdisk的路径。在grub中因为使用了initrd或initrd16命令,所以不需要指定该启动参数。
    rhgb    :以图形界面方式启动系统。
    quiet   :以文本方式启动系统,且禁止输出大多数的log message。
    net.ifnames=0:用于CentOS 7,禁止网络设备使用一致性命名方式。
    biosdevname=0:用于CentOS 7,也是禁止网络设备采用一致性命名方式。
                 :只有net.ifnames和biosdevname同时设置为0时,才能完全禁止一致性命名,得到eth0-N的设备名。

    例如:

    linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=edb1bf15-9590-4195-aa11-6dac45c7f6f3 ro rhgb quiet LANG=en_US.UTF-8

    另外,root启动参数有多种定义方式,可以使用UUID的方式指定,也可以直接指定根文件系统所在分区,如"root=/dev/sda2",

    1.4.6 initrd和initrd16命令

    initrd file

    只能紧跟在linux或linux16命令之后使用,用于为即将启动的内核传递init ramdisk路径。

    同样,基于根分区,可以使用绝对路径,也可以使用相对路径。路径的表示方法和linux或linux16命令相同。例如:

    linux16 /vmlinuz-0-rescue-d13bce5e247540a5b5886f2bf8aabb35 root=UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 ro crashkernel=auto quiet

    initrd16 /initramfs-0-rescue-d13bce5e247540a5b5886f2bf8aabb35.img

    1.4.7 search命令

    search [--file|--label|--fs-uuid] [--set [var]] [--no-floppy] [--hint args] name

    ファイル [--file]、ボリューム ラベル [--label]、ファイル システム UUID [--fs-uuid] でデバイスを検索します。

    「--set」オプションを使用すると、最初に見つかったデバイスが環境変数「var」の値に設定されます。デフォルトの変数「var」は「root」です。

    フロッピー ディスクは非常に遅いため、検索時に「--no-floppy」オプションを使用してフロッピー ディスクの検索を無効にすることができます。

    「--hint=XXX」も指定される場合があります。これは、プロンプト条件を満たすデバイスが最初に選択されることを意味します。複数のヒント条件が指定されている場合、最初のヒントが最初に照合され、次に 2 番目のヒントが照合されます。の上。

    例:

    if [ x$feature_platform_search_hint = xy ]; then

    search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi = hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 367d6a77-033b-4037-bbcb-416705ead095

    else

    search --no-floppy --fs-uuid --set = root 367d6a77-033b-4037-bbcb-416705ead095

    fi

    linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 crashkernel=自動静音 LANG=en_US . UTF-8

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

    上記の if ステートメントの最初の検索では、uuid "367d6a77-033b-4037-bbcb-416705ead095" のデバイスが検索されます。ただし、複数のヒント オプションが使用されます。つまり、BIOS プラットフォームで /boot パーティションが (hd0、msdos1) であるデバイスが最初に照合され、次にいくつかのヒントが指定されます。ただし、検索では uuid 検索方法が使用されるため、これらのヒントは指定されません。はい、単一ディスク上のパーティションの uuid は一意であるため、ヒント オプションは冗長です。

    別の例として、ブート デバイス上に 2 つのブート パーティションがある場合 (複数のシステムが共存する場合など)、現時点で uuid 検索を使用しない場合、それらは (hd0, msdos1) と (hd0, msdos5) になります。ただし、ラベル モード検索を使用します:

    search --no-floppy --fs-label=boot --set=root --hint=hd0,msdos5

    その後、ブート パーティション (hd0,msdos5) が選択されます。今回はヒントを使用しない場合、ブート パーティション (hd0、msdos1) が選択されます。

    1.4.8 true および false コマンド

    は、true または false のブール値を直接返します。

    1.4.9 式と[式]をテストします

    「式」の結果が true かどうかを計算し、true の場合は 0 を返し、それ以外の場合は 0 以外を返します。主に if、while、または until 構造で使用されます。

    string1 == string2

    string1はstring2と同じです

    string1 != string2

    string1 と string2 は同じではありません

    string1 e75224437016f0f7384c2b5e184fc0b0 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

    構成方法を説明する前に、重要なポイントを説明する必要があります。それは、ブートが独立したパーティションであるかどうかであり、これは後続のパスの構成に影響します。

    通常のオペレーティング システムで /boot/grub/grub.conf ファイルを確認します。「通知」セクションに、独立したブート パーティションがあるかどうかを示すプロンプトが表示されます。存在する場合、/vmlinuz-xxx のように、カーネルと initrd のパスが /boot ではなく / から始まることを意味します。独立したブート パーティションがない場合は、カーネルと initrd のパスにブート パスを指定する必要があります。たとえば、ブートには / ファイル システムの下のディレクトリ、次に /boot/vmlinuz-xxx はありません。

    root (hd0,0) は、grub によって認識されるルートを定義します。通常、grub は hd のみを認識できるため、hd0 のみが最初のディスクにあることを意味します。hd0,0 の 2 番目の 0 は、最初のパーティションにあることを意味します。 grub2 パーティションの計算は 1 から始まり、これが従来の grub と grub2 の違いです。

    kernel は、カーネル ファイルのパスと起動パラメータを定義します。これは、grub2 linux コマンドまたは linux16 コマンドに相当します。まずパラメータについて説明します。ro は読み取り専用を意味します。root=/dev/sda[N] または root=UUID="device_uuid_num" は、ルート ファイル システムが配置されているパーティションを指定します。 rhgb は、オペレーティング システムの起動プロセス中にいくつかの情報を出力するためにグラフィカル インターフェイスを使用することを意味し、これを省略すると、オペレーティング システムの起動時に情報を静かに出力することを意味します。パスについてもう一度説明します。ブートが独立したパーティションの場合、カーネル パスは /vmlinuz-xxx として定義されます。独立したパーティションがない場合は、通常、ルート ファイル システムの下のディレクトリになります。通常は /boot/vmlinuz-xxx です。

    initrd は init RAMdisk のパスを定義します。パスはカーネルと同じ方法で定義されます。パス以外のパラメータはありません。

    または、以下に示すように UUID メソッドを使用します。

    root= オプションが指定されていない場合、「no or empty root...dracut...kernel pain」というエラーが報告されます。以下に示すように。

以上がgrub2 の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。