суббота, 14 мая 2011 г.

Автоматизация пересборки FreeBSD

1. Обновление исходников

csup-файл:
*default host=cvsup11.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs
*default tag=RELENG_8
*default delete use-rel-suffix
*default compress
src-all


Скрипт обновления исходников:
#!/bin/csh
set SYSTEMPOOL=selena
set TIMESTAMP=`date -u +%Y%m%d%H%M`
#-zfs snapshot ${SYSTEMPOOL}/usr/src@${TIMESTAMP}
cd /usr/src && chflags -R noschg *
csup /etc/sys-supfile
head -25 /usr/src/UPDATING
cd /usr/src/sys/`uname -m`/conf/ && diff `uname -i` GENERIC


2. Скрипт компиляции и сборки

#!/bin/csh
set LOG=/var/log/update_system_build.log
set DONE="System Build Failed."
set TIMESTAMP=`date -u +%Y%m%d%H%M`
cd /usr/src/ && chflags -R noschg * && make cleandir && make cleandir buildworld buildkernel && set DONE="System Build Success."
echo "${TIMESTAMP}: ${DONE}" >> ${LOG}
tail -n1 ${LOG}


3. Ручная работа

shutdown now
cd /usr/src/ && make installkernel installworld
mergemaster
shutdown -r now
shutdown now
cd /usr/src/ && make BATCH_DELETE_OLD_FILES=true delete-old delete-old-libs
shutdown -r now


*) mergemaster я обычно выполняю в диалоговом режиме, чтобы увидеть изменения в системных конфигурационных файлах. В повседневных пересборках, как правило, практически нет критичных изменений и можно смело нажимать [i] для принятия нового.

Update? Ports. Install!

Идея быстрого развёртывания рабочей конфигурации FreeBSD весьма далека от пользователей. Предлагаемый сценарий «карты» ПО даёт сравнительно менее затратный способ получения мультимедийного и рабочего окружения на основе графических сред Fluxbox, Xfce4 или GNOME-lite, а также даёт возможность привести поломанное программное окружение к определённому базовому состоянию.

Для управления ПО используется пакет утилит portupgrade (порт ports-mgmt/portupgrade), но можно использовать и portmaster (порт ports-mgmt/portmaster).
Сценарий карты ПО

#!/bin/csh
alias installport 'portinstall -p'
# Или из бинарных пакетов: alias installport 'env PKG_PATH=/store/pckgs64/All/ portinstall -yPP'
# Или с помощью portmaster: alias installport 'portmaster -gD' # --delete-build-only'
set LOG=/var/log/update_ports.log
set TIMESTAMP_BEGIN=`date -u +%Y%m%d%H%M`
echo "${TIMESTAMP_BEGIN}: begin installation ports" >> ${LOG}
installport sysutils/ataidle
installport sysutils/smartmontools
installport archivers/unrar
installport archivers/p7zip
installport ports-mgmt/pkg_cutleaves
installport ports-mgmt/pkg_tree
installport audio/faad
installport audio/faac
installport audio/sox
installport multimedia/libdvdcss
installport net/liveMedia
installport audio/libaacplus
installport multimedia/libquicktime
#-=Xorg=-
installport x11-drivers/xorg-drivers
installport x11-servers/xorg-server
installport x11/xorg-minimal
installport x11/setxkbmap
installport x11/xhost
installport x11/xset
installport x11/xinput
installport x11/xdpyinfo
installport graphics/mesa-demos
installport x11-fonts/dejavu
installport x11-fonts/urwfonts
installport x11-fonts/urwfonts-ttf
installport x11-fonts/isabella
installport x11-wm/fluxbox
installport x11-themes/cursor-jimmac-theme
installport x11-themes/gtk-murrina-fancy-clearlooks
installport misc/gnome-icon-theme
installport x11/xscreensaver
installport audio/grip
installport www/midori
installport x11/slim
installport math/galculator
#-installport net-im/gajim
installport ftp/gftp
installport textproc/meld
#-installport net-p2p/transmission-gtk2
installport net-p2p/deluge
installport audio/deadbeef
#-=printing=-
installport print/hplip
#-=GNOME App=-
installport archivers/file-roller
installport editors/gedit-plugins
installport graphics/eog-plugins
installport graphics/evince
installport multimedia/gnome-mplayer
installport sysutils/gnome-system-monitor
installport net/gnome-nettool
#-=other=-
installport mail/thunderbird
installport mail/thunderbird-i18n
set TIMESTAMP_END=`date -u +%Y%m%d%H%M`
echo "${TIMESTAMP_END}: end installation ports" >> ${LOG}


