Показаны сообщения с ярлыком FreeBSD. Показать все сообщения
Показаны сообщения с ярлыком FreeBSD. Показать все сообщения

понедельник, 24 декабря 2012 г.

Метод задействования tmpfs c ZFS во FreeBSD

Пару слов о tmpfs
Это файловая система в виртуальной памяти, которая, как известно, при необходимости задействует SWAP. Отличие её от RAM-диска в том, что она не резервирует пространство в оперативной памяти фиксированного размера и может использовать пространство свопинга при превышении некоего количества записанных на неё данных и/или по требованию механизма свопинга операционной системы. Это свойство часто используется для ускорения приложений, использующих временные файлы, так как доступ к оперативной памяти намного быстрее, чем к диску. Файлы, записываемые в tmpfs, после перезагрузки не сохраняются.
Метод
1. Пишем в /boot/loader.conf следующую строчку:
tmpfs_load="YES"
Если опция TMPFS не включена в конфигурацию ядра, в текущем сеансе загружаем соответствующий модуль ядра:
% kldload tmpfs
2. Пишем в /etc/fstab следующую строчку:
tmpfs /tmp tmpfs rw,mode=1777 0 0
3. В консоли выполняем серию команд для подготовки SWAP к новому режиму использования (удаляем старую ФС, если она есть, и существующий SWAP неподходящего размера; создаём новые каталог и SWAP подходящего размера):

% zfs destroy -f poolname/tmp ; mkdir -p /tmp
% swapoff /dev/zvol/poolname/swap
% zfs destroy poolname/swap
% zfs create -V 1500M poolname/swap
% zfs set org.freebsd:swap=on poolname/swap
% zfs set compress=lzjb poolname/swap
% zfs set checksum=on poolname/swap
% swapon /dev/zvol/poolname/swap
% swapinfo
Device          1M-blocks     Used    Avail Capacity
/dev/zvol/poolname/swap      1500        0     1500     0%
% mount /tmp
% df /tmp
Filesystem    Size    Used   Avail Capacity  Mounted on
tmpfs         7.1G     10M    7.1G     0%    /tmp
Источники информации

вторник, 1 мая 2012 г.

FreeBSD: обновление системы из исходников

Пересборка системы FreeBSD из исходников состоит из следующих этапов:
  • загрузка файлов с исходными кодами
  • редактирование конфигурационных файлов
  • непосредственная компиляция и сборка системы из исходников
  • инсталляция собранных ядра и системного окружения
  • слияние новых настроечных файлов системы с существующими
  • перезагрузка для вступления в силу всех изменений


Рассмотрим эти этапы подробнее.

Конфигурационные файлы

В системе должны быть три файла, влияющие на этапы загрузки (обновления), компиляции и сборки системы. Это файлы: /etc/make.conf, /etc/src.conf и /etc/sys-supfile. При этом файлы src.conf и sys-supfile необязательно присутствуют в системе, но их можно и нужно создать на основе примеров.

Примерный файл /etc/make.conf:
#2012-04-22
KERNCONF=ROXY
WRKDIRPREFIX=/usr/obj
# ln -s /store/distfiles /usr/ports/distfiles
#-DISTDIR=/store/distfiles # zfs set mountpoint=/usr/ports/distfiles store/distfiles
PACKAGES=/store/pckgs64 # ln -s /store/pckgs64 /usr/ports/packages
# see /usr/share/examples/etc/make.conf
MAKE_JOBS_NUMBER=5
CC=clang
CXX=clang++
CPP=clang-cpp
# Don't die on warnings
NO_WERROR=
WERROR=
# Don't forget this when using Jails!
NO_FSCHG=
#-WITH_NEW_XORG=true
LOADER_ZFS_SUPPORT=true
LOCALIZED_LANG=ru
WITH_LCD_FILTERING=true
WITH_XFT=true
WITHOUT_TTF_BYTECODE_ENABLED=false
WITH_TTF_BYTECODE_ENABLED=true
WITH_MSWINDOWS_LICENSE=true
WITH_VPX=true
WITH_A4SIZE=true
WITHOUT_DEBUG=true
WITHOUT_NOUVEAU=true
WITHOUT_ALSA=true
WITHOUT_MYSQL=true
WITHOUT_NAUTILUS=true
# Keep ruby 1.9 as default version.
RUBY_DEFAULT_VER=1.9
# added by use.perl 2012-02-16 21:44:23
PERL_VERSION=5.12.4

Как не трудно заметить, опции файла make.conf влияют на компиляцию не только операционной системы, но и прикладного программного обеспечения, устанавливаемого из коллекции портов. Но вот опции компиляции ПО из коллекции портов не влияют на сборку системы.

Примерный файл /etc/src.conf (дополнительно см. man src.conf):
WITHOUT_AMD=true
WITHOUT_ASSERT_DEBUG=true
WITHOUT_ATM=true
WITHOUT_BIND_DNSSEC=true
WITHOUT_BIND_ETC=true
WITHOUT_BIND_LIBS_LWRES=true
WITHOUT_BIND_MTREE=true
WITHOUT_BIND_NAMED=true
WITHOUT_FLOPPY=true
WITHOUT_FREEBSD_UPDATE=true
WITHOUT_GAMES=true
WITHOUT_GDB=true
WITHOUT_HTML=true
WITH_IDEA=true
WITHOUT_IPFILTER=true
WITHOUT_IPX=true
WITHOUT_IPX_SUPPORT=true
WITHOUT_LIB32=true
WITHOUT_LPR=true
WITHOUT_NDIS=true
WITHOUT_PROFILE=true
WITHOUT_RCS=true
WITHOUT_SENDMAIL=true
WITHOUT_SYSINSTALL=true
WITHOUT_TELNET=true

Мне нужен не весь BIND, а только некоторые утилиты из него. MTA Sendmail и отладчик GDB на обычной рабочей станции не нужны. Также не нужны устаревшие сетевые протоколы ATM и IPX.

Примерный файл /etc/sys-supfile:

*default host=cvsup10.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs
*default tag=RELENG_9
*default delete use-rel-suffix
*default compress
src-all

То есть при использовании этого файла будут загружены исходные коды FreeBSD 9-STABLE.


Процесс обновления
(непосредственно процесс обновления по шагам расписан позднее, здесь даются лишь базовые понятия)

Обновление исходников системы производится системной утилитой csup примерно так:

% csup /etc/sys-supfile

Необходимое и достаточное условие: активное прямое Интернет-соединение!
(здесь и далее символ "%" говорит о том, что используется командная оболочка /bin/tcsh с правами рута; символ ">" говорит о том, что используется командная оболочка /bin/tcsh с правами пользователя.)

Потом необходимо сделать копию файла настроек ядра GENERIC:

% cd /sys/amd64/conf/ && cp GENERIC ROXY

и отредактировать эту копию. Проследите, чтобы имя файла, в данном случае /sys/amd64/conf/ROXY, совпало с именем ядра переменной KERNCONF в файле make.conf.

