Linux Terminal Server Project (LTSP) — свободно распространяемый пакет для Linux с открытым исходным кодом, позволяющий пользователям с маломощными компьютерами (терминалами) использовать вычислительные мощности одного более производительного компьютера (сервера). При этом все приложения запускаются на сервере, а терминалы, также называемые тонкими клиентами (или X-терминалами), просто принимают видеоряд, посылаемый сервером, и кроме него ничего не обрабатывают. Как правило, терминал представляет собой маломощный компьютер, в котором даже может отсутствовать жесткий диск, вследствие чего он может работать тише и потреблять меньше энергии, чем обычный настольный компьютер.

Для передачи клиентам первичной информации (сетевой адрес терминала, адрес, к которому должен подключаться терминал) дложна использоваться службы DHCP. Далее рассматриваются два варианта настройки:

  • служба dnsmasq - упрощенная служба, устанавливается вместе с сервером LTSP, включает в свой состав простой TFTP-сервер, и позволяет быстро настроить нужные параметры для работы терминалов;
  • служба isc-dhcp-server  - полноценная служба DHCP, обычно применяется в больших сетях.

При соотвествующей настройке могут использоваться и другие службы (например, служба DHCP, встроенная в маршрутизатор сети).

Подключение клиентов осуществляется по протоколу SSH (рекомендованный вариант), или по протоколу xRDP.

