J'ai besoin de remplacer un mauvais disque dans un zpool sur FreeNAS.
zpool status
montre
gptid/5fe33556-3ff2-11e2-9437-f46d049aaeca UNAVAIL 0 0 0 cannot open
Comment trouver le numéro de série de ce disque?
Plus:
glabel status
donne:
Name Status Components
ufs/FreeNASs3 N/A da0s3
ufs/FreeNASs4 N/A da0s4
ufsid/4fa405ab96518680 N/A da0s1a
ufs/FreeNASs1a N/A da0s1a
ufs/FreeNASs2a N/A da0s2a
gptid/5f3c0517-3ff2-11e2-9437-f46d049aaeca N/A ada1p2
gptid/60570005-3ff2-11e2-9437-f46d049aaeca N/A ada3p2
gptid/60ebeaa5-3ff2-11e2-9437-f46d049aaeca N/A ada4p2
gptid/a767b8ef-1c95-11e2-af4c-f46d049aaeca N/A ada6p2
gptid/61925b86-3ff2-11e2-9437-f46d049aaeca N/A ada9p2
gptid/4599731b-8f15-11e1-a14c-f46d049aaeca N/A ada10p2
Je ne vois pas gptid/5fe33556
là-dedans.
Et camcontrol devlist
donne:
<Hitachi HDS723030BLE640 MX6OAAB0> at scbus0 target 0 lun 0 (pass0,ada0)
<ST3000VX000-9YW166 CV13> at scbus4 target 0 lun 0 (pass1,ada1)
<ST3000VX000-9YW166 CV13> at scbus6 target 0 lun 0 (pass3,ada3)
<Hitachi HDS723030BLE640 MX6OAAB0> at scbus7 target 0 lun 0 (pass4,ada4)
<ST3000DM001-9YN166 CC4C> at scbus8 target 0 lun 0 (pass5,ada5)
<WDC WD30EZRX-00MMMB0 80.00A80> at scbus8 target 1 lun 0 (pass6,ada6)
<WDC WD30EZRX-00MMMB0 80.00A80> at scbus9 target 0 lun 0 (pass7,ada7)
<ST3000DM001-9YN166 CC4C> at scbus9 target 1 lun 0 (pass8,ada8)
<Hitachi HDS723030BLE640 MX6OAAB0> at scbus10 target 0 lun 0 (pass9,ada9)
<Hitachi HDS5C3030ALA630 MEAOA580> at scbus11 target 0 lun 0 (pass10,ada10)
< USB Flash Memory 1.00> at scbus12 target 0 lun 0 (pass11,da0)
Est-ce à dire que ada2
est le mauvais disque?
MISE À JOUR:
OK, je suis presque sûr que ada2
est le mauvais disque. Et j'ai mes notes, donc je sais de quel disque il s'agit.
Mais il semble que j'en ai laissé un de rechange - ada - la dernière fois que j'étais dans la boîte. Puis-je remplacer ada2 par ada à distance? Jusqu'à ce que quelqu'un arrive au bureau?
Pour obtenir une série de disques, il doit être en cours d'exécution et disponible:
camcontrol identify <device> |grep ^serial
(cela peut être spécifique à (S) ATA)smartcl -i <device> |grep ^Serial
Dans votre cas, je pense que la 3ème solution est la seule disponible. Donc, en supposant que vous vouliez d'abord identifier le disque:
Essayez d'abord un glabel status
(car votre lecteur n'apparaît pas comme DOWN
ou REMOVED
):
$ glabel status
gptid/c7868819-ddc1-11e2-8c3e-00138f3fd9c7 N/A da0p1
gptid/c96da0bc-ddc1-11e2-8c3e-00138f3fd9c7 N/A da2p1
Vous pouvez voir votre partition avec glabel status
Ensuite, vous pouvez facilement identifier le nom du périphérique de disque (ex: da0 pour le gptid/c7868819-ddc1-11e2-8c3e-00138f3fd9c7
cloison).
Vous pouvez consulter le journal de démarrage de votre système à partir de /var/log/messages
(alias "dmesg
"):
$ dmesg | grep ^da0
da0 at mps0 bus 0 scbus0 target 0 lun 0
da0: <ATA ST3000DM001-1CH1 CC26> Fixed Direct Access SCSI-6 device
da0: 600.000MB/s transfers
da0: Command Queueing enabled
da0: 2861588MB (5860533168 512 byte sectors: 255H 63S/T 364801C)
Vous ne pouvez pas voir votre partition avec glabel status
$ camcontrol devlist
<ATA ST3000DM001-1CH1 CC26> at scbus0 target 0 lun 0 (pass0,da0)
<ATA ST3000DM001-1CH1 CC26> at scbus0 target 4 lun 0 (pass2,da2)
De là, vous pouvez facilement repérer celui qui manque ( da1 dans ce cas), puis jetez un œil à dmesg
pour l'identifier disque.
Donc, pas de vraie solution ici. J'espère juste que cela vous aidera à voir les choses un peu plus clairement.
Pour en savoir plus :
#!/bin/sh
echo
echo $(basename $0) - Mounted Drives on $(hostname)
cat /etc/version
date
echo
diskinfo="$(glabel status | tail -n +2 | awk '{split($3,a,"p"); print a[1],$1}')"
echo "+========+==========================+==================+============================================+"
echo "| Device | DISK DESCRIPTION | SERIAL NUMBER | GPTID |"
echo "+========+==========================+==================+============================================+"
for d in $(echo "$diskinfo" | cut -d" " -f 1)
do
diskinf=$(diskinfo -v $d | grep '# Disk ')
diskdescription=$(echo "$diskinf" | grep '# Disk desc' | cut -d# -f 1 | xargs)
diskserialno=$(echo "$diskinf" | grep '# Disk ident' | cut -d# -f 1 | xargs)
diskgptid=$(echo "$diskinfo" | grep "^$d" | cut -d" " -f 2)
printf "| %-6s | %-24s | %-16s | %-42s |\n" "$d" "$diskdescription" "$diskserialno" "$diskgptid"
echo "+--------+--------------------------+------------------+--------------------------------------------+"
done
J'ai fait un script qui répertorie tous les GPTID et le numéro de série du disque dur associé et le nom du périphérique.
#!/bin/bash
#Use smartctl to get Serial Number - else dmesg is used
USESMART=0
#save glabel status to temporary file
CACHEGLABEL=1
if [ $CACHEGLABEL -eq 0 ]
then
GLCMD="glabel status"
else
GLTMP=/var/tmp/$0.glabel
glabel status > $GLTMP
GLCMD="cat $GLTMP"
fi
ADALOW=`ls /dev/ada[0-9] 2>/dev/null`
ADAHIGH=`ls /dev/ada[0-9][0-9] 2>/dev/null`
DALOW=`ls /dev/da[0-9] 2>/dev/null`
DAHIGH=`ls /dev/da[0-9][0-9] 2>/dev/null`
#check if all device nodes exist or skip
if [[ $ADALOW == *ls* ]]
then
$DALOW=
fi
if [[ $ADAHIGH == *ls* ]]
then
$ADAHIGH=
fi
if [[ $DALOW == *ls* ]]
then
$DALOW=
fi
if [[ $DAHIGH == *ls* ]]
then
$DAHIGH=
fi
for FILE in $ADALOW $ADAHIGH $DALOW $DAHIGH
do
DEV=${FILE##'/dev/'}
#echo -n "${DEV}: "
if [ $USESMART -eq 0 ]
then
SERIAL=`grep $DEV: /var/log/dmesg.today |grep -i Serial | awk '{print $(NF)}'`
else
SERIAL=`smartctl -a $FILE | grep -i 'Serial Number'| awk '{print $(NF)}'`
fi
#this skips all ufs drives
GPTID=`$GLCMD |grep 2$ |grep ${DEV}p|cut -d' ' -f1`
if [ "${GPTID}x" == 'x' ]
then
GPTID="No GPTID"
fi
if [ "${SERIAL}x" == 'x' ]
then
$SERIAL="Not found"
fi
echo ${DEV}: Serial $SERIAL \; GPTID=$GPTID
done
if [ $CACHEGLABEL -eq 1 ]
then
rm $GLTMP
fi
Vous pouvez essayer quelque chose comme ça. Cela a fonctionné pour moi:
devlist=$(Sudo camcontrol devlist | awk ' { print $NF } ' | cut -f 2 -d , | sed 's/)//'g)
for device in $devlist; do Sudo camcontrol identify $device | grep serial; done
qui devrait afficher la liste complète des numéros de série.