Компактное хранение исходного кода

kernel-zip-src

При реализации проекта 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 выглядит следующим образом:

В текущем виде у данного подхода остаётся один недостаток: необходимость выполнения монтирования от root’а, но это легко исправить добавлением записей о точках монтирования в /etc/fstab

Конечно, фиксированность точек монтирования создаёт некоторые неудобства, но хотя бы бранчами aufs могут быть симлинки:

Yuriy Nazarov on GithubYuriy Nazarov on Twitter
Yuriy Nazarov
Software engineer
Люблю machine learning