Файл /sys/amd64/conf/ROXY здесь не весь(!!!), а лишь несколько строчек, в которых я что-то меняю:
# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.568.2.11 2012/04/02 18:13:29 jkim Exp $
...
cpu HAMMER
ident ROXY
...
#-makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
...
Полная инструкция сборки всего системного окружения и ядра FreeBSD
  1. Удаляем бинарники от предыдущей компиляции:

    % cd /usr/obj/ && chflags -R noschg * && rm -rf *
  2. Редактируем файл /etc/sys-supfile для обновления исходников до нужной версии системы:

    % ee /etc/sys-supfile
  3. Синхронизируем дерево исходного кода с серверным:

    % cd /usr/src/ && chflags -R noschg * && csup /etc/sys-supfile
  4. На этом шаге делаем копию конфига ядра:

    % cd /sys/amd64/conf/ && cp GENERIC ROXY
  5. Редактируем конфиг будущего ядра:

    % ee /sys/amd64/conf/ROXY
  6. На этом этапе редактируем make.conf и src.conf, если нужно:

    % ee /etc/make.conf
    и

    % ee /etc/src.conf
  7. Очищаем исходники:

    % cd /usr/src/ && chflags -R noschg * && make cleandir
  8. Собираем Мир и Ядро:

    % cd /usr/src/ && make buildworld buildkernel
  9. Инсталлируем Ядро и Мир в однопользовательском режиме, обновляем файлы конфигурации системы:

    % shutdown now
    # cd /usr/src/ && make installkernel installworld
    # mergemaster
    # shutdown -r now
  10. В одних случаях может быть достаточно нажимать клавишу [i] на вопросы утилиты mergemaster — инсталлировать новые файлы конфигурации. Но сначала нужно проверить, какой файл обрабатывается, прежде чем что-то сделать с ним: заменить старую версию файла новым [i], оставить старый [d], посмотреть изменения [v] или произвести слияние нового со старым [m], сделать ссылку [l] (бывает и такое). В завершение процесса на вопрос об удалении временного каталога можно нажать клавишу [y].
  11. Перезагружаемся:

    # shutdown -r now
  12. Загружаемся как обычно, но затем снова переходим в однопользовательском режим и удаляем мусор от предыдущей инсталляции:

    % shutdown now
    # cd /usr/src/ && make BATCH_DELETE_OLD_FILES=true delete-old delete-old-libs
    # shutdown -r now


Вот и всё.

воскресенье, 11 сентября 2011 г.

Xfce 4.8.2: завершение работы и рестарт

Хм, продолжаем сношаться с чёткой системой костылей и подпорок, придуманной нашими пернатыми друзьями под чутким руководстом коммерческих компаний и FSF во главе с товарищем Штольманом.

Чтобы иметь возможность перезагружать компьютер или завершать работу не из командной строки, а из самой среды Xfce 4.8.2, необходимо сделать доступными кнопки диалога "Выйти" — "Перезагрузить" и "Выключить", соответственно.

Решение проблемы описано здесь: перейти к обсуждению проблемы.

  • Создаём файл:
  • % touch /usr/local/etc/polkit-1/localauthority/50-local.d/org.freedesktop.consolekit.pkla
  • Смотрим сообщение из файла /usr/ports/x11-wm/xfce4-session/pkg-message и редактируем созданный файл в соответствии пожеланиями линуксятников PUTTY-пользователям FreeBSD:
  • [Restart]
    Identity=unix-group:operator
    Action=org.freedesktop.consolekit.system.restart
    ResultAny=yes
    ResultInactive=yes
    ResultActive=yes
    
    [Shutdown]
    Identity=unix-group:operator
    Action=org.freedesktop.consolekit.system.stop
    ResultAny=yes
    ResultInactive=yes
    ResultActive=yes
(Пользователь, имеющий право перезагружать и выключать компьютер в Unix, как правило, входит в группу operator).

После этого диалог выхода Xfce приобретает законченный вид:

понедельник, 6 июня 2011 г.

ZFSv28 портирована в ветку FreeBSD 8-STABLE

Файловая система ZFSv28 портирована в ветку FreeBSD 8-STABLE

Дождались! :)

Вкратце:
  • добавлен уровень RAIDZ3 — RAID-5 с тройной чётностью
  • дедупликация блоков данных на уровне файловой системы (экономит место на носителях при наличии одинаковых данных в различных файлах)
  • сравнение снапшотов командой zfs diff
  • получение независимых клонов пулов командой zpool split для переноса на другие машины
  • cчётчик ссылок на снапшот для защиты снапшотов от ошибочного удаления
  • восстановление FAULTED-пула путём отматывания последних транзакций записи (ранее практиковался ручной метод восстановления)
  • другие улучшения

суббота, 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}

пятница, 18 марта 2011 г.

AMD 785G с Phenom II X4 810

Было

% glxgears
2014 frames in 5.0 seconds = 402.682 FPS
2101 frames in 5.0 seconds = 420.139 FPS
2102 frames in 5.0 seconds = 420.367 FPS
2101 frames in 5.0 seconds = 420.153 FPS
2107 frames in 5.0 seconds = 421.336 FPS
2109 frames in 5.0 seconds = 421.762 FPS

Процессор при этом нагружен на 35-45%, причём — все четыре ядра! Это называется софтверным ускорением. :))

Включаем аппаратное 3D-ускорение на Radeon HD

1) Добавляем строчку игнорирования NOUVEAU, чтобы он не мешал графическому окружению:
% echo 'WITHOUT_NOUVEAU=true' >> /etc/make.conf



2) Пересобираем graphics/libdrm, graphics/libGL*, graphics/libglut:
% portupgrade -fp graphics/libdrm && portupgrade -fp graphics/libGL && portupgrade -fp graphics/libGLU && portupgrade -fp graphics/libglut graphics/mesa-demos

или, если есть время, так:
% portupgrade -fpr graphics/libdrm



3) Перезагружаемся и смотрим на результат:
% glxinfo | grep render
IRQ's not enabled, falling back to busy waits: 2 0
direct rendering: Yes
OpenGL renderer string: Mesa DRI R600 (RS880 9710) 20090101 TCL

% glxinfo | grep glx
IRQ's not enabled, falling back to busy waits: 2 0
server glx vendor string: SGI
server glx version string: 1.2
server glx extensions:
client glx vendor string: Mesa Project and SGI
client glx version string: 1.4
client glx extensions:

% glxgears
IRQ's not enabled, falling back to busy waits: 2 0
9033 frames in 5.0 seconds = 1806.251 FPS
8878 frames in 5.0 seconds = 1775.427 FPS
8993 frames in 5.0 seconds = 1798.448 FPS
8999 frames in 5.0 seconds = 1799.691 FPS
9056 frames in 5.0 seconds = 1811.054 FPS
9000 frames in 5.0 seconds = 1799.960 FPS
9031 frames in 5.0 seconds = 1806.070 FPS
8957 frames in 5.0 seconds = 1791.309 FPS
^C

% uname -rsm
FreeBSD 8.2-STABLE amd64

