Рассмотрим пример организации выделенной сети тонких клиентов, подключающихся по протоколу RDP к центральному серверу служб удалённых рабочих столов Microsoft Windows Server (Remote Desktop Services). В качестве ОС тонкого клиента будем использовать свободно распространяемую среду Thinstation из проекта Thinstation by Donald A. Cupp Jr., в составе которой присутствует RDP-клиент FreeRDP.
В качестве аппаратной платформы для тонкого клиента мы будем использовать устройства HP t610, хотя в рамках нашей задачи эти устройства имеют более чем избыточную конфигурацию. По сути минимальные системные требования для тонкого клиента с Thinstation – любой «аппаратный хлам» начиная с уровня Pentium-II с 128MB RAM и выше. Мы будем использовать бездисковую конфигурацию тонких клиентов, то есть загрузка системы будет выполняться по сети с использованием PXE (приоритетно) или с локальных загрузочных USB-накопителей (для клиентов без поддержки PXE и в отдалённых участках со слабым каналом передачи данных).
Когда я изучал доступные в открытых источниках статьи на тему подобного развёртывания, то среди множества материалов выделил для себя статью Пети Хинчли «Use Thinstation to build a network-bootable RDP-enabled thin client image», от наработок которой я и буду отталкиваться. Также в качестве полезного источника информации стоит отметить такие русскоязычные ресурсы, как Thinstation по русски и Thinstation Доработка тонкого клиента.
В рассматриваемом примере имеется несколько исходных условий, от которых нам придётся отталкиваться:
- Все тонкие клиенты должны быть изолированы в рамках одной сети и должны маршрутизироваться только до своего RDS-сервера.
- RDS-сервер, помимо предоставления сессий удалённых рабочих столов, по совместительству должен выполнять все функции управления тонкими клиентами (раздача IP адресов, раздача загрузочных образов ОС, раздача настроек каждого конечного клиента и т.д.).
- Загрузка конечной рабочей среды тонкого клиента должна происходить автоматически без участия пользователя/оператора (авто-логон RDP-сессии и запуск необходимой оболочки – конечного бизнес-приложения)
- Цикличная работа тонких клиентов должна быть автоматизирована, то есть клиенты должны автоматически включаться по расписанию утром каждого рабочего дня и выключаться в конце рабочего дня.
Начнём процедуру настройки с выделенного сервера, который в нашем случае является виртуальной машиной Hyper-V с предварительно установленной гостевой ОС Windows Server 2012 R2 Standard. Развернём и настроим на этом сервере службы DHCP и WDS.
Настройка сервера DHCP
Для автоматического назначения IP-адресации нашим тонким клиентам установим и настроим службу DHCP на нашем сервере управления.
Устанавливаем роль DHCP Server через оснастку Server Manager или через PowerShell:
Install-WindowsFeature -Name DHCP -IncludeManagementTools
После установки роли откроем оснастку Server Manager и запустим мастер Post-Deployment Configuration, после завершения которого роль сервера DHCP может считаться развёрнутой.
В нашем примере сервер DHCP разворачивается на компьютере, не являющемся членом домена, поэтому с авторизацией (активацией) службы DHCP не возникнет проблем – сразу после развёртывания сервер будет готов к работе. Создадим для тонких клиентов область с пулом выдаваемых IP адресов и активируем её:
В случае если DHCP сервер разворачивается на доменной системе, то дополнительно может потребоваться его авторизация. Если прав Администратора домена нет, то провести авторизацию сервера можно путём небольшой правки реестра: Как авторизовать DHCP сервер не имея прав Администратора домена.
В оснастке управления правилами Windows Firewall проверяем правила относящиеся к серверу DHCP (как минимум нужно разрешить входящие подключения по протоколу UDP на порты 67/68)
Настройка сервера Windows Deployment Services
Роли Windows Deployment Services и Web Server понадобятся нам для возможности раздачи по сети (PXE) загружаемых образов Thinstation тонким клиентам по протоколам TFTP/HTTP. Устанавливаем роли:
Install-WindowsFeature -Name "Web-Server","WDS" -IncludeManagementTools
К настройке веб-сервера IIS мы обратимся позже, а сейчас рассмотрим то, как настроить WDS сервер на поддержку загрузчика SYSLINUX.
Откроем консоль WDS и первым делом вызовем мастер конфигурирования сервера Configure Server
На первом шаге мастер ознакомит нас с требованиями необходимыми для работы WDS.
- Первым пунктом идёт информация о том, что сервер может быть сконфигурирован как с поддержкой доменной инфраструктуры, так и в изолированном варианте (как раз наш случай).
- Службу сервера DHCP мы уже развернули. В процессе конфигурации WDS будет включена специальная опция DHCP сервера для поддержки PXE-клиентов.
- Среди требований присутствует наличие DNS-сервера в сети, хотя в нашем конкретном случае в этом нет реальной необходимости. DNS это конечно хорошо и правильно, но мой практический опыт работы с Thinstation показал, что полностью избавится от применения IP-адресов вместо FQDN-имён не получится, и поэтому я решил вообще не заморачиваться с использованием службы DNS.
- Отдельный NTFS-раздел для хранения загрузочных образов сделан на нашем WDS-сервере (далее в примерах будет фигурировать как диск D:\)
На шаге выбора типа развёртывания WDS, согласно исходных условий нашего примера, выбираем режим изолированного сервере Standalone server
На шаге размещения каталога для файлов WDS и загрузочных образов по умолчанию предлагается каталог C:\RemoteInstall. В нашем примере путь изменён на диск D:\
На следующем шаге мастер конфигурации, определив наличие на нашем сервере службы DHCP-сервера, предложит настроить параметры взаимодействия с этой службой. А именно, нам потребуется включить запрет прослушивания портов DHCP службой WDS и разрешить конфигурирование опций DHCP-сервера для поддержки PXE-клиентов.
На шаге настроек PXE по условиям нашей задачи разрешаем WDS серверу отвечать на запросы всех PXE-клиентов
По завершению работы мастера служба WDS будет запущена. В консоли WDS откроем свойства сервера и на закладке Boot отключим включенное по умолчанию требование нажатия F12 на стороне PXE-клиента для возможности загрузки по сети, выбрав опцию Always continue the PXE boot.
Заглянем в оснастку управления сервером DHCP и проверим, что в DHCP-опциях на уровне сервера появилась опция PXE
***
Теперь сделаем ряд действий по добавлению нашему WDS серверу поддержи SYSLINUX.
Скачаем архив актуальной версии загрузчика syslinux-6.03 по ссылке:
https://www.kernel.org/pub/linux/utils/boot/syslinux/
Распакуем архив syslinux-6.03.zip и выполним следующие действия:
- Скопируем в каталог D:\RemoteInstall\Boot\x64 на сервере WDS следующие файлы:
\syslinux-6.03\bios\core\pxelinux.0 (переименовать в pxelinux.com)
\syslinux-6.03\bios\com32\menu\vesamenu.c32
\syslinux-6.03\bios\com32\elflink\ldlinux\ldlinux.c32
\syslinux-6.03\bios\com32\chain\chain.c32
\syslinux-6.03\bios\memdisk\memdisk - Скопируем файл D:\RemoteInstall\Boot\x64\abortpxe.com в файл abortpxe.0.
- Скопируем файл D:\RemoteInstall\Boot\x64\pxeboot.n12 в файл pxeboot.0.
Повторим действия, проделанные для каталога D:\RemoteInstall\Boot\x64 применительно к каталогу D:\RemoteInstall\Boot\x86
***
Создадим каталог D:\RemoteInstall\Boot\pxelinux.cfg (не файл, а именно каталог). В этом каталоге будут хранится конфигурационный файлы PXE, которые будет отдавать WDS-сервер PXE-клиентам.
Создадим конфигурационный файл PXE «по умолчанию» с именем default в каталоге D:\RemoteInstall\Boot\pxelinux.cfg и добавим в него следующий контент:
DEFAULT RDP
PROMPT 0
NOESCAPE 1
ALLOWOPTIONS 0
LABEL RDP
MENU DEFAULT
KERNEL /Linux/vmlinuz
APPEND initrd=/Linux/initrd splash=silent,theme:default load_ramdisk=1 ramdisk_blocksize=4096 root=/dev/ram0 ramdisk_size=786432 loglevel=3 console=tty1 vt.global_cursor_default=0 LM=3
***
В командной строке с правами Администратора перейдём в каталог D:\RemoteInstall\Boot\x64 и создадим символическую ссылку (junction) на каталог D:\RemoteInstall\Boot\pxelinux.cfg:
cd /d D:\RemoteInstall\Boot\x64
mklink /J pxelinux.cfg D:\RemoteInstall\Boot\pxelinux.cfg
Повторим тоже самое для каталога D:\RemoteInstall\Boot\x86:
cd /d D:\RemoteInstall\Boot\x86
mklink /J pxelinux.cfg D:\RemoteInstall\Boot\pxelinux.cfg
***
Создадим каталог D:\RemoteInstall\Images\Linux. В этом каталоге мы будем размещать загружаемые образы ОС тонких клиентов.
В командной строке с правами Администратора перейдём в каталог D:\RemoteInstall\Boot\x64 и создадим символическую ссылку (junction) на каталог D:\RemoteInstall\Images\Linux:
cd /d D:\RemoteInstall\Boot\x64
mklink /J Linux D:\RemoteInstall\Images\Linux
Повторим тоже самое для каталога D:\RemoteInstall\Boot\x86:
cd /d D:\RemoteInstall\Boot\x86
mklink /J Linux D:\RemoteInstall\Images\Linux
***
Для того, чтобы настроить WDS на использование добавленных нами загрузочных программ SYSLINUX (замена стандартного для WDS загрузчика pxeboot на pxelinux), выполним ряд команд с правами Администратора на сервере WDS:
wdsutil /set-server /bootprogram:boot\x86\pxelinux.com /architecture:x86
wdsutil /set-server /N12bootprogram:boot\x86\pxelinux.com /architecture:x86
wdsutil /set-server /bootprogram:boot\x64\pxelinux.com /architecture:x64
wdsutil /set-server /N12bootprogram:boot\x64\pxelinux.com /architecture:x64
Примечание: Если в дальнейшем по какой-то причине потребуется восстановить загрузочные программы (pxeboot), используемые в WDS по умолчанию, сделать это можно командами:
wdsutil /set-server /bootprogram:boot\x86\pxeboot.com /architecture:x86
wdsutil /set-server /N12bootprogram:boot\x86\pxeboot.n12 /architecture:x86
wdsutil /set-server /bootprogram:boot\x64\pxeboot.com /architecture:x64
wdsutil /set-server /N12bootprogram:boot\x64\pxeboot.n12 /architecture:x64
***
В оснастке управления правилами Windows Firewall проверяем правила относящиеся к серверу WDS (как минимум нужно разрешить входящие подключения по протоколу UDP к исполняемому файлу службы).
А также включаем правило, разрешающее входящий трафик к веб-серверу IIS
Кстати, к настройке веб-сервера IIS мы ещё вернёмся позже.
Развёртывание сборочной среды DevStation
Для сборки собственных загрузочных образов проект Thinstation, в качестве одного из вариантов, предлагает использовать специальную загружаемую среду DevStation. Используя загрузочный дистрибутив DevStation, мы развернём выделенную Linux-систему, с помощью которой в дальнейшем будем собирать загрузочные образы Thinstation для конечных тонких клиентов. Прежде всего в DevStation будет сгенерирован специальный загрузочный образ Thinstation, с которого, в свою очередь, нужно будет загрузиться на всех используемых типах аппаратных конфигураций наших клиентов и сгенерировать профиль оборудования. На базе полученных профилей оборудования на нашем сервере DevStation будут скомпилированы конечные загрузочные сборки Thinstation под каждую аппаратную конфигурацию. Такой подход позволит свести к разумному минимуму размер загружаемого по сети образа Thinstation для каждой конкретной партии «железок».
Под задачу развёртывания DevStation можно использовать виртуальную машину. В сети можно найти примеры использования для этих целей виртуальных машин на базе VMWare и VirtualBox. В моём случае используются среды виртуализации Microsoft Hyper-V и oVirt. Попытки развернуть DevStation 5.5 на виртуальную машину Hyper-V 2012 R2 результата не дали, так как происходило зависание процесса установки на стадии разметки диска, хотя с определением диска проблемы не возникало. В конечном итоге виртуальная машина была создана в среде виртуализации oVirt с настройками согласно документа DevStation setup.
Созданная виртуальная машина имеет 2vCPU , 3GB ОЗУ, vHD 25GB (при меньшем размере диска, чем 20GB, DevStation может не установиться). В качестве интерфейса диска вместо используемого по умолчанию в oVirt 4.0.6 значения VirtIO я выбрал IDE, так как развёртывание DevStation заработало корректно только на этом интерфейсе.
***
Загружаем последнюю версию DevStation по ссылке: Thinstation Latest Download
В нашем случае это файл TS-5.5.1-Installer-0627.iso размером 212MB
Загружаемся в подготовленную виртуальную машину с ISO-образа и выбираем пункт установки – Installer for DevStation
В память загрузится Live-система, будет выполнен авто-вход в графическую оболочку, где с рабочего стола запустим ярлык Install to HD. В открывшейся форме нам поведают о том, что на самом деле можно прожить и без выделенной инсталляции DevStation, залив git-клон проекта Thinstation на любой другой сборочной Linux-системе.
Утвердительно «кивнём гривой», после чего будет запущена процедура проверки Интернет-соединения.
В случае, если наша виртуальная машина DevStation не имеет прямого подключения к Интернету, то нам любезно будет предложено настроить параметры прокси-сервера
Однако практическое применение показало, что инсталлятор не смог пройти через Squid с включённой аутентификацией, даже не смотря на то, что были явным образом указаны параметры прокси и учётные данные для аутентификации на прокси. В конечном итоге виртуальная машина DevStation на время инсталляции была выпущена в Интернет напрямую.
После того, как Интернет-соединение будет успешно проверено, нам сообщат о том, на какой диск будет установлена система DevStation.
Затем укажем предпочитаемое разрешение экрана. У нас ВМ и выбор здесь небольшой.
Затем из представленных списков выберем свою временную зону и раскладку клавиатуры:
Перед началом процесса установки DevStation нас предупредят о том, что все данные на диски будут уничтожены (инсталлятор по своему усмотрению выполнит разметку диска)
Будет запущена программа развёртывания DevStation, в ходе которой будет выполнена разметка диска, загрузка и установка всех необходимых пакетов из онлайн-репозитория проекта Thinstation размером примерно около 2GB.
Процедура может занять от 20 минут и более, в зависимости от пропускной способности вашего Интернет-канала и проворности диска виртуальной машины. Когда процесс будет завершён, мы получим несколько уведомительных сообщений о том, как собрать собственный загрузочный образ тонкого клиента…
…о том, что наша система DevStation способна выступать в качестве PXE-сервера…
…и о том, что загрузочный образ ISO, с которого мы выполняли установку теперь нам больше не нужен, как, впрочем, и прямое подключение к Интернет, и после перезагрузки мы уже можем использовать установленную систему…
На это этапе можно извлечь загрузочный ISO образ из привода виртуальной машины и нажать OK
Отправляем виртуальную машину в перезагрузку.
Сборка служебного образа Thinstation
Подключаемся к консоли только что развёрнутой сборочной среды DevStation. Учётные данные при этом вводить не требуется, так как в системе настроен авто-вход. Пароль пользователя root на нашей виртуальной машине DevStation — pleasechangeme. По умолчанию в DevStation включен Telnet-сервер и с этими учётными данными без проблем можно удалённо подключиться к системе. И как я понял, простого и вменяемого способа изменить такое поведение нет. Лишь в ветке обсуждения Thinstation Installer Disc Server — ssh access я нашёл пример того, как вместо Telnet можно включить SSH и сменить root-пароль, который подразумевает пересборку самого образа DevStation. Что скорее всего, как следствие, вызовет необходимость его переустановки. Как бы там ни было, включённая система DevStation нам нужна только на этапе сборки конечных образов тонких клиентов, а всё остальное время можно держать её выключенной.
Итак, с рабочего стола графической среды DevStation запускаем ярлык Terminal Chroot
В открывшейся консоли автоматически откроется файл справки README. Нажмём Q чтобы закрыть справочный файл и перейти в консоль.
Сменим текущий каталог на /build. Здесь мы и будем выполнять практически всю работу – настройку конфигурации под наших клиентов и сборку образов для их загрузки. В первую очередь нас интересуют два основных файла build.conf и thinstation.conf.buildtime. Первый файл определяет порядок сборки образов Thinstation, то есть то, какие в образ будут включены драйверы для поддержки оборудования (например поддержка определённых видео-адаптеров), какие будут добавлены пакеты приложений сервисного уровня (например поддержка NFS, NTP и т.п.) и прикладного уровня (например наличие веб-браузера, RDP-клиента и т.д.) и ряд других параметров сборки. Второй файл добавляется в собираемый образ и в основном служит для передачи неких параметров/переменных, которые могут определять тот или иной порядок работы тонкого клиента и включённых в него приложений.
На данном этапе перед нами стоит задача сборки служебного загрузочного образа Thinstation, который будет содержать в себе все драйверы, поддерживаемые средой Thinstation и с минимальными изменениями в файле build.conf. Этот служебный образ потребуется нам для того, чтобы на следующем этапе, загрузившись с него уже на конечных устройствах – тонких клиентах, выполнить процедуру генерации файлов профиля оборудования, которые в свою очередь будут использоваться для сборки конечных результативных образов тонких клиентов.
Удалим имеющуюся символическую ссылку на конфигурационный файл build.conf и создадим новый файл на базе шаблона build.conf.example
# rm build.conf
# cp build.conf.example build.conf
Обратите внимание на то, что все команды здесь мы будем выполнять в chroot-окружении, которое ссылается на каталог /thinstation/ относительно корневой системы DevStation.
С помощью текстового редактора внесём минимальные корректировки в файл build.conf.
В частности, нужно убрать комментарий (#) в строке содержащей запись package extensions-x (этот пакет содержит инструменты создания профилей оборудования, в том числе и скрипт hwlister.sh, который нам потребуется в дальнейшем)
В целом этого достаточно, однако на практике я столкнулся с багом squashfs and firmware.list generation #192, который, как я понимаю, на данный момент не исправлен. Баг приводит к тому, что в процессе генерации профиля оборудования, который мы будем делать на следующем этапе, не создаётся файл firmware.list, что может привести к отсутствию корректной поддержки необходимых аппаратных компонент тонкого клиента. В качестве обходного решения этой проблемы на данный момент является замена параметра initrdcmd (Compression Mode) в файле build.conf c «squashfs«…
… на «gzip -9«
Сохраним отредактированный файл build.conf и выполним команду сборки образа, включающего в себя все драйверы, которые поддерживает Thinstation
# ./build --allmodules
В процессе сборки будет задан вопрос о добавлении Firefox в собираемый образ. Если он Вам не нужен, вполне можно от него отказаться. То же самое касается включённых в конфигурации по умолчанию гостевых компонент VBox.
Процесс компиляции образа будет завершён созданием файла initrd размером около 175MB. Этот файл и содержит загружаемую ОС c ПО Thinstation для наших тонких клиентов. Напоминаю, что размер образа большой по той причине, что мы на этапе сборки включили в него все модули поддержки оборудования.
В конечном итоге на данный момент нас интересуют 2 файла, появившихся после компиляции — initrd (Initial RAM Disk) и vmlinuz (Linux Kernel). Файл vmlinuz служит для первичной загрузки и инициализации оборудования тонкого клиента, после чего начинается загрузка initrd.
После завершения процесса компиляции оба эти файла можно найти в каталоге /thinstation/build/boot-images/pxe/boot/ (в консоли «Terminal Chroot» это каталог /build/boot-images/pxe/boot/). Нужно скопировать эти два файла на наш WDS-сервер в каталог D:\RemoteInstall\Images\Linux
Создадим временную сетевую папку на нашем Windows-сервере и предоставим доступ на запись к этой папке для своей учётной записи. На DevStation-машине создадим новый каталог и смонтируем в него сетевую папку с Windows-сервера WDS, после чего скопируем в смонтированную папку все нужные нам файлы:
# mkdir /mnt/WDSTempShare
# mount.cifs //KOM-APP20/TempShare /mnt/WDSTempShare -o user=volodya
# cp /build/boot-images/pxe/boot/initrd /mnt/WDSTempShare/
# cp /build/boot-images/pxe/boot/vmlinuz /mnt/WDSTempShare/
# umount /mnt/WDSTempShare
На WDS-сервере из папки /TempShare перенесём файлы initrd и vmlinuz в каталог, из которого PXE-сервер будет отдавать PXE-клиентам файлы для загрузки D:\RemoteInstall\Images\Linux
Получение файлов профиля оборудования для Thinstation
Задача получения профиля оборудования заключается в том, чтобы загрузить эталонный компьютер (тонкий клиент с типичным для партии набором аппаратных компонент) с образа Thinstation собранного с опцией —allmodules и выполнить в этой системе скрипт /bin/hwlister.sh. Данный скрипт сгенерирует файлы профиля оборудования и попытается передать их на PXE-сервер, встроенный в DevStation.
Обратите внимание на то, что на данном этапе PXE-загрузку эталонного клиента (для генерации файлов профиля оборудования) мы можем произвести как с нашего WDS-сервера (ведь мы уже скопировали на него загрузочные файлы образа initrd и vmlinuz), так и с встроенного в DevStation PXE-сервера. Однако стоит учитывать то, что скрипт hwlister.sh будет пытаться передать получившиеся файлы профиля оборудования именно на тот PXE-сервер, с которого он был загружен. Поэтому для генерации профиля оборудования будет проще всего загружаться именно с PXE-сервера встроенного в DevStation.
При этом на сервере DevStation для загрузки будут использоваться именно те файлы initrd и vmlinuz, которые расположены в каталоге /thinstation/build/boot-images/pxe/boot/, так как этот каталог является корневым для встроенного в DevStation PXE-сервера. Именно поэтому важно, чтобы при попытке загрузки эталонной машины c PXE-сервера DevStation, на этом сервере в каталоге /thinstation/build/boot-images/pxe/boot/ находились файлы образа собранного с опцией —allmodules, который мы собрали в на предыдущем этапе. Это предотвратит потенциальные проблемы с распознаванием оборудования и полноценной загрузкой Thinstation.
***
Теперь на нашем Windows-сервере потребуется на время внести некоторые изменения:
- В оснастке управления сервером DHCP создадим резервирование IP для эталонной машины
- В оснастке управления сервером WDS отключим опцию интеграции с DHCP
Чтобы заставить нашу эталонную машину тонкого клиента загружать образ по сети не с WDS сервера, а с машины DevStation, создадим на DHCP-сервере резервирование IP адреса для эталонной машины с опциями 66 и 67:
66 = <IP-адрес DevStation>
67 = boot/pxelinux/pxelinux.0
Кстати, в значении 67 опции по замечанию из статьи Thinstation OS можно указать путь к другому файлу, чтобы изменить загрузку с TFTP на HTTP (это может несколько ускорить процесс загрузки образа). Для этого значение boot/pxelinux/pxelinux.0 нужно заменить на на boot/lpxelinux/lpxelinux.0. Однако, как я понял, загрузка по HTTP поддерживается не всеми сетевыми картами и поэтому в большинстве случаев всё же будет использоваться TFTP.
Так, как мы планируем использовать PXE сервер с DevStation, то в нашей конфигурации потребуется на время отключить PXE сервер, встроенный в WDS, чтобы из опций DHCP-сервера исчезла опция 060 = PXEClient. Если этого не сделать, то WDS может передавать PXE-клиенту не тот адрес PXE-сервера, который нас интересует.
***
Переходим на DevStation и разрешаем запись всем пользователям в корневой каталог встроенного TFTP сервера. Для этого можно либо выполнить консольную команду:
# chmod 777 /thinstation/build/boot-images/pxe
Либо в графической оболочке вызвать через пункт меню Start > DevStation > Toggle PXE Read/Write:
После вызова этого пункта меню мы увидим сообщение о том, что запись для PXE-сервера включена:
***
Включаем эталонный компьютер. При старте клиент получит с DHCP зарезервированный нами IP-адрес с опциями указывающими на PXE-сервер DevStation и начнёт оттуда загружать образ.
На загруженном эталонном клиенте в графической оболочке открываем меню Applications > Utilities и выбираем Terminal Emulator
В окне терминала запускаем генерацию профиля оборудования с передачей на машину DevStation командой:
# /bin/hwlister.sh
Заглянем в каталог /thinstation/build/boot-images/pxe на DevStation машине. Здесь появятся файлы переданные с клиента (в зависимости от «железа» клиента): module.list, package.list, firmware.list
Итак, аппаратный профиль эталонного клиента получен и передан на DevStation. Теперь можем выключить эталонный компьютер. Он нам больше не нужен.
На DevStation создаём новый подкаталог для профиля клиента в каталоге /thinstation/build/machine/ (/build/machine/ в chroot-окружении) и переносим туда только что полученные с эталонного клиента list-файлы
# mkdir /build/machine/HPt610
# cd /build/machine/HPt610
# mv /build/boot-images/pxe/*.list .
Далее созданный профиль под названием HPt610 мы будем использовать при сборке конечного рабочего образа (будем указывать имя этого каталог в build.conf).
Туже самую процедуру создания нового профиля из list-файлов, попавших в каталог /thinstation/build/boot-images/pxe, можно сделать и с помощью графической оболочки DevStation. Для этого будет достаточно вызвать пункт меню Start > DevStation > Make Machine Profile и указать имя нового профиля
***
Отключаем право на запись в PXE-сервере DevStation через ранее упомянутый пункт меню Start > DevStation > Toggle PXE Read/Write или командой в терминале:
# chmod 755 /thinstation/build/boot-images/pxe
***
Возвращаемся на наш Windows-сервер и в консоли WDS не забываем обратно включить опцию поддержки интеграции PXE с DHCP (вторую галочку)
А в консоли управления DHCP-сервером удаляем созданное ранее резервирование, которое мы делали под эталонного клиента.
Сборка рабочего образа Thinstation
На данном этапе можно считать, что у нас всё готово для сборки конечного рабочего образа Thinstation, который будет использоваться для наших тонких клиентов определённой аппаратной конфигурации. Процедура сборки аналогична той, что мы рассмотрели ранее, когда делали служебный образ Thinstation с главным отличием в том, что сборка выполняется без ключа —allmodules. При этом в собираемый образ Thinstation будут добавлены только те модули поддержки оборудования, которые перечислены в незакомментированных строчках перечисляющих профили оборудования (machine …) в файле build.conf.
Базовую информацию о структуре конфигурационного файла build.conf можно получить из документа Thinstation Wiki — build.conf. Логика простая – включаем только те модули и пакеты, которые нужны для работы наших тонких клиентов, всё что не нужно – отключаем (комментируем), так как каждый лишний модуль/пакет увеличивает размер образа который получится в результате компиляции. При этом лучше не отключать те вещи, значение которых вам непонятно, если не хотите потерять время на отладке, которой можно было и не заниматься.
Далее рассмотрим правки, которые нужно внести в build.conf исходя из условий нашей задачи.
В секции #!Hardware добавим запись о ранее созданном профиле machine HPt610
В секции #!!File System Support оставим модули usb-storage, isofs, udf, vfat. Остальные модули закомментируем. Эти модули нам потребуются на случай необходимости загрузки не по сети а с накопителей, типа USB-флэш диск.
В секции #!!Miscellaneous (я обнаружил в файле 2 таких секции) в списке пакетов закомментируем ранее включённый пакет extentions-x, так как на рабочем образе тонкого клиента в нём нет необходимости. Для возможности нормальной автоматической конфигурации сети в процессе загрузки тонкого клиента включим пакет ts-classic, выключим networkmanager и добавим autonet.
В секции #!!X закомментируем пакеты xorg7-vmware и, при необходимости, раскомментируем прочие (например в нашем случае нужен пакет xorg7-ati). В любом случае рекомендуется оставлять пакет xorg7-vesa, так как он будет использован, если родной пакет драйвера не обнаружен или по какой-то причине не заработал.
В секции #!!Locale закомментируем все языковые пакеты за исключением тех. которые могут нам быть полезны: locale-en_US и locale-ru_RU.
В секции #!Applications закомментируем пакеты все ненужные нам пакеты, например firefox, open-vm-tools и vboxguest. В нашем случае в этой секции остаться только пакет freerdp.
В секции #!!Window Managers комментируем все пакеты оконных менеджеров, так как в нашей ситуации в них нет необходимости.
В секции #!!Other services комментируем пакеты cups (печать в нашем случае не нужна) и samba-client (нам не требуется, чтобы тонкий клиент мог куда-то попасть по SMB).
В секции #!!Basic раскомментируем параметр fastboot, чтобы использовать механизм быстрой загрузки образа (HTTP вместо TFTP). Зададим значение пароля в параметре rootpasswd. Закомментируем параметры xorgvncpasswd, storagepasswd, dualupasswd, sambapasswd, так как в них нет нужды. Так, как мы собрались использовать быструю загрузку HTTP, зададим параметр baseurl, в котором укажем URL-адрес веб-сервера и параметр basepath, в котором укажем имя папки на веб-сервере, в которой нужно искать файлы для загрузки. Параметр initrdcmd вернём в исходное значение «squashfs».
В конечном счёте (без учёта закомментированных строк) конфигурационный файл build.conf в нашем случае примет следующий вид:
#!Hardware
machine HP-t610
#!!Filesystem Support
module usb-storage
module isofs
module udf
module vfat
#!!Miscellaneous
package overlayfs
package ts-classic
package autonet
package udisks
package ntp
package cpufreq
#!!X related
package xorg7-vesa
package xorg7-ati
#!!Locale
package locale-en_US
package locale-ru_RU
#!Applications
package freerdp
#!!Miscellaneous
package fonts-TTF-BH
package fonts-TTF-vera
package fonts-TTF-liberation
#!!Basic
param fastboot true
param rootpasswd Str0nGpWd
param bootlogo true
param boottheme default
param splash silent
param fbmtrr 0
param fbnocrtc true
param fbsm ywrap
param bootresolution 1280x768-32
param desktop file:./backgrounds/Hive_Lite.jpg
param defaultconfig thinstation.conf.buildtime
param basename thinstation
param basepath ThinClients
param baseurl http://10.1.4.10
param haltonerror false
param hardlinkfs true
param sametimestmp true
param initrdcmd "squashfs"
param bootverbosity 3
#!!Advanced
param downloads /downloads
param bootimages "iso syslinux pxe"
param syslinuxtheme "default"
package alltimezone
param allres true
param allfirmware true
param blacklist snd-pcsp.ko
***
Следующим правим конфигурационный файл thinstation.conf.buildtime, предварительно сделав копию оригинального файла на всякий случай:
# cp thinstation.conf.buildtime thinstation.conf.buildtime.original
Базовую информацию об этом файле можно получить в документе Thinstation Wiki — thinstation.conf, а узнать о возможных параметрах и их описании можно в файле thinstation.conf.sample.
Основную массу имеющихся в файле thinstation.conf.buildtime параметров можно оставить без изменений. Изменим и добавим лишь те параметры которые относятся к специфике нашей задачи:
NET_FILE_ENABLED=On
NET_FILE_METHOD=wget
...
SESSION_0_TYPE=freerdp
SESSION_0_TITLE="RDP"
SESSION_0_AUTOSTART=on
...
NET_USE=LAN
NET_USE_DHCP=ON
NET_DHCP_DELAY=30
NET_DHCP_TIMEOUT=30
NET_LINKWAIT=30
...
Добавленными параметрами NET_FILE_* мы укажем на необходимость загрузки конфигурационных файлов Thinstation по сети по протоколу HTTP. Это позволит нам разместить на веб-сервере конфигурационные файлы thinstation.conf-<MAC>, настраивающие конкретных тонких клиентов, не меняя при этом настройки внутри раздаваемого образа. Далее мы рассмотрим пример такого файла.
В параметрах SESSION_0_* вместо используемого по умолчанию графического оконного менеджера xfwm4 мы сразу будем вызывать RDP-клиента freerdp. А общие для всех наших клиентов параметры подключения RDP-клиента к RDS-серверу (имя сервера, опции RDP-сессии) мы также вынесем в дальнейшем на веб-сервер в файл thinstation.conf.network. Его пример мы также рассмотрим далее.
В перечисленных параметрах NET_* мы зададим те опции тонкого клиента, которые могут повлиять на корректность инициализации сети в загружаемой системе и успешность загрузки по сети, как таковую. Например первая опция NET_USE=LAN задаёт приоритет использования проводных сетевых адаптеров перед беспроводными (может быть полезно, если тонкий клиент имеет и беспроводной и проводной адаптеры и один мешает загрузке другого). Опции задержки и таймаутов нужны для ожидания инициализации драйвера сетевого адаптера. На практике столкнулся с тем, что неуспевающий пройти инициализацию сетевой адаптер ломал загрузку по сети через HTTP.
***
Так как по условиям нашей задачи требуется авто-вход в RDP-сессию, удалим пару файлов, которые предотвращают авто-вход для freerdp
# rm /thinstation/build/packages/freerdp/etc/cmd/freerdp.getuser
# rm /thinstation/build/packages/freerdp/etc/cmd/freerdp.getpass
Это позволит нам передавать учётные данные для подключения к RDS-серверу клиенту freerdp в виде параметров. Эти параметры мы будем хранить в файлах thinstation.conf-<MAC>, которые тонкие клиенты будут получать с веб-сервера в процессе загрузки. В целом, с точки зрения безопасности, такое решение может быть неверным, однако учитывая условия нашей задачи (изоляцию сегмента сети тонких клиентов и одинаковый ограниченный набор возможностей конечных пользователей работающих на всех тонких клиентах) такая конфигурация вполне имеет право на жизнь.
***
Теперь на DevStation всё готово для сборки рабочего образа. Запускаем сборку из chroot-окружения:
# ./build
Так, как в конфигурационном файле build.conf мы включили поддержку fastboot, то при сборке вместо одного «тяжёлого» файла initrd мы получим «легковесный» initrd и дополнительный squash-файл, который и будет в себе содержать бОльшую долю загружаемых данных.
Таким образом, подразумевается что первая часть (файл initrd) будет загружаться на PXE-клиенте по протоколу TFTP (с сервера WDS), а вторая часть (файл lib.squash) по протоколу HTTP (с веб-сервера IIS).
Получившиеся в процессе компиляции файлы initrd и vmlinuz мы скопируем на WDS сервер в ранее созданный нами каталог D:\RemoteInstall\Images\Linux (перезаписав возможно ранее размещённые там файлы от служебного образа Thinstation), а о файле lib.squash мы поговорим чуть позже, после настройки веб-сервера IIS.
Настройка веб-сервера IIS для поддержки Fast Boot
Так как на этапе сборки рабочего образа Thinstation мы включили опцию поддержки fastboot в build.conf, а в thinstation.conf.buildtime указали расположение веб-сервера Fast Boot, то теперь нам нужно разместить получившийся ранее Squash-файл на этом веб-сервере, чтобы в процессе загрузки основной «тяжёлой» части образа использовался не протокол TFTP а протокол HTTP. Это позволит ускорить время загрузки ОС тонкого клиента.
В нашем случае в качестве веб-сервера выступает IIS, который мы уже развернули ранее вместе с WDS, поэтому выполним его настройку, например через IIS Manager. Нам нужно сделать две вещи. Включить поддержку нового MIME-типа .squash и убедиться в том, что к сайту разрешён анонимный доступ.
В оснастке IIS Manager выберем сайт, в нашем случае это Default Web Site.
В настройках сайта выберем пункт MIME Types и используя в меню Actions ссылку Add добавим новый MIME-тип: filename extension = .squash , MIME type = application/octet-stream
Если не выполнить данную настройку, то наш веб-сервер IIS приходящим к нему PXE-клиентам попросту не будет отдавать squash-файл, а будет возвращать ошибку доступа.
Перейдём к разделу настроек сайта Authentication и убедимся в том, что включена анонимная аутентификация
Опять же, это нужно для того, чтобы приходящие PXE-клиенты без проблем могли скачать нужные им файлы.
***
Скопируем с DevStation появившийся после компиляции файл /thinstation/build/boot-images/pxe/boot/lib.squash в подкаталог ThinClients каталога, в котором размещена корневая папка сайта IIS (по умолчанию C:\Inetpub\wwwroot). Вспомним, что именно этот подкаталог веб-сервера мы указывали в параметре basepath в файле build.conf перед компиляцией рабочего образа Thinstation.
Использование разных сборок и конфигураций Thinstation
Есть разные походы к тому, каким образом можно настроить разный порядок загрузки «разношёрстных» тонких клиентов и выбор того или иного подхода зачастую зависит от исходных условий среды реализации. Исключительно оптимальных подходов, на мой взгляд здесь не существует, так как каждое решение имеет свои преимущества и недостатки. По имеющимся исходным условиям я выбрал вариант с выдачей PXE-клиентам загрузочных образов Thinstation (и конфигурационных файлов) в зависимости от их конкретных MAC-адресов. Поговорим о том, как реализовать подобную схему.
Мы помним, что для размещения файлов образа Thinstation initrd и vmlinuz на WDS мы использовали каталог D:\RemoteInstall\Images\Linux. В процессе загрузки PXE клиенты сначала скачивают файл D:\RemoteInstall\Boot\pxelinux.cfg\default (на него ведут сим.линки из D:\RemoteInstall\Boot\x64\pxelinux.cfg и D:\RemoteInstall\Boot\x86\pxelinux.cfg), в котором указан путь к файлам initrd и vmlinuz. Этот файл мы создавали ранее на этапе настройки WDS.
Мы можем заставить отдельно-взятого тонкого клиента Thinstation вместо настроек, указанных в файле default использовать какие-то другие настройки порядка загрузки, например указав путь к другим файлам initrd и vmlinuz. Для этого в каталоге PXE-сервера D:\RemoteInstall\Boot\pxelinux.cfg\ можно создать файл, с содержанием аналогичным файлу default, но с именем в формате 01-<MAC>. Например, для клиента с MAC-адресом 00-15-5d-00-40-36 файл должен иметь имя 01-00-15-5d-00-40-36.
Содержимое файла может иметь следующие настройки:
DEFAULT RDP
PROMPT 0
NOESCAPE 1
ALLOWOPTIONS 0
LABEL RDP
MENU DEFAULT
KERNEL /Linux/HP-t610/vmlinuz
APPEND initrd=/Linux/HP-t610/initrd splash=silent,theme:default load_ramdisk=1 ramdisk_blocksize=4096 root=/dev/ram0 ramdisk_size=786432 loglevel=3 console=tty1 vt.global_cursor_default=0 LM=3 FASTBOOT_URL=http://10.1.4.10/ThinClients/HP-t610/
Как видно, в качестве пути к файлам initrd и vmlinuz, которые загружаются с нашего PXE-сервера по протоколу TFTP, здесь уже указаны пути отличные от тех, что могут быть указаны в файле D:\RemoteInstall\Boot\pxelinux.cfg\default. То есть в каталоге, из которого PXE-сервер отдаёт клиентам загрузочные образы мы создали подкаталог /Linux/HP-t610/ (физический путь D:\RemoteInstall\Images\Linux\HP-t610\) с файлами определённой сборки образа нашего клиента Thinstation.
Также можно обратить внимание на то, что строку инициализации initrd здесь мы дополняем параметром FASTBOOT_URL, который ссылается на веб-сервер, где у нас расположен squash-файл ассоциированный с initrd-файлом. Нетрудно догадаться, что на веб-сервере в каталоге /ThinClients/ у нас также создан подкаталог под конкретную сборку образа — /ThinClients/HP-t610/.
Таким образом мы организовали возможность раздачи файлов загружаемого образа Thinstation в зависимости от MAC-адреса PXE-клиента.
***
Теперь вспомним, что по условиям нашей задачи требуется, чтобы каждый загруженный экземпляр Thinstation автоматически создавал RDP-сессию на RDS-сервере, где автоматически должно запускаться определённое бизнес-приложение. А подключение к RDS-серверу подразумевает передачу каких-то учётных данных, используемых на этом сервере. При этом, как мы понимаем, каждый тонкий клиент должен передавать уникальные учётные данные, чтобы иметь выделенную RDP-сессию на сервере. Получается, что у нас добавляется необходимость дополнительной уникальной для каждого клиента настройки ПО freerdp, запускаемого в среде Thinstation.
Реализовать это можно с помощью дополнительно загружаемых с веб-сервера файлов вида thinstation.conf.network и thinstation.conf-<MAC>. И не забываем про то, что в процессе сборки рабочего образа Thinstation мы настаивали файл thinstation.conf.buildtime, который попал в этот образ. Thinstation обрабатывает все эти thinstation.conf* файлы в следующем порядке (процитирую источник):
Первым применяется thinstation.conf.buildtime при начальной загрузке образа, затем происходит получение файла thinstation.conf.network, и далее индивидуальные файлы конфигурации.
Если значение переменной SESSION_0_TYPE=rdesktop в файле thinstation.conf.network, а в thinstation.conf-ИМЯ_КОМЬЮТЕРА уже SESSION_0_TYPE=freerdp, то в результате загрузится freerdp.
Получить общую информацию о том, какими вообще методами могут загружаться конфигурационные файлы Thinstation можно из документа Thinstation Wiki – Configuration. Как я уже сказал, мы будем использовать загрузку дополнительных конфигурационных файлов тонких Thinstation по протоколу HTP с веб-сервера IIS. Поэтому сначала создадим на нашем веб-сервере файл групповых настроек, затем файл персональных настроек тонкого клиента.
***
На веб-сервере (вспомним параметр baseurl из build.conf) в каталоге, где уже размещаются squash-файлы (вспомним параметр basepath из build.conf) создадим общий для всех клиентов конфигурационный файл thinstation.conf.network:
SESSION_0_AUTOSTART=ON
SESSION_0_TYPE=freerdp
SESSION_0_TITLE="RDP"
SESSION_0_FREERDP_SERVER="10.1.4.10"
RECONNECT_PROMPT=FORCE
NET_TIME_SERVER="10.1.4.10"
TIME_ZONE="Europe/Moscow"
CRON_JOB1="30 18 * * * /sbin/poweroff"
Этот файл будет содержать общие для всех клиентов параметры работы ОС Thinstation (запуск оболочки в опциях SESSION_0_*) и адрес RDS-сервера (SESSION_0_FREERDP_SERVER). Опция RECONNECT_PROMPT=FORCE, позволит автоматически выполнять переподключение к RDS-серверу в случае попыток завершения сессии и/или проблем с временной недоступностью сервера. Присутствующие здесь опции, связанные со временем и планировщиков задач рассмотрим далее.
***
Теперь в этом же каталоге веб-сервера создадим файл индивидуальных настроек тонкого клиента с именем формата thinstation.conf-<MAC>. В нашем примере файл получится с именем thinstation.conf-00155D004036. В этом файле будут указаны опции подключения freerdp, касающиеся только этого конкретного тонкого клиента:
SESSION_0_FREERDP_OPTIONS="/u:'thinusr-00155d004036' /p:'rdpClPwd00155d004036' /bpp:32 /cert-ignore /sec:nla +fonts +aero"
Разумеется на RDS-сервере мы параллельно должны создать соответствующую учётную запись пользователя с указанным именем и паролем. Эта учётная запись будет ассоциироваться с данным тонким клиентом.
Кстати, информацию о допустимых опциях freerdp можно найти в документе: FreeRDP Wiki – CommandLineInterface.
В конечном итоге на веб-сервере мы получим примерно следующую картину:
***
Ещё раз напомню о том, чего не стоит упускать для успешной загрузки конфигурационных файлов Thinstation с веб-сервера.
Образ Thinstation должен быть собран со следующими параметрами:
- В файле thinstation.conf.buildtime должны присутствовать директивы NET_FILE_ENABLED=On
и NET_FILE_METHOD=wget - В файле build.conf должен быть указан пусть каталоге на веб-сервере, где искать файлы конфигурации в параметрах baseurl и basepath
Кроме этого, не стоит забывать про ограничения MIME-типов которые накладывает IIS. То есть нужно решить вопрос возможности загрузки файлов с именами формата thinstation.conf*
Для этого ранее описанным способом на веб-сервере IIS добавим MIME-типы .network и .conf-<MAC-клиента> (для всех допустимых MAC-адресов) с типом text/plain:
После этого убедимся в том, что через браузер мы можем без проблем скачать соответствующие файлы с веб-сервера по ссылкам типа:
- http://10.1.4.10/ThinClients/thinstation.conf.network
- http://10.1.4.10/ThinClients/thinstation.conf-00155D004036
Если заниматься настройкой MIME-типов в IIS под каждый MAC-адрес не очень хочется, то можно разрешить загрузку файлов с любым расширением для определённого каталога веб-сервера. Для того, чтобы это сделать воспользуемся рекомендацией из статьи KB326965 — IIS 6.0 does not serve unknown MIME types и добавим для соответствующего каталога IIS универсальную запись: * = application/octet-stream
***
Теперь можно считать, что наш веб-сервер готов к раздаче PXE-клиентам разных сборок и конфигураций Thinstation.
Тестируем запуск тонкого клиента
Перед тем, как выполнять проверочный запуск тонкого клиента, ещё раз вспомним о том, какие файлы мы имеем для его автоматической загрузки и настройки, и где эти файлы расположены на нашем Windows-сервере управления:
- После компиляции рабочего образа Thinstation мы имеем три файла, которые распределены на сервере следующим образом:
- D:\RemoteInstall\Images\Linux\HP-t610\vmlinuz
- D:\RemoteInstall\Images\Linux\HP-t610\initrd
- C:\inetpub\wwwroot\ThinClients\HP-t610\lib.squash
- Файл настроек загрузки PXE-клиента:
- D:\RemoteInstall\Boot\pxelinux.cfg\01-00-15-5d-00-40-36
- Конфигурационные файлы Thinstation:
- C:\inetpub\wwwroot\ThinClients\thinstation.conf.network
- C:\inetpub\wwwroot\ThinClients\thinstation.conf-00155D004036
При запуске клиент с PXE-сервера получит по TFTP файлы vmlinuz и initrd, указанные в \pxelinux.cfg\01-00-15-5d-00-40-36 и загрузит их в память тонкого клиента…
…на следующем этапе (опять же согласно настроек \pxelinux.cfg\01-00-15-5d-00-40-36) с веб-сервера будет загружен файл lib.squash и произведено применение конфигурационных файлов thinstation.conf.network и thinstation.conf-00155D004036
На последней стадии загрузки, согласно условий нашей задачи, будет запущен RDP-клиент freerdp с автоматическим подключением к серверу RDS.
Если что-то «пошло не так», перепроверим все конфигурационные файлы и заглянем в раздел Поиск решений проблем (далее).
Загрузка с USB накопителя
В некоторых случаях может получиться так, что загрузка образа тонкого клиента по сети не самый лучший вариант, например, из-за слабеньких и неустойчивых каналов передачи данных между конечным тонким клиентом и PXE-сервером. В таком случае, в качестве исключения, можно воспользоваться загрузкой Thinstation с локального USB-накопителя, подключённого в порт тонкого клиента.
При каждой процедуре компиляции рабочего образа Thinstation, которую мы рассматривали ранее, помимо уже знакомых нам файлов initrd/vmlinuz/lib.squash, генерируется файл загрузочного ISO-образа:
/build/boot-images/iso/thinstation.iso
Однако, как я понял, если образ Thinstation был скомпилирован с параметром fastboot в build.conf, то он для локальной загрузки не подойдёт. Поэтому, для того, чтобы получить отдельно загружаемый (без проблем) с локального накопителя образ, нам потребуется скомпилировать его с выключенной опцией fastboot.
В некоторых источниках можно встретить рекомендации по специальной настройке thinstation.conf.buildtime в процессе подготовки к компиляции локально загружаемого образа. Однако я таких настроек не выполнял, и у меня загрузка тонкого клиента с локального USB-накопителя успешно прошла из образа по сути аналогичного, тому что я собирал для сетевой загрузки с единственным упомянутым исключением — выключенным fastboot.
Структура расположения файлов внутри получающегося при компиляции ISO-образа такова:
g:\>tree /f
Структура папок тома THINSTATION
Серийный номер тома: 65F3-6981
G:.
│ syslinux.cfg
│
└───boot
│ image.md5
│ initrd
│ vmlinuz
│
└───syslinux
boot.cat
isolinux.bin
isolinux.cfg
ldlinux.c32
product.txt<\pre>
То есть, мы видим, что нужные для загрузки системы файлы vmlinuz и initrd имеются в каталоге boot (lib.squash при этом не используется, так как образ собирался с выключенным fastboot). При этом конфигурационные файлы thinstation.conf.network и thinstation.conf-00155D004036, как и при сетевой загрузке с веб-сервера, что по прежнему нам даёт преимущества управления некоторыми параметрами конфигурации клиентов в централизованном месте.
Для записи загрузочного ISO-образа на USB-накопитель можно использовать, например, свободно распространяемую утилиту Rufus:
Работа тонких клиентов по расписанию
Как мы помним, согласно исходных условий, нам нужно решить вопрос автоматизации цикличной работы тонких клиентов. То есть утром каждого рабочего дня клиентов нужно автоматически включать, а вечером — автоматически выключать. Фактически эту задачу можно разложить на три составляющих момента:
- Синхронизация времени на тонких клиентах
- Включение клиентов по расписанию
- Выключение клиентов по расписанию
***
Синхронизация времени нам нужна для того, чтобы исключить возможные курьёзы, связанные с работой тонких клиентов по расписанию. Согласитесь, будет неприятно, если клиент со сбившимся по какой-то причине временем, будет выключаться в середине рабочего дня, считая, что рабочий день кончился.
Учитывая изолированность наших тонких клиентов, единственным источником, с которым они могут синхронизировать время, является наш выделенный Windows-сервер. Давайте настроим службу времени на этом сервере.
Так как наш Windows-сервер является виртуальной машиной Hyper-V, то в первую очередь в свойствах этой виртуальной машины отключим функцию синхронизацию времени с хостом:
Для настройки службы времени «Windows Time» (w32time) будем использовать входящую в состав Windows Server утилиту w32tm, которая будет управлять значениями ключа реестра HKLM\System\CurrentControlSet\Services\W32Time
Конфигурируем службу времени на синхронизацию с внешним NTP-сервером командой:
net stop w32time
w32tm /config /manualpeerlist:"10.10.0.2 10.11.0.3" /syncfromflags:MANUAL
net start w32time
Проверяем статус синхронизации командой:
w32tm /query /status
Для того, чтобы служба времени работала, не только как NTP-клиент, но и как NTP-сервер, нужна дополнительная правка реестра:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer]
"Enabled"=dword:00000001
После правки реестра отправляем службе NTP информацию об обновлении конфигурации (последняя команда покажет текущий статус конфигурации):
w32tm /config /update
w32tm /query /configuration
Учитывая то обстоятельство, что в в нашем случае Windows-сервер не является членом домена, у нас может возникнуть проблема с автоматическим запуском службы времени в процессе загрузки системы. Проблема эта известна давно и описана в статье KB2385818 — Windows Time service doesn’t start automatically on a workgroup computer that’s running Windows 7 or Windows Server 2008 R2. Суть проблемы в том, что служба времени имеет триггер, который выполняет запуск службы только в том случае если система является членом домена. Проверить это можно командой:
sc qtriggerinfo w32time
Для решения проблемы воспользуемся рекомендациями из вышеуказанной статьи и выберем один из предложенных методов – подмена триггера. Заменим для службы времени триггер проверки членства в домене на триггер проверки наличия сетевого подключения:
sc triggerinfo w32time start/networkon stop/networkoff
После перезапустим сервер и убедимся в том, что служба запускается автоматически без проблем.
Убедимся в том, что в системе висит UDP-прослушиватель на 123 порту:
C:\>netstat -na | findstr 123
UDP 0.0.0.0:123 *:*
UDP [::]:123 *:*
Создадим правило в Windows Firewall, разрешающее входящие подключения на порт NTP-сервера:
New-NetFirewallRule -DisplayName "NTP Server (UDP-In)" -Direction "Inbound" -Protocol "UDP" -Action "Allow" -LocalPort "123"
***
Теперь посмотрим на протокол NTP с точки зрения нашего тонкого клиента. Первое, о чём стоит заметить, это то, что для поддержки возможности синхронизации времени, образ Thinstation должен быть собран с включённым пакетом package ntp в build.conf (в приведённом ранее примере build.conf этот пакет включен).
Информацию о NTP-сервере, как источнике синхронизации времени можно указать в любом из thinstation.conf* файлов. Мне показалось более удобным указать эти опции в файле thinstation.conf.network, который лежит на веб-сервере и централизовано раздаётся всем тонким клиентам. Как минимум можно указать параметры (в приведённом ранее примере thinstation.conf.network эти параметры имеются):
NET_TIME_SERVER="10.1.4.10"
TIME_ZONE="Europe/Moscow"
Если эти условия соблюдены, то можно попробовать с загруженного тонкого клиента (а мы помним про то, что у нас есть возможность подключения к консоли клиента через Telnet) выполнить команду получения времени с нашего сервера времени:
ts_00155D004036:~# ntpdate 10.1.4.10
9 Feb 16:52:23 ntpdate[4762]: step time server 10.1.4.10 offset 1.681994 sec
Как видим, ответ от NTP-сервера получен. В конфигурации по умолчанию NTP-клиент, встроенный в Thinstation, будет выполнять синхронизацию времени в начале каждого очередного часа.
***
Теперь поговорим об автоматизации выключения тонких клиентов по расписанию. Thinstation, как Linux-система, имеет на борту работающий планировщик cron. Конфигурационные файлы thinstation.conf* позволяют нам добавлять до 9 заданий в этот планировщик с помощью параметров CRON_JOB[1-9]. Пример добавления задачи на отключение тонкого клиента по расписанию — каждый день в 19:30:
CRON_JOB1 = "30 19 * * * /sbin/poweroff"
Опять же отмечу, что в приведённом ранее примере thinstation.conf.network эта задача cron была упомянута. В случае необходимости мы можем разным тонким клиентам аналогичным образом задавать уникальные параметры отключения, например, через файлы thinstation.conf-<MAC>.
Добавленное через конфигурационные файлы Thinstation задание cron в загруженном клиенте попадёт в файл /tmp/crontab
Кстати, здесь же можем увидеть и задания синхронизации времени (первое и второе задание).
***
Задача автоматизации включения тонких клиентов по расписанию, как и прочие задачи, может иметь разные варианты реализации. Учитывая то, что в нашем случае все клиенты находятся в рамках одного физического сегмента сети, мы можем использовать функционал пробуждения клиентов по сети (Wake On Lan) по MAC-адресам.
Для этой цели я воспользовался ещё одной бесплатной утилитой командной строки для Windows: Wake On Lan Command Line
Синтаксис использования утилиты прост:
wolcmd [MAC-адрес] 255.255.255.255 255.255.255.255 7
То есть с помощью этой утилиты мы посылаем в сеть широковещательный запрос с указанием MAC-адреса интересующего нас клиента.
При этом замечено, что клиент будет реагировать на WoL-запрос, только в том случае, если в прошлый раз система была выключена штатно. Если же выключение произведено жёстко (например нажата кнопка питания с удержанием), то для последующего успешного запуска потребуется обесточить клиента (извлечь/вставить шнур питания).
В общем всё, что здесь остаётся сделать, это создать на нашем Windows-сервере управления командный файл с вызовом wolcmd и добавить его в планировщик заданий Windows на выполнение в нужное время, например, в 07:50 утра каждого рабочего дня недели.
Поиск решений проблем
Если в процессе загрузки по сети возникают проблемы, например, когда останавливается и «замерзает» индикатор загрузки на сплэш-заставке, то может потребоваться получить доступ к расширенной информации о ходе загрузки. Для этого нужно изменить параметры вызова initrd в конфигурационном файле PXE-сервера. Например так выглядит ранее приведённый пример вызова initrd в штатной ситуации:
...
APPEND initrd=/Linux/HP-t610/initrd splash=silent,theme:default load_ramdisk=1 ramdisk_blocksize=4096 root=/dev/ram0 ramdisk_size=786432 loglevel=3 console=tty1 vt.global_cursor_default=0 LM=3 FASTBOOT_URL=http://10.1.4.10/ThinClients/HP-t610/
Чтобы отключить отображение сплэш-заставки, уберём параметр splash=silent,theme:default. Чтобы перенаправить вывод процесса загрузки на основную консоль, заменим console=tty1 на tty0. Дополнительно можно увеличить уровень логирования, например loglevel=32. В тоге получится примерно так:
...
APPEND initrd=/Linux/HP-t610/initrd load_ramdisk=1 ramdisk_blocksize=4096 root=/dev/ram0 ramdisk_size=786432 loglevel=32 console=tty0 vt.global_cursor_default=0 LM=3 FASTBOOT_URL=http://10.1.4.10/ThinClients/HP-t610/
<
p align=»center»>***
Я на практике столкнулся с тем, что в загружаемой системе Thinstation сеть не успевает пройти полную инициализацию до того момента, как система пытается получить по HTTP squash-файл или файлы конфигурации. В итоге возникают ошибки типа «No lease, forking to background«, «Network is unreachable» и т.п.
В таких случаях на этапе сборки образа можно покрутить параметры в thinstation.conf.buildtime, связанные с сетью (NET_*). А получить по ним информацию можно из файла thinstation.conf.sample. Например можно для начала задать увеличенные значения интервалов ожидания и таймаутов, как было показано на выше.
NET_DHCP_DELAY=60
NET_DHCP_TIMEOUT=60
NET_LINKWAIT=60
Можно попробовать использовать эти параметры как по отдельности так и комбинировать их вместе.
***
Если сразу строить описанный стенд от начала и до конца, то допустив где-нибудь по пути ошибку, можно потратить немало времени на излишний «разбор полётов». Поэтому лучше действовать поступательно, то есть, например, сначала добиться загрузки по сети без использования fastboot, а потом уже, если всё работает как следует, переходить к усложнению конфигурации. Дополнительно в поиске решений проблем может оказаться полезной статья Thinstation Wiki — Debugging
Дополнительные источники информации:
- Thinstation / maintained by Donald A. Cupp Jr.
- Thinstation Wiki
- Peter Hinchley — Use Thinstation to Build a Network-Bootable RDP-Enabled Thin Client Image
- Блог QUADED — Сборка Thinstation образа
- ITSave — Thinstation 5.x
- Thinstation по русски
- Thinstation Доработка тонкого клиента
- PXE загрузка Thinstation в зависимости от железа тонкого клиента
- Загрузка PXE для разных платформ тонких клиентов
TotKtotam, цитата — со стороннего сайта
Небольшое отступление. Если в вашей сети уже есть DHCP сервер, то можно отказаться от встроенного в Tftpd32(64), при условии что в текущем можно прописать опции 66 — адрес TFTP сервера, и 67 — путь до загрузочного файла.
В моем случае, в сети DHCP сервер присутствует. Но настроить указанные выше опции в нем невозможно, так как запущен он на простеньком роутере D-Link DIR-615.
Выходов из данной ситуации два, либо полностью отказаться от DHCP сервера на роутере, но при этом постоянно нужно будет держать включенным компьютер с запущенной программой Tftpd32(64) с активным DHCP. Чтобы остальные клиенты сети, в частности мобильные устройства (планшеты, телефоны) могли работать. Либо использовать сразу оба DHCP сервера, при этом каждому выделить свой диапазон адресов.
У меня в сети стоит микротик, у него в настройках указан «следующий DHCP», который ссылается на мой tftpd сервер, на tftpd IP из той же подсети что и роутер, только указан диапазон адресов, который не пересекается с DHCP сервером на микротике
Мы предлагаем Microsoft Windows Server 2019 в качестве дополнения к вашему выделенному серверу по выгодным ценам.
Чтобы установить Windows Server 2019 на свой сервер, закажите соответствующее дополнение через Robot . Здесь вы также найдете условия.
По порядку установка происходит на вашем сервере автоматически. Вы получите уведомление по электронной почте, как только это будет успешно завершено.
Доступ к удаленному рабочему столу
Впоследствии вы можете подключиться к серверу с полными правами администратора с помощью клиента удаленного рабочего стола. Большинство вариантов Windows поставляются с клиентом удаленного рабочего стола (rdp), который находится в меню «Пуск» -> «Программа» -> «Стандартные». В Linux установите пакет rdesktop или одну из множества альтернатив. Windows поставляется с программой mstsc, хотя можно использовать альтернативы, такие как Терминалы .
Для входа используйте имя пользователя « Администратор» и пароль, который вы выбрали при заказе надстройки.
Дополнительные лицензии RDP (на пользователя) можно заказать через запрос поддержки: Windows Server Remotedesktopservices
Изменить пароль при первом доступе
При первом входе в систему Windows попросит вас изменить исходный пароль. Это сделано из соображений безопасности сервера. Выберите надежный пароль, который нелегко угадать.
Обратите внимание, что первый вход в систему не позволяет аутентификацию на сетевом уровне. Дополнительные сведения см. В разделе « Изменение пароля Windows при первом входе в систему» .
Программный RAID 1 / зеркалирование дисков
Windows 2019 позволяет объединить несколько установленных дисков в программный RAID 1 (зеркальное отображение), чтобы в случае выхода из строя одного диска все данные по-прежнему сохранялись на втором.
Когда вы заказываете у нас сервер Windows, он автоматически оснащается зеркалированием, если есть два диска одинакового размера.
Настройка программного RAID в Windows 2019 аналогична настройке в Windows 2016. Инструкции по настройке программного RAID в Windows Server можно найти здесь: Программный RAID Windows Server
Установите Internet Information Server (IIS)
Мы составили краткое руководство, которое поможет вам легко установить Internet Information Server (IIS). Конфигурация IIS такая же, как и в Windows Server 2016, и руководство можно найти здесь: Установка Windows Server IIS
Среда восстановления Windows / Консоль восстановления
Если необходимо восстановить загрузчик или загрузочный сектор или, например, необходимо загрузить полную резервную копию ранее созданной резервной копии из пространства резервных копий , полезна консоль восстановления Windows (среда восстановления / RE).
Наследие
Во-первых, вам следует заказать удаленную консоль KVM Console и попросить предварительно загрузить среду восстановления Windows , чтобы у вас был прямой доступ к монитору сервера и клавиатуре. Технические специалисты перезапустят сервер, и он загрузит Windows RE по сети. Как только Windows загрузится, появится графический интерфейс с инструкциями, которым вы должны следовать.
UEFI
При установке UEFI среду восстановления Windows невозможно загрузить через PXE. В этом случае технические специалисты предоставляют KVM-консоль с USB-накопителем с Windows RE.
Часто задаваемые вопросы / FAQ
Забытый пароль
Если вы забыли пароль администратора, вы можете сбросить пароль, отправив запрос в службу поддержки в Robot .
Сбросить сервис
Поведение Windows таково, что CTRL + ALT + DEL запускает только диалоговое окно аутентификации. Следовательно, функция «Отправить CTRL + ALT + DEL» нашей службы сброса, к сожалению, не может перезапустить сервер на этом этапе. Однако аппаратный сброс должен работать должным образом.
Служба обновления Windows
По техническим причинам служба обновления Windows для наших установок Windows настроена таким образом, что обновления можно только загружать, но не устанавливать.
Чтобы изменить это, вам необходимо настроить Реестр. Для этого введите команду «regedit» в диалоговом окне «Выполнить».
Перейдите к HKEY_LOCAL_MACHINE\SOFTWARE\Polices\Microsoft\Windows\WindowsUpdate\AU
кнопке «AUOptions» и установите ее на 5.
Теперь вы можете настроить функцию обновления в панели управления.
Служба резервного копирования Windows
Если служба резервного копирования Windows (функция) должна использоваться вместе с пространством для резервных копий, необходимо настроить пользователя в локальной системе, имя которой совпадает с именем учетной записи резервного копирования. Затем этот пользователь должен быть внесен в группу «Операторы резервного копирования».
Использование собственных лицензий
Мы участвуем в программе Microsoft SPLA. Таким образом, предоставленная нам Лицензия Windows является Лицензией SPLA. Объединение собственных лицензий Microsoft клиентов с лицензией Hetzner SPLA должно быть оформлено в письменной форме (контракт), поскольку клиент должен будет поручить Hetzner разместить продукт. Более того, развертывание собственной лицензии Microsoft не во всех случаях возможно (например, для лицензий на сервер терминалов). Таким образом, ввиду увеличения административного времени и усилий, которые потребуются, мы решили не разрешать объединение лицензий. Следовательно, использование собственных лицензий Microsoft в арендованной у нас операционной системе Windows невозможно.
Однако клиент может установить собственную версию Windows, используя свою лицензию. Возможна установка Windows через KVM-консоль .
Включенная лицензия для Hyper-V в Standard Edition
В рамках нашей лицензии SPLA у вас есть дополнительная лицензия для использования в экземпляре Hyper-V при использовании Standard Edition. Вы можете использовать это следующим образом:
- Закажите дополнительный одиночный IP-адрес через робота (подсети см. В разделе Подсеть Windows Server )
- Запишите виртуальный MAC
- Создать новый экземпляр
- Добавьте устаревший сетевой адаптер и назначьте MAC
- Запустите экземпляр и дайте ему загрузиться через PXE
- В случае успеха появится меню загрузки Hetzner PXE (синий логотип).
- Активируйте установку Windows через Robot для дополнительного IP
- Снова загрузите экземпляр через PXE, и вместо меню Hetzner запускается установка Windows. После появления стандартного экрана входа в систему вы можете использовать экземпляр
In this post I will provide an overview of the steps required to build a PXE-enabled RDP client using Thinstation.
Overview
Thinstation is an open source thin client-solution based on Crux Linux. The framework can be used to build streamlined network-bootable images that support a range of connectivity options, such as Microsoft RDP, Citrix ICA, and VMware View.
In this post I will describe how to configure two thin-client images. The first image will allow users to establish a Remote Desktop session to a Windows Server using the FreeRDP client. The second image will allow users to launch individual applications published using RemoteApp (also served via a FreeRDP client). The applications will be accessed via a Remote Desktop Web Access Portal using Google Chrome running in «kiosk» mode.
Requirements
The scenarios presented in this article require the following:
- A server with the Windows Deployment Services (WDS) and IIS features enabled (where the WDS root folder is
C:\RemoteInstall
and the IIS document root isC:\Inetpub\wwwroot
).
As an alternative to (standalone) WDS, you could also use a PXE-enabled Microsoft SCCM distribution point, a dedicated deployment of PXELINUX, or some other PXE service provider. You can also switch out IIS for another web server if you prefer.
Note: If you use a PXE-enabled distribution point, ensure that you don’t enable unknown computer support, as this will prevent SCCM from passing all PXE requests through to WDS (even when using DHCP option 67 to target a specific boot program).
-
A DHCP server (including the ability to create DHCP reservations and configure scope/client options).
-
A hypervisor that can be used for running a virtual Linux client (I will use VMware Fusion).
-
A computer that will be used as the thin-client workstation.
-
A functional Remote Desktop Server farm (required for testing the second thin-client image).
Windows Deployment Services
Even though we are using WDS, we still require access to components of PXELINUX to support the network boot of a Linux image. The relevant files can be obtained via syslinux. We will use version 4.07 (as external dependencies are required with later releases).
Extract the syslinux package to C:\syslinux-4.07
on the WDS server, and perform these steps:
-
Copy the following files to
C:\RemoteInstall\Boot\x64
:C:\syslinux-4.07\core\pxelinux.0
C:\syslinux-4.07\com32\menu\vesamenu.c32
C:\syslinux-4.07\com32\chain\chain.c32
C:\syslinux-4.07\memdisk\memdisk
- Rename
C:\RemoteInstall\Boot\x64\pxelinux.0
topxelinux.com
. - Copy
C:\RemoteInstall\Boot\x64\abortpxe.com
toabortpxe.0
. - Copy
C:\RemoteInstall\Boot\x64\pxeboot.n12
topxeboot.0
. - Repeat the above steps, replacing all references to x64 with x86.
- Create a folder named
C:\RemoteInstall\Boot\pxelinux.cfg
(yes, it is a folder). - From an elevated command prompt, change into
C:\RemoteInstall\Boot\x64
and create a junction:mklink /J pxelinux.cfg C:\RemoteInstall\Boot\pxelinux.cfg
- Repeat the previous step from
C:\RemoteInstall\Boot\x86
. - Create a folder named
C:\RemoteInstall\Images\Linux
. - From an elevated command prompt, change into
C:\RemoteInstall\Boot\x64
and create a junction:mklink /J Linux C:\RemoteInstall\Images\Linux
- Repeat the previous step from
C:\RemoteInstall\Boot\x86
. -
Create a file named default under
C:\RemoteInstall\Boot\pxelinux.cfg
and add the following content:DEFAULT RDP PROMPT 0 NOESCAPE 1 ALLOWOPTIONS 0 LABEL RDP MENU DEFAULT KERNEL /Linux/vmlinuz APPEND initrd=/Linux/initrd splash=silent,theme:default load_ramdisk=1 ramdisk_blocksize=4096 root=/dev/ram0 ramdisk_size=786432 loglevel=3 console=tty1 vt.global_cursor_default=0 LM=3
To switch the default boot programs used by WDS to PXELINUX, you could run the following commands from an elevated command prompt on the WDS server:
wdsutil /set-server /bootprogram:boot\x86\pxelinux.com /architecture:x86
wdsutil /set-server /N12bootprogram:boot\x86\pxelinux.com /architecture:x86
wdsutil /set-server /bootprogram:boot\x64\pxelinux.com /architecture:x64
wdsutil /set-server /N12bootprogram:boot\x64\pxelinux.com /architecture:x64
This step isn’t required if you are using a PXE-enabled distribution point, as SCCM takes over WDS and ignores the natively configured settings. Nor is the step required if you will use DHCP options 66 and 67 to specifically direct a client to use the PXELINUX boot program (more on this later).
Note: The following commands will restore the default WDS boot programs (in case you need to roll back):
wdsutil /set-server /bootprogram:boot\x86\pxeboot.com /architecture:x86
wdsutil /set-server /N12bootprogram:boot\x86\pxeboot.n12 /architecture:x86
wdsutil /set-server /bootprogram:boot\x64\pxeboot.com /architecture:x64
wdsutil /set-server /N12bootprogram:boot\x64\pxeboot.n12 /architecture:x64
Build Environment
The next step is to configure the environment we will use for creating our thin-client image. Fortunately, Thinstation comes with a pre-configured build environment called DevStation (direct download of approx. 180MB).
Note: The notes in this article were based on DevStation 5.4.2.
I created a virtual machine on my Mac using VMware Fusion for hosting DevStation. I used an x64 Linux 2.6.x operating system profile with the following specifications: 2 cores, 2GB RAM, and a 20GB disk. You can of course achieve the same effect with another hypervisor, such as VirtualBox, VMware Workstation or Hyper-V.
After booting the virtual machine from the downloaded media, follow these steps to install DevStation (internet access is required):
- Acknowledge the installation notes.
- Agree to use disk
/dev/sda
. - Set a timezone. I used Australia/Sydney.
- Set a locale. I used en_US.
- Agree to erasing the disk.
- Wait until the installation is completed (approx. 20 minutes).
- Acknowledge the post-installation notes.
After rebooting the virtual machine (you will be logged in automatically), double-click the Terminal Chroot shortcut on the desktop and then change into the /build
directory.
At this point we are ready to create a custom thin-client image.
Device Drivers
The first step is to identify the device drivers required by our target platform (i.e. the system that will run the thin-client). In the context of this article, I will assume the client is a Hyper-V virtual machine, but in practice, you would probably use a lightweight desktop or thin-client terminal.
To identify the specific drivers required by our client we will:
- Build an image that includes all drivers natively supported by Thinstation.
- Boot the image on our target device and run a script that identifies which of the available drivers are loaded.
- Use the information collected in the previous step to build a hardware profile within DevStation.
- Build a new image based on the custom hardware profile.
To start, from our existing Terminal session, run the following two commands to create a clean build configuration:
rm build.conf
cp build.con.example build.conf
Edit build.conf (use vi or vim) and uncomment (remove the #) from the line containing package extensions-x. Save the file and use the following command to build an image that includes all available drivers: ./build --allmodules
Note: Enter Y when prompted to install Chrome.
Although we intend to use WDS to boot our thin-client image, in this instance we will actually use the PXE server built into DevStation. This is because we need the hardware profile data to be copied to DevStation, and the script we will use to collect the data is preconfigured to post the results back to the PXE server that booted the client.
To direct the client to use the PXE server on the DevStation system, create a DHCP reservation for the client and configure DHCP options 66 and 67. Set option 66 to the name or IP address assigned to DevStation, and set option 67 to boot/pxelinux/pxelinux.0
.
Note: To get the IP address of the DevStation system, run ifconfig from the Terminal.
There are a few additional requirements:
- The client system must be configured for network boot (may require a change to the boot order in the BIOS).
- The system must be able to retrieve an IP address from a DHCP server.
- If using Hyper-V, the guest must be configured with a legacy network adapter.
Now boot the client. If you’ve configured everything correctly, the system should receive an IP address and immediately commence booting from the network. After a short delay during which the image is downloaded, you should see the default Thinstation desktop.
Before we proceed further, switch back to DevStation, and from the Terminal, run the following command to allow write access to the TFTP root directory: chmod 777 /build/boot-images/pxe
Now, back on the client, assuming it booted as planned, open a Terminal session (from the Applications menu, select Utilities and Terminal Emulator) and run the following command to generate a hardware profile: /bin/hwlister.sh
The results should be posted back to the TFTP root on the DevStation system. In my case, a file named module.list was created, but you may also see package.list and/or firmware.list.
At this point you can shutdown the client (e.g. shutdown -halt
).
On the DevStation system, run the following commands to create a new hardware profile named Hyper-V based on the collected data (replace Hyper-V with a name representing your target device model):
mkdir /build/machine/Hyper-V
cd /build/machine/Hyper-V
mv /build/boot-images/pxe/*.list .
chmod 755 /build/boot-images/pxe
We will modify the build to incorporate the new hardware profile in the next section.
RDP Client
We will now modify the build to create a minimal RDP-enabled thin-client.
Change back to the /build
directory and edit build.conf:
- Under the #!Hardware section, comment out all lines beginning with machine, and add a new line of machine Hyper-V (replacing Hyper-V with the name of the profile created in the previous section).
- Under the #!!File System Support section, comment out module usb-storage, isofs and udf.
- Under #Miscellaneous comment out package network manager and add a new line of package autonet. Also re-comment out package extensions-x.
- Under #!!X related comment out package xorg7-vmware.
- Under #!!Locale comment out all locale packages other than package locale-en_US.
- Under #!Applications comment out package chrome and package open-vm-tools.
- Under #!!Window Managers comment out package xfwm4, package xfce4-power-manager, package terminal and package thunar.
- Under #!!Basic uncomment param fastboot and modify the value assigned to param rootpasswd.
The remainder of the configuration will occur in a file named thinstation.conf.buildtime. First, let’s take a backup of the original: cp thinstation.conf.buildtime thinstation.conf.buildtime.original
Now edit thinstation.conf.buildtime and:
- Delete the line: SESSION_0_TYPE=xfwm4
- Change TIME_ZONE=America/Los_Angeles to TIME_ZONE=Australia/Sydney (or a value appropriate for your environment).
- Delete the line: USB_STORAGE_SYNC=on
- Add the following lines:
SESSION_0_TITLE="RDP"
SESSION_0_TYPE=freerdp
SESSION_0_FREERDP_SERVER="rdp.lab.hinchley.net"
SESSION_0_FREERDP_OPTIONS="/d:'lab.hinchley.net' /u:'' /bpp:16 /cert-ignore -sec-nla"
FASTBOOT_URL="http://10.0.0.100/"
Note: Replace rdp.lab.hinchley.net with the name of the target RDP server, replace lab.hinchley.net with the name of your Active Directory domain (against which users will authenticate), and replace 10.0.0.100 with the name or IP address of your IIS web server.
By default, the FreeRDP client will attempt to automatically connect to the target RDP server. To prevent this behaviour, and to show an X-window logon dialog instead, run the following command: touch /build/packages/freerdp/etc/cmd/freerdp.getuser
We will now apply some simple branding. Firstly, to use a custom splash screen (shown during boot), replace the file named silent.jpg within every folder under /build/utils/tools/splash/default
(i.e. there is a separate folder for every supported resolution). The dimensions of the image should be based upon the name of the folder.
Next, to customise the logo displayed on the RDP logon dialog, change the following image: /build/packages/freerdp/lib/icons/hicolor/32x32/apps/freerdp.png
. Note: The dimensions of the image must be 32×32 pixels.
Finally, to customise the title of the RDP logon dialog (changing from «Preparing to Run FreeRDP»), edit /build/packages/base/etc/dialog.functions
and replace Preparing to run ‘$DIALOG_TITLE’ with something appropriate. I used Connect to LAB.
We are now ready to build the thin-client image. From the /build
directory run: ./build
When the build completes, copy the initrd and vmlinuz files from /thinstation/build/boot-images/pxe/boot/
to C:\RemoteInstall\Boot\x64\Linux
on the WDS server. The vmlinuz file will be approximately 10MB.
Note: If using File Manager on the DevStation system to copy the files, enter a path of smb://wds/c$/RemoteInstall/Boot/x64/Linux
(where wds is the address of your WDS server).
Fast Boot and IIS
In the previous section, we enabled support for fastboot in build.conf. This feature allows us to download a significant portion of the thin-client image via HTTP (instead of TFTP) — thereby reducing boot time. For this to work, there are a few prerequisites:
- Firstly, we need a web server. I will assume you are using IIS.
- Secondly, we need to add support into IIS for the .squash file type. To do this, using IIS Manager, select the Default Web Site, click the option to add a new MIME type, and set the filename extension to .squash and the MIME type to application/octet-stream.
- Confirm that Anonymous access is enabled (at least on the web site root).
- Using File Manager on the DevStation system, copy
/thinstation/build/boot-images/pxe/boot/lib.squash
toC:\Inetpub\wwwroot
on the IIS web server (approx. 75MB).
RDP Server
Our thin-client will use the FreeRDP client to connect to our target RDP server. To ensure that users connecting via the client are prompted to change their password when it is expired, we will need to disable NLA on the RDP server. This setting can be configured by opening Control Panel, System and Security, System, selecting Remote Settings, and then deselecting the option to Allow connections only from computers running Remote Desktop with Network Level Authentication.
PXE Configuration
We are almost ready to boot the thin-client. If you are using a standard WDS instance, it should be sufficient to just remove DHCP options 66 and 67 from the client reservation previously created. However, if you are using a PXE-enabled distribution point, or you just want to be explicit (and avoid DevStation from responding ahead of WDS), reconfigure DHCP options 66 and 67 so that option 66 references the name or IP address of the WDS server, and option 67 is set to boot/x64/pxelinux.com
.
Testing
Start the client. Just as before, it should obtain an IP address and then immediately initiate a network boot. Unlike before, the TFTP download will complete in only a few seconds, after which the custom splash screen will be displayed, and then the remainder of the thin-client image will be downloaded from IIS over HTTP.
If everything works as expected, the splash screen will be replaced by a single RDP logon dialog. Enter the username and password of a user authorised for access to the configured server, and click OK (the domain should not be entered, as this was configured within thinstation.conf.buildtime). With any luck, you will be seamlessly authenticated to a full-screen session on the server.
Remote Desktop Web Access
Now that we have a working RDP thin-client solution, let’s create another image that can be used to connect to a Microsoft Remote Desktop Server farm.
This is a summary of the approach:
- We will create a new image that includes the FreeRDP client and Google Chrome.
- Google Chrome will be configured to run in «kiosk» mode.
- The browser will be configured to automatically connect to a Remote Desktop Web Access Portal.
- After the user authenticates to the Portal (typically via forms-based authentication), they will be presented with a list of published applications.
- Upon clicking the shortcut to an application, an RDP file will be downloaded (it will contain the required connection details).
- Chrome will be configured to automatically invoke the FreeRDP client when an RDP file is downloaded.
- The path to the RDP file will be passed to the client (along with other default connection parameters).
- The client will use the RemoteApp protocol to display the requested application (running as an independent window).
Unfortunately, as of the present time, there are a few shortcomings in this solution:
- I wasn’t able to enable single sign-on between the Remote Desktop Web Access Portal and a RemoteApp session. Nor was I able to enable single sign-on between RemoteApp sessions. i.e. A user must authenticate to retrieve the list of published applications, and then re-authenticate whenever an application is launched.
- Due to a bug in the FreeRDP client packaged with Thinstation 5.4.2, the mouse did not work properly within a RemoteApp session. Note: This issue could be addressed by using the most recent version of FreeRDP (i.e. compiling form the latest source).
Note: This article will not describe the steps required to setup or configure a Remote Desktop solution; only the steps required to configure the Thinstation image are presented.
Let’s start by saving the previously modified build.conf and thinstation.conf.buildtime configuration files:
cd /build
cp build.conf build.conf.rdp
cp thinstation.conf.buildtime thinstation.conf.buildtime.rdp
Now edit build.conf and under #!Applications uncomment #package chrome.
Edit thinstation.conf.buildtime and replace the SESSION_0 lines previously added with the following:
SESSION_0_TITLE="KIOSK"
SESSION_0_TYPE=chrome
SESSION_0_CHROME_HOMEPAGE="https://rdp.lab.hinchley.net/RDWeb"
SESSION_0_CHROME_OPTIONS="--ignore-certificate-errors --kiosk --start-full-screen --test-type"
You will also need to replace https://rdp.lab.hinchley.net/RDWeb
with the URL of your Remote Desktop Web Access server.
The final step is to configure Chrome to automatically invoke the FreeRDP client when an RDP file is downloaded. We can do this by editing /build/packages/gnome-core/bin/xdg-open
and adding the following code immediately under the line which executes detectDE:
if test ${url##*.} = "rdp"; then
/bin/xfreerdp "$url" /cert-ignore /sec:rdp
exit 0
fi
We also need to ensure the above association is invoked automatically (to avoid the user from being prompted to open RDP files). This is controlled via a preference in Chrome which can be configured by creating a file named /build/packages/chrome/etc/chrome/Default/Preferences
with the following content:
{"account_id_migration_state":2,"account_tracker_service_last_update":"13097285309636958","download":{"directory_upgrade":true,"extensions_to_open":"rdp"}}
To build the new image, rerun: ./build
Note: The introduction of Chrome will add approximately 70MB to the image.
Dual Boot
At this point we could deploy our new image by copying the updated initrd to the WDS server, and lib.squash to the web server (vmlinuz won’t be changed by the rebuild). However, we can also make a few changes to our WDS configuration to allow users to boot either image.
Let’s start by editing C:\RemoteInstall\Boot\x64\pxelinux.cfg\default
on the WDS server and replacing the existing content with the following:
DEFAULT vesamenu.c32
PROMPT 0
NOESCAPE 1
ALLOWOPTIONS 0
TIMEOUT 300
MENU MARGIN 10
MENU ROWS 16
MENU TABMSGROW 21
MENU TIMEOUTROW 26
MENU COLOR BORDER 30;44 #20ffffff #00000000 none
MENU COLOR SCROLLBAR 30;44 #20ffffff #00000000 none
MENU COLOR TITLE 0 #ffffffff #00000000 none
MENU COLOR SEL 30;47 #40000000 #20ffffff
MENU TITLE Boot Menu
#---
LABEL RDP
MENU DEFAULT
KERNEL /Linux/vmlinuz
APPEND initrd=/Linux/initrd splash=silent,theme:default load_ramdisk=1 ramdisk_blocksize=4096 root=/dev/ram0 ramdisk_size=786432 loglevel=3 console=tty1 vt.global_cursor_default=0 LM=3
#---
LABEL KIOSK
MENU LABEL Kiosk
KERNEL /Linux/vmlinuz
APPEND initrd=/Linux/initrdk splash=silent,theme:default load_ramdisk=1 ramdisk_blocksize=4096 root=/dev/ram0 ramdisk_size=786432 loglevel=3 console=tty1 vt.global_cursor_default=0 LM=3
Now, go back to DevStation and edit thinstation.conf.build and update FASTBOOT_URL to end in kiosk (for example: http://10.0.0.100/kiosk
), and then rebuild the solution.
After the build completes, rename /thinstation/build/boot-images/pxe/boot/initrd
to initrdk and copy it to the following folder on the WDS server: C:\RemoteInstall\Boot\x64\Linux
Also copy lib.squash to a new folder named C:\inetpub\wwwroot\kiosk
on the web server.
Now when you boot the client you should see a boot menu with two options. The first, named RDP, will initiate the boot of our first image, and the second, name Kiosk, will initiate the build of the image with Chrome. The first option is configured as the default, and will be automatically invoked after 30 seconds.
Try booting the client, select Kiosk from the boot menu, and cross your fingers. If all goes well, Chrome should open fullscreen at the logon page of your Remote Desktop Web Access Portal. Log in, and open an application. Assuming you have disabled NLA on your farm, after you (re)authenticate, the requested application will be displayed.
It’s possible to extend the boot menu (by modifying C:\RemoteInstall\Boot\x64\pxelinux.cfg\default
) to include additional options, such as booting an ISO, or a binary image, passing through to WDS (if your PXE server is using WDS), or cancelling the PXE request and booting off the local hard drive. The following example configuration includes all of these options:
DEFAULT vesamenu.c32
PROMPT 0
NOESCAPE 1
ALLOWOPTIONS 0
TIMEOUT 300
MENU MARGIN 10
MENU ROWS 16
MENU TABMSGROW 21
MENU TIMEOUTROW 26
MENU COLOR BORDER 30;44 #20ffffff #00000000 none
MENU COLOR SCROLLBAR 30;44 #20ffffff #00000000 none
MENU COLOR TITLE 0 #ffffffff #00000000 none
MENU COLOR SEL 30;47 #40000000 #20ffffff
#MENU BACKGROUND MyMenuBackgroundPicture640x480.jpg
MENU TITLE Boot Menu
#---
LABEL RDP
MENU DEFAULT
KERNEL /Linux/vmlinuz
APPEND initrd=/Linux/initrd splash=silent,theme:default load_ramdisk=1 ramdisk_blocksize=4096 root=/dev/ram0 ramdisk_size=786432 loglevel=3 console=tty1 vt.global_cursor_default=0 LM=3
#---
LABEL KIOSK
MENU LABEL Kiosk
KERNEL /Linux/vmlinuz
APPEND initrd=/Linux/initrdk splash=silent,theme:default load_ramdisk=1 ramdisk_blocksize=4096 root=/dev/ram0 ramdisk_size=786432 loglevel=3 console=tty1 vt.global_cursor_default=0 LM=3
#---
LABEL wds
MENU LABEL Windows Deployment Services
KERNEL pxeboot.0
#---
LABEL memtest86+bin
MENU LABEL Memtest86+ Binary
KERNEL /Linux/memtest86+
#---
LABEL memtest86+iso
MENU LABEL Memtest86+ ISO
KERNEL /Linux/memtest86+.iso
#---
LABEL Abort
MENU LABEL AbortPXE
Kernel abortpxe.0
#---
LABEL local
MENU DEFAULT
MENU LABEL Boot from Harddisk
LOCALBOOT 0
Type 0x80
That will do for today. Drop me an email if you have any questions.
Addendum
A few random dot points regarding enhancements implemented to enable network-based dynamic configuration (including the use of multiple monitors and low resolution displays):
- Create a folder on an IIS web server named
C:\Inetpub\wwwroot\TS5.4
and add three files: thinstation.conf.network, thinstation.hosts, and thinstation.conf.group-blind. - The file thinstation.conf.network supplements thinstation.conf.buildtime and contains configuration commands for all hosts.
- The file thinstation.hosts is used to map specific hosts to groups (via MAC address).
- The file thinstation.conf.group-blind is a configuration file for computers in the group named «blind» (as determined from thinstation.hosts).
- To support multiple monitors (both connected to a computer using Display Port) and to configure FreeRDP, I added the following commands to thinstation.conf.network (and
removed theSESSION_0_*
elements from thinstation.conf.buildtime):
USE_XRANDR=TRUE
XRANDR_OPTIONS="--output DisplayPort-0 --output DisplayPort-1 --left-of DisplayPort-0"
SESSION_0_TITLE="RDP"
SESSION_0_TYPE=freerdp
SESSION_0_FREERDP_SERVER="rdp.lab.hinchley.net"
SESSION_0_FREERDP_OPTIONS="/d:'lab.hinchley.net' /u:'' /cert-ignore /sec:tls /multimon"
- To get the names of the monitors (if using something other than Display Port), boot up a thinstation system, and from the Terminal, run xrandr.
- For testing, I added the following to thinstation.hosts (which adds the host with the specified MAC address to the group named BLIND):
# HOST MAC GROUPS COMMENTS
Ts1 7cd30a1da71f BLIND # Force low resolution display.
- I then specified a resolution in thinstation.conf.group-blind via the following:
SCREEN_RESOLUTION="800x600"
- If using IIS, don’t forget to add MIME-type entries for each of the file extensions added above (i.e. .network, .hosts and .group-blind should all be mapped to text/plain).
- To enable network based configuration I enabled
package ts-classic
in build.conf and setparam baseurl
tohttp://pxe.lab.hinchley.net
(wherepxe.lab.hinchley.net
maps
to the IIS web server identified above). - I also added
NET_FILE_ENABLED=On
andNET_FILE_METHOD=wget
to thinstation.conf.buildtime. - It isn’t possible to use a DNS entry for resolving
FASTBOOT_URL
. Therefore, if you want to avoid tying the variable to a specific IP address (i.e. allowing you to scale the
solution to include multiple PXE servers across multiple subnets), you can set a specific address per PXE server by modifyingpxelinux.cfg/default
. In particular, modify the
kernel startup parameters by appending theFASTBOOT_URL
parameter. For example:
LABEL RDP
MENU DEFAULT
KERNEL /Linux/vmlinuz
APPEND initrd=/Linux/initrd splash=silent,theme:default load_ramdisk=1 ramdisk_blocksize=4096 root=/dev/ram0 ramdisk_size=786432 loglevel=3 console=tty1
vt.global_cursor_default=0 LM=3 FASTBOOT_URL=http://10.0.0.10/
Troubleshooting
In a «real world» deployment of the Thinstation solution I’ve described in this post, I encountered a couple of issues when using a monitor connected to the terminal via a KVM switch box with a DisplayPort connector:
- When the KVM was used to switch between the terminal and another system, and then back again, the monitor would enter a disconnected state.
- (After resolving issue 1) When the KVM was used to switch between the terminal and another system, and then back again, the mouse cursor would disappear. The mouse was active (the system would respond to mouse movement and button clicks), but the cursor was invisible. This issue did not occur when using dual monitors.
The solution to both issues was to run a custom script when the terminal detected a change to the status of the DisplayPort (i.e. after the monitor(s) were reconnected when the KVM was switched back to the terminal).
Within DevStation, under /build/packages/automount/etc/udev/rules.d
I created a file named 70-monitor.rules with the following content:
KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/root/.Xauthority", RUN+="/etc/udev/scripts/monitor.sh"
Then, under /build/packages/automount/etc/udev/scripts
I created a file named monitor.sh with the following content:
#! /bin/sh
xrandr --auto
xrandr --output DisplayPort-0 --output DisplayPort-1 --left-of DisplayPort-0
chvt 1 && chvt 5
Note: Use chmod 755 monitor.sh
to make the script executable.
This script uses xrandr with the --auto
switch to detect (and activate) the monitor(s) connected to the terminal via the KVM. It then reconfigures the dual screen layout previously configured at boot (this works when using either one or two monitors). Finally, the script uses chvt to swtich between TTY1 and 5, which was sufficient to force the cursor to reappear. The udev rule, and corresponding script, execute in real-time, and are unnoticed by the user.
If you would like to deploy OS to the New rack Server or PC but they have no DVD (virtual DVD), WDS (Windows Deployment Services) server is your good friend, you can easy to deployment via network (PXE).
Today, I am going to show you step by step to install and configure WDS server. you don’t need a new hardware for it, you can build WDS server as a VM of exiting Windows 10 laptop or Server.
- Assumed the host machine (it can be a Windows 10 laptop) is connecting to Corporate Network, so the WDS VM and testing VM will get the IP address from DHCP server. if it’s at your lab or pilot environment, you need to build your own DHCP server.
- Login to WDS2019 Server via local Administrator (WDS server can be a domain member server or WORKGROUP server)
-
Use ping command to make sure the VM (WDS2019) can ping outside network.
-
On the Server Manager page, select Manage, click Add Roles and Features.
-
On the Before you begin page, click Next.
-
On the Select installation type page, select Role-based or feature-based installation, click Next.
-
On the Select destination server page, click Next.
-
On the Select server roles page, select Windows Deployment Services.
-
On the Add features that are required for Windows Deployment Services page, click Add Features.
-
On the Select server roles page, click Next.
-
On the Select features page, click Next.
-
On the WDS page, click Next.
-
On the Select role services page, click Next.
-
On the Confirm installation selections page, select Restart the destination server automatically if required, click Yes on the Add Roles and Feature wizard warning message, and then click Install.
-
On the Installation progress page, click Close.
-
On the Server Manager, select Tools, click Windows Deployment Services.
-
On the Windows Deployment Services page, expand Servers, right-click the WDS2019 server and then select Configure Server.
-
On the Before You Begin page, click Next.
-
On the Install Options page, select Standalone server, click Next.
-
On the Remote Installation Folder Location page, click Next. (You also can select the folder is not the same as system volume).
-
On the System Volume Warning message, click Yes.
-
On the PXE Server Initial Settings page, select Response to all client computers (known and unknown), click Next.
-
On the Operation Complete page, unselect Add images to the server now, click Finish.
-
Creating a new folder at WDS2019 server and copy boot.wim and install.wim of D:\sources to this folder. (D drive is mounting Windows Server 2019 ISO image).
-
On the Windows Deployment Services page, expend WDS2019 and right click Boot Images, click Add Boot Image.
-
On the Image file page, click Browse at File location.
-
Select boot.wim file, click Open.
-
On Image File page, click Next.
-
On the Image Metadata page, type Image name and description for the Boot Image, click Next.
-
Click Next on the Summary page.
-
On the Task Progress page, make sure the operation is complete without issues, click Finish.
-
On the Windows Deployment Services page, expend WDS2019 server, right-click Install Images, click Add Install Image.
-
On the Image Group, type image group name, click Next.
-
On the Image File page, click Browse from File location.
-
Select install.wim file and click Open.
-
On the Image File page, click Next.
-
On the Available Images, select Windows Server 2019 SERVERSTANDARD and Windows Server 2019 SERVERDATACEBTER, click Next.
-
On the Summary page, click Next.
-
On the Task Progress page, make sure the operation is complete without issues, click Finish.
- Now, we can try to deploy windows server 2019 via PXE to another VM and test WDS functions.
-
On the Hyper-V Manager page, on the Actions pane, click New and select Virtual Machine.
-
On the Before You Begin page, click Next.
-
On the Specify Name and Location page, type Name and select location for the test Virtual Machine, click Next.
-
On the Specify Generation page, select Generation 2, click Next.
-
On the Assign Memory page, assign 4GB for Startup memory, click Next.
-
On the Configure Networking page, select External Network at Connection, click Next.
-
On the Connect Virtual Hard Disk page, click Next.
-
On the Installation Options page, select Installation an operating system from a network-based installation server, click Next.
-
On the Completing the New Virtual Machine Wizard page, click Finish.
-
On the Hyper-V Manager page, right-click Test virtual machine and select Connect.
-
On the Test Virtual Machine console, click Start.
-
Press Enter for the network boot service.
-
It will start loading boot image file from WDS Server.
-
After loading image file completed, on the Locate and Keyboard page, click Next.
-
Type local administrator and password to connect to WDS2019 server.
-
Select the Operating system you would like to install, click Next.
- You can follow previously steps to install windows server 2019 for the test virtual machine.
Hope you enjoy this post.
Cary Sun
Twitter: @SifuSun