Thinstation + iPxe + http

Статья поможет скомпилировать ПО для тонких клиентов (thinstation). С помощью тонкого клиента пользователь сможет подключаться к службам RDP / Citrix / VMview и другим протоколам. Для компиляции автор использовал CentOS 8, редакцию Server

Thinstation

Thinstation 6.2 — дистрибутив Линукс, который загружают на тонкий клиент(USB/HDD/PXE). Это – «урезанный» Linux, в нем убрали почти всё, кроме сетевых утилит. Для запуска дистрибутива достаточно иметь 1 CPU и 2 Гб ОЗУ. Для антикварных ЭВМ можно использовать Thinstation 5.1 который требует всего 512 Мб ОЗУ.

Подготовка пакетов

Так как в centos 8 уже предустановлен chroot, то других зависимостей перед установкой нет.

Скачивание исходников

репозиторий thinstation весит около 1.3 гб, так что, если у вас медленный интернет канал — наберитесь терпения.

cd /opt
git clone --depth 1 git://github.com/Thinstation/thinstation.git
cd thinstation

Конфигурирование

После скачивания репозитория thinstation, нам нужно собрать окружение chroot. Занимает это около 10-15 минут.

./setup-chroot

Попав в окружение chroot, нужно подготовить конфигурационные файлы, требуемые для сборки образа thinstation.
Имеется несколько вариантов сборки:

iso syslinux pxe refind grub

В нашем случае мы будем компилировать только версию pxe.
Для начала стоит удалить ссылку build.conf на build.conf.example, дабы не потерять оригинальный conf-файл, из которого в случае ошибок можно получить оригинальные параметры настроек.

cd build
rm -rf build.conf
cp build.conf.example build.conf

пройдемся по общим параметрам в файле build.conf

nano build.conf

Модуль hardware отвечает за выбор преднастроенных конфигураций для ПК или тонких клиентов. Он понадобится позже.

machine MyMachineName

Конфигурация Wifi

Если у вас в устройстве имеется wifi, следует активировать wpa_supplicant

package wpa_supplicant

Поддержка файловых систем

для дополнительного расширения функционала мы включим модули cifs,nfs и ntfs

module usb-storage
module isofs                    # ISO9960 file system support for CDRoms
module udf                      # CDRom UDF file system support
module vfat                     # Fat and VFat file system support
module ntfs                    # NTFS file system support
module ext4                     # Ext4 file system support
module nfs                     # NFS file system support
module cifs                    # CIFS support (use either this or smbfs - not both)

Активируем netfiles, для загрузки дополнительных конфигурационных файлов через tftpd/http, которые мы используем позже для удобства администрирования.

package netfiles

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

package locale-en_US  # English-US

Подошла очередь приложений.
В моем случае нужен только freerdp, т.к. мы только и будем делать, что подключаться к серверу по RDP

package freerdp                 # X RDP Client - fork of rdesktop
#package rdesktop               # X RDP client for Windows Terminal Services (ver 1.7)
#package vncviewer              # VNC client (vncviewer)
#package xorg7vnc               # Remote Control Client Workstation
#package ica                    # Citrix ICA client support
#package tarantella             # Tarantella client support
#package xnest                  # XDM in a window client
#package urxvt                  # Light Xterm Client (vt102)
#package xterm                  # Xterm Client (vt220)
#package ssh                    # Secure Shell client
#package tn5250                 # 5250 terminal emulator
#package dillo                  # Dillo light web browser
#package thinlinc               # Cendio ThinLinc client support
#package nx                     # No Machine NX client
#package 2x                     # 2X client
#package spice                  # Redhat Spice Client
#package java                   # Java runtime
#package firefox                # Firefox current Web Browser
#package chrome                 # Google Chrome Web Browser
#package chromium               # Chromium Web Browser
#package kiosk                  # Rkiosk Plugin for Firefox
#package flash                  # Flash Current
#package filezilla              # FileZilla FTP Client for X
#package git                    # GIT Version Control System
#package gparted                # Gnome Partition Manager
#package open-vm-tools
#package vboxguest
#package medit                  # Notepad
#package mplayer                # DVD and video player
#package vmview                    # VMware Open-View Client, PCOIP
#package xbmc                   # XBMC Media Center for X
#package evince                 # X PDF Viewer
#package openkiosk              # OpenKiosk is a cross platform kiosk web browser based on Mozilla Firefox
#package xdmcp-connect          # Simple connection to XDMCP server

