В сегодняшний век повсеместной виртуализации возникает необходимость экономить на всем. Наиболее значимые для любого системного администратора сущности, это:
- Время (затраты на обслуживание системы)
- Железо (различные сбои, потеря производительности, устаревание)
- ПО (лицензионная составляющая, защита от вирусов, централизация управления приложениями)
В своей статье я рассматриваю реализацию (не)тонкого клиента на базе ОС Linux, как прослойке между аппаратной составляющей и привычным интерфейсом ОС Windows.
(Не)тонкий клиент, в моем понимании, это дистрибутив ОС Linux обладающий следующими свойствами:
- достаточно большой набор компонентов для загрузки; не подходит для загрузки по сети
- достаточно маленький набор компонентов; не рационально устанавливать жесткий диск
В качестве платформы для реализации я выбрал Nvidia ION ввиду:
- Производительный процессор
- Производительная графика (в рамках неттопов)
- Малошумный (есть варианты с активным и пассивным охлаждением)
- Занимает мало места (есть возможность крепления на монитор)
- Достаточно надежный (ломаться особо нечему)
Также мне понадобится один USB-flash накопитель на 4Гб, который как раз и будет заменой жесткого диска.
Дистрибутив Linux для установки был выбран OpenSUSE. На текущий момент это версия 12.1
Ну, приступим…
Про замечательный проект Suse Studio писали много. С помощью него мы будем создавать конечное решение терминального (не)тонкого клиента:
Создаем новое решение:
Как видно, выбор богатый:
Нам нужно самое легкое решение, поэтому используем шаблон: «минимальная графическая система с оболочкой IceWM».
Теперь можно обустраивать наш дистрибутив!
Software
Данное решение «из коробки» уже содержит необходимые компоненты для запуска графической системы и «легкого» оконного менеджера.
Если все оставить по умолчанию, то может потребоваться достаточно много усилий, чтобы настроить эту систему (видео драйвер, сетевые настройки и т.д.). Мне же нужно решение: поставил, адрес вбил и забыл.
Добавляем следующие компоненты (зависимые пакеты добавятся автоматически):
- freerdp (для любителей rdesktop, можно установить его)
- acpi, acpid (для корректной работы кнопки питания)
- mc (по желанию)
Добавляем из репозитария Nvidia драйвера для видеокарты:
- x11-video-nvidiaG02
- nvidia-gfxG02-kmp-default
(Отличная статья какой видео драйвер Nvidia выбрать)
Удаляем:
- nouveau (драйвер для графических карт Nvidia с открытым исходным кодом)
Configuration
General: Обязательно меняем пароль root и указываем нашего дефалтного пользователя.
Startup: Графический вход
Desktop: с автоматических входом нашего пользователя
Здесь можно задать параметры при загрузке, что мы и сделаем:
setkxbmap -model pc104 -layout us,ru -variant ,
наша клавиатура имеет 104 кнопки с 2-мя раскладками
setkxbmap -option grp:alt_shift_toggle
и переключаться она будет по alt+shift
xfreerdp -u domain\user -f server_ip
чтобы у пользователя не было желания начать изучать линукс
(или rdesktop -k en-us -u domain\user -f server_ip)
echo 'ShowTaskBar=0' >> ~/.icewm/preferences
прячем панель задач (более полно тут)
Для особых позльзовательских настроек, можно прописать дополнительные команды в любом кол-ве.
Для настроек первого запуска, идем в следующую секцию:
Scripts
В секции First Boot добавляем пару строчек:
grep -rl 'timeout 10' /boot/grub/ | xargs perl -i -pe "s/timeout 10/timeout 0/g;"
ставим таймаут выбора вариантов загрузки ОС 0 секунд
echo '* * * * * if ! ps -U tux | grep xfreerdp && ps -U tux | grep icewm; then perl /home/rdp_conn_cnt; fi' >> /var/spool/cron/tabs/tux
Добавялем нашему пользователю (который случайно может завершить сессию RDP, автостарт клиента RDP). По желанию можно сделать более маленький промежуток времени.
chmod u+s /sbin/shutdown
Пользоваляем нашему пользователю выключать компьютер
Files
Собственно сюда я загрузил свой простенький скрипт, который считает кол-во попыток запуска RDP, когда пользователь ничего не ввел. По истечении кол-ва попыток происходит shutdown системы.
#!/usr/bin/perl
$counter = 0;
if (-e "/tmp/rdp_cnt.tmp"){
open (FN, "/tmp/rdp_cnt.tmp") or die "$_";
$cnttext=<FN>;
close FN;
$counter = $1 if ($cnttext =~ /(d+)/);
}
if ($counter++ < 10){
system("export DISPLAY=:0 && xfreerdp -u domain\\user -f server_ip");
open (FN, ">/tmp/rdp_cnt.tmp") or die "$_";
print FN $counter."n";
close FN;
}
else {
unlink("/tmp/rdp_cnt.tmp") if (-e "/tmp/rdp_cnt.tmp");
system ("systemctl poweroff");
}
Build
К построению образа готовы!
Делаем Preload ISO (.iso) и можно ставить.
Автор: po3dno