notby.NET Logo

Оптимизация и уменьшение размера initramfs

Перед загрузкой операционной системы Linux происходит загрузка образа initramfs (Initial RAM File System) в оперативную память. Этот образ содержит драйверы, утилиты и скрипты, необходимые для подключения корневого раздела и начальной загрузки операционной системы. Обычно initramfs включает универсальный набор модулей и драйверов, чтобы загружаться на любом компьютере.

Настройка и оптимизация initramfs показана на примере операционной системы Debian/Ubuntu.

Все действия выполняются от root пользователя или с его привилегиями через sudo

su -

Я покажу минимальную настройку для уменьшения размера initramfs, без глубокого погружения в конфигурацию.

1. Для чего уменьшать размер initramfs?

  1. Экономия места на диске. Изначально когда я ставил Debian, его установщик порекомендовал сделать раздел /boot размером 500Мб. Однажды, при обновлении пакетов я получил сообщение: Warning: More space needed in /boot than available: 137 MB > 124 MB, которое означает что недостаточно места в /boot разделе.
  2. Ускорение загрузки системы и снижение потребления оперативной памяти. На мощных компьютерах это не критично, но для VDS (Virtual Dedicated Server) идеально подходит.
  3. Ускорение обновления пакетов и ядра системы. Добавляются в initramfs только необходимые модули.

На мой взор, это основные причины. Если система не переносится на другие компьютеры и оборудование не меняется, рекомендую оптимизировать initramfs.

Проверим размер образов initramfs

ls -lh /boot/initrd.img*
В консоли Debian выполнена команда “ls -lh /boot/initrd.img*”. Выведен размер initramfs с настройкой MODULES=most, размер составил примерно 104M.

На моей системе размер составляет 104 Мбайта.

Посмотрим, что включено в образ initramfs

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

2. Выбор загружаемых модулей в initramfs

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

Открываем файл конфигурации initramfs.conf и ищем параметр MODULES

nano /etc/initramfs-tools/initramfs.conf
В текстовой редакторе nano открыт файл /etc/initramfs-tools/initramfs.conf, внутри файла показаны доступные настройки параметра MODULES, а сам параметр установлен в значение most.

Параметр MODULES может иметь следующие значения:

  • most — универсальный набор модулей для файловых систем и накопителей;
  • dep — только необходимые модули (утилита автоматически попробует угадать их);
  • netboot — только модули для загрузки по сети;
  • list — загрузка модулей из указанного списка.

У меня параметр MODULES равен most, что означает использовать универсальный набор, все возможные модули.

2.1. Параметр MODULES равен dep

В большинстве случаев достаточно установить dep и утилита update-initramfs автоматически найдет необходимые модули для данного компьютера и добавит их. У меня не было случаев чтобы она не добавляла необходимые драйвера для загрузки системы.

Указываем значение dep для параметра MODULES

MODULES=dep
В текстовой редакторе nano открыт файл /etc/initramfs-tools/initramfs.conf, внутри файла показаны доступные настройки параметра 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*
В консоли Debian выполнена команда “ls -lh /boot/initrd.img*”. Выведен размер initramfs с настройкой MODULES=dep, размер составил примерно 24M.

Как можно заменить, 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
В текстовой редакторе nano открыт файл /etc/initramfs-tools/initramfs.conf, внутри файла показаны доступные настройки параметра COMPRESS и COMPRESSLEVEL. Параметр COMPRESS равен zstd, а параметр COMPRESSLEVEL закомментирован.

Параметр 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
В текстовой редакторе nano открыт файл /etc/initramfs-tools/initramfs.conf, внутри файла показаны доступные настройки параметра COMPRESS и COMPRESSLEVEL. Параметр COMPRESS равен xz, а параметр COMPRESSLEVEL равен 4.

Сохраняем и закрываем файл.

Обновляем initramfs

update-initramfs -u

Проверим получившийся размер

ls -lh /boot/initrd.img*
В консоли Debian выполнена команда “ls -lh /boot/initrd.img*”. Выведен размер initramfs с настройкой MODULES=dep и алгоритмом сжатия xz (уровень 4), размер составил примерно 21M.

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