Forum Linux.debian/ubuntu Debian réplication, kvm → tar / → machine physique ?

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
0
21
fév.
2023

Bonjour,

Je galère un peu… Mon but est de maintenir une machine virtuelle avec kvm comme modèle à répliquer sur diverses machines physiques…

Là, je viens d’avoir le cas où sur la machine physique je dois installer firmware-realtek…

J’installe déjà divers trucs qui peuvent potentiellement servir en fonction du matériel…

Mais, par exemple, existe-t-il un script Debian que je pourrais lancer lors de mon déploiement (chroot) et qui installerait ce qu’il faut en fonction du matériel détecté ?

Comment ce firmware-realtek est-il sensé s’installer lors d’une installation classique ?

Y aurait-il un modèle (propre à Debian si possible) à suivre pour faire ce genre de chose ?

Pour créer l’image, j’ai actuellement un script du genre

#!/bin/bash
[ $(id -u) -eq 0 ] || { echo "Please su - to be root !" ; exit 4 ; }

[ -b /dev/vda ] || { echo "No /dev/vda block device, please verify the context..." ; exit 4 ; }

[ -b /dev/vda1 ] || { echo "No /dev/vda1 block device, please verify the context..." ; exit 4 ; }

ping -c 1 192.168.10.1 &> /dev/null || { echo "NAS (192.168.10.1) unreachable !" ; exit 4 ; }

mkdir -p /mnt/nas || { echo "Making /mnt/nas directory failed !" ; exit 4 ; }

mount -t cifs //192.168.10.1/nas /mnt/nas || { echo "Mounting cifs NAS directory failed !" ; exit 4 ; }

mkdir /mnt/vda1 || { echo "Making /mnt/vda1 directory failed !" ; exit 4 ; }

mount /dev/vda1 /mnt/vda1 || { echo "Mounting /dev/vda1 on /mnt/vda1 failed !" ; exit 4 ; }

cd /mnt/vda1 || { echo "Changing current directory to /mnt/vda1 failed !" ; exit 4 ; }

