Initramfs

Загрузка

Initramfs (initial RAM filesystem, «начальная файловая система в памяти») — небольшой архив, который GRUB 2 загружает в память вместе с ядром. Ядро распаковывает его и запускает оттуда первую программу — до того, как смонтирует настоящий корень системы.

Проще говоря: это «аварийный набор инструментов», который едет вместе с ядром. Без него ядро часто просто не знает, как добраться до настоящего корневого раздела.

Зачем он нужен

Классическая проблема «курицы и яйца»: чтобы смонтировать корневую файловую систему, нужны драйверы и утилиты, а чтобы получить их — нужно смонтировать корень.

Initramfs решает это так: нужное лежит в памяти и доступно сразу. Туда кладут:

  • модули ядра для корня: драйверы дисковых контроллеров (NVMe, SATA, RAID), файловых систем (ext4, XFS, Btrfs), а также LVM, LUKS, сетевую загрузку;
  • утилиты: busybox, cryptsetup (запрос пароля для шифрованного диска), lvm, fsck, mount, udev;
  • заставку: Plymouth стартует именно отсюда (см. Splash);
  • скрипт init — первую программу, которую запускает ядро.

Если корень простой (один раздел ext4 на обычном SATA), initramfs может быть крошечным. Если корень на LUKS + LVM, он заметно больше.

initrd и initramfs — это разные вещи

Термины часто путают, потому что имя файла осталось от старого механизма. Это два разных способа решать одну задачу:

initrd (старый) initramfs (современный)
Когда Linux 2.2–2.4 Linux 2.6 и новее
Что это образ файловой системы (ext2) cpio-архив
Как монтируется как блочное устройство /dev/ram0 распаковывается в tmpfs
Размер фиксированный, ограничен не ограничен
Память занимает весь образ целиком только то, что реально лежит внутри
Файловая система нужна настоящая (ext2) не нужна, это просто архив
Изменить состав сложно легко: распаковать, дописать, собрать
Как ядро различает — cpio-архив → initramfs, образ ФС → старый initrd

Ядро поддерживает оба механизма и определяет нужный само. Практически везде сегодня используется initramfs.

Проверить на своей машине:

file /boot/initrd.img-$(uname -r)

Если в ответе ASCII cpio archive — это initramfs, как бы ни назывался файл.

Как это выглядит по дистрибутивам

Дистрибутив Файл Инструмент
Debian, Ubuntu /boot/initrd.img-<версия> initramfs-tools (update-initramfs)
Fedora, RHEL, openSUSE /boot/initramfs-<версия>.img dracut
Arch /boot/initramfs-linux.img mkinitcpio

Обратите внимание: Debian называет файл initrd.img, хотя внутри initramfs. Это историческое имя, а не признак старого механизма.

Что происходит при загрузке

  1. GRUB 2 загружает ядро и initramfs в память и передаёт ядру командную строку.
  2. Ядро распаковывает cpio-архив в tmpfs и делает его временным корнем.
  3. Ядро запускает /init — скрипт из initramfs.
  4. Скрипт подгружает нужные модули, при необходимости спрашивает пароль для шифрованного диска, активирует LVM/RAID.
  5. Он находит и монтирует настоящий корень.
  6. Выполняется switch_root — корнем становится настоящая файловая система, и запускается systemd. Initramfs после этого освобождается.

Вот почему при проблемах с initramfs загрузка обрывается сообщением вида Unable to mount root fs или бесконечным ожиданием — ядро дошло до шага 5 и не смогло.

Посмотреть, что внутри

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

# тип файла: cpio-архив — значит, это initramfs
file /boot/initrd.img-$(uname -r)

# список содержимого (Debian/Ubuntu)
lsinitramfs /boot/initrd.img-$(uname -r)

# распаковать в каталог (Debian/Ubuntu)
unmkinitramfs /boot/initrd.img-$(uname -r) /tmp/initramfs
ls /tmp/initramfs

Универсальный способ — распаковать руками. Архив сжат, поэтому сначала снимаем сжатие, а потом читаем cpio:

# разжать
gunzip -c /boot/initrd.img-$(uname -r) > /tmp/initrd

# тип файла
file /tmp/initrd

# распаковать cpio-архив
mkdir -p /tmp/initramfs && cd /tmp/initramfs
sudo cpio -idmv < /tmp/initrd

Пересобрать initramfs

Образ нужно пересобирать после смены модулей, настройки шифрования, а также после смены темы заставки (см. Splash).

# Debian/Ubuntu: для текущего ядра
sudo update-initramfs -u

# Debian/Ubuntu: для всех установленных ядер
sudo update-initramfs -u -k all

# Fedora/RHEL/openSUSE
sudo dracut -f

# Arch
sudo mkinitcpio -P

Как его указывают загрузчику

В меню GRUB это строка initrd — путь к образу относительно раздела GRUB:

grub> linux /boot/vmlinuz-6.1.0-13-amd64 root=/dev/sda2 ro quiet splash
grub> initrd /boot/initrd.img-6.1.0-13-amd64
grub> boot

Подробнее про ручную загрузку — в статье GRUB 2.

Что запомнить

  • Initramfs — маленькая файловая система в памяти: ядро берёт оттуда драйверы и утилиты, чтобы смонтировать настоящий корень.
  • initrd и initramfs — разные механизмы, а не синонимы; сегодня используется initramfs (cpio-архив в tmpfs), а «initrd» осталось в именах файлов.
  • Проверить просто: file /boot/initrd.img-$(uname -r) → cpio archive.
  • После смены модулей или темы заставки образ пересобирают: update-initramfs -u, dracut -f или mkinitcpio -P.

Смотрите также

  • Загрузка — весь процесс по шагам
  • GRUB 2 — загрузчик, который передаёт initramfs ядру
  • Ядро — что происходит после передачи управления
  • Splash — заставка, которая стартует из initramfs
  • SystemD — что запускается после switch_root
Оценка статьи 0

Комментарии

Пока комментариев нет.