Оптимизация и уменьшение размера initramfs
Перед загрузкой операционной системы Linux происходит загрузка образа initramfs (Initial RAM File System) в оперативную память. Этот образ содержит драйверы, утилиты и скрипты, необходимые для подключения корневого раздела и начальной загрузки операционной системы. Обычно initramfs включает универсальный набор модулей и драйверов, чтобы загружаться на любом компьютере.
Настройка и оптимизация initramfs показана на примере операционной системы Debian/Ubuntu.
Все действия выполняются от root пользователя или с его привилегиями через sudo
su -
Я покажу минимальную настройку для уменьшения размера initramfs, без глубокого погружения в конфигурацию.
1. Для чего уменьшать размер initramfs?
- Экономия места на диске. Изначально когда я ставил Debian, его установщик порекомендовал сделать раздел /boot размером 500Мб. Однажды, при обновлении пакетов я получил сообщение: Warning: More space needed in /boot than available: 137 MB > 124 MB, которое означает что недостаточно места в /boot разделе.
- Ускорение загрузки системы и снижение потребления оперативной памяти. На мощных компьютерах это не критично, но для VDS (Virtual Dedicated Server) идеально подходит.
- Ускорение обновления пакетов и ядра системы. Добавляются в initramfs только необходимые модули.
На мой взор, это основные причины. Если система не переносится на другие компьютеры и оборудование не меняется, рекомендую оптимизировать initramfs.
Проверим размер образов initramfs
ls -lh /boot/initrd.img*

На моей системе размер составляет 104 Мбайта.
Посмотрим, что включено в образ initramfs
lsinitramfs /boot/initrd.img-$(uname -r)
2. Выбор загружаемых модулей в initramfs
При установке системы часто по умолчанию указывают настройки для создания initramfs с универсальным набором модулей. Можно изменить, чтобы автоматически использовался только необходимый список модулей для текущего компьютера или указать вручную конкретный список.
Открываем файл конфигурации initramfs.conf и ищем параметр MODULES
nano /etc/initramfs-tools/initramfs.conf

Параметр MODULES может иметь следующие значения:
- most — универсальный набор модулей для файловых систем и накопителей;
- dep — только необходимые модули (утилита автоматически попробует угадать их);
- netboot — только модули для загрузки по сети;
- list — загрузка модулей из указанного списка.
У меня параметр MODULES равен most, что означает использовать универсальный набор, все возможные модули.
2.1. Параметр MODULES равен dep
В большинстве случаев достаточно установить dep и утилита update-initramfs автоматически найдет необходимые модули для данного компьютера и добавит их. У меня не было случаев чтобы она не добавляла необходимые драйвера для загрузки системы.
Указываем значение dep для параметра MODULES
MODULES=dep

Сохраняем и закрываем файл.
2.2. Параметр MODULES равен list
Значение list указывает, что будет загружен только список модулей указанных в файле /etc/initramfs-tools/modules. Необходимо добавить список модулей для загрузки системы вручную.
Я провел сравнение размера initramfs при значениях dep и list, у меня получилась разница в размере менее 1%. Без особой необходимости, нет смысла в параметре MODULES=list.
Указываем значение list для параметра MODULES
MODULES=list
Выводим список модулей, используемых в системе
lsmod
Находим модули, которые используются в системе для работы системного накопителя (SATA, NVME, …) и файловой системы (ext4 с необходимыми модулями, …).
Открываем файл /etc/initramfs-tools/modules и добавляем в файл необходимые модули
nano /etc/initramfs-tools/modules
Нужно быть очень внимательным. Если ты не указал необходимый драйвер или файловую систему, то операционная система не сможет загрузится. Это особо критично, если сервер удаленный.
Допустим, система установлена на NVMe-накопитель, основной раздел зашифрован, используется файловая система ext4, процессор Intel с поддержкой аппаратного шифрования AES.
Пример необходимых модулей:
# NVMe
nvme
nvme_core
# Шифрование (LUKS) и аппаратное ускорение AES для Intel
dm_crypt
dm_mod
aesni_intel
crypto_simd
# Файловая система ext4 с необходимыми модулями
ext4
mbcache
jbd2
Указывай необходимые модули которые нужны твоему компьютеру. В примере выше указаны модули для гипотетического компьютера.
Сохраняем и закрываем файл.
3. Обновление initramfs
После внесения изменений обновляем initramfs с помощью утилиты update-initramfs
update-initramfs -u
опция -u обновляет initramfs для последнего ядра.
Для обновления initramfs для всех ядер, необходимо добавить опции -k all
update-initramfs -u -k all
Я не рекомендую сразу обновлять для всех ядер. Если что-то пойдет не так, всегда можно загрузится через старое ядро и исправить ошибки.
4. Проверка загрузки и размера initramfs
Проверим размер образов initramfs
ls -lh /boot/initrd.img*

Как можно заменить, initramfs старого ядра весит 103Мб (MODULES=most), а нового ядра 24Мб (MODULES=dep). Размер initramfs уменьшился примерно в 4 раза.
Перезагружаем систему
reboot
Если система загрузилась, всё работает корректно. Иначе загрузитесь со старым ядром через GRUB.
Посмотрим, что теперь включено в образ initramfs
lsinitramfs /boot/initrd.img-$(uname -r)
5. Выбор алгоритма и уровня сжатия для initramfs
Чем выше уровень сжатия, тем дольше создаётся initramfs через утилиту update-initramfs, но размер файла уменьшается. Важно найти баланс между скоростью и размером файла. Некоторые алгоритмы уже неэффективны.
По умолчанию использует zstd алгоритм с 3 уровнем сжатия для системы Debian.
Открываем файл конфигурации initramfs.conf и листаем до параметра COMPRESS
nano /etc/initramfs-tools/initramfs.conf

Параметр COMPRESS определяет алгоритм сжатия (gzip, bzip2, lz4, lzma, lzop, xz, zstd).
Параметр COMPRESSLEVEL задаёт уровень сжатия для выбранного алгоритма (доступные уровни зависят от алгоритма).
Для баланса размера и скорости сборки рекомендую рассмотреть алгоритм zstd (уровни 3–9) или xz (уровни 1–6).
Например, выберем алгоритм сжатия xz с уровнем сжатия 4.
Указывает значение xz для параметра COMPRESS
COMPRESS=xz
Если не раскомментировать и не указать параметр COMPRESSLEVEL, то для алгоритма xz по умолчанию уровень сжатия будет равен 6
COMPRESSLEVEL=4

Сохраняем и закрываем файл.
Обновляем initramfs
update-initramfs -u
Проверим получившийся размер
ls -lh /boot/initrd.img*

Размер со сжатием по умолчанию zstd (уровень 3) составлял 24Мб, а с алгоритмом xz (уровень 4) составил 21Мб. Размер initramfs уменьшился примерно на 12.5%.