
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
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