Гид по технологиям

Настройка тонких клиентов LTSP, DHCP и монтирование Windows-шар

7 min read Системное администрирование Обновлено 22 Oct 2025
LTSP: DHCP, монтирование SMB и Kerberos
LTSP: DHCP, монтирование SMB и Kerberos

Кратко

Кратко: пошаговое руководство по настройке DHCP для PXE-загрузки тонких клиентов LTSP, установке окружения рабочего стола, автоматическому монтированию Windows-шар (CIFS) при входе через Kerberos, безопасному размонтированию при выходе и включению SSH без пароля. Включены скрипты, чек-листы, варианты альтернатив и отладка.

Введение

Это руководство описывает практическую настройку тонких клиентов на базе LTSP и сервера thinserver: что изменить в DHCP, как подготовить профиль рабочего стола, как автоматически монтировать Windows-шары при входе пользователя с Kerberos-аутентификацией, как корректно размонтировать их при выходе и как включить passwordless SSH через GSSAPI. Примеры скриптов и конфигураций можно адаптировать под вашу сеть.

Важно

  • Перед началом убедитесь, что вы понимаете влияние изменений в DHCP и что у вас есть доступ к консоли сервера.
  • Не храните открытые пароли в /etc/fstab в продакшн-среде — рассмотрите использование ключей, kerberos или защищённых credential helpers.

Содержание

  • DHCP Server Settings
  • Настройка рабочего стола для тонких клиентов
  • Как сделать профиль по умолчанию для всех пользователей
  • Монтирование Windows-шар при входе
  • Удаление шар при выходе
  • Passwordless SSH через Kerberos
  • Проблемы и решения
  • Чек-листы и методика развертывания
  • Краткая глоссарий и рекомендации по безопасности

DHCP Server Settings

Ниже приведён пример конфигурации DHCP, которую нужно добавить на сервер DHCP, если тонкие клиенты должны PXE-загружаться и получать статические IP для отдельных MAC-адресов. Комментарии здесь русифицированы для понятности — сами параметры и значения оставлены как в примере.

default-lease-time            21600;
max-lease-time                21600;

option subnet-mask            255.255.255.0;
option broadcast-address      10.255.255.255;
option routers                10.0.0.1;
option domain-name-servers    10.0.0.10
option domain-name            "domain.internal";
option root-path              "/opt/ltsp/i386";

host thinclient1 {
        next-server             10.0.0.10;
        hardware ethernet       00:AA:BB:CC:DD:EE;
        fixed-address           10.0.0.100;
        filename                "ltsp/i386/pxelinux.0";
        option root-path        "10.0.0.10:/opt/ltsp/i386";
}

host thinclient2 {
        next-server             10.0.0.10;
        hardware ethernet       00:BB:CC:DD:EE:FF;
        fixed-address           10.0.0.101;
        filename                "ltsp/i386/pxelinux.0";
        option root-path        "10.0.0.10:/opt/ltsp/i386";
}

Совет по отладке DHCP

  • После изменения конфигурации перезапустите службу DHCP и наблюдайте лог (/var/log/syslog или /var/log/messages) при загрузке клиента.
  • Убедитесь, что PXE-сервер (TFTP/next-server) доступен по адресу, указанному в next-server.

Настройка рабочего стола для тонких клиентов

Чтобы упростить работу пользователей тонких клиентов, автор установил тему XPGnome и изменил меню «Пуск», а также добавил Adobe Reader 9 и Skype. Вы можете повторить эти шаги для вашего образа.

Если у вас отсутствует иконка «Выйти», её можно сгенерировать из большого изображения и сохранить в наборах иконок. Автор сделал так:

  1. Взял иконку 48×48 с Google.
  2. В GIMP масштабировал в 32×32, 24×24, 22×22 и 16×16.
  3. Переименовал файл в system-log-out.png и разместил в /usr/share/icons/GnomeXP/{размер}/actions.

Результат выглядит так:

Рабочий стол тонкого клиента с темой XPGnome

Сделать профиль по умолчанию для всех пользователей

Чтобы эти настройки стали стандартными для каждого вновь вошедшего пользователя, скопируйте из домашней папки установившего темы пользователя следующие каталоги в /etc/skel:

  • .config
  • .gconf
  • .icons
  • .local
  • .themes

Дальше: любые изменения, которые вы хотите распространить на всех, нужно будет копировать в /etc/skel и при необходимости переподготавливать образ.

Монтирование Windows-шар при входе

Подход, выбранный автором, использует простой запуск bash/perl-скриптов через «Startup Applications» в Ubuntu. Альтернативы включают autofs, systemd-automount, pam_mount и другие. Ниже полный набор шагов, как это сделать на примере.

