1 votos

¿Cómo montar automáticamente los discos duros SATA internos después de un fallo/interrupción de la alimentación?

En un sistema Mac OS X 10.7.5 (Lion) con dos unidades internas SATA, las unidades internas están conectadas a través de un controlador Highpoint Rocketraid y están configuradas sin ningún tipo de RAID, por lo que funcionan en modo heredado.

Las dos unidades de disco duro SATA conectadas localmente no se montan después de encender el Mac tras un fallo/interrupción de la alimentación (apagado no limpio). En el siguiente reinicio limpio los dos volúmenes locales se montan.

Cuando la unidad/volumen no tiene actividad de lectura/escritura, el volumen no se monta. Si no hay actividad de E/S en la unidad/volumen, la unidad/volumen se montará.

Ambos volúmenes locales son idénticos:

$ 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 parcial:

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

Y ambas unidades tienen un esquema de partición GUID y un sistema de archivos HFS+ idénticos:

$ 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

¿Cómo montar automáticamente estos discos duros después de un apagado sucio?

2voto

Pro Backup Puntos 2314

Arranque script

Lo mejor que se me ocurre, es un script que se ejecutará en el arranque, y comprobará si cada volumen Apple_HFS TYPE (disk*s*) está montado. Cuando el volumen no está montado, intenta reparar y montar el volumen.

Explicación de los comandos script

Lista de volúmenes HFS locales

El diskutil list se utiliza para recuperar todos los volúmenes locales que contienen un sistema de archivos HFS de Apple. Por ejemplo:

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

¿Está montado el volumen?

El df -lnh se utiliza para comprobar si ese volumen está montado. Cuando el volumen no está montado, el comando no devuelve ninguna salida (vacía). Y cuando el volumen está montado, la salida es como:

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

Instalación paso a paso

Crear bash script (versión #2)

$ sudo nano /Library/Scripts/BootRepairMount.sh

Pegue este texto en el editor y guárdelo.

#!/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

Establecer los permisos del script para el acceso Root solamente

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

Hacer el script legible y ejecutable para todos los usuarios

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

Hacer que el script admin sea escribible y ejecutable

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

Prueba de ejecución del script

$ /Library/Scripts/BootRepairMount.sh

Crear un archivo .plist para que launchd se ejecute en el arranque

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

Y pega este texto en la ventana del 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>

Cambiar los permisos de launchd plist

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

Cargar el plist en launchd

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

Confirme que el plist está cargado

$ sudo launchctl list | grep .bootrepairmount

Si el nombre del plist aparece, como:

851 -   nl.probackup.bootrepairmount

está instalado.

Dejar de ejecutar script en el arranque

Para eliminar el .plist, es decir, impedir que el script se ejecute en el arranque, escriba lo siguiente:

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

Todo en una línea - copiar y pegar - instalación

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X