LTSP — Это терминальное решение на Linux. Говоря «терминальное», в первую очередь имею в виду не подключение к удаленному рабочему столу как в Windows. Я подразумеваю гораздо более гибкую и продвинутую систему доставки ПО, конфигов, домашенего каталога, да и самой операционной системы на клиентские рабочие станции с вашего терминального сервера.
В частности, LTSP — это совокупность преднастроенных программ и скриптов которые позволят вам без особого труда превратить вашу свежеустановленную Ubuntu, или другой дистрибутив, в полностью готовое к работе терминальное окружение. Которое будет загружаться на любых компьютерах в вашей сети и предоставлять пользователю полноценный интерфейс.
У LTSP есть несколько режимов работы:
Для того, чтобы понять в чем различие для начала нам нужно разобраться как LTSP работает.
Принцип работы
Допустим, у вас есть сервер и множество компьютеров (терминальных станций), которые вы раздаете пользователям, чтобы те за ними работали. Терминальные станции эти почти ничем не отличаются от обычных компьютеров, за исключением того, что их размеры обычно достаточно малы, для работы им не нужен жесткий диск и, кроме того, они могут быть довольно слабыми и дешевыми, на работе пользователей это не отражается (в режиме тонкого клиента). Стоит отметить, что в роли терминальной станции может выступать любой компьютер, который умеет загружаться по сети.
Как я уже сказал, на терминальных станциях вполне может и не быть жесткого диска, а соответственно никакой операционной системы на них не установленно, вся загрузка происходит c LTSP-сервера прямо по сети.
На терминальном сервере у вас установлена система, в ней же и хранятся все данные пользователей, конфиги, и ПО.
Когда пользователь включает свой компьютер, у него загружается операционная система с терминально сервера, он может в нее войти, поработать, отключиться. При этом все данные всегда остаются на терминальном сервере.
Теперь о режимах работы:
- тонкий клиент — Приложения выполняются на терминальном сервере и просто выводятся на дисплей терминального клиента.
- толстый клиент — Приложения выполняются непосредственно на терминальном клиенте, а сервер просто предоставляет доступ к пользовательским файлам и программам.
Итак, какой же режим нам выбрать? — все зависит от того, что вы хотите получить. Вы можете немного сэкономить используя на клиентах слабые станции вкупе с мощным сервером в режиме тонких клиентов. Или разгрузить терминальный сервер и локальную сеть, купив терминальные станции помощнее, переложив ответсвенность за выполнение программ на клиентов, заставив их, тем самым, работать в режиме толстого клиента.
Кроме того, режимы можно комбинировать и некоторые приложения можно заставлять работать иначе, чем все остальные. Например запускать «тяжелый» браузер с flash локально на клиентах, а офисные приложения запускать на самом сервере.
Плюсы и минусы
Давайте рассмотрим какие же плюсы мы имеем по сравнению со стандартными принципами построения ит инфраструктуры:
- Централизованное управление — У вас есть одна единая конфигурация, которой вы управляете из одного места.
- Резервирование и бэкапирование — Все пользовательские данные у вас хранятся на одном сервере, а соотвественно настроив резервирование этого сервера, вы никогда не потеряете пользовательские данные.
- Экономия на компьютерах — Бездисковые терминальные станции стоят заметно дешевле, чем полноценные компьютеры.
- Быстрое развертывание — Вам больше не нужно устанавливать ОС. Прикупив очередную пачку терминалов их можно смело втыкать в сеть, они сразу подтянут операционку с сервера и они будут полностью готовы к работе. Точно так же нерабочий терминал можно быстро заменить другим.
- Независимость от рабочего места — Пользователи могут работать под своей учетной записью независимо с любого компьютера в сети, всегда будет подгружаться именно их личный профиль.
- OpenSource — Прежде всего, LTSP — это открытый и свободный проект. Вам не надо покупать лицензии для его использования. Кроме того, вы всегда можете посмотреть исходники, в основе которых лежат обычные bash-скрипты.
Минусы:
- Требуется непрерывное подключение LAN — терминальные станции грузятся и работают по сети, поэтому требуется стабильное проводное подключение к сети.
- Зависимость от сервера — понятное дело, без сервера все терминальные клиенты становятся бесполезными и превращяются в тыкву.
Устройство
Первое, что мы должны знать, это компоненты из которых состоит сервер:
- DHCP-сервер — используется для выдачи клиентам IP-адресов и информации о tftp-сервере и пути к загрузчику pxelinux. Вы так же можете использовать ваш собственный DHCP-сервер.
- TFTP-сервер — отдает по tftp-протоколу загрузчик, ядро и главный конфиг
lts.conf
. - NBD-сервер — используется ядром для загрузки базовой системы по сети. Так же, при желании, может быть заменен на
NFS
- SSH-сервер — используется для авторизации пользователей и передачи их домашних каталогов на терминальные станции.
Во вторых разберемся в том как он работает:
Когда вы установите на ваш сервер пакет ltsp-server-standalone
, вы, к полностью настроенным сервисам, получите еще несколько ltsp-скриптов:
- ltsp-build-client — собирает для нас образ системы, который мы будем отдавать на клиентские машины.
- ltsp-chroot — chroot’ит нас в клиентскую систему, например для установки дополнительных пакетов и изменения конфигов.
- ltsp-config — генерит дефолтные конфиги для LTSP.
- ltsp-info — выводит информацию о текущей установке.
- ltsp-update-image — обновляет nbd-образ базовой системы.
- ltsp-update-kernels — копирует ядро и загрузчик из клиентского образа, в директорию tftp-сервера
- ltsp-update-sshkeys — добавляет ssh publickey вашего сервера, в known_hosts клиентского образа.
Их то мы и будем использовать для настройки нашего окружения.
Как устроена загрузка по сети?
Так же предельно важно понимать как устроена загрузка по сети, процесс загрузки выглядит примерно следующим образом:
- Рабочая станция включается и опрашивает DHCP-сервер, как ей грузиться дальше:
А точнее происходит запрос двух опций:next server
— адрес TFTP-сервера иboot file
— путь к загрузчику. - DHCP-сервер, выдает ответ с адресом сервера и путем к pxelinux.
- Рабочая станция загружает загрузчик pxelinux по TFTP
- pxelinux загружает ядро.
В конфиге pxelinux в опциях ядра указанно откуда грузить основную систему по NBD - Когда ядро запускается, оно маунтит с сервера nbd-образ в корень системы и загружает процесс init, который в свою очередь и загружает все остальное обычным способом.
- Так же в этот момент ltsp-читает главный конфиг lts.conf с сервера и запускает LDM, после чего пользователь видит приглашение к вводу логина и пароля.
LDM — это логон менеджер LXDE, который отвечает за авторизацию пользователей и начальный запуск окружения.
Когда пользователь логинится проиходит следующее:
- В случае тонкого клиента, LDM заходит с введенным логином и паролем на ваш сервер по SSH,, если успешно, загружает окружение с сервера простым пробросом X’ов.
- В случае толстого клиента, LDM пытается подключиться с введенным логином и паролем к вашему серверу, если успешно, то маунтит домашний каталог пользователя с сервера на клиент посредством sshfs, затем запускает окружение.
Если вам нужна более подробная информация о загрузке Linux по сети, рекомендую обратиться к циклу статей Roshalsky, вот ссылка на первую.
Установка
Я опишу установку LTSP в режиме толстого клиента, как наиболее сложную и интересную.
Настройка в режиме тонкого клиента мало чем будет оличаться, за исключением того, что необходимое ПО вам придется устанавливать не в chroot, а в основную систему, и после этого вам не нужно будет пересобирать nbd-образ.
Маленькая оговорочка, для сервера лучше брать дистрибутивы посвежее, т.к. LTSP находится среди стандартных пакетов и обновляется вместе с дистрибутивом.
Итак, приступим. Сначала устанавливаем ltsp-server-standalone
:
apt-get update && apt-get install ltsp-server-standalone
Теперь с помощью ltsp-build-client
мы установим клиентскую систему. LTSP поддерживает различные DE, но больше всего мне понравилось как работает LXDE. В отличии от Unity он потребляет совсем мало ресурсов и так-как работает на голых иксах, он почти полностью конфигурируется с помощью переменных среды, это очень удобно, так-как их можно указать в главном конфиге lts.conf.
ltsp-build-client --dist xenial --arch i386 --fat-client-desktop lubuntu-desktop
Все эти опции можно указать в конфиге /etc/ltsp/ltsp-build-client.conf
, что бы не прописывать их вручную:
ltsp-build-client.conf
<span class="hljs-comment"># Distribution</span>
DIST=xenial
<span class="hljs-comment"># The chroot architecture.</span>
ARCH=i386
<span class="hljs-comment"># ubuntu-desktop and edubuntu-desktop are tested.</span>
<span class="hljs-comment"># If you test with [k|x]ubuntu-desktop, edit this page and mention if it worked OK.</span>
<span class="hljs-comment"># kubuntu lucid (10.10) working okay.</span>
FAT_CLIENT_DESKTOPS=<span class="hljs-string">"lubuntu-desktop"</span>
<span class="hljs-comment"># Space separated list of programs to install.</span>
<span class="hljs-comment"># The java plugin installation contained in ubuntu-restricted-extras</span>
<span class="hljs-comment"># needs some special care, so let's use it as an example.</span>
<span class="hljs-comment">#LATE_PACKAGES="</span>
<span class="hljs-comment"># ubuntu-restricted-extras</span>
<span class="hljs-comment"># gimp</span>
<span class="hljs-comment"># nfs-client</span>
<span class="hljs-comment">#"</span>
<span class="hljs-comment"># This is needed to answer "yes" to the Java EULA.</span>
<span class="hljs-comment"># We'll create that file in the next step.</span>
DEBCONF_SEEDS=<span class="hljs-string">"/etc/ltsp/debconf.seeds"</span>
<span class="hljs-comment"># This uses the server apt cache to speed up downloading.</span>
<span class="hljs-comment"># This locks the servers dpkg, so you can't use apt on</span>
<span class="hljs-comment"># the server while building the chroot.</span>
MOUNT_PACKAGE_DIR=<span class="hljs-string">"/var/cache/apt/archives/"</span>
В случае если опция не указана, будет использоваться тот же дистрибутив и/или архитектура, что и на серверной системе.
После запуска комманды, у вас в полностью автоматическом режиме, с помощью debootstrap
, развернется система в каталог /opt/ltsp/i386
.
Эта же система и будет использоваться в дальнейшем всеми командами LTSP, в нее будет устанавливаться дополнительное ПО, из нее будут генериться загрузчик с ядром и nbd-образ системы. В принципе, ее, так же можно отдавать по nfs
при должной настройке загрузчика.
После установки LTSP автоматически сгенерит из нее nbd-образ. Этот образ и будут загружить наши клиенты.
Для того, чтобы внести какие-нибудь изменения в гостевую ОС, например устанавливать дополнительное ПО, используется команда ltsp-chroot
.
Если вы хотите что-то поменять или добавить в гостевую систему, выполните ltsp-choot
и вы окажетесь внутри нее.
Затем произведите нужные вам действия, и выйдите командой exit.
Чтобы изменения применились, нужно перегенерить nbd-образ командой ltsp-update-image
DHCP-сервер:
Вместе с метапакетом ltsp-server-standalone
у нас установился и isc-dhcp-server
.
В принципе он уже из коробки работает как надо, но при желании вы можете поправить его конфиг /etc/default/isc-dhcp-server
.
Есть классная статья на OpenNet от 2010 года на тему настройки LTSP, там неплохо описана процедура настройки DHCP-сервера.
Но, так как я предполагаю, что у вас уже есть DHCP-сервер, предлагаю настроить его.
Удалим isc-dhcp-server
:
sudo apt-get remove isc-dhcp-server
Теперь вам нужно добавить к вашему dhcp-серверу 2 опции:
next-server 192.168.1.2; <span class="hljs-comment"># TFTP-сервер</span>
filename <span class="hljs-string">"/ltsp/i386/pxelinux.0"</span>; <span class="hljs-comment"># Загрузчик</span>
Как это сделать, смотрите инструкции к вашему DHCP-серверу.
Вот, например инструкция как это сделать на оборудовании Mikrotik.
Установка ПО
- Давайте же войдем в нашу гостевую систему:
ltsp-chroot
- Теперь установим vim:
apt-get update && apt-get install vim
- Поддержку русского языка:
apt-get update && apt-get install `check-language-support <span class="hljs-_">-l</span> ru`
- Последнюю версию Remmina:
apt-add-repository ppa:remmina-ppa-team/remmina-next apt-get update apt-get install remmina remmina-plugin-rdp libfreerdp-plugins-standard
- Skype:
add-apt-repository -y <span class="hljs-string">"deb http://archive.canonical.com/ <span class="hljs-variable">$(lsb_release -sc)</span> partner"</span> apt-get -y update apt-get -y install skype
- Браузер Chromium c плагином PepperFlash (свежий flash от google)
sudo apt-get install chromium-browser sudo apt-get install pepperflashplugin-nonfree sudo update-pepperflashplugin-nonfree --install
- Кстати, PepperFlash можно установить и запустить без Chromium, в Firefox:
Установка PepperFlash для Firefox
add-apt-repository -y ppa:skunk/pepper-flash
add-apt-repository -y ppa:nilarimogard/webupd8
apt-get -y update
apt-get -y install pepflashplugin-installer freshplayerplugin
mkdir -p /opt/google/chrome/PepperFlash
ln <span class="hljs-_">-s</span> /usr/lib/pepflashplugin-installer/libpepflashplayer.so /opt/google/chrome/PepperFlash
- Чтобы администратор мог удаленно подключиться к сессии пользователя установим x11vnc:
Установка x11vnc
<span class="hljs-comment"># Скачиваем пакет</span>
apt-get -y install x11vnc
<span class="hljs-comment"># Создаем скрипт запуска</span>
cat > /usr/bin/x11vncd <#!/bin/bash
<span class="hljs-function"><span class="hljs-title">x11vncd</span></span> () {
XAUTH=\`ls -1td /var/run/ldm-xauth-* | head -n1 | sed <span class="hljs-string">'s|$|/Xauthority|'</span>\`
logger <span class="hljs-_">-f</span> /var/<span class="hljs-built_in">log</span>/x11vnc <span class="hljs-string">"Starting with \$XAUTH"</span>
/usr/bin/x11vnc -display :7 -rfbauth /etc/x11vnc.pass -logfile /var/<span class="hljs-built_in">log</span>/x11vnc -xauth \<span class="hljs-variable">$XAUTH</span>
sleep 1
x11vncd
}
x11vncd
EOT
<span class="hljs-comment"># Создаем init-скрипт</span>
cat > /etc/init.d/x11vnc <#!/bin/sh
<span class="hljs-comment">### BEGIN INIT INFO</span>
<span class="hljs-comment"># Provides:x11vnc</span>
<span class="hljs-comment"># Required-Start:\$remote_fs \$syslog</span>
<span class="hljs-comment"># Required-Stop:\$remote_fs \$syslog</span>
<span class="hljs-comment"># Default-Start:2 3 4 5</span>
<span class="hljs-comment"># Default-Stop:0 1 6</span>
<span class="hljs-comment"># Short-Description:Start X11VNC</span>
<span class="hljs-comment"># Description:Start VNC server X11VNC at boot</span>
<span class="hljs-comment">### END INIT INFO</span>
<span class="hljs-keyword">case</span> <span class="hljs-string">"\$1"</span> <span class="hljs-keyword">in</span>
start)
start-stop-daemon --start --oknodo --pidfile /var/run/x11vnc.pid --background --nicelevel 15 --make-pidfile --exec /usr/bin/x11vncd
;;
stop)
logger <span class="hljs-_">-f</span> /var/<span class="hljs-built_in">log</span>/x11vnc <span class="hljs-string">"Stopping"</span>
start-stop-daemon --stop --oknodo --pidfile /var/run/x11vnc.pid
;;
restart)
logger <span class="hljs-_">-f</span> /var/<span class="hljs-built_in">log</span>/x11vnc <span class="hljs-string">"Restarting"</span>
\<span class="hljs-variable">$0</span> stop
\<span class="hljs-variable">$0</span> start
;;
status)
PID=\`cat /var/run/x11vnc.pid\`
<span class="hljs-keyword">if</span> [ <span class="hljs-_">-e</span> /proc/\<span class="hljs-variable">$PID</span> ]; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"Process \$PID is running"</span>
<span class="hljs-keyword">else</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"No process matching"</span>
<span class="hljs-keyword">fi</span>
;;
*)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"Usage: \$0 start|stop|restart|status"</span>
<span class="hljs-built_in">exit</span> 1
;;
<span class="hljs-keyword">esac</span>
<span class="hljs-built_in">exit</span> 0
EOT
<span class="hljs-comment"># Разрешаем выполнение</span>
chmod +x /usr/bin/x11vncd /etc/init.d/x11vnc
<span class="hljs-comment"># Включаем службу при запуске</span>
update-rc.d x11vnc defaults
<span class="hljs-comment"># Задаем пароль</span>
x11vnc -storepasswd /etc/x11vnc.pass
- И ssh-сервер:
apt-get -y install openssh-server
- Еще в Ubuntu 16.04 есть некая проблема, xscreensaver автоматически не стартует. Исправим это:
cat > /etc/xdg/autostart/xscreensaver.desktop <false NoDisplay=<span class="hljs-literal">false</span> X-GNOME-Autostart-enabled=<span class="hljs-literal">true</span> Name[en_US]=xscreenasaver Name=xscreensaver Comment[en_US]= Comment= EOT
Не забываем выйти из chroot и обновить наш nbd-образ:
<span class="hljs-built_in">exit</span>
ltsp-update-image
Создание пользователей
- Обычных пользователей терминального сервера можно создать стандартным способом:
useradd -m -c <span class="hljs-string">"Иван Иваныч"</span> -g users <span class="hljs-_">-s</span> /bin/bash passwd
Или через GUI если он установлен у вас на сервере
- Также при желании можно создать локального администратора в клиентском образе:
ltsp-chroot useradd -g adm -G sudo <span class="hljs-_">-s</span> /bin/bash -m passwd <span class="hljs-built_in">exit</span> ltsp-update-image
Конфиг lts.conf
Вот мы и подобрались к самому главному конфигу
Находится он по адресу /var/lib/tftpboot/ltsp/i386/lts.conf
и представляет ссобой нечто иное как описание глобальных переменных.
Конфиг поделен на секции, в секции Default описываются настройки общие для всех клиентов:
<span class="hljs-section">[Default]</span>
<span class="hljs-comment"># Сессия LXDE</span>
<span class="hljs-attr">LDM_XSESSION</span> = /usr/bin/dbus-launch --exit-with-session /usr/bin/lxsession -s Lubuntu -e LXDE
<span class="hljs-comment"># Настройки локалей и системного языка</span>
<span class="hljs-attr">LOCALE</span> = Europe/Moscow
<span class="hljs-attr">LC_ALL</span> = ru_RU.UTF-<span class="hljs-number">8</span>
<span class="hljs-attr">LANG</span> = ru_RU.UTF-<span class="hljs-number">8</span>
<span class="hljs-attr">LDM_LANGUAGE</span> = ru_RU.UTF_8
<span class="hljs-comment"># Настройка переключения клавиатуры и хоткеев</span>
<span class="hljs-attr">XKBLAYOUT</span> = <span class="hljs-string">"us,ru"</span>
<span class="hljs-attr">XKBOPTIONS</span> = <span class="hljs-string">"grp:ctrl_shift_toggle,terminate:ctrl_alt_bksp"</span>
<span class="hljs-attr">X_NUMLOCK</span> = <span class="hljs-literal">true</span>
<span class="hljs-attr">KEYTABLE</span> = ru
<span class="hljs-attr">LDM_NUMLOCK</span> = <span class="hljs-literal">true</span>
<span class="hljs-comment"># Разрешаем флешки</span>
<span class="hljs-attr">HOTPLUG</span> = <span class="hljs-literal">True</span>
<span class="hljs-comment"># Разрешаем локальные диски</span>
<span class="hljs-attr">LOCALDEV</span> = <span class="hljs-literal">true</span>
<span class="hljs-comment"># Настраиваем звук и микрофон</span>
<span class="hljs-attr">SOUND</span> = <span class="hljs-literal">True</span>
<span class="hljs-attr">MIC_VOLUME</span> = <span class="hljs-number">0</span>
<span class="hljs-attr">CAPTURE_VOLUME</span> = <span class="hljs-number">100</span>
<span class="hljs-attr">CAPTURE_SWITCH</span> = toggle
<span class="hljs-comment"># Включаем поддержку SSH</span>
<span class="hljs-attr">RCFILE_01</span> = <span class="hljs-string">"ssh-keygen -A ; /usr/sbin/sshd"</span>
<span class="hljs-comment"># Настраиваем сбор логов</span>
<span class="hljs-attr">SYSLOG_HOST</span> = server
Также можно добавить секции для отдельных клиентов, на основе hostname, IP или MAC-адреса:
<span class="hljs-comment"># Настройка графики</span>
<span class="hljs-section">[oldmachine]</span>
<span class="hljs-attr">X_COLOR_DEPTH</span>=<span class="hljs-number">8</span>
<span class="hljs-attr">X_MODE_0</span>=<span class="hljs-number">800</span>x600
<span class="hljs-comment"># Включить автологин</span>
<span class="hljs-section">[192.168.1.123]</span>
<span class="hljs-attr">LDM_AUTOLOGIN</span> = <span class="hljs-literal">True</span>
<span class="hljs-attr">LDM_USERNAME</span> = user
<span class="hljs-attr">LDM_PASSWORD</span> = password
<span class="hljs-comment"># Принт-сервер</span>
<span class="hljs-section">[00:11:25:93:CF:00]</span>
<span class="hljs-attr">PRINTER_0_DEVICE</span>=/dev/usblp0
<span class="hljs-attr">SCREEN_07</span>=shell
<span class="hljs-comment"># FreeRDP, вместо стандартной оболочки</span>
<span class="hljs-section">[00:11:25:93:CС:11]</span>
<span class="hljs-attr">SCREEN_07</span>=xfreerdp
<span class="hljs-attr">RDP_SERVER</span>=<span class="hljs-number">192.168</span>.<span class="hljs-number">100.10</span>
<span class="hljs-attr">RDP_OPTIONS</span>=<span class="hljs-string">"/f /sec:rdp /cert-ignore /multimon:force"</span>
Вообще полный список опций вы можете найти на этой странице, или в
man lts.conf
Итоги
В итоге мы получаем одновременно гибкую, безопасную и простую в администрировании систему.
Мы можем стандартными методами установливать любое ПО на нее, разграничивать права пользователей, править конфиги общие и для каждого юзера по отдельности, и не бояться за потерю данных.
К тому же, благодаря свободной лицензии все это достается вам абсолютно бесплатно.
LTSP можно использовать как в учебных заведениях, так и в обычных офисах, как для удаленного подключения к Windows, так и просто для обычной работы и для создания рендер-фермы.
Не секрет, что в нынешние времена для большинства сотрудников, сейчас, будет достаточно лишь браузера с базовым набором офисных програм на рабочем месте.
Несколько интересных ссылок:
- LTSP.org — Официальный сайт проекта.
- UbuntuLTSP — Страничка на Ubuntu Wiki.
- LTSP-Cluster. — Проект по созданию кластера на LTSP (для больших установок).
- Raspi-LTSP — Интересный проект, который позволяет использовать Raspberry Pi в качестве терминальных станций.