Оптимизация и уменьшение размера 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%.