Make Tmpfs
Описание
Начиная с версии 7.0 в FreeBSD присутствует файловая система TMPFS, позволяющая создавать в оперативной памяти диски изменяющегося размера. Этот функционал удобно использовать для сборки системы из исходников. Подобный подход позволяет существенно ускорить процесс сборки и экономить ресурс диска за счет существенного сокращения количества обращений к носителю. По факту, обращения происходят только при скидывания части данных в swap(что происходит редко и большими блоками). Файл подкачки должен быть достаточно большим, иначе процесс сборки завершится неудачей из-за нехватки памяти.
Сборка ядра/системы
1. Загружаем модуль tmpfs.ko
kldload tmpfs
2. Добавляем строку в /boot/loader.conf
tmpfs_load="YES"
3. Добавляем в файл /etc/fstab
obj /usr/obj tmpfs rw 0 0
4. Монтируем /usr/obj
mount /usr/obj
Теперь каталог /usr/obj находится в оперативной памяти. Его содержимое будет потеряно при перезагрузке, зато до этого момента запись в него осуществляется со скоростью записи в оперативную память. Можно пускать сборку ядра
cd /usr/src nice make -j4 kernel KERNCONF=MYKERNEL
и наблюдать рост размера каталога /usr/obj при помощи команды df.
Сборка портов
Не останавливаемся на достигнутом, организуем сборку программ из портов в оперативной памяти.
1. Для сборки из портов вручную выставляем переменную окружения WRKDIRPREFIX: добавляем в /etc/make.conf
WRKDIRPREFIX=/usr/obj
2. Для сборки при помощи portupgrade правим /usr/local/etc/pkgtools.conf
MAKE_ARGS = { '*' => 'WRKDIRPREFIX=/usr/obj', }
В MAKE_ARGS для portupgrade можно указать каталог в зависимости от порта, что полезно, если для сборки не хватает размера swap-а.
Попытка собрать что-то из портов теперь создаст копию файловой иерархии из /usr/ports в /usr/obj, которая будет существовать до перезагрузки или ручного удаления(команда make clean удаляет только каталог work и его содержимое). Для листинга пакетов собраных после перезагрузки теперь достаточно набрать
find /usr/obj/usr/ports
P.S. Вынесение каталога сборки из /usr/ports полезно также при использовании ZFS, что позволит задать параметр сжатия и минимальный размер блока данных для /usr/ports без замедления сборки.
--62.33.191.157 02:38, 23 февраля 2009 (MSK) 4ertus2
Эффективность
Для сборки thunderbird 17.0 требуется 1Гб оперативной памяти, а время компиляции осталось неизменным в рамках погрешности измерений (<10 сек). С другой стороны в это время дисковая подсистема остается абсолютно свободной для других операций. А время выполнения
make clean
и (если есть необходимость поиска не удаленных "хвостов")
find /usr/ports/ -name "work" -exec rm -rf {} \;
уменьшается почти до 0 (при выключении).