Skip to content

Instantly share code, notes, and snippets.

@frazei
Last active February 7, 2024 17:09
Show Gist options
  • Save frazei/1a068671db9de53a5a05833e6c8e6fc1 to your computer and use it in GitHub Desktop.
Save frazei/1a068671db9de53a5a05833e6c8e6fc1 to your computer and use it in GitHub Desktop.
Ubuntu desktop on Oracle Cloud Free Tier

Ubuntu 22.04 desktop on Oracle Cloud Free Tier

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

Index

  1. Create compute instance
  2. Setup iniziale
  3. Installazione di ubuntu desktop e RDP
  4. Configurazione firewall
  5. Configurazione di rete
  6. Abilitare l'audio in RDP
  7. Troubleshooting

Create compute instance

  • 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).

Setup iniziale

% ssh ubuntu@xxx.xxx.xxx.xxx
$ sudo -i
# passwd ubuntu
# apt update && apt upgrade -y
# dpkg-reconfigure tzdata
# reboot

Installazione di ubuntu desktop e RDP

$ 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

Configurazione firewall

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

Configurazione di rete

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

Abilitare l'audio in RDP

# 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

Troubleshooting

Schermata nera in RDP

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment