По последней секции - пара пояснений. Все указанные директории, права, и владельцы выдернуты из инсталляционных скриптов dbus, hald и прочей хиромантии. На тонком клиенте раздел /var создаётся в памяти, и, разумеется, там указанные директори отсутствуют. Конечно, можно было поправить файл /etc/mtree/BSD.var.dist. Тока лениво, да и при обновлениях придётся его снова править. Так проще и надёжней =) Создаём файл монтирования файловых систем - fstab следующего содержания:
router$ cat /etc/fstab# fstab for diskless clients# Device Mountpoint FStype Options Dump Pass#192.168.110.254:/shares/tftp/7.2/eliron / nfs ro 0 0#192.168.110.254:/usr/ports /usr/ports nfs rw 0 0proc /proc procfs rw 0 0tmpfs /etc/X11 tmpfs rw 0 0router$
Опять же - пара пояснений - procfs используется monitord(8), для отслеживания работы приложений. Файловая система в памяти - tmpfs, с любопытной точкой монтирования, используется для хранения конфигурационного файла X-сервера - когда его приходиться запускать с ним (последние иксы достаточно умные, чтобы в 80% случаев работать вообще без конфигурационного файла). Создаём конфиг для monitord, следующего содержания:
router$ more /usr/local/etc/monitord.conf## my email (only for test, after - to /dev/null)#email = root#smtp-server = localhost# user options delay service start script parameters# up Xroot auto 10 rdesktop /root/scripts/rdesktop.shrouter$
Пишем скрипт инициализации тонкого клиента, и делаем его исполняемым:
router$ cat /usr/local/etc/rc.d/start.thin.client.sh#!/bin/sh# confdomain="grand-prix"mac_addr_file="/tmp/mac.addr.txt"user_settings_dir="/root/scripts/thin_configs"PATH="/sbin:/bin:/usr/sbin:/usr/bin:\/usr/local/bin:/usr/local/sbin"# Если завершение работы - ничё не делаем.case "$1" instop) # нихрена не делаем :) # Просто, без этого пункта, при остановке тонкого клиента, # снова запускаются иксы;; # Если старт - запускаем rdesktopstart) # start monitord sleep 5 && /usr/local/etc/rc.d/monitord forcestart & # start dhclient# for iface in `ifconfig -l`# do# /etc/rc.d/dhclient start $iface# done # синхронизация времени ntpdate -b $domain & # get user MAC adderess client_mac=`ifconfig | grep ether | awk '{print $2}' | \ tr -d ":" | tail -1` # save MAC to /tmp - for configuration X server echo $client_mac > $mac_addr_file # достаём персональный конфиг пользователя - если он есть. if [ -s ${user_settings_dir}/${client_mac}.conf ] then . ${user_settings_dir}/${client_mac}.conf else . ${user_settings_dir}/defaults.conf fi # set hostname hostname ${user_name}.${domain} # set volume to maximum for mix in `mixer | grep currently | awk '{print $2}'` do mixer $mix 100:100 done;;# справка по использованию*) echo "" echo "Usage: `basename $0` { start | stop }" echo "" exit 64;;esacrouter$
Создаём стартовый скрипт для rdesktop - его задача - запуск иксов с нужными параметрами:
router$ cat /root/scripts/rdesktop.sh#!/bin/sh# confdomain="grand-prix"mac_addr_file="/tmp/mac.addr.txt"user_settings_dir="/root/scripts/thin_configs"usb_flash="NO"PATH="/sbin:/bin:/usr/sbin:/usr/bin:\/usr/local/bin:/usr/local/sbin"client_mac="`cat $mac_addr_file`"# достаём конфиги юзераif [ -s ${user_settings_dir}/${client_mac}.conf ]then . ${user_settings_dir}/${client_mac}.confelse . ${user_settings_dir}/defaults.conffi# проверка - надо ли флэшкуif [ $usb_flash = "YES" ]then part="-r disk:flash=/mnt"else part=""fiexport DISPLAY=:0# пишем конфиг .xinitrcecho "exec sleep 5 && /usr/local/bin/setxkbmap \ -layout us,ru -variant ,winkeys -option grp:ctrl_shift_toggle &exec /usr/local/bin/rdesktop -c /tmp -d $domain -n `hostname -s`-bsd \ -k en-us -f -L koi8-r -N \ -r sound:local $part -u `hostname -s` $ts" > /tmp/.xinitrc# создаём конфиг для клавыecho "-layout us,ru -variant ,winkeys \ -option grp:ctrl_shift_toggle" > /tmp/.Xkbmap# назначаем хомяком /tmpexport HOME=/tmp# рисуем конфиг иксов, если надо. /root/scripts/create.xorg.conf.sh# стартуем иксыsleep 3 && /usr/bin/nice -n -20 /usr/local/bin/startx &
Пишем скрипт для создания конфигурационнго файла X-сервера - если есть необходимость вручную выставить параметры (как уже упоминалось - в большинстве случаев, он сам корректно всё определяет):
router$ cat /root/scripts/create.xorg.conf.sh#!/bin/sh# set defaults, if not sethoriz_sync=${horiz_sync:-no}vert_refresh=${vert_refresh:-no}vga_driver=${vga_driver:-no}resolution=${resolution:-no}# need or not wrote configif [ "$horiz_sync" != "no" \ -o "$vert_refresh" != "no" \ -o "$vga_driver" != "no" \ -o "$resolution" != "no" ]then # reset defaults if [ "$horiz_sync" = "no" ] then horiz_sync="30.0 - 81.0" # for 1280x1024, LCD fi if [ "$vert_refresh" = "no" ] then vert_refresh="56.0 - 75.0" # for 1280x1024, LCD fi if [ "$vga_driver" = "no" ] then vga_driver="vesa" fi if [ "$resolution" = "no" ] then resolution='"1024x768"' fi cat /root/scripts/xorg.conf.tpl |\ sed -e "s/__horiz__/$horiz_sync/g" |\ sed -e "s/__vert__/$vert_refresh/g" |\ sed -e "s/__driver__/$vga_driver/g" |\ sed -e "s/__modes__/$resolution/g" > /etc/X11/xorg.conffirouter$
Кладём шаблон конфигурационного файла иксов:
router$ cat /root/scripts/xorg.conf.tpl#Section "ServerLayout" Identifier "X.org Configured" Screen 0 "Screen0" 0 0 InputDevice "Mouse0" "CorePointer" InputDevice "Keyboard0" "CoreKeyboard"EndSectionSection "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/"EndSectionSection "Module" Load "extmod" Load "record" Load "dbe" Load "glx" Load "dri" Load "dri2"EndSectionSection "InputDevice" Identifier "Keyboard0" Driver "kbd"EndSectionSection "InputDevice" Identifier "Mouse0" Driver "mouse" Option "Protocol" "auto" Option "Device" "/dev/sysmouse" Option "ZAxisMapping" "4 5 6 7"EndSectionSection "Monitor" #DisplaySize 340 270 # mm Identifier "Monitor0" HorizSync __horiz__ #30.0 - 81.0 VertRefresh __vert__ #56.0 - 75.0# Option "DPMS"EndSectionSection "Device" Identifier "Card0" Driver "__driver__"EndSectionSection "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0"# SubSection "Display"# Viewport 0 0# Depth 15# Modes __modes__# EndSubSection# SubSection "Display"# Viewport 0 0# Depth 16# Modes __modes__# EndSubSection SubSection "Display" Viewport 0 0 Depth 24 Modes __modes__ EndSubSectionEndSectionrouter$
Кладём дефолтовый конфиг для тонких клиентов:
router$ mkdir -p /root/scripts/thin_configs/router$ cat /root/scripts/thin_configs/defaults.conf# thin clients configurations# user nameuser_name="change_user_name_in_config"# terminal serverts="TS2"# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!# use next variable only if incorrect display size, or no screen# need set all options!## Настройки иксов.# Горизонтальная развёртка# horiz_sync="30-200"# Частота обновления кадров# vert_refresh="60-100"# Драйвер видеокарты# vga_driver="vesa"# Разрешение моника (именно в одинарных и двойных кавычках!!)# resolution='"1024x768"'router$
Ну, и, наконец, кладём конфигурационный файл лоадера:router$ cat /boot/loader.conf# loader configurationloader_logo="beastie"autoboot_delay="2"libiconv_load="YES"#cd9660_iconv_load="YES"msdosfs_iconv_load="YES"#ntfs_iconv_load="YES"#udf_iconv_load="YES"tmpfs_load="YES"drm_load="YES"# soundsnd_driver_load="YES"sound_load="YES"router$
Для корректной работы sshd необходимо сгенерить ключи. Проще всего это сделать прям в chroot:
router$ chroot /shares/tftp/7.2/elironrouter$ /etc/rc.d/sshd start; /etc/rc.d/sshd stopGenerating public/private rsa1 key pair.Your identification has been saved in /etc/ssh/ssh_host_key.Your public key has been saved in /etc/ssh/ssh_host_key.pub.The key fingerprint is:ff:f8:5c:c7:20:02:c1:4f:0f:61:f0:51:25:7d:c6:eb root@router.localThe key's randomart image is:+--[RSA1 1024]----+| .o.+ooo.. || .+o. .. +|| .o.o o.|| .. . . || S . . o || . . . E || . . o|| + . . || ..+ |+-----------------+Generating public/private dsa key pair.Your identification has been saved in /etc/ssh/ssh_host_dsa_key.Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.The key fingerprint is:9a:f7:6d:63:a3:d2:cb:5b:75:f0:f6:dd:0d:e1:8d:ea root@router.localThe key's randomart image is:+--[ DSA 1024]----+| || || o || . * || S = =|| o o +=|| o .. o =|| ..o.+= || .**Eo |+-----------------+Generating public/private rsa key pair.Your identification has been saved in /etc/ssh/ssh_host_rsa_key.Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub.The key fingerprint is:48:28:1d:27:8f:57:89:72:4d:0e:7c:78:ea:41:4c:f7 root@router.localThe key's randomart image is:+--[ RSA 2048]----+| o++=+. || ..BB==. || . ++++. E || . oo. || ...S || . || || || |+-----------------+Starting sshd.sshd not running? (check /var/run/sshd.pid).router$
Вот и всё. Для работы машинке (тонкому клиенту) требуется около 64 метров памяти (у меня работали на 64+16 - на 64Mb иксы стартуют, но сразу же убиваются ядром - памяти мало, а иногда нормально запускались и работали на 64. Думаю, зависит памяти ушедшей на диски в памяти), процессор - наверно не важно какой - из тех тазиков что выжили есть первый пень на 233 чтоли мегагерца - загружается и работает. Грузиться чуть медленней, чем предыдущая версия, на базе 4.11 и XFree - но, это операция разовая. Перезапуск осуществляется быстрей, monitord в течение 10-15 секунд подымает иксы при падении. Если на тазике есть звуковушка - то звук с сервера пробрасывается на локальную машину, можно музычку послушать =))). За работу флэшек отвечает параметр
usb_flash="YES"
в конфигурационном файле каждого конкретного клиента. Без него - флэшка всё равно монтируется, но - в терминальную сессию диск не пробрасывается. Принцип работы - на старте системы запускается rc.d скрипт start.thin.client.sh. Он задёт имя хоста, запускает monitord (ну, до кучи выставляет звук на полную - бывает тихо он стоит и из терминалки это не поправишь). Далее, уже запущенный monitord видит, что приложение rdesktop не запущщено - соответсвенно, выполянет скрипт /root/scripts/rdesktop.sh. Он, считывает конфигурационный файл конкретной машины (имя файла состоит из MAC-адреса, типа 00c0265c5c15.conf), создаёт конфигурационные файлы - для запуска иксов - если надо, файл .xinitrc - c указанием что именно запускать X-серверу, и файл с указанием языковой раскладки клавиатуры - .Xkbmap. После всех подготовительных операций, запускаются иксы. При втыкании флэшки, происходит следующее - devd, заметив что что-то воткнули, и оно совпало с условием в его конфигурационном файле, выполняет указанный там скрипт - /root/scripts/mount.da0.sh. Скрипт проверяет флэшку при помощи fsck_msdosfs и монтирует её. При выдёргивании, всё тот же devd выполняет скрипт отмонтирвоания /root/scripts/umount.da0.sh. Юзеров лучше приучить чтоб ждали секунд несколько после того как записали чего-то. Данные целей будут. Ну, и, о грустном - куда ж без этого. 1. Забраковалось несколько старых машинок - после загрузки ядра, перед монтированием по NFS корневой файлвоой системы, лезет в консоль такое:
rl0: watchdog timeout
Никакие бубны с ручной раздачей прерываний и прочего непомогают. Помогает отключение acpi через лоадер - но, тогда теряется некоторый функционал, который тоже хотелось окучить - отключение в 10 вечера всех тазиков по планировщику =( Решается установкой нормальной сетевухи - типа fxp, xl, em и прочия. Все машины, на которых была такая бага, с материнками под SLOT1. 2. Кушают много рамы - старая версия требовала мегабайт 40 для работы. Впрочем - это расплата за возможность использовать USB мышки/клавы, и не париться с конфигурацией иксов - в подавляющем большинстве случаев. Минимум, на котором у меня заводилось (настройки по статье, вернее - статья с тех настроек =)) - это ~58 мегабайт (на машине 64 рамы, 8 отдано встроенной видеокарте). 3. Не получилось смонтировать корневую файловую систему в read-only режиме. Хоть ты тресни - пытается в rw монтировать, и монтирует. При этом не понимает что по NFS оно расшарено в режиме тока чтения - на клиентах показывает что оно якбы rw - но записать ничё не получается. Бага задокументирована. Ждём ответа. Вроде всё. Ушло - вечер на работу - скрипты писал пока компилялось, полчаса на отладку, и два дня на написание статьи =)