Tutti i comandi che iniziano per %
sono eseguiti sul mio mac. Quelli con $
sono eseguiti sul server remoto come utente (ubuntu). Quelli con #
sono eseguiti come root... a me piace poco sudo.
Per maggiori info riguardo il Free Tier: https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm
- Create compute instance
- Setup iniziale
- Installazione di ubuntu desktop e RDP
- Configurazione firewall
- Configurazione di rete
- Abilitare l'audio in RDP
- Troubleshooting
- Placement => AD1 EU-MILAN-1-AD-1
- Image and shape
- Image => Canonical Ubuntu 22.04
- Shape => Ampere VM.Standard.A1.Flex 2 OCPU 16 GB memory
Utilizzo per connettermi la mia chiave pubblica.
Come impostazione di rete lascio fare tutto a Oracle (basta cliccare una volta sul tasto di creazione della macchina, lui da un alert e crea la configurazione standard... strano modo di gestirla).
Con una configurazione così posso fare 2 server, altrimenti posso allocare tutte le risorse disponibili su un server solo (4 CPU e 24 GB RAM).
% ssh ubuntu@xxx.xxx.xxx.xxx
$ sudo -i
# passwd ubuntu
# apt update && apt upgrade -y
# dpkg-reconfigure tzdata
# reboot
$ sudo apt install xrdp net-tools ubuntu-desktop gnome-software
$ vim ~/.xsessionrc
questo è il testo da modificare nelle prime righe:
export DESKTOP_SESSION=ubuntu
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
Di default xrdp ascolta solo su tcp/ipv6, lo si può vedere facendo:
# netstat -nat | grep 3389
tcp6 0 0 :::3389 :::* LISTEN
Bisogna modificare il file di configurazione
# vim /etc/xrdp/xrdp.ini
Ed alla riga giusta cambiare con questo:
port=tcp://:3389
Riavviare il servizio per vedere che adesso ascolta su tcp/ipv4.
# systemctl restart xrdp
# netstat -nat | grep 3389
tcp 0 0 0.0.0.0:3389 0.0.0.0:* LISTEN
Poi bisogna aprire il firewall, tanto c'è quello di Oracle davanti:
# iptables -F
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# netfilter-persistent save
Per modificare le porte sul firewall di Oracle bisogna andare in Networking > Virtual Cloud Networks. Selezionare la 'vcn' attiva, selezionare la 'subnet' attiva, selezionare la 'Security List' attiva e aggiungere in 'Ingress Rules' una configurazione così:
Source Type: CIDR
Source CIDR: 0.0.0.0/0
IP Protocol: TCP
Destination Port Range: 3389
Con la configurazione standard il desktop non riesce a gestire la rete e quindi crede di essere offline.
# nmcli general status
STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN
disconnesso sconosciuto abilitato abilitato abilitato abilitato
# vim /etc/netplan/50-cloud-init.yaml
Inserire questa riga subito dopo enp0s3:
:
renderer: NetworkManager
Quindi applicare la modifica
# netplan apply
# nmcli general status
STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN
collegato pieno abilitato abilitato abilitato abilitato
Dopo il reboot però questa cosa non funziona e si creano due configurazioni in conflitto, non riesco a capire il perchè:
# nmcli connection show
NAME UUID TYPE DEVICE
enp0s3 4337cbfd-d27a-48ca-95bf-eb002e2e5143 ethernet enp0s3
netplan-enp0s3 1eef7e45-3b9d-3043-bee3-fc5925c90273 ethernet --
Un workaround veramente triste (ma al momento non ho trovato di meglio) è quello di aggiungere un servizio al boot che resetta netplan al boot:
# vim /etc/systemd/system/netplan-fix.service
[Unit]
After=network.target
[Service]
ExecStart=/usr/local/bin/netplan-fix.sh
[Install]
WantedBy=default.target
# vim /usr/local/bin/netplan-fix.sh
#!/bin/bash
date > /tmp/netplan-fix.log
nmcli connection show >> /tmp/netplan-fix.log
nmcli n off && nmcli n on
nmcli connection show >> /tmp/netplan-fix.log
systemctl start xrdp
# chmod 744 /usr/local/bin/netplan-fix.sh
# chmod 664 /etc/systemd/system/netplan-fix.service
# systemctl daemon-reload
# systemctl disable xrdp
# systemctl enable netplan-fix.service
# apt-get install -y git libpulse-dev autoconf m4 intltool build-essential dpkg-dev libtool libsndfile1-dev libspeexdsp-dev libudev-dev pulseaudio
# cp /etc/apt/sources.list /etc/apt/sources.list.u2ad
# sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list
# apt-get update -y
# apt build-dep pulseaudio -y
# cd /tmp
# apt source pulseaudio
# cd pulseaudio-15.99.1+dfsg1/
# meson --prefix=$(pwd) build
# git clone https://github.com/neutrinolabs/pulseaudio-module-xrdp.git
# cd pulseaudio-module-xrdp/
# ./bootstrap
# ./configure PULSE_DIR=$(cd .. && pwd)
# make
# make install
# systemctl stop xrdp
# systemctl start xrdp
A volte succede che la sessione RDP venga chiusa ma rimanga aperta sul server. Questo comporta che al secondo login la schermata rimanga nera perchè non è possibile aprire più sessioni desktop/RDP contemporaneamente. Per debug ho creato questo script che mostra le sessioni aperte:
#!/bin/bash
declare -A disps usrs
usrs=()
disps=()
for i in $(users);do
[[ $i = root ]] && continue # skip root
usrs[$i]=1
done # unique names
for u in "${!usrs[@]}"; do
for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
disps[$i]=$u
done
done
for d in "${!disps[@]}";do
echo "User: ${disps[$d]}, Display: $d"
done
Se ci sono più righe allora l'unica cosa da fare è killarle tutte e riconnettersi:
# systemctl restart systemd-logind; sudo systemctl restart display-manager; loginctl terminate-user ubuntu