В древние времена ядро было жестко запрограммировано, чтобы знать основной / младший номер устройства 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.