Инсталляция Xfce 4.6.2 (из отдельного дерева портов)

#!/bin/csh
alias installport 'portinstall -p'
#alias installport 'portmaster -gD' # --delete-build-only'
#-=Xfce4=-
#-installport deskutils/xfce4-notifyd # conflict with xfce4-notification-daemon
installport deskutils/xfce4-notification-daemon # conflict with xfce4-notifyd
#-installport audio/thunar-media-tags-plugin
installport archivers/thunar-archive-plugin
installport x11-wm/xfce4-session
installport x11-wm/xfce4
installport sysutils/xfce4-systemload-plugin
installport x11/xfce4-screenshooter-plugin
installport x11/xfce4-clipman-plugin
installport sysutils/xfce4-netload-plugin
installport misc/xfce4-weather-plugin
installport sysutils/xfburn


Восстановление конфигурации
#!/bin/csh
set CONFIG_DIR=/root/update/config
set LOCALBASE=/usr/local
set TIMESTAMP=`date -u +%Y%m%d%H%M`
cd ${LOCALBASE}/etc/ && mv -v slim.conf slim.conf.${TIMESTAMP} && cp -v ${CONFIG_DIR}/slim.conf ${LOCALBASE}/etc/
cd ${LOCALBASE}/etc/PolicyKit/ && mv -v PolicyKit.conf PolicyKit.conf.${TIMESTAMP} && cp -v ${CONFIG_DIR}/PolicyKit.conf ${LOCALBASE}/etc/PolicyKit/ && chmod 644 ${LOCALBASE}/etc/PolicyKit/PolicyKit.conf
cd ${LOCALBASE}/etc/xdg/xfce4/ && mv -v mount.rc mount.rc.${TIMESTAMP} && cp -v ${CONFIG_DIR}/mount.rc ${LOCALBASE}/etc/xdg/xfce4/ && chmod 644 ${LOCALBASE}/etc/xdg/xfce4/mount.rc


Важные замечания
  • Дерево портов должно быть своевременно обновлено.
  • Обращаю внимание на то, что по умолчанию настройки политик логина пользователей, монтирования сменных носителей от имени непривелегированных пользователей не определены. Поэтому нужно заранее подготовить файлы slim.conf, PolicyKit.conf и mount.rc, описанные в соответствующих статьях, и разместить их в защищённом от записи непривелегированным пользователем каталоге, например, в /root/update/config.
  • Для пакетного режима работы сценария важно наличие сформированного каталога /var/db/ports/ с заданными необходимыми опциями сборки портов. Иначе придётся настраивать установку одельных портов и их зависимостей в процессе исполнения сценария. ;)
  • Команды этого сценария подготавливают графическую среду для работы и развлечения, не уничтожая исходные файлы конфигурации.
Сценарий повседневного обновления ПО

#!/bin/csh
#-alias upgradeports 'pkgdb -vfFu && portsdb -u && portupgrade -aF && portupgrade -ap'
alias upgradeports 'portmaster -agD --delete-build-only'
alias listupdates 'portmaster -L | grep "New"'
set LOG=/var/log/update_ports.log
set DONE="Ports Updating Failed."
set SYSTEMPOOL=selena
set TIMESTAMP=`date -u +%Y%m%d%H%M`
zfs snapshot ${SYSTEMPOOL}/usr/local@${TIMESTAMP}
zfs snapshot ${SYSTEMPOOL}/var/db/pkg@${TIMESTAMP}
cd /usr/ports/ && chflags -R noschg * && portsnap fetch update
listupdates
head -17 /usr/ports/UPDATING
upgradeports && set DONE="Ports Updating Success."
echo "${TIMESTAMP}: ${DONE}" >> ${LOG}
tail -n1 ${LOG}