Предварительные условия

  • NETLOGON шар DC должен быть доступен на thinserver.domain.internal.
  • Нужен доменный аккаунт, который может читать содержимое NETLOGON, например public/password (в учебных примерах). В продакшне используйте защищённые методы хранения учётных данных.

Создайте точку монтирования для NETLOGON:

sudo mkdir /mnt/logon

Добавьте в /etc/fstab строку для автоматического монтирования NETLOGON через CIFS (для примера):

//dc.domain.internal/netlogon      /mnt/logon           cifs   username=public,password=password 0  0

Затем выполните:

sudo mount -a

Структура и идея скриптов

  • /usr/local/bin/win_share.sh — запускается при входе пользователя; удаляет старые .mount.sh/.umount.sh, генерирует новые и запускает .mount.sh.
  • /usr/local/bin/mount.pl — парсит logon.bat (из NETLOGON) и генерирует для каждого пользователя ~/.mount.sh и ~/.umount.sh с нужными mount.cifs и umount.cifs.

Скрипт win_share.sh (сохраняйте в /usr/local/bin/ с правом исполнение):

#!/bin/sh
# Check to see if .mount.sh and .umount.sh exist, if so delete them!

if [ -f /home/$USER/.mount.sh ]; then
   rm /home/$USER/.mount.sh
fi

if [ -f /home/$USER/.umount.sh ]; then
   rm /home/$USER/.umount.sh
fi

# Create the .mount.sh and .umount.sh scripts from users batch file

/usr/local/bin/mount.pl $USER

# Mount network shares when logging on.
/home/$USER/.mount.sh

Скрипт mount.pl (поместите в /usr/local/bin/ и разрешите исполнение):

#!/usr/bin/perl
# Build dynamic ~user/.mount.sh based on logon.bat

$user = $ARGV[0];
$file = "/mnt/logonbat/$user.bat";  # <-- Change this from $user to the name of the batch script if you only use one.

die if ! $user;
die if ! -e $file;

open (PAM_CONF, ">/home/$user/.mount.sh");
open (LOGOFF, ">/home/$user/.umount.sh");

print PAM_CONF qq{#!/bin/sh
if [ ! -d /home/$user/Home ]; then
mkdir /home/$user/Home
fi
mount.cifs //server/$user /home/$user/Home -o username=$user,sec=krb5
};

print LOGOFF qq{#!/bin/sh
if [ "`cat /proc/mounts | grep /home/$user/Home | wc -l`" -ge "1" ]; then 
umount.cifs /home/$user/Home 
fi \n};

