Debian Linux это один из самых популярных современных дистрибутивов, являющийся кроме того "родителем" целого ряда других дистрибутивов, в частности Ubuntu, Linux Mint и проч. Популярность Debian завоевал благодаря своей дружественности к пользователю.
Однако у этой дружественности есть и ряд минусов: попытка "угодить всем" привела к тому, что далеко не все элементы системы с конфигурацией по умолчанию работают оптимально. Например образ initramfs занимает на диске почти десять мегабайт и содержит в себе практически все доступные модули, что конечно же в условиях конкретной задачи является излишним.
Далее будет предпринята попытка максимально подробно разобрать способ генерации initramfs в Debian и показать как можно его оптимизировать.
Итак, что же такое initramfs? Согласно википедии это "временная файловая система, использующаяся ядром при начальной загрузке". Проще говоря загрузчик загружает в память ядро и образ initramfs, и начальная загрузка системы происходит из этого образа. Соответственно чем меньше лишнего в этом образе - тем быстрее будет загружаться система и тем меньше она будет требовать памяти на начальном этапе.
Прежде чем продолжить нужно сделать два уточнения. Первое: все описанные здесь инструкции справедливы не только для Debian, но и для большинства его "потомков". Второе: да, конечно, если пересобрать ядро руками то можно вообще отказаться от initramfs, но не все и не всегда хотят при каждом обновлении заново пересобирать ядро. Поэтому лучше просто оптимизировать initramfs штатными средствами дистрибутива.
Образ initramfs создаётся утилитой update-initramfs. Пронаблюдать как создаётся образ для текущего ядра с настройками по умолчанию можно запустив создание этого образа командой:
update-initramfs -v -c -k `uname -r`
Можно заметить что сначала добавляются модули, потом минимально-необходимые базовые утилиты и потом выполняются "хуки" (hooks) - модули для update-initramfs, которые добавляют в образ различные дополнительные функции. Например хук dmsetup добавляют поддержку функционала Device Mapper, а хук fuse_utils - поддержку файловых систем, доступных через fuse.
Следует отметить что если в образе initramfs отсутствует какой-то модуль то он будет загружен позже, уже с жёсткого диска (главное чтобы набор модулей в образе позволял ядру добраться до этого жёсткого диска).
Основные настройки update-initramfs расположены в директории /etc/initramfs-tools. Начнём со списка загружаемых модулей. Чтобы загружать только нужные изменим значение параметра MODULES в файле initramfs.conf:
#MODULES=most MODULES=list
Дальше нам нужно создать список необходимых модулей. Самое просто решение тут - просто взять список уже загруженых модулей и использовать его. Список модулей хранится в файле modules. Создадим его, получив список загруженных модулей через lsmod:
lsmod | tail -n +2 | sort | awk '{print $1;}' > /etc/initramfs-tools/modules
Затем пересоздадим образ initramfs, предварительно удалив старый:
update-initramfs -v -d -k `uname -r` && update-initramfs -v -c -k `uname -r`
Желающие могут сравнить размеры файлов /boot/initrd.img-* до и после этой команды и, так сказать, "почувствовать разницу".
С модулями вобщем-то разобрались. Переходим к хукам. Системные хуки хранятся в директории /usr/share/initramfs-tools/hooks, пользователь (вернее администратор системы) может определять свои хуки в директории /etc/initramfs-tools/hooks (по умолчанию в ней пусто).
Чтобы понять какой хук за что отвечает проще всего выяснить какому пакету он принадлежит и читать документацию на этот пакет. Получить список пакетов-владельцев хуков можно командой:
find /usr/share/initramfs-tools/hooks/ -type f -exec dpkg -S '{}' \;
К сожалению при генерации образа initramfs нельзя указать список хуков, которые надо пропустить. Поэтому единственным способом убрать лишнее из initramfs является удаление пакета, содержащего не нужный хук. Ну или удаление файла хука (однако следует помнить что в этом случае при обновлении системы он будет создан заново).
Хуки принадлежащие initramfs-tools и udev лучше не трогать. С остальными нужно разбираться по ситуации. Например если речь о сервере то вряд ли там используются какие либо файловые системы, монтируемые через fuse, а значит хуки fuse_utils И ntfs_3g явно лишние. Освободить initramfs от них можно следующим образом:
apt-get purge fuse-utils ntfs-3g && apt-get autoremove --purge && update-initramfs -v -c -k `uname -r`
Если речь идёт о рабочей станции то чаще всего поддержка Drive Mapper бывает ненужна. Как уже говорилось выше - за неё отвечает хук dmsetup, являющийся частью одноимённого пакета. В этом случае убрать его можно командой:
apt-get purge dmsetup && apt-get autoremove --purge && update-initramfs -v -c -k `uname -r`
Отдельного внимания заслуживает вопрос явной пересборки образа после внесения каких либо изменений в его конфигурацию, ведь после установки/удаления пакетов, меняющих эту конфигурацию dpkg сам вызывает update-initramfs для обновления образа. Дело в том, что dpkg запускает update-initramfs командой:
update-initramfs -u -k all
Здесь опция "-k" указывает на ядро ("all" - означает все ядра, имеющиеся в системе), а "-u" - указывает а необходимость обновить (но не пересоздать с нуля!) образ initramfs.
При обновлении образа может остаться какой-то не нужный мусор, поэтому лучше всё-таки собирать образ с нуля, что и делается командой:
update-initramfs -c -k all
То есть вместо "-u" указывается ключ "-c", указывающий на необходимость пересоздания образа с нуля. Для наглядности так же можно указывать ключ "-v" - в этом случае по ходу создания образа будет показана информация обо всех предпринимаемых действиях.
В конечном итоге если вдумчиво подойти к описанному выше - можно уменьшить размер сжатого образа в два-четыре раза, что позволит ускорить загрузку на несколько десятков секунд.
Приятной работы!
Kirill Zabarniuk 2008-11-17 14:12:31 (#)
MODULES=list
список модулей лучше получить, загрузившись с параметром ядру init=/bin/sh. Тогда увидите действительно минимально необходимое для загрузки кол-во модулей. Плюс потом можно еще прошерстить выхлоп lsmod вручную.
upd. А, тут написано "самое простое решение..." - тогда да, это решение самое простое.