Библиотека сайта 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
).
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. Инициализация системы и уровни исполнения |