Make Tmpfs

Материал из wiki.lissyara.su
Перейти к: навигация, поиск

Описание

Начиная с версии 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 (при выключении).

См. также:

Tmp в оперативной памяти

Ускорение компиляции с помощью ccache и distcc