Сервер "толстых" терминальных клиентов на ПСПО
Сервер "толстых" терминальных клиентов не требует мощного оборудования. Такое решение хорошо масштабируется, так как использует вычислительные мощности рабочих станций. При этом не требуется установки ПСПО на рабочие станции, а администрирование ограничивается специальной областью на сервере.
Структура класса
И в качестве рабочих станция, и в качестве сервера может выступать любой компьютер, совместимый по требованиям с "Линукс Юниор". Быстродействие сервера зависит только от производительности дисковой подсистемы. Быстродействие клиента зависит от производительности сетевой подсистемы клиента и сервера, а также от качества самой локальной сети и совокупной нагрузки на неё.
Клиент не использует область подкачки (swap), поэтому его ресурсы оперативной памяти строго ограничены аппаратной составляющей. Не рекомендуется запускать на клиенте более пяти крупных приложений (OpenOffice.org, Mozilla Firefox и т. п.) одновременно. Компьютер, совместимый по требованиям с "Линукс Мастер", позволяет работать более или менее без оглядки.
На сервере требуется установить и настроить три службы: сервер автоматической настройки клиентов DHCP, низкоуровневый файловый сервер TFTP и сервер удалённых сетевых дисков NFS. Клиент должен поддерживать загрузку по сети по протоколу PXE (её требуется включить).
Загрузка рабочей станции происходит так:
- сетевая аппаратура клиента получает по DHCP настройки и загружает по TFTP начальный сетевой загрузчик;
- начальный сетевой загрузчик загружает по TFTP ядро Linux и стартовый виртуальный диск;
- сценарий на стартовом виртуальном диске подключает по NFS сетевой диск со всеми файлами операционной системы
- происходит загрузка операционной системы в варианте, похожем на LiveCD
Использование в учебном процессе
Класс "толстых" терминальных клиентов (в предлагаемом варианте)
+ не нужно администрировать нигде, кроме как на сервере;
+ позволяет настроить практически любое окружение рабочей станции;
+ позволяет как угодно изменять систему на рабочей станции (изменения исчезают при перезагрузке);
+ не особо требователен к аппаратным характеристикам сервера;
+ позволяет одновременно использовать несколько разных профилей загрузки рабочей станции
? требует специальных знаний для более тонкой настройки;
? требует дополнительной настройки для поддержки персональных учётных записей на рабочих станциях, в частности -- для постоянного хранения пользовательских файлов на сервере;
- накладывает ограничения на использование оперативной памяти и сетевых ресурсов рабочей станции.
Класс используется на ВМиК МГУ для проведения практикумов по дисциплинам, связанным с ОС Linux, в частности, по курсу "Операционная система Linux и язык программирования Python" в Вечерней математической школе.
Можно применять для:
- Преподавания и работы с Linux в класса с установленным правовладельческим ПО, которое нельзя удалять
- Преподавания и работы с разными вариантами загрузки Linux в одном классе, в т. ч. в режиме свободного доступа в интернет
- Преподавания и практической работы по системному администрированию Linux, требующей существенной модификации установленного окружения
- Самостоятельной работы учащихся
Развёртывание класса
Для развёртывания класса потребуется дистрибутив "Линукс Мастер" двух видов: Установочный (для сервера) и LiveDVD (для клиента). Для маломощных клиентов можно использовать LiveCD версию Лёгкого Линукса.
Ниже приведён список команд и результаты их выполнения. Команды начинаются с "подсказки" командной оболочки -- [root@server ~]# .
Приведённые ниже команды редактирования конфигурационных файлов вида sed -i 's/что_заменить/на_что_заменить/' файл предназначены для потокового текстового редактора sed. Их можно воспроизвести и с помощью обычного текстового редактора (например, mcedit): открыть файл для редактирования (mcedit файл) и заменив там все строчки вида что_заменить на строчки на_что_заменить.
Если пример содержит команду cat имя_файла, но не содержит команд по изменению и/или созданию файла имя_файла, этот файл следует создать с нуля при помощи текстового редактора (например, путём копирования + вставки отсюда).
Действия на сервере
Здесь описывается организация сервера на основе "Линукс Мастер". Ничего специфичного для этого дистрибутива не требуется, поэтому аналогичную структуру можно развернуть на базе любого другого дистрибутива или любой POSIX-совместимой операционной системы.
В нашем примере сервер имеет две сетевые карты: одну -- для выхода в интернет (настраивается как обычно), другую -- для работы с классом (настраивается вручную на адрес 10.3.2.1).
При установке "Линукс Мастер" на сервер (этап "Подготовка диска") необходимо вручную создать отдельную файловую систему в точке монтирования /srv ( не /home) размером, достаточным для размещения всех файлов рабочей станции (в нашем случае -- 8Gb+) при этом параметр "опции монтирования" необходимо исправить на "defaults":
Установка ПО и файлов
- Установить следующие пакеты (необходим установочный DVD):
[root@server ~]# apt-get install tftp-server dhcp-server nfs-server syslinux Reading Package Lists... Done Building Dependency Tree... Done The following extra packages will be installed: dhcp-common The following NEW packages will be installed: dhcp-common dhcp-server nfs-server syslinux tftp-server 0 upgraded, 5 newly installed, 0 removed and 0 not upgraded. Need to get 0B/1527kB of archives. After unpacking 4295kB of additional disk space will be used. Do you want to continue? [Y/n] Media Change: Please insert the disc labeled 'ALT Linux 4.0 Junior DVD (HeyTeacher)' in the drive '/media/cdrom/' and press enter Committing changes... Preparing... ################################################### [100%] 1: syslinux ################################################### [ 20%] 2: dhcp-common ################################################### [ 40%] 3: dhcp-server ################################################### [ 60%] 4: nfs-server ################################################### [ 80%] 5: tftp-server ################################################### [100%] Done.
Развернуть загрузочный образ рабочей станции. Файловая система рабочей станции упакована в файл live на диске LiveCD или LiveDVD. Её следует переложить в каталог /srv/boot на сервере в распакованном виде:
[root@server ~]# df Filesystem Size Used Avail Use% Mounted on /dev/hda2 7.9G 4.5G 3.0G 60% / udevfs 5.0M 68K 5.0M 2% /dev shmfs 157M 0 157M 0% /dev/shm tmpfs 157M 0 157M 0% /tmp /dev/hda5 23G 173M 22G 1% /srv /dev/hdc 1.7G 1.7G 0 100% /media/cdrom [root@server ~]# ls /media/cdrom/ RPM-GPG-KEY index.html live rescue syslinux [root@server ~]# mount -t squashfs -o loop /media/cdrom/live /mnt/cdrom/ [root@server ~]# ls /mnt/cdrom/ bin dev home lib mnt proc sbin sys usr boot etc image media opt root srv tmp var [root@server ~]# mkdir /srv/boot [root@server ~]# cp -a /mnt/cdrom /srv/boot/livefs [root@server ~]# umount /mnt/cdrom
Операция копирования LiveDVD занимает довольно много времени: в распакованном виде /srv/boot/livefs "весит" больше 4 Gb.
- Скопировать первичный загрузчик, ядро и стартовый виртуальный диск для скачивания по TFTP:
[root@server ~]# cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot [root@server ~]# cp -a /media/cdrom/syslinux/alt0 /var/lib/tftpboot [root@server ~]# find /var/lib/tftpboot /var/lib/tftpboot /var/lib/tftpboot/pxelinux.0 /var/lib/tftpboot/alt0 /var/lib/tftpboot/alt0/vmlinuz /var/lib/tftpboot/alt0/full.cz
Настройка сервера
Сетевой интерфейс, отвечающий за класс должен быть заранее настроен вручную. В примере за интернет отвечает интерфейс eth0, а за класс -- eth1:
[root@server ~]# cat /etc/net/ifaces/eth1/options TYPE=eth DISABLED=no BOOTPROTO=static [root@server ~]# cat /etc/net/ifaces/eth1/ipv4address 10.3.2.1/24
Если настройки ещё не сделаны, можно воспользоваться Центром Управления системой или просто создать каталог, соответствующий нужному сетевому интерфейсу (в примере -- /etc/net/ifaces/eth1), а в нём -- два указанных файла, после чего перезапустить сетевую подсистему с помощью service network restart.
Каталог /srv/boot должен быть доступен по NFS на чтение, при этом обращение с правами суперпользователя (root) не должно превращаться в обращение с правами пользователя nobody:
[root@server ~]# echo "/srv/boot *(ro,no_root_squash,no_subtree_check)" > /etc/exports [root@server ~]# cat /etc/exports /srv/boot *(ro,no_root_squash,no_subtree_check) [root@server ~]# service nfs start Exporting NFS file systems: [ DONE ] Starting NFS daemon: [ DONE ] Starting NFS mount service: [ DONE ] [root@server ~]# showmount -e Export list for server.class.altlinux.ru: /srv/boot *
Служба tftp должна быть активна, а метадемон xinetd должен принимать запросы из всей сети, а не только с адреса 127.0.0.1
[root@server ~]# chkconfig tftp on [root@server ~]# sed -i 's/only_from/#only_from/' /etc/xinetd.conf [root@server ~]# cat /etc/xinetd.conf defaults { log_type = SYSLOG authpriv info log_on_success = PID HOST DURATION log_on_failure = HOST instances = 100 per_source = 5 #only_from = 127.0.0.1 } includedir /etc/xinetd.d [root@server ~]# service xinetd restart Service xinetd is not running.[PASSED] Starting xinetd service: [ DONE ]
Служба dhcpd должна уметь обрабатывать запросы из сети класса (10.3.2.1/24):
[root@server ~]# cat /etc/dhcp/dhcpd.conf ddns-update-style none; subnet 10.3.2.0 netmask 255.255.255.0 { option routers 10.3.2.1; option log-servers 10.3.2.1; next-server 10.3.2.1; filename "pxelinux.0"; option root-path "/srv/boot"; range dynamic-bootp 10.3.2.10 10.3.2.63; option subnet-mask 255.255.255.0; default-lease-time 21600; max-lease-time 43200; option domain-name "class.altlinux.ru"; option domain-name-servers 10.0.2.3; } [root@server ~]# service dhcpd restart Service dhcpd is not running.[PASSED] Starting dhcpd service: [ DONE ] [root@server ~]# cat /etc/resolv.conf # Generated by dhcpcd for interface eth0 search class.altlinux.ru nameserver 10.0.2.3
Обратите внимание: параметр "domain-name-servers" в настройке dhcpd совпадает с параметром "nameserver" в настройках самого сервера. Это позволяет, при наличии трансляции адресов на сервере, пользоваться внешним DNS и интернетом в целом.
Первичному загрузчику pxelinux.0 необходимо указать, где брать ядро и стартовый виртуальный диск, и с какими параметрами их загружать:
[root@server ~]# mkdir /var/lib/tftpboot/pxelinux.cfg [root@server ~]# cat /var/lib/tftpboot/pxelinux.cfg/default default live prompt 1 timeout 30 label live kernel alt0/vmlinuz append initrd=alt0/full.cz fastboot live lang=ru_RU showopts automatic=method:nfs,network:dhcp stagename=livefs label harddisk LOCALBOOT -1
Секция label harddisk позволяет при загрузке рабочей станции ввести слово "harddisk", чтобы загрузиться с жёсткого диска, а не из сети.
Настройка клиентского окружения
Если бы файловую систему из LiveCD можно было бы использовать без изменений для сетевой загрузки, хватило бы и нераспакованного файла live (а не каталога livefs). К сожалению, некоторые стартовые сценарии LiveCD не рассчитаны на то, что корневая файловая система будет смонтирована по NFS. Их следует исправить.
Отключить udevd-final. Запуск сценария udevd-final приводит к обрыву сетевого подключения, и все файлы на сетевом диске (следовательно -- все файлы вообще) перестают быть доступны:
[root@server ~]# chroot /srv/boot/livefs /sbin/chkconfig udevd-final off
Обратите внимание на то, как используется команда `chroot`. В каталоге /srv/boot/livefs находятся все файлы будущей корневой файловой системы рабочей станции. Вызов chroot /srv/boot/livefs приводит к тому, что все изменения -- в частности, запрет запуска udevd-final -- касаются только этой файловой системы.
Для ветки 4.1 необходимо также остановить NetworkManager, если он есть
Изменить способ монтирования unionfs. Для того, чтобы GNU/Linux-система могла полноценно работать, необходимо часть каталогов сделать доступными на запись. С содержимым CD этого сделать нельзя, поэтому в LiveCD используется т. н. unionfs: особый "бутерброд" с неизменяемой файловой системой на CD "снизу" и изменяемой виртуальной файловой системой в памяти "сверху", доступный в единой точке монтирования. Чтобы использовать "снизу" в этом бутерброде NFS, вместо параметра "ro" надо применять "nfsro":
[root@server ~]# sed -i 's/=ro/=nfsro/' /srv/boot/livefs/etc/init.d/remount_rw
Для ветки 4.1 эта операция не нужна
Включить настройку сети. Слишком умная сетевая подсистема LiveCD определяет, что сетевая карта уже настроена к моменту старта сетевого сценария, и не трогает её. Рабочая станция загрузится нормально, и даже сервер будет доступен по IP-адресу, но остальные настройки сети -- DNS и маршрутизация -- останутся пустыми. Проще всего запустить DHCP-клиент по новой в конце загрузки, для чего надо вписать команду его запуска в файл /etc/rc.d/rc.local:
[root@server ~]# echo '#!/bin/sh' >> /srv/boot/livefs/etc/rc.d/rc.local [root@server ~]# echo '/sbin/dhcpcd -p -H eth0' >> /srv/boot/livefs/etc/rc.d/rc.local [root@server ~]# chmod +x /srv/boot/livefs/etc/rc.d/rc.local [root@server ~]# cat /srv/boot/livefs/etc/rc.d/rc.local #!/bin/sh /sbin/dhcpcd -p -H eth0
Эта операция не всегда работает в ветке 4.1 и выше: если DHCP-сервер выдаст dhcpcd новый IP-адрес, NFS опять перестанет работать. Поэтому нужно запускать dhcpcd с параметром "-s старый_ip". Например, так:
[root@server ~]# cat /srv/boot/livefs/etc/rc.d/rc.local #!/bin/sh ETHN=eth0 IPN=`ip a s dev $ETHN | sed -n '/inet/{s@.*inet \([0-9.]*\).*@\1@p;q}'` /sbin/dhcpcd -p -H -s $IPN $ETHN
Действия на клиенте и возможные неполадки
Требуется только одно действие (номер "0"), остальные примеры показывают, какие могут возникнуть проблемы.
- Настройка сетевой загрузки в BIOS. Эта часть сильно зависит от конкретной аппаратуры.
- На многих встроенных сетевых картах саму способность сетевой загрузки надо включить, выставив в BIOS параметр "BOOT ROM" (или похожий на него) в положение "Enabled".
- Сетевая карта должна быть первой в последовательности загрузки BIOS (если на рабочей станции есть жесткий диск с установленной ОС, обычно диск указан первым).
- В отдельных сетевых картах можно выбирать тип сетевой загрузки. Мы используем "PXE".
Некоторые сетевые карты, в том числе встроенные и довольно современные, не имеют такой возможности (часто на них явственно отсутствует микросхема BOOT ROM, а вместо неё видны пусиые колодки). Загрузка по сети таких компьютеров (с помощью дискеты, CD или flash) организована в Линукс Терминал; можно также воспользоваться ресурсом Rom-o-Matic.
- Если сетевая загрузка включена, а DHCP-сервер неактивен, наблюдается примерно такая картина:
- По истечении тайм-аута загрузка продолжается с других устройств
- Если DHCP настроен неправильно, или неактивен/недоступен TFTP-сервер, картина примерно такая:
- Если в настройках DHCP указаны неверные параметры, TFTP-клиент выдаст сообщение об ошибке:
Если начальный загрузчик pxelinux.0 найден, но настроен неправильно, он сообщит об этом:
"Лесенка", видимая на картинке, -- это попытки PXELinux скачать конфигурационный файл всё более общего вида (в примере используется последний -- default)
- Если ПО стартового виртуального диска сообщает об ошибке, варианта три: не распозналась сетевая карта, не вполне правильно настроены сетевые параметры в DHCP (в том числе относящиеся к NFS), или сам NFS не работает правильно:
В ПСПО адрес NFS-сервера передаётся нестандартно: не через параметр "root-path" (в котором передаётся только путь на сервере), а через параметр "option log-servers". Если вы не хотите использовать нестандартный параметр, можно передать настройки (сервер и путь для монтирования) в виде параметров ядра в файле pxelinu.cfg/default: ... automatic=method:nfs,network:dhcp,server:адрес_сервера,directory:путь_для_монтирования ... . Обратите внимание, что путь_для_монтирования не содержит самого подкаталога с ФС, этот параметр передаётся с настройкой stagename
Если при старте не изменить параметры монтирования unionfs, в какой-то момент выдаётся множество сообщений "permission denied":
- после чего загрузка останавливается в графическом режиме.
Если при старте не выключен udevd-final, загрузка надолго останавливается после стадии "..." (сразу или шаг-два спустя), сопровождаемая сообщениями "Input/output error":
- То же самое происходит, если не вовремя или неправильно попытаться настроить сеть.
Если сеть совсем не настраивать, рабочая станция загружается и работает, но файл /etc/resolv.conf пуст (следовательно, не работает DNS).
Замеченные недостатки
- Строгое ограничение по оперативной памяти (может быть обойдено созданием swap-раздела на жёстких дисках клиентских машин; см. ниже)
- Плохо работает на некачественных или медленных локальных сетях
На особо медленных серверах иногда не проходит первая загрузка первого клиента в сети; его достаточно просто перезагрузить
Дальнейшая модификация класса
- Установка пароля root
Если на компьютерах имеются жёсткие диски и на них установлена операционная система, стоит задать суперпользователю root в окружении рабочей станции какой-нибудь пароль:
[root@server ~]# chroot /srv/boot/livefs passwd root passwd: updating all authentication tokens for user root. . . . Alternatively, if noone else can see your terminal now, you can pick this as your password: "logic:sell_ablaze". Enter new password: Re-type new password: passwd: all authentication tokens updated successfully.
Рекомендуется воспользоваться паролем, не менее стойким, чем тот, который предлагает утилита passwd (в примере -- "logic:sell_ablaze")
- Запрет записи на жёсткий диск
По умолчанию файловые системы на жёстком диске монтируются с правом записи. Если это нежелательно (в особенности для Windows-систем), стоит поменять в переменных MOUNT_OPTIONS_VFAT и MOUNT_OPTIONS_NTFS3G параметр "rw" на параметр "ro" в сценарии /srv/boot/livefs/etc/init.d/remount_rw:
[root@server ~]# sed -i 's/="rw/="ro/' /srv/boot/livefs/etc/init.d/remount_rw
Если же доступ к жёсткому диску вовсе не нужен, стоит модифицировать этот сцкнарий по-другому (например, удалить из переменной supported_fs упоминания vfat и ntfs).
- Доступ в интернет
- Если сервер имеет доступ в интернет, для предоставления доступа в класс необходимо превратить сервер в маршрутизатор с трансляцией адресов. Это делается изменением всего двух файлов:
[root@server ~]# mkdir -p /etc/net/ifaces/eth0/fw/iptables/nat [root@server ~]# echo '-o ${NAME} -j MASQUERADE' > /etc/net/ifaces/eth0/fw/iptables/nat/POSTROUTING [root@server ~]# sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/' /etc/net/sysctl.conf [root@server ~]# service network restart . . . [root@server ~]# iptables-save # Generated by iptables-save v1.3.7 on Thu Oct 16 23:42:05 2008 *mangle :PREROUTING ACCEPT [3920:404418] :INPUT ACCEPT [3837:372866] :FORWARD ACCEPT [65:25824] :OUTPUT ACCEPT [3280:966006] :POSTROUTING ACCEPT [3399:1005288] COMMIT # Completed on Thu Oct 16 23:42:05 2008 # Generated by iptables-save v1.3.7 on Thu Oct 16 23:42:05 2008 *nat :PREROUTING ACCEPT [50:6731] :POSTROUTING ACCEPT [68:6046] :OUTPUT ACCEPT [64:5819] -A POSTROUTING -o eth0 -j MASQUERADE COMMIT # Completed on Thu Oct 16 23:42:05 2008 # Generated by iptables-save v1.3.7 on Thu Oct 16 23:42:05 2008 *filter :INPUT ACCEPT [246:24798] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [219:32674] :stdin - [0:0] COMMIT # Completed on Thu Oct 16 23:42:05 2008
- Установка и удаление пакетов
Для удаления ненужных пакетов с рабочей станции можно просто запустить apt-get remove:
[root@server ~]# chroot /srv/boot/livefs apt-get remove elinks Reading Package Lists... Building Dependency Tree... The following packages will be REMOVED: elinks 0 upgraded, 0 newly installed, 1 removed and 0 not upgraded. Need to get 0B of archives. After unpacking 2659kB disk space will be freed. Do you want to continue? [Y/n] Committing changes... Preparing... ##########################################################
Для установки пакетов необходимо предварительно настроить список хранилищ apt (например, в /srv/boot/livefs/etc/apt/sources.list)
Обратите внимание, что для установки пакетов с CD внутрь livefs необходимо временно смонтировать при помощи параметра --bind содержимое хранилища внутрь /srv/boot/livefs:
[root@server ~]# mount --bind /media/cdrom /srv/boot/livefs/media/cdrom [root@server ~]# chroot /srv/boot/livefs apt-get install elinks Reading Package Lists... Building Dependency Tree... The following NEW packages will be installed: elinks 0 upgraded, 1 newly installed, 0 removed and 7 not upgraded. Need to get 0B/1098kB of archives. After unpacking 2659kB of additional disk space will be used. Committing changes... Preparing... ########################################################## elinks ########################################################## [root@server ~]# umount /srv/boot/livefs/media/cdrom
- Несколько загрузочных профилей
если подготовить несколько каталогов, аналогичных livefs с различными наборами пакетов и настройками и вписать их в pxelinux.cfg/default в качестве нескольких разделов "label", при загрузке pxelinux.0 можно будет выбрать нужный тип, вписав его название в ответ на подсказку "boot: ". Более удобный выбор можно организовать с помощью дополнительных модулей menu.c32 и vesamenu.c32, входящих в состав пакета syslinux (эти модули достаточно велики и не всеми сетевыми картами поддерживаются хорошо)
- Область подкачки
Область подкачки в LiveCD не создаётся и не используется. Однако её можно создать жёстком диске компьютера в виде раздела или файла, что снимает строгое ограничение на объём оперативной памяти рабочей станции. При однотипных рабочих станциях такое нетрудно сделать. Рекомендуется модифицировать сценарий remount_rw на предмет добавления туда команды swapon нужный_раздел.
- Несколько пользовательских учётных записей и домашний каталог
Можно завести несколько учётных записей для пользователей, используя всё тот же chroot /srv/boot/livefs. Такое действие не имеет смысла без возможности хранить личный файлы на сервере. Это также легко сделать при помощи NFS (монтирование серверного /home/ на запись), однако следует предусмотреть, например, заведение домашних каталогов на сервере (вручную или с помощью всё того же mount --bind) и озаботиться вопросами безопасности.
- Загрузка squashfs-файла
Пакет squashfsprogs, доступный в хранилище "School Branch", позволяет сделать из дерева каталогов squashfs-файл (как на LiveCD). Перед этим следует восстановить параметр монтирования unionfs "=ro" (вместо "=nfsro"). Имя полученного файла указывается в параметре stagename в настройках загрузчика pxelinux.cfg/default. Передача по сети данных из упакованного файла идёт быстрее, чем из дерева каталогов. Такой файл можно хранить на любом, не только Linux, NFS-сервере, на FTP и даже HTTP (в последних случаях требуется много оперативной памяти на рабочей станции, так как файл целиком копируется туда).