GRUB и GRUB2 | Кодементор

Узнайте о GRUB и GRUB2 из этой статьи Филипа Иншаналли, отраслевого профессионала с более чем 17-летним опытом работы в собственной консалтинговой фирме, которая обеспечивает локальную и удаленную поддержку по всему миру; сосредоточившись на разработке, планировании, реализации и документировании, чтобы назвать несколько.

В этой статье будут обсуждаться менеджеры загрузки, чья работа заключается в представлении загрузочного меню, из которого пользователь может выбрать, какую операционную систему/ядро Linux загрузить или отредактировать. Сначала мы сосредоточимся на GRUB, а затем перейдем к GRUB2.

GRUB

GRUB расшифровывается как Grand Unified Bootloader. GRUB в основном используется для загрузки дистрибутивов Linux. Однако GRUB может работать с другими загрузчиками. Обычный сценарий использования — двойная загрузка с операционной системой Microsoft; он делает это путем передачи загрузчика Windows для операционных систем Microsoft.

GRUB использует файл /boot/grub/grub.conf. Иногда вы увидите /boot/grub/menu.lst, но этот файл — просто символическая ссылка на /boot/grub/grub.conf. Используя дистрибутив CentOS 6.5, выполните следующую команду:

[root@localhost ~]# ls -l /boot/grub
total 274
 -rw-r--r--. 1 root root 63 Jun 20 01:47    device.map
 -rw-r--r--. 1 root root 13380 Jun 20 01:47 e2fs_stage1_5
 -rw-r--r--. 1 root root 12620 Jun 20 01:47 fat_stage1_5
 -rw-r--r--. 1 root root 11748 Jun 20 01:47 ffs_stage1_5
 -rw-------. 1 root root 769 Jun 20 01:48   grub.conf
 -rw-r--r--. 1 root root 11756 Jun 20 01:47 iso9660_stage1_5
 -rw-r--r--. 1 root root 13268 Jun 20 01:47 jfs_stage1_5
lrwxrwxrwx. 1 root root 11 Jun 20 01:47    menu.lst -> ./grub.conf
 -rw-r--r--. 1 root root 11956 Jun 20 01:47 minix_stage1_5
 -rw-r--r--. 1 root root 14412 Jun 20 01:47 reiserfs_stage1_5
 -rw-r--r--. 1 root root 1341 Nov 14 2010   splash.xpm.gz
 -rw-r--r--. 1 root root 512 Jun 20 01:47    stage1
 -rw-r--r--. 1 root root 126100 Jun 20 01:47 stage2
 -rw-r--r--. 1 root root 12024 Jun 20 01:47  ufs2_stage1_5
 -rw-r--r--. 1 root root 11364 Jun 20 01:47  vstafs_stage1_5
 -rw-r--r--. 1 root root 13964 Jun 20 01:47  xfs_stage1_5
 [root@localhost ~]#

Из предыдущего вывода мы видим /boot/grub/grub.conf, а также символическую ссылку /boot/grub/menu.lst. Мы можем просмотреть фактический файл /boot/grub/grub.conf:

[root@localhost ~]# cat /boot/grub/grub.conf
 # grub.conf generated by anaconda
 #
 # Note that you do not have to rerun grub after making changes to this file
 # NOTICE: You have a /boot partition. This means that
 # all kernel and initrd paths are relative to /boot/, eg.
 # root (hd0,0)
 # kernel /vmlinuz-version ro root=/dev/sda2
 # initrd /initrd-[generic-]version.img
 #boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
titleCentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=05527d71-25b6-4931-a3bb-8fe505f3fa64 rd_NO_LUKSrd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DMrhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
 [root@localhost ~]#

Из предыдущего вывода общие параметры будут следующими.

• default=0 означает, что это первая запись для загрузки из меню
• timeout=5 задает количество секунд (в данном случае 5), в течение которых будет отображаться меню, прежде чем загрузится ядро ​​Linux или загрузчик Windows получит передачу от GRUB.
• splashimage=(hd0,0)/grub/splash.xpm.gz — фоновое изображение загрузочного меню
• root (hd0,0) относится к первому жесткому диску и первому разделу на первом жестком диске.

