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:
Из предыдущего вывода мы видим, что наша новая пользовательская загрузочная запись отображается в GRUB, и это здорово. Мы можем взаимодействовать в режиме реального времени, прямо в меню GRUB. Допустим, мы хотели пометить или удалить опцию из одной из этих записей. Мы просто нажмем клавишу E, как показано здесь:
Теперь мы можем нажать клавишу E еще раз, чтобы отредактировать запись. Допустим, мы хотим указать, что корневая файловая система находится в /dev/; мы бы сделали это, как показано на следующем снимке экрана:
Теперь мы можем нажать клавишу Enter, чтобы сохранить наши изменения, и клавишу Esc, чтобы вернуться к предыдущему экрану; мы увидим добавленную новую опцию:
Из предыдущего вывода видно, как легко работать в режиме реального времени в загрузочном меню 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:
На предыдущем снимке экрана мы теперь можем видеть нашу пользовательскую опцию меню в GRUB2. Мы даже можем прокручивать записи и редактировать их, нажимая клавишу E. Обратите внимание, что в GRUB2 первый жесткий диск начинается с 0, а первый раздел начинается с 1, в отличие от устаревшего GRUB.
Если вы нашли эту статью интересной, вы можете изучить Руководство по сертификации CompTIA Linux+ чтобы освоить концепции и методы, которые помогут вам получить сертификаты LX0-103 и LX0-104 с первой попытки. Руководство по сертификации CompTIA Linux+ поможет вам освоить все модули, используя практические вопросы и пробные экзамены, но вы также будете хорошо подготовлены к сдаче сертификационных экзаменов LX0-103 и LX0-104. Вы можете получить все книги Packt всего за 5 долларов до 21 января 2019 года. Так чего же вы ждете? Воспользуйтесь предложением сегодня и станьте выдающимся ИТ-специалистом!