F1 Win
F2 FreeBSD
Default: F2
Глава 15. Процесс загрузки FreeBSD
Этот перевод может быть устаревшим. Для того, чтобы помочь с переводом, пожалуйста, обратитесь к Сервер переводов FreeBSD.
Содержание
15.1. Обзор
Процесс запуска компьютера и загрузки операционной системы называется "процессом начальной загрузки" или "загрузкой". Процесс загрузки FreeBSD предоставляет большую гибкость в настройке действий при старте системы, включая возможность выбора между различными операционными системами, установленными на одном компьютере, разными версиями одной операционной системы или другим установленным ядром.
Эта глава подробно описывает доступные параметры конфигурации. В ней показано, как настроить процесс загрузки FreeBSD, включая все этапы до момента, когда ядро FreeBSD запустится, определит устройства и запустит init(8). Это происходит, когда цвет текста загрузочных сообщений меняется с ярко-белого на серый.
Прочитав эту главу, вы узнаете:
Компоненты загрузочной системы FreeBSD и их взаимодействие.
Параметры, которые можно передать компонентам в процессе загрузки FreeBSD для управления процессом загрузки.
Основы настройки подсказок устройств.
Как загрузиться в однопользовательском и многопользовательском режимах и как правильно завершить работу системы FreeBSD.
Эта глава описывает только процесс загрузки FreeBSD на системах с архитектурой x86 и amd64. |
15.2. Процесс загрузки FreeBSD
Включение компьютера и запуск операционной системы представляет собой интересную дилемму. По определению, компьютер не умеет ничего делать до запуска операционной системы. Это включает в себя запуск программ с диска. Если компьютер не может запустить программу с диска без операционной системы, а программы операционной системы находятся на диске, то как же тогда запускается операционная система?
Эта проблема аналогична описанной в книге «Приключения барона Мюнхгаузена». Персонаж частично провалился в люк, но смог выбраться, ухватившись за шнурки своих сапог и подтянув себя вверх. В первые дни развития вычислительной техники термин bootstrap применялся к механизму загрузки операционной системы. Со временем он сократился до «загрузки» (англ. "booting").
На аппаратном обеспечении x86 загрузка операционной системы выполняется базовой системой ввода/вывода (BIOS). BIOS ищет на жестком диске главную загрузочную запись (MBR), которая должна находиться в определенном месте диска. BIOS обладает достаточными знаниями для загрузки и запуска MBR и предполагает, что MBR затем сможет выполнить остальные задачи по загрузке операционной системы, возможно, с помощью BIOS.
FreeBSD поддерживает загрузку как по старому стандарту MBR, так и по новому стандарту GUID Partition Table (GPT). Разметка GPT часто встречается на компьютерах с Unified Extensible Firmware Interface (UEFI). Однако FreeBSD может загружаться с разделов GPT даже на машинах с устаревшим BIOS, используя gptboot(8). Ведутся работы по обеспечению прямой загрузки через UEFI. |
Код в MBR обычно называют загрузчиком, особенно если он взаимодействует с пользователем. Загрузчик обычно содержит больше кода в первом треке диска или в файловой системе. Примерами загрузчиков являются стандартный загрузчик FreeBSD boot0, также называемый Boot Easy, и GNU GRUB, который используется во многих дистрибутивах Linux®.
Пользователи GRUB могут обратиться к документации от GNU. |
Если на компьютере установлена только одна операционная система, MBR ищет первый загрузочный (активный) раздел на диске, а затем запускает код в этом разделе для загрузки остальной части операционной системы. При наличии нескольких операционных систем можно установить другой загрузчик, который отобразит список операционных систем, позволяя пользователю выбрать нужную для загрузки.
Оставшаяся часть загрузочной системы FreeBSD разделена на три этапа. Первый этап знает ровно столько, чтобы перевести компьютер в определённое состояние и запустить второй этап. Второй этап может выполнить немного больше, прежде чем запустить третий этап. Третий этап завершает загрузку операционной системы. Работа разделена на три этапа, потому что MBR накладывает ограничения на размер программ, которые могут быть выполнены на первом и втором этапах. Объединение задач в цепочку позволяет FreeBSD предоставить более гибкий загрузчик.
Затем запускается ядро, которое начинает поиск и инициализацию устройств для их использования. После завершения процесса загрузки ядра управление передаётся пользовательскому процессу init(8), который проверяет готовность дисков к работе, запускает пользовательскую настройку ресурсов, монтирует файловые системы, настраивает сетевые карты для работы в сети и запускает процессы, запланированные для выполнения при старте системы.
Этот раздел подробно описывает эти этапы и показывает, как взаимодействовать с процессом загрузки FreeBSD.
15.2.1. Загрузчик
Код загрузчика в MBR иногда называют нулевой стадией процесса загрузки. По умолчанию FreeBSD использует загрузчик boot0.
MBR, записываемый установщиком FreeBSD, основан на /boot/boot0. Размер и возможности boot0 ограничены 446 байтами из-за таблицы разделов и идентификатора 0x55AA
в конце MBR. Если установлены boot0 и несколько операционных систем, при загрузке будет отображаться сообщение, похожее на этот пример:
Другие операционные системы перезапишут существующую MBR, если они установлены после FreeBSD. Если это произошло или требуется заменить существующую MBR на MBR FreeBSD, используйте следующую команду:
# fdisk -B -b /boot/boot0 device
где device — это загрузочный диск, например, ad0 для первого IDE-диска, ad2 для первого IDE-диска на втором IDE-контроллере или da0 для первого SCSI-диска. Для создания пользовательской конфигурации MBR обратитесь к boot0cfg(8).
15.2.2. Этап первый и Этап второй
Концептуально первая и вторая стадии являются частью одной программы и расположены в одной области диска. Из-за ограничений по объёму они были разделены на две части, но всегда устанавливаются вместе. Они копируются из объединённого файла /boot/boot с помощью установщика FreeBSD или bsdlabel
.
Эти два этапа расположены за пределами файловых систем, в первом треке загрузочного раздела, начиная с первого сектора. Именно здесь boot0 или любой другой загрузчик ожидает найти программу для запуска, которая продолжит процесс загрузки.
Первая стадия, boot1, очень проста, так как её размер может составлять только 512 байт. Она знает ровно столько о bsdlabel FreeBSD, в котором хранится информация о слайсе, чтобы найти и выполнить boot2.
Этап два, boot2, немного сложнее и понимает файловую систему FreeBSD достаточно хорошо, чтобы находить файлы. Он может предоставить простой интерфейс для выбора ядра или загрузчика для запуска. Он запускает loader, который гораздо более продвинут и предоставляет файл конфигурации загрузки. Если процесс загрузки прерывается на втором этапе, отображается следующий интерактивный экран:
>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/boot/loader
boot:
Для замены установленных boot1 и boot2 используйте bsdlabel
, где diskslice — это диск и раздел, с которого производится загрузка, например ad0s1 для первого раздела на первом IDE-диске:
# bsdlabel -B diskslice
Если указано только имя диска, например ad0, |
15.2.3. Этап три
Загрузчик является завершающим этапом трёхэтапного процесса начальной загрузки. Он располагается в файловой системе, обычно как /boot/loader.
Загрузчик предназначен для интерактивной настройки с использованием встроенного набора команд, а также поддерживается более мощным интерпретатором с расширенным набором команд.
Во время инициализации загрузчик определит консоль и диски, а также выяснит, с какого диска происходит загрузка. Он установит соответствующие переменные и запустит интерпретатор, в котором пользовательские команды могут передаваться из скрипта или вводиться в интерактивном режиме.
Затем загрузчик прочитает /boot/loader.rc, который по умолчанию загружает /boot/defaults/loader.conf, где задаются разумные значения по умолчанию для переменных, а также читает /boot/loader.conf для локальных изменений этих переменных. После этого loader.rc действует в соответствии с этими переменными, загружая выбранные модули и ядро.
Наконец, по умолчанию загрузчик ожидает нажатия клавиш в течение 10 секунд и загружает ядро, если не было прерывания. Если прерывание произошло, пользователю предоставляется командная строка, поддерживающая набор команд, где можно изменить переменные, выгрузить все модули, загрузить модули и, наконец, загрузить или перезагрузить систему. Встроенные команды загрузчика перечисляет наиболее часто используемые команды загрузчика. Для полного описания всех доступных команд обратитесь к loader(8).
Переменная | Описание |
---|---|
autoboot секунды | Продолжает загрузку ядра, если не прервано в течение указанного времени в секундах. Отображает обратный отсчет, а время по умолчанию составляет 10 секунд. |
boot [ | Немедленно переходит к загрузке ядра с любыми указанными параметрами или именем ядра. Указание имени ядра в командной строке применимо только после выполнения команды |
boot-conf | Проходит ту же автоматическую настройку модулей на основе указанных переменных, чаще всего |
help [ | Показывает справочные сообщения, прочитанные из файла /boot/loader.help. Если указана тема |
include | Читает указанный файл и обрабатывает его построчно. Ошибка немедленно останавливает |
load [-t | Загружает ядро, модуль ядра или файл указанного типа с заданным именем. Все аргументы после имяфайла передаются файлу. Если имяфайла не указано полностью, файл будет искаться в /boot/kernel и /boot/modules. |
ls [-l] [ | Отображает список файлов в указанном пути или в корневом каталоге, если путь не указан. Если указан параметр |
lsdev [ | Перечисляет все устройства, с которых возможно загрузить модули. Если указан параметр |
lsmod [ | Отображает загруженные модули. Если указан параметр |
more | Отображает указанные файлы с паузой после каждых |
reboot | Немедленно перезагружает систему. |
set | Устанавливает указанные переменные окружения. |
unload | Удаляет все загруженные модули. |
Вот несколько практических примеров использования загрузчика. Чтобы загрузить обычное ядро в однопользовательском режиме:
boot -s
Чтобы выгрузить обычное ядро и модули, а затем загрузить предыдущее или другое указанное ядро:
unload
load /путь/к/файлуядра
Используйте полный путь /boot/GENERIC/kernel для ссылки на стандартное ядро, поставляемое с установкой, или /boot/kernel.old/kernel для ссылки на предыдущую версию ядра до обновления системы или до настройки собственного ядра.
Используйте следующее для загрузки обычных модулей с другим ядром. Обратите внимание, что в этом случае не обязательно указывать полное имя:
unload
set kernel="mykernel"
boot-conf
Для загрузки автоматизированного сценария конфигурации ядра:
load -t userconfig_script /boot/kernel.conf
15.2.4. Последний этап
После загрузки ядра с помощью loader
или boot2
, который обходит loader
, оно проверяет флаги загрузки и при необходимости корректирует свое поведение. В Взаимодействие ядра во время загрузки приведены часто используемые флаги загрузки. Дополнительную информацию о других флагах загрузки можно найти в boot(8).
Опция | Описание |
---|---|
| Во время инициализации ядра запросить устройство для монтирования в качестве корневой файловой системы. |
| Загрузка корневой файловой системы с CDROM. |
| Загрузится в однопользовательский режим. |
| Более подробный вывод во время загрузки ядра. |
После завершения загрузки ядро передает управление пользовательскому процессу init(8), который находится в /sbin/init, или программе, указанной в переменной init_path
в loader
. Это последний этап процесса загрузки.
Последовательность загрузки гарантирует, что файловые системы, доступные в системе, находятся в согласованном состоянии. Если файловая система UFS не согласована и fsck
не может исправить несоответствия, init переводит систему в однопользовательский режим, чтобы администратор системы мог устранить проблему вручную. В противном случае система загружается в многопользовательский режим.
15.2.4.1. Однопользовательский режим
Пользователь может указать этот режим, загрузившись с ключом -s
или установив переменную boot_single
в загрузчике. Также можно перейти в этот режим, выполнив команду shutdown now
из многопользовательского режима. Однопользовательский режим начинается со следующего сообщения:
Enter full pathname of shell or RETURN for /bin/sh:
Если пользователь нажмёт Enter, система запустит оболочку Bourne по умолчанию. Чтобы указать другую оболочку, введите полный путь к ней.
Однопользовательский режим обычно используется для восстановления системы, которая не загружается из-за несогласованности файловой системы или ошибки в конфигурационном файле загрузки. Он также может применяться для сброса пароля root
, если он неизвестен. Эти действия возможны, поскольку приглашение однопользовательского режима предоставляет полный локальный доступ к системе и её конфигурационным файлам. В этом режиме отсутствует сетевое взаимодействие.
Хотя однопользовательский режим полезен для восстановления системы, он представляет угрозу безопасности, если система не находится в физически защищенном месте. По умолчанию любой пользователь, имеющий физический доступ к системе, получит полный контроль над ней после загрузки в однопользовательском режиме.
Если в /etc/ttys параметр console
изменён на insecure
, система сначала запросит пароль root
перед переходом в однопользовательский режим. Это добавляет уровень безопасности, но лишает возможности сбросить пароль root
, если он неизвестен.
# name getty type status comments # # If console is marked "insecure", then init will ask for the root password # when going to single-user mode. console none unknown off insecure
insecure
консоль означает, что физическая безопасность консоли считается ненадежной, поэтому только тот, кто знает пароль root
, может использовать однопользовательский режим.
15.2.4.2. Многопользовательский режим
Если init
обнаруживает, что файловые системы в порядке, или после того, как пользователь завершит свои команды в однопользовательском режиме и введёт exit
для выхода из этого режима, система переходит в многопользовательский режим, в котором начинается настройка ресурсов системы.
Система конфигурации ресурсов загружает настройки по умолчанию из /etc/defaults/rc.conf и специфичные для системы параметры из /etc/rc.conf. Затем она монтирует файловые системы, перечисленные в /etc/fstab. После этого запускаются сетевые службы, различные системные демоны, а затем скрипты запуска локально установленных пакетов.
Чтобы узнать больше о системе настройки ресурсов, обратитесь к rc(8) и изучите скрипты в /etc/rc.d.
15.3. Подсказки устройств
Во время начальной загрузки системы загрузчик loader(8) читает файл device.hints(5). Этот файл хранит информацию о загрузке ядра, известную как переменные, иногда называемые "подсказками устройств" ("device hints"). Эти "подсказки устройств" используются драйверами устройств для их конфигурации.
Подсказки для устройств также могут быть указаны в строке загрузчика на Этапе 3, как показано в Третий Этап. Переменные можно добавить с помощью set
, удалить с помощью unset
и просмотреть с помощью show
. Переменные, заданные в /boot/device.hints, также могут быть переопределены. Подсказки для устройств, введённые в загрузчике, не являются постоянными и не будут применены при следующей перезагрузке.
После загрузки системы все переменные можно вывести с помощью kenv(1).
Синтаксис для /boot/device.hints — одна переменная на строку, символ "#" используется для комментариев. Строки формируются следующим образом:
hint.driver.unit.keyword="value"
Синтаксис загрузчика Этапа 3 следующий:
set hint.driver.unit.keyword=value
где driver
— это имя драйвера устройства, unit
— номер устройства драйвера, а keyword
— ключевое слово подсказки. Ключевое слово может включать следующие варианты:
at
: указывает шину, к которой подключено устройство.port
: указывает начальный адрес ввода-вывода, который будет использоваться.irq
: указывает номер запроса на прерывание, который должен использоваться.drq
: указывает номер канала DMA.maddr
: указывает физический адрес памяти, занятый устройством.flags
: устанавливает различные биты флагов для устройства.disabled
: если установлено в1
, устройство отключено.
Поскольку драйверы устройств могут принимать или требовать дополнительные подсказки, не перечисленные здесь, рекомендуется ознакомиться с руководством по конкретному драйверу. Для получения дополнительной информации обратитесь к device.hints(5), kenv(1), loader.conf(5) и loader(8).
15.4. Последовательность выключения
При контролируемом завершении работы с помощью shutdown(8), init(8) попытается выполнить скрипт /etc/rc.shutdown, а затем отправит всем процессам сигнал TERM
, и после этого сигнал KILL
всем процессам, которые не завершатся своевременно.
Для выключения питания машины FreeBSD на архитектурах и системах, поддерживающих управление питанием, используйте shutdown -p now
, чтобы немедленно отключить питание. Для перезагрузки системы FreeBSD используйте shutdown -r now
. Для выполнения shutdown(8) необходимо быть root
или членом группы operator
. Также можно использовать halt(8) и reboot(8). Дополнительную информацию см. на их справочных страницах и в shutdown(8).
Измените членство в группе, обратившись к разделу «Пользователи и основы управления учетными записями».
Управление питанием требует, чтобы модуль acpi(4) был загружен как модуль или статически скомпилирован в собственное ядро. |
Изменено: 20 октября 2025 г. by Vladlen Popolitov