¿Cómo manejo una unidad de cinta en Ubuntu?

Juan Perón exponía durante los distintos actos públicos la ideología benefactora del Estado Justicialista, y propalaba paternalmente aquellos conocimientos que podían servir al Pueblo. En un discurso en la inauguración del Tambo Nuevo en Santa Fé explica cómo controlar las antiguas unidades de cinta para hacer respaldos en Ubuntu.

Vean señores, en nuestra era, no cabe duda que el medio de almacenamiento mas extendido está constituido por los discos rígidos magnéticos.

De un tamaño original de un lavarropa, la evolución los ha hecho miniaturizarse, de manera tal que hoy no tienen más de 3 pulgadas de ancho y ocupan menos espacio que un atado de Pall Mall.

Si necesitamos transportabilidad y viajar con ellos, a estos chiquitos se le suele adosar de fábrica una interfaz USB, con lo que logramos un disco rígido externo. También, si nuestras necesidades de espacio y velocidad no son tan acuciantes, contamos ya con las prácticas memorias Flash (también con la misma interfaz, conformando un pendrive). Ello los convierte en los más peronistas de los medios de almacenamiento.

Sin embargo, existen medios de almacenamiento que - a pesar de su veteranía - no cejan en dar pelea y constituyen un verdadero "primer peronismo". Esto es así pues la confiabilidad de su almacenamiento y la gran durabilidad y estabilidad de su medio se une al bajo precio que pueden llegar a tener en ciertas condiciones (si lo comparamos con su capacidad). Uno de estos dispositivos para el almacenamiento ha superado la barrera del tiempo y siempre se renueva tecnológicamente: es la cinta magnética.

Desde las unidades de IBM que acompañaban a las mainframe (de un tamaño individual que superaba a una heladera Siam), hasta el simpático Datasette del microordenador Commodore 64, la cinta ha sido protagonista del almacenamiento de Masa.


A nivel empresarial, se utiliza la cinta como medio de respaldo de la información, y actualmente conserva su valía en tal accionar. Es por ello que hoy, a pesar de la inmensidad de los Terabytes disponibles en sistemas de disco duro, la cinta aún conserva su vialidad como medio de resguardo.


Su principal desventaja es tal vez la secuencia lineal que normalmente tiene su operación de escritura (lo cual lo desaconseja para tareas diarias), y también lo lenta de su acción de lectura. Su ventaja radica en la alta capacidad relativa y en el bajo costo del medio de almacenamiento.

En este caso, explicaré el uso de una unidad marca HP modelo C1533A adosada a una placa controladora PCI Adaptec Scsi-2.

Se trata de una unidad tecnológicamente superada pero que puede servir para practicar y para emprender para pequeñas tareas de resguardo a una velocidad de 1,2GB/h. Esto es así pues la unidad de cinta junto con su placa controladora la recibimos como donación, y emplea extendidos casettes de cinta DAT de los cuales conseguimos en cajas bulk de 20 unidades por muy bajo costo.

