1 votes

Comment monter automatiquement les disques durs SATA internes après une panne de courant/interruption?

Dans un système Mac OS X 10.7.5 (Lion) avec deux disques durs SATA internes, les disques internes sont connectés via un contrôleur Highpoint Rocketraid et sont configurés sans aucun RAID, fonctionnant donc en mode legacy.

Les deux disques durs SATA localement attachés ne sont pas montés après que le Mac soit rallumé suite à une panne/interruption de courant (arrêt non propre). Lors du prochain redémarrage propre, les deux volumes locaux sont montés.

Quand le disque/volume n'a pas d'activité de lecture/écriture, alors le volume échoue à monter. Si aucune activité I/O n'est effectuée sur le disque/volume, alors le disque/volume sera monté.

Les deux volumes locaux sont identiques:

$ diskutil info disk2s1
   Identifiant du périphérique : disk2s1
   Noeud du périphérique : /dev/disk2s1
   Partie du périphérique entier : disk2
   Nom du périphérique/média : Untitled 1

   Nom du volume : A
   Échappé avec Unicode : A

   Monté : Oui
   Point de montage : /Volumes/A
   Échappé avec Unicode : /Volumes/A

   Personnalité du système de fichiers : HFS+
   Type (Bundle) : hfs
   Nom (Visible par l'utilisateur) : Mac OS Extended
   Propriétaires : Activé

   Type de partition : Apple_HFS
   Installation d'OS possible : Non
   Type de média : Générique
   Protocole : SCSI
   État SMART : Non pris en charge
   UUID du volume : 45D248ED-29E3-3344-8B62-4E43499568CE

   Taille totale : 3.0 To (3000592979456 octets) (exactement 5860533163 blocs de 512 octets)
   Espace libre sur le volume : 3.0 To (2997719433216 octets) (exactement 5854920768 blocs de 512 octets)
   Taille de bloc du périphérique : 512 octets

   Support en lecture seule : Non
   Volume en lecture seule : Non
   Éjectable : Oui

   Entier : Non
   Interne : Non

Journal partiel :

12 juil. 10:32:48 nl3 kernel[0]: jnl: disk3s2: replay_journal: de : 4367872 à : 5375488 (décalage 0x1c3000)
12 juil. 10:32:48 nl3 kernel[0]: jnl: disk3s2: journal replay done.
12 juil. 10:32:49 nl3 kernel[0]: hfs: Suppression de 0 fichiers orphelins/non liés et 329 répertoires
12 juil. 15:26:15 nl3 kernel[0]: disk3s2: périphérique/canal non attaché.
12 juil. 15:26:15 nl3 kernel[0]: /Volumes/Time Machine] [FSLogMsgID 381179371] [FSLogMsgOrder Last]
12 juil. 15:26:15 nl3 kernel[0]: disk3s2: périphérique/canal non attaché.
12 juil. 15:26:15: --- dernier message répété 10 fois ---
12 juil. 15:26:15 nl3 kernel[0]: jnl: disk3s2: do_jnl_io: erreur de stratégie 0x6
12 juil. 15:26:15 nl3 kernel[0]: jnl: disk3s2: write_journal_header: erreur d'écriture de l'en-tête du journal !
12 juil. 15:26:15 nl3 kernel[0]: disk3s2: périphérique/canal non attaché.
12 juil. 15:26:15: --- dernier message répété 48 fois ---
12 juil. 15:26:15 nl3 kernel[0]: 2309.inProgress/.Backup.363792189.590451.log] [FSLogMsgID 662186116] [FSLogMsgOrder Last]
12 juil. 15:26:15 nl3 kernel[0]: disk3s2: périphérique/canal non attaché.
12 juil. 15:26:16: --- dernier message répété 76 fois ---
12 juil. 15:26:16 nl3 kernel[0]: 0451.log] [FSLogMsgID 860380055] [FSLogMsgOrder Last]
12 juil. 15:26:16 nl3 kernel[0]: disk3s2: périphérique/canal non attaché.
12 juil. 15:26:20: --- dernier message répété 56 fois ---
12 juil. 15:26:20 nl3 kernel[0]: disk3s2: le support n'est pas présent.
12 juil. 15:26:20: --- dernier message répété 7 fois ---
12 juil. 15:26:20 nl3 kernel[0]: jnl: disk3s2: fermeture : journal 0x602ed30, est invalide. annulation des transactions en attente
12 juil. 15:29:00 nl3 kernel[0]: jnl: disk3s2: replay_journal: de : 4588544 à : 4118528 (décalage 0x1d9000)
12 juil. 15:29:01 nl3 kernel[0]: jnl: disk3s2: journal replay done.
12 juil. 15:47:16 nl3 kernel[0]: jnl: disk3s2: do_jnl_io: erreur de stratégie 0xdisk3s2: périphérique/canal non attaché.
12 juil. 15:47:16 nl3 kernel[0]: 6
12 juil. 15:47:16 nl3 kernel[0]: jnl: disk3s2: write_journal_header: erreur d'écriture de l'en-tête du journal !
12 juil. 15:47:16 nl3 kernel[0]: disk3s2: périphérique/canal non attaché.
12 juil. 15:47:24: --- dernier message répété 15 fois ---
12 juil. 15:47:24 nl3 kernel[0]: disk3s2: le support n'est pas présent.
12 juil. 15:47:24: --- dernier message répété 18 fois ---
12 juil. 15:47:24 nl3 kernel[0]: jnl: disk3s2: fermeture : journal 0x602ed30, est invalide.  annulation des transactions en attente

/dev/rdisk3s2: exécution de fsck_hfs le jeu. 12 juil. 15:55:59 2012
/dev/rdisk3s2: ** /dev/rdisk3s2 (SANS ÉCRITURE)
/dev/rdisk3s2:    Exécution de fsck_hfs (version diskdev_cmds-540.1~25).
VERIFICATION RAPIDE UNIQUEMENT; SYSTÈME DE FICHIERS SALE

/dev/rdisk3s2: exécution de fsck_hfs le jeu. 12 juil. 15:55:59 2012
/dev/rdisk3s2: ** /dev/rdisk3s2
/dev/rdisk3s2:    Exécution de fsck_hfs (version diskdev_cmds-540.1~25).

/dev/rdisk3s1: exécution de fsck_hfs le jeu. 12 juil. 16:01:55 2012
/dev/rdisk3s1: ** /dev/rdisk3s1 (SANS ÉCRITURE)
/dev/rdisk3s1:    Exécution de fsck_hfs (version diskdev_cmds-540.1~25).
VERIFICATION RAPIDE UNIQUEMENT; SYSTÈME DE FICHIERS PROPRE

Et les deux disques ont le même schéma de partitionnement GUID et système de fichiers HFS+ :

$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
...
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      Schéma de partition GUID                        *3.0 To     disk1
   1:                  Apple_HFS J                       3.0 To     disk1s1
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      Schéma de partition GUID                        *3.0 To     disk2
   1:                  Apple_HFS A                       3.0 To     disk2s1

Comment monter automatiquement ces disques durs après un arrêt non propre ?

2voto

Pro Backup Points 3456

Script de démarrage

La meilleure solution que je puisse trouver est un script qui s'exécutera au démarrage et vérifiera si chaque volume de type Apple_HFS (disque*s*) est monté. Lorsque le volume n'est pas monté, essayez de réparer et monter le volume.

Explication des commandes du script

Liste des volumes HFS locaux

La commande diskutil list est utilisée pour récupérer tous les volumes locaux contenant un système de fichiers Apple HFS. Par exemple:

$ diskutil list | grep ":                  Apple_HFS" | awk '{ print $NF }'
disk0s2
disk1s1
disk2s1

Est-ce que le volume est monté ?

La commande df -lnh est utilisée pour vérifier si ce volume est monté. Lorsque le volume n'est pas monté, la commande ne renvoie pas de sortie. Et lorsque le volume est monté, la sortie est comme suit:

$ df -lnh | grep /dev/disk1s1
/dev/disk1s1   3.6Ti   13Mi  3.6Ti     1%    /Volumes/L

Installation étape par étape

Créer un script bash (version n°2)

$ sudo nano /Library/Scripts/BootRepairMount.sh

Collez ce texte dans l'éditeur et enregistrez-le.

#!/bin/bash
TRIES=0
MAXTRIES=60
until diskutil list > /dev/null;do
    TRIES=$(($TRIES+1))
    if [ $TRIES -gt $MAXTRIES ]; then
        exit $?
    fi
    sleep 1
done
TRIES=0
MAXTRIES=3
for OUTPUT in $(diskutil list | grep ':                  Apple_HFS' | awk '{ print $NF }')
do
    if [[ -z $(df -lnh | grep /dev/$OUTPUT) ]]; then
        echo "$OUTPUT n'est pas monté, réparez et montez"
        until diskutil repairVolume $OUTPUT; do
            TRIES=$(($TRIES+1))
            if [ $TRIES -gt $MAXTRIES ]; then
                break
            else
                sleep 1
            fi
        done
        TRIES=0
        until diskutil mount $OUTPUT; do
            TRIES=$(($TRIES+1))
            if [ $TRIES -gt $MAXTRIES ]; then
                break
            else
                sleep 1
            fi
        done
        TRIES=0
    fi
done

Définir les permissions du script pour un accès root uniquement

$ sudo chown -R root:admin /Library/Scripts/BootRepairMount.sh

Rendre le script lisible et exécutable pour tous les utilisateurs

$ sudo chmod a=rx /Library/Scripts/BootRepairMount.sh

Rendre le script modifiable et exécutable par l'administrateur

$ sudo chmod u=rwx /Library/Scripts/BootRepairMount.sh

Tester l'exécution du script

$ /Library/Scripts/BootRepairMount.sh

Créer un fichier .plist pour que launchd s'exécute au démarrage

$ sudo nano /Library/LaunchDaemons/nl.probackup.bootrepairmount.plist

Et collez ce texte dans la fenêtre de l'éditeur.

Label
nl.probackup.bootrepairmount
ProgramArguments

/Library/Scripts/BootRepairMount.sh

UserName
root
UserGroup
wheel
RunAtLoad

Debug

Changer les permissions plist de launchd

$ sudo chown -R root:wheel /Library/LaunchDaemons/nl.probackup.bootrepairmount.plist

Charger le plist dans launchd

$ sudo launchctl load /Library/LaunchDaemons/nl.probackup.bootrepairmount.plist

Confirmer que le plist est chargé

$ sudo launchctl list | grep .bootrepairmount

Si le nom du plist apparaît, comme:

851 -   nl.probackup.bootrepairmount

c'est installé.

Arrêter l'exécution du script au démarrage

Pour supprimer le .plist, en d'autres termes arrêter le script d'être exécuté au démarrage, tapez ce qui suit:

$ sudo launchctl unload -w /Library/LaunchDaemons/nl.probackup.bootrepairmount.plist

Tout en une seule ligne - copier-coller - installation

file=/Library/Scripts/BootRepairMount.sh;{ echo \#\!/bin/bash; echo TRIES=0; echo MAXTRIES=60; echo until\ diskutil\ list\ \>\ /dev/null\;do; echo $'\t'TRIES=\$\(\(\$TRIES+1\)\); echo $'\t'if\ \[\ \$TRIES\ -gt\ \$MAXTRIES\ \]\;\ then; echo $'\t'$'\t'exit\ \$\?; echo $'\t'fi; echo $'\t'sleep\ 1; echo done; echo TRIES=0; echo MAXTRIES=3; echo for\ OUTPUT\ in\ \$\(diskutil\ list\ \|\ grep\ \':\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Apple_HFS\'\ \|\ awk\ \'\{\ print\ \$NF\ \}\'\); echo do; echo $'\t'if\ \[\[\ -z\ \$\(df\ -lnh\ \|\ grep\ /dev/\$OUTPUT\)\ \]\]\;\ then; echo $'\t'$'\t'echo\ \"\$OUTPUT\ n\'est\ pas\ monté,\ réparez\ et\ montez\"; echo $'\t'$'\t'until\ diskutil\ repairVolume\ \$OUTPUT\;\ do; echo $'\t'$'\t'$'\t'TRIES=\$\(\(\$TRIES+1\)\); echo $'\t'$'\t'$'\t'if\ \[\ \$TRIES\ -gt\ \$MAXTRIES\ \]\;\ then; echo $'\t'$'\t'$'\t'$'\t'break; echo $'\t'$'\t'$'\t'else; echo $'\t'$'\t'$'\t'$'\t'sleep\ 1; echo $'\t'$'\t'$'\t'fi; echo $'\t'$'\t'done; echo $'\t'$'\t'TRIES=0; echo $'\t'$'\t'until\ diskutil\ mount\ \$OUTPUT\;\ do; echo $'\t'$'\t'$'\t'TRIES=\$\(\(\$TRIES+1\)\); echo $'\t'$'\t'$'\t'if\ \[\ \$TRIES\ -gt\ \$MAXTRIES\ \]\;\ then; echo $'\t'$'\t'$'\t'$'\t'break; echo $'\t'$'\t'$'\t'else; echo $'\t'$'\t'$'\t'$'\t'sleep\ 1; echo $'\t'$'\t'$'\t'fi; echo $'\t'$'\t'done; echo $'\t'$'\t'TRIES=0; echo $'\t'fi; echo done; } > ~/out_file;cat ~/out_file | sudo tee $file;rm ~/out_file;sudo chown -R root:admin $file;ls -l $file;sudo chmod a=rx $file;sudo chmod u=rwx /$file;file=/Library/LaunchDaemons/nl.probackup.bootrepairmount.plist;sudo launchctl unload -w $file &>/dev/null;{ echo \<\?xml\ version=\"1.0\"\ encoding=\"UTF-8\"\?\>; echo \<\!DOCTYPE\ plist\ PUBLIC\ \"-//Apple//DTD\ PLIST\ 1.0//EN\"\ \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"\>; echo \; echo \; echo \Label\; echo \nl.probackup.bootrepairmount\; echo \ProgramArguments\; echo \; echo \/Library/Scripts/BootRepairMount.sh\; echo \; echo \UserName\; echo \root\; echo \UserGroup\; echo \wheel\; echo \RunAtLoad\; echo \\; echo \Debug\; echo \\; echo \; echo \; } > ~/out_file;cat ~/out_file | sudo tee /$file;rm ~/out_file;sudo chown -R root:wheel $file;sudo launchctl load -w -F $file;sudo launchctl list | grep .bootrepairmount

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X