storiq logo

La traînée de poudre

Le blog StorIQ

 

Vendredi, 20 août 2021

Gestion des bandes sous Linux/Unix en ligne de commande


Sommaire

    1. outils
    2.identification des périphériques
    3. manipulation des cartouches dans la bibliothèque
    4. manipulation de la bande dans le lecteur
        Informations sur le lecteur
        Codes de densité
        lecture de la puce RFID de la LTO
        commandes mt
    5. identification d'un support inconnu
    6. utilisation basique de tar
    7. utilisation de LTFS
    Appendice: autres commandes utiles

LTO

1. outils

Les outils utilisés sont : mt (du paquet mt-st), mtx, tar et ltfs. Accessoirement nous aurons besoin de lsscsi et dd ainsi que des sg3-utils.

mt permet de piloter les lecteurs de bande (transport, éjection, paramétrage). mtx permet de piloter les bibliothèques de bande (mouvements, chargement, etc). Nous utiliserons principalement tar pour lire et écrire, et dd pour identifier une bande inconnue.

Pour la première configuration, nous aurnos aussi besoin de lsscsi afin d’identifier les périphériques à utiliser.

2.identification des périphériques

Il nous faut identifier les périphériques, à l’aide de lsscsi:

~# lsscsi
[6:0:0:0]    disk    AMCC     9650SE-16M DISK  3.08  /dev/sda
[7:0:0:0]    tape    HP       Ultrium 5-SCSI   Z21U  /dev/st0
[7:0:0:1]    mediumx TANDBERG StorageLoader    0346  /dev/sch0

Le lecteur de bande apparait ici comme /dev/st0. Le périphérique listé pour la bibliothèque n’est pas le bon, il faut utiliser lscsi -g pour afficher les périphériques génériques SCSI correspondants :

~# lsscsi -g
[6:0:0:0]    disk    AMCC     9650SE-16M DISK  3.08  /dev/sda  /dev/sg0
[7:0:0:0]    tape    HP       Ultrium 5-SCSI   Z21U  /dev/st0  /dev/sg1
[7:0:0:1]    mediumx TANDBERG StorageLoader    0346  /dev/sch0  /dev/sg2

mt utilise le périphérique /dev/stXX ou /dev/nstXX. La différence : /dev/stXX rembobine automatiquement la bande avant toute opération. /dev/nstXX ne rembobine pas. C’est donc normalement /dev/nstXX qu’on utilise. tar (ou le cas échéant dd) travaille également avec le périphérique bande /dev/nstXX (ou /dev/stXX). mtx par contre, utilise le périphérique générique SCSI /dev/sgXX. Apprenez à connaitre la différence.

3. manipulation des cartouches dans la bibliothèque

Tout d’abord, passons en revue le contenu de la bibliothèque :

~# mtx -f /dev/sg2 status
  Storage Changer /dev/sg2:1 Drives, 8 Slots ( 0 Import/Export )
Data Transfer Element 0:Empty
      Storage Element 1:Full :VolumeTag=AAA013L4                        
      Storage Element 2:Empty
      Storage Element 3:Empty
      Storage Element 4:Empty
      Storage Element 5:Empty
      Storage Element 6:Empty
      Storage Element 7:Empty
      Storage Element 8:Empty

Les lignes “Data Transfer Element” correspondent aux lecteurs, un seul ici. Les lignes “Storage Element” correspondent aux emplacements de stockage; enfin le cas échéant, il peut y avoir des lignes “Input Output Element” qui sont des ports d’entrée/sortie permettant d’ajouter ou retirer des cartouches de la bibliothèque.

Si les cartouches sont dotées de codes à barres et que la bibliothèque les supportent, mtx affiche également ce code-barre, comme on peut le voir dans l’exemple ci-dessus.

La ligne “Data Transfer Element 0” donne l’état du premier lecteur (en l’espèce, vide). Chargeons-y une cassette :

~# mtx -f /dev/sg2 load 1 0
~#

