Процесс запуска при близком рассмотрении

Linux может быть запущена как с дискеты, так и с жёсткого диска. В книге "Установка и запуск Linux" подробно описан процесс запуска системы.

При включении компьютера сначала BIOS производит тестирование оборудования, а затем инициирует запуск операционной системы. Сначала выбирается устройство, с которого будет производиться загрузка (обычно первый дисковод, если в него вставлена дискета, или первый жёсткий диск, если он установлен; порядок выбора может быть настроен), и считывается самый первый сектор, который называется загрузочным. Его также называют MBR (Master Boot Record), так как у жёсткого диска может быть несколько разделов, и у каждого может быть свой загрузочный сектор.

В загрузочном секторе находится относительно небольшая программа (настолько маленькая, чтобы она могла разместиться в одном секторе), которая загружает и запускает операционную систему. При загрузке с дискеты в загрузочном секторе находится код, который обеспечивает только считывание ядра системы в определённую заранее область памяти. Загрузочная дискета для Linux не содержит файловых систем. Ядро записано на дискете как последовательность блоков, что значительно упрощает процесс загрузки. Однако можно загружаться с дискеты, на которой установлена какая-либо файловая система, используя загрузчик LILO.

При загрузке с жёсткого диска код, расположенный в MBR, проверяет таблицу разделов (также расположенную в MBR), определяет активный раздел (раздел, используемый при загрузке), считывает загрузочный сектор этого раздела и запускает считанный код. Код, расположенный в загрузочном секторе активного раздела жёсткого диска, выполняет те же функции, что и код, находящийся в загрузочном секторе дискеты: он считывает ядро из выбранного раздела и затем запускает его. Однако здесь существует множество тонкостей, так как использование отдельного раздела диска только для хранения кода ядра неэффективно, и код, расположенный в загрузочном секторе раздела, использует считывание по секторам. Существует несколько способов решения этой проблемы, но наиболее простым из них является использование загрузчика LILO (дополнительную информацию по установке и настройке LILO см. в документации по LILO).

При загрузке с использованием LILO обычно сразу же загружается и запускается ядро, заданное по умолчанию. Однако можно сконфигурировать LILO так, чтобы можно было бы загрузить одно из нескольких возможных ядер или даже другую операционную систему (помимо Linux). Также можно указать требуемое ядро или операционную систему во время загрузки. При нажатии клавиш ALT, SHIFT или CTRL (после загрузки LILO) будет выдан запрос, где можно указать ядро или систему. Однако при конфигурировании можно установить опцию, при которой LILO будет всегда выдавать такой запрос, а также указать время, по истечении которого загружается ядро, установленное по умолчанию.

Существуют и другие загрузчики, аналогичные LILO, однако у него есть ряд уникальных функций, которые отсутствуют у других загрузчиков, так как он был создан специально для Linux. Например, возможность передачи ядру параметров во время загрузки или изменения некоторых опций, встроенных в ядро. Среди аналогичных загрузчиков (bootlin, bootactv и др.) LILO является лучшим выбором.

Загрузка системы как с жёсткого диска, так и с дискеты имеет свои преимущества. Хотя загрузка с жёсткого диска считается предпочтительней и быстрее, так как она позволяет избежать неудобств, связанных со сменой дискет, в некоторых случаях загрузка с дискеты может быть более удобной. Например, при установке системы или при повреждении файловой системы. После того, как ядро системы загружено в память (с жёсткого диска или с дискеты) и запущено, происходят приблизительно следующие действия:

Так как ядро Linux установлено в сжатом виде, то прежде всего оно само себя распаковывает. Это выполняет небольшая программа, расположенная в самом начале кода.

Если на компьютере установлена видеокарта sVGA, поддерживающая нестандартные текстовые режимы (такие как 100x40), выдаётся запрос на указание требуемого режима. При компиляции ядра можно задать используемый режим, чтобы он не запрашивался при каждой загрузке. Режим также может быть задан при помощи LILO или rdev(8).

Далее ядро тестирует аппаратное обеспечение (жёсткие диски, дисководы, сетевые адаптеры и др.), конфигурирует соответствующие драйверы устройств, и во время этого процесса на экран выводятся сообщения. Вот приближенный порядок действий во время загрузки:

LILO boot:

Loading linux.
Console: colour EGA+ 80x25, 8 virtual consoles
Serial driver version 3.94 with no serial options enabled
tty00 at 0x03f8 (irq = 4) is a 16450
tty01 at 0x02f8 (irq = 3) is a 16450
lp_init: lp1 exists (0), using polling driver
Memory: 7332k/8192 available (300k kernel code, 384k reserved, 176k data)
Floppy drive(s): fd0 is 1.44M, fd1 is 1.2M
Loopback device init
Warning WD8013 board not found at i/o = 280
Math coprocessor using irq13 error reporting
Partition check:
hda: hda1 hda2 hda3
VFS: Mounted root (ext filesystem)
Linux version 0.99.pl9-1 (root@haven) 05/01/93 14:12:20

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

После этого ядро пытается смонтировать файловую систему root. Местоположение для её монтирования задаётся во время компиляции или с помощью rdev или LILO. Тип файловой системы определяется автоматически. Если система root не может быть смонтирована, например, из-за отсутствия в ядре драйвера соответствующей файловой системы, система останавливается.

Файловая система root обычно монтируется в режиме read-only (это устанавливается таким же образом, как и точка монтирования). Это позволяет проводить проверку файловой системы во время её работы, хотя проверка файловой системы, находящейся в режиме read-write, не рекомендуется.

Затем ядро запускает программу init(8) в фоновом режиме, расположенную в каталоге /sbin/init, которая становится главным процессом. Init выполняет ряд начальных функций, необходимых для установки системы. В конечном итоге, init запускает программу getty(8) для виртуальных консолей и последовательных портов. Эта программа позволяет подключаться к системе через виртуальные консоли или терминалы, подключенные к последовательным портам. Init может быть настроена для запуска других программ. После завершения всех этих операций процесс загрузки системы считается завершенным, и система готова к работе.

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