URL: https://linuxfr.org/forums/linux-debian-ubuntu/posts/debian-replication-kvm-tar-machine-physique Title: Debian réplication, kvm → tar / → machine physique ? Authors: Space_e_man Date: 2023年02月21日T11:32:51+01:00 License: CC By-SA Tags: uuid, réplication et bash Score: 0 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 ```bash #!/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 ```bash #!/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 :)