Notons que si tout se passe bien, mtx reste muet, conforme en cela à la tradition unixienne. Si on regarde à nouveau le “status” on verra que mtx connait la provenance de la bande qui est maintenant dans le lecteur :

~# mtx -f /dev/sg2 status
  Storage Changer /dev/sg2:1 Drives, 8 Slots ( 0 Import/Export )
Data Transfer Element 0:Full (Storage Element 1 Loaded):VolumeTag=AAA013L4
      Storage Element 1:Empty
      Storage Element 2:Empty
      Storage Element 3:Empty
      Storage Element 4:Empty
      Storage Element 5:Empty
      Storage Element 6:Empty
      Storage Element 7:Empty
      Storage Element 8:Empty

Si on utilise la commande mtx -f /dev/sg2 unload sans indiquer de source ni de destination, la cassette du premier lecteur sera replacée dans son emplacement d’origine. On peut naturellement l’éjecter vers un emplacement libre au choix:

~# mtx -f /dev/sg2 unload 4 0 
Unloading Data Transfer Element into Storage Element 4...done

Remarquons au passage que mtx n’est pas très cohérent, puisqu’il émet un message dans ce cas.

Nota Bene: sur certains type de lecteurs, il peut être nécessaire de commander l’éjection de la bande par le lecteur avant de commander son déchargement par la bibliothèque. Par précaution, on précèdera donc toujours un mtx unload par le mt offline approprié (voir plus loin).

Il est aussi possible de transférer des cartouches entre différents emplacements, ce qui est surtout utile lorsqu’on est équipé d’un port d’entrée/sortie :

~# mtx -f /dev/sg2 transfer 4 2

4. manipulation de la bande dans le lecteur

mt permet de transporter la bande ( avancer, reculer, éjecter), effacer, activer/désactiver la compression, définir la taille de bloc utilisée, etc.

Commençons par visualiser le status du lecteur :

 ~# mt -f /dev/nst0 status
drive type = Generic SCSI-2 tape
drive status = 1476395008
sense key error = 0
residue count = 0
file number = 0
block number = 0
Tape block size 0 bytes. Density code 0x58 (unknown).
Soft error count since last status=0
General status bits on (41010000):
 BOT ONLINE IM_REP_EN

Informations sur le lecteur

Le statut du lecteur se lit ligne par ligne :

statut signification
drive type type d’attachement (normalement, toujours SCSI)
drive status un code incompréhensible
sense key error status d’erreur de communication
residue count ?
file number numéro d’enregistrement (fichier) dans lequel la bande est positionnée
block number position en blocs où la bande est actuellement positionnée
Tape block size X bytes taille de bloc matériel utilisé, sauf cas particulier doit toujours être à zéro
Density code densité de la bande, voir tableau ci-dessous
Soft error count nombre d’erreurs rencontrées

Codes de statut

Les deux dernières lignes concernent les “bits de statut”, qui sont définis selon le tableau suivant :

Status Bit Description
BOT au début de la bande (début du premier fichier)
EOT à la fin de la bande (fin de la partie enregistrée)
EOF positionné à la fin d’un fichier
WR_PROT protégé en écriture. Soit le lecteur, soit la bande est en mode protégé; ou bien le lecteur ne supporte ce type de bande qu’en lecture seule.
ONLINE Le lecteur est chargé avec une bande et prêt à fonctionner.
DR_OPEN Porte ouverte. Normalement, signifie que le lecteur est vide.
IM_REP_EN mode de retour immédiat. Le lecteur tamponne les données et rend la main avant que les données soient physiquement enregistrées sur le média.
SM La bande est positionné sur un marqueur ( set mark). Spécifique aux lecteurs DDS(?)
EOD La bande est positionnée à la fin de la partie enregistrée. Selon les lecteurs, équivalent ou pas à EOT

Codes de densité

Voici les codes compilés par moi depuis plusieurs sources (Internet, nos lecteurs…)

