Le fichier Xresources, habituellement ~/.Xresources, peut être utilisé pour configurer les applications X.
Xterm.termName: xterm
Xterm.vt100.locale: true
XTerm.vt100.metaSendsEscape: true
XTerm.vt100.backarrowKey: false
XTerm.ttyModes: erase ^?
XTerm.vt100.saveLines: 4096
XTerm.vt100.scrollBar: true
XTerm.vt100.scrollbar.width: 8
!-------------------------------------------------------------------------------
! Fonts
XTerm.vt100.faceName: DejaVu Sans Mono:size=9:antialias=true
XTerm.vt100.font: 7x13
!-------------------------------------------------------------------------------
! Colors
*background: #181818
*foreground: #c0c0c0
*cursorColor: #93a1a1
!! black dark/light
*color0: #121212
*color8: #2e3436
!! red dark/light
*color1: #a35b66
*color9: #ab6b74
!! green dark/light
*color2: #99ab6f
*color10: #acb972
!! yellow dark/light
*color3: #ca9733
*color11: #ccaa69
!! blue dark/light
*color4: #495d6e
*color12: #687987
!! magenta dark/light
*color5: #825969
*color13: #977381
!! cyan dark/light
*color6: #839191
*color14: #98a4a4
!! white dark/light
*color7: #e0e0e0
*color15: #e5e5e5
Préparer la clé usb
# dd if=archlinux.img of=/dev/sdX bs=16M && sync
Démarrer sur la clé usb et attendre le prompt root
Pour lister les types de clavier français disponibles :
# find /usr/share/kbd/keymaps -iname '*fr*' -printf '%f\n'
Chargement du clavier :
# loadkeys fr
# wifi-menu
# timedatectl set-ntp true
Sur mon Thinkpad, la taille du disque SSD est de 128Go.
1G sera réservé pour les partitions de boot (boot et EFI) et le reste intégralement chiffré.
A noter que les tailles des partitions efi et boot ne sont pas optimisées, 100M serait suffisant pour efi et 250M pour boot...
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 119,2G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 512M 0 part /boot
└─sda3 8:3 0 118,2G 0 part
└─cryptroot 254:0 0 118,2G 0 crypt
├─vg0-swap 254:1 0 4G 0 lvm [SWAP]
├─vg0-root 254:2 0 20G 0 lvm /
└─vg0-home 254:3 0 94,2G 0 lvm /home
Une partition de swap n'est pas nécessaire, mais peut s'avérer pratique si on souhaite utiliser les fonctions d'hibernation d'un portable.
Dans ce cas, la taille de la partition doit être au moins égale à la quantité de RAM, sur mon Thinkpad -> 3915312 octets.
# cgdisk /dev/sda
Créer les partitions suivantes :
Partition | Périphérique | Taille | Système | Hex code |
---|---|---|---|---|
EFI | /dev/sda1 | 512M | vfat | ef00 |
boot | /dev/sda2 | 512M | ext2 | 8300 |
cryptroot | /dev/sda3 | Espace disque restant | luks | 8300 |
# mkfs.vfat -F32 /dev/sda1
# mkfs.ext2 /dev/sda2
# cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 -y --use-random /dev/sda3
# cryptsetup luksOpen /dev/sda3 cryptroot
Créer un groupe de volume (vg0) et les volumes logiques suivants :
Volume logique | Taille |
---|---|
swap | 4G |
root | 20G |
home | le reste |
# pvcreate /dev/mapper/cryptroot
# vgcreate vg0 /dev/mapper/cryptroot
# lvcreate --size 4G vg0 --name swap
# lvcreate --size 20G vg0 --name root
# lvcreate --extents +100%FREE vg0 --name home
# mkfs.ext4 /dev/mapper/vg0-root
# mkfs.ext4 /dev/mapper/vg0-home
# mkswap /dev/mapper/vg0-swap
# swapon /dev/mapper/vg0-swap
# mount /dev/mapper/vg0-root /mnt
# mkdir /mnt/boot && mount /dev/sda2 /mnt/boot
# mkdir /mnt/boot/efi && mount /dev/sda1 /mnt/boot/efi
# mkdir /mnt/home && mount /dev/mapper/vg0-home /mnt/home
/etc/pacman.d/mirrorlist
Décommenter et déplacer en haut du fichier le miroir préféré.
Sauvegarder le mirrorlist existant et préparer une copie de travail
# cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
# cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.test
Modifier le fichier mirrorlist.test et décommenter les miroirs à tester
Pour garder les miroirs français, générer le fichier à partir de la commande suivante :
# grep -E '^## France$' -A 1 /etc/pacman.d/mirrorlist | grep -vE '^-' > /etc/pacman.d/mirrorlist.test
Pour décommenter tous les serveurs :
# sed -i 's/^#\s*Server/Server/' /etc/pacman.d/mirrorlist.test
Tester les miroirs et générer le nouveau mirrorlist (ici avec les 5 miroirs les plus rapides uniquement) :
# rankmirrors -n 5 /etc/pacman.d/mirrorlist.test > /etc/pacman.d/mirrorlist
Installation du système de base et des outils nécessaires au premier démarrage.
# pacstrap /mnt base base-devel linux linux-firmware pacman-contrib
# pacstrap /mnt grub-efi-x86_64 efibootmgr mkinitcpio lvm2 wpa_supplicant wireless_tools vim zip unzip alsa-utils lsb-release ntfs-3g dosfstools exfat-utils bash-completion man-db
# genfstab -pU /mnt >> /mnt/etc/fstab
# /tmp
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
Remplacer les options relatime
par noatime
sur les partitions sauf celle de boot (limite les accès et augmente donc la durée de vie d'un disque SSD)
# arch-chroot /mnt /bin/bash
# ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
# hwclock --systohc --utc
/etc/locale.gen
Décommenter fr_FR.UTF-8 UTF-8
dans le fichier puis regénérer les locales :
# locale-gen
/etc/locale.conf
LANG=fr_FR.UTF-8
/etc/vconsole.conf
KEYMAP=fr
/etc/hostname
myhostname
/etc/hosts
127.0.0.1 localhost
::1 localhost
127.0.1.1 myhostname.domain.local myhostname
# passwd
# useradd -m -g users -G wheel username
# passwd username
/etc/mkinitcpio.conf
Ajouter les options suivantes avant 'filesystems' :
Note : quelque soit l'ordre choisi, pensez toujours à placer keymap devant encrypt, sous peine de vous retrouver avec un clavier qwerty pour taper la passphrase permettant de déchiffrer le volume principal
Au final, cela donne :
HOOKS=(base udev autodetect modconf block keymap encrypt lvm2 resume filesystems keyboard fsck)
# mkinitcpio -p linux
# grub-install
Editer le fichier /etc/default/grub
et modifier la variable GRUB_CMDLINE_LINUX
afin de préciser le périphérique chiffré (cryptroot) et le périphérique d'hibernation (partition de swap) :
GRUB_CMDLINE_LINUX="cryptdevice=/dev/sda3:cryptroot resume=/dev/mapper/vg0-swap"
# grub-mkconfig -o /boot/grub/grub.cfg
# exit
# umount -R /mnt
# swapoff -a
# reboot
Au démarrage la passphrase est demandée afin de déchiffrer le volume puis on accède à la console. On a maintenant un système minimal installé et fonctionnel.
Avec l'arrivée de la version 197 de systemd le nom des interfaces réseau est maintenant préfixé de en (ethernet), wl (wlan) ou ww (wwan), suivi par un identifiant généré automatiquement et prévisible.
Le but étant de fixer le nom des interfaces entre chaque démarrage.
Pour lister les interfaces réseaux :
# ip link show
1: lo [...]
3: enp0s25 [...]
4: wlp3s0 [...]
6: wwp0s29u1u4i6 [...]
Dans le cas où tous les outils ne sont pas encore installés ou si il n'y a pas de serveur dhcp sur le réseau, il peut s'avérer pratique de configurer une connexion manuellement.
Activer l'interface ethernet, ici enp0s25
# ip link set dev enp0s25 up
Affecter une adresse ipv4 à l'interface, ici 192.168.0.60 dans le réseau 192.168.0.0/24 :
# ip address add 192.168.0.60/24 broadcast + dev enp0s25
Ajouter la route par défaut pour accéder à internet, ici 192.168.0.254 :
# ip route add default via 192.168.0.254 dev enp0s25
systemd offre maintenant la possibilité de gérer le réseau par lui-même sans outils supplémentaires.
systemd-networkd permet de détecter, configurer et gérer les connexions réseaux; il peut aussi créer des connexions virtuelles.
Créer le fichier /etc/systemd/network/enp0s25.network
[Match]
Name=enp0s25
[Network]
DHCP=yes
[DHCP]
RouteMetric=10
Activer et démarrer le service
# systemctl enable systemd-networkd.service
# systemctl start systemd-networkd.service
Créer le fichier /etc/systemd/network/wlp3s0.network
[Match]
Name=wlp3s0
[Network]
DHCP=yes
[DHCP]
RouteMetric=20
Créer le fichier /etc/wpa_supplicant/wpa_supplicant-wlp3s0.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
update_config=1
ap_scan=1
fast_reauth=1
country=FR
Ajouter un réseau
# wpa_passphrase ESSID passphrase >> /etc/wpa_supplicant/wpa_supplicant-wlp3s0.conf
Si votre clé wifi est complexe, il est parfois plus simple de la coller dans un fichier texte et d'importer la clé directement :
# wpa_passphrase ESSID `cat /mnt/usb/essid.pwd` >> /etc/wpa_supplicant/wpa_supplicant-wlp3s0.conf
Nettoyer le fichier
La commande précédente ajoute à la fin du fichier une section network
qui contient votre clé wifi en clair.
Il est conseillé de supprimer cette ligne :
network={
ssid="ESSID"
#psk="passphrase" <------- Supprimer cette ligne
psk=d5b7ea2dda330fb59753d126e0b98bc968644423abb76bb52374a027718219c6
}
Activer et démarrer les services
# systemctl enable systemd-networkd.service
# systemctl enable wpa_supplicant@wlp3s0.service
# systemctl start systemd-networkd.service
# systemctl start wpa_supplicant@wlp3s0.service
systemd-resolved est un service systemd fournissant la résolution de noms aux applications locales.
Dans notre cas, le plus simple (et recommandé) est d'utiliser le fichier de stub DNS :
# ln -s /run/systemd/resolved/stub-resolv.conf /etc/resolv.conf
Activer et démarrer le service systemd-resolved.service
# systemctl enable systemd-resolved.service
# systemctl start systemd-resolved.service
Pour configurer un environnement graphique basé sur openbox, cf. Configuration environnement graphique avec Openbox
Toutes les opérations décrites ci-dessous ont été faites à partir d'un portable sous Archlinux et du reader/writer eMMC se branchant sur le port SD (via un adaptateur micro-SD).
La commande lsblk
permet de récupérer le nom du périphérique, pour ma part /dev/mmcblk0
$ sudo dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=8
$ sudo fdisk /dev/mmcblk0
Créer une nouvelle partition primaire vide, en tapant les commandes suivantes :
$ sudo mkfs.ext4 /dev/mmcblk0p1
$ mkdir root
$ sudo mount /dev/mmcblk0p1 root
$ wget http://os.archlinuxarm.org/os/ArchLinuxARM-odroid-xu3-latest.tar.gz
$ sudo bsdtar -xpf ArchLinuxARM-odroid-xu3-latest.tar.gz -C root
$ cd root/boot/
$ sudo ./sd_fusing.sh /dev/mmcblk0
$ cd ../..
$ sudo umount root
Attendre la fin du démarrage du système puis se connecter en ssh avec le user alarm et le mot de passe alarm
$ ssh alarm@cloudshell.domaine.lan
Ouvrir une session root avec le mot de passe root
$ su - root
Création du trouseau de clés et enrichissement des certificats des dépôts Arch Linux ARM
# pacman-key --init
# pacman-key --populate archlinuxarm
# pacman -Syu
# pacman -S vim
# ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
Cette commande permet de générer le fichier /etc/adjtime
.
Décommenter la ligne fr_FR.UTF-8 UTF-8
dans le fichier /etc/locale.gen
.
/etc/locale.gen
fr_FR.UTF-8 UTF-8
Générer les locales :
# locale-gen
Generating locales...
fr_FR.UTF-8... done
Generation complete.
/etc/hostname
cloudshell
/etc/hosts
127.0.0.1 localhost
::1 localhost
127.0.1.1 cloudshell.domaine.lan cloudshell
Comme il s'agit d'un serveur installé dans mon réseau local, je préfère lui assigner une adresse ip fixe tout en gardant la possibilité de demander une adresse ip dynamique (si je le déplace par exemple).
J'ai donc créé un profil statique en ajoutant les lignes suivantes à la fin du fichier /etc/dhcpcd.conf
:
/etc/dhcpcd.conf
# Static profile
interface eth0
static ip_address=192.168.0.2/24
static routers=192.168.0.254
static domain_name_servers=192.168.0.254 8.8.8.8
Le CloudShell2 permet de connecter deux disques SATA au format 3.5" et supporte les technologies RAID0, RAID1, SPAN ainsi que l'accès direct (mode PM).
Dans ma configuration, j'ai branché deux disques SATA de 3To et configuré le 'DIP switch' en RAID1.
Le volume RAID est accessible via /dev/sda
et sera monté sur /home
.
# fdisk /dev/sda
Créer une nouvelle partition primaire sur le volume, en tapant les commandes suivantes :
# mkfs.ext4 /dev/sda1
# mkdir /mnt/data
# mount /dev/sda1 /mnt/data
# rsync -avz /home/ /mnt/data/
Une fois les données synchronisées (et vérifiées !), on peut nettoyer le répertoire /home :
# rm -rf /home/*
# mount /dev/sda1 /home
# genfstab -p -U / > /etc/fstab
# echo "options fbtft_device name=hktft9340 busnum=1 rotate=270" > /etc/modprobe.d/cloudshell.conf
# echo "spi_s3c64xx" >> /etc/modules-load.d/fbtft_device.conf
# echo "spidev" >> /etc/modules-load.d/fbtft_device.conf
# echo "fbtft_device" >> /etc/modules-load.d/fbtft_device.conf
$ cat /proc/asound/cards
0 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xf2520000 irq 30
$ arecord -l
**** Liste des Périphériques Matériels CAPTURE ****
carte 0: PCH [HDA Intel PCH], périphérique 0: CX20590 Analog [CX20590 Analog]
Sous-périphériques: 1/1
Sous-périphérique #0: subdevice #0
$ arecord -d 10 /tmp/test-mic.wav
$ aplay /tmp/test-mic.wav
$ alsamixer
$ sudo alsactl store
Note : remplacer sdx1 par le périphérique concerné
$ sudo apt-get install cryptsetup
Créez une partition non-formatée (fdisk, gdisk, etc.)
$ sudo cryptsetup luksFormat /dev/sdx1
En précisant un format (exemple de chiffrement fort) :
$ sudo cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 /dev/sdx1
$ sudo cryptsetup luksOpen /dev/sdx1 sdx1_crypt
$ sudo mkdir /mnt/sdx1_crypt
$ sudo mkfs.ext4 /dev/mapper/sdx1_crypt
$ sudo mount /dev/mapper/sdx1_crypt /mnt/sdx1_crypt
$ sudo chown $USER:users /mnt/sdx1_crypt/ -R
$ cd / && sudo umount /mnt/sdx1_crypt
$ sudo cryptsetup luksClose sdx1_crypt
$ sudo cryptsetup luksOpen /dev/sdx1 sdx1_crypt
$ sudo mount /dev/mapper/sdx1_crypt /mnt/sdx1_crypt
$ cd / && sudo umount /mnt/sdx1_crypt
$ sudo cryptsetup luksClose sdx1_crypt
$ sudo cryptsetup luksOpen /dev/sdx1 sdx1_crypt && sudo mount /dev/mapper/sdx1_crypt /mnt/sdx1_crypt
ou, si on est root :
# echo 'passphrase' | cryptsetup luksOpen /dev/sdx1 sdx1_crypt && mount /dev/mapper/sdx1_crypt /mnt/sdx1_crypt
$ cd / && sudo umount /mnt/sdx1_crypt && sudo cryptsetup luksClose sdx1_crypt
ou, si on est root :
# cd / && umount /mnt/sdx1_crypt && cryptsetup luksClose sdx1_crypt