Recopie du boot sur une carte micro SD !

Proposer ou rechercher un tutoriel concernant le Raspberry Pi

Modérateur : Francois

Répondre
Artemus24
Raspinaute
Messages : 1077
Enregistré le : ven. 15 sept. 2017 19:15

Recopie du boot sur une carte micro SD !

Message par Artemus24 » sam. 26 sept. 2020 16:49

Salut à tous.

Faire un recopie, rien de plus facile.
Mais le but de ce script bash repose sur l'identification de la carte micro SD et le montage de sa partition boot.
Je teste aussi les dates afin de ne pas faire une recopie si cela n'est pas nécessaire.

Code : Tout sélectionner

#!/bin/bash

UUID="2D91-464A"

FILE1="/mnt/boot/bootcode.bin"
FILE2="/boot/bootcode.bin"

clear
echo -e "\t\t*================================*"
echo -e "\t\t*                                *"
echo -e "\t\t*     Recopie partition \"/boot\"  *"
echo -e "\t\t*                                *"
echo -e "\t\t*================================*\n"
echo -e "\t\tUUID\t\t: $UUID\n"

# ======================================== #
# Vérification l'existence de la partition #
# ======================================== #

if [ -L "/dev/disk/by-uuid/$UUID" ]
then
	DEVICE="$(blkid -U $UUID)"
	DIRECTORY="$(lsblk -n -o MOUNTPOINT $DEVICE)"

	echo -e "\t\tRépertoire\t: $DIRECTORY"
	echo -e "\t\tPériphérique\t: $DEVICE\n"

	if [ "$DIRECTORY" == "/mnt/boot" ]
	then
		echo -e "\t\t\e[31mPartition déjà montée\e[0m\n"
	else
		if [ "$DIRECTORY" != "" ]
		then
			echo -e "\t\t\e[32mPartition a démonter !\e[0m"

			umount $DEVICE

			if [[ $? == 0 ]]
			then
				echo -e "\t\t\e[32mPartition démontée\e[0m"
			else
				echo -e "\t\t\e[31mPartition non démontée\e[0m\n"
				exit 3
			fi
		fi

		mount -t vfat $DEVICE /mnt/boot

		if [[ $? == 0 ]]
		then 
			echo -e "\t\t\e[32mPartition a été montée\e[0m\n"
		else
			echo -e "\t\t\e[31mPartition non montée\e[0m\n"
			exit 2
		fi

# ====================== #
# Vérification des dates #
# ====================== #

		DATE1=`date -r $FILE1 '+%Y-%m-%d %H:%M:%S'`
		DATE2=`date -r $FILE2 '+%Y-%m-%d %H:%M:%S'`

		echo -e "\t\tdate répertoire /mnt/boot : $DATE1"
		echo -e "\t\tdate répertoire     /boot : $DATE2\n"

		if [[ "$DATE1" > "$DATE2" ]]
		then
			echo -e "\t\t\e[31mRecopie déjà effectuée !\e[0m\n"
		else

# ============================================================================= #
# Recopie de la partition "/boot" du disque dur vers celle de la carte micro SD #
# ============================================================================= #

			cd /mnt/boot
			rm -Rf *

			cd /boot
			cp -Rf * /mnt/boot

			echo -e "\t\t\e[32mCopie effectuée !\e[0m\n"
		fi
	fi

# ========================= #
# Démontage de la partition #
# ========================= #

	echo -e "\t\t\e[32mPartition démontée\e[0m\n"

	umount $DEVICE
else
	echo -e "\t\t\e[32mLa carte Micro SD \"$UUID\" (carte N°3) n'est pas installée !\e[0m\n"
	exit 1
fi

exit 0
@+
RPI4B/8GB + Argon FanHAt
Rpi3A+, Rpi3B+
RPi 2B + Joy-It I2C Serial 20x4 2004 LCD Module
RPi 2B + PIM273 Unicorn HAT HD 16x16 Leds RGB
RPi0v1.3, RPi0W + LibreElec/Kodi, Rpi0WH + Tuner TV HAT
NodeMCU ESP32

maxty01
Modérateur
Messages : 790
Enregistré le : dim. 16 nov. 2014 20:53
Localisation : Charleroi - Belgique

Re: Recopie du boot sur une carte micro SD !

Message par maxty01 » dim. 27 sept. 2020 14:59

Bonjour,

Attention que l'UUID n'est pas forcément le même pour toutes les installations/distributions.
C'est un ID généré automatiquement par le système.

Exemple : Ma partition /boot a l'UUID «4F72-0755», ça qui fait que ton script n'est pas valable dans mon cas.
Je suis d'accord qu'il me suffit de le changer, mais quid des personnes n'ayant pas les connaissances pour le faire en toute sécurité.

Personnellement, je te conseil de te baser sur le fichier /etc/fstab pour obtenir l'UUID.

Code : Tout sélectionner

root@rpi3:~# grep -i "/boot" /etc/fstab | awk '{print $1}'
/dev/mmcblk0p1
root@rpi3:~# _
Avec cette commande, tu as 3 principales possibilités :
Soit tu n'as pas le ligne «/boot» dans le fichier, cela ne sert à rien de continuer ton script.
Soit tu as la ligne «/boot» dans le fichier fstab et là tu as deux possibilités :
Soit tu as de directement le UUID dans le premier champs au format «UUID=4F72-0755», ce qu'on retrouve de plus en plus dans le fichier fstab.
Soit tu as la partition au format traditionnel : «/dev/mmcblk0p1» dans mon cas.