GRUB2

GRUB2 использует более программный подход к представлению меню. На первый взгляд GRUB2 может показаться пугающим, но будьте уверены, что он не так сложен, как кажется. Синтаксис подобен языку программирования с большим количеством операторов if…then. Вот как выглядит /boot/grub/grub.cfg в системе CentOS 7:

[root@localhost ~]# cat /boot/grub2/grub.cfg
 #
 # DO NOT EDIT THIS FILE
 #
 # It is automatically generated by grub2-mkconfig using templates
 # from /etc/grub.d and settings from /etc/default/grub
 #
### BEGIN /etc/grub.d/00_header ###
set pager=1
if [ -s $prefix/grubenv ]; then
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
setnext_entry=

save_envnext_entry
setboot_once=true
else
set default="${saved_entry}"
fi

Часть следующего вывода опущена для краткости. Ниже показана последняя часть /boot/grub/grub.cfg:

### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.el7.x86_64-advanced-16e2de7b-b679-4a12-888e-55081af4dad8' {
load_video
setgfxpayload=keep
insmodgzio
insmodpart_msdos
insmodxfs
set root="hd0,msdos1"
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" 40c7c63f-1c93-438a-971a-5331e265419b
else
search --no-floppy --fs-uuid --set=root 40c7c63f-1c93-438a-971a-5331e265419b
fi
 linux16 /vmlinuz-3.10.0-693.el7.x86_64 root=UUID=16e2de7b-b679-4a12-888e-55081af4dad8 rocrashkernel=auto rhgb quiet LANG=en_US.UTF-8
 initrd16 /initramfs-3.10.0-693.el7.x86_64.img
 }
 ### END /etc/grub.d/10_linux ###

Итак, чтобы интерпретировать файл /boot/grub/grub.cfg, мы ищем строки, начинающиеся с menuentry. Эти строки запускают фактический пункт меню для операционной системы, такой как дистрибутив Linux или ОС Windows.

Работа с GRUB

Теперь мы собираемся взаимодействовать с GRUB. Мы добавим пользовательскую загрузочную запись. Это будет представлено после перезагрузки. Мы будем использовать команду vi, которая откроет /boot/grub/grub.conf в визуальном редакторе. Прежде чем приступить к работе с GRUB, всегда делайте резервную копию файла /boot/grub/grub.conf.

[root@localhost ~]# cat /boot/grub/grub.conf
 # grub.conf generated by anaconda
 #
 # Note that you do not have to rerun grub after making changes to this file
 # NOTICE: You have a /boot partition. This means that
 # all kernel and initrd paths are relative to /boot/, eg.
 # root (hd0,0)
 # kernel /vmlinuz-version ro root=/dev/sda2
 # initrd /initrd-[generic-]version.img
 #boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
titleCentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=05527d71-25b6-4931-a3bb-8fe505f3fa64 rd_NO_LUKSrd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DMrhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
 [root@localhost ~]# vi /boot/grub/grub.conf

Теперь мы внутри vi. Мы нажмем I на клавиатуре, чтобы войти в режим вставки; прокрутите вниз с помощью клавиши со стрелкой вниз, пока не дойдете до последней строки, и нажмите затем Enter, чтобы перейти к новой строке:

# grub.conf generated by anaconda
 #
 # Note that you do not have to rerun grub after making changes to this file
 # NOTICE: You have a /boot partition. This means that
 # all kernel and initrd paths are relative to /boot/, eg.
 # root (hd0,0)
 # kernel /vmlinuz-version ro root=/dev/sda2
 # initrd /initrd-[generic-]version.img
 #boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
titleCentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=05527d71-25b6-4931-a3bb-8fe505f3fa64 rd_NO_LUKSrd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DMrhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
~
 ~
 ~
 -- INSERT --

Далее мы начнем нашу запись, используя следующие ключевые слова: заголовок, корень, ядро ​​​​и initrd. Мы вставим наши собственные значения, как показано здесь:

