Tuesday, September 18, 2012

Linux, ZFS et disque SATA: remplacement de disque sans faute en 5 commandes


Le serveur en question tourne sur Debian 6 avec zfs-fuse comme système de fichier sur un volume stripped mirror, équivalent d'un RAID 10.

zpool get version tank
NAME  PROPERTY  VALUE    SOURCE
tank  version   23       default


Alors que je regardais l'espace disponible sur un volume ZFS dédié à des backups, je m'apercois du message d'erreur suivant:

zpool status | head
  pool: tank
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://www.sun.com/msg/ZFS-8000-9P
 scrub: none requested
config:

Effectivement le noyau a du mal à communiquer avec un disque dur
dmesg | grep sd 
[87538.049395] sd 1:0:1:0: [sdd] Unhandled sense code
[87538.049399] sd 1:0:1:0: [sdd]  Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[87538.049404] sd 1:0:1:0: [sdd]  Sense Key : Medium Error [current] [descriptor]
[87538.049430] sd 1:0:1:0: [sdd]  Add. Sense: Unrecovered read error - auto reallocate failed
[87538.049437] sd 1:0:1:0: [sdd] CDB: Read(10): 28 00 48 06 54 00 00 00 80 00
[87538.049448] end_request: I/O error, dev sdd, sector 1208374353

