При реализации проекта DistTest возникла необходимость собирать ядро linux из разных версий исходников. И первым решением было загружать готовые архивы исходников с kernel.org для каждой отдельной версии. Но вскоре стало понятно, что данный подход требует значительного дискового пространства: 0.5-1ГБ на каждую версию, которых в данный момент порядка 1000. А также данные подход позволяет собирать только именованные версии, но не версии соответствующие отдельным коммитам.
Для решения проблемы дискового пространства можно хранить несколько базовых версий и приводить их к необходимому виду с помощью патчей, но это приводит к значительному объёму I/O со случайным доступом, что выполняется медленно на HDD и приводит к износу SSD. Тот факт, что исходники необходимой версии требуются лишь временно, подсказывает использовать tmpfs. Но есть более эффективный подход в плане использования оперативной памяти — хранить в tmpfs только отличающиеся от уже имеющихся файлов, что позволяет сделать aufs.
Также отсутствие необходимости хранения всех версий на диске, позволяет получить рабочую копию с точностью до коммита используя git репозиторий исходников ядра linux.
Получается следующая разметка:
- repo — директория репозитория(.git)
- seed — директория имеющейся копии исходников близкой версии
- tmp — директория для хранения изменившихся файлов
- aufs — таргет монтирования aufs объединяющей вышеперечисленные директории
Например, сборка ядра версии v4.5 выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 |
mount none tmp -t tmpfs mount none aufs -t aufs -o br:tmp:seed=ro:repo=ro #tmp единственный rw слой cd aufs git reset --mixed v4.5 #переключиться на тэг v4.5 и перестроить индекс git reset --hard v4.5 #обновить все файл отличающиеся от v4.5 git clean -d -x -f #удалить лишние и игнорируемые файлы cp path/to/conf .config #осталось скопировать конфиг ядра make -j9 #и собрать его cp arch/x86/boot/bzImage path/to/store/bzImage cd .. umount aufs umount tmp |
В текущем виде у данного подхода остаётся один недостаток: необходимость выполнения монтирования от root’а, но это легко исправить добавлением записей о точках монтирования в /etc/fstab
1 2 |
none /home/user/tmp tmpfs noauto,user,exec 0 0 none /home/user/aufs aufs noauto,br:/home/user/tmp:/home/user/seed=ro:/home/user/repo=ro,user,exec 0 0 |
Конечно, фиксированность точек монтирования создаёт некоторые неудобства, но хотя бы бранчами aufs могут быть симлинки:
1 2 3 4 |
drwxrwxr-x 2 user user 4096 Mar 22 20:29 aufs lrwxrwxrwx 1 user user 12 Mar 23 21:39 repo -> /path/to/repo lrwxrwxrwx 1 user user 12 Mar 23 21:39 seed -> /path/to/seed drwxrwxrwx 2 user user 4096 Mar 23 21:39 tmp |