my(@arr)=`cat /mnt/logonbat/$user.bat`;
$mounts = parse_batfile(\@arr);
foreach $mount (@$mounts) {
  chomp($mount);
  ($server,$share) = $mount =~ /\\\\(.*)\\(.*)/;
  $share =~ tr/\cM//d;
  $mnt = $share;

  # skip AUDIT.  It's for PCs only
  next if $mnt =~ /AUDIT/;

  # skip personal shares.  
  next if lc("$mnt") eq lc("$user");
  next if ! $mnt;

  #strip dollar sign from mount point
  $mnt =~ s/\$\$//;

  # make sure mount point is unique
  $mnt .= "-$server"  if $seen{$mnt}++;

  # upshift first letter of mnt point
  $mnt =~ s/^(.)(.*)/\u$1$2/g;

#  print PAM_CONF "volume $user cifs $server $share  /home/$user/$mnt  - - -\n";
  print PAM_CONF qq{if [ ! -d /home/$user/$mnt ]; then
mkdir /home/$user/$mnt
fi
mount.cifs //$server/$mnt /home/$user/$mnt -o username=$user,sec=krb5 \n};

  print LOGOFF qq{if [ "`cat /proc/mounts | grep /home/$user/$mnt | wc -l`" -ge "1" ]; then 
umount.cifs /home/$user/$mnt 
fi \n};
}

close PAM_CONF;
close LOGOFF;
system ("chown $user:16777729 /home/$user/.mount.sh");   #  16777729 is my GID for "Domain Users"
system ("chown $user:16777729 /home/$user/.umount.sh");  #  16777729 is my GID for "Domain Users"
system ("chmod +x /home/$user/.mount.sh");
system ("chmod +x /home/$user/.umount.sh");

# All done

sub parse_batfile {
  my($file) = @_;
  my(@mounts);
  foreach $line (@$file) {
    (@val) = split / /,$line;
    if (uc($val[0]) eq "NET" && uc($val[1]) eq "USE") {
       push (@mounts,$val[3]);
    }
    if ($val[0] eq "CALL") {
      my($match) = $val[1]  =~ /\\\\.*\\NETLOGON\\(.*)/ ;
      if ($match) {
        chop($match);
        my(@arr)=`cat /mnt/logonbat/$match`;
        $mounts = parse_batfile(\@arr);
        unshift @mounts, @$mounts;
      }
    }
  }
  return \@mounts;
}

Пример ~/.mount.sh, сгенерированного для пользователя jdoe:

#!/bin/sh
if [ ! -d /home/jdoe/Home ]; then
mkdir /home/jdoe/Home
fi
mount.cifs //server/jdoe /home/jdoe/Home -o username=jdoe,sec=krb5
if [ ! -d /home/jdoe/common ]; then
mkdir /home/jdoe/common
fi
mount.cifs //server/common /home/jdoe/common -o username=jdoe,sec=krb5 
if [ ! -d /home/jdoe/IT ]; then
mkdir /home/jdoe/IT
fi
mount.cifs //server/IT /home/jdoe/IT -o username=jdoe,sec=krb5 

Создание «Startup Application» для запуска win_share.sh

Добавьте запуск /usr/local/bin/win_share.sh в «Preferences → Startup Applications». На экране это выглядит так:

Окно 'Программы запуска' в GNOME

Альтернативы и когда их использовать

  • autofs/systemd-automount: хороши для больших сетей, где нужно ленивое монтирование и масштабируемость.
  • pam_mount: монтирует шары в момент сессии и разгружает работу от пользовательских скриптов, но требует настройки PAM и форматов конфигурации.
  • Если нужна центральная политика: используйте скрипты, генерируемые на сервере, и распространяйте через конфигурационный менеджер (Ansible/Puppet).

Удаление Windows-шар при выходе

Автор использовал pam_script.so — PAM-модуль, который позволяет запускать скрипты при открытии и закрытии сессии. Поскольку входные скрипты у автора зависят от $USER, он запускал их от имени пользователя (через Startup Applications), а размонтирование выполняется через pam_script при закрытии сессии.

Установка libpam-script (пример .deb):

sudo dpkg -i libpam-script_1.1.4-1_i386.deb

Пример ~/.umount.sh для jdoe (сгенерировано mount.pl):

#!/bin/sh
if [ "`cat /proc/mounts | grep /home/jdoe/Home | wc -l`" -ge "1" ]; then 
umount.cifs /home/jdoe/Home 
fi 
if [ "`cat /proc/mounts | grep /home/jdoe/common | wc -l`" -ge "1" ]; then 
umount.cifs /home/jdoe/common 
fi 
if [ "`cat /proc/mounts | grep /home/jdoe/IT | wc -l`" -ge "1" ]; then 
umount.cifs /home/jdoe/IT 
fi 

Создайте /usr/share/libpam-script/pam_script_ses_close со следующим содержимым и разрешениями:

#!/bin/sh
# pam_script_ses_close script to remove windows shares

/home/$PAM_USER/.umount.sh 2>&1 >> /var/log/umount.log

Добавьте в /etc/pam.d/common-session строку:

session     optional                  pam_script.so

Проверьте: войдите под пользователем, замонтируйте шары; выйдите и убедитесь, что umount выполнился и монтирования отсутствуют (проверка /proc/mounts и /var/log/umount.log).

Passwordless SSH через Kerberos

Если сервер и рабочая станция находятся в домене с Kerberos, можно включить GSSAPI-аутентификацию для SSH, чтобы пользователи не вводили пароль.

На сервере (в /etc/ssh/sshd_config) включите:

# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UseDNS yes

На рабочей станции (в /etc/ssh/ssh_config) включите:

GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes

Тестирование:

ssh -v thinserver

Если Kerberos аутентификация работает, вы увидите в выводе сообщение вроде:

debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
debug1: Delegating credentials
debug1: Delegating credentials
debug1: Authentication succeeded (gssapi-with-mic).

Если это не срабатывает — проверьте время на клиентах/сервере (Kerberos чувствителен к рассинхронизации), /etc/krb5.conf и доступность KDC.

Проблемы и решения

Ниже — краткие известные проблемы и решения, с которыми столкнулся автор.

PROBLEM : LTSP client authenticates but logs out immediately SOLUTION:

gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory --type string --set /desktop/gnome/session/required_components/windowmanager metacity

PROBLEM : No VNC on thin clients SOLUTION: http://bootpolish.net/home_ltsp_installx11vnconltsp5

PROBLEM : Change the default login screen to a custom one SOLUTION: https://help.ubuntu.com/community/EdubuntuFAQ

PROBLEM : How to setup root password on thin client SOLUTION: https://help.ubuntu.com/community/EdubuntuFAQ

PROBLEM : No logout icon SOLUTION: http://ubuntuforums.org/archive/index.php/t-815188.html

Расширенные рекомендации по диагностике

  • Проверьте логи: /var/log/auth.log, /var/log/syslog и ~/.xsession-errors.
  • Убедитесь, что права на ~/.mount.sh и ~/.umount.sh корректны и принадлежат пользователю.
  • Для Kerberos проверьте klist и kinit для пользователя.

Чек-листы и методика развертывания

Мини-план развертывания для администратора (SOP)

  1. Подготовка сервера
    • Обновить систему и установить LTSP-пакеты, tftpd-hpa, isc-dhcp-server.
    • Настроить /etc/dhcp/dhcpd.conf согласно секции DHCP.
  2. Настройка PXE/TFTP
    • Разместить pxelinux.0 и конфиги в /srv/tftp или эквивалент.
  3. Подготовка образа рабочего стола
    • Настроить пользователя с нужными темами и программами.
    • Скопировать .config/.gconf/.icons/.local/.themes в /etc/skel.
  4. Настройка NETLOGON
    • Смонтировать NETLOGON в /mnt/logon; положить bat-файлы.
  5. Развернуть скрипты
    • Разместить win_share.sh и mount.pl в /usr/local/bin/, chown/chmod.
  6. Настройка автозапуска
    • Добавить win_share.sh в Startup Applications.
  7. Настройка pam_script для размонтирования
    • Установить libpam-script, создать pam_script_ses_close и добавить pam_script.so в common-session.
  8. Тестирование
    • Проверить логин/выход, корректность монтирования/размонтирования, Kerberos SSH.

Роли и обязанности

  • Системный администратор: DHCP, TFTP, Kerberos, server-side конфигурации.
  • Отдел поддержки: подготовка образов рабочего стола, иконок, приложений.
  • Безопасность/инфраструктура: аудит fstab, прав доступа, контроль учётных данных.

Безопасность и соответствие

  • Не храните пароли в /etc/fstab на постоянной основе. Используйте Kerberos или credential files с ограниченными правами и защитой.
  • Логи размонтирования должны быть доступны аудиторам, но защищены от удаления пользователями.
  • При работе с доменом проверяйте политику паролей и доступов. Если вы обрабатываете персональные данные (GDPR), убедитесь, что доступ к файловым шарам соответствует правилам хранения и разграничения прав.

Краткая методология внедрения (мини-метод)

  1. Разверните тестовый сервер и одну тестовую рабочую станцию.
  2. Настройте DHCP и PXE, убедитесь, что один тонкий клиент грузится корректно.
  3. Настройте NETLOGON и протестируйте парсинг .bat файлов вручную.
  4. Включите автоматическое монтирование и отладьте права и Kerberos.
  5. Разверните в пилоте на 5–10 пользователей, соберите обратную связь.
  6. Перенесите в продакшн, документируйте все изменения.

Мини-глоссарий

  • LTSP — Lightweight Terminal Server Protocol, способ централизованной загрузки тонких клиентов.
  • PXE — Preboot Execution Environment, загрузка по сети.
  • CIFS/SMB — протоколы доступа к файлам Windows-шары.
  • Kerberos — протокол сетевой аутентификации, поддерживающий SSO.
  • GSSAPI — интерфейс для механизмов аутентификации (включая Kerberos) в SSH.

Резюме

  • DHCP-конфигурация обеспечивает PXE-загрузку и статические привязки по MAC.
  • Профиль рабочего стола можно централизованно распространить через /etc/skel.
  • Скриптовый подход (win_share.sh + mount.pl) прост для кастомизации и подходит для небольших/средних сред; для крупных сред рассмотрите autofs или pam_mount.
  • pam_script позволяет корректно снимать шар при выходе, а GSSAPI/Kerberos — получить вход по SSH без пароля.

Важно

Перед массовым внедрением обязательно тестируйте сценарии выхода, восстановления паролей и поведения при обрыве сети.

Дополнительные ресурсы

  • Документация LTSP и Ubuntu Help для EdubuntuFAQ (ссылки в разделе Проблемы и решения).
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как устроить идеальную вечеринку для просмотра ТВ
Развлечения

Как устроить идеальную вечеринку для просмотра ТВ

Как распаковать несколько RAR‑файлов сразу
Инструменты

Как распаковать несколько RAR‑файлов сразу

Приватный просмотр в Linux: как и зачем
Приватность

Приватный просмотр в Linux: как и зачем

Windows 11 не видит iPod — способы исправить
Руководство

Windows 11 не видит iPod — способы исправить

PS5: как настроить игровые пресеты
Консоли

PS5: как настроить игровые пресеты

Как переключить камеру в Omegle на iPhone и Android
Руководство

Как переключить камеру в Omegle на iPhone и Android