Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Администрирование систем Linux. Системный загрузчик

Оригинал: Bootloader
Автор: Paul Cobbaut
Дата публикации: 12 марта 2015 г.
Перевод: A. Панин
Дата перевода: 30 марта 2015 г.

Часть III. Управление процессом загрузки системы

Глава 14. Системный загрузчик

В данной главе кратко описывается процесс загрузки компьютера (с 32- или 64-битным центральным процессором архитектуры Intel), работающего под управлением Linux.

Системы, загрузка которых осуществляется средствами системного загрузчика lilo, на сегодняшний день встречаются достаточно редко, поэтому в соответствующем разделе приведено лишь сжатое описание данного системного загрузчика.

На сегодняшний день наиболее часто используемым в системах Linux с длительным сроком поддержки системным загрузчиком является системный загрузчик grub даже несмотря на то, что он и не развивается в рамках проекта, непосредственно связанного с разработкой ядра Linux. Такие дистрибутивы операционных систем, как FreeBSD и Solaris также используют системный загрузчик grub.

Следует отметить, что системный загрузчик grub не ограничивается архитектурой центрального процессора Intel. Он может загружать операционные системы и в случае использования компьютеров с центральными процессорами архитектуры PowerPC.

Обратите внимание на то, что хотя системный загрузчик grub и устанавливается по умолчанию в дистрибутиве Debian, на данный момент в большинстве дистрибутивов идет медленная миграция на системный загрузчик grub2.

14.1. Терминология

Точная последовательность операций, выполняемых при включении компьютера, зависит от его аппаратной архитектуры (аппаратная архитектура Intel x86 отличается от аппаратной архитектуры Sun Sparc и других аппаратных архитектур), системного загрузчика (системный загрузчик grub отличается от системного загрузчика lilo) и операционной системы (Linux, Solaris, BSD, и т.д.). В данной главе по большей части рассматривается процесс загрузки операционной системы Linux с помощью системного загрузчика grub на компьютере с аппаратной архитектурой Intel x86.

14.1.1. Самостоятельное тестирование системы в момент запуска

Загрузка компьютера начинается в момент включения его блока питания (и это не шутка). Первый выполняемый процесс называется POST (Power On Self Test - самостоятельное тестирование системы в момент запуска). В том случае, если тестирование завершается успешно, начинается загрузка BIOS. Если же не все так гладко, вы можете не услышать ничего, услышать повторяющуюся последовательность звуковых сигналов, увидеть на экране монитора сообщение об ошибке или в некоторых случаях увидеть дым, идущий из корпуса компьютера (после сгорания комплектующих появляется отвратительный запах!).

14.1.2. BIOS

Все компьютеры с аппаратной архитектурой Intel x86 используют BIOS (Basic Input/Output system - базовая система ввода/вывода) для выявления, идентификации и инициализации аппаратного обеспечения. После этого BIOS осуществляет поиск загрузочного устройства. Таким устройством может быть гибкий диск, жесткий диск, CDROM, сетевая карта или устройство для хранения данных с интерфейсом USB.

В процессе функционирования BIOS вы можете увидеть на экране сообщение о том, какую клавишу следует нажать для перехода в режим установки значений параметров BIOS (обычно это либо клавиша Del, либо клавиша F2).

BIOS

14.1.3. Openboot

Системы Sun Sparc используют openboot для тестирования аппаратного обеспечения и загрузки операционных систем. Bill Callkins описывает openboot в своих книгах, посвященных администрированию систем Solaris. Подробное описание возможностей openboot не соответствует целям данного курса.

14.1.4. Пароль для загрузки системы

BIOS позволяет установить пароль для загрузки системы. Не забывайте этот пароль, так как в том случае, если вы забудете его, вам придется открывать корпус компьютера и производить специальные манипуляции для его сброса. В некоторых случаях вам может быть предоставлена возможность установки пароля для загрузки системы, а так же отдельного пароля для защиты от модификации значений параметров BIOS.

14.1.5. Загрузочное устройство

BIOS будет проверять доступные устройства для хранения данных в поисках загрузочного устройства в том порядке, который был задан в режиме модификации значений параметров BIOS. На компьютерах, находящихся в промышленной эксплуатации, операционная система чаше всего загружается с жесткого диска.

Загрузочное устройство

14.1.6. Основная загрузочная запись

Основная загрузочная запись (Master Boot Record или MBR) находится в первом секторе жесткого диска. В этой области диска хранится информация о первичных разделах жесткого диска и его активном разделе.

