Создание бездисковых терминалов Windows RDP (Citrix ICA) на базе FreeBSD 5.0

Не секрет, что для любой организации, где используется большое количество персональных компьютеров с операционной системой Microsoft Windows, головной болью является поддержка программного обеспечения на персональных компьютерах, восстановление после сбоев, вызванных вирусами или неумелыми действиями пользователей, резервное копирование пользовательских документов. Выходом из создавшейся ситуации может стать перевод персональных компьютеров в режим графических терминалов - тонкие клиенты.

[Харун Даниил (kdl@chirt.ru)]

Создание бездисковых терминалов Windows RDP (Citrix ICA) на базе FreeBSD 5.0

Харун Даниил

kdl@chirt.ru

28 апреля 2003 г.

Не секрет, что для любой организации, где используется большое количество персональных компьютеров с операционной системой Microsoft Windows, головной болью является поддержка программного обеспечения на персональных компьютерах, восстановление после сбоев, вызванных вирусами или неумелыми действиями пользователей, резервное копирование пользовательских документов. Также высоки расходы на постоянную модернизацию компьютеров под возростающие требования новых операционных систем. В моем случае - это учебное заведение с компьютерными классами и "дырявой" операционной системой Windows 95. Выходом из создавшейся ситуации может стать перевод персональных компьютеров в режим графических терминалов - тонкие клиенты.

В системе с использованием тонкого клиента по сети на сервер передаются сигналы, отражающие нажатие на ту или иную клавишу либо то или иное движение мыши. А сервер отображает соответствующие изменения на дисплее. В роли клиента может выступать любой ПК, но, поскольку на нем почти не выполняются операции по обработке данных, в качестве тонких клиентов можно применять и недорогие терминалы, не содержащие компоненты с движущимися частями (жесткие диски), оснащенные, как правило, устройствами с весьма ограниченным объемом памяти (ОЗУ).

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

Некоторые прикладные программы плохо приспособлены для типичной среды клиент-сервер, но обычно это не самые важные для бизнеса и образования программы, скажем потоковое видео и игры. В общем следует избегать приложений, предполагающих интенсивные операции по перерисовке экрана, таких, как Adobe Photoshop. То же можно сказать и о прикладных программах с интенсивным использованием памяти и процессора. Как правило, они снижают производительность системы до неприемлемого уровня, ибо претендуют на те же ресурсы ЦП и памяти, что и другие выполняемые на сервере приложения.