# grub.conf generated by anaconda
 #
 # Note that you do not have to rerun grub after making changes to this file
 # NOTICE: You have a /boot partition. This means that
 # all kernel and initrd paths are relative to /boot/, eg.
 # root (hd0,0)
 # kernel /vmlinuz-version ro root=/dev/sda2
 # initrd /initrd-[generic-]version.img
 #boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
titleCentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=05527d71-25b6-4931-a3bb-8fe505f3fa64 rd_NO_LUKSrd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DMrhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
titleCompTIA Linux+ (Our.Custom.Entry)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86 ro
initrd /initramfs-2.6.32-431.el6.x86_64.img
 -- INSERT --

Теперь мы сохраним и выйдем из vi. Мы используем :wq для сохранения наших изменений и выхода из vi:

titleCompTIA Linux+ (Our.Custom.Entry)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86 ro
initrd /initramfs-2.6.32-431.el6.x86_64.img
:wq

Основываясь на предыдущем выводе, вот разбивка нашей пользовательской записи:

• Название определяет нашу загрузочную запись клиента.
• root (hd0,0) указывает поиск первого жесткого диска и первого раздела на первом жестком диске.
• Ядро /vmlinuz-2.6.32-431.el6.x86 ro указывает GRUB искать местоположение ядра Linux. В данном случае это vmlinuz-2.6.32-431.el6.x86 ro (ro означает, что ядро ​​загружается только для чтения).
• inidrd /initramfs-2.6.32-431.el6.x86_64.img указывает исходный файл RAM-диска для использования (это помогает системе загружаться).

Последний шаг — перезагрузить нашу систему CentOS и открыть меню загрузки GRUB:
1.PNG

Из предыдущего вывода мы видим, что наша новая пользовательская загрузочная запись отображается в GRUB, и это здорово. Мы можем взаимодействовать в режиме реального времени, прямо в меню GRUB. Допустим, мы хотели пометить или удалить опцию из одной из этих записей. Мы просто нажмем клавишу E, как показано здесь:
2.PNG

Теперь мы можем нажать клавишу E еще раз, чтобы отредактировать запись. Допустим, мы хотим указать, что корневая файловая система находится в /dev/; мы бы сделали это, как показано на следующем снимке экрана:
3.PNG

Теперь мы можем нажать клавишу Enter, чтобы сохранить наши изменения, и клавишу Esc, чтобы вернуться к предыдущему экрану; мы увидим добавленную новую опцию:
4.PNG

Из предыдущего вывода видно, как легко работать в режиме реального времени в загрузочном меню GRUB, а также как добавить пользовательскую загрузочную запись в GRUB. Обратите внимание, что в GRUB идентифицируются первый жесткий диск и первый раздел. как (hd0, 0), тогда как в оболочке Linux первый жесткий диск и первый раздел идентифицируются как (sda1).

Работа с GRUB2

Мы добавляем пользовательскую загрузочную запись в GRUB2 немного отличным от GRUB способом. В GRUB2 вместо редактирования фактического /boot/grub/grub.cfg мы работаем с /etc/default/grub и /etc/grub.d. Давайте сделаем список /etc/grub.d, чтобы увидеть все доступные файлы:

philip@ubuntu:~$ ls -l /etc/grub.d/
total 76
 -rwxr-xr-x 1 root root 9791 Apr 15 2016 00_header
 -rwxr-xr-x 1 root root 6258 Mar 15 2016 05_debian_theme
 -rwxr-xr-x 1 root root 12261 Apr 15 2016 10_linux
 -rwxr-xr-x 1 root root 11082 Apr 15 2016 20_linux_xen
 -rwxr-xr-x 1 root root 1992 Jan 28 2016 20_memtest86+
 -rwxr-xr-x 1 root root 11692 Apr 15 2016 30_os-prober
 -rwxr-xr-x 1 root root 1418 Apr 15 2016 30_uefi-firmware
 -rwxr-xr-x 1 root root 214 Apr 15 2016 40_custom
 -rwxr-xr-x 1 root root 216 Apr 15 2016 41_custom
 -rw-r--r-- 1 root root 483 Apr 15 2016 README