Específicamente en este caso del Verbatim DataLife formato DDS-2 (cassette con 120 metros cinta de 4mm de ancho (realmente 3,81mm), que permiten almancenar unos 4GB de datos sin compresión y 8GB con compresión.

Nos sirven como una buena opción para respaldar datos de trabajo de múltiples servidores, y distinta información en forma de documentos de texto y planillas electrónicas, así como guardar datos de páginas webs montadas en una miríada de servidores Apache...

Pues bien, los sistemas operativos GNU con Linux (y otros sistemas similares a Unix) son capaces de funcionar a través de estos dispositivos de cinta, que si bien son poco conocidos ya, en casos específicos siguen siendo útiles. Desde el punto de vista del software libre, se emplean el comando mt ("magnetic tape", o cinta magnética) para controlar la operación de la o las unidades de cinta magnética. Necesitaremos utilizarlo toda vez que operemos con este tipo de dispositivos.
Dispositivos de Unidades de Cinta
En primer lugar, debemos conocer cómo nuestro sistema llama o nomencla a nuestra unidad de cinta (en este caso la HP C1533A). Esto es así pues - desde un punto de vista lógico - en los sistemas GNU con Linux los dispositivos de cinta son dispositivos de caracteres nomenclado como simples archivos en nuestro sistema de archivos. O sea, como todos los demás dispositivos, encontraremos un fichero especial en el directorio /dev/ al cual nos referiremos como la unidad de cinta.

Sin embargo, podríamos encontrar varios tipos distintos de dispositivos de cinta, al cual el sistema nomencla dependiendo sus características propias. Por ejemplo:

    Las unidades de cinta de interfaz SCSI usan los nombres /dev/st0, /dev/nst0, /dev/st1, /dev/nst1, etcétera. La interfaz SCSI y su controlador es considerado de las más confiables, pero naturalmente las unidades de cinta SCSI son más caras que las otras.
    Los dispositivos de cinta ATAPI comienzan con /dev/ht0 y /dev/nht0.
    También existe un soporte limitado para unidades de cinta a través del viejo controlador floppy, localizados en /dev/ft0 y /dev/ntf0.


Existen dos versiones de cada dispositivo de cinta en los sistemas GNU con Linux:

    Un dispositivo rewind rebobina la cinta después de cada operación, por ejemplo /dev/st0 es un dispositivo rewind (con capacidad de rebobinado).
    Un dispositivo de cinta no-rewind no rebobinará la cinta después de sus operaciones. Los dispositivos No-rewind comenzarán con una n; por ejemplo, /dev/nst0 es un dispositivo no-rewind.

Debemos saber que en vista de esta diferenciación mecánica, los dispositivos rewind como nuestra unidad DDS-2/DAT son prácticamente inútiles para el uso del archivado diario. Su objetivo solamente es realizar respaldos secuenciales en la cinta. En las secciones siguientes veremos que será necesario operarlos reposicionando la cinta mediante las acciones de avance o rebobinado de cinta...

Ahora bien, para identificar nuestra unidad de cinta, podremos ingresar el comando:

dmesg

...y buscar en el mismo las identificadores de la misma:

  Vendor: HP        Model: C1533A            Rev: 9503
  Type:   Sequential-Access                  ANSI SCSI revision: 02
st: Version 20010812, bufsize 32768, wrt 30720, max init. bufs 4, s/g segs 16
Attached scsi tape st0 at scsi0, channel 0, id 4, lun 0


...como vemos, en el caso de la unidad de cinta HP C1533A, recibe en nuestro sistema la nomenclatura de /dev/st0 (el primer nombre de dispositivo de cinta SCSI con capacidad de rebobinado).
Configurar el entorno
Ya que hemos visto qué nombre recibe la unidad de cinta en nuestro sistema, será útil especificarlo en nuestro archivo de entorno .bashrc. Esto es particularmente útil si siempre usaremos la misma unidad de cinta en el sistema, o si sólo tenemos una de ellas, pues nos ahorrará tener que expecificar en cada comando que la unidad de cinta es /dev/st0 o lo que fuese.

Configuraremos entonces la variable de entorno TAPE para que represente el dispositivo que tenemos. En nuestro caso podríamos ingresar:

nano ~/.bashrc

...esto abrirá el editor de texto GNU Nano con archivo de ejecución .bashrc (ya debería tener contenido, no modificamos nada de lo que ya está escrito). Al final del archivo le agregamos las siguientes líneas:

## Agregado de Variable TAPE por Usuario Perón ## 
TAPE=/dev/st0
export TAPE

Finalmente, guardamos el archivo con Ctrl+q y salimos del editor GNU Nano con Ctrl+x.

Trabajando con Unidades de Cinta
La cinta es una de los medios de almacenamiento más simples en existencia. Podríamos pensar en la cinta como una secuencia de archivadas, con una marca de archivo al final de cada una de ellas que la separa de la siguiente, como se muestra en la figura 1. Presten particular atención a que no existe una marca de archivo al principio de la cinta, y que la primera archivada (llamamos así a la tanda de ficheros que se graban secuencialmente) recibirá el número 0.


Figura 1: Archivadas y marcas de archivo en la cinta.

A diferencia de otros dispositivos de almacenamiento más complejo, la cinta normalmente carece de un sistema de archivos. Por otro lado, no existe información en la cinta que indique el nombre de cada archivo (aunque los sistemas de respaldo automático usualmente incluyen un archivo de índice especial al comienzo de la cinta). Cuando operamos manualmente con la cinta, operaremos con los números de archivo y las marcas de archivo, y nada mas.

Por ello tomamos un casette DDS-2 y lo colocamos en la unidad de cinta. Como operaremos "a pelo", debemos tener cuidado de lo que hacemos. Tal es el motivo por el cual usamos una cinta virgen para practicar.

Para acceder a los datos en la cinta, debemos manipular el cabezal de la unidad de lectura. La figura 2 nos muestra la posición inicial del cabezal. Suponiendo que  que nuestro dispositivo de cinta sea st0, empleamos el dispositivo /dev/st0.

Primero, verificamos la posición de la cinta con el comnado status mt (la variable -f /dev/st0 especifica el archivo de dispositivo de la unidad de cinta. No es necesario poner dicha variable si ya especificamos nuestra variable de entorno TAPE.

mt -f /dev/st0 status

Figura 2: El cabezal al comienzo de la cinta.

El sistema debería devolvernos algo así (en el ejemplo, una unidad de cinta DAT):

SCSI 2 tape drive:
File number=0, block number=0, partition=0.
Tape block size 0 bytes. Density code 0x13 (DDS (61000 bpi)).
Soft error count since last status=0
General status bits on (41010000):
 BOT ONLINE IM_REP_EN


Esto nos representa mucha información:

    El número de archivo actual es 0.
    El número de bloque actual es 0, de modo que el cabezal está al comienzo del archivo.
    Debemos ignorar la partición, sólo las unidades de tipo moderno los soportan y esta unidad de cinta tipo DDS-2 no lo hace.
    El tamaño de bloque es 0, lo que en realidad significa que la unidad de cinta no tienen un tamaño de bloque fijo específico.
    El código de densidad especifica cuánta información puede caber en la cinta.
    El soft error count es la cantidad de errores recuperables que han ocurrido desde la última vez que ejecutamos mt status.
    Los status bits explican más acerca del estado de la cinta y de la unidad de cinta. BOT significa "comienzo de cinta", y ONLINE reporta que la unidad de cinta está lista y cargada.

Creando Archivadas en una cinta
Es difícil entender cómo una unidad de cinta opera pasando a través de varios ficheros en una cinta cualquiera de una colección de respaldos. Por lo tanto, para explicar el proceso de búsqueda en una cinta, lo imaginaremos creando algunas archivadas por nosotros mismos, antes de especificar cómo descargar sus datos. Una vez que hayamos comprendido esto, seremos capaces de avanzar y rebobinar la cinta sin grandes confusiones que nos hagan preocupar por la pérdida de datos. Seremos entonces verdaderos peronistas de pelo en pecho.

Imaginemos que queremos crear tres archivadas en la cinta magnética. Específicamente, usaremos tar para encadenar todos los ficheros que se encuentran en los directorios /lib, /boot y /dev de nuestro sistema GNU con Linux. Estos directorios son algunos de los importantes de sistema y los usaremos como ejemplos.

    Colocamos un cartucho de cinta en la unidad (una casette DDS-2 virgen o cuyo contenido no nos interese)-
    A diferencia del caso anterior, nos aseguramos que nuestra variable de entorno TAPE esté configurada como un dispositivo no-rewind (sin rebobinado), en este caso podremos emplear /dev/nst0.
    Ejecutamos el comando mt status para verificar que la cinta está en la unidad y que la variable TAPE está configurada.
    Cambiamos al directorio raíz de nuestro sistema de archivos con el comando cd /.
    Creamos una archivada tar del primer archivo en la cinta (el directorio /lib) por medio del comando: tar zcv lib
    Ejecutamos el comando mt status. La salida debería ser algo similar a esto, indicando que la cinta está en el siguiente archivo (archivo 1):

    SCSI 2 tape drive:
    File number=1, block number=0, partition=0.
    Tape block size 0 bytes. Density code 0x13 (DDS (61000 bpi)).
    Soft error count since last status=0
    General status bits on (81010000):
     EOF ONLINE IM_REP_EN

    Luego creamos una archivada de nuestro directorio /boot con el comando: tar zcv boot
    Creamos una archiva da nuestro directorio /dev con el comando: tar zcv dev


En cuanto a la performance, las viejas unidades DDS-2 transmiten unos 0,360MB/s sin compresión, y el doble con compresión 2:1. Esto es unos 1.23GB/h, y tarda unas 3h10m minutos para almacenar los 4GB del casette (sin compresión). Al utilizar compresión, la capacidad se duplica a 8GB, pero se tarda el mismo tiempo en grabar o leer.

Los contenidos de la cinta ahora deberían figurar así:

Figura 3: La cinta contiene tres archivadas, y el cabezal estar al comienzo de una nueva archivada.
Leer desde la cinta
Ahora que tenemos algunos archivos en la cinta, podremos intentar leerlos:

    Nos posicionamos al directorio /tmp para evitar cualquier accidente (en caso de que accidentalmente tipeásemos x en vez de t en uno de los pasos que siguen). cd /tmp
    Rebobinamos la cinta: mt rewind
    Verificamos el primer archivo en la cinta, la archivada de /lib: tar ztv
    Debería aparecer un largo listado de los ficheros en la archivada que están duplicados de nuestra carpeta /lib.
    Ejecutamos mt status. Debería devolvernos algo como:

    SCSI 2 tape drive:
    File number=0, block number=4557, partition=0.
    Tape block size 0 bytes. Density code 0x13 (DDS (61000 bpi)).
    Soft error count since last status=0
    General status bits on (1010000):
     ONLINE IM_REP_EN

La cinta aún está en la Archivada 0, el primer archivo en la cinta. ¿Cómo sucede esto? La respuesta es que tan pronto como termina su lectura, el comando tar se detiende donde está en la cinta, porque uno podría querer hacer algo loco (como cortar el archivo). El cabezal quedó posicionado al final de la Archivada 0 (notemos el contador de número de bloque, en la devolución del comando mt status).

Figura 4: El cabezal está al final de la Archivada 0.

La consecuencia mas importante de esta nueva posición de la cinta es que otro comando tar ztv no accedería al archivo siguiente en la cinta, porque la cabeza no está al comienzo del nuevo archivo, sino que se encuentra al comienzo de la marca de archivo. Para avanzar la cinta hacia adelante hasta el siguiente archivo (que en este caso, sería la Archivada 1 formada por el directorio /boot), usamos el siguiente comando:

mt fsf

Este comando mueve la cinta de manera que el cabezal quede al final de la marca de archivo (al comienzo de la archivada 1 /boot), como se muestra en la figura:

Figura 5: El cabezal está al comienzo de la archivada 1.
13.6.4 Extraer Archivadas
Para extraer archivadas desde la cinta, necesitamos reemplazar la variable t que aparecía en los comandos de la sección anterior, con la variable xp, de modo que queden así:

tar zxpv

Como es usual, debemos revisar bien nuestro directorio de trabajo antes de extraer cualquier archivo. Os recomiendo siempre utilizar el directorio /tmp para estos menesteres, pues en cualquier situación podremos reever qué leímos en tal directorio... Hombre precavido vale por dos.
Avanzando la cinta y haciendo respaldos
Para avanzar la cinta hasta la siguiente archivada ingresamos:

mt fsf

También existe un comando para rebobinar la cinta:

mt bsf

Sin embargo, es importante comprender que este comando rebobina la cinta hasta el final del archivo previo, o sea, hasta el comienzo de la siguiente marca de archivo que vea el cabezal.

Digamos que estamos al comienzo del archivo 1, como se muestra en la figura 4. Al ejecutar mt bsf, quedará como se muestra en la figura 5. Si en tal caso ejecutamos un mt status, el número de archivo debería ser 0 con un número de bloque de -1 (pues el controlador no puede calcular el largo del archivo por si mismo). En general, para volver al comienzo del archivo previo cuando estamos al comienzo de un archivo, debemos rebobinar dos veces y luego avanzar una vez el cabezal. Gracias a que la mayoría de los comandos de movimento de cinta mt soportan un conteo opcional (por ejemplo, un 2 en este caso), podremos ejecutar la siguiente secuencia:

mt bsf 2
mt fsf

Aún así debemos tomar otra consideración, porque la cinta en este ejemplo ya estaba al comienzo del archivo 1. Al correr mt bsf 2, se intentará rebobinar la cinta dos marcas de archivos. Como el principio de la cinta no tiene una marca de archivo, chocará con el inicio de la misma, produciendo un Error de entrada/salida (I/O error). El comando mt fsf subsiguiente adelantará nuevamente la cinta al archivo 1, esquivando el archivo 0. Si queremos volver al Archivo 0, debemos siempre rebobinar la cinta, con el comando:

mt rewind

Algunas modelos de unidades de cinta son capaces de detectar cuál es la última archivada con datos. En tal caso podríamos avanzar rápidamente la cinta hasta que el cabezal esté en dicho lugar, ingresando:

mt -f /dev/nst0 eod

En nuestro caso, el cabezal volvería a quedar como el la Figura 3...

En resúmen, debemos prestar gran atención a la posición del cabezal con respecto a las marcas de archivo, y elegir el comando apropiado. Si todo esto parece ridículo, probablemente podremos utilizar el direccionador a un n específico, que siempre funcionará (aunque será más lento).

mt rewind
mt fsf archivo

Para expulsar la cinta:

mt offline
Variables del comando mt y estatus
En resúmen, estas son las variables más comunes del mt:

    mt status Nos devuelve el reporte de estado.
    mt fsf n Avanza hasta el comeinzo del primer bloque del archivo siguiente. El parámetro n es opcional, si está especificado avanza n archivadas en lugar de solo una.
    mt bsf n Rebobina hasta el final del archivo previo. La n es un contador opcional de archivos.
    mt rewind Rebobina la cinta.
    mt offline Rebobina la cinta, y luego la prepara para su remoción. En algunas unidades de cinta, la unidad de cinta eyecta el cartucho. En otros, destraba la unidad de modo que la podemos sacar a mano.
    mt retension Avanza la cinta hasta el final y luego la rebobina. Esto a veces ayuda con las cintas que tienen problemas de lectura.
    mt erase Borra toda la cintas. Usualmente esto lleva un largo tiempo.

Hay una gran variedad de variables para el comando, listados en su página de manual, pero normalmente no son muy útiles a no ser que intentemos extraer bloques desde el centro de una archivada o que busquemos opciones específicas para una unidad de cintas SCSI.

Al ejecutar mt status se nos devolverá una serie de códigos de bit de estado (como el código BOT explicado anteriormente. Aquí hay algunos de ellos:

    ONLINE La unidad está lista, con una cinta cargada.
    DR_OPEN La unidad está vacía (posiblemente con la puerta abierta).
    BOT La posición del cabezal es al principio de la cinta.
    EOF La posición del cabezal es la de comienzo de un archivo (al final de la marca de archivo).. Este es un código algo confuso, porque se puede confundir con el de "final de archivo".
    EOT El cabezal está al final de la cinta.
    EOD El cabezal está al final de la parte grabada de la cinta.
    WR_PROT La cinta actual está protegida contra escritura.

Comandos para respaldar a cinta

El siguiente es un resumen de los comandos necesarios para controlar una unidad de cinta con el propósito de respaldar/restaurar datos.

En estos ejemplos se utiliza siempre la variable -f /dev/st0 para aclararle al sistema que en los ejemplos, tal dispositivo es nuestra unidad de cinta. Naturalmente debemos cambiarlo si nuestro dispositivo es distinto. Asimismo, si ya configuramos la variable de entorno TAPE como se indicó en el paso anterior, podremos omitir "-f /dev/st0" del comando, o lo que corresponda a nuestro dispositivo.


Para rebobinar la cinta:

mt -f /dev/st0 rewind 

Para respadar en la cinta los directorios /www del servidor web Apache y /home con el comando tar (z: usa compresión Gzip):

tar -czf /dev/st0 /www /home

Para saber en qué bloque estamos con el comando mt:

mt -f /dev/st0 tell

Para mostrar una lista de archivos en la unidad de cinta:

tar -tzf /dev/st0

Para restaurar el directorio /www desde la cinta:

cd /
mt -f /dev/st0 rewind
tar -xzf /dev/st0 www

Para descargar el cartucho de cinta:

mt -f /dev/st0 offline

Para mostrar la información de status de la unidad de cinta:

mt -f /dev/st0 status

Para borrar el cartucho de cinta:

mt -f /dev/st0 erase

Podremos avanzar o rebobinar la cinta con el comando mt:

a) ir al final de los datos:
mt -f /dev/st0 eod

b) Ir a la grabación previa:
mt -f /dev/nst0 bsfm 1

c) Avanzar la cinta:
mt -f /dev/nst0 fsf 1


