Come montare automaticamente i dischi rigidi SATA interni dopo interruzione / interruzione di corrente?

1

In un sistema Mac OS X 10.7.5 (Lion) con due unità SATA interne, le unità interne sono collegate tramite un controller Highpoint Rocketraid e sono configurate senza alcun RAID funzionando così in modalità legacy.

Entrambe le unità disco fisso SATA collegate localmente non vengono montate dopo l'accensione del Mac dopo un'interruzione / interruzione dell'alimentazione (spegnimento non pulito). Al successivo riavvio pulito vengono montati i due volumi locali.

Quando l'unità / volume non ha attività di lettura / scrittura, il volume non riesce a montare. Nel caso in cui non ci sia attività I / O sull'unità / volume, l'unità / volume verrà montata.

Entrambi i volumi locali sono identici:

$ diskutil info disk2s1
   Device Identifier:        disk2s1
   Device Node:              /dev/disk2s1
   Part of Whole:            disk2
   Device / Media Name:      Untitled 1

   Volume Name:              A
   Escaped with Unicode:     A

   Mounted:                  Yes
   Mount Point:              /Volumes/A
   Escaped with Unicode:     /Volumes/A

   File System Personality:  HFS+
   Type (Bundle):            hfs
   Name (User Visible):      Mac OS Extended
   Owners:                   Enabled

   Partition Type:           Apple_HFS
   OS Can Be Installed:      No
   Media Type:               Generic
   Protocol:                 SCSI
   SMART Status:             Not Supported
   Volume UUID:              45D248ED-29E3-3344-8B62-4E43499568CE

   Total Size:               3.0 TB (3000592979456 Bytes) (exactly 5860533163 512-Byte-Blocks)
   Volume Free Space:        3.0 TB (2997719433216 Bytes) (exactly 5854920768 512-Byte-Blocks)
   Device Block Size:        512 Bytes

   Read-Only Media:          No
   Read-Only Volume:         No
   Ejectable:                Yes

   Whole:                    No
   Internal:                 No

Registro parziale:

Jul 12 10:32:48 nl3 kernel[0]: jnl: disk3s2: replay_journal: from: 4367872 to: 5375488 (joffset 0x1c3000)
Jul 12 10:32:48 nl3 kernel[0]: jnl: disk3s2: journal replay done.
Jul 12 10:32:49 nl3 kernel[0]: hfs: Removed 0 orphaned / unlinked files and 329 directories 
Jul 12 15:26:15 nl3 kernel[0]: disk3s2: device/channel is not attached.
Jul 12 15:26:15 nl3 kernel[0]: /Volumes/Time Machine] [FSLogMsgID 381179371] [FSLogMsgOrder Last] 
Jul 12 15:26:15 nl3 kernel[0]: disk3s2: device/channel is not attached.
Jul 12 15:26:15: --- last message repeated 10 times ---
Jul 12 15:26:15 nl3 kernel[0]: jnl: disk3s2: do_jnl_io: strategy err 0x6
Jul 12 15:26:15 nl3 kernel[0]: jnl: disk3s2: write_journal_header: error writing the journal header!
Jul 12 15:26:15 nl3 kernel[0]: disk3s2: device/channel is not attached.
Jul 12 15:26:15: --- last message repeated 48 times ---
Jul 12 15:26:15 nl3 kernel[0]: 2309.inProgress/.Backup.363792189.590451.log] [FSLogMsgID 662186116] [FSLogMsgOrder Last] 
Jul 12 15:26:15 nl3 kernel[0]: disk3s2: device/channel is not attached.
Jul 12 15:26:16: --- last message repeated 76 times ---
Jul 12 15:26:16 nl3 kernel[0]: 0451.log] [FSLogMsgID 860380055] [FSLogMsgOrder Last] 
Jul 12 15:26:16 nl3 kernel[0]: disk3s2: device/channel is not attached.
Jul 12 15:26:20: --- last message repeated 56 times ---
Jul 12 15:26:20 nl3 kernel[0]: disk3s2: media is not present.
Jul 12 15:26:20: --- last message repeated 7 times ---
Jul 12 15:26:20 nl3 kernel[0]: jnl: disk3s2: close: journal 0x602ed30, is invalid.  aborting outstanding transactions
Jul 12 15:29:00 nl3 kernel[0]: jnl: disk3s2: replay_journal: from: 4588544 to: 4118528 (joffset 0x1d9000)
Jul 12 15:29:01 nl3 kernel[0]: jnl: disk3s2: journal replay done.
Jul 12 15:47:16 nl3 kernel[0]: jnl: disk3s2: do_jnl_io: strategy err 0xdisk3s2: device/channel is not attached.
Jul 12 15:47:16 nl3 kernel[0]: 6
Jul 12 15:47:16 nl3 kernel[0]: jnl: disk3s2: write_journal_header: error writing the journal header!
Jul 12 15:47:16 nl3 kernel[0]: disk3s2: device/channel is not attached.
Jul 12 15:47:24: --- last message repeated 15 times ---
Jul 12 15:47:24 nl3 kernel[0]: disk3s2: media is not present.
Jul 12 15:47:24: --- last message repeated 18 times ---
Jul 12 15:47:24 nl3 kernel[0]: jnl: disk3s2: close: journal 0x602ed30, is invalid.  aborting outstanding transactions

/dev/rdisk3s2: fsck_hfs run at Thu Jul 12 15:55:59 2012
/dev/rdisk3s2: ** /dev/rdisk3s2 (NO WRITE)
/dev/rdisk3s2:    Executing fsck_hfs (version diskdev_cmds-540.1~25).
QUICKCHECK ONLY; FILESYSTEM DIRTY

/dev/rdisk3s2: fsck_hfs run at Thu Jul 12 15:55:59 2012
/dev/rdisk3s2: ** /dev/rdisk3s2
/dev/rdisk3s2:    Executing fsck_hfs (version diskdev_cmds-540.1~25).

/dev/rdisk3s1: fsck_hfs run at Thu Jul 12 16:01:55 2012
/dev/rdisk3s1: ** /dev/rdisk3s1 (NO WRITE)
/dev/rdisk3s1:    Executing fsck_hfs (version diskdev_cmds-540.1~25).
QUICKCHECK ONLY; FILESYSTEM CLEAN

Entrambe le unità hanno uno schema di partizionamento GUID e un file system HFS + identici:

$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
...
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *3.0 TB     disk1
   1:                  Apple_HFS J                       3.0 TB     disk1s1
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *3.0 TB     disk2
   1:                  Apple_HFS A                       3.0 TB     disk2s1

Come montare automaticamente questi dischi rigidi automaticamente dopo uno spegnimento non pulito?

    
posta Pro Backup 23.07.2012 - 16:00
fonte

1 risposta

2

Script di avvio

La cosa migliore che riesco a trovare è uno script che verrà eseguito all'avvio e controllerà se ciascun TIPO di volume Apple_HFS (disk * s *) è montato. Quando il volume non è montato, prova a riparare e montare il volume.

Comandi script spiegati

Elenca volumi HFS locali

Il comando diskutil list viene utilizzato per recuperare tutti i volumi locali che contengono un file system HFS Apple. Ad esempio:

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

Il volume è montato?

Il comando df -lnh viene usato per verificare se quel volume è montato. Quando il volume non viene montato, il comando non restituisce output (vuoto). E quando il volume è montato, l'output è come:

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

Installazione passo passo

Crea script bash (versione # 2)

$ sudo nano /Library/Scripts/BootRepairMount.sh

Incolla questo testo nell'editor e salvalo.

#!/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 is not mounted, repair and mount"
        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

Imposta le autorizzazioni dello script solo per l'accesso root

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

Rendi lo script leggibile ed eseguibile per tutti gli utenti

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

Rendi lo script amministrativo scrivibile ed eseguibile

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

Prova a eseguire lo script

$ /Library/Scripts/BootRepairMount.sh

Crea un file .plist per launchd da eseguire all'avvio

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

E incolla questo testo nella finestra dell'editor.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>nl.probackup.bootrepairmount</string>
<key>ProgramArguments</key>
<array>
<string>/Library/Scripts/BootRepairMount.sh</string>
</array>
<key>UserName</key>
<string>root</string>
<key>UserGroup</key>
<string>wheel</string>
<key>RunAtLoad</key>
<true></true>
<key>Debug</key>
<true></true>
</dict>
</plist>

Modifica autorizzazioni di avvio plist

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

Carica il plist in launchd

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

Confermare che il plist sia caricato

$ sudo launchctl list | grep .bootrepairmount

Se viene visualizzato il nome plist, ad esempio:

851 -   nl.probackup.bootrepairmount

è installato.

Interrompi l'esecuzione dello script all'avvio

Per rimuovere il file .plist, in altre parole interrompere l'esecuzione dello script all'avvio, digita quanto segue:

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

Tutto in un'unica riga: copia e incolla - installazione

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\ is\ not\ mounted,\ repair\ and\ mount\"; 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 \<plist\ version=\"1.0\"\>; echo \<dict\>; echo \<key\>Label\</key\>; echo \<string\>nl.probackup.bootrepairmount\</string\>; echo \<key\>ProgramArguments\</key\>; echo \<array\>; echo \<string\>/Library/Scripts/BootRepairMount.sh\</string\>; echo \</array\>; echo \<key\>UserName\</key\>; echo \<string\>root\</string\>; echo \<key\>UserGroup\</key\>; echo \<string\>wheel\</string\>; echo \<key\>RunAtLoad\</key\>; echo \<true\>\</true\>; echo \<key\>Debug\</key\>; echo \<true\>\</true\>; echo \</dict\>; echo \</plist\>; } > ~/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
    
risposta data 30.05.2013 - 21:54
fonte

Leggi altre domande sui tag