From 8e6bdaccfd4c08014e26ede20a1d14ebddc4f121 Mon Sep 17 00:00:00 2001 From: fatalerrors Date: Mon, 31 May 2021 19:15:38 +0200 Subject: [PATCH] =?UTF-8?q?=C3=89criture=20des=20fonctions=20de=20pr=C3=A9?= =?UTF-8?q?paration=20des=20disques,=20partie=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- init.conf.sh | 29 +++++++--- init.sh | 10 ++-- modules/conf_zfs.sh | 115 ++++++++++++++++++++++++++++++++++++++-- modules/upgrade_dist.sh | 39 +++++++++----- 4 files changed, 166 insertions(+), 27 deletions(-) diff --git a/init.conf.sh b/init.conf.sh index f74f8a0..30821b3 100644 --- a/init.conf.sh +++ b/init.conf.sh @@ -1,6 +1,9 @@ # Domaine LEGOS export MAINDOM="legos.obs-mip.fr" +# Utilisateur de la machine +export MAINUSER="levasseu" + # Proxy LEGOS export PROXYSRV="proxy.legos.obs-mip.fr" export PROXYPORT="3128" @@ -13,22 +16,32 @@ export APTBLACKLIST="apparmor chafa resolvconf" export LOCALESET="en_US.UTF-8 fr_FR.UTF-8" # Liste des paquets de base, utiles dans tous les cas -export INSTLIST_BASE="bc curl dc debconf-utils deborphan dos2unix dump emacs-nox ethtool figlet gawk gpm htop ntp ifstat iftop iotop \ - libpam-krb5 libnss-ldap libpam-ldap ltrace mailutils mc mtr-tiny multitail neofetch nmap nscd openssh-server oping p7zip-full \ - p7zip-rar pbzip2 perl-doc pigz plzip postfix pv qemu-guest-agent resolvconf rsync screen snmpd strace tcpdump tmux traceroute \ - unrar unzip whois xinetd zip" +export INSTLIST_BASE="bc curl dc debconf-utils deborphan dos2unix dump \ + emacs-nox ethtool figlet gawk gpm htop ntp ifstat iftop iotop \ + libpam-krb5 libnss-ldap libpam-ldap ltrace mailutils mc mtr-tiny \ + multitail neofetch nmap nscd openssh-server oping p7zip-full p7zip-rar \ + pbzip2 perl-doc pigz plzip postfix pv qemu-guest-agent resolvconf rsync \ + screen snmpd strace tcpdump tmux traceroute unrar unzip whois xinetd zip" -# ------------------------------------------------------------------------------------------------------------------------------------------ +# Booléen indiquant une ou plusieurs futures VM +export WITH_VM=true + +# ------------------------------------------------------------------------------ # Configuration du disque de calcul : zfs, ext4 et xfs accepté export CALCTYPE="zfs" -# Niveau : mirror (RAID1), raidz1 (RAID5), raidz2 (RAID6), laisser vide pour RAID0, valable seulement pour ZFS +# Niveau : mirror (RAID1), raidz1 (RAID5), raidz2 (RAID6) +# Laisser vide pour RAID0 valable seulement pour ZFS export CALCLEVEL="" -# Liste de lecteurs à utiliser (voir dans /dev/disk/by-id), un seul tolléré pour ext4 et xfs +# Liste de lecteurs à utiliser (voir dans /dev/disk/by-id) +# Un seul tolléré pour Ext4 et XFS, plusieurs séparés par des espaces pour ZFS export CALCDRV="/dev/disk/by-id/xxxxx" -# ------------------------------------------------------------------------------------------------------------------------------------------ +# Doit on forcer l'effacement du disque ? +export FORCEBLANK="no" + +# ------------------------------------------------------------------------------ export MODULE_LIST="upgrade_dist conf_disk" diff --git a/init.sh b/init.sh index d794b66..c3d9e46 100755 --- a/init.sh +++ b/init.sh @@ -106,6 +106,7 @@ backupdist() for file in $@; do if [[ -e ${file} ]]; then + prnt I "Création d'une copie de sauvegarde de ${file}..." cp -av $file $file.dist.$(date --rfc-3339=seconds | sed -e 's/ /-/' -e 's/://g') fi done @@ -194,7 +195,6 @@ apt_blacklist() #} # Locale -FUNCLIST="$FUNCLIST conf_locale" conf_locale() { backupdist /etc/locale.gen @@ -279,11 +279,15 @@ conf_mail() # ====================== # Vérifie qu'on soit root -if [[ $ +if [[ $EUID -ne 0 ]]; + prnt E "Ce script doit être démarré en root. Arrêt." + exit 1 +fi # Chargement de la configuration [[ -s init.sh.conf ]] && . init.sh.conf || ( - + prnt E "Impossible de charger la configuration." + exit 1 ) diff --git a/modules/conf_zfs.sh b/modules/conf_zfs.sh index f10df7b..80bf857 100644 --- a/modules/conf_zfs.sh +++ b/modules/conf_zfs.sh @@ -1,19 +1,128 @@ +#!/bin/bash # Configuration du disque de calcul + +# ------------------------------------------------------------------------------ +# Cas de ZFS conf_zfs() { + prnt I "Création du volume calcul en ZFS." + # On crée les répertoires d'accueil mkdir -pv /calcul/$HOSTNAME # Installation de ZFS - + apt -y install zfsutils-linux - # Mount Ceph volumes if required + # Chargement du module et vérification + modprobe zfs || ( + prnt E "Échec de chargement du module noyau, abandon." + return 2 + ) + sleep 1 + + prnt I "Création du pool zcalc..." + if [[ $FORCEBLANK ]]; then + local opt="--force" + for drv in $CALCDRV; do + if [[ ! $(sfdisk -d $drv 2>&1) == "" ]]; then + prnt I "Effacement des donnée de $drv..." + dd if=/dev/zero of=$drv bs=1024 count 1000000 + fi + done + fi + + if [[ zpool create zcalc -m /calcul/$HOSTNAME $CALCLEVEL $opt $CALCDRV ]]; then + # On active la compression par défaut + zpool set zcalc compression=lz4 + + if [[ $WITH_VM == true ]]; then + prnt I "Création du conteneur pour la future VM..." + zfs create zcalc/vm + fi + else + prnt E "Erreur de création du pool zcalc ($CALCLEVEL) avec les disques $CALCDRV" + return 3 + fi } +# ------------------------------------------------------------------------------ +# Création des partitions pour XFS et Ext4 +mkpart() +{ + prnt I "Création d'une nouvelle table de partition GPT..." + #fdisk -g +} + +# ------------------------------------------------------------------------------ +conf_ext4() +{ + +} + +# ------------------------------------------------------------------------------ +conf_xfs() +{ + prnt I "Installation des outils XFS..." + apt install -y xfsprogs +} + + +# ------------------------------------------------------------------------------ conf_disk() { - case $CALCTYPE + [[ $STOP_CONF_DISK ]] && return 0 + + if [[ ! $CALCDRV ]]; then + prnt I "Pas de disque de calcul défini, rien à faire." + return 0 + fi + + prnt I "Installation des outils de partitionnement..." + apt install -y parted + + conf_$CALCTYPE && ( + prnt I "Attribution des droits sur le disque de calcul." + chown -Rv $MAINUSER:$MAINUSER /calcul/$HOSTNAME + ) + else +} + +# ------------------------------------------------------------------------------ +precheck_conf_disk() +{ + if [[ ! $(type -t conf_$CALCTYPE) == "function" ]]; then + prnt E "Format de disque inconnu ($CALCTYPE) !" + exit 1 + fi + + prnt I "Vérification des lecteurs pour disque de calcul." + local drvcount=0 + for drv in $CALCDRV; do + if [[ -e $drv ]]; then + if [[ $(/sbin/sfdisk -d $drv 2>&1) == "" ]]; then + prnt I "Le dique $drv est vierge." + else + prnt W "Le disque $drv n'est pas vierge !" + if [[ $FORCEBLANK=="true" ]]; then + prnt W "Le disque $drv sera réinitialisé !" + else + prnt E "La réinitialisation de $drv n'est pas autorisé, rien ne sera fait !" + export STOP_CONF_DISK=1 + fi + fi + else + prnt E "Le disque $drv n'existe pas. Abandon." + exit 1 + fi + (( drvcount+=1 )) + done + + if [[ ! $CALCTYPE=="zfs" && drvcount -gt 1 ]]; then + prnt E "Plusieurs diques impossibles avec Ext4 ou XFS !" + exit 1 + fi } export -f conf_disk +export -f precheck_conf_disk diff --git a/modules/upgrade_dist.sh b/modules/upgrade_dist.sh index 359bc5d..d8567cb 100644 --- a/modules/upgrade_dist.sh +++ b/modules/upgrade_dist.sh @@ -9,19 +9,15 @@ upgrade_dist() prnt I "Configuration du proxy pour APT..." if [[ $PROXYSRV ]]; then - if [[ $PROXYPORT ]]; then - if [[ ! -d $(basedir $proxyfile) ]]; then - mkdir -pv /etc/apt/apt.conf.d || ( - prnt E "Impossiblle de créer le répertoire d'accueil pour la configuration d'APT." - exit 10 - ) - fi - backupdist $proxyfile - echo "# Generated automatically on $(date $DATEFORMAT) by $0" > $proxyfile - echo "Acquire::http::Proxy \"http://${ACNGSRV}:3142\";" >> $proxyfile - else - prnt E "Un serveur proxy a été spécifié mais pas son port d'usage." + if [[ ! -d $(basedir $proxyfile) ]]; then + mkdir -pv /etc/apt/apt.conf.d || ( + prnt E "Impossiblle de créer le répertoire d'accueil pour la configuration d'APT." + exit 10 + ) fi + backupdist $proxyfile + echo "# Generated automatically on $(date $DATEFORMAT) by $0" > $proxyfile + echo "Acquire::http::Proxy \"http://${PROXYSRV}:${PROXYPORT}\";" >> $proxyfile else prnt I "Pas de proxy configuré, ne fait rien." fi @@ -36,5 +32,22 @@ upgrade_dist() apt autoremove --purge -y } -export -f upgrade_dist +precheck_upgrade_dist() +{ + prnt I "Vérification du réseau..." + wget -q --tries=10 --timeout=20 --spider http://google.com + if [[ ! $? -eq 0 ]]; then + prnt E "Réseau non fonctionnel ! Abandon." + exit 1 + fi + if [[ $PROXYSRV ]]; then + [[ ! $PROXYPORT ]] && ( + prnt E "Un serveur proxy a été spécifié mais pas son port d'usage." + exit 1 + ) + fi +} + +export -f upgrade_dist +export -f precheck_upgrade_dist