% pkg_info -Ex video-ati
xf86-video-ati-6.14.0_1

% pkg_info -Ex dri
dri-7.6.1,2
dri2proto-2.3
xorg-drivers-7.5.1

% pkg_info -Ex mesa
mesa-demos-7.6.1

% pkg_info -Ex libGL
libGL-7.6.1
libGLU-7.6.1


xorg.conf

Section "ServerLayout"
Identifier "X.org Configured"
Screen 0 "Screen0" 0 0
InputDevice "Mouse0" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
ModulePath "/usr/local/lib/xorg/modules"
FontPath "/usr/local/lib/X11/fonts/misc/"
FontPath "/usr/local/lib/X11/fonts/TTF/"
FontPath "/usr/local/lib/X11/fonts/OTF"
FontPath "/usr/local/lib/X11/fonts/Type1/"
FontPath "/usr/local/lib/X11/fonts/100dpi/"
FontPath "/usr/local/lib/X11/fonts/75dpi/"
FontPath "/usr/local/lib/X11/fonts/dejavu/"
EndSection

Section "Module"
#-Load "glx"
Load "extmod"
Load "record"
Load "dbe"
Load "dri"
Load "dri2"
Load "freetype"
EndSection

Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
Option "XkbLayout" "us,ru"
Option "XkbVariant" ",winkeys"
Option "XkbOptions" "grp:caps_toggle,grp_led:caps,compose:ralt"
EndSection

Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/sysmouse"
Option "ZAxisMapping" "4 5 6 7"
EndSection

Section "ServerFlags"
Option "AutoAddDevices" "false"
Option "AllowEmptyInput" "off"
Option "AllowMouseOpenFail" "true"
Option "IgnoreABI" "on"
Option "AIGLX" "true"
EndSection

Section "Monitor"
#DisplaySize 540 350 # mm
Identifier "Monitor0"
VendorName "HWP"
ModelName "HP LP2475w"
HorizSync 30.0 - 94.0
VertRefresh 48.0 - 85.0
Option "DPMS"
EndSection

Section "Modes"
Identifier "Mode0"
EndSection

Section "Device"
Option "int10" "on"
Option "BusType" "PCIE"
Option "RenderAccel" "on"
Option "AccelMethod" "exa"
Option "DynamicPM" "on"
Option "DRI" "on"
Identifier "Card0"
#Driver "vesa"
Driver "ati"
VendorName "ATI Technologies Inc"
BoardName "RS880 [Radeon HD 4200]"
#-BusID "PCI:1:5:0"
EndSection

Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
SubSection "Display"
Viewport 0 0
Depth 24
#Modes "1680x1050"
Modes "1920x1200"
EndSubSection
EndSection

Section "DRI"
Mode 0666
EndSection

Section "Extensions"
Option "Composite" "true"
Option "DAMAGE" "true"
Option "RENDER" "true"
EndSection

среда, 3 марта 2010 г.

PF для рабочей станции в локальной сети

Типичный конфиг (файл /etc/pf.conf) для пакетного фильтра рабочей станции:

#PF:2010-03-03
#-------------------
#1/Macros
# Сетевой интерфейс
ext_if="net0"
# Разрешенные типы icmp сообщений
allowed_icmp_types="{ echoreq, unreach }"
# Разрешённые сервисы
# 1. разрешить запросы к серверу NFS и RPCBIND только из локальной сети
# 2. обеспечить запуск с флагами mountd -p 883, rpc.lockd -p 884, rpc.statd -p 885 в rc.conf
# 3. выделенные порты для torrent и http/https/ssh-серверов доступны всем
allowed_lan_tcp_services="{ ssh, www, http, https, ntp, nfsd, rpcbind, 883, 884, 885, 6881:6991, 8080 }"
allowed_lan_udp_services="{ ntp, nfsd, rpcbind, 883, 884, 885, 6881:6991 }"
allowed_wan_tcp_services="{ ssh, www, 6881:6991, 8080, 8081 }"
allowed_wan_udp_services="{ ntp, 5501, 6881:6991 }"
#-------------------
#2/Tables
#-------------------
#3/Options
# ведение лога
#--set loginterface $ext_if
# тем, кто лезет туда, куда не нужно, - бить по рукам
set block-policy drop
# на интерфейсах петли пакеты не фильтровать
set skip on { lo }
# укороченный таймаут для состояния установленного tcp соединения
set timeout { frag 10, tcp.established 24000, icmp.first 10, icmp.error 5 }
#-------------------
#4/Scrub
# Нормализовать все входящие пакеты
scrub in all
#-scrub on $ext_if random-id max-mss 1452 reassemble tcp fragment reassemble
#-------------------
#5/Queueing
#-------------------
#6/Translations
# Перенаправить tcp трафик с порта 80 на порт 8080 для пользовательского Web-сервера
rdr proto tcp from any to any port http -> self port 8080
#-------------------
#7/Filter Rules
# Антиспуффинг
#-antispoof for $ext_if
# Блокировать всё, что не разрешено
block all
#-------------------
# Разрешить входящий ICMP (ping)
pass inet proto icmp all icmp-type $allowed_icmp_types
# Разрешить трафик IGMP для IP-TV
pass quick on $ext_if inet proto igmp from any to any allow-opts
# Разрешающий доступ откуда угодно (ограниченные службы)
pass in quick on $ext_if proto tcp to port $allowed_wan_tcp_services
pass in quick on $ext_if proto udp to port $allowed_wan_udp_services
# Разрешающий доступ из локальной сети (ограниченные службы)
pass in quick on $ext_if proto tcp from $ext_if:network to port $allowed_lan_tcp_services
pass in quick on $ext_if proto udp from $ext_if:network to port $allowed_lan_udp_services
# Разрешить исходящий трафик
pass out all


Проверка синтаксиса


% pfctl -nf /etc/pf.conf


Запуск в работу


% echo 'pf_enable="YES"' >> /etc/rc.conf
% echo 'pf_rules="/etc/pf.conf"' >> /etc/rc.conf
% pfctl -ef /etc/pf.conf


Проверка действующих правил и прочей статистики


% pfctl -sa


Выключение


% pfctl -d


Примечание касательно трансляции IP-TV

При запуске VLC, например, с URL-адресом такого вида udp://@239.1.1.28:5501 воспроизведение начнётся не сразу, а спустя примерно 45 секунд с момента нажатия на кнопку PLAY. Однако переключение на другие каналы будет происходить практически мгновенно.

понедельник, 4 января 2010 г.

J2ME на FreeBSD 8.0 [amd64]

Вчера разбирался с J2ME на FreeBSD 8.0 [amd64] чисто из спортивного интереса.

В портах есть Sun WTK 2.2. Он ставится, но не работает под 64-битной Sun JDK 1.6: при запуске эмулятора телефона в KToolbar выводится ошибка работы графической библиотеки.