Cecu est confirmé par le status SMART du disque en question: un disque dur vieux de 1541 jours, on peut le changer !
smartctl --all /dev/sdd | grep ^Error
Error logging capability: (0x01) Error logging supported.
Error 7453 occurred at disk power-on lifetime: 36998 hours (1541 days + 14 hours)
Error 7452 occurred at disk power-on lifetime: 36998 hours (1541 days + 14 hours)
Error 7451 occurred at disk power-on lifetime: 36998 hours (1541 days + 14 hours)
Error 7450 occurred at disk power-on lifetime: 36998 hours (1541 days + 14 hours)
Error 7449 occurred at disk power-on lifetime: 36998 hours (1541 days + 14 hour
Notons tout d'abord son numéro de série:
hdparm -I /dev/sdd | grep "Serial Number"
Serial Number:      WD-WCASJ0402738

Un petit tour sur le site du constructeur permet d'ailleurs de constater que la date de garantie est déja dépassée:


Et retirons le disque dur du pool zfs:
zpool offline tank /dev/sdd

Notre pool "tank" apparait alors en statut "dégradé" mais heureusement pas d'erreurs sur les données.
zpool status
  pool: tank
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
 scrub: none requested
config:

NAME        STATE     READ WRITE CKSUM
tank        DEGRADED     0     0     0
 mirror-0  ONLINE       0     0     0
   sda     ONLINE       0     0     0
   sdb     ONLINE       0     0     0
 mirror-1  DEGRADED     0     0     0
   sdc     ONLINE       0     0     0
   sdd     OFFLINE      0     0     0

errors: No known data errors

Une fois le serveur arrêté il s'agit de remplacer le disque dur comme le noyau l'avait reconnu comme /dev/sdd, il est sans doute sur la troisième nappe SATA (la numérotation commençant à partir de 0)
Un coup d’œil au disque permet de vérifier le numéro de série:



Après avoir recablé le disque, rajoutons le dans le pool zfs:
zpool replace tank /dev/sdd

Si vous utilisez les numeros de series des disques comme identifiant:
zpool replace tank ata-WDC_WD2003FYYS-02W0B0_WD-WMAY02196811 ata-Hitachi_HDS721010KLA330_GTE002PBGTNYME

Zfs va maintenant resynchroniser les blocs de données:
(Dans le jargon de ZFS, resilvering signifie copier les blocs d'un disque à un autre pour regagner un état initial)
zpool status
  pool: tank
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scrub: resilver in progress for 0h33m, 34.92% done, 1h1m to go
config:

NAME             STATE     READ WRITE CKSUM
tank             DEGRADED     0     0     0
 mirror-0       ONLINE       0     0     0
   sda          ONLINE       0     0     0
   sdb          ONLINE       0     0     0
 mirror-1       DEGRADED     0     0     0
   sdc          ONLINE       0     0     0
   replacing-1  DEGRADED     0     0     0
     sdd/old    OFFLINE      0     0     0
     sdd        ONLINE       0     0     0  67.0G resilvered


On peut aussi suivre l'état de la synchronisation, qui s'effectue environ à  47MB/s sur ce système:
iostat -d 1 -m
Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda               0.00         0.00         0.00          0          0
sdd             137.00         0.00        48.13          0         48
sdc             138.00        48.69         0.00         48          0
sdb               0.00         0.00         0.00          0          0
sde               0.00         0.00         0.00          0          0

Environ deux heures plus tard la synchronisation des blocs de données est terminée, et le pool zfs est de nouveau en statut normal:
zpool status
  pool: tank
 state: ONLINE
 scrub: resilver completed after 1h38m with 0 errors on Tue Sep 18 17:04:25 2012
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        sda     ONLINE       0     0     0
        sdb     ONLINE       0     0     0
      mirror-1  ONLINE       0     0     0
        sdc     ONLINE       0     0     0
        sdd     ONLINE       0     0     0  192G resilvered

errors: No known data errors


Saturday, September 8, 2012

Installation sur un Imac 24'': comment je suis devenu intégrateur OEM sans le vouloir

Une histoire d'upgrade

Un Imac 24'', c'est sans doute un ordinateur assez répandu, si on juge par les succès de la maison mère, et bien pourtant l'installation de Debian 7 (Beta)  s'est révélé loin d'être une partie de plaisir. Évidemment avec 10 d'expérience de Linux, et le fait que je sois Debian Maintainer, j'avais pas mal d'atouts dans les mains et en quelques heures tout fonctionnait nickel. Cependant.

Carte graphique: tout le monde descend du bus
Pour installer le driver nvidia propriétaire, un petit coup de
apt-get install nvidia-kernel-dkms linux-headers-amd64
est suffisant.

On reboot, on se connecte tranquille, et après deux minutes le système se bloque complètement. Après deux heures d'Essais infructueux je remarque dans le /var/log/syslog:

Sep  7 21:50:58 leonard kernel: [  257.212660] NVRM: GPU at 0000:01:00.0 has fallen off the bus.

Finalement je supprime  nvidia-kernel-dkms et linux-headers-amd64, je reboote le système, et là miraculeusement Xorg se utilise le driver nouveau avec accélération 3D Gallium, et plus de plantage.
 (NB: Restreint signifie ici que j'utilise Gnome Classic et n'a rien à voir avec le fonctionnement de la carte)

Carte Son: mbp3 pour jouer des mp3
En branchant mes baffles sur la sortie, je me rend compte tout d'un coup que le système utilise le haut parleur interne pour au lieu de ma luxueuse HiFi Sony. Après avoir incriminé à tort PulseAudio pendant une bonne demi heure, je me rends compte que le coupable est le module snd-hda-intel.

Celui ci a besoin de l'entrée
options snd-hda-intel model=mbp3

dans /etc/modprobe.d/alsa-base.conf
pour fonctionner correctement (source)  

Clavier: Une carte pourrie pour nous sortir de là
Pas au bout de mes peines je me rends compte que les touches ^ (accent circonflexe) et '<' '>'  sont inversées sur mon clavier mac allemand. Apparemment il s'agit d'un bug sur les claviers apple, qui n'affichent pas les codes qu'ils prétendent envoyer.
Il faut donc corriger le problème en ajoutant:

XKBMODEL="pc105"
XKBLAYOUT="de"
XKBVARIANT="mac"
XKBOPTIONS="lv3:rwin_switch,apple:badmap"

dans /etc/default/keyboard

Conclusion: je fais le boulot d'Apple, Dell, et Toshiba
Les trois bugs mentionnés plus hauts ne me seraient jamais arrivés sur un portable acheté à la Fnac au rayon PC ou Apple.
Pourquoi ? Tout simplement pour n'importe quel PC de marque, le constructeur se charge de préinstaller Windows avec les meilleurs drivers, et se charge à cette occasion de masquer les défauts de ses propres produits via une couche de plâtre logiciel.
En installant vous même Linux ou un autre OS non préinstallé c'est vous qui effectuez ce travail.

Sur un serveur le problème est quasi inexistant car vous avez seulement besoin d'un driver pour votre contrôleur de disque et pour la carte réseau, le plus souvent maintenu directement par le constructeur (Intel, Broadcom) pour Linux et FreeBSD dans les sources du noyau.
Pour un portable vous avez en plus besoin de suspend to disk, suspend to RAM, bluetooth, wifi, accélération 3D, carte son, lecteur de carte Smart Media, touches de fonction Volume/Luminosité et maintenant écran tactile, carte graphiques hybride.

Update: ajout de liens vers les contributions  Intel/Broadcom à Linux & FreeBSD