if [ -d /mnt/vda1/home/user/.mozilla/firefox/*/storage ]
then
    rm -r /mnt/vda1/home/user/.mozilla/firefox/*/storage
fi

if [ -d /mnt/vda1/home/user/.cache ] && [ ! -z "$(ls -A /mnt/vda1/home/user/.cache)" ]
then
    rm -r /mnt/vda1/home/user/.cache/*
fi

if [ -d /mnt/vda1/tmp ] && [ ! -z "$(ls -A /mnt/vda1/tmp)" ]
then
    rm -r /mnt/vda1/tmp/*
fi

curdate=$(date +"%Y%m%d%H%M")

tarfile="/mnt/nas/installation/gnu-vm-vda1-root-$curdate.tar.gz"
echo "Taring /dev/vda1 to file ↓"
echo $tarfile
tar --checkpoint=.1000 --xattrs --xattrs-include=* -czf $tarfile *

Et pour le déploiement j’ai

#!/bin/bash

main ()
{
    ping -c 1 192.168.10.1 &> /dev/null || { echo "NAS (192.168.10.1) unreachable !" ; exit 4 ; }

    mkdir -p /mnt/nas || { echo "Making /mnt/nas directory failed !" ; exit 4 ; }

    mount -t cifs //192.168.10.1/nas /mnt/nas || { echo "Mounting cifs NAS directory failed !" ; exit 4 ; }

    if [ $# -lt 3 ] ; then
        echo "First argument, target partition device:"
        blkid | grep "ext4" | sed 's|^/dev/\(.*\): .*$|\1|'
        echo "Second argument, image name:"
        ls -ltr /mnt/nas/installation/gnu*.tar.gz| grep "installation/gnu" | sed 's|^.*installation/\(.*\).*$|\1|'
        echo "exemple"
        echo "installimage.sh sda1 gnu-vm-vda1-root-202302081136.tar.gz op42"
        exit 1
    fi

    local target="$1"
    local targetdev="$(readlink -f /dev/$target)"
    [ -b "$targetdev" ] || { echo "No $targetdev block device, please verify the context..." ; exit 4 ; }

    local targetblk="$(lsblk -no pkname $targetdev)"
    local targetblkdev="$(readlink -f /dev/$targetblk)"
    [ -b "$targetblkdev" ] || { echo "No $targetblkdev block device, please verify the context..." ; exit 4 ; }

    local targetmnt="/mnt/$target"
    local tarfile="/mnt/nas/installation/$2"

    local hostname="$3"

    [ -e $tarfile ] || { echo "Image fil no found." ; echo $tarfile ; exit 4 ; }

    local uuid=$(blkid |grep "^$targetdev"|sed 's|^.* UUID="\(.*\)" BLOCK.*$|\1|')

    [ -b "/dev/disk/by-uuid/$uuid" ] || { echo "Can’t determine UUID :(" ; exit 4 ; }

    mkdir "$targetmnt" || { echo "Making $targetmnt directory failed !" ; exit 4 ; }

    mount "$targetdev" "$targetmnt" || { echo "Mounting $targetdev on $targetmnt failed !" ; exit 4 ; }

    cd "$targetmnt" || { echo "Changing current directory to $targetmnt failed !" ; exit 4 ; }

    [ -e etc ] && { echo "File system should be cleaned first, maybe holding /home parts..." ; exit 4 ; }

    tar --checkpoint=.1000 --xattrs --numeric-owner -xpzf "$tarfile" 

    sed -i "s|^UUID=.* / *ext4 .*$|UUID=$uuid  /  ext4  errors=remount-ro  0  1|" etc/fstab
    sed -i "s|opxx|$hostname|g" etc/hosts
    sed -i "s|opxx|$hostname|g" etc/hostname


    for dir in dev sys dev/pts proc run ; do mount -B "/$dir" "$dir" || { echo "System directory binding failed..." ; exit 4 ; } ; done
    cp /etc/resolv.conf etc/resolv.conf

    local efidev=$( blkid | grep -E -i "^$targetblkdev.*vfat.*$" | sed 's|^\(.*\): .*$|\1|' )
    local efid=$( blkid | grep "^$efidev" | sed 's|^.* UUID="\(.*\)" BLOCK.*$|\1|' )
    if [ -b "/dev/disk/by-uuid/$efid" ] ; then
        echo "EFI detected, converting to EFI boot..."
        mkdir boot/efi || { echo "Making boot/efi directory failed..." ; exit 4 ; }
        echo "UUID=$efid  /boot/efi  vfat  umask=0077  0  1" >> etc/fstab 
        echo "targetdev=\"$targetblkdev\"" >installvar 
        chroot . <<'EOF'
. installvar
mount /boot/efi
apt update
aptitude install grub-efi grub-pc-
grub-install "$targetblkdev"
efibootmgr
EOF
    else
        echo "Keeping legacy boot mode."
        echo "targetdev=\"$targetdev\"" >installvar
        chroot . <<'EOF'
. installvar
grub-install --force "$targetdev"
update-grub
EOF
    fi
    echo "All done"
}

main "$@"

Merci d’avance si vous pouvez me donner toutes sortes de conseils pour faire ce genre de choses :)

  • # debian preseed et autres

    Posté par  . Évalué à 5.

    pour faire des installations automatisées tu as le fichier preseed qui permet de preconfiguré des listes de choses à faire lors de l'installation et de repondre automatiquement au question de l'installeur

    si tu passes par la reinstallation de la machine physique à partir du "modele" virtuelle,
    et que tu peux arreter la machine virtuelle, tu peux regarder les outils commes clonezilla, qui permette de cloner en reseau (un clonezilla en mode serveur, un clonezilla en mode client)

    tu peux aussi regarder l'option cloud-init qui permet de prerenseigner des infos pour la nouvelle machine, et qui sera "agnostique" de la distrib (redhat, debian, etc)

    sinon tu peux regarder du coté de ansible et de son interface web (tower/awx) qui va te permettre de scripter des choses comme des "recettes" (les playbook) pour faire plein de choses à distance sur tes machines une fois l'OS et la clef SSH positionnée.

    • [^] # Re: debian preseed et autres

      Posté par  . Évalué à 3.

      une fois l'OS et la clef SSH positionnée

      Et ça peut s'automatiser via PXE (histoire de compléter) mais ce n'est pas forcément simple à faire à la main, et je ne connais pas d'outils pour le faire autrement.

  • # Au passage...

    Posté par  (Mastodon) . Évalué à 5. Dernière modification le 23 février 2023 à 07:39.

    if [ -d /mnt/vda1/home/user/.mozilla/firefox/*/storage ]
    then
        rm -r /mnt/vda1/home/user/.mozilla/firefox/*/storage
    fi

    Peut être remplacé par :

    rm -rf /mnt/vda1/home/user/.mozilla/firefox/*/storage

    En effet, avec -f il n'y a pas de retour en erreur si le répertoire n'existe pas. Tu peux le vérifier rapidement :

    rm -rf /tmp/cerepertoirenexistepas && echo "En effet, il n'y a pas d'erreur" || echo "Ah si, il y a bien une erreur"

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.