Для чего это нужно: Многие компании закупают дешёвые тонкие клиенты, которые ничего не умеют, кроме подключение по рдп протоколу. Есть статья на вики по
RDP протоколу. При переходе компании с винды на великий и всемогущий линукс или сразу при использовании линукса, можно столкнуться с кучей проблем и этот мануал помогает одну проблему решить.
Данный мануал протестирован на Lubuntu, Xubuntu, Ubuntu server. Версия дистрибутива 12.04.1 разрядность х86 и х64. Другие графические оболочки протестированы разными людьми и они писали об этом в интернете, можете погуглить.
Прочтите пожалуйста весь мануал, перед тем как начать делать. Сразу говорю при использовании подключения sesman-X11vnc с модулем libvnc.so, я не смог заставить переключаться раскладку клавиатуры.
Подготавливаем систему.sudo apt-get update && sudo apt-get upgrade -y && reboot
Настраиваем сеть.
Удаляем gui интерфейс для управления сетью, иначе он пытается управлять настройками сети.
sudo apt-get remove network-manager -y
Правим /etc/network/interfaces:
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.100.8
netmask 255.255.255.0
gateway 192.168.100.155
Теперь настройка днс, если в /etc/resolv.conf видим:
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
То настройки днс хранятся в /etc/resolvconf/resolv.conf.d/base:
nameserver 192.168.100.1
nameserver 8.8.8.8
search test.lan
Перезапускам сетевой интерфейс и проверяем настройки сети:
/etc/init.d/networking restart
ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:126785 errors:0 dropped:0 overruns:0 frame:0
TX packets:135453 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:116474217 (116.4 MB) TX bytes:102473947 (102.4 MB)
lo Link encap:Локальная петля (Loopback)
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:104371 errors:0 dropped:0 overruns:0 frame:0
TX packets:104371 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:720253620 (720.2 MB) TX bytes:720253620 (720.2 MB)
Устанавливаем необходимые пакеты и обновляем систему:
sudo apt-get update
sudo apt-get install mc openssh-server chkconfig subversion libtool automake automake1.7 automake1.9 git libssl-dev libpam0g-dev libx11-dev libxfixes-dev xxkb libpam-mount clamtk smbfs python-software-properties pulseaudio-esound-compat paprefs -y
Настраиваем PAM.Настраиваем монтирование сетевых ресурсов, выполнение пользовательских скриптов (от root) и настройки skel для пользователей при входе в систему.
Создаем файл скрипта и делаем его исполняемым (в дальнейшем можете использовать этот скрипт по своему усмотрению):
touch /etc/logon
chmod +x /etc/logon
Добавляем в /etc/pam.d/common-session:
session required pam_mkhomedir.so umask=0022 skel=/etc/skel
session optional pam_exec.so /etc/logon
session optional pam_mount.so
Сетевые профили мы будем монтировать в /net/%username%, для каждого пользователя отдельно. Очень не рекомендую монтировать сетевые диски в домашнюю папку пользователя (не дай бог пользователь удалит монтированную папку). Будем использовать симлинки.
Создаем папку для монтирования сетевых ресурсов /net:
mkdir /net
Общие папки и профили у меня лежат на сервере 192.168.1.1:
\\192.168.1.1\home\%username% — профиль монтируем в /home/%username%
\\192.168.1.1\public — общую папку монтируем в /net/%username%/public
Настраиваем папки для сетевого монтирования, добавляем параметры подключения в /etc/security/pam_mount.conf.xml после debug enable:
<volume user="*" fstype="nfs" server="192.168.1.1" path="home/%(USER)" mountpoint="/home/%(USER)" options="iocharset=utf8,rw,noperm,file_mode=0660,dir_mode=2770" />
<volume user="*" fstype="nfs" server="192.168.1.1" path="public /%(USER)" mountpoint="/net/%(USER)/public " options="iocharset=utf8,rw,noperm,file_mode=0660,dir_mode=2770" />
Я пока не нашел как заставить выполнять pam-mount при входе по ssh(да и не искал). Вот
мануал по файлу конфигов pam_mount.conf.xml.
Донастраиваем Xsession.Добавляем в /etc/X11/Xsession после set -e:
## Для корретного определения локали
if [ -r /etc/default/locale ]; then
. /etc/default/locale
export LANG LANGUAGE
fi
## Для корретной работы переключения раскладок клавиатуры по alt + shift может понадобиться эта строка. Если испытываете трудности раскомментируйте её удлив символ #
#setxkbmap -layout "us,ru(winkeys)" -model "pc105" -option "grp:alt_shift_toggle"
## автоматической создание симлинков на сетевые ресурсы при каждом входе
ln -f -s /net/$USER/public /home/$USER/Сетевые\ ресурсы
Настраиваем скелеты для пользователей.
Под любым пользователем настраиваете рабочий стол, панели, ярлыки и т.п, все что нужно пользователям по умолчанию. Не забудьте добавить на панель индикатор переключения раскладки.
Отключаем скринсейвер, так как он вешает машину наглухо.Далее копируете из домашней папки настроенного пользователя настройки в /etc/skel. Обратите внимание на особенность при использовании skel не выполняется скрипт генерации первичной структуры домашней папки, так как при первом входе домашняя папка полностью копируется из /etc/skel.
Выполняем с правами рута:
cd /home/Настроенный_Пользователь
cp -R -f -b .config/ /etc/skel/ # настройки графической оболочки
cp -R -f -b Рабочий\ стол/ /etc/skel/ # Содержимое рабочего стола
cp -R -f -b Документы/ /etc/skel/ # Содержимое документов
Cобираем x11rdp.Устанавливаем библиотеки разработчиков xorg, качаем и собираем исходники x11rdp:
sudo apt-get build-dep xserver-xorg-core
cd ~
wget http://server1.xrdp.org/xrdp/x11rdp_xorg71.tar.gz # Исходники могут переехать по другому адресу, если что гугл поможет
tar -xvf x11rdp_xorg71.tar.gz
sudo mkdir /opt/X11rdp # важно: /opt/X11rdp владелец должен быть root!
cd x11rdp_xorg71
time sudo sh buildx.sh /opt/X11rdp
Смело идем за стаканом с (чаем/кофе/пивом) на моей виртуальной машине сборка занимает около 16 минут:
all ok
real 15m57.336s
user 8m22.199s
sys 1m20.693s
Проверяем установленые библиотеки:
cd /opt/X11rdp/bin
ls -lh
ln -s /opt/X11rdp/bin/X11rdp /usr/bin/X11rdp # делаем симлинк в /usr/bin
Cобираем свежую сборку xrdp.Мы будем использовать свежую сборку xrdp. Что бы создать скрипты для запуска и установить зависимые пакеты ставим и удаляем xrdp из репозитария Ubuntu:
sudo apt-get install xrdp -y ; apt-get remove xrdp -y
Клонируем под нормальным пользователем текущую версию xrdp:
cd ~
git clone https://github.com/FreeRDP/xrdp.git xrdp.git
Собираем из исходников xrdp. Обратите внимание на checkout, это необходимо для корректной работы xrdp:
cd xrdp.git
git checkout 4cd0c118c273730043cc77b749537dedc7051571
./bootstrap
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
make
Устанавливаем с правами root:
sudo make install
Копируем и изменяем RSA ключи, это необходимо для RDP сессий:
sudo su -
mkdir /usr/share/doc/xrdp
mv /etc/xrdp/rsakeys.ini /usr/share/doc/xrdp/
chmod 600 /usr/share/doc/xrdp/rsakeys.ini
chown xrdp:xrdp /usr/share/doc/xrdp/rsakeys.ini
Настройка xrdp.
Делаем резервную копию и создаем симлинк на Xsession:
cd /etc/xrdp
mv startwm.sh startwm.sh.BACKUP
ln -s /etc/X11/Xsession /etc/xrdp/startwm.sh
Приводим настройки /etc/xrdp/xrdp.ini к такому в виду:
[globals]
bitmap_cache=yes
bitmap_compression=yes
port=3389
crypt_level=low
channel_code=1
max_bpp=16
#black=000000
grey=d6d3ce
#dark_grey=808080
#blue=08246b
#dark_blue=08246b
#white=ffffff
#red=ff0000
#green=00ff00
#background=626c72
[xrdp1]
name=RDP
lib=libxup.so
username=ask
password=ask
ip=127.0.0.1
port=-1
xserverbpp=16
[xrdp2]
name=VNC
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1
Исходный выглядит так:
[globals]
bitmap_cache=yes
bitmap_compression=yes
port=3389
crypt_level=low
channel_code=1
max_bpp=24
#black=000000
#grey=d6d3ce
#dark_grey=808080
#blue=08246b
#dark_blue=08246b
#white=ffffff
#red=ff0000
#green=00ff00
#background=626c72
[xrdp1]
name=sesman-X11vnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1
[xrdp2]
name=console
lib=libvnc.so
ip=127.0.0.1
port=5900
username=na
password=ask
[xrdp3]
name=vnc-any
lib=libvnc.so
ip=ask
port=ask5900
username=na
password=ask
[xrdp4]
name=sesman-any
lib=libvnc.so
ip=ask
port=-1
username=ask
password=ask
[xrdp5]
name=rdp-any
lib=librdp.so
ip=ask
port=ask3389
[xrdp6]
name=freerdp-any
lib=libxrdpfreerdp.so
ip=ask
port=ask3389
[xrdp7]
name=sesman-X11rdp
lib=libxup.so
username=ask
password=ask
ip=127.0.0.1
port=-1
xserverbpp=24
Количество разрешённых подключений можно установить в /etc/xrdp/sesman.ini. По умолчанию разрешено 10 пользователей, за это отвечает опция MaxSessions в секции Sessions. В этом же файле рекомендуется не изменять значения KillDisconnected (По умолчанию KillDisconnected=0),IdleTimeLimit, DisconnectedTimeLimit. Я изменил опцию KillDisconnected и у меня юзеры смогли коннектится в ту же сессию, но за правильность суждений не ручаюсь.
[Globals]
ListenAddress=127.0.0.1
ListenPort=3350
EnableUserWindowManager=1
UserWindowManager=startwm.sh
DefaultWindowManager=startwm.sh
[Security]
AllowRootLogin=0 # Разрешать входить руту по умолчанию стоит 1, то есть разрешать. Я изменил на 0 ради безопасности.
MaxLoginRetry=4 # Максимальное количество попыток входа
TerminalServerUsers=tsusers # Как я понял группа пользователей терминального сервера
TerminalServerAdmins=tsadmins # Группа администраторов терминального сервера. Если вы не входите в эту группу то
# выключение питания или перезагрузка сервера из терминального подключения не доступна.
[Sessions]
X11DisplayOffset=10 # Порядковый номер дисплея, который проверяется сначала на свободность, а после на нём запускается X сервер.
# Если на сервере больше 10 физически подключенных дисплеев или локальных сессий то значение лучше увеличить. Если меньше оставьте
# значение по умолчанию, чтобы не натыкаться на локально подключеные сессии.
# C каждым новым терминальным подключением это значение увеличивается на 1 единицу. После отключения сессии дисплей на который она
# подключалась освобождается и следующая терминальная сессия открывается на освобожденном дисплее.
MaxSessions=10 # Максимальное количество терминальных сессий.
KillDisconnected=1 # В теории по мануалам это остановка сессий которые отключились. На моей практике получилось,
# что я смог подключаться в отключенную сессию. Если оставить 0 по умолчанию, у меня сессии не терминировались, а висели в процессах
# как у всех кто писал мануалы по xrdp.
IdleTimeLimit=0
DisconnectedTimeLimit=0
[Logging]
LogFile=/var/log/xrdp-sesman.log
LogLevel=DEBUG
EnableSyslog=0
SyslogLevel=DEBUG
[X11rdp]
param1=-bs
param2=-ac
param3=-nolisten
param4=tcp
[Xvnc]
param1=-bs
param2=-ac
param3=-nolisten
param4=tcp
param5=-localhost
param6=-dpi
param7=96
Немного изменяем скрипт управления /etc/init.d/xrdp, добавляем параметры:
PIDDIR=/var/run
SESMAN_START=yes
Настраиваем авторизацию xrdp, приводим файл /etc/pam.d/xrdp-sesman к виду:
#%PAM-1.0
@include sesman
Запускаем xrdp сервер и проверяем:
service xrdp start
* Starting Remote Desktop Protocol server ok
process 3147 started
starting sesman...
sesman config:
ListenAddress: 127.0.0.1
ListenPort: 3350
EnableUserWindowManager: 1
UserWindowManager: startwm.sh
DefaultWindowManager: startwm.sh
AuthFilePath: disabled
Xvnc parameters:
Parameter 00 -bs
Parameter 01 -ac
Parameter 02 -nolisten
Parameter 03 tcp
Parameter 04 -localhost
Parameter 05 -dpi
Parameter 06 96
X11rdp parameters:
Parameter 00 -bs
Parameter 01 -ac
Parameter 02 -nolisten
Parameter 03 tcp
logging configuration:
LogFile: /var/log/xrdp-sesman.log
LogLevel: 4
EnableSyslog: 0
SyslogLevel: 4
security configuration:
AllowRootLogin: 0
MaxLoginRetry: 4
No TSUsersGroup defined
No TSAdminsGroup defined
session configuration:
MaxSessions: 10
X11DisplayOffset: 10
KillDisconnected: 1
IdleTimeLimit: 0
DisconnectedTimeLimit: 0
[20121201-21:09:12] [WARN ] [init:45] libscp initialized
[ OK ]
Если отобразились настройки xrdp-sesman, значит все встало как надо. В версии из репозитария настройки не отображаются. Теперь можно проверить подключение к серверу по RDP протоколу любым доступным клиентом.
Альтернативное решение проблемы с переключением раскладки:Шрифты - этот бинарник X11rdp ищет шрифты в /opt/X11rdp/lib/X11/fonts
Создал каталоги /opt/X11rdp/lib/X11, сделал симлинк fonts на папку со шрифтами уже стоящего X-сервера (у меня лежали в /usr/share/X11/fonts)
После этого X11rdp может запускаться, то есть уже можно виндовым клиентом терминалов заходить в sesman-X11rdp.
Однако setxkbmap не работает, видимо этот бинарник X11rdp ищет папку xkb где-то в другом месте. Поэтому, создал в /usr/local/xrdp файл rus.map следующего содержания:
xkb_keymap {
xkb_keycodes { include "xfree86+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+ru(winkeys)+us:2+group(alt_shift_toggle)" };
xkb_geometry { include "pc(pc104)" };
};
Далее прописал в начале /usr/local/xrdp/startwm.sh :
xkbcomp /usr/local/xrdp/rus.map $DISPLAY
Все. Теперь при входе язык русский, Alt+Shift переключает на английский.
В случае проблем со шрифтами: На одном форуме есть рекомендация указать в файле ~/x11rdp_xorg71/buildx.sh параметр “--with-fontdir=” после “./configure” команды перекомпиляции (строка 815). В системе шрифты лежат тут “/usr/share/fonts” , если у вас не так измените путь:
# xorg-server
if ! test -f $PCFILEDIR/xorg-server.pc
then
cd xorg-server-X11R7.1-1.1.0
./configure --prefix=$PREFIXDIR [color=green]--with-fontdir=/usr/share/fonts[/color] --enable-xglx
--with-mesa-source=$SRCDIR/Mesa-6.5 --disable-dmx
if ! test $? -eq 0
then
Если испытываете проблемы c графической оболочкой Gnome или Unity попробуйте выполнить:echo "gnome-session --session=ubuntu-2d" > ~/.xsession
Это по умолчанию для вашего пользователя будет запускать упрощённую сессию юнити 2D.
Или установите gnome session fallback.
sudo apt-get install gnome-session-fallback
После 7 дней мучений делюсь знаниями со всеми. Я постарался учесть все проблемы с которыми столкнулся я или другие пользователи в сети интернет.
Хотел бы добавить эту статью на
https://help.ubuntu.ru/wiki но не знаю как.