Проблему решил следующим образом.
Временно снёс нативный JDK1.6. Запустил линуксулатор (эмулятор Linux 2.6.16 + linux_base-f10); поставил 32-битный java/linux-sun-jdk16; установил java/sun-wtk с небольшой шлифовкой его конфигов (переименовал каталог wtklib/FreeBSD в wtklib/Linux); заново установил нативный JDK (64-битный). Оба JDK сосуществуют без проблем — при необходимости нужная JVM выбирается через панель управления настройками javaws. WTK 2.2 работает с собственными настройками: пути к линуксовой JVM автоматически прописаны в скрипты запуска его утилит при инсталляции.

Sun JavaME SDK 2.5.2 похожим образом запустить не удалось — KToolbar при запуске эмулятора пишет об ошибке в распределении памяти shm.

суббота, 3 октября 2009 г.

makeinfo: not found

При очередном обновлении портов заметил странную вещь:
% portupgrade -ap
---> Upgrading 'libtool-2.2.6a' to 'libtool-2.2.6a_1' (devel/libtool22)
---> Building '/usr/ports/devel/libtool22'
===> Cleaning for libtool-2.2.6a_1
===> Extracting for libtool-2.2.6a_1
=> MD5 Checksum OK for libtool-2.2.6a.tar.gz.
=> SHA256 Checksum OK for libtool-2.2.6a.tar.gz.
===> Patching for libtool-2.2.6a_1
===> Applying FreeBSD patches for libtool-2.2.6a_1
/usr/bin/sed -i.bak -e 's|sed gsed|sed|g' /usr/obj/usr/ports/devel/libtool22/work/libtool-2.2.6/configure
===> Configuring for libtool-2.2.6a_1
## ------------------------- ##
## Configuring libtool 2.2.6 ##
## ------------------------- ##