Включаем пакет www для удаленного доступа к тонкому клиенту (Возможно пригодится)

package www
package lighttpd

Следующим шагом будет замена паролей и выбор режима загрузки.
Если включен режим fastboot — то отдельно будет сгенерирован файл, который будет загружен уже из запускаемой OC. Грубо говоря, это каталог /lib сжатый в squashfs.
В обратном случае все файлы будут добавлены в образ initrd.

param fastboot       true                               # Mangles the filesystem a special way as to improve boot speed and reduce
                                                        # memory utilization. Cool/Dangerous . Harder to dubug other packages. (Finishing Touch)
                                                        # Set to 'true' to enable or 'lotsofmem' for slightly slower booting but no squash lag on app launch.
param tsuser         tsuser                            # Name of the user that thinstation will run as. Needs userauto package.
param tsuserpasswd   pleasechangeme                     # Do Change! Console/telnet password for non-root

param rootpasswd     pleasechangeme                     # Do Change!  Console/telnet password for root
                                                        # If this is enabled, Telnetd will be enabled.
param tsadminpasswd  pleasechangeme                     # Admin password of web interface
param xorgvncpasswd  pleasechangeme                     # VNC Access Password
param storagepasswd  pleasechangeme                     # Password for storage server
param dialuppasswd   pleasechangeme                     # Password for dialin account
param sambapasswd    pleasechangeme                     # Password for samba shares when using user mode security

Дополнительные настройки

param bootresolution 1920x1080-32

param desktop file:./backgrounds/Hive_Lite.jpg          # Custom image to load as desktop background
param defaultconfig  thinstation.conf.buildtime         # The file with default setup.  No other config file is found
                                                        #  during boot.
param basename       thinstation                        # тут нужно указать имя файла для получения дополнительных файлов настроек 
param basepath       conf                                 # тут нужно указать каталог для получения дополнительных файлов настроек 
param baseurl        'http://${SERVER_IP}'              # Used to determine url to wget/http files - if you wan't to use a web server on the same server as the TFTP server
param sametimestmp   true                               # When enabled, the timestamps for all files and folders will be set to 00:00 of todays date in your timezone
param initrdcmd      "gzip -9"                             # поправим gzip на более сильную компресию
param bootverbosity   3                                 # Increased vebosity when booting TS

param downloads         /downloads
param bootimages        "pxe"                    # сборка только PXE версии
param bootserver        "192.168.1.1"          # Указываем IP адрес сервера TFTPD64

Комментируем строки которые, будут устанавливать все модули.

#param allres            true            # Includes a lot of resolution splash images for live-cd s
#param allfirmware       true            # Includes a lot of firmwares for live-cd s
param earlymicrocode    false           # Builds microcode initramfs for early loading

Наш итоговый конфигурационный файлик, в котором мы дополнительно оставили xfwm4 для удобства использования оконного менеджера. Это может пригодиться для отладки. Далее, при помощи конфиг файла мы его отключим.

