router$ grep --after-context=4 NFS /etc/rc.conf# NFSnfs_server_enable="YES"nfs_server_flags="-u -t -n 40"rpcbind_enable="YES"nfs_client_enable="YES"router$
Прописываем файловые системы, расшаренные по сети:
router$ cat /etc/exports# То, что расшариваем по NFS#/usr/ports/distfiles -maproot=root -network 192.168 -mask 255.255.0.0/usr/ports /usr/src -maproot=root -network 192.168 -mask 255.255.0.0#/pxeroot -maproot=root -network 192.168 -mask 255.255.0.0#/usr/src -maproot=root -network 192.168 -mask 255.255.0.0/shares/tftp/7.2/eliron -maproot=root -ro -network 192.168 -mask 255.255.0.0router$
Раскомментируем, и немного подправляем строки запуска tftpd через inetd:
router$ grep shares /etc/inetd.conftftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /shares/tftp/7.2/eliron \-u roottftp stream tcp nowait root /usr/libexec/tftpd tftpd -l -s /shares/tftp/7.2/eliron \-u rootrouter$
Не забываем запустить сам inetd:
router$ grep inetd /etc/rc.confinetd_enable="YES"
Прописываем запуск DHCP-сервера (у меня DHCP сервер (isc-dhcp30-server) находиться на этой же машине, у вас может находиться на другой):
router$ grep --after-context=5 DHCPd /etc/rc.conf# DHCPddhcpd_enable="YES"dhcpd_conf="/usr/local/etc/dhcpd.conf"#dhcpd_ifaces="fxp0 dc0 sk0"dhcpd_ifaces="fxp0 sk0"#dhcpd_flags="-d "router$
У меня, настройки для заданной сети выглядят в dhcpd.conf примерно так:
subnet 192.168.110.0 netmask 255.255.255.0 { range 192.168.110.1 192.168.110.199; option routers 192.168.110.254; option subnet-mask 255.255.255.0; option netbios-name-servers 192.168.0.19, 192.168.0.251; option netbios-dd-server 192.168.110.253; option netbios-node-type 8; option broadcast-address 192.168.110.255; option ntp-servers 192.168.0.253; next-server 192.168.110.254;# option root-path "192.168.130.254:/shares/tftp/4.11/gp"; option root-path "192.168.110.254:/shares/tftp/7.2/eliron"; filename "/boot/pxeboot"; option domain-name-servers 192.168.0.19; option domain-name "grand-prix"; option domain-name-servers 192.168.0.251, 192.168.0.19; }
Заливаем сорцы (csup) выбранного релиза, и собираем мир и ядро в директорию, которая будет расшарена по NFS/TFTP, устанавливаем системные конфиги:
router$ mkdir -p /shares/tftp/7.2/elironrouter$ cd /usr/src/router$ make buildworld && make buildkernel && make installworld \? DESTDIR=/shares/tftp/7.2/eliron && make installkernel \? DESTDIR=/shares/tftp/7.2/eliron && \? make distribution DESTDIR=/shares/tftp/7.2/eliron
После сборки мира и ядра, монтируем по nullfs порты и исходные коды ядра, относительно корневой директории будущих тонких клиентов:
router$ mount_nullfs /usr/ports /shares/tftp/7.2/eliron/usr/portsmount_nullfs: /shares/tftp/7.2/eliron/usr/ports: No such file or directoryrouter$ mkdir -p /shares/tftp/7.2/eliron/usr/portsrouter$ mount_nullfs /usr/ports /shares/tftp/7.2/eliron/usr/portsrouter$ mount_nullfs /usr/src /shares/tftp/7.2/eliron/usr/src/
Также, монтируем файловую систему устройств (понадобиться при сборке некоторых портов):
router$ mount -t devfs devfs /shares/tftp/7.2/eliron/dev
Сразу же, копируем некоторые файлы, которые нам понадобяться при дальнейшей работе - или для удобства дальнейшей работы:
router$ cp /root/.cshrc /shares/tftp/7.2/eliron/root/
И рисуем конфиги - резольвера:
router$ cat /shares/tftp/7.2/eliron/etc/resolv.confsearch grand-prixnameserver 192.168.0.251nameserver 192.168.0.19router$
Системного файла сборочной информации - make.conf:
router$ cat /shares/tftp/7.2/eliron/etc/make.conf# kernel configKERNCONF=NFSBOOT# added by lissyara 2007-07-19 in 01:08PORTSDIR?= /usr/ports.if ${.CURDIR} == ${PORTSDIR}/mail/exim# Дефолтовая кодировка заголовковWITH_DEFAULT_CHARSET?= koi8-r# Отключаем IPv6WITHOUT_IPV6= yes# Версия BDB - в чём ведёт свои БД подсказокWITH_BDB_VER= 1# Подержка перекодировки (для заголовков)WITH_ICONV= yes.endif# vim.if ${.CURDIR} == ${PORTSDIR}/editors/vimWITHOUT_X11=yesNO_GUI=yes.endif# GD.if ${.CURDIR} == ${PORTSDIR}/graphics/gdWITH_ICONV=yes.endif# rdesktop.if ${.CURDIR} == ${PORTSDIR}/net/rdesktopWITH_ICONV= yes.endifrouter$
Собственно, на этом моменте я попробовал загрузить одну машину с новой фрёй, но - обломался =) Я собрал GENERIC ядро, а оно по сети не грузиться =) Поэтому, чуть ниже будет ещё одна пересборка ядра, уже из chroot. Теперь можно делать chroot в корневую директорию тонких клиентов, и собирать необходимый софт:
router$ chroot /shares/tftp/7.2/elironrouter$
Ставим rdesktop - для подключения клиента к виндовому серверу терминалов:
router$ setenv BATCH yesrouter$ cd /usr/ports/router$ make -C net/rdesktop install clean
Иксы - полностью:
router$ make -C x11/xorg install clean
Ставим monitord - он будет отслеживать падения rdesktop и перезапускать его при необходимости:
router$ make -C sysutils/monitord install clean
Где-то между делом - пока собираются порты - пересобираем ядро (это я пересобирал - а вы могли просто не собирать на этапе инсталляции клиента). Рисуем конфиг для ядра - оно мало отличается от GENERIC:
router$ mkdir -p /root/scriptsrouter$ cd /usr/src/sys/i386/conf/router$ ln -s /root/scripts/NFSBOOTrouter$ cat /root/scripts/NFSBOOT# thin clients kernel configinclude GENERICident NFSBOOT-GENERIC# цвет консоли - кому как удобней, и буфер консолиoptions SC_NORM_ATTR=(FG_GREEN|BG_BLACK)options SC_KERNEL_CONS_ATTR=(FG_RED|BG_BLACK)options SC_HISTORY_SIZE=2022# как раз опции для поддержки бездисковых клиентовoptions BOOTPoptions BOOTP_NFSROOToptions BOOTP_COMPATrouter$
Также, пишем такие конфигурационные файлы/скрипты - для старта/работы тонкого клиента. Для начала реализуем монтирование/отмонтирование флэшек в тонких клиентах - через devd:
router$ diff -Nru /etc/devd.conf /etc/devd.by.lissyara.conf--- /etc/devd.conf 2009-07-22 18:01:02.000000000 +0000+++ /etc/devd.by.lissyara.conf 2009-07-22 21:01:02.000000000 +0000@@ -325,3 +325,16 @@ action "/etc/acpi_ac $notify"; }; */++# added by lissyara 2009-07-02 in 10:45 MSK+# if inserted flash - mount it+attach 100 {+ device-name "umass[0-9]+";+ action "/root/scripts/mount.da0.sh &";+};+# if usb flash removed - force umount it+detach 100 {+ device-name "umass[0-9]+";+ action "/root/scripts/umount.da0.sh &";+};+router$
Собственно, скрипт монтирования - не забываем сделать исполняемым:
router$ more /root/scripts/mount.da0.sh#!/bin/sh# ждём устаканивания системыsleep 2# опции монтирования - шоп русские имена файлов показало# и запись была синхроннойoptions="-o sync -L ru_RU.KOI8-R -D CP866"# c флэшкой возможны два варианта - da0s1 и da0 - смотря как# оно форматировалось. чаще всего первый, но попадается и второй# добавлено через пару недель: попался и третий вариант =))if test -r /dev/da0s1then device="/dev/da0s1"else if test -r /dev/da0s2 then device="/dev/da0s2" else device="/dev/da0" fifi# запускаем fsck - чтоб не материлось/sbin/fsck_msdosfs -y -p $device# монтируем флэшку/sbin/mount_msdosfs $options $device /mnt# через пару секунд рестартуем hald - бывает виснет =(sleep 2 && /usr/local/etc/rc.d/hald restart &# запускаем sync раз в секунду/root/scripts/sync.sh &router$
Кладём файл делающий sync раз в секунду:
router$ more /root/scripts/sync.sh#!/bin/shecho $? > /tmp/sync.pidwhile truedo sync sleep 1donerouter$
Скрипт выполняющий отмонтирование:
router$ more /root/scripts/umount.da0.sh#!/bin/sh# на всякий случайsync# принудительно отмонтируем флэшкуumount -f /mnt &# ждём пару секундsleep 2# убиваем скрипт выполняющщий синхронизациюkill `cat /tmp/sync.pid`# рестартуем hald/usr/local/etc/rc.d/hald restartrouter$
Рисуем главный конфигурационный файл системы - rc.conf:
router$ cat /etc/rc.conf# rc.conf# Русский язык в консолиfont8x14="cp866-8x14"font8x16="cp866b-8x16"font8x8="cp866-8x8"scrnmap="koi8-r2cp866"# Убираем запуск sendmail (я вообще поставил на тонких клиентов exim :))sendmail_enable="NONE"sendmail_submit_enable="NO"exim_enable="YES"exim_flags="-q60m -oP /var/run/exim.pid"# имя хостаhostname="thin-client"# rootfs in read-onlyroot_rw_mount="NO"# чтоб не пытался сохранять энтропию в файлentropy_file="NO"# файл с hostidhostid_file="/tmp/hostid"# чтоб не обновляло сообщение дняupdate_motd="NO"# нет устройств для дампаdumpdev="NO"# мышьmoused_enable="YES"# var on memoryvarmfs="YES"varsize="2m"populate_var="YES"# tmp on memorytmpmfs="YES"tmpsize="1m"# sshsshd_enable="YES"# на всякий случай - вдруг хард подключу =)fsck_y_enable="YES"# hald and othergnome_enable="YES"hald_enable="YES"#hald_flags="--verbose=yes --daemon=no"dbus_enable="YES"polkitd_enable="YES"# start X trough monitord(8)#monitord_enable="YES"# указываем свой конфиг вместо штатногоdevd_flags="-f /etc/devd.by.lissyara.conf"# пара задумок на будущее. ещё года через три реализую =)# BlueTooth#hcsecd_enable="YES"##fusefs_enable="YES"# bugs =)mkdir -p /var/cache/hald/ >/dev/null 2>&1mkdir -p /var/run/PolicyKit >/dev/null 2>&1/usr/sbin/chown :polkit /var/run/PolicyKit >/dev/null 2>&1/bin/mkdir -p /var/lib/misc >/dev/null 2>&1/usr/bin/touch -f /var/lib/misc/PolicyKit.reload >/dev/null 2>&1/usr/sbin/chown :polkit /var/lib/misc/PolicyKit.reload >/dev/null 2>&1/bin/chmod 0664 /var/lib/misc/PolicyKit.reload >/dev/null 2>&1mkdir -p /var/log/exim >/dev/null 2>&1/usr/sbin/chown 26:6 /var/log/exim >/dev/null 2>&1
Часть 2