По последней секции - пара пояснений. Все указанные директории, права, и владельцы выдернуты из инсталляционных скриптов 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 0 proc /proc procfs rw 0 0 tmpfs /etc/X11 tmpfs rw 0 0 router$
Опять же - пара пояснений - 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 X root auto 10 rdesktop /root/scripts/rdesktop.sh router$
Пишем скрипт инициализации тонкого клиента, и делаем его исполняемым:
router$ cat /usr/local/etc/rc.d/start.thin.client.sh #!/bin/sh # conf domain="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 " in stop) # нихрена не делаем :) # Просто, без этого пункта, при остановке тонкого клиента, # снова запускаются иксы ;; # Если старт - запускаем rdesktop start ) # 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 ;;esac router$
Создаём стартовый скрипт для rdesktop - его задача - запуск иксов с нужными параметрами:
router$ cat /root/scripts/rdesktop.sh #!/bin/sh # conf domain="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=""fi export DISPLAY=:0 # пишем конфиг .xinitrc echo "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# назначаем хомяком /tmp export 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 set horiz_sync=${horiz_sync :-no} vert_refresh=${vert_refresh :-no} vga_driver=${vga_driver :-no} resolution=${resolution :-no}# need or not wrote config if [ "$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.conffi router$
Кладём шаблон конфигурационного файла иксов:
router$ cat /root/scripts/xorg.conf.tpl# 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/" EndSection Section "Module" Load "extmod" Load "record" Load "dbe" Load "glx" Load "dri" Load "dri2" EndSection Section "InputDevice" Identifier "Keyboard0" Driver "kbd" EndSection Section "InputDevice" Identifier "Mouse0" Driver "mouse" Option "Protocol" "auto" Option "Device" "/dev/sysmouse" Option "ZAxisMapping" "4 5 6 7 " EndSection Section "Monitor" #DisplaySize 340 270 # mm Identifier "Monitor0" HorizSync __horiz__ #30.0 - 81.0 VertRefresh __vert__ #56.0 - 75.0 # Option "DPMS" EndSection Section "Device" Identifier "Card0" Driver "__driver__" EndSection Section "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__ EndSubSection EndSection router$
Кладём дефолтовый конфиг для тонких клиентов:
router$ mkdir -p /root/scripts/thin_configs/ router$ cat /root/scripts/thin_configs/defaults.conf# thin clients configurations # user name user_name="change_user_name_in_config"# terminal server ts="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 configuration loader_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"# sound snd_driver_load="YES" sound_load="YES" router$
Для корректной работы sshd необходимо сгенерить ключи. Проще всего это сделать прям в chroot:
router$ chroot /shares/tftp/7 .2 /eliron router$ /etc/rc.d/sshd start ; /etc/rc.d/sshd stop Generating 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.local The 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.local The 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.local The 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 секунд подымает иксы при падении. Если на тазике есть звуковушка - то звук с сервера пробрасывается на локальную машину, можно музычку послушать =))). За работу флэшек отвечает параметр
в конфигурационном файле каждого конкретного клиента. Без него - флэшка всё равно монтируется, но - в терминальную сессию диск не пробрасывается. Принцип работы - на старте системы запускается 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 корневой файлвоой системы, лезет в консоль такое:
Никакие бубны с ручной раздачей прерываний и прочего непомогают. Помогает отключение acpi через лоадер - но, тогда теряется некоторый функционал, который тоже хотелось окучить - отключение в 10 вечера всех тазиков по планировщику =( Решается установкой нормальной сетевухи - типа fxp , xl , em и прочия. Все машины, на которых была такая бага, с материнками под SLOT1 . 2. Кушают много рамы - старая версия требовала мегабайт 40 для работы. Впрочем - это расплата за возможность использовать USB мышки/клавы, и не париться с конфигурацией иксов - в подавляющем большинстве случаев. Минимум, на котором у меня заводилось (настройки по статье, вернее - статья с тех настроек =)) - это ~58 мегабайт (на машине 64 рамы, 8 отдано встроенной видеокарте). 3. Не получилось смонтировать корневую файловую систему в read-only режиме. Хоть ты тресни - пытается в rw монтировать, и монтирует. При этом не понимает что по NFS оно расшарено в режиме тока чтения - на клиентах показывает что оно якбы rw - но записать ничё не получается. Бага задокументирована . Ждём ответа. Вроде всё. Ушло - вечер на работу - скрипты писал пока компилялось, полчаса на отладку, и два дня на написание статьи =)