machine MyMachineName
package wpa_supplicant
module usb-storage
module isofs                    # ISO9960 file system support for CDRoms
module udf                      # CDRom UDF file system support
module vfat                     # Fat and VFat file system support
module ntfs                     # NTFS file system support
module ext4                     # Ext4 file system support
module nfs              # NFS file system support
module cifs                     # CIFS support (use either this or smbfs - not both)
package netfiles                        # Adds only this package instead of the whole ts-classic. netfiles lets you get thinstation.conf.xxx files
package udisks
package automount
package autonet
package ntp                     # Utility to obtain date & time from network
package alsa
package gnome-control-center
package volumeicon
package cpufreq
package xorg7-vesa              #A fallback driver that works with almost everything. Does allow resolution changes
package xorg7-vmware
package xorg7-intel             #Intel video driver for most modern chipsets except the GMA3500/3600
package locale-en_US  # English-US
package freerdp         # X RDP Client - fork of rdesktop
package open-vm-tools
package xfwm4
package xfce4-power-manager
package terminal                # Terminal emulator for xfwm4 -- Pulls in xfwm4
package thunar                  # File Manager for xfwm4 -- Pulls in xfwm4
package www                     # Web access to client.  From a browser: "http://<IP number>"
package cups
package samba-client            # Samba smbclient, gives a shell like environment to access an samba server
package gtk-2.0                 # Full gtk-2.0 plus clearlooks theme
package gtk-3.0
package gtk-theme-adwaita
package icons-cursor            # Anti Aliased Mouse Cursor Theme
package icons-hicolor           # Hi-Color icons for some applications and themes. Does not really contain any icons.
package icons-adwaita
package fonts-TTF-BH            # This one works nicely most of the time and is small.
package fonts-TTF-vera
package fonts-TTF-liberation
package fonts-TTF-noto
param fastboot       false                              # Mangles the filesystem a special way as to improve boot speed and reduce
param tsuser         tsuser                            # Name of the user that thinstation will run as. Needs userauto package.
param tsuserpasswd   pleasechangeme                     # Do Change! Console/telnet password for non-root
param rootpasswd     pleasechangeme                     # Do Change!  Console/telnet password for root
param tsadminpasswd  pleasechangeme                     # Admin password of web interface
param xorgvncpasswd  pleasechangeme                     # VNC Access Password
param storagepasswd  pleasechangeme                     # Password for storage server
param dialuppasswd   pleasechangeme                     # Password for dialin account
param sambapasswd    pleasechangeme                     # Password for samba shares when using user mode security
param bootlogo       true                               # Enable or Disable the use of the Boot splash.
param boottheme      default                            # Backgound picture during boot
param splash         silent
param fbmtrr         0                                  # MTRR value for uvesafb (default = 0, 4 is the best) grep your log to make sure you have not set it to high
param fbsm           ywrap                              # Window scrolling method (redraw, ypan, ywrap) ywrap is best, but may not work correctly for all people
param bootresolution 1920x1080-32
param desktop file:./backgrounds/Hive_Lite.jpg          # Custom image to load as desktop background
param defaultconfig  thinstation.conf.buildtime         # The file with default setup.  No other config file is found
param basename       thinstation                        # Used for all config/tftp/scp file names
param basepath       conf                               # Used to determine path to tftp/scp files
param baseurl        'http://${SERVER_IP}'              # Used to determine url to wget/http files - if you wan't to use a web server on the same server as the TFTP server
param haltonerror    false                              # Will halt on error, default is true
param hardlinkfs     true
param sametimestmp   true                               # When enabled, the timestamps for all files and folders will be set to 00:00 of todays date in your timezone
param initrdcmd      "gzip -9"                          # Compression mode and level of initrd file. none, gzip -9, lzma -9 ,bzip2 -9
param bootverbosity   3                                 # Increased vebosity when booting TS
param downloads         /downloads
param bootimages        "pxe"
param bootserver        "192.168.1.1"           # Used for the pxe image config files to specify where to download
param syslinuxtheme     "default"
param grubtheme         "default"
package alltimezone
param allres            false           # Includes a lot of resolution splash images for live-cd s
param allfirmware       false           # Includes a lot of firmwares for live-cd s
param earlymicrocode    false           # Builds microcode initramfs for early loading
param blacklist "snd-pcsp.ko pcspkr.ko"

Если вы пока не знаете, какое железо будет использовано на тонких клиентах или оно сильно разниться —
то стоит скомпилировать без создания конфигов machine и просто включить все модули, пропустив данный этап.

Если же у вас одна модель устройства, и/или если знания linux не позволяют вам просто сказать, какие модули (драйвера) вам нужны — то стоит скомпилировать дефолтный образ с добавлением параметра:

package extensions-x

и запустить компиляцию

./build --allmodules

Затем, нужно забрать iso из каталога boot-images/iso, развернуть на флешку и загрузить на клиенте.
Подключившись по telnet, выполнить команду hwlister.sh, которая сгенерирует файлы, требуемые для создания персонального конфига (нужен tftp).

На этом переходим к созданию machine