Dans ce dernier cas, il suffit de récupérer l'UUID du point de montage avec la commande suivante :

Code : Tout sélectionner

root@rpi3:~# blkid -o export /dev/mmcblk0p1 | grep UUID
UUID=4F72-0755
root@rpi3:~# _
Avec cette information, tu peux continuer ton script.

Bon weekend,

Disclamer : Je n'ai pas testé le script, je ne peux donc le valider, mes remarques ne font suite qu'à une première lecture et une interprétation personnelle du script proposé.

Informations complémentaires : Le format du fichier fstab est peuplé de plus en plus de ligne au format UUID.
Cela est du à l’avènement du SATA, et du fait que le disque SATA est susceptible de changer de lettre au prochain reboot (/dev/sda aujourd'hui -> /dev/sdb demain), notamment à la suite de rajout de disques supplémentaires.
Cela pose effectivement des problèmes au système qui s'attend à un disque positionné par exemple sur l'emplacement /dev/sda, il ne peut donc monter la partition depuis l'emplacement /dev/sda1.
Le format UUID permet de palier à ce problème du fait que l'UUID de la partition sera toujours identique et ce peu importe son emplacement (sda1, sdb3 ou sdXn).
Cela permet également de migrer une partition (en LVM par exemple) d'un vieux disque vers un autre plus jeune et plus grand, ou d'une autre technologie, sans que cela puisse poser problème au système.
Il n'y a pas de question stupide, il n'y a que des imbéciles qui ne posent pas de question !
RaspBerry Pi : 1 x B+ Raspbian 1 x RPI2 MiniBian
Mieux me connaître ? Regarder mon LinkedIn

Artemus24
Raspinaute
Messages : 1077
Enregistré le : ven. 15 sept. 2017 19:15

Re: Recopie du boot sur une carte micro SD !

Message par Artemus24 » dim. 27 sept. 2020 22:32

Salut maxty01.

J'ai pas trop réfléchi quand j'ai créé ce sujet.

Le UUID que j'ai mis est celui de ma carte micro SD, à moi.
Il va de soi que vous devez prendre celui de votre carte micro SD, à vous.
maxty01 a écrit :Exemple : Ma partition /boot a l'UUID «4F72-0755», ça qui fait que ton script n'est pas valable dans mon cas.
Si je n'ai pas précisé cela, c'est que ça me semblait évident. Désolé.

Dans ce cas, la ligne de mon script :

Code : Tout sélectionner

UUID="2D91-464A"
devient :

Code : Tout sélectionner

UUID="4F72-0755"
maxty01 a écrit :Personnellement, je te conseil de te baser sur le fichier /etc/fstab pour obtenir l'UUID.
Non, car le fichier fstab que j'aie en ligne est celui de mon disque dur, et non celui de la carte micro SD qui ne contient que la partition boot.
Il n'y a aucun lien logique entre le fstab et ma carte micro SD.

J'ai tenu compte dans mon script que la partition peut-être monté avec un identifiant quelconque : /dev/sda1, /dev/sdb1, dev/sdc1.
Lors du montage, c'est le système qui va attribuer l'identifiant du périphérique, que je vais devoir lire.
De ce fait, je dois lire cette information par les commandes que j'utilise dans mon script, et la partition en question sera montée.

Pour tester le script, il faut un disque dur qui possède ses propres partitions "boot" et son "rootfs".
Puis une carte micro SD qui ne contient qu'un seule partition, la boot.

Identifier la carte micro SD, ne peut se faire que si elle est monté. Donc un "blkid" suffit amplement.
Connaissant ce UUID, il suffit de modifier mon script.

Comment utiliser mon script ? Trois cas peuvent se présenter.

1) pas de carte micro SD placé dans un quelconque lecteur.
Le script le signal et ne fait rien.

2-a) la bonne carte micro SD est placé dans le lecteur.
Le script identifie la carte micro DS et monte la partition boot.
Il effectue la comparaison des dates sur le fichier "bootcode.bin".
Celui de la partition boot du disque dur est plus ancien que celui de la partition boot de la carte micro sd, le script ne fait rien.

2-b) Celui de la partition boot du disque dur est plus récent que celui de la partition boot de la carte micro sd, le script effectue la recopie.

Si j'ai communiqué cet exemple, c'est pour montrer comment on peut identifier une partition, la monter, faire des opérations dessus, uniquement à partir de son UUID.
Pour tester le script, sans danger, il suffit de remplacer la recopie par un simple "ls- al".

@+
RPI4B/8GB + Argon FanHAt
Rpi3A+, Rpi3B+
RPi 2B + Joy-It I2C Serial 20x4 2004 LCD Module
RPi 2B + PIM273 Unicorn HAT HD 16x16 Leds RGB
RPi0v1.3, RPi0W + LibreElec/Kodi, Rpi0WH + Tuner TV HAT
NodeMCU ESP32

Répondre

Retourner vers « Tutoriels »