checking for a BSD-compatible install... /usr/bin/install -c -o root -g wheel
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... libltdl/config/install-sh -c -d
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether subdir libobjs are useable... yes
.....
make all-recursive
test -f doc/.dirstamp || make doc/.dirstamp
restore=: && backupdir=".am$$" && am__cwd=`pwd` && cd . && rm -rf $backupdir && mkdir $backupdir && if (makeinfo --no-split --version) >/dev/null 2>&1; then for f in ./doc/libtool.info ./doc/libtool.info-[0-9] ./doc/libtool.info-[0-9][0-9] ./doc/libtool.i[0-9] ./doc/libtool.i[0-9][0-9]; do if test -f $f; then mv $f $backupdir; restore=mv; else :; fi; done; else :; fi && cd "$am__cwd"; if makeinfo --no-split -I doc -I ./doc -o ./doc/libtool.info ./doc/libtool.texi; then rc=0; cd .; else rc=$?; cd . && $restore $backupdir/* `echo "././doc/libtool.info" | sed 's|[^/]*$||'`; fi; rm -rf $backupdir; exit $rc
makeinfo: not found
*** Error code 127

Stop in /usr/obj/usr/ports/devel/libtool22/work/libtool-2.2.6.
*** Error code 1

Stop in /usr/obj/usr/ports/devel/libtool22/work/libtool-2.2.6.
*** Error code 1

Stop in /usr/obj/usr/ports/devel/libtool22/work/libtool-2.2.6.
*** Error code 1

Stop in /usr/ports/devel/libtool22.
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portupgrade20091003-1547-1j96bj1-0 env UPGRADE_TOOL=portupgrade UPGRADE_PORT=libtool-2.2.6a UPGRADE_PORT_VER=2.2.6a make DEPENDS_TARGET=package
** Fix the problem and try again.
** Listing the failed packages (-:ignored / *:skipped / !:failed)
! devel/libtool22 (libtool-2.2.6a) (unknown build error)


Оказывается, новый мир был собран с опцией WITHOUT_INFO=true в файле /etc/make.conf, а при очередной чистке устаревших библиотек система лишилась доступа к info-файлам установленных приложений.

Решение этой проблемы найдено очень быстро:
1) Убираем вредную строчку из /etc/make.conf (и из /etc/src.conf, если она там была);
2) Собираем и устанавливаем недостающие библиотеки мира
% cd /usr/src/gnu/usr.bin/texinfo/
% make && make depend && make install
===> libtxi (all)
===> makeinfo (all)
===> info (all)
===> infokey (all)
===> install-info (all)
===> texindex (all)
===> doc (all)
===> libtxi (depend)
===> makeinfo (depend)
===> info (depend)
===> infokey (depend)
===> install-info (depend)
===> texindex (depend)
===> doc (depend)
===> libtxi (install)
===> makeinfo (install)
===> info (install)
===> infokey (install)
===> install-info (install)
===> texindex (install)
===> doc (install)
% rehash


После этого апгред порта проходит нормально.

суббота, 5 сентября 2009 г.

FreeBSD: Automount

Известная проблема непривелегированного использования съёмных носителей с неродными файловыми системами с использованиеванием таблиц перекодирования символов (mount_msdosfs: msdosfs_iconv: Operation not permitted) под FreeBSD может быть решена, собственно, самой системой.

Как это есть


Обычный сценарий использования съёмного носителя под операционными системами класса Unix заключается в следующем:
  1. Подсоединить устройство с носителем к внешнему интерфейсу (USB, SAS, FireWire).
  2. Создать каталог-точку монтирования (если каталог не создан заранее).
  3. Смонтировать сменный носитель в каталог-точку монтирования с опциями по перекодированию символов неродной файловой системы в родную файловую систему и обратно.
  4. Поработать с файловой системой носителя.
  5. Демонтировать сменный носитель.
  6. Отсоединить устройство.

Все эти действия пользователь выполняет без какой-либо автоматизации, вручную!

В отличие от вездесущего Linux-демона HAL, работающего в связке с PolicyKit и демоном информационной шины D-Bus, встроенные системные средства FreeBSD позволяют обойтись без нагромождений стороннего софта. Естественно, модуль конвертации кодировок msdosfs_iconv из одной системы в другую и обратно всё же должен быть прописан в автозагрузке в файле /boot/loader.conf (msdosfs_iconv_enable="YES"), либо вкомпилирован в ядро системы (options MSDOSFS_ICONV).

"Всё должно быть просто, но не так чтобы сильно." © кто-то из великих

Преамбула


Только хозяин (owner, создатель) каталога может производить в него монтирование устройств, работать с файловой системой смонтированого устройства как ему вздумается. Демон devd(8) (device state change daemon) работает с системной (root) учётной записью и у него нет понятия "текущий пользователь" (строго говоря, FreeBSD — это многопользовательская ОС, в которой одновременно работают различные процессы под разными учётными записями). В общем, демон devd(8) имеет понятие только об устройствах (классах устройств) виртуальной файловой системы devfs(8), файловой системе вообще и событиях, случающихся в системе, но не имеет понятия, какой пользователь подсоединил или отсоединил девайс.

Фокус-покус


Хорошая новость: FreeBSD больше не падает при отсоединении неотмонтированной флэшки. А именно это будет происходить всякий раз, при использовании следующего описания. Хотя и не страшно.

Пишем в /etc/devd.conf следующие строчки:

# Automount
attach 10 {
match "device-name" "umass[0-9]+";
action "sleep 4 && mkdir -p /media/$device-name && chown -R username /media/$device-name && \
(/sbin/mount_msdosfs -o sync -L ru_RU.UTF-8 -D CP1251 /dev/da0s1 /media/$device-name || \
/sbin/mount_msdosfs -o sync -L ru_RU.UTF-8 -D CP1251 /dev/da0 /media/$device-name)";
};
detach 10 {
match "device-name" "umass[0-9]+";
action "/sbin/umount -f /media/$device-name && rm -r /media/$device-name";
};

Запускаем демон состояния виртуальной файловой системы устройств:
% echo 'devd_enable="YES"' >> /etc/rc.conf
% /etc/rc.d/devd start

Или рестартуем его, если он работает (чтобы он перечитал свой конфиг):
% /etc/rc.d/devd restart
Stopping devd.
Starting devd.

На события attach/detach демон devd(8) реагирует следующим образом: определяет, какой тип устройства подключается/отключается (здесь: umassНомерустройства) и совершает соответствующее действие (action). Из описанных действий нетрудно понять, каким образом ведётся работа с флэшкой.

При подсоединении съёмного носителя (флэшки) будет создан каталог /media/umass0, носитель будет подвергнут проверке fsck и, если никаких ошибок не найдено, созданный каталог изменит владельца на username, и в этот каталог смонтируется устройство /dev/da0s1 (первый слайс накопителя с файловой системой FAT). После этого пользователь, имеющий учётную запись username, сможет работать с устройством как с собственным файловым хранилищем.

Так как устройство работает в синхронном режиме, то есть данные на носитель пишутся и читаются последовательно, без отложенных операций, то ручное отмонтирование не требуется — по завершении всех операций достаточно просто отсоединить устройство — это событие заставит демон devd(8) выполнить действия по очистке точки монтирования, как в виртуальной файловой системе devfs (демонтирует каталог /dev/da0s1), так и в реальной файловой системе (удалит временный каталог /media/umass0).

Три ложечки дёгтя


  1. Необходимость в использовании имени учётной записи пользователя (username), к которому привязывается точка монтирования;
  2. Фиксированное название раздела носителя (da0s1) не позволит смонтировать в автоматическом режиме другие носители;
  3. Фиксированный тип файловой системы (msdosfs) на монтируемом носителе не позволяет правилом attach смонтировать носитель, с тем же названием раздела, но с отличной от FAT ФС.


P.S.


Я имею представление о портах, позволяющих обходить проблему автомонтирования флэшек с разных сторон: sysutils/kiconvtool и sysutils/automounter. Но лично у меня первый порт не заработал (ошибка осталась), а второй несколько избыточен по функциональности (надстройка над amd(8)).

четверг, 13 августа 2009 г.

Diablo JDK 1.6: ошибка в VM

Информация о системе


> uname -rsm
FreeBSD 8.0-BETA2 amd64
Дерево портов обновлено.

Инсталляция и неудачный запуск


% portinstall -p java/diablo-jdk16
...
===> Registering installation for diablo-jdk-1.6.0.07.02_5
...
===> Building package for diablo-jdk-1.6.0.07.02_5
...
===> Cleaning for diablo-jdk-1.6.0.07.02_5
---> Cleaning out obsolete shared libraries
[Updating the pkgdb in /var/db/pkg ... - 444 packages found (-0 +1) . done]
% rehash
% java -version
Error occurred during initialization of VM
Unable to load ZIP library: /usr/local/diablo-jdk1.6.0/jre/lib/amd64/libzip.so
%

Решение проблемы

% echo "libz.so.4 libz.so.5 #for diablo-jdk1.6" >> /etc/libmap.conf
% rehash
% java -version
Diablo Java(TM) SE Runtime Environment (build 1.6.0_07-b02)
Diablo Java HotSpot(TM) 64-Bit Server VM (build 10.0-b23, mixed mode)
%

среда, 12 августа 2009 г.

Метки GPT для ZFS

Нужно создать ZFS пул с зеркалом из носителей, смонтированных по меткам GPT, чтобы не зависеть от имён устройств и номеров портов контроллёров.

Исходное состояние


Зеркало как таковое отсутствует:

% zpool status
pool: amd64rio
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
amd64rio ONLINE 0 0 0
ad6p3 ONLINE 0 0 0

errors: No known data errors

Включим в пул ещё один носитель (GPT-раздел устройства ad10) — разметка разделов второго винчестера аналогична первому, так что здесь последовательность команд не приводится.

Создание зеркала в пуле


% zpool attach amd64rio /dev/ad6p3 /dev/ad10p3
% zpool scrub amd64rio
% zpool status
pool: amd64rio
state: ONLINE
scrub: scrub in progress for 0h0m, 0,00% done, 131h10m to go
config:

NAME STATE READ WRITE CKSUM
amd64rio ONLINE 0 0 0
mirror ONLINE 0 0 0
ad6p3 ONLINE 0 0 0
ad10p3 ONLINE 0 0 0

errors: No known data errors

Состояние разметки устройств


Подготовительные операции для перехода на новую схему:

% echo 'geom_label_load="YES"' >> /boot/loader.conf
% shutdown -r now
% glabel list
Geom name: ad6p1
Providers:
1. Name: gpt/rio_boot
Mediasize: 131072 (128K)
Sectorsize: 512
Mode: r0w0e0
secoffset: 0
offset: 0
seclength: 256
length: 131072
index: 0
Consumers:
1. Name: ad6p1
Mediasize: 131072 (128K)
Sectorsize: 512
Mode: r0w0e0

Geom name: ad6p1
Providers:
1. Name: gptid/6e56389f-81a6-11de-8aa6-02508d92a2eb
Mediasize: 131072 (128K)
Sectorsize: 512
Mode: r0w0e0
secoffset: 0
offset: 0
seclength: 256
length: 131072
index: 0
Consumers:
1. Name: ad6p1
Mediasize: 131072 (128K)
Sectorsize: 512
Mode: r0w0e0

Geom name: ad6p2
Providers:
1. Name: gpt/rio_swap
Mediasize: 2147483648 (2.0G)
Sectorsize: 512
Mode: r0w0e0
secoffset: 0
offset: 0
seclength: 4194304
length: 2147483648
index: 0
Consumers:
1. Name: ad6p2
Mediasize: 2147483648 (2.0G)
Sectorsize: 512
Mode: r0w0e0

Geom name: ad6p2
Providers:
1. Name: gptid/e0fa02b3-81a6-11de-8aa6-02508d92a2eb
Mediasize: 2147483648 (2.0G)
Sectorsize: 512
Mode: r0w0e0
secoffset: 0
offset: 0
seclength: 4194304
length: 2147483648
index: 0
Consumers:
1. Name: ad6p2
Mediasize: 2147483648 (2.0G)
Sectorsize: 512
Mode: r0w0e0

Geom name: ad6p3
Providers:
1. Name: gpt/rio_zfs
Mediasize: 317921280000 (296G)
Sectorsize: 512
Mode: r0w0e0
secoffset: 0
offset: 0
seclength: 620940000
length: 317921280000
index: 0
Consumers:
1. Name: ad6p3
Mediasize: 317921280000 (296G)
Sectorsize: 512
Mode: r0w0e0

Geom name: ad6p3
Providers:
1. Name: gptid/1f26a2d6-81a7-11de-8aa6-02508d92a2eb
Mediasize: 317921280000 (296G)
Sectorsize: 512
Mode: r0w0e0
secoffset: 0
offset: 0
seclength: 620940000
length: 317921280000
index: 0
Consumers:
1. Name: ad6p3
Mediasize: 317921280000 (296G)
Sectorsize: 512
Mode: r0w0e0

Geom name: ad10p1
Providers:
1. Name: gptid/a01d172c-81a6-11de-8aa6-02508d92a2eb
Mediasize: 131072 (128K)
Sectorsize: 512
Mode: r0w0e0
secoffset: 0
offset: 0
seclength: 256
length: 131072
index: 0
Consumers:
1. Name: ad10p1
Mediasize: 131072 (128K)
Sectorsize: 512
Mode: r0w0e0

Geom name: ad10p2
Providers:
1. Name: gptid/e2aef92e-81a6-11de-8aa6-02508d92a2eb
Mediasize: 2147483648 (2.0G)
Sectorsize: 512
Mode: r0w0e0
secoffset: 0
offset: 0
seclength: 4194304
length: 2147483648
index: 0
Consumers:
1. Name: ad10p2
Mediasize: 2147483648 (2.0G)
Sectorsize: 512
Mode: r0w0e0

Geom name: ad10p3
Providers:
1. Name: gptid/20db981e-81a7-11de-8aa6-02508d92a2eb
Mediasize: 317921280000 (296G)
Sectorsize: 512
Mode: r0w0e0
secoffset: 0
offset: 0
seclength: 620940000
length: 317921280000
index: 0
Consumers:
1. Name: ad10p3
Mediasize: 317921280000 (296G)
Sectorsize: 512
Mode: r0w0e0

Процесс отвязки носителей от "устройств"


1. Вывод из зеркала одного носителя и его полная очистка "для чистоты эксперимента"

% zpool detach amd64rio ad10p3
% zpool status
pool: amd64rio
state: ONLINE
scrub: scrub in progress for 0h0m, 0,00% done, 69h45m to go
config:

NAME STATE READ WRITE CKSUM
amd64rio ONLINE 0 0 0
ad6p3 ONLINE 0 0 0

errors: No known data errors
% dd if=/dev/zero of=/dev/ad10p3 bs=100m
dd: /dev/ad10p3: short write on character device
dd: /dev/ad10p3: end of device
3032+0 records in
3031+1 records out
317921280000 bytes transferred in 5836.782166 secs (54468587 bytes/sec)

2. Задание метки

% gpart modify -i 3 -l rio_zfs2 ad10
ad10p3 modified
% shutdown -r now

3. Внесение носителя в зеркало

% zpool attach amd64rio ad6p3 gpt/rio_zfs2
% zpool status
pool: amd64rio
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress for 0h3m, 17,22% done, 0h17m to go
config:

NAME STATE READ WRITE CKSUM
amd64rio ONLINE 0 0 0
mirror ONLINE 0 0 0
ad6p3 ONLINE 0 0 0 7,80M resilvered
gpt/rio_zfs2 ONLINE 0 0 0 9,08G resilvered

errors: No known data errors

4. После окончания репликации проделываем аналогичную операцию с другим носителем

% zpool detach amd64rio ad6p3
% zpool status
pool: amd64rio
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
amd64rio ONLINE 0 0 0
gpt/rio_zfs2 ONLINE 0 0 0

errors: No known data errors
% gpart modify -i 3 -l rio_zfs1 ad6
ad6p3 modified
% dd if=/dev/zero of=/dev/ad6p3 bs=100m
dd: /dev/ad6p3: short write on character device
dd: /dev/ad6p3: end of device
3032+0 records in
3031+1 records out
317921280000 bytes transferred in 5950.955982 secs (53423564 bytes/sec)
% shutdown -r now
% zpool attach amd64rio gpt/rio_zfs2 gpt/rio_zfs1
% zpool status
pool: amd64rio
state: ONLINE
scrub: resilver completed after 0h21m with 0 errors on Wed Aug 12 17:44:06 2009
config:

NAME STATE READ WRITE CKSUM
amd64rio ONLINE 0 0 0
mirror ONLINE 0 0 0
gpt/rio_zfs2 ONLINE 0 0 0 123M resilvered
gpt/rio_zfs1 ONLINE 0 0 0 52,7G resilvered

errors: No known data errors


Это всё.

воскресенье, 9 августа 2009 г.

GPT и ZFS для FreeBSD

Имеется диск Western Digital серии Scorpio Blue
(WD3200BEVT, 320 ГБ; SATA 3 Гб/с; Кэш 8 МБ; 5400 об/мин).
Вот его-то я и подготовлю для использования в FreeBSD 8.

Предисловие


% echo 'zfs_load="YES"' >> /boot/loader.conf
% shutdown -r now


Начало


% gpart create -s GPT ad6
% gpart add -b 34 -s 256 -t freebsd-boot -l rio_boot ad6
ad6p1 added
% gpart add -b 290 -s 4194304 -t freebsd-swap -l rio_swap ad6
ad6p2 added
% gpart add -b 4194594 -s 620940000 -t freebsd-zfs -l rio_zfs ad6
ad6p3 added
% gpart show
=> 34 625142381 ad6 GPT (298G)
34 256 1 freebsd-boot (128K)
290 4194304 2 freebsd-swap (2.0G)
4194594 620940000 3 freebsd-zfs (296G)
625134594 7821 - free - (3.8M)
% gpart bootcode -b /boot/pmbr ad6
ad6 has bootcode
% gpart bootcode -p /boot/gptzfsboot -i 1 ad6


Сначала было слово...


% zpool create amd64rio /dev/ad6p3
% zpool set bootfs=amd64rio amd64rio
% zfs list
NAME USED AVAIL REFER MOUNTPOINT
amd64rio 67,5K 291G 18K /amd64rio


Он сказал: "Поехали!"


% zfs set atime=off amd64rio
% zfs create -o atime=on amd64rio/var
% zfs create -o compression=gzip amd64rio/var/crash
% zfs create -o readonly=on amd64rio/var/empty
% zfs create amd64rio/var/tmp
% chmod 1777 /amd64rio/var/tmp
% zfs create amd64rio/var/db
% zfs create amd64rio/usr
% zfs create amd64rio/usr/home
% zfs create amd64rio/usr/local
% zfs create amd64rio/usr/obj
% zfs create -o compression=gzip amd64rio/usr/ports
% zfs create -o compression=off amd64rio/usr/ports/distfiles
% zfs create -o compression=gzip amd64rio/usr/src
% zfs create amd64rio/tmp


Результат


% zfs list
NAME USED AVAIL REFER MOUNTPOINT
amd64rio 387K 291G 22K /amd64rio
amd64rio/tmp 18K 291G 18K /amd64rio/tmp
amd64rio/usr 114K 291G 23K /amd64rio/usr
amd64rio/usr/home 18K 291G 18K /amd64rio/usr/home
amd64rio/usr/local 18K 291G 18K /amd64rio/usr/local
amd64rio/usr/obj 18K 291G 18K /amd64rio/usr/obj
amd64rio/usr/ports 37K 291G 19K /amd64rio/usr/ports
amd64rio/usr/ports/distfiles 18K 291G 18K /amd64rio/usr/ports/distfiles
amd64rio/usr/src 18K 291G 18K /amd64rio/usr/src
amd64rio/var 95K 291G 23K /amd64rio/var
amd64rio/var/crash 18K 291G 18K /amd64rio/var/crash
amd64rio/var/db 18K 291G 18K /amd64rio/var/db
amd64rio/var/empty 18K 291G 18K /amd64rio/var/empty
amd64rio/var/tmp 18K 291G 18K /amd64rio/var/tmp


Проверка


% zpool export amd64rio
% zpool import amd64rio
% zpool status
pool: amd64rio
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
amd64rio ONLINE 0 0 0
ad6p3 ONLINE 0 0 0

errors: No known data errors


На этом пока всё.

Полезные ссылки

  • Руководство по администрированию файловых систем ZFS Solaris
  • ZFS Best Practice Guide
  • WHEN TO (AND NOT TO) USE RAID-Z

  • среда, 15 июля 2009 г.

    Firefox 3.5 и Java-plugin

    Чтобы включить поддержку исполнения апплетов в firefox 3.5 на платформе [amd64], нужно проделать ряд несложных действий:

    1. Создать символическую ссылку на библиотеку libjavaplugin_oji.so JRE в каталоге плагинов firefox:

    % cd /usr/local/lib/firefox3/plugins/
    % ln -s /usr/local/jdk1.6.0/jre/plugin/amd64/ns7/libjavaplugin_oji.so .

    2. Активировать плагин в настройках Дополнений браузера.

    После этого браузер может загружать и запускать java-апплеты.

    понедельник, 15 декабря 2008 г.

    FreeBSD: декорация окон в теме Nimbus


    Как установить



    1. Установить из порта тему Nimbus для элементов Gtk:

      % cd /usr/ports/x11-themes/nimbus/ && make install clean

    2. Менеджер окон Xfce4 (xfwm4), устанавливаемый вместе со средой из порта, не имеет декорации окон для темы Nimbus, поэтому идём сюда:
      http://www.xfce-look.org/content/show.php/Nimbus-Xfwm4?content=54833
      Скачиваем файлик 54833-Nimbus-Xfwm4.tar.bz2;
      распаковываем его содержимое в каталог ~/.themes.
      Перелогиниваемся и выбираем в настройках Xfce4: пользовательский интерфейс nimbus; окна Nimbus-Xfwm4

    вторник, 14 октября 2008 г.

    Eclipse Ganymede 3.4.1 и Sun WTK 2.2

    Ну наконец-то оно собралось и заработало.


    Встречаем: порт ports/java/eclipse-devel

    вторник, 8 апреля 2008 г.

    Apache Tomcat 6.0 во FreeBSD 7.0

    Apache Tomcat как Web-сервер? Почему нет?

    Контейнер JavaServer Pages и Java Servlets по совместительству может выполнять функции Web-сервера. То есть нативные Web-сервера, получается, не так уж нужны, учитывая потенциальную небезопасность кода C/C++, на котором они написаны.

    Предпосылки

    Итак, Apache Tomcat, написанный на 100% pure-Java ЯП, вполне способен справиться с возложенными на него функциями Web-сервера.

    Пока же мне нужно ввести в опытную эксплуатацию Web-сервер на домашней машине — Локалхосте — как любят выражаться прадвинутые одмины. Ну что ж, за дело!

    Решение

    1. Установка Apache Tomcat 6.0 во FreeBSD не должна вызвать трудностей. Порт ports/www/tomcat6 устанавливается обычным образом.

    2. Для обеспечения удалённого управления Apache Tomcat нужно отредактировать файл /usr/local/apache-tomcat6.0/conf/tomcat-users.xml
    Задание аккаунта менеджера сервера:

    < ?xml version='1.0' encoding='utf-8'?>
    < tomcat-users>
    < role rolename="manager"/>
    < user username="tomadmin" password="secretword" roles="manager"/>
    < /tomcat-users>


    3. Чтобы Apache Tomcat прослушивал порт 8080 и обеспечивал обработку запросов через пул, необходимо в файле /usr/local/apache-tomcat6.0/conf/server.xml раскомментировать блок

    < Connector executor="tomcatThreadPool"
    port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />


    Возможно, также понадобиться добавить в файл /usr/local/apache-tomcat6.0/bin/catalina.sh переменные окружения JAVA_HOME и CATALINA_HOME с абсолютными путями к каталогам JDK и Tomcat, соответственно, если Tomcat почему-либо не может быть запущен системой. Можно также задать переменную CATALINA_TMPDIR с каталогом /tmp в качестве местоназначения, чтобы переопределить путь по умолчанию $CATALINA_BASE/temp. Мне понадобилось внести в файл catalina.sh только эти две строки с переменными:

    JAVA_HOME=/usr/local/jdk1.6.0/
    CATALINA_TMPDIR=/tmp


    4. Автозапуск Apache Tomcat можно обеспечить, если в файл /etc/rc.conf прописать следующую строчку:

    tomcat60_enable="YES"


    Также можно прописать дополнительные опции:

    tomcat60_java_opts="-server"
    tomcat60_java_home="/usr/local/jdk1.6.0"

    Опция -server обеспечивает запуск Tomcat с серверной версией JVM, которая отличается более агрессивным сборщиком мусора GC, несколько другой стратегией управления памятью и JIT. Вторая строчка задаёт домашний каталог рабочего JDK.

    После этого можно перезагрузить машину и проверить, запустился ли сервер:

    > sockstat
    ...
    www java 697 28 tcp4 *:8180 *:*
    www java 697 30 tcp4 *:8080 *:*
    www java 697 39 tcp4 *:8009 *:*
    www java 697 40 tcp4 127.0.0.1:8005 *:*
    ...

    Как видите, Web-сервер запущен и прослушивает порты 8180, 8080, 8009 и 8005.

    Чтобы просмотреть стартовую страничку Apache Tomcat, в любом браузере на локальной машине достаточно ввести URL:

    http://127.0.0.1:8080/


    5. Apache Tomcat запускается и прослушивает входящие соединения на непривелегированных интернет-портах, что несколько неуклюже для настоящего Web-сервера. Запуск Tomcat на порту 80 возможен только от имени root'а.

    Решение проблемы прослушивания служебного порта HTTP :80 Tomcat возможно с использованием механизма перенаправления IP-пакетов, доступного в IPFW и PF. Я выбрал PF в качестве перенаправителя пакетов со служебных портов на порты, которые прослушивает Tomcat в обычном состоянии.

    PF доступен в системе в виде модуля ядра. Для автоматического запуска PF при старте системы необходимо в файле /etc/rc.conf прописать следующие строчки:

    pf_enable="YES"
    pf_rules="/etc/pf.conf"


    Запуск пакетного фильтра в работающей системе осуществляется командой:

    % pfctl -e

    (Останов, соответственно — pfctl -d).

    В файл /etc/pf.conf достаточно добавить правила перенаправления для известных портов (всего две строчки):

    rdr on nve0 proto tcp from any to any port 80 -> 127.0.0.1 \
    port 8080
    rdr on nve0 proto tcp from any to any port 81 -> 127.0.0.1 \
    port 8081

    (здесь: nve0 — сетевой интерфейс, на котором ожидаются HTTP-соединения с Tomcat)

    Проверка новых правил на пакетном фильтре выполняется командой:

    % pfctl -nf /etc/pf.conf

    И, если нет никаких ошибок в правилах, их можно активировать:

    % pfctl -f /etc/pf.conf


    Apache Tomcat будет откликаться из Интернет на URL вида:
    http://<внешний inet-address>/


    Возможные проблемы

    Проблемы могут возникнуть с выполнением JSP из-за невозможности изменения содержимого рабочего каталога /usr/local/apache-tomcat6.0/work/, так как Tomcat имеет непривелегированные права пользователя www.
    В этом случае достаточно удалить содержимое каталога командой:
    % rm -rf /usr/local/apache-tomcat6.0/work/*

    Впоследствии кэш будет создан заново самим Tomcat без особых проблем.

    Также встречалась проблема с невозможностью ответа сервера Tomcat на клиентский http-запрос. Пересборка Sun J2SE JDK 1.6 из порта ports/java/jdk16 без опции поддержки IPv6 решило данную проблему.

    Послесловие

    Пакетный фильтр PF, входящий в поставку FreeBSD, пришёл из OpenBSD. Подробнее о его устройстве и конфигурировании можно почитать в соответствующем разделе официального сайта проекта OpenBSD.

    Безусловно, эта статья не претендует на точность изложения всех аспектов развёртывания и конфигурирования Apache Tomcat и PF, а лишь отражает общие принципы работы этой связки.

    Пока на этом всё.

    Sun WTK 2.2 в окружении JDK 1.6 на FreeBSD 7.0

    Комплект разработчика Sun WTK портировался и тестировался для работы в Linux-окружении JDK версии 1.4.2 и выше. Его удавалось завести под Diablo JDK 1.5, нативной версией Sun J2SE SDK 1.5, но при этом нужно было обеспечить поддержку Linux ABI со стороны ядра FreeBSD — загружать модуль linux.ko и держать каталог /usr/compat/linux с так называемой linux_base.

    Все компоненты, необходимые для работы эмулятора определены, осталось правильно их настроить.

    Оказалось, что устаревшая версия Diablo JDK 1.5 в принципе заменима новой версией Sun J2SE SDK 1.6 из порта ports/java/jdk16 и не надо держать две версии JDK. Так что проблема запуска эмулятора Sun WTK упирается только в используемую linux_base, а с ней не так просто.

    В дистрибутив FreeBSD 7.0-RELEASE входит бинарный пакет linux_base, который устанавливается по желанию. Я устанавливал систему с boot-only CD по сети, так что от пакета linux_base пришлось отказаться до последнего момента, когда понадобилось поработать с эмулятором Sun WTK. Выяснил, что из доступного набора дистрибутивов linux_base, которые можно поставить на FreeBSD из соответствующих портов ветки ports/emulators, оригинальным бинарным пакетом является сборка из порта ports/emulators/linux_base-fc4. Чтобы обеспечить работу графических Linux-приложений в Xorg под FreeBSD, нужно также инсталлировать набор библиотек из порта ports/x11/linux-xorg-libs.

    Итак, последовательность шагов по установке ПО определена весьма чётко:
    % cd /usr/ports/java/jdk16 && make install clean && rehash
    % cd /usr/ports/java/sun-wtk && make install clean
    % kldload linux.ko
    % cd /usr/ports/emulators/linux_base-fc4 && make install clean && rehash
    % cd /usr/ports/x11/linux-xorg-libs && make install clean && rehash
    % mount -t linprocfs linprocfs /compat/linux/proc

    После этого можно открыть ktoolbar и запустить демонстрационные j2me-приложения из поставки Sun WTK. Для создания и редактирования проектов в самом ktoolbar необходимо иметь соответствующие права доступа к подкаталогам /usr/local/sun-wtk.

    Чтобы запускать поддержку Linux ABI при старте системы, необходимо в файл /etc/rc.conf добавить строчку:
    linux_enable="YES"

    В конец файла /etc/fstab добавить строчку автомонтирования файловой системы linuxprocfs:
    ...
    linprocfs /compat/linux/proc linprocfs rw 0 0


    В общем, на этом проблемы с запуском можно считать решёными.

    среда, 12 марта 2008 г.

    unionfs как элемент распределённой FS

    Unionfs — это стэковая файловая система. Может сливать содержимое нескольких каталогов, оставляя их физическое содержание обособленным. Возможно любое сочетание ветвей только-для-чтения (ro) и перезаписываемых ветвей (rw), а также вставку и удаление веток на лету.


    Задача

    Имеем NFS-доступный каталог с дистфайлами (архивами исходников) портов на сервере (обновляется редко). На одной из сетевых машин также имеется каталог /usr/ports/distfiles, в котором находятся более новые версии дистфайлов. Проблема в том, что в серверном NFS-хранилище находится очень много файлов, нужных для сборки всего и вся, они редко изменяют свои версии. А на сетевой машине только то, что она скачала сама из Сети.
    Как бы сделать так, чтобы сетевая машина могла использовать не только свои дистфайлы, но и дистфайлы сервера?


    Решение

    На сетевой машине делаем:

    % mount_nfs -o ro server:/usr/ports/distfiles /mnt/server/distfiles
    % mount_unionfs -o below /mnt/server/distfiles /usr/ports/distfiles



    Таким образом, на сетевой машине мы получили полное дерево портов со всеми дистфайлами. Новые файлы будут сохранятся локально (удобно, если NFS-каталог для нас read-only). Любые изменившиеся файлы в NFS-каталоге будут скопированы в локальное хранилище (/usr/ports/distfiles сетевой машины) с последующим применением изменений. Эти исключения описаны параграфом в mount_unionfs(8).

    Стратегия обработки файлов в unionfs такая: сначала поиск ведётся в upper layer (это первый параметр), затем в lower layer (это второй параметр). При удачном поиске в lower layer идёт "теневое зеркалирование" файла на upper layer (без копирования), затем проведение операций открытия файлов и работы с ними. Ключ -o below приводит к инверсии lower layer и upper layer.


    Ссылки

    "Реализация UnionFS под FreeBSD стала более стабильной"