cd machine
mkdir MyMachineName
cd MyMachineName
cp /tftp_server/*.list .

Настроим, куда пользователь будет попадать после загрузки Thinstation, в плане окружения. Эти настройки производятся в файле thinstation.conf.buildtime

cd ../..
nano thinstation.build.conf

установим timzone и параметр загрузки дополнительных конфигов с tftp сервера, а так же, удаленный доступ с любых IP-адресов

TIME_ZONE=Asia/Tashkent
NET_REMOTE_ACCESS_FROM=0.0.0.0
NET_FILE_ENABLED=On

Компиляция

Теперь, когда все наши конфиги готовы — приступим к сборке.

cd ../../
./build


Переносим всё из каталога ./boot-images/pxe/ в каталог tftp

cp -rf ./boot-images/pxe/* /tftp_server/

iPxe

iPxe используется для загрузки по сети, используя протоколы TFTP HTTP, а также iSCSI.
В нашем случае, через tftp буден передан загрузочный образ iPXE, который в свою очередь даст старт загрузки файлов initrd и vmlinuz по HTTP. Это ускорит загрузку, т.к. tftp — довольно медленный протокол и в целом не предназначен для файлов большого объёма.

Скачивание исходников

cd /opt
git clone git://git.ipxe.org/ipxe.git
cd ipxe

Подготовим файл, который будет загружаться сразу после запуска iPXE

nano embed.ipxe

Создадим «вшитую» конфигурацию для получения параметров по DHCP, в том числе и загрузочного образа. В моем случае, корень веб сервера и tftp смотрят в один и тот же каталог: /tftp_server/

#!ipxe

dhcp
chain http://192.168.1.1:8080/boot/efi64/boot.ipxe

Компиляция

Компилируем с указанием пути к нашему ранее созданному файлу iPXE

cd /opt/ipxe/src/
make bin-x86_64-efi/ipxe.efi EMBED=../embed.ipxe

переносим ./bin-x86_64-efi/ipxe.efi в каталог tftp

cp -rf ./bin-x86_64-efi/ipxe.efi /tftp_server/

Running

подготовим каталоги к запуску

cd tftp_server/boot 
rm -rf ./efi32
rm -rf ./lpxelinux
rm -rf ./pxelinux
rm -rf ./efi64/*
cp ../../ipxe.efi ./efi64/

Создадим конфигурационный файл для загрузки нашего образа по ipxe

nano ./efi64/boot.ipxe
#!ipxe

kernel http://192.168.1.1:8080/boot/vmlinuz initrd=initrd
initrd http://192.168.1.1:8080/boot/initrd
boot

TFTP

Я использовал роутер с tftp сервером. Вариантов настройки TFTP сервера достаточно много. Я бы подсказал начинающим администраторам использовать tinyPXE.

Внесём опции 66 и 67 в DHCP, которые укажут клиенту адрес tftp сервера и путь к загрузочному образу:

option 66 = 192.168.1.1             # Адрес TFTP сервера
option 67 = boot/efi64/ipxe.efi     # путь к файлу загрузки

Теперь все основные настройки и сборки завершены. Стоит попробовать загрузить свой тонкий клиент и проверить работоспособность всех своих приложений

thinstation.conf.network

Если загрузка удалась — можем переходить к дополнительным опциям. А именно: настройка авто подключения к RDP серверу.
Для этого в корне сервера нужно создать каталог conf

cd /tftp_server/
mkdir conf
cd conf

Создадим конфиг файл с именем thinstation.conf.network

nano thinstation.conf.network

Внесем в файл данные о подключении к серверу и его автозапуске. Дополнительно о параметрах freerdp можно почитать тут https://github.com/FreeRDP/FreeRDP/wiki/CommandLineInterface

SESSION_0_AUTOSTART=ON
SESSION_0_TYPE=freerdp
SESSION_0_TITLE="RDP"
SESSION_0_FREERDP_SERVER="server-ip-addr"
SESSION_0_FREERDP_OPTIONS="/d:domain.org /bpp:32 /cert-ignore +fonts +aero"
RECONNECT_PROMPT=FORCE

Cохраняем файл, перезагружаем тонкий клиент — и вуаля! Все готово.