Основная загрузочная запись имеет размер, равный 512 байтам и может быть скопирована с помощью утилиты dd.

dd if=/dev/sda of=bootsect.mbr count=1 bs=512

14.1.7. Системный загрузчик

Код из основной загрузочной записи исполняется средствами BIOS, причем в основной загрузочной записи может быть размещен как код полноценного системного загрузчика, так и вспомогательный код для запуска системного загрузчика.

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

paul@laika:~$ sudo dd if=/dev/sda count=1 bs=16 skip=24 2>/dev/null|od -c
0000000 376   G   R   U   B      \0   G   e   o   m  \0   H   a   r   d
0000020

Существует множество системных загрузчиков, но наиболее часто используемым на системах с аппаратной архитектурой Intel системным загрузчиком является системный загрузчик grub, который во многих случаях приходит на замену системному загрузчику lilo. При установке Linux на систему с аппаратной архитектурой sparc вы можете выбрать системный загрузчик silo. Для загрузки систем с аппаратной архитектурой Itanium используется системный загрузчик elilo. В системах с аппаратными архитектурами IBM S/390 и zSeries используется системный загрузчик z/IPL. В системах с аппаратной архитектурой Alpha используется системный загрузчик milo, а в системах с аппаратной архитектурой PowerPC - системный загрузчик yaboot (расшифровывается как yet another boot loader - еще один системный загрузчик).

Для создания загрузочных дисков CD и DVD обычно используется системный загрузчик syslinux.

14.1.8. Ядро ОС

Цель процесса загрузки компьютера заключается в загрузке операционной системы или только ядра операционной системы. Обычный системный загрузчик, такой, как grub, осуществляет копирование данных ядра операционной системы с жесткого диска в оперативную память, после чего передает управление компьютером непосредственно этому ядру операционной системы (исполняет код ядра операционной системы).

После того, как ядро операционной системы загружено, системный загрузчик лишается контроля над ним. С этого момента ядро операционной системы осуществляет управление системой. После обсуждения системных загрузчиков мы продолжим рассматривать процесс загрузки системы и обсудим системы инициализации, с помощью которых осуществляется запуск системных демонов.

14.2. Системный загрузчик grub

14.2.1. Файл конфигурации /boot/grub/grub.cfg

Дистрибутив Debian перешел на системный загрузчик grub2, который будет обсуждаться в следующем разделе. Главным файлом конфигурации меню загрузки системного загрузчика grub2 является файл с именем grub.cfg.

root@debian7:~# ls -l /boot/grub/grub.cfg
-r--r--r-- 1 root root 2453 май 13 17:22 /boot/grub/grub.cfg
root@debian7:~#

14.2.2. Файл конфигурации /boot/grub/grub.conf

В таких дистрибутивах, как Red Hat Enterprise Linux 6, для конфигурации меню загрузки все еще используется файл с именем grub.conf, причем на данный файл установлены две символьные ссылки: /boot/grub/menu.lst и /etc/grub.conf.

[root@centos65 ~]# ls -l /boot/grub/menu.lst
lrwxrwxrwx. 1 root root 11 мар  7 11:53 /boot/grub/menu.lst -> ./grub.conf
[root@centos65 ~]# ls -l /boot/grub/grub.conf
-rw-------. 1 root root 1189 май  5 11:47 /boot/grub/grub.conf
[root@centos65 ~]#

Содержимое этого файла на данный момент (в дистрибутиве RHEL 6.5) выглядит аналогичным образом:

[root@centos65 ~]# more /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/mapper/VolGroup-lv_root
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-431.11.2.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.11.2.el6.x86_64 ro root=/dev/mapper/VolGr\
oup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap \
SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBO\
ARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-431.11.2.el6.x86_64.img
title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-l\
v_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFO\
NT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTY\
PE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-431.el6.x86_64.img
[root@centos65 ~]#

14.2.3. Команды меню

Команды меню должны быть расположены в начале файла конфигурации меню системного загрузчика grub.

default

Команда default устанавливает выбранный по умолчанию элемент меню загрузки. Первый элемент меню загрузки имеет идентификатор 0.

default=0

Описание каждого элемента меню или станса начинается с директивы title.

fallback

В том случае, если загрузка выбранного по умолчанию с помощью команды default элемента меню загрузки завершается неудачей, будет осуществляться загрузка элемента этого же меню, выбранного с помощью команды fallback.

fallback=1

timeout

В случае использования команды timeout системный загрузчик будет ожидать заданное количество секунд перед загрузкой выбранного по умолчанию с помощью команды default элемента меню загрузки.

timeout=5

hiddenmenu

Команда hiddenmenu позволяет скрыть меню загрузки системного загрузчика grub до момента нажатия пользователем клавиши Esc перед истечением времени ожидания, заданного с помощью команды timeout.

hiddenmenu

title

С команды title вы можете начинать описание нового элемента меню загрузки или станса.

title CentOS (2.6.32-431.11.2.el6.x86_64)

password

С помощью команды password вы можете добавить этап проверки пароля в процессе функционирования системного загрузчика grub для предотвращения выбора окружения загрузки операционной системы в интерактивном режиме.

password --md5 $1$Ec.id/$T2C2ahI/EG3WRRsmmu/HN/

Используйте интерактивную командную оболочку системного загрузчика grub для создания хэша пароля.

grub> md5crypt

Password: ********
Encrypted: $1$Ec.id/$T2C2ahI/EG3WRRsmmu/HN/

14.2.4. Команды, используемые стансах

Каждая операционная система или ядро операционной системы, которое вы хотите загрузить с помощью системного загрузчика grub должно быть описано в рамках станса (stanza), являющегося по своей сути набором из нескольких строк данных конфигурации. Ниже приведены описания некоторых наиболее часто используемых в рамках станс команд.

boot

В техническом плане команда boot является единственной обязательной командой для исполнения строки команды системного загрузчика grub. Эта команда не имеет каких-либо параметров и может использоваться исключительно в качестве последней команды станса.

boot

kernel

Команда kernel позволяет указать путь к файлу ядра ОС. Под загрузкой Linux обычно подразумевается загрузка исполняемого файла ядра zImage, сжатого с помощью утилиты gzip, или загрузка исполняемого файла ядра bzImage, сжатого с помощью утилиты bzip2.

В данном примере показан вариант использования команды kernel для загрузки ядра ОС в дистрибутиве Debian.

kernel /boot/vmlinuz-2.6.17-2-686 root=/dev/hda1 ro

А это пример использования команды kernel для загрузки ядра ОС в дистрибутиве RHEL 5.

kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet

Все параметры команды kernel могут обрабатываться как самим ядром ОС, так и любой другой программой (которая будет запущена позднее) путем чтения данных из файла /proc/cmdline.

initrd

Во многих случаях при установке дистрибутива Linux появляется необходимость в подключении начального виртуального диска в процессе загрузки. Эта операция описывается на уровне системного загрузчика grub с помощью команды initrd.

Ниже приведен пример использования упомянутой команды в дистрибутиве Debian 4.0.

initrd /boot/initrd.img-2.6.17-2-686

И аналогичный пример для дистрибутива Red Hat Enterprise Linux 5.

initrd /initrd-2.6.18-128.el5.img

root

Команда root принимает в качестве параметра описание раздела устройства для хранения данных с файлами корневой файловой системы.

Команда root позволяет указать необходимый жесткий диск и его раздел, причем запись hd0 соответствует первому жесткому диску, hd1 - второму жесткому диску и.т.д. Аналогичная нумерация используется по отношению к разделам жесткого диска, следовательно, запись hd0,0 будет указывать на первый раздел первого жесткого диска, запись hd0,1 - на второй раздел этого же жесткого диска и.т.д.

root (hd0,0)

savedefault

Команда sevedefault может быть использована вместе с командой default saved для изменения поведения меню. Благодаря использованию описанной комбинации команд станс, соответствующий загруженной операционной системе, будет выбран по умолчанию при следующей загрузке.

default saved
timeout 10

title Linux
root (hd0,0)
kernel /boot/vmlinuz
savedefault

title DOS
root (hd0,1)
makeactive
chainloader +1
savedefault

14.2.5. Последовательная загрузка операционной системы

В случае использования системного загрузчика grub у вас есть два варианта загрузки операционной системы: непосредственная загрузка операционной системы или ее последовательная загрузка средствами нескольких системных загрузчиков (chainloading). При последовательной загрузке операционной системы системный загрузчик grub осуществляет загрузку кода из загрузочного сектора раздела (который содержит данные операционной системы).

Некоторые устаревшие операционные системы требуют использования первичного раздела, отмеченного как активный раздел. Так как активным разделом может быть только один раздел устройства для хранения данных, системный загрузчик grub может отметить нужный раздел соответствующим образом непосредственно перед последовательной загрузкой операционной системы.

В примере ниже показана методика отметки первого основного раздела жесткого диска как активного средствами системного загрузчика grub.

root (hd0,0)
makeactive