Существует немало готовых терминальных решений. Главенствующее положение на рынке средств для платформы тонких клиентов по-прежнему занимают фирмы Citrix (http://www.citrix.com/) и Microsoft - их совокупная доля составляет 90% от общего объема продаж. Особенно сильны позиции этих поставщиков в сегменте изделий для Microsoft Windows 2000. В качестве терминалов можно применять оборудование Wyse (http://www.wyse.com/) или Acer. (~350 $ без дисплея). В Массачусетсском Технологическом Институте разработана клиент-серверная многооконная система X Window System (часто именуемую X), работаюшая в UNIX-подобных системах. Компания Sun Microsystems (http://www.sun.ru/) предлагает свое решение - Sun Ray (http://ru.sun.com/win/products/sunray/).

Но надо исходить из реалей. Благодаря Министерству Образования, Министерству Путей Сообщения и российским "пиратам", повсюду засилье Microsoft и смысл использования Sun Ray или X Window пропадает. Стоимость лицензирования Citrix Metframe XP составляет 14 500 $ за 50 пользовательских лицензий. Причем приобретение лицензий не отменяет необходимость приобретения лицензий Microsoft Windows CAL и Terminal Service CAL.

Приемлемый вариант - использование терминального сервиса Microsoft Windows 2000 Server по протоколу RDP 5. Стоимость лицензирования составит примерно 1 200$ за 30 Open License CAL and terminal service CAL. Но Microsoft предлагает только 32-х и 16-ти разрядные клиенты для Windows, что увеличивает стоимость лицензирования. Существует бесплатный неоффициальный клиент с открытыми исходниками для Unix-систем - rdesktop (http://www.rdesktop.org/). В моем случае уже были в наличии классы с устаревшими компьютерами, и я остановился на ПК с сервером FreeBSD 5.0 и Windows 2000 Server. В принципе, есть красивое решение на базе Linux - LTSP (http://www.ltsp.org/). Но у меня уже был сервер с FreeBSD 5.0 и FreeBSD я знаю лучше, чем Linux.

В этой статье я не предендую на полноту и правильность изложения, возможны ошибки. В работе я опирался на статью Олега Мухутдинова (http://www.freebsd.org.ru/how-to/diskless/diskless.html) на сайте http://www.freebsd.org.ru/ . Все описанное ниже касается операционной системы FreeBSD версии 5.0.

Итак, начнем с клиентского оборудования. Если используем старые персоналки, то это компьютеры с процессором не ниже i486 и с оперативной памятью не ниже 16Мб. Все оборудование должно быть в списке совместимости (файл HARDWARE.TXT на диске с дистрибутивом FreeBSD). Сетевые адаптеры должны поддерживать спецификацию PXE. FreeBSD поддерживает громадный список оборудования, поэтому я понадеялся на "авось" и список совместимости даже не смотрел (это неправильный подход). Также необходимо удостовериться, что X Server будет работать с установленной видеоплатой.

В моем распоряжении были классы с компьютерами двух типов конфигурации:

  • Intel Pentium 150 МГц, ОЗУ 16 Мб, интегрированная видеоплата SiS 5598 (видеопамять адресует из системной), сетевая плата CNet Pro 200 (на чипе Davicom DM9102).
  • Вторая конфигурация - персоналка на базе материнской платы VIA EPIA mini-ITX с процессором VIA EdenЄ ESP 5000, интегрированный сетевой адаптер VIA 10/100 Ethernet LAN, интегрированная AGP2X графика с 2D/3D акселерацией (как оказалось, на чипе Trident Blade 3d). Плата устанавливалась в миниатюрный корпус VIA Cubic с внешним импульсным источником питания. Этот компьютер абсолютно бесшумен, так как в нем отсутсвуют вентиляторы и жесткий диск. Встроенный сетевой адаптер поддерживает спецификацию PXE. На компьютере было установлено 32 Мб оперативной памяти.

Настройка бездисковой станции

Сетевые адаптеры должны поддерживать спецификацию PXE. С VIA EPIA проблем не возникло, т.к. адапер уже имеет поддержку PXE. Практически любая сетевая плата имеет DIP-панельку для установки ПЗУ, на котором прошивается программа для поддержки сетевой загрузки и программу можно получить у саппорта производителя. В моем случае я просто приобрел микросхемы ППЗУ с электрическим стиранием Winbond 27512 (емкостью 512 кбит) и прошил их на программаторе. Подробнее о бездисковой загрузке можно прочитать на сайте http://remoteboot.narod.ru . Настройка бездисковой станции сводится к установке сетевой карты с поддержкой PXE, выбора метода загрузки в BIOS'е и установке параметров в программе конфигурирования сетевой карты. В зависимости от реализации тип загрузки можно выбирать либо из меню очередности загрузки BIOS (выбирать LAN первой), либо в меню конфигурирования сетевой платы (для CNet Pro 200 необходимо было в момент работы POST нажать две клавиши shift одновременно). В любом случае тип загрузки запоминается в КМОП памяти компьютера. Желательно MAC-адрес адаптера записать, он затем понадобиться при конфигурировании сервиса DHCP.

Построение ядра для бездисковых терминалов

Необходимо собрать специальное ядро. Перейдем в каталог /usr/src/sys/i386/conf, скопируем файл GENERIC в DISKLESS. Для экономии памяти можно убрать поддержку неиспользуемых устройств и ненужные опции. Уберем поддержку протокола IPV6, поддержку NFSSERVER, MSDOSFS,CD9660. FFS необходимо оставить для работы виртуального диска в ОЗУ. Добавим опции:

    options         BOOTP           #Use BOOTP to obtain IP address/hostname
    options         BOOTP_NFSROOT   #NFS mount root filesystem using BOOTP info
    options         BOOTP_NFSV3     #Use NFS v3 to NFS mount rootoptions
    options         BOOTP_COMPAT    #Workaround for broken bootp daemons.
    options         NULLFS          #nullfs
   

Т. к. терминалы бездисковые, то уберем поддержку ATA, SCSI, RAID-контроллеров, флоппи-дисководов. Также можно убрать поддержку PCMCIA-устройств, ISA сетевых адаптеров, беспроводных адаптеров, шины USB.

Пример конфигурации ядра FreeBSD 5.0 для бездисковых станций:

machine         i386
cpu             I486_CPU
cpu             I586_CPU
cpu             I686_CPU
ident           DISKLESS
maxusers        0
options         INET                    #InterNETworking
options         FFS                     #Berkeley Fast Filesystem
options         SOFTUPDATES             #Enable FFS soft updates support
options         UFS_ACL                 #Support for access control lists
options         UFS_DIRHASH
options         MD_ROOT                 #MD is a potential root device
options         NFSCLIENT               #Network Filesystem Client
options         NFS_ROOT                #NFS usable as root device
options         PROCFS                  #Process filesystem
options         PSEUDOFS                #Pseudo-filesystem framework
options         COMPAT_43               #Compatible with BSD 4.3
options         COMPAT_FREEBSD4         #Compatible with FreeBSD4

options         KTRACE                  #ktrace(1) support
options         SYSVSHM                 #SYSV-style shared memory
options         SYSVMSG                 #SYSV-style message queues
options         SYSVSEM                 #SYSV-style semaphores
options         _KPOSIX_PRIORITY_SCHEDULING
options         KBD_INSTALL_CDEV        # install a CDEV entry in /dev
options         AHC_REG_PRETTY_PRINT    # Print register bitfields in debug
                                        # output.  Adds ~128k to driver.
options         AHD_REG_PRETTY_PRINT    # Print register bitfields in debug
                                        # output.  Adds ~215k to driver.
options         BOOTP           #Use BOOTP to obtain IP address/hostname
options         BOOTP_NFSROOT   #NFS mount root filesystem using BOOTP info
options         BOOTP_NFSV3     #Use NFS v3 to NFS mount rootoptions
options         BOOTP_COMPAT    #Workaround for broken bootp daemons.
options         NULLFS          #nullfs

options         INVARIANT_SUPPORT

device          isa
device          eisa
device          pci

device          atkbdc          # AT keyboard controller
device          atkbd           # AT keyboard
device          psm             # PS/2 mouse
device          vga             # VGA video card driver
device          splash
device          sc

device          agp             # support several AGP chipsets
device          npx
device          pmtimer

device          sio             # 8250, 16[45]50 based serial ports

device          ppc
device          ppbus           # Parallel port bus (required)
device          lpt             # Printer
device          plip            # TCP/IP over parallel
device          ppi             # Parallel port interface device

device          de              # DEC/Intel DC21x4x (``Tulip'')
device          em              # Intel PRO/1000 adapter Gigabit Ethernet Card
device          txp             # 3Com 3cR990 (``Typhoon'')
device          vx              # 3Com 3c590, 3c595 (``Vortex'')

device          miibus          # MII bus support
device          dc              # DEC/Intel 21143 and various workalikes
device          fxp             # Intel EtherExpress PRO/100B (82557, 82558)
device          pcn             # AMD Am79C97x PCI 10/100 (precedence over 'lnc
')
device          rl              # RealTek 8129/8139
device          sf              # Adaptec AIC-6915 (``Starfire'')
device          sis             # Silicon Integrated Systems SiS 900/SiS 7016
device          ste             # Sundance ST201 (D-Link DFE-550TX)
device          tl              # Texas Instruments ThunderLAN
device          tx              # SMC EtherPower II (83c170 ``EPIC'')
device          vr              # VIA Rhine, Rhine II
device          wb              # Winbond W89C840F
device          xl              # 3Com 3c90x (``Boomerang'', ``Cyclone'')
device          bge             # Broadcom BCM570xx Gigabit Ethernet

device          random          # Entropy device
device          loop            # Network loopback
device          ether           # Ethernet support
device          tun             # Packet tunnel.
device          pty             # Pseudo-ttys (telnet etc)
device          md              # Memory "disks"
device          gif             # IPv6 and IPv4 tunneling
device          faith           # IPv6-to-IPv4 relaying (translation)

device          bpf             # Berkeley packet filter

Создание файловой системы

Создадим файловую систему и файлы конфигурации бездисковых станций. Размещать все будем в каталоге /usr/diskless . Скопируем в /usr/diskless каталоги /bin /boot /sbin /stand /usr/bin /usr/sbin /usr/lib /usr/libdata /usr/libexec /usr/sbin

В каталог /boot поместим новое ядро. Создадим пустые каталоги в /usr/diskless: ./conf ./conf/default ./dev ./etc ./mnt ./proc ./usr/X11R6 ./usr/compat ./usr/home ./usr/share ./usr/local

Создадим символические ссылки

#ln -s /usr/home /usr/diskless/home
#ln -s usr/compat /usr/diskless/home
#ln -s /etc/tmp /usr/diskless/tmp
#ln -s /etc/tmp/var /usr/diskless/var

В каталог /usr/diskless/etc скопируем из /etc следующие файлы

-rw-r--r--  1 root  wheel  disktab
-rw-r--r--  1 root  wheel  hosts
-rw-r--r--  1 root  wheel  inetd.conf
-rw-r--r--  1 root  wheel  pwd.db
-rw-r--r--  1 root  wheel  rc
-rw-r--r--  1 root  wheel  rc.diskless1
-rw-------  1 root  wheel  spwd.db
lrwxr-xr-x  1 root  wheel  termcap -> /usr/share/misc/termcap
-rw-r--r--  1 root  wheel  ttys
Файл intetd.conf сделаем пустым. Монифицируем файл rc.diskless1. В этом файле содержится скрипт, создающий RAM диск емкостью 4 Мб и монтирующий его в /etc. Также скрипт копирует содержимое каталога /conf/default/etc в /etc, а затем содержимое каталога /conf/x.x.x.x/etc в /etc, где x.x.x.x - IP адрес текущей бездисковой станции (например, /conf/10.242.82.10/etc). То есть специфичные настройки конкретной рабочей станции отменяют настройки по умолчанию (естественно, мы должны сделать закрепление IP адресов за конкретными бездисковыми компьютерами в натройках сервиса DHCP). Таким образом мы можем поддерживать разнородное оборудование и настройки для бездисковых станций. Ищем в rc.diskless1 следующие стороки и меняем их:
mount_md() {
        /sbin/mdconfig -a -t malloc -s $1 -u $3
        /sbin/disklabel -r -w md$3 auto
        /sbin/newfs -i 2048 /dev/md$3c
        /sbin/mount /dev/md$3c $2
}
Теперь скрипт будет выделять 2 Мб под /etc . Создадим каталоги в /usr/diskless/conf/default ./etc ./etc/X11 ./etc/defaults ./etc/mtree ./etc/pam.d ./etc/rc.d ./etc/tmp ./etc/tmp/var

Скопируем следующие файлы из каталога /etc соответственно. Содержание каталога /usr/diskless/conf/default/etc/defaults :

-rw-r--r--  1 root  wheel  pccard.conf
-rw-r--r--  1 root  wheel  periodic.conf
-rw-r--r--  1 root  wheel  rc.conf
Содержание каталога /usr/diskless/conf/default/etc/mtree :
-r--r--r--  1 root  wheel  BSD.include.dist
-r--r--r--  1 root  wheel  BSD.local.dist
-r--r--r--  1 root  wheel  BSD.root.dist
-r--r--r--  1 root  wheel  BSD.sendmail.dist
-r--r--r--  1 root  wheel  BSD.usr.dist
-r--r--r--  1 root  wheel  BSD.var.dist
-r--r--r--  1 root  wheel  BSD.x11-4.dist
-r--r--r--  1 root  wheel  BSD.x11.dist

Содержание каталога /usr/diskless/conf/default/etc/pam.d :

-rw-r--r--  1 root  wheel  ftp
-rw-r--r--  1 root  wheel  ftpd
-rw-r--r--  1 root  wheel  gdm
-rw-r--r--  1 root  wheel  imap
-rw-r--r--  1 root  wheel  kde
-rw-r--r--  1 root  wheel  login
-rw-r--r--  1 root  wheel  other
-rw-r--r--  1 root  wheel  passwd
-rw-r--r--  1 root  wheel  pop3
-rw-r--r--  1 root  wheel  rexecd
-rw-r--r--  1 root  wheel  rsh
-rw-r--r--  1 root  wheel  sshd
-rw-r--r--  1 root  wheel  su
-rw-r--r--  1 root  wheel  telnetd
-rw-r--r--  1 root  wheel  xdm
-rw-r--r--  1 root  wheel  xserver
Содержание каталога /usr/diskless/conf/default/etc/rc.d:
-r-xr-xr-x  1 root  wheel  accounting
-r-xr-xr-x  1 root  wheel  addswap
-r-xr-xr-x  1 root  wheel  adjkerntz
-r-xr-xr-x  1 root  wheel  amd
-r-xr-xr-x  1 root  wheel  archdep
-r-xr-xr-x  1 root  wheel  bootparams
-r-xr-xr-x  1 root  wheel  ccd
-r-xr-xr-x  1 root  wheel  cleanvar
-r-xr-xr-x  1 root  wheel  cleartmp
-r-xr-xr-x  1 root  wheel  devd
-r-xr-xr-x  1 root  wheel  devdb
-r-xr-xr-x  1 root  wheel  devfs
-r-xr-xr-x  1 root  wheel  diskless
-r-xr-xr-x  1 root  wheel  dmesg
-r-xr-xr-x  1 root  wheel  dumpon
-r-xr-xr-x  1 root  wheel  inetd
-r-xr-xr-x  1 root  wheel  initdiskless
-r-xr-xr-x  1 root  wheel  initrandom
-r-xr-xr-x  1 root  wheel  kadmind
-r-xr-xr-x  1 root  wheel  kerberos
-r-xr-xr-x  1 root  wheel  keyserv
-r-xr-xr-x  1 root  wheel  ldconfig
-r-xr-xr-x  1 root  wheel  local
-r-xr-xr-x  1 root  wheel  localdaemons
-r-xr-xr-x  1 root  wheel  lomac
-r-xr-xr-x  1 root  wheel  lpd
-r-xr-xr-x  1 root  wheel  motd
-r-xr-xr-x  1 root  wheel  mountcritlocal
-r-xr-xr-x  1 root  wheel  mountcritremote
-r-xr-xr-x  1 root  wheel  mountd
-r-xr-xr-x  1 root  wheel  moused
-r-xr-xr-x  1 root  wheel  msgs
-r-xr-xr-x  1 root  wheel  nfsclient
-r-xr-xr-x  1 root  wheel  nfsd
-r-xr-xr-x  1 root  wheel  nfslocking
-r-xr-xr-x  1 root  wheel  ntpdate
-r-xr-xr-x  1 root  wheel  othermta
-r-xr-xr-x  1 root  wheel  pcvt
-r-xr-xr-x  1 root  wheel  pwcheck
-r-xr-xr-x  1 root  wheel  random
-r-xr-xr-x  1 root  wheel  rarpd
-r-xr-xr-x  1 root  wheel  root
-r-xr-xr-x  1 root  wheel  1rtadvd
-r-xr-xr-x  1 root  wheel  rwho
-r-xr-xr-x  1 root  wheel  savecore
-r-xr-xr-x  1 root  wheel  securelevel
-r-xr-xr-x  1 root  wheel  swap1
-r-xr-xr-x  1 root  wheel  syscons
-r-xr-xr-x  1 root  wheel  sysctl
-r-xr-xr-x  1 root  wheel  1syslogd
-r-xr-xr-x  1 root  wheel  timed
-r-xr-xr-x  1 root  wheel  ttys
-r-xr-xr-x  1 root  wheel  vinum
Содержание каталога /usr/diskless/conf/default/etc :
drwxr-xr-x  2 root  wheel     X11
-rw-r--r--  1 root  wheel     auth.conf
-rw-r--r--  1 root  wheel     csh.login
drwxr-xr-x  2 root  wheel     defaults
-rw-r--r--  1 root  wheel     devd.conf
-rw-r--r--  1 root  wheel     disktab
-rw-rw-r--  1 root  operator  dumpdates
-rw-r--r--  1 root  wheel     fstab
-rw-r--r--  1 root  wheel     ftpusers
-rw-r--r--  1 root  wheel     gettytab
-rw-r--r--  1 root  wheel     group
-rw-r--r--  1 root  wheel     hosts
-r--r--r--  1 root  wheel     localtime
-rw-r--r--  1 root  wheel     login.conf
-rw-r--r--  1 root  wheel     mac.conf
-rw-r--r--  1 root  wheel     make.conf
-rw-r--r--  1 root  wheel     manpath.config
-rw-------  1 root  wheel     master.passwd
-rw-r--r--  1 root  wheel     motd
drwxr-xr-x  2 root  wheel     mtree
-rw-r--r--  1 root  wheel     netconfig
-rwxr-xr-x  1 root  wheel     netstart
-rw-r--r--  1 root  wheel     networks
-rw-r--r--  1 root  wheel     newsyslog.conf
drwxr-xr-x  2 root  wheel     pam.d
-rw-r--r--  1 root  wheel     passwd
-rw-r--r--  1 root  wheel     profile
-rw-r--r--  1 root  wheel     protocols
-rw-r--r--  1 root  wheel     pwd.db
-rw-r--r--  1 root  wheel     rc
-rw-r--r--  1 root  wheel     rc.conf
drwxr-xr-x  2 root  wheel     rc.d
-rw-r--r--  1 root  wheel     rc.devfs
-rw-r--r--  1 root  wheel     rc.diskless2
-rw-r--r--  1 root  wheel     rc.i386
-rw-r--r--  1 root  wheel     rc.network
-rwxr-xr-x  1 root  wheel     rc.resume
-rw-r--r--  1 root  wheel     rc.shutdown
-rw-r--r--  1 root  wheel     rc.subr
-rwxr-xr-x  1 root  wheel     rc.suspend
-rw-r--r--  1 root  wheel     rc.syscons
-rw-r--r--  1 root  wheel     rc.sysctl
-rw-r--r--  1 root  wheel     remote
-rw-r--r--  1 root  wheel     resolv.conf
lrwxr-xr-x  1 root  wheel     rmt -> /usr/sbin/rmt
-rw-r--r--  1 root  wheel     rpc
-rw-r--r--  1 root  wheel     services
-rw-r--r--  1 root  wheel     shells
-rw-------  1 root  wheel     spwd.db
-rw-r--r--  1 root  wheel     sysctl.conf
-rw-r--r--  1 root  wheel     syslog.conf
lrwxr-xr-x  1 root  wheel     termcap -> /usr/share/misc/termcap
drwxr-xr-x  3 root  wheel     tmp
-rw-r--r--  1 root  wheel     ttys
В каталоге /usr/diskless/conf/default/etc находятся общие файлы конфигурации для всех бездисковых станций.

Модифицируем файл /usr/diskless/conf/default/etc/rc.diskless2 . По умолчанию этот скрипт создает RAM диски емкостью 32 Мб для /var и 64 Мб для /tmp . Конечно, это для нас непозволительная роскошь и эти каталоги мы размещаем в /etc/tmp и /etc/tmp/var , куда ссылаются созданные нами ссылки. Модифицируем этот скрипт, закоментировав строки и ветвления, где встречается использование функии mount_md(). Теперь этот скрипт будет создавать подкаталоги в /tmp без создания дополнительных RAM дисков.

Примерное содержимое файла fstab (freebsd - имя хоста, которое должно резольвиться через DNS либо прописано в файле host):

# Device               Mountpoint      FStype  Options         Dump    Pass#
freebsd:/usr/diskless  /               nfs     rw              0       0
freebsd:/usr/X11R6     /usr/X11R6      nfs     ro              0       0
freebsd:/usr/local     /usr/local      nfs     ro              0       0
freebsd:/usr/share     /usr/share      nfs     ro              0       0
freebsd:/usr/compat    /ust/compar     nfs     ro              0       0
proc                   /proc           procfs  rw              0       0

Примерное содержание файла rc.conf:

backgrounf_fsck="NO"
syslogd_enable="NO"
cron_enable="NO"
local_startup="/etc/rc.d.local"
inetd_enable="NO"
kern_securelevel_enable="NO"
linux_enable="NO"
sendmail_enable="NO"
sshd_enable="NO"
usbd_enable="NO"
keymap="ru.koi8-r"
keychange="61 ^[[K"
scrnmap="koi8-r2cp866"
font8x16="cp866b-8x16"
font8x14="cp866-8x14"
font8x8="cp866-8x8"
Создадим файлы подкачки для бездисковых станций в каталоге /usr/swap .
# mkdir /usr/swap
# dd if=/dev/zero bs=1024 count=16384 of=/home/swap/swap.10.242.82.10
# chmod 0600 /usr/swap/swap.10.242.82.10

Настройка экспорта файловой системы NFS (сетевая файловая система)

Добавим в файл /etc/rc.conf следующие строки:

rpcbind_enable="YES"
nfs_server_enable="YES"
nfs_server_flags="-u -t -n 40 -h 10.242.82.4 -h 10.242.85.4"
Ключ -n определяет количество подключений, ключ -h определяет, какие интерфейсы демон nfsd будет обслуживать, ключ -t включает поддержку TCP соединений. Создадим файл /etc/exports и добавим в него описания экспорта файловой системы:
/usr/diskless /usr/swap         -maproot=0 -network 10.242.0.0 -mask 255.255.0.0
/usr/local /usr/share /usr/compat /usr/X11R6 -ro -network 10.0.0.0 -mask 255.0.0.0
После этого (необходимо перезагрузить сервер) нужно проверить, правильно ли экспортировались файловые системы:
# showmount -e
Exports list on localhost:
/usr/swap                          10.242.0.0
/usr/share                         10.0.0.0
/usr/local                         10.0.0.0
/usr/diskless                      10.242.0.0
/usr/compat                        10.0.0.0
/usr/X11R6                         10.0.0.0

Настройка сервиса DHCP

DHCP сервер будет использовать реализацию isc-dhcp для FreeBSD. В принципе, можно использовать любой другой сервер DHCP, но у меня почему-то не получилось заставить понимать бездисковую станцию опции на сервере Microsoft DHCP, указывающие на каталог начальной загрузки. Для установки isc-dhcp обновим порты и сделаем установку порта /usr/ports/net/isc-dhcp3 . Создадим файл конфигурации /usr/local/etc/dhcpd.conf :

default-lease-time 600;
max-lease-time 7200;

option swap-path code 128 = string;
option swap-size code 129 = integer 32;

authoritative;
#ddns-update-style ad-hoc;
ddns-update-style none;


subnet 10.242.82.0 netmask 255.255.255.0 {
  option domain-name "terminals.company.ru";
  option routers 10.242.82.1;
  range 10.242.82.100 10.242.82.254;
  option subnet-mask 255.255.255.0;
  option broadcast-address 10.242.82.255;
  option domain-name-servers 10.242.82.2;
  option netbios-name-servers 10.242.82.2;
  next-server 10.242.82.4;
  filename "pxeboot";
  option root-path "10.242.82.4:/usr/diskless";
  option swap-path "10.242.82.4:/usr/swap";
  option swap-size 16384;
   host term00.terminals.company.ru {
    hardware ethernet 00:80:AD:00:0B:0A;
    fixed-address 10.242.82.10;
    option host-name "term00.terminals.company.ru";
  }
  host term01.terminals.company.ru {
    hardware ethernet 00:80:ad:00:11:d7;
    fixed-address 10.242.82.11;
    option host-name "term01.terminals.company.ru";
  }
  host term02.terminals.company.ru {
    hardware ethernet 00:80:ad:00:07:a0;
    fixed-address 10.242.82.12;
    option host-name "term02.terminals.company.ru";
  }
}
Запустим демон dhcpd :
#/usr/local/etc/rc.d/isc-dhcpd.sh start
Также желательно для каждой бездисковой станции создать запись A в соответствующей зоне DNS и запись PTR в обратной зоне.

Настроим также сервер TFTP. По протоколу TFTP бездисковая станция получит загрузчик pxeboot . Добавим в /etc/inetd следующую строку: tftp dgram udp wait root /usr/libexec/tftpd tftpd -s /tftpboot

Создадим каталог в корне /tftpboot и скопируем туда файл /boot/pxeboot. Пошлем процессу inetd сигнал HUP.

Конфигурирование пользователей

Теперь, если нет никаких ошибок, запустим бездисковую станцию. Дальнейшее конфигурироване продолжим с консоли бездисковой станции. Войдем под именем root и изменим пароль. Теперь пароль суперпользователя на сервере и на бездисковых станциях будет разный, так как для бездисковой станции используются файлы passwd,master.passwd, spwd.db и pwd.db, отличные от серверных. Создадим пользователя терминалов коммандой adduser :

# adduser
Username: tuser
Full name: Terminal User
Uid (Leave empty for default):1015
Login group [tuser]:
Login group is tuser. Invite tuser into other groups? []:
Login class [default]:
Shell (sh csh tcsh) [sh]:
Home directory [/home/tuser]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username   : tuser
Password   :
Full Name  : Terminal User
Uid        : 1005
Class      :
Groups     : tuser
Home       : /home/tuser
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (tuser) to the user database.

Необходимо использовать uid отличный от пользователей сервера. Новый пользователь имеет пустой пароль и домашний каталог. Теперь настроим автоматический логин, чтобы при включении бездискового компьютера выполнялся автоматический вход пользователя tuser . Создадим тип терминалла getty, добавив следующие строки в файл /etc/gettytab :

#
# autologin - automatically log in as Terminal user
#

tuserlogin|tu.9600:\
        :al=tuser:tc=std.9600:

   Теперь отредактируем файл /etc/ttys, задав вход на нулевой консоли и
   отключим лишиние консоли для экономии памяти:
ttyv0   "/usr/libexec/getty tuserlogin" cons25r on  secure
#ttyv0  "/usr/libexec/getty Pc  "       cons25r on  secure
# Virtual terminals
ttyv1   "/usr/libexec/getty Pc"         cons25r on  secure
ttyv2   "/usr/libexec/getty Pc"         cons25r off secure
ttyv3   "/usr/libexec/getty Pc"         cons25r off secure
ttyv4   "/usr/libexec/getty Pc"         cons25r off secure
ttyv5   "/usr/libexec/getty Pc"         cons25r off secure
ttyv6   "/usr/libexec/getty Pc"         cons25r off secure
ttyv7   "/usr/libexec/getty Pc"         cons25r off secure
ttyv8   "/usr/X11R6/bin/xdm -nodaemon"  xterm   off secure
Не забываем, что все настройки в /etc после перезагрузки забудутся так как файловая система /etc размещается в оперативной памяти, поэтому необходимо содержимое каталога скопировать в /conf/default/etc .

Настройка X Window

После перезагрузки зайдем на консоль ttyv1 под именем root. На сервере система X Window уже должна быть установлена. Настройку X Window делаем обычным способом (можно воспользоваться командой xf86cfg, xf86cfg -textmode, xf86config). Желательно использовать 16-битный цветовой режим. Так как файловая система /etc размещается в оперативной памяти, после настройки и проверки командой XFree86 скопируем файл /etc/X11/XF86Config в каталог/conf/default/etc/X11/ или /conf/10.242.82.10/etc/X11/ для того, чтобы он не был утерян при следующей загрузке. В качестве терминального клиента Microsoft Windows RDP будем использовать программу rdesktop (http://www.rdesktop.org/). На текущий момент стабильная версия - 1.2.0. Установим ее на сервере из обновленных портов /usr/ports/net/rdesktop. Снова пересядем на консоль бездисковой станции, зайдем в каталог /home/tuser и создадим там скрипт .xinitrc, не забыв сделать его исполняемым:

while true
do
  rdesktop -f server.company.ru
done
exit0
где server.company.ru - имя терминальнго сервера Windows. Затем командой vipw изменим шелл пользователя tuser на /usr/X11R6/bin/startx. Снова не забываем, что все настройки в /etc после перезагрузки забудутся так как файловая система /etc размещается в оперативной памяти. Перезагружаем бездисковую станцию. Если ошибок нет, то вместо шелла пользователя загрузится X Windows и автоматически запустится rdesktop . Также можно использовать клиент Citrix ICA для Linux. Его можно установить из портов на сервере. Для его работы нужно включить поддержку бинарного кода Linux, изменить файл .xinitrc и создать необходимые настройки клиента Citrix ICA.

Оригинал статьи расположен по адресу: http://www.opennet.ru/base/X/bsd_diskless.txt.html.

[ опубликовано 26/11/2003 ]

Харун Даниил (kdl@chirt.ru) - Создание бездисковых терминалов Windows RDP (Citrix ICA) на базе FreeBSD 5.0   Версия для печати