Создаём образ RDP-клиента для запуска с USB-флешки (часть 1)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Подготовка загрузочного образа

Введение

Клиент RDP — это программное обеспечение, которое позволяет подключиться к терминальному серверу с использованием протокола удалённого рабочего стола (Remote Desktop Protocol).

Технология RDP позволяет применять малопроизводительные компьютеры в качестве терминалов (так называемых тонких клиентов). Все необходимые функции, включая рабочую систему, офисные программы и современный браузер, будут выполняться на сервере.

В интернете есть различные программные продукты, реализующие RDP-клиент. Однако готовых решений, которые можно было бы установить на USB-накопитель, не так много. А те, что есть, имеют ряд ограничений в использовании.

Поэтому создадим свой легковесный образ на на основе Debian 12, используя проверенные пакеты. Готовый образ можно будет записать как на USB-флешку, так и на жесткий диск. А в перспективе такой образ можно будет загружать на тонкий клиент через сеть.

Постановка задачи

В наличии есть компьютеры, которые можно использовать в качестве тонкого клиента с типовыми характеристиками:

  • 4 Гб оперативной памяти

  • BIOS с поддержкой UEFI

  • старый медленный жесткий диск или его отсутствие

Кроме того, в наличии есть USB-накопители объёмом 4 Гб.

Существует несколько способов создания загрузочной флешки.

В первом случае можно установить операционную систему Debian непосредственно на USB-накопитель и затем настроить её.

Второй способ предполагает создание образа диска, на который устанавливается и настраивается операционная система. Затем этот образ можно перенести на USB-накопитель.

Второй способ более удобен, так как работа с образом происходит быстрее, чем со старой флешкой. Кроме того, он позволяет быстро создавать резервные копии образа и при необходимости возвращаться к сохранённому образу.

Для работы с образом будет применяться виртуальная среда QEMU. В качестве файлового образа - формат qcow2, который поддерживает сжатие.

План действий

Первая часть (подготовка загрузочного образа):

  • загрузить установочный образ Debian (iso);

  • создать образ виртуальной машины (qcow2);

  • установить систему;

  • установить базовые пакеты;

  • настроить систему;

  • записать образ на USB-носитель.

Вторая часть (графическое исполнение):

  • установить пакеты

  • настроить разрешения для учётной записи user

  • настроить графическую среду

  • создать скрипт для авторизации

  • настроить автозагрузку графической системы

  • записать образ на USB-носитель.

В статье приведены примеры консольных команд, которые необходимо выполнять в зависимости от задачи в хостовой или гостевой системе. Чтобы различать эти команды, перед ними будет отображаться приглашение:

$ — команды, выполняемые в хостовой системе.
root> — команды, выполняемые в гостевой системе от имени root.
user> — команды, выполняемые в гостевой системе от имени user.

Хостовая система — система, на которой запускаются виртуальные машины.
Гостевая система — система, которая работает внутри виртуальной машины.

Установочный образ Debian 12

На момент создания этой статьи для загрузки доступна версия Debian 12.11.0.
Для скачивания можно перейти на страницу загрузки: https://www.debian.org/download.
Прямая ссылка. Размер установочного образа - 670 Мб.

Файловый образ и виртуальная машина

1. Создание файлового образа

Для подготовки виртуального диска потребуется эмулятор QEMU. В современных версиях Debian его можно установить командой:

 $ sudo apt install qemu-system-x86

После установки QEMU создадим файловый образ виртуального диска объёмом 3 ГБ с использованием формата qcow2:

$ qemu-img create -f qcow2 image.qcow2 3G

В результате будет создан файл image.qcow2, размером 197 Кб.

2. Запуск виртуальной машины

Для запуска виртуальной машины используем следующую команду:

$ qemu-system-x86_64 \
  -m 2048M \
  -bios OVMF.fd \
  -drive file=image.qcow2

Разберём ключевые параметры:

Результат:

 Первый запуск виртуальной машины
Первый запуск виртуальной машины

3. Подготовка виртуальной машины к установке ОС

Чтобы начать установку гостевой операционной системы, необходимо расширить команду запуска QEMU, добавив параметры, обеспечивающие производительность и доступ к установочному носителю:

$ qemu-system-x86_64 \
  -m 2048M \
  -enable-kvm \
  -cpu host \
  -smp 2 \
  -machine type=q35 \
  -bios OVMF.fd \
  -cdrom debian-12.11.0-amd64-netinst.iso \
  -drive file=image.qcow2

Разберём новые параметры:

Установка Debian 12 на виртуальной машине

После запуска виртуальной машины с подключённым ISO-образом Debian начнётся процесс установки. Чтобы получить минимального размера и легко в настраиваемую систему, важно правильно выбрать параметры на каждом этапе.

Ниже — ключевые шаги и рекомендации по настройке:

 Выбор типа установки
Выбор типа установки
Разметка диска
Разметка диска
Разметка диска
Разметка диска

Размер файла image.qcow2 может увеличится до 3 Гб. Перед настройкой гостевой системы рекомендую создать архивную копию образа.

Установка необходимых пакетов в гостевую систему

После установки системы Debian 12 на виртуальный диск необходимо установить и настроить базовые компоненты. Это позволит подготовить её к удобной работе и установке графической системы.

1. Установка localepurge — экономия места за счёт локализаций

Многие пакеты при установке добавляют файлы локализации (переводы интерфейса), которые могут занимать десятки и более мегабайт. В нашем случае, когда важны компактность и производительность, эти файлы — избыточны.

Первым делом установите утилиту localepurge, которая автоматически блокирует установку языковых файлов:

  root> apt install -y localepurge

Во время установки появится диалог, предлагающий выбрать, какие локали оставить. Отметьте только необходимые:

2. Установка Midnight Commander (mc)

Для удобной навигации по файловой системе и редактирования конфигурационных файлов установите Midnight Commander:

root> apt install -y mc

Запустить его можно командой:

root> mc

3. Установка SSH-сервера

Чтобы упростить взаимодействие с гостевой системой, установите SSH-сервер:

root> apt install -y ssh

По умолчанию SSH-доступ для пользователя root запрещён. Чтобы разрешить вход, добавьте строку в файл конфигурации /etc/ssh/sshd_config:

PermitRootLogin yes

На этом установка базовых пакетов закончена. Необходимо выключить гостевую систему чтобы настроить запуск виртуальной машины с новыми параметрами:

root> poweroff

Доступ к гостевой системе по SSH

Поскольку виртуальную машину предстоит запускать многократно в процессе настройки, удобно создать скрипт для автоматизации этого процесса:

#!/bin/bash

qemu-system-x86_64 \
-name "usb-debian" \
-m 2048M \
-enable-kvm \
-cpu host \
-smp 2 \
-machine type=q35 \
-bios OVMF.fd \
-net nic -net user,hostfwd=tcp::2222-:22 \
-drive file=image.qcow2 \
&

Пояснение новых параметров:

Чтобы скрипт был исполняемым не забываем добавить разрешение:

$ chmod +x myscript.sh

Подключение к гостевой системе по SSH

После загрузки гостевой ОС подключитесь к ней с хостовой системы через SSH:

$ ssh -p 2222 root@localhost

Если SSH-клиент не принимает сертификат с localhost, то удалите старый сертификат :

$ ssh-keygen -R '[localhost]:2222'

Рекомендуемые инструменты для работы

Remmina
Remmina
Встроенный SFTP-доступ в MC
Встроенный SFTP-доступ в MC

Настройка гостевой системы

1. Удаление CD-ROM из источников пакетов

По умолчанию установщик добавляет CD-ROM как источник пакетов в файл /etc/apt/sources.list

За ненадобностью необходимо закомментировать или удалить строку:

# deb cdrom:[Debian GNU/Linux ...

После обновить список пакетов:

root> apt update

2. Отключение загрузочного меню GRUB

Чтобы убрать загрузочное меню GRUB и ускорить загрузку, в файле /etc/default/grub необходимо установить переменную:

GRUB_TIMEOUT=0

Примените изменения:

root> update-grub

3. Удаление старых ядер Linux

После установки Debian оставляет два ядра — текущее и предыдущее. Cтарое ядро не нужно и занимает около 400 МБ на диске. Чтобы удалить все ядра, кроме текущего, выполните команду:

root> apt remove $(apt list --installed | sed 's/\/.*//' | grep linux-image | grep -v "$(uname -r)")
root> update-grub

Пояснение:

4. Имя сетевого интерфейса

В современных системах Linux имена сетевых интерфейсов генерируются динамически на основе топологии оборудования. В результате на одной машине интерфейс может называться enp0s2, на другой — ens18. Данное поведение усложняет создание загрузочных образов с поддержкой сети, когда система должна работать на разных компьютерах. Чтобы избежать перенастраивания сети стоит вернуться к классическому именованию интерфейсов — eth0.

Для этого необходимо изменить параметры загрузки ядра через GRUB. В файле /etc/default/grub заменить строку:

GRUB_CMDLINE_LINUX=""

на

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

Примените изменения:

root> update-grub

В файле конфигурации сетевого интерфейса/etc/network/interfaces переименовать имя интерфейса на eth0. Для этого необходимо заменить строки:

allow-hotplug enp0s2
iface enp0s2 inet dhcp

на

allow-hotplugin eth0
iface eth0 inet dhcp

Система настроена на получение настроек от DHCP-сервера. Для работы этого более, чем достаточно.

По умолчанию в QEMU не поддерживается ICMP-трафик (команда ping) из гостевой системы наружу. Это не означает, что сеть не работает — ICMP-пакеты блокируются на уровне виртуализации. Для проверки доступности сетевых ресурсов лучше проверять порты, например, утилитой netcat.

5. Временные папки: использование RAM-дисков

В процессе работы система использует временные каталоги, накапливая кэши, логи и промежуточные файлы. Со временем их объём может достигать нескольких сотен мегабайт.

Чтобы сократить использование дисковой системы и повысить производительность, перенесём временные каталоги в оперативную память с помощью виртуальной файловой системы tmpfs.

В файле конфигурации точек монтирования /ets/fstab необходимо добавить строки:

tmpfs	/tmp				tmpfs	defaults,noatime,rw	0 0
tmpfs	/run				tmpfs	defaults,noatime,rw	0 0
tmpfs	/var/tmp			tmpfs	defaults,noatime,rw	0 0
tmpfs	/var/lock			tmpfs	defaults,noatime,rw	0 0
tmpfs	/var/log			tmpfs	defaults,noatime,rw	0 0
tmpfs	/var/lib/apt/lists	tmpfs	defaults,noatime,rw	0 0
tmpfs	/var/cache			tmpfs	defaults,noatime,rw	0 0

Так же в этом файле закомментируем строку монтирования CDROM, если она есть:

#/dev/sr0  /media/cdrom0   iso9660   ro,noauto   0   0

Перед тем как включить tmpfs, необходимо удалить содержимое перечисленных каталогов, кроме папки /run:

root> rm -rf /tmp/*
root> rm -rf /var/tmp/*
root> rm -rf /var/lock/*
root> rm -rf /var/log/*
root> rm -rf /var/lib/apt/lists/*
root> rm -rf /var/cache/*

Чтобы дополнительно сэкономить место, можно удалить ненужные языковые файлы в /usr/share/locale: кроме каталога русской локализации ru и системного файла сопоставления @locale.alias.

Важно после очистки каталогов сразу перегрузить гостевую систему:

root> reboot

После перезагрузки указанные каталоги будут размещены в оперативной памяти. Это даёт несколько преимуществ:

6. Настройка GRUB для загрузки с USB-носителя

При установке Debian размещает UEFI-загрузчик по пути /boot/efi/EFI/debian/grubx64.efiи прописывает путь в NVRAM материнской платы. Поэтому такая конфигурация не гарантирует загрузку на других компьютерах. Так как BIOS по умолчанию ищет загрузчик по другому пути - /boot/efi/EFI/BOOT/BOOTX64.EFI, операционная система с USB-флешки не запустится.

Для размещения UEFI-загрузчика по каноническому пути необходимо выполнить команду:

root> grub-install --target=x86_64-efi --removable

Настройка профиля root и автологина

1. Настройка приглашения командной строки

В конец файла конфигурации оболочки /root/.bashrc добавить строку:

PS1='root> '

Теперь при каждом запуске терминала приглашение будет отображаться как:

root>

2. Автозапуск Midnight Commander

Чтобы сразу после входа в систему запускать файловый менеджер, настроим автозапуск, добавив в файл /root/.profile перед последней строкой команду mc. Должно получится что-то типа:

if [ "$BASH" ]; then
  if [ -f /etc/bash.bashrc ]; then
    . /etc/bash.bashrc
  fi
fi

mc
mesg n 2> /dev/null || true

Теперь после входа в терминал автоматически запустится Midnight Commander. Для выхода из mc нажмите F10, и вы вернётесь в командную строку.

3. Автоматический вход в консоль (autologin для root)

Данный шаг не обязателен и приведён для примера.

Отредактируйте шаблон сервиса getty@.service. В файле /usr/lib/systemd/system/getty@.service необходимо заменить значение ExecStart. Старое лучше закомментировать. Оно нам ещё понадобится. Добавьте новую строку:

ExecStart=-/sbin/agetty -a root - $TERM

4. Применение изменений

После внесения правок перезагрузите систему:

root> reboot

После загрузки вы автоматически окажетесь в терминале под root, с запущенным mc и кратким приглашением командной строки.

Сжатие образа и подготовка к записи на USB

На этом этапе образ системы уже настроен, но занимает больше места, чем необходимо. Виртуальный диск в формате qcow2 динамически расширяется, но не "сжимается" автоматически — даже после удаления файлов свободное пространство остаётся забитым мусором, что мешает эффективному сжатию.

Чтобы уменьшить размер итогового образа, выполним обнуление свободного места, а затем — конвертацию с компрессией.

1. Анализ использования диска

Текущий размер файла image.qcow2 — 2742 МБ. Однако реальное использование файловой системы значительно меньше.

Проверим, сколько места занято в гостевой системе:

root> df -h -BM /dev/sda*

Результат:

Файловая система   1M-блоков   Использовано   Доступно   Использовано%   Смонтировано в
udev                   956M            0M       956M             0%     /dev
/dev/sda1               47M           12M        35M            26%     /boot/efi
/dev/sda2             2903M          907M      1830M            34%     /

Система использует всего 907 МБ. Под установку графической среды и RDP-клиента доступно 1,8 ГБ — более чем достаточно.

2. Обнуление свободного пространства

Перед сжатием необходимо заполнить нулями всё свободное место на диске. Это позволяет qcow2 эффективно сжать неиспользуемые блоки.

Выполните в гостевой системе:

root> dd if=/dev/zero of=/root/zero ; rm -f /root/zero ; shutdown -h now

Пояснение:

3. Сжатие образа на хосте

После выключения виртуальной машины выполните на хосте:

$ qemu-img convert -p -O qcow2 -c image.qcow2 new.qcow2

Пояснение параметров:

И вернуть старое название файла:

$ mv new.qcow2 image.qcow2

Итоговый размер образа: всего 350 МБ — более чем в 7 раз меньше исходного.
Рекомендую сразу же сделать архивную копию образа.

4. Особенности для файловой системы Btrfs

Если вы используете btrfs вместо ext4, рекомендуется дополнительная оптимизация перед обнулением на стороне гостевой системе:

#!/bin/bash

# Дефрагментация файловой системы
btrfs filesystem defragment -r -v -czstd /

# Создание временной папки без сжатия
mkdir -p ~/temp
btrfs property set ~/temp compression none

# Заполнение нулями
dd if=/dev/zero of=~/temp/zero bs=4M

# Очистка
rm -f ~/temp/zero
shutdown -h now

Запись образа на USB-носитель

Теперь образ готов к записи на флешку.

Чтобы увидеть список подключённых устройств на хостовой машине выполнить:

$ sudo fdisk -l

В моём случае это /dev/sdb.

Записать на флешку:

 sudo qemu-img convert -p image.qcow2 -O raw /dev/sdb

Перед использованием на реальном оборудовании протестируйте загрузку с флешки в QEMU:

qemu-system-x86_64 \
  -name "usb-debian" \
  -m 2048M \
  -enable-kvm \
  -cpu host \
  -smp 2 \
  -machine type=q35 \
  -bios OVMF.fd \
  -drive file=/dev/sdb \
  &

Если система загружается — значит, образ записан корректно.

Для тестирования на компьютере необходимо в BIOS выключить Secure Boot (безопасная загрузка).

Итог

К настоящему моменту у нас есть:

Во второй части руководства будет дана информация как установить графический режим, RDP-клиент и как средствами операционной системы организовать простое диалоговое окно для подключения к удалённому рабочему столу.

Источник: https://habr.com/ru/articles/935022/


Интересные статьи

Интересные статьи

Задачи эксперимента1) Оценить степень влияния регулярного выполнения vacuum/analyze на производительность СУБД.2) Оценить степень влияния распухания таблицы на производительность СУБД.
Данная статья - это не научный прорыв, а лишь помощник быстрее понять как работает стандартный функционал в BitrixДавайте представим, что в разделе каталога у нас 150 запросов к БД. Вроде бы немного п...
Привет! Я хочу рассказать про свой опыт в самоорганизующейся команде. За полтора года там было от 3 до 5 разработчиков, я не занимался их наймом, но все процессы и разраб...
Сравнивать CRM системы – дело неблагодарное. Очень уж сильно они отличаются в целях создания, реализации, в деталях.
Если в вашей компании хотя бы два сотрудника, отвечающих за работу со сделками в Битрикс24, рано или поздно возникает вопрос распределения лидов между ними.