[ howto ] Installation de proxmox en debootstrap avec disques chiffrés en raid MDADM (partie 3/2 - variante finale)
Suite de [ howto ] Installation d'un serveur dédié (partie 2 chiffrement des disques)
Reprise des deux articles précédents, avec de petites variations, pour l'installation de Proxmox.
Partitionnement des disques :
Préparation des disques :
Pour préparer le raid, j'ai choisi de faire des partitions pour m'assurer qu'il n'y aura pas de problèmes avec grub.
En effet, utiliser les disques physiques tel quel est tout à fait possible pour faire un RAID avec MDADM. Mais tous les espaces nécessaires à GRUB, aux tables des partitions, etc. ne sera pas disponible.
Étant donné que, ici, je mets tout en RAID (y compris /boot) il n'est pas possible d'utiliser directement les disques physiques.
parted /dev/sda mklabel gpt mkpart primary xxxxxxx mkpart primary xxxxxxx mkpart primary xxxxxxx set 1 boot off set 1 bios_grub on quit
A faire x4 dans mon cas.
ℹ️ P.S.: Après avoir galéré presque toute la journée à essayer de faire démarrer cette 🤬 de machine avec les disques en GPT, il semblerait que cette machine n'autorise pas le démarrage en 'legacy' (aka BIOS). La solution a étée de créer une partition EFI. Il faut que le filesystem de la partition /boot/efi soit en fat et le flag soit 'bios_grub'
Création de la grappe RAID :
mdadm --create /dev/md0 /dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3 --level=5 --raid-devices=4 --assume-clean --verbose
J'utilise l'argument 'assume-clean' qui est déconseillé (je n'ai pas cherché pourquoi) pour gagner du temps et ne pas attendre que toute la grappe soit calculée avant de pouvoir avancer.
⚠️ Attention: Avec 'assume-clean' le re-calcul de la grappe va démarrer à un moment donné qui n'est pas contrôlé.
Partitionnement
Une fois la grappe créée, création des partitions :
Ce coup-ci, avec fdisk pour me faciliter la vie à ne pas faire les alignements à la main
fdisk /dev/md0 Command (m for help): g Created a new GPT disklabel (GUID: 720EC671-7449-F54C-9006-828CC1A602C5). Command (m for help): n Partition number (1-128, default 1): 1 First sector (3072-23441307614, default 3072): Last sector, +/-sectors or +/-size{K,M,G,T,P} (3072-23441307614, default 23441307614): +40G Created a new partition 1 of type 'Linux filesystem' and of size 40 GiB. Command (m for help): n Partition number (2-128, default 2): First sector (84937728-23441307614, default 84937728): Last sector, +/-sectors or +/-size{K,M,G,T,P} (84937728-23441307614, default 23441307614): Created a new partition 2 of type 'Linux filesystem' and of size 10.9 TiB. Command (m for help): p Disk /dev/md0: 10.9 TiB, 12001949515776 bytes, 23441307648 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 524288 bytes / 1572864 bytes Disklabel type: gpt Disk identifier: 720EC671-7449-F54C-9006-828CC1A602C5 Device Start End Sectors Size Type /dev/md0p1 3072 84937727 83887104 40G Linux filesystem /dev/md0p2 84937728 23441307614 23356369887 10.9T Linux filesystem Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
C'est déjà pas mal sexy :
root@rescue-customer-eu (ns3136381.ip-51-77-118.eu) ~ # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 3.6T 0 disk |-sda1 8:1 0 256M 0 part /boot/efi |-sda2 8:2 0 512M 0 part /boot `-sda3 8:3 0 3.6T 0 part `-md0 9:0 0 10.9T 0 raid5 |-md0p1 259:0 0 40G 0 part / `-md0p2 259:1 0 10.9T 0 part sdb 8:16 0 3.6T 0 disk `-sdb3 8:19 0 3.6T 0 part `-md0 9:0 0 10.9T 0 raid5 |-md0p1 259:0 0 40G 0 part / `-md0p2 259:1 0 10.9T 0 part sdc 8:32 0 3.6T 0 disk `-sdc3 8:35 0 3.6T 0 part `-md0 9:0 0 10.9T 0 raid5 |-md0p1 259:0 0 40G 0 part / `-md0p2 259:1 0 10.9T 0 part sdd 8:48 0 3.6T 0 disk `-sdd3 8:51 0 3.6T 0 part `-md0 9:0 0 10.9T 0 raid5 |-md0p1 259:0 0 40G 0 part / `-md0p2 259:1 0 10.9T 0 part
:)
Formatage de la partition root :
mkfs.ext4 /dev/md0p1
La partition chiffréé et le LVM seront créés une fois le rescue quitté. Sait on jamais ;)
Installation de Débian
D'ici, il suffit de se référer au [ howto ] (partie 1) pour le debootstrap de Debian (!) et non Devuan pour Proxmox !
apt install debootstrap
export MY_CHROOT=/target
mkdir -p $MY_CHROOT
mount /dev/md0p2 $MY_CHROOT
mkdir $MY_CHROOT/boot
mount /dev/md0p1 $MY_CHROOT/boot
PKG="login,passwd,less,vim,netbase,wget,cpio,e2fsprogs,dpkg,apt,apt-utils,openssh-server,grub2,mdadm,cryptsetup,linux-image-amd64,bash,zsh,bash-completion,sudo,net-tools,inetutils-ping,iproute2,ifupdown,rsyslog,logrotate,cron,systemd"
LC_ALL=C debootstrap --arch amd64 --include=$PKG --variant=minbase bullseye $MY_CHROOT https://deb.debian.org/debian/
A part cette déviation, le reste est exactement le même.
Mon seul problème dans ce setup était le nom de l'interface réseau. Dans le rescue, c'est à base de `ethXX` alors que pour Debian c'est `enp0truc`.
Une fois le debootstrap fini et la machine redémarrée sur Debian, il faut mettre proxmox
Installation de Proxmox
Configuration réseau
Comme il est hors de question que mon Proxmox soit accessible depuis internet, la solution que j'emploie est d'utiliser une adresse IP locale.
Soit je prévois de connecter au VPN et donc j'attribue une adresse dans ce sous-réseau, soit juste une adresse locale et la connexion se fera avec une redirection de port SSH.
Comment ? Proxmox cherche une entrée avec le nom de la machine dans le fichier host et se met en écoute sur celle-ci. Il est donc important (c'est marqué dans la doc ci-dessus) que l'unique entrée contenant le hostname (dans le fichier host) soit l’adresse IP sur laquelle Proxmox va écouter.
% cat /etc/hosts 127.0.0.1 localhost 10.10.0.1 superhostname ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters
/etc/network/interfaces*
/etc/network/interfaces.d/internet
Dans l'idée où plusieurs adresses IP publiques seraient utilisées, il est indispensable de créer un bridge afin de connecter toutes les VMs avec une IP Publique sur l'interface de l'hyperviseur.
Dans le cas où une seule IP Publique est nécessaire, cela n'est pas indispensable, mais ne peut pas créer de problème (si ce n'est un peu plus de complexité), et permet de rester flexible.
⚠️ Tout d'abord, il est important d'avoir le paquet `bridge-utils` d'installé.
% cat /etc/network/interfaces.d/internet ###################### Physical # LAN interface auto enp0s31f6 iface enp0s31f6 inet manual iface enp0s31f6 inet6 manual ################ INTERNET auto vmbr999 iface vmbr999 inet static # Main IP address of the server address 123.124.125.126 netmask 255.255.255.192 # explicit host route to the gateway gateway 123.124.125.1 pointopoint 123.124.125.1 # pre-up iptables-restore < /etc/iptables/up.rules post-up ip route add 123.124.125.1/32 dev vmbr999 bridge-ports enp0s31f6 bridge-stp off bridge-fd 0 bridge_hw 90:1b:0e:f7:14:c6 ##### We do NOT want ipv6 on the hypervisor ! accept_ra 0 autoconf 0 iface vmbr999 inet6 static
/etc/network/interfaces
Il faut maintenant créer une interface avec l'adresse IP renseignée dans le fichier hosts (celle sur laquelle Proxmox va écouter).
J'ai fait le choix d'utiliser un bridge et de la rendre accessible à Proxmox pour être en mesure de la connecter à mon VPN interne et donc de connecter certaines VMs au VPN. (On en profite pour créer un bridge ou deux supplémentaires qui seront utilisés par les VMs)
% cat /etc/network/interfaces source /etc/network/interfaces.d/* auto lo iface lo inet loopback iface enp0s31f6 inet manual # /! NEVER TOUCH ! Configured in /etc/network/interfaces.d/internet auto vmbr10 iface vmbr10 inet static address 10.10.0.1/24 gateway 10.10.0.254 bridge-ports none bridge-stp off bridge-fd 0 auto vmbr56 iface vmbr56 inet manual bridge-ports none bridge-stp off bridge-fd 0
Maintenant il suffit de suivre la procédure officielle :
sudo -i echo "deb [arch=amd64] http://download.proxmox.com/debian/pve bullseye pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list wget https://enterprise.proxmox.com/debian/proxmox-release-bullseye.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg # verify sha512sum /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg 7fb03ec8a1675723d2853b84aa4fdb49a46a3bb72b9951361488bfd19b29aab0a789a4f8c7406e71a69aabbc727c936d3549731c4659ffa1a08f44db8fdcebfa /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg apt update && apt full-upgrade apt install pve-kernel-5.19 reboot ######## sudo -i apt install proxmox-ve postfix open-iscsi -y apt remove linux-image-amd64 'linux-image-5.10*' update-grub
Et voilà 🙂
Par mesure de sécurité, on crée un fichier de configuration pour filtrer les réseaux autorisés à accéder à l'interface Proxmox :
% cat /etc/default/pveproxy LISTEN_IP="10.10.0.1" ALLOW_FROM="10.0.0.0/24" #DENY_FROM="all" POLICY="deny"
(après, il faut redémarrer le service : sudo systemctl restart pveproxy.service)
Une petite redirection de ports :
ssh hyperviseur -L 1234:10.10.0.1.1:8006
et le tour est joué :
Ajouter un utilisateur
Pour pouvoir accéder à l'interface, il faut ajouter un utilisateur.
Ici, cela crée un groupe d'administration, dans lequel on va ajouter l'utilisateur nouvellement créé.
Comme l'utilisateur existera dans le realm 'Proxmox VE Authentication server', il ne faudra pas oublier de sélectionner la bonne entrée à la connexion.
sudo pveum group add admin -comment "System Administrators" sudo pveum acl modify / -group admin -role Administrator sudo pveum user add nailyk@pve sudo pveum passwd nailyk@pve sudo pveum user modify nailyk@pve -group admin
Ajouter le stockage
(J'ai changé de machine, et donc de setup en cours de route à cause de l'augmentation des prix. La configuration ci-dessous est donc différente de celle du partitionnement en haut de cet article)
C'est prêt 🥳