La commande pour gérer un lecteur de bande est mt dont la syntaxe est la suivante :

mt [-f tapename] command [count]

-f tapename     Nom du lecteur de bande (/dev/rmt/0 par défaut)
 command        Commande souhaitée : rewind, status, erase, retention
 count          Nombre d'opérations


Les options que j'utilise les plus souvent sont les suivantes :

mt -f /dev/rmt/0 status : affiche les informations d'état relatives au lecteur de bande

mt -f /dev/rmt/0 rewind : rembobine la bance

mt -f /dev/rmt/0 offline  : rembobine et met le lecteur de bande hors ligne et éjecte la bande

mt -f /dev/rmt/0 fsf X  : fait avancer la bande de X blocs de données

mt -f /dev/rmt/0 erase  : formate la bande

mt -f /dev/rmt/0n bsf X : on revient en arrière de X blocs de données

La chose primordiale à comprendre sur les lecteurs de bandes, c'est le concept de "bloc de données". Lorsqu'on fait un ufsdump d'un filesystem sur une bande, ce filesystem sera sauvegardé dans un seul bloc de données, affecté d'un numéro de bloc.
Le premier filesystem qui a été sauvegardé sur la bande aura le numéro 0, le deuxième filesystem, le numéro 1, etc.

Voici un exemple de script de sauvegarde ufsdump que j'ai mis en place pour sauvegarder mes filesystems sur une bande DAT :

#!/bin/ksh
# Shell de sauvegarde system via ufsdump
ufsdump 0ucf /dev/rmt/0cbn /
ufsdump 0ucf /dev/rmt/0cbn /var
ufsdump 0ucf /dev/rmt/0cbn /home
ufsdump 0ucf /dev/rmt/0cbn /logiciels
ufsdump 0ucf /dev/rmt/0cbn /export

Je ne parlerai pas ici des options de ufsdump : ce n'est pas le sujet ici. Je préfère expliquer la restauration, qui est plus importante à comprendre à mes yeux. Donc, d'après le script, l'ordre de sauvegarde des filesystems sur la bande est le suivant, avec le numéro de bloc correspondant :

/ : bloc 0 de la bande
/var : bloc 1 de la bande
/home : bloc 2 de la bande
/logiciels : bloc 3 de la bande
/export : bloc 4 de la bande

Passons maintenant à la restauration avec la commande ufsrestore. Avant toute chose, il faut savoir que, pour restaurer un filesystem avec ufsrestore, il faut recréer le filesystem. Donc, si vous restaurez par exemple / ou /var, une manière de le faire est de booter, par exemple, sur le cdrom en mode single, puis de recréer ensuite le filesysem avec la commande newfs.

Donnons quelques exemples concrets de restauration.

1. Restauration de /var
Comme je l'ai dit précédemment, pour restaurer /var, il faut booter en mode single user sur le cdrom. Cela se fait au prompt {ok} :

{ok} boot cdrom -s

Après vous êtes connecté en root, il faut recréer le filesystem /var, en supposant que ce dernier soit sur la partition c0t0d0s3 :

# newfs /dev/rdsk/c0t0d0s3 # mount /dev/dsk/c0t0d0s3 /a # cd /a

Insérez la bande DAT dans laquelle se trouve les sauvegardes ufsdump. On rembobine la bande :

# mt -f /dev/rmt/0 rewind

Comme indiqué précédemment, /var se trouve sur le bloc 1 de la bande. On positionne donc la bande sur le bloc 1 :

# mt -f /dev/rmt/0 fsf 1

On vérifie que la bande est bien positionnée sur le bloc 1 (le "file no" doit être à 1) :

# mt -f /dev/rmt/0 status
Seagate DAT 72 tape drive:
sense key (0x0)= No Additionaal Sense residual=0 retries= 0
file no=1 block no= 0

C'est bien le "file no" qu'il faut regarder, et non le block no. On peut maintenant restaurer /var :

# ufsrestore rvf /dev/rmt/0

Une fois la restauration terminée :

# cd /a
# umount /a

On vérifie l'intégrité de /var :

# fsck -y /dev/rdsk/c0t0d0s3

On reboot :

# reboot