philip@ubuntu:~$

Прежде чем работать с GRUB2, всегда делайте резервную копию вашего /boot/grub/grub.cfg. Из предыдущего вывода мы видим несколько файлов. Их имена начинаются с цифры, и числа читаются в последовательном порядке. Допустим, мы хотим добавить пользовательскую загрузочную запись в GRUB2. Мы создадим пользовательскую запись и назовем ее /etc/grub/40_custom. Мы увидим следующий код в vi:

#!/bin/sh
exec tail -n +3 $0
 # This file provides an easy way to add custom menu entries. Simply type the
 # menu entries you want to add after this comment. Be careful not to change
 # the 'exec tail' line above.
echo "Test Entry"
cat<< EOF
menuentry "CompTIA_LINUX+" {
set root="hd0,0"
}
 EOF

Из предыдущего вывода мы видим, что синтаксис немного похож на программирование. В GRUB2 это целый язык программирования. Следующий шаг — сохранить наши изменения, а затем запустить grub-mkconfig (название подразумевает, что мы говорим о устаревшем GRUB, но на самом деле мы имеем в виду GRUB2). Это зависит от дистрибутива Linux. В CentOS 7 вы увидите команды, начинающиеся с grub2:

root@ubuntu:/home/philip# grub-mkconfig
 Generating grub configuration file ...
 #
 # DO NOT EDIT THIS FILE
 #
 # It is automatically generated by grub-mkconfig using templates
 # from /etc/grub.d and settings from /etc/default/grub
 #
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
sethave_grubenv=true
load_env
fi

Часть следующего вывода опущена для краткости:

### BEGIN /etc/grub.d/40_custom ###
 # This file provides an easy way to add custom menu entries. Simply type the
 # menu entries you want to add after this comment. Be careful not to change
 # the 'exec tail' line above.
echo "Test Entry"
cat<< EOF
menuentry "CompTIA_LINUX+" {
set root="hd0,0"
}
 EOF

Когда мы запускаем эту команду, команда grub-mkconfig находит пользовательскую запись. Это создает новое загрузочное меню. При следующей перезагрузке системы мы увидим новое загрузочное меню. Мы также можем изменить параметры в /etc/default/grub, включая такие параметры, как ОС по умолчанию, таймер и так далее. Вот содержимое /etc/default/grub:

root@ubuntu:/home/philip# cat /etc/default/grub
 # If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
 # For full documentation of the options in this file, see:
 # info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
 GRUB_HIDDEN_TIMEOUT=0
 GRUB_HIDDEN_TIMEOUT_QUIET=true
 GRUB_TIMEOUT=10
 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
 GRUB_CMDLINE_LINUX_DEFAULT="quiet"
 GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US"

Основываясь на предыдущем выводе, значение таймера установлено на 10. Также обратите внимание, что значение по умолчанию равно 0. Продолжая просмотр файла конфигурации, мы видим следующий код:

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

Теперь давайте перезагрузим нашу систему Ubuntu и проверим загрузочное меню GRUB2:
5.PNG

На предыдущем снимке экрана мы теперь можем видеть нашу пользовательскую опцию меню в GRUB2. Мы даже можем прокручивать записи и редактировать их, нажимая клавишу E. Обратите внимание, что в GRUB2 первый жесткий диск начинается с 0, а первый раздел начинается с 1, в отличие от устаревшего GRUB.

Если вы нашли эту статью интересной, вы можете изучить Руководство по сертификации CompTIA Linux+ чтобы освоить концепции и методы, которые помогут вам получить сертификаты LX0-103 и LX0-104 с первой попытки. Руководство по сертификации CompTIA Linux+ поможет вам освоить все модули, используя практические вопросы и пробные экзамены, но вы также будете хорошо подготовлены к сдаче сертификационных экзаменов LX0-103 и LX0-104. Вы можете получить все книги Packt всего за 5 долларов до 21 января 2019 года. Так чего же вы ждете? Воспользуйтесь предложением сегодня и станьте выдающимся ИТ-специалистом!

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *