source: postlfs/filesystems/uefi-bootloaders/grub-setup.xml@ cffa49c

12.0 12.1 kea ken/TL2024 ken/tuningfonts lazarus lxqt plabs/newcss python3.11 qt5new rahul/power-profiles-daemon renodr/vulkan-addition trunk xry111/llvm18 xry111/xf86-video-removal
Last change on this file since cffa49c was cffa49c, checked in by Xi Ruoyao <xry111@…>, 16 months ago

grub efi setup: Set iocharset= like codepage=

  • Property mode set to 100644
File size: 19.2 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
4 <!ENTITY % general-entities SYSTEM "../../../general.ent">
5 %general-entities;
6]>
7
8<sect1 id="grub-setup" xreflabel="Using GRUB to Set Up the Boot Process with UEFI">
9 <?dbhtml filename="grub-setup.html"?>
10
11
12 <title>Using GRUB to Set Up the Boot Process with UEFI</title>
13
14 <sect2>
15 <title>Turn Off Secure Boot</title>
16
17 <para>
18 BLFS does not have the essential packages to support Secure Boot. To
19 set up the boot process with GRUB and UEFI in BLFS, Secure
20 Boot must be turned off from the configuration interface of the
21 firmware. Read the documentation provided by the manufacturer of your
22 system to find out how.
23 </para>
24 </sect2>
25
26 <sect2>
27 <title>Create an Emergency Boot Disk</title>
28
29 <para>
30 Ensure that an emergency boot disk is ready to <quote>rescue</quote>
31 the system in case the system becomes un-bootable. To make an
32 emergency boot disk with GRUB for an EFI based system, find a spare
33 USB flash drive and create a
34 <systemitem class="filesystem">vfat</systemitem> file system on it.
35 Install <xref linkend="dosfstools"/> first, then
36 as the <systemitem class="username">root</systemitem> user:
37 </para>
38
39 <warning>
40 <para>
41 The following command will erase all directories and files in the
42 partition. Make sure your USB flash drive contains no data which
43 will be needed, and change <userinput>sdx1</userinput> to the
44 device node corresponding to the first partition of the USB flash
45 drive. Be careful not to overwrite your hard drive with a typo!
46 </para>
47 </warning>
48
49 <screen role="nodump"><userinput>mkfs.vfat /dev/sdx1</userinput></screen>
50
51 <para>
52 Still as the <systemitem class="username">root</systemitem> user, use
53 the <command>fdisk</command> utility to set the first partition
54 of the USB flash drive to be an <quote>EFI system</quote> partition
55 (change <userinput>sdx</userinput> to the device node corresponding
56 to your USB flash drive):
57 </para>
58
59<screen role="nodump"><userinput>fdisk /dev/sdx</userinput>
60<literal>
61Welcome to fdisk (util-linux 2.38.1).
62Changes will remain in memory only, until you decide to write them.
63Be careful before using the write command.
64
65
66Command (m for help): </literal><userinput>t</userinput>
67<literal>Partition number (1-9, default 9): </literal><userinput>1</userinput>
68<literal>Partition type or alias (type L to list all): </literal><userinput>uefi</userinput>
69<literal>Changed type of partition 'Linux filesystem' to 'EFI System'.
70
71Command (m for help): </literal><userinput>w</userinput>
72<literal>The partition table has been altered.
73Calling ioctl() to re-read partition table.
74Syncing disks.</literal></screen>
75
76 <para>
77 Still as the <systemitem class="username">root</systemitem> user,
78 create a mount point for the EFI partition on the USB flash drive
79 and mount it:
80 </para>
81
82<screen role="nodump"><userinput>mkdir -pv /mnt/rescue &amp;&amp;
83mount -v -t vfat /dev/sdx1 /mnt/rescue</userinput></screen>
84
85 <para>
86 Install GRUB for EFI on the partition:
87 </para>
88
89<screen role="nodump"><userinput>grub-install --target=x86_64-efi --removable --efi-directory=/mnt/rescue --boot-directory=/mnt/rescue</userinput></screen>
90
91 <para>
92 Unmount the partition:
93 </para>
94
95<screen role="nodump"><userinput>umount /mnt/rescue</userinput></screen>
96
97 <para>
98 Now the USB flash drive can be used as an emergency boot disk on any x86-64
99 UEFI platform. It will boot the system and show the GRUB shell. Then you
100 can type commands to boot your operating system from the hard drive.
101 To learn how to select the boot device, read the manual of your
102 motherboard or laptop.
103 </para>
104
105 </sect2>
106
107 <sect2 role="kernel" id="uefi-kernel">
108 <title>Kernel Configuration for UEFI support</title>
109
110 <para>
111 Enable the following options in the kernel configuration and recompile
112 the kernel if necessary:
113 </para>
114
115<screen><literal>Processor type and features ---&gt;
116 [*] EFI runtime service support [CONFIG_EFI]
117 [*] EFI stub support [CONFIG_EFI_STUB]
118Enable the block layer ---&gt;
119 Partition Types ---&gt;
120 [*] Advanced partition selection [CONFIG_PARTITION_ADVANCED]
121 [*] EFI GUID Partition support [CONFIG_EFI_PARTITION]
122Device Drivers ---&gt;
123 Firmware Drivers ---&gt;
124 [*] Mark VGA/VBE/EFI FB as generic system framebuffer [CONFIG_SYSFB_SIMPLEFB]
125 Graphics support ---&gt;
126 &lt;*&gt; Direct Rendering Manager [CONFIG_DRM]
127 [*] Enable legacy fbdev support for your modesetting driver [CONFIG_DRM_FBDEV_EMULATION]
128 &lt;*&gt; Simple framebuffer driver [CONFIG_DRM_SIMPLEDRM]
129 Frame buffer Devices ---&gt;
130 &lt;*&gt; Support for frame buffer devices ---&gt; [CONFIG_FB]
131 Console display driver support ---&gt;
132 [*] Framebuffer Console support [CONFIG_FRAMEBUFFER_CONSOLE]
133File systems ---&gt;
134 DOS/FAT/EXFAT/NT Filesystems ---&gt;
135 &lt;*/M&gt; VFAT (Windows-95) fs support [CONFIG_VFAT_FS]
136 Pseudo filesystems ---&gt;
137 &lt;*/M&gt; EFI Variable filesystem [CONFIG_EFIVAR_FS]
138 {*/M} Native language support ---&gt; [CONFIG_NLS]
139 &lt;*/M&gt; Codepage 437 (United States, Canada) [CONFIG_NLS_CODEPAGE_437]
140 &lt;*/M&gt; NLS ISO 8859-1 (Latin 1; Western European Languages) [CONFIG_NLS_ISO8859_1]</literal></screen>
141
142 <variablelist>
143 <title>The meaning of the configuration options:</title>
144
145 <varlistentry>
146 <term><parameter>CONFIG_EFI_STUB</parameter></term>
147 <listitem>
148 <para>On EFI systems, GRUB boots the Linux kernel by invoking the
149 EFI firmware to load it as an EFI application. So, EFI stub is
150 needed to wrap the kernel as an EFI application.</para>
151 </listitem>
152 </varlistentry>
153
154 <varlistentry>
155 <term>
156 <parameter>CONFIG_SYSFB_SIMPLEFB</parameter>,
157 <parameter>CONFIG_DRM</parameter>,
158 <parameter>CONFIG_DRM_FBDEV_EMULATION</parameter>,
159 <parameter>CONFIG_DRM_SIMPLEDRM</parameter>,
160 <parameter>CONFIG_FB</parameter>, and
161 <parameter>CONFIG_FRAMEBUFFER_CONSOLE</parameter></term>
162 <listitem>
163 <para>The combination of these options provides the Linux console
164 support on top of the UEFI framebuffer. To allow the kernel to
165 print debug messages at an early boot stage, they shouldn't be
166 built as kernel modules unless an initramfs will be used.</para>
167 </listitem>
168 </varlistentry>
169
170 </variablelist>
171
172 </sect2>
173
174 <sect2>
175 <title>Find or Create the EFI System Partition</title>
176
177 <para>
178 On EFI based systems, the bootloaders are installed in a special FAT32
179 partition called an <emphasis>EFI System Partition</emphasis> (ESP).
180 If your system supports EFI, and a recent version of some Linux
181 distribution or Windows is pre-installed, it's likely that the ESP
182 has already been created. As the
183 <systemitem class="username">root</systemitem> user, list all the
184 partitions on your hard drive (replace <userinput>sda</userinput>
185 with the device corresponding to the appropriate hard drive):
186 </para>
187
188 <screen role="nodump"><userinput>fdisk -l /dev/sda</userinput></screen>
189
190 <para>
191 The <quote>Type</quote> column of the ESP should be
192 <literal>EFI System</literal>.
193 </para>
194
195 <para>
196 If the system or the hard drive is new, or it's the first
197 installation of a UEFI-booted OS on the system, the ESP may not exist.
198 In that case, create a new partition, make a
199 <systemitem class="filesystem">vfat</systemitem> file system on it,
200 and set the partition type to <quote>EFI system</quote>. See the
201 instructions for the emergency boot device above as a reference.
202 </para>
203
204 <warning>
205 <para>
206 Some (old) UEFI implementations may require the ESP to be the first
207 partition on the disk.
208 </para>
209 </warning>
210
211 <para>
212 Now, as the <systemitem class="username">root</systemitem> user,
213 create the mount point for the ESP, and mount it (replace
214 <userinput>sda1</userinput> with the device node corresponding to
215 the ESP):
216 </para>
217
218<screen role="nodump"><userinput>mkdir -pv /boot/efi &amp;&amp;
219mount -v -t vfat /dev/sda1 /boot/efi</userinput></screen>
220
221 <para>
222 Add an entry for the ESP in
223 <filename>/etc/fstab</filename>, so it will be mounted automatically
224 during system boot:
225 </para>
226
227<screen role="nodump"><userinput>cat &gt;&gt; /etc/fstab &lt;&lt; EOF</userinput>
228<literal>/dev/sda1 /boot/efi vfat codepage=437,iocharset=iso8859-1 0 1</literal>
229<userinput>EOF</userinput></screen>
230
231 </sect2>
232
233 <sect2>
234 <title>Minimal Boot Configuration with GRUB and EFI</title>
235
236 <para>
237 On UEFI based systems, GRUB works by installing an EFI application
238 (a special kind of executable) into the ESP. The EFI firmware will
239 search boot loaders in EFI applications from boot entries recorded
240 in EFI variables, and additionally a hardcoded path
241 <filename>EFI/BOOT/BOOTX64.EFI</filename>. Normally, a boot loader
242 should be installed into a custom path and the path should be recorded
243 in the EFI variables. The use of the hardcoded path should be
244 avoided if possible. However, in some cases we have to use
245 the hardcoded path:
246 </para>
247
248 <itemizedlist>
249 <listitem>
250 <para>
251 The system is not booted with EFI yet, making EFI variables
252 inaccessible.
253 </para>
254 </listitem>
255 <listitem>
256 <para>
257 The EFI firmware is 64-bit but the LFS system is 32-bit, making
258 EFI variables inaccessible because the kernel cannot invoke EFI
259 runtime services with a different virtual address length.
260 </para>
261 </listitem>
262 <listitem>
263 <para>
264 LFS is built for a Live USB, so we cannot rely on EFI variables,
265 which are stored in NVRAM or EEPROM on the local machine.
266 </para>
267 </listitem>
268 <listitem>
269 <para>
270 You are unable or unwilling to install the
271 <application>efibootmgr</application> for manipulating boot
272 entries in EFI variables.
273 </para>
274 </listitem>
275 </itemizedlist>
276
277 <para>
278 In these cases, follow these instructions to install the GRUB EFI
279 application into the hardcoded path and make a minimal boot
280 configuration. Otherwise it's better to skip ahead and set up the
281 boot configuration normally.
282 </para>
283
284 <para>
285 To install GRUB with the EFI application in the hardcoded
286 path <filename>EFI/BOOT/BOOTX64.EFI</filename>, first ensure the boot
287 partition is mounted at <filename class="directory">/boot</filename>
288 and the ESP is mounted at
289 <filename class="directory">/boot/efi</filename>. Then, as the &root;
290 user, run the command:
291 </para>
292
293 <note>
294 <para>
295 This command will overwrite
296 <filename>/boot/efi/EFI/BOOT/BOOTX64.EFI</filename>. It may break a
297 bootloader already installed there. Back it up if you are not sure.
298 </para>
299 </note>
300
301 <screen role="nodump"><userinput>grub-install --target=x86_64-efi --removable</userinput></screen>
302
303 <para>
304 This command will install the GRUB EFI application into the hardcoded path
305 <filename>/boot/efi/EFI/BOOT/BOOTX64.EFI</filename>, so the EFI
306 firmware can find and load it. The remaining GRUB files are installed
307 in the <filename class="directory">/boot/grub</filename> directory and
308 will be loaded by <filename>BOOTX64.EFI</filename> during system boot.
309 </para>
310
311 <note>
312 <para>
313 The EFI firmware usually prefers the EFI applications with a path
314 stored in EFI variables to the EFI
315 application at the hardcoded path. So you may need to invoke the
316 boot selection menu or firmware setting interface to select the
317 newly installed GRUB manually on the next boot. Read the manual of
318 your motherboard or laptop to learn how.
319 </para>
320 </note>
321
322 <para>
323 If you've followed the instructions in this section and set up a minimal boot
324 configuration, now skip ahead to
325 <quote>Creating the GRUB Configuration File</quote>.
326 </para>
327 </sect2>
328
329 <sect2>
330 <title>Mount the EFI Variable File System</title>
331
332 <para>
333 The installation of GRUB on a UEFI platform requires that the EFI Variable
334 file system, <systemitem class="filesystem">efivarfs</systemitem>, is
335 mounted. As the <systemitem class="username">root</systemitem> user,
336 mount it if it's not already mounted:
337 </para>
338
339<screen role="nodump"><userinput>mountpoint /sys/firmware/efi/efivars || mount -v -t efivarfs efivarfs /sys/firmware/efi/efivars</userinput></screen>
340
341 <note revision="systemd">
342 <para>
343 If the system is booted with UEFI and systemd,
344 <systemitem class="filesystem">efivarfs</systemitem> will be mounted
345 automatically. However, in the LFS chroot environment it still needs to
346 be mounted manually.
347 </para>
348 </note>
349
350 <para revision="sysv">
351 Now add an entry for the
352 <systemitem class="filesystem">efivarfs</systemitem> in
353 <filename>/etc/fstab</filename> so it will be mounted automatically
354 during system boot:
355 </para>
356
357<screen revision="sysv" role="nodump"><userinput>cat &gt;&gt; /etc/fstab &lt;&lt; EOF</userinput>
358<literal>efivarfs /sys/firmware/efi/efivars efivarfs defaults 0 0</literal>
359<userinput>EOF</userinput></screen>
360
361 <warning>
362 <para>
363 If the system is not booted with UEFI, the directory
364 <filename class="directory">/sys/firmware/efi</filename> will be
365 missing. In this case you should boot the system in UEFI mode with
366 the emergency boot disk or using a minimal boot configuration created as
367 above, then mount
368 <systemitem class="filesystem">efivarfs</systemitem> and continue.
369 </para>
370 </warning>
371 </sect2>
372
373 <sect2>
374 <title>Setting Up the Configuration</title>
375
376 <para>
377 On UEFI based systems, GRUB works by installing an EFI application
378 (a special kind of executable) into
379 <filename class="directory">/boot/efi/EFI/[id]/grubx64.efi</filename>,
380 where <filename class="directory">/boot/efi</filename> is the mount
381 point of the ESP, and <literal>[id]</literal> is replaced with an
382 identifier specified in the <command>grub-install</command> command
383 line. GRUB will create an entry in the EFI variables containing
384 the path <literal>EFI/[id]/grubx64.efi</literal> so the EFI firmware
385 can find <filename>grubx64.efi</filename> and load it.
386 </para>
387
388 <para>
389 <filename>grubx64.efi</filename> is very lightweight (136 KB with
390 GRUB-2.06) so it will not use much space in the ESP. A typical ESP
391 size is 100 MB (for Windows boot manager, which uses about 50 MB in
392 the ESP). Once <filename>grubx64.efi</filename> has been loaded by the
393 firmware, it will load GRUB modules from the boot partition.
394 The default location is
395 <filename class="directory">/boot/grub</filename>.
396 </para>
397
398 <para>
399 As the <systemitem class="username">root</systemitem> user, install
400 the GRUB files into <filename>/boot/efi/EFI/LFS/grubx64.efi</filename>
401 and <filename class="directory">/boot/grub</filename>. Then set up the
402 boot entry in the EFI variables:
403 </para>
404
405<screen role="nodump"><userinput>grub-install --bootloader-id=LFS --recheck</userinput></screen>
406
407 <para>
408 If the installation is successful, the output should be:
409 </para>
410
411<screen role="nodump"><literal>Installing for x86_64-efi platform.
412Installation finished. No error reported.</literal></screen>
413
414 <para>
415 Issue the <command>efibootmgr | cut -f 1</command> command to recheck the EFI boot
416 configuration. An example of the output is:
417 </para>
418
419<screen role="nodump"><literal>BootCurrent: 0000
420Timeout: 1 seconds
421BootOrder: 0005,0000,0002,0001,0003,0004
422Boot0000* ARCH
423Boot0001* UEFI:CD/DVD Drive
424Boot0002* Windows Boot Manager
425Boot0003* UEFI:Removable Device
426Boot0004* UEFI:Network Device
427Boot0005* LFS</literal></screen>
428
429 <para>
430 Note that <literal>0005</literal> is the first in the
431 <literal>BootOrder</literal>, and <literal>Boot0005</literal>
432 is <literal>LFS</literal>. This means that on the next boot, the
433 version of GRUB installed by LFS will be used to boot the system.
434 </para>
435
436 </sect2>
437
438 <sect2>
439 <title>Creating the GRUB Configuration File</title>
440
441 <indexterm zone="grub-setup grub-video">
442 <primary sortas="e-boot-grub-grub-cfg">/boot/grub/grub.cfg</primary>
443 </indexterm>
444
445 <para>
446 Generate <filename>/boot/grub/grub.cfg</filename> to configure the
447 boot menu of GRUB:
448 </para>
449
450<screen role="nodump"><userinput>cat &gt; /boot/grub/grub.cfg &lt;&lt; EOF</userinput>
451<literal># Begin /boot/grub/grub.cfg
452set default=0
453set timeout=5
454
455insmod part_gpt
456insmod ext2
457set root=(hd0,2)
458
459if loadfont /boot/grub/fonts/unicode.pf2; then
460 set gfxmode=auto
461 insmod all_video
462 terminal_output gfxterm
463fi
464
465menuentry "GNU/Linux, Linux 6.1.11-lfs-11.3" {
466 linux /boot/vmlinuz-6.1.11-lfs-11.3 root=/dev/sda2 ro
467}
468
469menuentry "Firmware Setup" {
470 fwsetup
471}</literal>
472<userinput>EOF</userinput></screen>
473
474 <para>
475 <literal>(hd0,2)</literal>, <literal>sda2</literal>, and
476 <literal>6.1.11-lfs-11.3</literal> must match your
477 configuration.
478 </para>
479
480 <note>
481 <para>
482 From GRUB's perspective, the files are relative to the partitions
483 used. If you used a separate /boot partition, remove /boot from the
484 above paths (to kernel and to <filename>unicode.pf2</filename>). You
485 will also need to change the "set root" line to point to the boot
486 partition.
487 </para>
488 </note>
489
490 <para>
491 The <literal>Firmware Setup</literal> entry can be used to enter the
492 configuration interface provided by the firmware (sometimes called
493 <quote>BIOS configuration</quote>).
494 </para>
495 </sect2>
496
497 <sect2>
498 <title>Dual-booting with Windows</title>
499
500 <para>
501 Add a menu entry for Windows into <filename>grub.cfg</filename>:
502 </para>
503
504<screen role="nodump"><userinput>cat &gt;&gt; /boot/grub/grub.cfg &lt;&lt; EOF</userinput>
505<literal># Begin Windows addition
506
507menuentry "Windows 11" {
508 insmod fat
509 insmod chain
510 set root=(hd0,1)
511 chainloader /EFI/Microsoft/Boot/bootmgfw.efi
512}</literal>
513<userinput>EOF</userinput></screen>
514
515 <para>
516 <literal>(hd0,1)</literal> should be replaced with the GRUB
517 designated name for the ESP. The <literal>chainloader</literal>
518 directive can be used to tell GRUB to run another EFI executable,
519 in this case the Windows Boot Manager. You may put more usable tools
520 in EFI executable format (for example, an EFI shell) into the ESP and
521 create GRUB entries for them, as well.
522 </para>
523
524 </sect2>
525
526</sect1>
Note: See TracBrowser for help on using the repository browser.