code description
0x00 default
0x01 NRZI (800 bpi)
0x02 PE (1600 bpi)
0x03 GCR (6250 bpi)
0x04 QIC-11
0x05 QIC-45/60 (GCR, 8000 bpi)
0x06 PE (3200 bpi)
0x07 IMFM (6400 bpi)
0x08 GCR (8000 bpi)
0x09 GCR (37871 bpi)
0x0a MFM (6667 bpi)
0x0b PE (1600 bpi)
0x0c GCR (12960 bpi)
0x0d GCR (25380 bpi)
0x0f QIC-120 (GCR 10000 bpi)
0x10 QIC-150/250 (GCR 10000 bpi)
0x11 QIC-320/525 (GCR 16000 bpi)
0x12 QIC-1350 (RLL 51667 bpi)
0x13 DDS (61000 bpi)
0x14 EXB-8200 (RLL 43245 bpi)
0x15 EXB-8500 or QIC-1000
0x16 MFM 10000 bpi
0x17 MFM 42500 bpi
0x18 TZ86
0x19 DLT 10GB
0x1a DLT 20GB
0x1b DLT 35GB
0x1c QIC-385M
0x1d QIC-410M
0x1e QIC-1000C
0x1f QIC-2100C
0x20 QIC-6GB
0x21 QIC-20GB
0x22 QIC-2GB
0x23 QIC-875
0x24 DDS-2
0x25 DDS-3
0x26 DDS-4 or QIC-4GB
0x27 Exabyte Mammoth
0x28 Exabyte Mammoth-2
0x29 QIC-3080MC
0x30 AIT-1 or MLR3
0x31 AIT-2
0x32 AIT-3 / SLR7
0x33 SLR6
0x34 SLR100
0x40 DLT1 40 GB, or Ultrium
0x41 DLT 40GB, or Ultrium2
0x42 LTO-2
0x44 LTO-3
0x45 QIC-3095-MC (TR-4)
0x46 LTO-4
0x47 TR-5 / DDS-5
0x48 Quantum SDLT220
0x49 Quantum SDLT320
0x51 IBM 3592 J1A
0x52 IBM 3592 E05
0x58 LTO-5
0x5a LTO-6
0x5c LTO-7
0x5d LTO-M8
0x5e LTO-8
0x80 DLT 15GB uncomp. or Ecrix / VXA-1
0x81 DLT 15GB compressed / VXA-2
0x82 DLT 20GB uncompressed / VXA-3 / VXA-320
0x83 DLT 20GB compressed
0x84 DLT 35GB uncompressed
0x85 DLT 35GB compressed
0x86 DLT1 40 GB uncompressed
0x87 DLT1 40 GB compressed
0x88 DLT 40GB uncompressed
0x89 DLT 40GB compressed
0x8c EXB-8505 compressed
0x90 SDLT110 uncompr/EXB-8205 compr
0x91 SDLT110 compressed
0x92 SDLT160 uncompressed
0x93 SDLT160 compressed

lecture de la puce RFID de la LTO

Les cartouches de type LTO ont une puce RFID. En lisant cette puce on peut récupérer une foule d’informations. Pour cela il faut utiliser la commande sg_logs du paquet sg3-utils. La première ligne de sortie donne les informations du lecteur. Le reste concerne la cartouche.

 ~# sg_logs -p 0x17 /dev/sg2 
    TANDBERG  LTO-5 HH          Z629