Последовательная загрузка операционной системы связана с загрузкой средствами системного загрузчика grub системного загрузчика другой операционной системы. Команда chainloader принимает один параметр: количество секторов для чтения и загрузки. Для операционных систем DOS и OS/2 достаточно одного сектора. Обратите внимание на то, что операционная система DOS требует, чтобы загрузочный/корневой раздел был активным!

Ниже приведен полный пример последовательной загрузки устаревшей операционной системы.

title MS-DOS 6.22
root  (hd0,1)
makeactive
chainloader +1

14.2.6. Простые примеры станс

Это пример станса для загрузки дистрибутива Debian 4.

title   Debian GNU/Linux, kernel 2.6.17-2-686
root    (hd0,0)
kernel  /boot/vmlinuz-2.6.17-2-686 root=/dev/hda1 ro 
initrd  /boot/initrd.img-2.6.17-2-686

А это пример станса для загрузки дистрибутива Red Hat Enterprise Linux 5.

title Red Hat Enterprise Linux Server (2.6.18-128.el5)
 root (hd0,0)
 kernel /vmlinuz-2.6.18-98.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
 initrd /initrd-2.6.18-98.el5.img

14.2.7. Редактирование станс средствами системного загрузчика grub в процессе загрузки системы

В процессе загрузки системы при показе меню системного загрузчика grub вы можете нажать клавишу e для редактирования текущего станса. Эта возможность позволит вам передать дополнительные параметры ядру ОС.

Одним из таких параметров, который может оказаться полезным в случае утраты пароля пользователя root, является параметр single. Этот параметр позволит вам загрузить ядро ОС в однопользовательском режиме (хотя в некоторых дистрибутивах вам все равно придется ввести пароль пользователя root).

kernel  /boot/vmlinuz-2.6.17-2-686 root=/dev/hda1 ro single

Другим параметром для сброса пароля пользователя root является параметр init=/bin/bash.

kernel  /boot/vmlinuz-2.6.17-2-686 root=/dev/hda1 ro init=/bin/bash

Обратите внимание на то, что в некоторых дистрибутивах данный параметр может быть деактивирован на этапе компиляции ядра ОС.

14.2.8. Установка системного загрузчика grub

Используйте утилиту grub-install для установки системного загрузчика grub. Этой утилите потребуется параметр, указывающий путь к файлу устройства для хранения данных, на котором будет перезаписан загрузочный сектор.

# grub-install /dev/hda

Вам придется выполнять описанное действие в ручном режиме крайне редко, так как системный загрузчик grub устанавливается в процессе установки операционной системы и не должен переустанавливаться при изменении конфигурации системы (как в случае с системным загрузчиком lilo).

14.3. Системный загрузчик grub2

14.3.1. grub 2.0?

Главным конфигурационным файлом в данной версии системного загрузчика является файл /boot/grub/grub.cfg. Несмотря на то, что синтаксис этого файла может показаться знакомым, его не нужно редактировать (так как этот файл генерируется автоматически!).

root@debian7:~# ls -l /boot/grub/grub.cfg
-r--r--r-- 1 root root 2453 май 13 17:22 /boot/grub/grub.cfg
root@debian7:~# head -3 /boot/grub/grub.cfg
#
# DO NOT EDIT THIS FILE
#

14.3.2. Файл конфигурации дополнительных элементов меню загрузки /etc/grub.d/40_custom

Файл /etc/grub.d/40_custom может модифицироваться с целью добавления в меню загрузки дополнительных элементов. Соответствующие этим элементам данные впоследствии могут быть автоматически добавлены в основной файл конфигурации системного загрузчика grub.

root@debian7:~# ls -l /etc/grub.d/40_custom
-rwxr-xr-x 1 root root 214 июл  3  2013 /etc/grub.d/40_custom
root@debian7:~# cat /etc/grub.d/40_custom
#!/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.

14.3.3. Файл конфигурации /etc/default/grub

Файлом конфигурации, позволяющим изменить поведение новой версии системного загрузчика grub, является файл /etc/default/grub.

root@debian7:~# head /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_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX="debian-installer=en_US"

14.3.4. Утилита update-grub

При любой модификации файла конфигурации /etc/default/grub вам придется использовать утилиту update-grub с целью записи изменений в основной файл конфигурации системного загрузчика.

root@debian7:~# vi /etc/default/grub
root@debian7:~# update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.2.0-4-amd64
Found initrd image: /boot/initrd.img-3.2.0-4-amd64
done

14.4. Системный загрузчик lilo

14.4.1. Linux loader