Входящая в состав Astra Linux версия LTSP поддерживает два режима работы клиентов:

  • "Тонкий клиент" - По сети загружается минимальный образ с базовой системой и графическим сервером. Приложения выполняются на сервере терминалов, результаты работы передаются по сети графическому серверу на дисплей терминального клиента. Дополнительно в этом режиме поддерживается возможность выполнения отдельных приложений на тонком клиенте (подробнее см. https://manpages.ubuntu.com/manpages/trusty/man5/lts.conf.5.html ).

  • "Толстый клиент" - Загружается полноценный образ с ОС. Приложения выполняются непосредственно на терминальном клиенте, а сервер просто предоставляет доступ к пользовательским данным и программам.


В принципе "тонкий клиент" от "толстого" отличается только местом исполнения, и режим исполнения может выбираться при запуске. Важным отличием "толстого" клиента является возможности установки в образ этого клиента дополнительных приложений.

По умолчанию клиент загружается в "тонком" режиме. Клиент загружается в "толстом" режиме (chroot в клиентскую систему) после установки в клиентский образ менеджера рабочего стола (fly-wm). Кроме того, для указания режима загрузки клиентов можно использовать опцию LTSP_FATCLIENT=true/false (по умолчанию не задана) в файле /var/lib/tftpboot/ltsp/amd64/lts.conf на сервере терминалов (подробнее см. https://manpages.ubuntu.com/manpages/trusty/man5/lts.conf.5.html ).


Данная статья применима к:

  • ОС ОН Орёл 2.12 (2.12.24 и выше)
  • ОС СН Смоленск 1.6 (с установленным обновлением безопасности Update5 и выше)


В данной статье описывается работа с LTSP версии 5.18.12-3.1astra3, позволяющей создавать гостевые образы ОС ОН Орёл и ОС СН Смоленск на любой из этих ОС (по умолчанию создается гостевой образ соответствующий текущей хост-системе).  Эта версия доступна для установки из репозитория пакетов ОС ОН Орёл.


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


Настройка сетевых интерфейсов

Типичный сервер LTSP имеет два сетевых интерфейса:

  • Первый интерфейс (eth0) подключен к Интернет, и настройки получает автоматически;
  • Второй интерфейс (eth1) подключен к локальной сети, и ему присвоен статический адрес (для примера 192.168.56.10 с маской 24). Через этот интерфейс осуществляется подключение клиентских машин (также находящихся в локальной сети).

Сетевые интерфейсы настраиваем любым предпочтительным способом, например, с помощью Network Manager.

Включение удаленного доступа

Для работы сервера LTSP нужно разрешить удаленный вход в систему:

"Панель управления" → "Система" → "Вход в систему" → "Дополнительно" - "Разрешить удаленный вход в систему"


Установка пакетов


Предполагается, что перед установкой пакетов правильно подключены и настроены репозитории (установочные диски).

Для установки пакетов на ОС СН Смоленск необходимы:

  • установочный диск;
  • диск со средствами разработки;
  • образ обновления установочного диска (update-iso);
  • образ обновления диска со средствами разработки (update-dev-iso).


Установка пакетов может быть выполнена с помощью графического менеджера пакетов или из командной строки командой:

sudo apt install ltsp-server-standalone xrdp ssh

При установке пакета ltsp-server-standalone автоматически будет установлен пакеты ltsp-server - набор сценариев для создания сервера терминалов.

Установка пакета xrdp необязательна, и нужна для поддержки работы по протоколу xRDP в дополнение к протоколу SSH.


Настройка служб DHCP

Не нужно настраивать обе службы (dnamsq и isc-dhcp-server), достаточно одной из них. Если в сети уже присутствует служба DNS, то следует использовать уже существующую службу, дополнив её настройки как указано ниже. Если используемая служба DHCP не поддерживает необходимые для терминального сервера настройки (например, встроенная служба DHCP сетевого маршрутизатора), следует рассмотреть возможность замены этой службы. 
По возможности не следует использовать упрощенную службу dnsmasq, лучше сразу переходить к настроке и использованию полноценной службы isc-dhcp-server.

Установка и настройка службы dnsmasq

  1. Установить службу dnsmasq:

    sudo apt install dnsmasq



  2. Создать файл /etc/dnsmasq.d/ltsp-server-dnsmasq.conf конфигурации службы dnsmasq командой :

    sudo ltsp-config --overwrite dnsmasq


  3. Отредактировать файл конфигурации /etc/dnsmasq.d/ltsp-server-dnsmasq.conf:

    В конфигурационном файле, устанавливаемом по умолчанию, имеются параметры использования proxy:

    dhcp-range=192.168.56.0,proxy
    dhcp-range=192.168.122.0,proxy

    Для получения работоспособной конфигурации эти параметры следует отключить (или использовать пример конфигурационного файла, приведённый ниже).


    Минимальные исправления - указать диапазон адресов, выдаваемых сервером DHCP (в пример ниже отмечено выделением):

    # Configures dnsmasq for PXE client booting.
    # All the files in /etc/dnsmasq.d/ override the main dnsmasq configuration in
    # /etc/dnsmasq.conf.
    # You may modify this file to suit your needs, or create new ones in dnsmasq.d/.
    #interface=eth1
    # Log lots of extra information about DHCP transactions.
    #log-dhcp
    # IP ranges to hand out.
    dhcp-range=192.168.56.20,192.168.56.250,8h
    # The rootpath option is used by both NFS and NBD.
    dhcp-option=17,/opt/ltsp/amd64
    # Define common netboot types.
    dhcp-vendorclass=etherboot,Etherboot
    dhcp-vendorclass=pxe,PXEClient
    dhcp-vendorclass=ltsp,"Linux ipconfig"
    # Set the boot filename depending on the client vendor identifier.
    # The boot filename is relative to tftp-root.
    dhcp-boot=net:pxe,/ltsp/amd64/pxelinux.0
    dhcp-boot=net:etherboot,/ltsp/amd64/nbi.img
    dhcp-boot=net:ltsp,/ltsp/amd64/lts.conf
    # Kill multicast.
    dhcp-option=vendor:pxe,6,2b
    # Disable re-use of the DHCP servername and filename fields as extra
    # option space. That's to avoid confusing some old or broken DHCP clients.
    dhcp-no-override
    # The known types are x86PC, PC98, IA64_EFI, Alpha, Arc_x86,
    # Intel_Lean_Client, IA32_EFI, BC_EFI, Xscale_EFI and X86-64_EFI
    pxe-service=X86PC, "Boot from network", /ltsp/amd64/pxelinux
    # Comment the following to disable the TFTP server functionality of dnsmasq.
    enable-tftp
    # The TFTP directory. Sometimes /srv/tftp is used instead.
    tftp-root=/var/lib/tftpboot/
    # Disable the DNS server functionality of dnsmasq by setting port=0


  4. Перезапустить сервис dnsmasq командой:

    sudo systemctl restart dnsmasq



Настройка службы isc-dhcp-server

  1. Создать конфигурационный файл /etc/ltsp/dhcpd.conf, выполнив на сервере терминалов команду:

    sudo ltsp-config --overwrite isc-dhcp-server

    При этом будет создан конфигурационный файл /etc/ltsp/dhcpd.conf следующего вида:

    #
    # Default LTSP dhcpd.conf config file.
    #
    
    authoritative;
    
    subnet 192.168.67.0 netmask 255.255.255.0 {
      range 192.168.67.20 192.168.67.250;
      option domain-name "example.com";
      option domain-name-servers 192.168.67.1;
      option broadcast-address 192.168.67.255;
      option routers 192.168.67.1;
      next-server 192.168.67.1;
    # get-lease-hostnames true;
      option subnet-mask 255.255.255.0;
      option root-path "/opt/ltsp/amd64";
      if substring( option vendor-class-identifier, 0, 9 ) = "PXEClient" {
        filename "/ltsp/amd64/pxelinux.0";
      } else {
        filename "/ltsp/amd64/nbi.img";
      }
    }

    Указанные в полученном файле сетевые адреса и сетевые маски следует заменить на актуальные.

  2. Если в используемой сети нет службы DHCP, а служба DHCP нужна только для сервера терминалов и не используется более ни для чего, то после внесения актуальных сетевых адресов и масок полученный на предыдущем шаге файл можно использовать как файл конфигурации службы isc-dhcp-server, просто скопировав его в каталог /etc/dhcp/:

    sudo mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.bak
    sudo cp /etc/ltsp/dhcpd.conf /etc/dhcp/dhcpd.conf
    sudo systemctl restart isc-dhcp-server

    Если служба DHCP используется для иных целей (в том числе, если используется служба, отличная от isc-dhcp-server), то параметры next-server, option root-path и блок if substring( option vendor-class-identifier, 0, 9 ) = "PXEClient"  из полученного файла /etc/ltsp/dhcpd.conf должны быть перенесены в конфигурацию используемой службы. 


Создание образа тонкого клиента

Для создания образа тонкого клиента используется сценарий ltsp-build-client. Особенности применения сценария зависят от создаваемой гостевой ОС (ОС СН Astra Linux SE или ОС ОН Astra Linux CE):

ОС ОН Орёл

В ОС ОН Орёл по умолчанию для сборки образа будет использоваться тот же дистрибутив и/или архитектура что и на серверной системе, и сценарий сборки образа в простейшем случае может быть вызван без параметров:

sudo ltsp-build-client

Если предполагается использовать графическую оболочку, то следует сразу установить пакет fly-all-main:

sudo ltsp-build-client --early-packages fly-all-main

Возможные необязательные параметры:

--chroot <название папки> - название папки с образом относительно каталога /opt/ltsp/ (по умолчанию - amd64);

--dist <название дистрибутива> - задаёт для сборки дистрибутив, отличный от используемого по умолчанию дистрибутива серверной системы. Поддерживаются два варианта: orel или smolensk;

--mirror <url> - задаёт для сборки другое расположение зеркала репозитория, из котрого нужно ставить систему (по умолчанию http://dl.astralinux.ru/astra/current/orel/repository);

--early-packages <название пакетов> — установка в клиентский образ дополнительных пакетов.

В опции --early-packages названия дополнительных пакетов должны быть указаны через запятую без пробелов.




ОС СН Смоленск

В ОС СН Смоленск для сборки образа нужно настроить репозиторий или примонтировать установочный диск (или образ диска) Astra Linux Special Edition релиз "Смоленск" версии 1.6. Например, образ установочного диска в файле smolensk-1.6-20.06.2018_15.56.iso можно примонтировать командой

sudo mount -o loop smolensk-1.6-20.06.2018_15.56.iso /media/cdrom

Для успешной сборки системы необходимы:

  • установочный диск;
  • диск со средствами разработки;
  • образ обновления установочного диска (update-iso);
  • образ обновления диска со средствами разработки (update-dev-iso).

Сборка образа для ОС СН Смоленск осуществляется командой:

sudo ltsp-build-client --update-bin <путь_к_update-iso> --update-dev <путь_к_update-dev-iso>

При этом, в дополнение к необязательным опциям сценария сборки, применяемым в ОС ОН Орёл, в ОС СН Смоленск используются две обязательные опции:

--update-bin - path/to/iso образ репозитория с обновлением smolensk;
--update-dev - path/to/iso iso образ репозитория с обновлением smolensk-devel.

Если предполагается использовать графическую оболочку, то следует сразу установить пакет fly-all-main (так же, как в ОС ОН Орёл, использовать опцию --early-packages).

В ОС СН Смоленск помимо устанавливаемых в ОС ОН Орёл пакетов будут установлены пакеты parsec и linux-astra-modules. В процессе работы сценария будут появляться запросы на установку/монтирование необходимых дисков в каталог /media/cdrom.

После завершения работы образ системы будет записан в /opt/ltsp/images. Распакованная система будет расположена в каталоге /opt/ltsp/amd64, или в том подкаталоге каталога /opt/ltsp/, который был указан с помощью необязательной опции --chroot.

Настройка образа тонкого клиента

Опционально в отладочных целях рекомендуется обновить каталоги пакетов и задать пароль для локального администратора в клиентском образе (вместо <adminname> указать имя администратора): 

[ -d /parsecfs ] && [ -d /opt/ltsp/amd64/parsecfs ] && sudo mount --bind /parsecfs /opt/ltsp/amd64/parsecfs
sudo ltsp-chroot -m
apt update
useradd -g adm -G sudo -s /bin/bash -m <adminname>
passwd <adminname>
exit
[ -d /parsecfs ] && [ -d /opt/ltsp/amd64/parsecfs ] && sudo umount /opt/ltsp/amd64/parsecfs

В приведённом выше примере первая и последняя команды (монтирование и размонтирование файловой системы /parsecfs) нужны (и сработают) только в ОС СН Смоленск для образов ОС СН Смоленск, в ОС ОН Орел и для образов ОС ОН Орел они не нужны. При этом подразумевается, что распакованная система находится в каталоге /opt/ltsp/amd64/, если это не так, то эти команды монтирования и размонтирования нужно изменить соответствующим образом.

Если ранее не был установлен пакет fly-all-main (или какой-то другой нужный пакет), то его можно доустановить в любой момент:

sudo ltsp-chroot -m apt install fly-all-main

При необходимости для команды ltsp-chroot может быть указан дополнительный параметр -a <имя каталога>, задающий расположение образа (аналогично параметру --chroot команды ltsp-build-client);

Обновить созданный образ:

sudo ltsp-update-image

Перезапустить службы nbd-server, sshd, xrdp:

sudo systemctl restart nbd-server sshd xrdp

По умолчанию для клиентов используется файл конфигурации, находящийся в образе терминального клиента (/opt/ltsp/amd64/etc/lts.conf).
Опционально рекомендуется создать отдельный файл конфигурации по умолчанию для LTSP клиентов:

sudo ltsp-config --overwrite lts.conf

После создания файла конфигурации на сервере терминалов для клиентов будет использоваться файл /var/lib/tftpboot/ltsp/amd64/lts.conf.

Создание и настройка образа толстого клиента

Для создания образа толстого клиента нужно:
  1. Создать и настроить образ тонкого клиента по описанной выше процедуре или создать сразу образ толстого клиента:

    sudo ltsp-build-client --fat-client-desktop fly-wm --late-packages sudo,mc

    Где параметры:

    --fat-client-desktop - название рабочего стола (fly-wm)

    --late-packages - название дополнительных пакетов, отсутствующих в стандартном наборе для создания тонкого клиента (в данном примере - пакеты sudo и mc)

    В параметре --late-packages названия дополнительных пакетов должны быть указаны через запятую без пробелов.

    Дополнительно может быть указан необязательный параметр --chroot с именем каталога для размещения образа.

  2. Если используется образ тонкого клиента, то установить в него основные пакеты Fly:

    sudo ltsp-chroot -m apt install fly-all-main

    При необходимости для команды ltsp-chroot может быть указан дополнительный параметр -a <имя каталога>, задающий расположение образа (аналогично параметру --chroot команды ltsp-build-client);


  3. Аналогично, с помощью команды ltsp-chroot -m apt install установить в созданный образ опциональные метапакеты (или же необходимые пакеты по отдельности):

    • Метапакет fly-all-optional - включает в себя пакеты ark, clementine, compton, fly-admin-iso, fly-fm-crypt, gparted, guvcview, kgpg, librsvg2-bin, qapt-deb-installer, qbat, recoll, speedcrunch, synaptic, vlc, vlc-astra, vlc-l10n, vlc-plugin-access-extra, xca, yelp;

    • Метапакет fly-all-games - включает в себя пакеты klines, kmines, kpat, supertux, warzone2100, xonotic;

    • Пакет libreoffice -  кроссплатформенный, свободно распространяемый офисный пакет с открытым исходным кодом;

    • другие необходимые пакеты;

  4. Если был установлен fly-dm, то запретить его автозапуск:

    sudo ltsp-chroot -m systemctl disable fly-dm

    При необходимости для команды ltsp-chroot может быть указан дополнительный параметр -a <имя каталога>, задающий расположение образа (аналогично параметру --chroot команды ltsp-build-client);


  5. В используемом файле конфигурации клиента (/opt/ltsp/amd64/etc/lts.conf или /var/lib/tftpboot/ltsp/amd64/lts.conf) изменить значение параметра LDM_SESSION на default (добавить параметр, если его нет), и добавить параметр LDM_PASSWORD_HASH для корректной работы блокировщика экрана:

    # If you're using Unity, you might want to install gnome-session-fallback and
    # use it by default instead, as it performs better on LTSP thin clients.
    LDM_SESSION="default"
    LDM_PASSWORD_HASH=True


  6. Обновить ранее собранный образ клиента:

    sudo ltsp-update-kernels <ARCH> && sudo ltsp-update-image <ARCH>

    где вместо <ARCH> указать название каталога, в котором находятся файлы для сборки (каталог указывается относительно каталога /opt/ltsp/ и, если не указать ничего - то будет использована архитектура amd64, т.е. будет использован  каталог /opt/ltsp/amd64/)

Настройка удалённых подключений XDMCP и RDP

По умолчанию подключение осуществляется с использованием оконного менеджера ldm.

Для подключения по протоколу XDMCP:

В ОС СН Смоленск 1.6 заменить в файле /opt/ltsp/amd64/usr/share/ltsp/screen.d/xdmcp строку

X_ARGS="$X_ARGS -query ${XDM_SERVER}"

на

X_ARGS="$X_ARGS -query ${XDM_SERVER} -displayID 0:63:0x0:0x0"

В ОС ОН Орёл выполнение указанных действий не требуется.

Для rdp подключений в файле /opt/ltsp/amd64/usr/share/ltsp/screen.d/xfreerdp последнюю строку привести к виду

exec xinit /usr/share/ltsp/xinitrc /usr/local/bin/rdp.sh -- "$DISPLAY" "vt${TTY}" -nolisten tcp $X_ARGS >/dev/null

Создать файл /opt/ltsp/amd64/usr/local/bin/rdp.sh (указать актуальный IP-адрес):

#!/bin/bash
userdata=$(zenity --forms --title="Вход на сервер" --text="Форма авторизации" --add-entry="Логин:" --add-password="Пароль:");
userlogin="`echo $userdata|cut -d '|' -f 1`";
userpassword="`echo $userdata|cut -d '|' -f 2`";
xfreerdp /v:192.168.56.100 /cert-ignore +sec-nla /d:example.com /u:$userlogin /p: $userpassword /f /drive:usb,/media /network:lan /printer

И сделать созданный файл /opt/ltsp/amd64/usr/local/bin/rdp.sh исполняемым:

chmod +x /opt/ltsp/amd64/usr/local/bin/rdp.sh

Выполнить команды:

sudo ltsp-chroot systemctl disable fly-dm
sudo ltsp-chroot -m update-initramfs -uk all
sudo ltsp-config --overwrite lts.conf

Файл /var/lib/tftpboot/ltsp/amd64/lts.conf привести к следующему виду (исправив IP-адреса на актуальные):

[default]
  LTSP_CONFIG=True
  LOCALDEV=True
  HOTPLUG=True
  DNS_SERVER=192.168.56.100
  SOUND=True
  MIC_VOLUME=0
  CAPTURE_VOLUME=100
  CAPTURE_SWITCH=toggle
  TIMEZONE=Europe/Moscow
  TIMESERVER=192.168.56.100
  SYSLOG_HOST=192.168.56.100
  NBD_SWAP=False
  #NBD_SWAP_SERVER=192.168.56.100
  #CONFIGURE_X=False
  SCREEN_07=xfreerdp
  PRINTER_0_DEVICE=/dev/usb/lp0
  PRINTER_0_TYPE=U


Для того, чтобы по умолчанию подключение выполнялось по XDMCP опцию SCREEN_07=xfreerdp следует изменить на SCREEN_07=xdmcp.


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

Дополнение: настройка автомонтирования usb-устройств

Создать файл /opt/ltsp/amd64/etc/udev/rules.d/udev.rules:

ACTION=="add", KERNEL=="sd[a-z][0-9]", TAG+="sy sudo mount --bind /persecfs /opt/ltsp/<name>/parsecfsstemd", ENV{SYSTEMD_WANTS}="usbstick-handler@%k"

Создать unit для запуска:

[Unit]
Description=Mount USB
BindsTo=dev-%i.device
After=dev-%i.device
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/automount %I
ExecStop=/usr/bin/pumount /dev/%I

Создать сценарий монтирования:

#!/bin/bash

PART=$1
FS_LABEL=`lsblk -o name,label | grep ${PART} | awk '{print $2}'`

if [ -z ${FS_LABEL} ]
then
/usr/bin/mount -t auto /dev/${PART} /media/${PART}
else
/usr/bin/mount -t auto /dev/${PART} /media/$ {FS_LABEL}_${PART}
fi

Разрешить выполнение сценария:

sudo chmod +x /opt/ltsp/amd64/usr/local/bin/automount

Пересоберать образ:

sudo ltsp-update-kernels && sudo ltsp-update-image