# Création d'un conteneur Turnkey LXC Ubuntu Xfce
{{INLINETOC}}
Cette section présente l'installation et la configuration d'une VM ubuntu 18.04 XFCE dans un conteneur LXC sous turnkey
L'ordinateur n'a aucun système installé (et n'en a pas besoins), son disque dur est partitionné de la manière suivante:
* partition 0 btrfs
* partition 1 btrfs
* partition 3 btrfs
Le BIOS de l'ordinateur est configuré pour démarrer sur la clef USB TURNKEY-LXC :
- L'OS embarqué est un DEBIAN
- LXC monte les systèmes de fichiers ROOTFS,HOME et DATA
- Lorsqu'on démarre un conteneur:
- son ROOTFS est dans un sous répertoire de la partition 0 montée sur /backup
- son HOME est dans un sous répertoire de la partition 1 montée sur /share/home
- son DATA est dans un sous répertoire de la partition 3 montée sur /share/data
.----------------------------------.
|[st] |
| |
.---------------------------. | .------------------------------. |
| (1) TURNKEY LXC | | |[PK] (a) partition 0 | |
| /backup (/dev/dm-0) +--+ | | |
| /share/home/ (/dev/dm-1) | | | -> ROOTFS des conteneurs LXC | |
| /share/data (/dev/dm-3) +--+ | | |
| | | '------------------------------' |
'---------------------------' | .------------------------------. |
| |[BB] (b) partition 1 | |
| | | |
| | -> HOME des conteneurs LXC | |
| '------------------------------' |
| .------------------------------. |
| |[YL] (c) partition 3 | |
| | | |
| | -> DATA des conteneurs LXC | |
| '------------------------------' |
| |
'----------------------------------'
Mappage des partitions DD et du système de fichiers de la TURNKEY
[st]: {"a2s:type":"storage","a2s:delref":true}
[BB]: {"fill":"#5555BB","a2s:delref":true}
[LB]: {"fill":"#bbddee","a2s:delref":true}
[PK]: {"fill":"#FFAAAA","a2s:delref":true}
[OR]: {"fill":"#FF7733","a2s:delref":true}
[BG]: {"fill":"#114444","a2s:delref":true}
[GR]: {"fill":"#99dd99","a2s:delref":true}
[RD]: {"fill":"#EE3322","a2s:delref":true}
[YL]: {"fill":"#ffff33","a2s:delref":true}
# Configuration de l'hôte
## Partage des volumes externes
Pour pouvoir monter automatiquement des volumes externes dans le conteneur il faut les monter dans le système de fichier de TURNKEY-LXC en ajoutant les commandes dans le fichier `/etc/fstab` :
```
echo "/dev/dm-0 /backup btrfs defaults 0 0" >> /etc/fstab
echo "/dev/dm-1 /share/home/ btrfs defaults,subvol=@home 0 0" >> /etc/fstab
echo "/dev/dm-3 /share/data/ btrfs defaults 0 0" >> /etc/fstab
```
Le fichier `/etc/fstab` de l'hôte doit ressembler à ceci:
```
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
# / was on /dev/sdb2 during installation
UUID=4637cc09-4076-479f-9ffd-38fade38e1b1 / ext4 errors=remount-ro 0 1
/dev/mapper/vg01-sp01 none swap sw 0 0
/dev/dm-0 /backup btrfs defaults 0 0
/dev/dm-1 /share/home/ btrfs defaults,subvol=@home 0 0
/dev/dm-3 /share/data/ btrfs defaults 0 0
```
## Installation des drivers
Pour installer les drivers **non-free** il faut activer la source des paquets dans `/etc/apt/sources.list.d/sources.list`:
```
sed -i "s/main/main\ non-free/g" /etc/apt/sources.list.d/sources.list
apt update
```
```
apt install firmware-realtek
apt install tklpatch
apt install btrfs-tools
apt install console-data
apt install alsa-utils
```
Il faut récupérer les IDs mineurs et majeurs de chaque périphérique qui devra être utilisé dans la VM, par exemple:\\ \\ 1 - pour récupérer les IDs du périphérique audio la commande `ls -l /dev/snd` renvoi:\\ \\ `total 0`\\ `drwxr-xr-x 2 root root 80 Dec 17 15:41 by-path`\\ `crw-rw---- 1 root audio 116, 7 Dec 17 15:41 controlC0`\\ `crw-rw---- 1 root audio 116, 2 Dec 17 15:41 controlC1`\\ `crw-rw---- 1 root audio 116, 9 Dec 17 15:41 hwC0D0`\\ `crw-rw---- 1 root audio 116, 6 Dec 17 15:41 hwC1D0`\\ `...`\\ \\ le numéro 116 représente l'iD Majeur du driver audio.\\ \\ 2 - pour récupérer les IDs du périphérique vidéo la commande `ls -l /dev/dri/` renvoi:\\ \\ `total 0`\\ `drwxr-xr-x 2 root root 80 Aug 31 10:05 by-path`\\ `crw-rw---- 1 root video 226, 0 Aug 31 10:05 card0`\\ `crw-rw---- 1 root render 226, 128 Aug 31 10:05 renderD128`\\ \\ Les numéros 226,0 représentent les IDs majeurs et mineurs de driver vidéo\\ Les numéros 226,128 représentent les IDs majeurs et mineurs de driver de rendu\\ \\ 3- pour récupérer les IDs pour un périphérique USB, il faut localiser l'appareil en utilisant **lsusb** (Le paquet usbutils doit ếtre installé) pour trouver les périphériques USB connectés.\\ \\ `Bus 004 Device 002: ID 8087:8000 Intel Corp.`\\ `Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub`\\ `Bus 003 Device 002: ID 8087:8008 Intel Corp.`\\ `Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub`\\ `Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub`\\ `Bus 001 Device 030: ID 046d:c077 Logitech, Inc. M105 Optical Mouse`\\ `Bus 001 Device 002: ID 05dc:b055 Lexar Media, Inn`\\ \\ Pour la clé USB **Lexar Media, Inc** les numéros de bus **001** et de périphériques **002** permettent d'explorer le chemin de périphérique sous **/dev**, pour connaître les nombres majeurs et mineurs de l'appareil:\\ \\ `ls -al /dev/bus/usb/001/002`\\ `crw-rw-r-- 1 root root 189, 1 Feb 15 07:53 /dev/bus/usb/001/002`\\ \\ Les numéros majeurs et mineurs sont respectivement 189 et 1.
# Creation de la VM
## Création d'une VM depuis un modèle
Pour créer un conteneur Linux. La première commande est invariablement:
```
sudo lxc-create -t debian -n p1
```
C'est généralement «ubuntu» pour le nom du modèle, mais on peut le remplacer par debian. Le résultat final est le même, il commence à télécharger les composants via le modèle lxc-ubuntu écrit dans `/usr/share/lxc/templates`.
```
lxc-create -t download -n xfce -- -d ubuntu -r bionic -a amd64
debootstrap is /usr/sbin/debootstrap
Checking cache download in /var/cache/lxc/ubuntu/rootfs-bionic-amd64 ...
Downloading ubuntu minimal ...
I: Retrieving Release
```
## Création d'un conteneur à partir d'un ISO
Lorqu'on dispose d'un fichier image local ISO, il existe un moyen d'utiliser à la place cette image .iso locale au lieu d'aller sur le Web.
l'argument fourni à -t est un fichier dans `/usr/share/lxc/templates`. En regardant le modèle lxc-debian, la routine qui effectue le téléchargement s'appelle **download\_debian()**, et le travail est effectué par debootstrap:
```
debootstrap --verbose --variant=minbase --arch=$arch \
--include=$packages \
"$release" "$cache/partial-$release-$arch" $MIRROR
```
En regardant la page de manuel, debootstrap peut utiliser un répertoire local pour les fichiers miroir plutôt qu'une adresse réseau
```
…MIRROR can be an http:// or https://URL, a file:///URL or an ssh:///URL.
```
Donc, pour utiliser les données locales:
- monter l'ISO sur le système de fichiers quelque part;
- définir la variable d'environnement **MIRROR**;
- invoquer `lxc-create`.
Si le fichier de version signé n'est pas dans l'ISO il faut passer **--no-check-gpg** à debootstrap, en modifiant le fichier de modèle dans `/usr/share/lxc/templates` pour ajouter cet argument:
```
--- lxc-debian~ 2015-03-04 10:04:12.628619962 +0000
+++ lxc-debian 2015-03-04 10:04:17.420619851 +0000
@@ -232,7 +232,6 @@
# download a mini debian into a cache
echo "Downloading debian minimal ..."
debootstrap --verbose --variant=minbase --arch=$arch \
+ --no-check-gpg \
--include=$packages \
"$release" "$cache/partial-$release-$arch" $MIRROR
if [ $? -ne 0 ]; then
```
Donc, une fois ajusté:
```
# mount -o loop debian-7.8.0-amd64-CD-1.iso /mnt
# export MIRROR=file:///mnt
# lxc-create -t debian -n p1 - -r wheezy
```
## Création des users
```
lxc-execute -n xfce -- sudo adduser jacques.nougat --force-badname
lxc-execute -n xfce -- passwd root
```
l'utilsateur **root** est créé par défaut mais il faut lui définir un mot de passe pour pouvoir ce connecter.
# Opérations de base
## Démarrer/arrêter une VM
```
lxc-stop -n xfce
lxc-start -n xfce
```
## Se connecter à la console
```
lxc-console -n xfce
```
## Prendre un snapshot
```
lxc-snapshot -n xfce -c /backup/xfce-config.txt -o /backup/xfce-snapshot.txt
```
# Configuration de la VM
## Configuration dans l'hôte
Fichier de configuration de la VM **xfce**: `/backup/lxc/xfce/config`
```
# Template used to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template: -d ubuntu -r bionic -a amd64
# Template script checksum (SHA-1): 740c51206e35463362b735e68b867876048a8baf
# For additional config options, please look at lxc.container.conf(5)
# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)
# use nat bridge by default
# Distribution configuration
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.arch = linux64
# Container specific configuration
lxc.include = /etc/lxc/natbridge.conf
lxc.rootfs = /backup/lxc/xfce/rootfs
lxc.rootfs.backend = dir
lxc.utsname = xfce
lxc.cgroup.devices.allow = c 116:* rwm
lxc.cgroup.devices.allow = c 226:0 rwm
lxc.cgroup.devices.allow = c 226:128 rwm
lxc.cgroup.devices.allow = c 4:7 rwm
lxc.cgroup.devices.allow = c 29:0 rwm
lxc.cgroup.devices.allow = c 13:* rwm
lxc.mount.entry = /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
lxc.mount.entry = /dev/tty7 dev/tty7 none bind,optional,create=file
lxc.mount.entry = /dev/fb0 dev/fb0 none bind,optional,create=file
lxc.mount.entry = /dev/input dev/input none bind,optional,create=dir
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir
lxc.mount.entry = /share/home/jacques.nougat home/jacques.nougat none bind,rw 0 0
lxc.mount.entry = /share/data data none bind,rw,create=dir 0 0
```
### Autorisation passthrough Matériel
Il n'y a pas de relais matériel dans les conteneurs: les périphériques USB, les périphériques PCI, le KVM, etc. sont disponibles que si les autorisations de les utiliser sont définies dans les conteneurs. On peut le faire via cgroup, plus spécifiquement l'option `lxc.cgroup.device.allow`. Pour utiliser cette option, il faut connaître les numéos majeurs et mineurs de l'appareil.
Pour chaque matériel il faut ajouter dans le fichier `/backup/lxc/xfce/config` une ligne donnant les droits rwm (lecture, écriture, montage):
^ Device ^ Libellé ^ Major ^ Minor ^
| /dev/dri/card0 | vidéo | 226 | 0 |
| /dev/dri/renderD128 | rendu | 226 | 128 |
| /dev/fb0 | framebuffer | 29 | 0 |
| /dev/tty7 | console | 4 | 7 |
| /dev/input/* | input | 13 | * |
| /dev/bus/usb/001/ | usb | 189 | * |
```
lxc.cgroup.devices.allow = c 116:* rwm
lxc.cgroup.devices.allow = c 189:* rwm
lxc.cgroup.devices.allow = c 226:0 rwm
lxc.cgroup.devices.allow = c 226:128 rwm
lxc.cgroup.devices.allow = c 4:7 rwm
lxc.cgroup.devices.allow = c 29:0 rwm
lxc.cgroup.devices.allow = c 13:* rwm
```
L'astérisque qui suit l'iD majeur **189**, qui signifie **tous les périphériques ayant cet ID**
### Partage des devices
La commande **lxc.mount.entry** permet de monter la représentation du fichier de l'appareil dans l'espace conteneur. On peut monter un unique périphérique en indiquant le chemin exact, cependant, il peut être judicieux de mapper tout le répertoire (avec tous ses frères et sœurs) au conteneur car il est plus que probable que le nom du fichier change.
Liste des devices (`/dev`) ajoutés dans le fichier `/backup/lxc/xfce/config`:
^ Périphérique ^ Libellé ^
| **/dev/dri/card0** | carte vidéo |
| **/dev/tty7** | console système |
| **/dev/fb0** | framebuffer |
| **/dev/input** | usb et pointeurs de souris |
| **/dev/snd** | audio |
| **/dev/bus/usb/001** | clefs usb |
```
lxc.mount.entry = /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
lxc.mount.entry = /dev/tty7 dev/tty7 none bind,optional,create=file
lxc.mount.entry = /dev/fb0 dev/fb0 none bind,optional,create=file
lxc.mount.entry = /dev/input dev/input none bind,optional,create=dir
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir
lxc.mount.entry = /dev/bus/usb/001 dev/bus/usb/001 none bind,optional,create=dir
```
le chemin de montage cible ne commence pas par une barre oblique! c'est dev pas /dev
### Automount USB
Service de montage automatique USB sans utiliser d'outil/service externe, avec uniquement udev et systemd.
Le but du déclencheur udevadm est de dire au noyau d'envoyer des événements pour tous les périphériques présents. Il le fait en écrivant dans `/sys/devices/\*/\*/uevent`. Cela nécessite que sysfs soit monté en lecture-écriture sur /sys (condition **ConditionPathIsReadWrite=/sys** dans le fichier `/lib/systemd/system/udev.service`) en utilisant la commande **lxc.mount.auto** dans le fichier de configuration de la VM:\\ \\ `lxc.mount.auto = proc:rw sys:rw`
La première étape est un bref script shell (`/usr/local/bin/usb-mount.sh` doit avoir les droits d'exécution), qui sera appelé par systemd et s'occupe de créer et de supprimer des points de montage, ainsi que de monter et de démonter les disques:
```
cat <<'EOF' >/usr/local/bin/usb-mount.sh
#!/bin/bash
ACTION=$1
DEVBASE=$2
DEVICE="/dev/${DEVBASE}"
# See if this drive is already mounted
MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }')
do_mount()
{
if [[ -n ${MOUNT_POINT} ]]; then
# Already mounted, exit
exit 1
fi
# Get info for this drive: $ID_FS_LABEL, $ID_FS_UUID, and $ID_FS_TYPE
eval $(/sbin/blkid -o udev ${DEVICE})
# Figure out a mount point to use
LABEL=${ID_FS_LABEL}
if [[ -z "${LABEL}" ]]; then
LABEL=${DEVBASE}
elif /bin/grep -q " /media/${LABEL} " /etc/mtab; then
# Already in use, make a unique one
LABEL+="-${DEVBASE}"
fi
MOUNT_POINT="/media/${LABEL}"
/bin/mkdir -p ${MOUNT_POINT}
# Global mount options
OPTS="rw,relatime"
# File system type specific mount options
if [[ ${ID_FS_TYPE} == "vfat" ]]; then
OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"
fi
if ! /bin/mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT}; then
# Error during mount process: cleanup mountpoint
/bin/rmdir ${MOUNT_POINT}
exit 1
fi
# Bonus track: send desktop notification to user
sudo -u andrea DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send "Device ${DEVICE} mounted at ${MOUNT_POINT}"
}
do_unmount()
{
if [[ -n ${MOUNT_POINT} ]]; then
/bin/umount -l ${DEVICE}
fi
# Delete all empty dirs in /media that aren't being used as mount points.
for f in /media/* ; do
if [[ -n $(/usr/bin/find "$f" -maxdepth 0 -type d -empty) ]]; then
if ! /bin/grep -q " $f " /etc/mtab; then
/bin/rmdir "$f"
fi
fi
done
}
case "${ACTION}" in
add)
do_mount
;;
remove)
do_unmount
;;
esac
EOF
```
Afin de permettre à systemd d'appeler ce script, créer un fichier d'unité /etc/systemd/system/usb-mount@.service (**«@»** dans la syntaxe du nom de fichier permet de passer le nom du périphérique comme argument).
```
cat <<'EOF' >/etc/systemd/system/usb-mount@.service
[Unit]
Description=Mount USB Drive on %i
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/usb-mount.sh add %i
ExecStop=/usr/local/bin/usb-mount.sh remove %i
EOF
```
Enfin, créer un nouveau fichier dans /etc/udev/rules.d/99-local.rules contenant quelques règles udev pour démarrer et arrêter le service d'unité systemd sur hotplug / unplug :
```
cat <<'EOF' >/etc/udev/rules.d/99-local.rules
KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service"
KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service"
EOF
```
Donner les droits d'exécution au script-shell, puis prendre en compte le service et le fichier de règles udev:
```
chmod +x /usr/local/bin/usb-mount.sh
udevadm control --reload-rules
systemctl daemon-reload
```
### Partage des dossiers
Ajouter dans le fichier `/backup/lxc/xfce/config` les points de montage des dossiers partagés
```
lxc.mount.entry = /share/home/jacques.nougat home/jacques.nougat none bind,rw 0 0
lxc.mount.entry = /share/data data none bind,rw,create=dir 0 0
lxc.mount.entry = /media media none bind,rw,create=dir 0 0
```
l'absence de / devant les points de montage, car on indique ici un chemin relatif dont la racine est le dossier ou est stocké le système de fichier du conteneur.
### Configuration du proxy iptables
Turnkey LXC expose facilement les services de conteneurs NAT au travers :
Pour exposer les services du conteneur au réseau on peut utilise iptables sur l'hôte pour transférer le trafic qu'il reçoit sur le port X vers le conteneur sur le port Y.
Dans l'hôte relever l'adresse ip du conteneur :
```
lxc-info -n xfce -iH
192.168.121.187
```
LXC attribue des adresses ip par DHCP au conteneur, alors qu'iptables lie un flux à une adresse unique. Pour attribuer une adresse statique à la VM, voir la section [[#Configuration du réseau]]
Le script **iptables-nat** permet de configurer facilement le pare-feu iptables:
```
Syntax: iptables-nat action s_port d_addr:d_port
Add or delete iptables nat configurations
Arguments::
action action to perform (add|del|info)
s_port source port on host
d_addr:d_port destination ip address and port
Examples::
iptables-nat add 2222 192.168.121.150:22
iptables-nat del 2222 192.168.121.150:22
```
Pour la VM xfce4 on a défini les règles suivntes
^ port de l'hôte ^ port dans la VM ^ rôle ^ iptables-nat ^
| 5900 | 5900 | VNC | iptables-nat add 5900 192.168.121.87:5900 |
| 5901 | 5901 | VNC | iptables-nat add 5901 192.168.121.87:5901 |
| 3389 | 3389 | RDP | iptables-nat add 3389 192.168.121.87:3389 |
| 80 | 80 | HTTP | iptables-nat add 80 192.168.121.87:80 |
| 443 | 443 | HTTPS | iptables-nat add 443 192.168.121.87:443 |
| 2222 | 22 | SSH | iptables-nat add 2222 192.168.121.87:22 |
```
iptables -S
# Network configuration
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A INPUT -m state --state INVALID -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s xx.xx.xxx.0/24 -i br0 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -s 192.168.121.0/24 -i natbr0 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -i natbr0 -p udp -m udp --sport 68 --dport 67 -j ACCEPT
-A FORWARD -d 192.168.121.87/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A FORWARD -d 192.168.121.87/32 -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A FORWARD -d 192.168.121.87/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A FORWARD -d 192.168.121.87/32 -p tcp -m state --state NEW -m tcp --dport 3389 -j ACCEPT
-A FORWARD -d 192.168.121.87/32 -p tcp -m state --state NEW -m tcp --dport 5901 -j ACCEPT
-A FORWARD -d 192.168.121.87/32 -p tcp -m state --state NEW -m tcp --dport 5900 -j ACCEPT
-A FORWARD -d 192.168.121.0/24 -p icmp -m icmp --icmp-type 8 -j DROP
-A FORWARD -d 192.168.121.0/24 -p tcp -m conntrack --ctstate NEW -j DROP
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s xx.xx.xxx.0/24 -i br0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -s 192.168.121.0/24 -i natbr0 -m conntrack --ctstate NEW -j ACCEPT
-A f2b-sshd -j RETURN
```
## Configuration du réseau
On peut définir l'adresse et la passerelle depuis l'hôte et configurer le conteneur pour ne pas affecter du tout l'interface à l'aide du mot-clé manual.
### Ifupdown
Placer ceci dans les fichiers `/etc/network/interfaces` des conteneurs:
```
auto eth0
iface eth0 inet manuel
```
Configurer l'interface dans le fichier de configuration du conteneur
```
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxc-bridge-nat
lxc.network.ipv4 = 192.168.100.16/24
lxc.network.ipv4.gateway = auto
```
L'invité se comportera comme si son BIOS avait déjà configuré l'interface et l'utilisera simplement.
### Netplan
Dans Ubuntu 18.04, l'ancien **ifupdown** est considéré comme obsolète. Et il faut migrer vers **systemd-networkd + netplan**
Remplacer le contenu du fichier sudo vi `/etc/netplan/10-lxc.yaml`
```
network:
version: 2
ethernets:
eth0:
dhcp4: true
dhcp-identifier: mac
```
par celui ci:
```
network:
version: 2
ethernets:
eth0:
dhcp4: no
dhcp6: no
addresses: [ 192.168.121.87/24 ]
gateway4: 192.168.121.1
nameservers:
addresses: [10.154.59.104,10.156.32.33]
```
lxc-snapshot -n xfce -c /backup/xfce-config.txt -o /backup/xfce-snapshot.txt
## Configuration dans la VM
### Configuration des locales
```
locale-gen fr-FR
locale-gen fr_FR.UTF-8
apt update-locale
```
### Modification des droits utilisateurs
```
adduser jacques.nougat sudo
addgroup admin
adduser jacques.nougat admin
```
### Installation des paquets
```
export https_proxy="http://proxy.infra.dgfip:3128"
export httpt_proxy="http://proxy.infra.dgfip:3128"
apt install xfce4 thunar-archive-plugin cups system-config-printer-gnome evince
apt install libreoffice libreoffice-nlpsolver libreoffice-help-fr libreoffice-l10n-fr
```
Le réglage par défaut de Xorg ("**allowed\_users=console**" via Xorg.wrap), est trop restrictif. Cela exige que l'utilisateur soit connecté à la console, et affecte tout logiciel qui souhaite créer un framebuffer virtuel à l'aide du logiciel Xorg. En particulier, pour faire fonctionner xfce4 dans la console -vt7.\\ \\ Passer à "**allowed\_users=anybody**", en indiquant dans le fichier `/etc/X11/Xwrapper.config`:\\ \\ `allowed_users=anybody`\\ `needs_root_rights=yes`
L'ISO d'installation du socle DGFIP fournit les paquets suivants\\ - **cups-ppd-msnrl\_1.0.6\_all.deb**: pilote d'impression\\ - **firefox-esr-msnrl\_68.4.1-1\_all.deb**: firefox esr\\ - **msnrl-cisco-anyconnect\_4.5.05030\_all.deb**: CISCO AnyConnect Secure Mobility Client\\ - **msnrl-mce\_1.1.0\_all.deb** courielleur mce thunderbird dépend de gnome-shell\\ - **msnrl-numlock\_0.1.2\_all.deb**: Par défaut, sous Ubuntu, le verrouillage du pavé numérique au démarrage n'est pas activé, numlock vient corriger cette situation\\ - **msttcorefonts-msnrl\_1.0-2\_all.deb**: Fontes MS TrueType\\ - **msnrl-keyring_2018.01.22\_all.deb**: Clé publique de vérification des paquets empaquetés par la MSNRL\\ - **virtualbox-extensionpack-msnrl\_5.2.18\_all.deb**: ExtensionPack Virtualbox
### Clavier et souris
#### Pavé numérique
Il peut arrivé que lorsqu'on appuie sur **VERR NUM**, rien ne se passe, avec **CTRL + ALT + F1** ou **SHIFT + VERR NUM**, celui ci fonctionnera.
#### Intégration du pointeur dans la config Xfce
Editer le fichier `/usr/share/X11/xorg.conf.d/10-evdev.conf`
```
#
# Catch-all evdev loader for udev-based systems
# We don't simply match on any device since that also adds accelerometers
# and other devices that we don't really want to use. The list below
# matches everything but joysticks.
Section "InputClass"
Identifier "evdev pointer catchall"
MatchIsPointer "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection
Section "InputClass"
Identifier "evdev keyboard catchall"
MatchIsKeyboard "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection
Section "InputClass"
Identifier "evdev touchpad catchall"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection
Section "InputClass"
Identifier "evdev tablet catchall"
MatchIsTablet "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection
Section "InputClass"
Identifier "evdev touchscreen catchall"
MatchIsTouchscreen "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection
```
### Imprimante
Installer **cups** et **system-config-printer-gnome**:
- installer les paquets avec la commande `apt install cups system-config-printer-gnome`
- Télécharger le fichier PostScript Printer Description ou \*.ppd correspondant au modèle d'imprimante utilisé.
- décompacter l'archive.
- en **root** lancer **system-config-printer**
- appuyer sur `add` pour ajouter une imprimante
- choisir **Network printer>Find Network Printer**
- indiquer l'adresse ip de l'imprimante dans **Host**
- appuyer sur `probe`
- prendre le fichier ppd télécharger comme driver
Donner les droits d'utilisation à l'utisateur normal e redémarrer cups (stop+start et non restart):
```
sudo usermod -aG lpadmin jacques.nougat
sudo service cups start
```
Le service **cups.socket** doit être **Active: active (running)**
```
systemctl status cups.socket
Failed to dump process list, ignoring: No such file or directory
cups.socket - CUPS Scheduler
Loaded: loaded (/lib/systemd/system/cups.socket; enabled; vendor preset: enab
Active: active (running) since Mon 2021-01-04 09:42:49 UTC; 2h 7min ago
Listen: /run/cups/cups.sock (Stream)
CGroup: /system.slice/cups.socket
```
### Gnome Teminal
Si lors du lancement du terminal Gnome une erreur est retournée
```
$ gnome-terminal
Error constructing proxy for org.gnome.Terminal: /org/gnome/Terminal/Factory0:
Error calling StartServiceByName for org.gnome.Terminal:
Process /usr/lib/gnome-terminal/gnome-terminal-server exited with status 8
```
Mettre à jour le lanceur du terminal:
- Clic droit sur l'icone du lanceur de terminal
- choisir l'item **Properties**
- cliquer sur Edit
- Puis remplacer la commande `exo-open --launch TerminalEmulator` par `/usr/bin/dbus-launch /usr/bin/gnome-terminal`
### NGINX/PHP
PHP-FPM (FastCGI Process Manager) est une alternative à l'implémentation FastCGI de PHP avec quelques fonctionnalités supplémentaires utiles pour les sites à fort trafic. C'est la méthode préférée de traitement des pages PHP avec NGINX et est plus rapide que les méthodes traditionnelles basées sur CGI telles que SUPHP ou mod\_php pour exécuter un script PHP.
```
apt install nginx php-fpm php7.2-sqlite mysql-server php-mysql php-curl php-ldap
```
Si PHP ne démarre pas correctement, vérifier que le répertoire `/run/php` existe bien, si ce n'est pas ajouter la création du répertoire dans la section start du script init.d de php:
```
sudo vi /etc/init.d/php7.2-fpm
```
```
case "$1" in
start)
if init_is_upstart; then
exit 1
fi
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_tmpfiles $VERBOSE
mkdir --mode=07500 /run/php
chown www-data:www-data /run/php
```
redémarrer php
```
sudo systemctl start php7.2-fpm
```
L'extension **PHP pcntl** peut prendre en charge le fonctionnement multi-thread (par exemple pour la gestion de la balise de VLAN du standard IEEE 802.1Q). (Les systèmes non basés sur Unix ne prennent pas en charge ce module). L'installation de cette extension est manuelle et nécessite l'installation des outils de développementPHP:\\ 1) - installer les outils de développement:\\ `apt-get install php7.2-dev -y`\\ 2) - télécharger les sources PHP 7.2.24:\\ `cd /tmp`\\ `wget http://php.net/distributions/php-7.2.24.tar.gz`\\ 3) - décompresser le fichier source de PHP 7.2.24:\\ `tar zxvf php-7.2.24.tar.gz`\\ - compiler le module PCNTL:\\ `cd php-7.2.24/ext/pcntl`\\ `phpize`\\ `./configure`\\ `make`\\ 4) - copier le module PCNTL du répertoire modules vers le répertoire PHP de travail:\\ `cd modules`\\ `cp pcntl.so /usr/lib/php/20170718`\\ 5) - créer le fichier pcntl.ini:\\ `echo "extension=pcntl.so" > /etc/php/7.2/mods-available/pcntl.ini`\\ 6) - créer un lien symbolique vers le fichier pcntl.ini créé à l'étape précédente:\\ `ln -s /etc/php/7.2/mods-available/pcntl.ini /etc/php/7.2/fpm/conf.d/20-pcntl.ini`\\ 7)- modifier la ligne commençant par "disable_functions" en ";disable_functions" dans le fichier php.ini:\\ `vi /etc/php/7.2/fpm/php.ini`\\ 8) - installer le complément PHP-ZIP pour PHP:\\ `apt installer zip unzip php7.2-zip`\\ 9) - redémarrer le service
### Gestionnaire de fichier Thunar
Pour afficher les vignettes d'image/vidéo dans Thunar installer les paquets suivants:
```
killall thunar
sudo apt install tumbler tumbler-plugins-extra ffmpegthumbnailer
thunar -q
```
Cela nécessitera de redémarrer la machine.
### Capture d'écran
Installer l'application `xfce4-screenshooter`
```
apt install xfce4-screenshooter
```
Dans `Menu XFCE -> Paramètres -> Clavier -> Raccourcis d'application`, ajouter la commande `xfce4-screenshooter -f` pour utiliser la touche "PrintScreen" afin de prendre des captures d'écran en plein écran.
### Prise de main a distance
Le VPN0 n'autorise que le protocole RDP® pour prendre un bureau a distance, si l'on souhaite se connecter depuis ces machines sur un serveur Ubuntu, une seule solution : installer XRDP sur ce dernier.
Xrdp est une couche s'installant sur le serveur. Elle fait office de serveur RDP® pour le client qui veut se connecter, et se comporte comme un client VNC pour le serveur ubuntu.
Entre les deux, se glisse un gestionnaire de session dénommé **sesman**, qui :
* donne le choix, à la connexion, entre différents modules. Ceux-ci sont listés dans /etc/xrdp/xrdp.ini, on y trouve bien sûr VNC.
* appelle PAM pour l'authentification.
* fait en sorte que le client VNC, avatar du client RDP, se connecte à une session VNC fonctionnelle. Le plus souvent en la créant, à l'aide des paramètres choisis dans `/etc/xrdp/sesman.ini` et `/etc/xrdp/startwm.sh`.
Xrdp s'interface avec un serveur vnc, il faut Installer un serveur vnc4server ou similaire (par exemple x11vnc)
```
apt install x11vnc xrdp
```
Créer le service x11vnc dans le fichier `/etc/systemd/system/x11vnc.service`
```
# Fichier x11vnc.service pour Debian ou Ubuntu avec systemd
#
[Unit]
Description=VNC Server for X11
After=multi-user.target network.target
[Service]
Restart=always
ExecStart=/usr/bin/x11vnc -display :0 -forever -loop -noxdamage -repeat -rfbport 5900 -shared -o /var/log/x11vnc.log
ExecStop=/usr/bin/x11vnc -R stop
[Install]
WantedBy=multi-user.target
```
Exécuter puis activer le service
```
systemctl daemon-reload
systemctl enable x11vnc.service
```
Editer le fichier `/etc/xrdp/xrdp.ini` pour ne conserver que les sections [globals] et [xrdp1] que l'on renomme pour le fun :
```
[globals]
bitmap_cache=yes
bitmap_compression=yes
port=3389
crypt_level=low
channel_code=1
[xrdp1]
name=legaub vous invite sur un serveur Ubuntu
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1
```
Redémarrer avec :
```
sudo /etc/init.d/xrdp restart
```
On peut désormais se connecter au serveur en utilisant le protocole RDP®.
**Configuration du clavier**: Lorsque les configurations du clavier en local et en distant sont différentes (si Ubuntu est en anglais à la base et même si en local, on a bien configuré le clavier en azerty, le clavier distant reste en qwerty). Voici la commande à exécuter en local, (pas en session distante)\\ \\ `sudo xrdp-genkeymap /etc/xrdp/km-0409.ini`\\ \\ relancer la session distante
### Java JNLP
Le **J**ava **N**etwork **L**aunch **P**rotocol (**JNLP**) est un protocole qui permet de lancer une application sur un bureau client en utilisant des ressources hébergées sur un serveur Web distant. Le logiciel Java Plug-in et le logiciel Java Web Start sont considérés comme des clients **JNLP** car ils peuvent lancer des applets et des applications hébergées à distance sur un bureau client.
```
sudo apt update
sudo apt install default-jdk
sudo apt install icedtea-netx icedtea-plugin
```
Pour les distributions à base de RedHat (CENTOS) installer epel-release java-11-openjdk java-11-openjdk-devel icedtea-web