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

понедельник, 28 декабря 2009 г.

Использование aufs для сборки ядра

где-то в районе Россия, Омская область, город Омск
  Сегодня в голову пришла очередная гениальная идея. :) Впрочем, не от хорошей жизни. %) Поскольку у меня в eeePC стоит SSD вместо винта (дабы исключить движущиеся части и повысить мобильность), а ядро время от времени пересобирать надо, возник вопрос, как можно минимизировать использование накопителя во время сборки. Самый тривиальный и правильный, как ни странно, ответ — через tmpfs. А для того, чтобы в процессе можно было использовать предварительно развёрнутые на винт исподники ядра, нужно воспользоваться «объединяющей» ФС — unionfs или aufs.
  Вообще-то этот способ подойдёт, если в системе есть хотя бы гиг памяти. Но поскольку на подавляющем большинстве нетбуков, которые сейчас продаются, стоит этот самый гиг (а то и два), можно считать, что это условие выполняется по умолчанию. Идея заключается в следующем: распаковываем исподники в /usr/src/linux-source-<версия>, создаём «общий» сборочный каталог /usr/src/linux, создаём временную файловую систему в памяти и объединяем исходники ядра с временной файловой системой в режиме записи только для tmpfs, после чего собираем ядро.
  Естественно, здесь есть пара нюансов. Во-первых, по умолчанию, т.е. без указания параметров, tmpfs определяет размер файловой системы в половину доступной памяти. Впрочем, это не страшно, поскольку память под неё выделяется по мере необходимости. Во-вторых, во время сборки объём объектников и прочей временной хлабуды может достигать 300 метров. Это накладывает ограничение на нижний предел всего объёма имеющейся памяти и, соответственно, размера tmpfs. Поскольку у меня стоит 2 гига, я без зазрения совести выделил на неё 500 метров. Вернее, в целях оптимизации я монтирую в память /tmp и /var/tmp, выделив им по полгига места, ещё в fstab'е. Следовательно, мне осталось только создать каталог linux где-нибудь в /tmp, и задача выделения записываемой части фс решалась сама собой. После этого остаётся самое простое: из-под рута смонтировать всё в одну кучу и наслаждаться тихой и быстрой сборкой ядра со складированием мусора во временное хранилище в памяти.
  Думаю, расписывать всё по командам нет смысла, поскольку распаковать ядро и создать/переименовать каталоги — это тривиальные действия. Для примера могу привести собственную структуру. В /usr/src/linux-source-2.6.32-eeepc у меня лежат исподники — это read-only часть, которая физически располагается на SSD; в /tmp/linux пока пусто — это записываемая часть в tmpfs; в /usr/src/linux будет производиться собственно сборка — это целевой каталог для объединения (тоже пустой). После этого можно произнести заклинание (естественно, от рута):
mount -t aufs -o br=/tmp/linux:/usr/src/linux-source-2.6.32-eeepc none /usr/src/linux
после чего в /usr/src/linux получаем read-only образ дерева исходных кодов ядра, поверх которого можно записывать что угодно и сколько захочется, поскольку реальная запись будет вестись в /tmp/linux.
  Более подробно об aufs можно узнать здесь и здесь. Для работы с ней нужно поставить дополнительный модуль, если используется стандартное ядро, или собрать его из исходников, если используется самосборное. Исходники из репы Debian Squeeze для версии 2.6.30 нормально собираются под 2.6.32.

2 комментария:

Алексей комментирует...

сенсей ;)

Mwanga комментирует...

так сколько ж можно информацию собирать? пора и делиться. ;)

Отправить комментарий