Volume statistics page (ssc-4), subpage=0
  Page valid: 1
  Thread count: 40
  Total data sets written: 1429926
  Total write retries: 2
  Total unrecovered write errors: 0
  Total suspended writes: 43
  Total fatal suspended writes: 0
  Total data sets read: 4186
  Total read retries: 1
  Total unrecovered read errors: 0
  Last mount unrecovered write errors: 0
  Last mount unrecovered read errors: 0
  Last mount megabytes written: 0
  Last mount megabytes read: 0
  Lifetime megabytes written: 3534834
  Lifetime megabytes read: 10347
  Last load write compression ratio: 0
  Last load read compression ratio: 8391
  Medium mount time: 73309203
  Medium ready time: 73309203
  Total native capacity [MB]: 1529930
  Total used native capacity [MB]: 7250
  Volume serial number: MG1NVN224A
  Tape lot identifier: G5ABP25R
  Volume barcode: ST1008                          
  Volume manufacturer: FUJIFILM
  Volume license code: U107
  Volume personality: Ultrium-5
  Write protect: 0
  WORM: 0
  Maximum recommended tape path temperature exceeded: 0
  Beginning of medium passes: 267
  Middle of medium passes: 203
  Logical position of first encrypted logical object:
    partition number: 0, partition record data counter: 0xffffffffffff
  Logical position of first unencrypted logical object after first
  encrypted logical object:
    partition number: 0, partition record data counter: 0xffffffffffff
  Native capacity partition(s) [MB]:
    partition number: 0, partition record data counter: 1529930
  Used native capacity partition(s) [MB]:
    partition number: 0, partition record data counter: 7250
  Vendor specific parameter code (0xf000), payload in hex
 00     00 01                                               ..

Commandes mt

Les options de mt les plus couramment utilisées sont listées ci-dessous :

commande description
Information
status affiche les informations du lecteur et de la bande (voir ci-dessus)
Paramètres du lecteur
setdensity X définit la densité du lecteur (voir ci-dessus). Utilisé pour activer/désactiver la compression.
setblk X définit la taille de bloc matériel. Normalement toujours à zéro (“blocs dynamiques”)
drvbuffer X active (1) ou désactive (0) le tampon du lecteur. D’autres valeurs peuvent être valides selon les lecteurs.
stoptions X utilisé pour activer les options du pilote de bande. Les valeurs courantes sont : 1 pour activer le tampon en écriture, 2 pour activer les écritues asynchrones, et 8 pour le déboguage.
transport
rewind rembobine la bande.
retension rembobine la bande, bobine la bande jusqu’au bout, puis rembobine à nouveau la bande.
offline rembobine puis éjecte la bande.
fsf X Avancer de X fichiers. La bande est positionnée sur le premier bloc du fichier suivant.
fsfm X Avancer de X fichiers. La bande est positionnée sur le dernier bloc du fichier précédent. Équivalent à fsf X + bsf 1
bsf X Reculer de X fichiers. La bande est positionnée sur le dernier bloc du fichier précédent.
bsfm X Reculer de X fichiers. La bande est positionnée sur le premier bloc du fichier suivant, équivalent à bsf X + fsf 1
asf X positionnement absolu: rembobine puis avance de X fichiers (comme fsf ).
eod,seod avance jusqu’à la fin de la zone de données. Équivalent obsolète : eom.
fsr X avance de X enregistrements. (différence avec fsf? )
bsr X recule de X enregistrements.
fss X avance de X marqueurs (setmarks).
bss X recule de X marqueurs.
seek X positionne la bande au bloc X.
tell indique le bloc courant sur la bande
écriture sur bande
eof, weof X écrit X marqueurs “fin de fichier” à la position courante.
wset X écrit X marqueurs (setmarks) à la position courante.
erase Efface la bande. Attention, le lecteur rend la main et reste indisponible jusqu’à la fin de l’opération, qui est très longue (1 heure ou plus)

Chaque opération d’écriture sur la bande à l’aide d’un outil comme tar, cpio, etc. crée un “fichier”, identifié par son marqueur “EOF” (fin de fichier). Si on écrit successivement 3 fichiers tar sur la bande, on peut se positionner avec mt fsf/bsf sur l’archive à lire.

5. identification d’un support inconnu

Pour identifier un support inconnu, on cherchera d’abord à connaître la taille de blocs. On règle donc celle du lecteur à zéro (blocs dynamiques):

mt -f /dev/nst0 setblk 0

Ensuite on extrait un bloc entier en utilisant dd. On suppose que le bloc ne fait probablement pas plus que 512Ko et on écrit le résultat dans le fichier /tmp/TESTTAPE :

~# dd if=/dev/nst0 bs=512k of=/tmp/TESTTAPE count=1
0+1 enregistrements lus
0+1 enregistrements écrits
32768 octets (33 kB) copiés, 3,76924 seconde, 8,7 kB/s

