В древние времена ядро было жестко запрограммировано, чтобы знать основной / младший номер устройства root fs, и монтировало это устройство после инициализации всех драйверов устройств, которые были встроены в ядро. rdev
Утилита может быть использована для изменения количества корневого устройства в образе ядра без необходимости перекомпилировать его.
В конце концов появились загрузчики, которые могли передать командную строку ядру. Если root=
аргумент был передан, это говорит ядру, где находится корень fs вместо встроенного значения. Драйверы, необходимые для доступа, должны быть встроены в ядро. Несмотря на то, что аргумент выглядит как обычный узел устройства в /dev
каталоге, очевидно, что нет /dev
каталога до монтирования корневого fs, поэтому ядро не может искать там узел dev. Вместо этого некоторые хорошо известные имена устройств жестко запрограммированы в ядре, поэтому строку можно преобразовать в номер устройства. Из-за этого ядро может распознавать такие вещи, как /dev/sda1
, но не более экзотические вещи, такие /dev/mapper/vg0-root
как UUID тома или тома.
Позже initrd
пришло в картину. Наряду с ядром загрузчик будет загружать initrd
образ, представляющий собой сжатый образ файловой системы (образ gzipped ext2, образ gzipped romfs, в конечном итоге squashfs стал доминирующим). Ядро распаковывает этот образ в виртуальный диск и монтирует виртуальный диск как корень fs. Этот образ содержит некоторые дополнительные драйверы и загрузочные скрипты вместо реальных init
. Эти загрузочные сценарии выполняли различные задачи для распознавания оборудования, активации таких вещей, как raid-массивы и LVM, обнаружение UUID и синтаксический анализ командной строки ядра, чтобы найти реальный корень, который теперь можно указывать с помощью UUID, метки тома и других сложных вещей. Затем он смонтировал настоящий root-файл /initrd
, затем выполнил pivot_root
системный вызов для замены ядра /
и/initrd
, затем exec /sbin/init
для реального корня, который затем размонтирует /initrd
и освободит виртуальный диск.
Наконец, сегодня у нас есть initramfs
. Это похоже на initrd
, но вместо сжатого образа файловой системы, загружаемого в виртуальный диск, это сжатый архив cpio. Tmpfs монтируется как корень, и архив там извлекается. Вместо использования pivot_root
, которое считалось грязным хаком, initramfs
загрузочные скрипты монтируют настоящий корень /root
, удаляют все файлы в корне tmpfs, затем chroot
в /root
и исполняют /sbin/init
.