La commande ufsrestore crée un fichier nommé restoresymtable pour mémoriser des informations entre les restaurations incrémentales. On peut le supprimer :

# cd /var
# rm restoresymtable

Voilà, nous venons de faire une restauration complète de /var. Vous pouvez faire la même chose pour n'importe quel autre filesystem sauvegardé via ufsdump, en faisant attention à toujours positionner la bande sur le bon bloc, suivant le filesystem que vous voulez restaurer.

Remarque très importante : dans le cas d'une restauration de /, il faut recréer le boot block, sinon votre système ne bootera pas. Vous appliquez donc la même procédure que pour la restauration de /var, et juste après le ufsrestore, vous lancez la commande :

# /usr/sbin/installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c0t0d0s0

2. Restauration de fichier(s) et répertoires.
La restauration de fichiers ou de répertoires à partir d'une bande suit le même principe que la restauration d'un filesystem : il faut positionner la bande sur le bon bloc correspondant au filesystem dans lequel se trouve vos fichiers ou répertoires que vous voulez restaurer.

Notons quand même que la restauration de fichiers ou de répertoires ne nécessite pas de recréer le filesystem.

Passons maintenant à un exemple concret. Supposons que nous voulions restaurer le fichier /etc/passwd. Par précaution, il est préférable de se mettre dans un répertoire temporaire, par exemple /tmp, pour restaurer le fichier :

# cd /tmp

On rembobine la bande :

# mt -f /dev/rmt/0 rewind

Le fichier /etc/passwd se trouvant dans le filesystem /, la bande doit être positionnée sur le bloc 0. Le rembobinage de la bande a déjà positionné le bloc à 0; on vérifie juste que c'est bien le cas :

# mt -f /dev/rmt/0 status
Seagate DAT 72 tape drive:
sense key (0x0)= No Additionaal Sense residual=0 retries= 0
file no=0 block no= 0

Maintenant, la restauration d'un fichier va se faire avec la commande ufsrestore, mais en mode interactif :

# ufsrestore if /dev/rmt/0
ufsrestore>

En tapant ?, on obtient la liste des commandes disponibles :

ufsrestore > ?
Available commands are:

      ls arg - list directory
       marked arg - list items marked for extraction from directory
       cd arg - change directory
       pwd - print current directory
       add arg - add `arg' to list of files to be extracted
       delete arg - delete `arg' from list of files to be extracted
       extract - extract requested files
       setmodes - set modes of requested directories
       quit - immediately exit program
       what - list dump header information
       verbose - toggle verbose flag (useful with ``ls)''
       paginate - toggle pagination flag (affects ``ls and ``marked)
       setpager - set pagination command and arguments
       help or `?' - print this list

If no `arg' is supplied, the current directory is used

Listons avec la commande ls :

ufsrestore > ls

.:

a/                etc/              md.tab.full       quotas
appli/            exploit/          mnt/              restoresymtable
bin               export/           net/              root/
boot/             home/             opt/              sbin/
cdrom/            kernel/           outillage/        system/
ctm_agent613      lib/              platform/         tmp/
dev/              logiciels/        proc/             usr/
devices/          lost+found/       prototype         var/


Le fichier passwd se trouvant dans etc :

ufsrestore > cd etc
ufsrestore > ls passwd
passwd

Maintenant, pour restaurer le fichier :

ufsrestore > add passwd
ufsrestore > extract
You have not read any volumes yet.
Unless you know which volume your file(s) are on you should start
with the last volume and work towards the first.
Specify next volume #: 1
set owner/mode for '.'? (yn) y
ufsrestore > quit

Si on regarde ce qui a été restauré, on remarque que la restauration a crée le répertoire "etc" et y a mis le fichier passwd. Il suffit maintenant de copier le fichier restauré sous /etc :

# cp -p /tmp/etc/passwd /etc/passwd

Pour terminer ce billet, parlons rapidement de la restauration d'un répertoire. Elle est identique à celle d'un fichier : on lance la commande ufsrestore en mode interactif, puis on utilise les commandes add et extract pour restaurer. Si besoin, utilisez la commande cd pour vous rendre dans les répertoires qu'il faut, puis ls pour lister.