On voit que le bloc fait 32 Ko… Maintenant il s’agit d’identifier ce fichier… Avec file par exemple :

 ~# file /tmp/TESTTAPE 
/tmp/TESTTAPE2: ASCII cpio archive (SVR4 with no CRC)

En cas de fichier récalcitrant, on peut toujours utiliser strings :

:~# file /tmp/TESTTAPE
/tmp/TESTTAPE: data
~# strings /tmp/TESTTAPE 
-**#( NetVault Header )#**-
rcserveur 22 sept. 04:29-1
rcpartages

6. utilisation basique de tar

Les paramètres de base de tar que nous utiliserons sont :

-c  écrire sur la cible
-t  liste le contenu de la cible
-x  restaurer depuis la cible
-f  fichier cible ( par exemple /dev/nst0 )
-v  verbeux, détaille les opérations en cours
-b  taille de bloc à utiliser (GROS!)

Exemple d’écriture :

tar -c -v -f /dev/nst0 -b 128 /un/dossier/à/archiver/

Écrit sur /dev/nst0 avec des blocs de 64 Ko, tout le dossier et son contenu.

7. utilisation de ltfs

LTFS (long term file system) est une solution multiplateformes qui permet d’utiliser facilement des bandes LTO (LTO-5 minimum) de manière simple en simulant un disque amovible. La bande LTFS se présente donc comme un système de fichiers semblable à un disque USB. Des utilitaires gratuits sont disponibles sur les sites de constructeurs (IBM, HP, Quantum, etc) pour Windows, MacOS et Linux (RedHat et Suse uniquement).

Une version compilée pour Debian 10 est disponible ici. Attention, c’est un paquet de test dont les dépendances ne sont pas définies, vous devrez les installer manuellement.

Les outils LTFS pour linux sont assez simples. Le premier est la commande ltfs qui permet grâce à fuse, de monter la bande afin de la lire et d’y écrire. Attention, comme mtx, ltfs utilise le périphérique SCSI /dev/sgXX et non le lecteur de bandes /dev/stXX.

L’utilisation de ltfs est très simple. Le programme étant très bavard, j’ai omis une partie des messages:

 ~# ltfs -o devname=/dev/sg2 /mnt/ltfs

6127 LTFS14000I LTFS starting, LTFS version 2.5.0.0 (Prelim), log level 2.                  
6127 LTFS14058I LTFS Format Specification version 2.4.0.                        
6127 LTFS14104I Launched by "ltfs -o devname=/dev/sg2 /mnt/ltfs".                     
6127 LTFS14105I This binary is built for Linux (x86_64).
6127 LTFS14106I GCC version is 8.3.0.
6127 LTFS17087I Kernel version: Linux version 4.19.0-16-amd64 
    (debian-kernel@lists.debian.org) (gcc version 8.3.0 (Debian 8.3.0-6)) 
    #1 SMP Debian 4.19.181-1 (2021-03-19) i386.
6127 LTFS17089I Distribution: PRETTY_NAME="Debian GNU/Linux 10 (buster)".

[...]

6127 LTFS14111I Initial setup completed successfully.
6127 LTFS14112I Invoke 'mount' command to check the result of final setup.
6127 LTFS14113I Specified mount point is listed if succeeded.

On peut, comme le recommande la dernière ligne, utiliser mount pour vérifier qu’on retrouve bien notre bande LTFS:

 ~# mount -t ltfs
 ltfs:/dev/sg2 on /mnt/ltfs type fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)

On pourra alors lire et écrire sur la bande comme sur un disque dur ordinaire, mais avec des latences beaucoup plus importantes bien entendu (positionner la bande peut prendre plusieurs minutes), puis la démonter simplement avec umount.

Appendice: autres commandes utiles

En cas de verrouillage intempestif de la bibliothèque de bandes, on peut la déverrouiller en envoyant une commande SCSI :

sg_prevent -av /dev/sg2

posté à: 17:29 permalink