Ejemplo de Respaldos en múltiples cartuchos de cinta en Linux
Para respaldar a múltiples cintas empleamos el siguiente comando (por ejemplo, para respaldar nuestra carpeta de usuario /home):

tar -clpMzvf /dev/st0 /home 

Para comparar el respaldo de cintas, ingresamos:

tar -dlpMzvf /dev/st0 /home

Para restaurar los datos desde la cinta, en caso de pérdida de datos o fallo de disco duro:

tar -xlpMzvf /dev/st0 /home

...donde,

d: encuentra diferencias entre la archivada y el sistema de archivos.
x: extra los ficheros desde una archivada
l: lista los contenidos de un archivo
p: ignora umask cuando extrae los archivos
M: Crea/lista/extrae un archivo multivolúmen (múltiples cintas).
z: comprime el respaldo enpleando gzip
v: Lista detalladamente los archivos siendo comprimidos,
f /dev/st0 es el dispositivo de cinta
/home: Respalda nuestra carpeta de usuario (puede ser cualquier otra).
Acceso directo a los Archivos de la cinta
tar no es el único comando capaz de escribir archivadas a la cinta. Muchas veces podremos no saber qué hay en la cinta, e incluso si sabemos, podríamos querer copiar un archivo desde la cinta al sistema de archivos local para un análisis más profundo (y mas simple). Para ello podremos emplear al viejo y peludo dd, por ejemplo:

dd if=/dev/nst0 of=archivo_de_salida

Esto a veces podría fallar: podríamos recibir un error de E/S debido a que no especificamos el tamaño de bloque correcto. ¿Por qué? La respuesta requiere ciertas explicaciones. Cuando trabajamos con cintas, a menudo necesitaremos conocer el tamaño de bloque de la cinta. Las aplicaciones tienden a escribir en la cinta en un tamaño de bloque predeterminado, y muchas unidades de cinta no permitirán la lectura desde la cinta a no ser que especificamos correctamente el tamaño de bloque. Esto casi nunca es un problema, porque normalmente escribimos y leemos con el mismo programa. Sin embargo, si queremos usar dd para obtener acceso directo a los archivos de la cinta, podríamos necesitar especificar el tamaño de bloque manualmente.

El programa que escribe el archivo en la cinta normalmente es quien determina el tamaño de bloque a utilizar. En el caso del programa tar, el tamaño de bloque por defecto es de 10KB (especificado en dd como 10k). Como en el programa dd el tamaño bloque por defecto es diferente (usa normalmente 512 bytes), habremos de alterar su parámetro bs ("tamaño de bloque", block size) para que se adapte al contenido hecho con tar en la cinta. Para ello usaríamos:
dd bs=10k if=/dev/nst0 of=archivo_de_salida

Os listaré los tamaño de bloques comunes para diferentes programas utilizados para el copiado o volcado de datos:
Archivador
	
Tamaño de bloque
	
Parámetro bs
tar
	
10KB (20 x 512 bytes)
	
bs=10k
dd
	
512 bytes
	
bs=512
cpio
	
512 bytes
	
bs=512
dump
	
10KB (20 x 512 bytes)
	
bs=10k
Amanda
	
32KB
	
bs=32k

	Nota: 	
A diferencia de tar, dd avanza el cabezal hasta el siguiente archivo en la cinta, en vez de sólo moverlo hasta la marca del archivo.

	

	
Las cintas LTO son mucho más simples de operar, pues incluyen un Sistema de Archivos para Cintas Lineales (LTFS) lo que las hace más cómodas para buscar archivos específicos. Continen una tabla de alocación, y por lo tanto operan como cualquier partición montada en nuestro sistema de archivos.