Системный загрузчик lilo в прошлом являлся наиболее часто используемым системным загрузчиком в дистрибутивах Linux, но в последнее время наметилась тенденция его замены на такие системные загрузчики, как описанный выше grub и недавно выпущенный grub2.

14.4.2. Файл конфигурации lilo.conf

Ниже приведен пример содержимого файла конфигурации lilo.conf. Параметр delay позволяет установить длительность периода ожидания перед загрузкой операционной системы в десятых долях секунды. Следовательно, установленная длительность периода ожидания равна 3 секундам, а не 30, как может показаться на первый взгляд!

boot = /dev/hda
delay = 30

image = /boot/vmlinuz
  root = /dev/hda1
  label = Red Hat 5.2

image = /boot/vmlinuz
  root = /dev/hda2
  label = S.U.S.E. 8.0

other = /dev/hda4
  table = /dev/hda
  label = MS-DOS 6.22

В файле конфигурации содержатся три примера станс. С помощью первого станса осуществляется загрузка дистрибутива Red Hat с первого раздела первого жесткого диска (hda1). Второй станс предназначен для загрузки дистрибутива Suse 8.0 со следующего раздела того же диска. Последний станс предназначен для загрузки операционной системы MS-DOS.

14.5. Практическое задание: системный загрузчик

0. Выясните, какой из системных загрузчиков используется на вашем компьютере: lilo, grub или grub2. Выполняйте только те практические задания, которые выполнимы в рамках вашей системы.

1. Создайте копию исполняемого файла ядра ОС, файла виртуального диска initrd и файла System.map в директории /boot. Разместите копии в той же директории /boot, заменив в именах 2.x или 3.x на 4.0 (просто представьте, что состоялся выпуск ядра Linux версии 4.0).

2. Добавьте в файл конфигурации системного загрузчика grub станс для загрузки файлов версии 4.0. Убедитесь в том, что вы используете отличное название пункта меню загрузки.

3. Установите длительность периода ожидания перед загрузкой операционной системы, равную 30 секундам.

4. Перезагрузите компьютер и проверьте работоспособность нового станса.

14.6. Корректная процедура выполнения практического задания: системный загрузчик

0. Выясните, какой из системных загрузчиков используется на вашем компьютере: lilo, grub или grub2. Выполняйте только те практические задания, которые выполнимы в рамках вашей системы.

1. Создайте копию исполняемого файла ядра ОС, файла виртуального диска initrd и файла System.map в директории /boot. Разместите копии в той же директории /boot, заменив в именах 2.x или 3.x на 4.0 (просто представьте, что состоялся выпуск ядра Linux версии 4.0).

[root@centos65 boot]# uname -r
2.6.32-431.11.2.el6.x86_64
[root@centos65 boot]# cp System.map-2.6.32-431.11.2.el6.x86_64 System.map-4.0
[root@centos65 boot]# cp vmlinuz-2.6.32-431.11.2.el6.x86_64 vmlinuz-4.0
[root@centos65 boot]# cp initramfs-2.6.32-431.11.2.el6.x86_64.img initramfs-4.0\
.img

Не забывайте о том, что файл initrd (или initramfs) имеет расширение .img.

2. Добавьте в файл конфигурации системного загрузчика grub станс для загрузки файлов версии 4.0. Убедитесь в том, что вы используете отличное название пункта меню загрузки.

[root@centos65 grub]# cut -c1-70 menu.lst | tail -12
title CentOS (4.0)
        root (hd0,0)
        kernel /vmlinuz-4.0 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS L
        initrd /initramfs-4.0.img
title CentOS (2.6.32-431.11.2.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.11.2.el6.x86_64 ro root=/dev/mapper/VolGro
        initrd /initramfs-2.6.32-431.11.2.el6.x86_64.img
title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv
        initrd /initramfs-2.6.32-431.el6.x86_64.img
[root@centos65 grub]#

3. Установите длительность периода ожидания перед загрузкой операционной системы, равную 30 секундам.

[root@centos65 grub]# vi menu.lst
[root@centos65 grub]# grep timeout /boot/grub/grub.conf
timeout=30

4. Перезагрузите компьютер и проверьте работоспособность нового станса.

[root@centos65 grub]# reboot

Меню загрузки системы

Выберите ваш станс и в том случае, если произойдет загрузка операционной системы, вы выполнили практическое задание корректно.


Предыдущий раздел: Оглавление Следующий раздел:
Глава 13. Знакомство с технологией резервирования каналов передачи данных   Глава 15. Инициализация системы и уровни исполнения