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. Это историческое имя, а не признак старого механизма.
Что происходит при загрузке
- GRUB 2 загружает ядро и initramfs в память и передаёт ядру командную строку.
- Ядро распаковывает cpio-архив в tmpfs и делает его временным корнем.
- Ядро запускает
/init— скрипт из initramfs. - Скрипт подгружает нужные модули, при необходимости спрашивает пароль для шифрованного диска, активирует LVM/RAID.
- Он находит и монтирует настоящий корень.
- Выполняется
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.
Комментарии
Пока комментариев нет.