miércoles, 27 de septiembre de 2017

Medios de Almacenamiento

En capítulos anteriores hemos visto como manejar datos a nivel de archivos. En este capítulo, consideraremos los datos a nivel de dispositivo. Linux tiene capacidades sorprendentes para soportar dispositivos de almacenamiento, desde almacenamiento físico, como discos duros, a dispositivos de almacenamiento virtuales como RAID (Redundant Array of Independent Disk - Conjunto redundante de discos independientes) y LVM (Logical Volume Manager – Administrador de volúmenes lógicos).

Sin embargo, como esto no es un libro sobre administración de sistemas, no trataremos de cubrir este aspecto en profundidad. Lo que trataremos de hacer es presentar algunos de los conceptos y comandos que se usan para manejar dispositivos de almacenamiento.

Para realizar los ejercicios de este capítulo, usaremos una unidad flash USB, un disco CD-RW (para sistemas equipados con un grabador de CD-ROM) y un disquete (de nuevo, si el sistema está equipado).

Veremos los siguientes comandos:

  • mount – Monta un sistema de ficheros
  • umount – Desmonta un sistema de ficheros
  • fsck – Chequea y repara un sistema de ficheros
  • fdisk – Manipulador de tablas de particiones
  • mkfs – Crea un sistema de ficheros
  • fdformat – Formatea un disquete
  • dd – Escribe datos orientados a bloques directamente en un dispositivos
  • genisoimage (mkisofs) – Crea un archivo de imagen ISO 9660
  • wodim (cdrecord) – Escribe datos en una unidad de almacenamiento óptico
  • md5sum – Calcula un checksum MD5
Montando y desmontando dispositivos de almacenamiento

Avances recientes en el escritorio de Linux han hecho la gestión de los dispositivos de almacenamiento extremadamente sencillo para los usuarios de escritorio. La mayoría de las veces, conectamos un dispositivo a nuestro sistema y “simplemente funciona”. Volviendo a los viejos tiempos (digamos, 2004), ésto había que hacerlo manualmente. En sistemas sin escritorio (p.ej.: Servidores) esto sigue siendo en gran parte un procedimiento manual ya que los servidores tienen, a menudo, almacenamientos extremos que necesitan configuraciones complejas.

El primer paso en la gestión de un dispositivo de almacenamiento es conectar el dispositivo en el árbol de sistema de archivos. Este proceso, llamado montaje, permite al dispositivo participar en el sistema operativo. Como vimos en el Capítulo 2, los sistemas operativos como-Unix, por ejemplo Linux, mantienen un único árbol de sistema de archivos con los dispositivos conectados en varios puntos. Ésto contrasta con otros sistemas operativos como MS-DOS y Windows que mantienen árboles de sistemas de archivos separados para cada dispositivo (por ejemplo C:\, D:\, etc.).

Un archivo llamado /etc/fstab lista los dispositivos (típicamente particiones de disco duro) que se montan en el arranque del sistema. Aquí tenemos un ejemplo de archivo /etc/fstab de un sistema Fedora 7:


LABEL=/12       /          ext4    defaults       1 1
LABEL=/home     /home      ext4    defaults       1 2
LABEL=/boot     /boot      ext4    defaults       1 2
tmpfs           /dev/shm   tmpfs   defaults       0 0
devpts          /dev/pts   devpts  gid=5,mode=620 0 0
sysfs           /sys       sysfs   defaults       0 0
proc            /proc      proc    defaults       0 0
LABEL=SWAP-sda3 swap       swap    defaults       0 0

La mayoría de los sistemas de archivos listados en el ejemplo son virtuales y no se aplican a nuestro tema. Para nuestros propósitos, los interesantes son los tres primeros:


LABEL=/12       /          ext4    defaults       1 1
LABEL=/home     /home      ext4    defaults       1 2
LABEL=/boot     /boot      ext4    defaults       1 2


Son las particiones del disco duro. Cada línea del archivo consiste en seis campos, como sigue:

Campos de /etc/fstab

1 Dispositivo
Tradicionalmente, este campo contiene el nombre real de un archivo de dispositivo asociado con el dispositivo físico, como /dev/hda1 (la primera partición del dispositivo maestro en el primer canal IDE). Pero con los ordenadores de hoy, que tienen muchos dispositivos que son plug & play (como unidades USB), muchas distribuciones Linux modernas asocian un dispositivo con una etiqueta de texto en su lugar. Esta etiqueta (que se añade al medio de almacenamiento cuando se formatea) la lee el sistema operativo cuando el dispositivo es conectado al sistema. De esta forma, no importa que archivo de dispositivo se le asigna al dispositivo físico real, puede permanecer correctamente indefinido.

2 Punto de montaje
El directorio donde el dispositivo es conectado dentro del árbol del sistema de archivos.

3 Tipo de sistema de archivos
Linux permite montar muchos tipos de sistemas de archivos. La mayoría de los sistemas de archivos nativos en Linux son ext3, pero soporta muchos más, como FAT16 (msdos), FAT32 (vfat), NTFS (ntfs), CD-ROM (iso9660), etc.

4 Opciones
Los sistemas de archivos pueden montarse con varias opciones. Es posible, por ejemplo, montar sistemas de archivos como sólo-lectura, o prevenir que los programas se ejecuten desde él (una característica de seguridad útil para medios movibles).

5 Frecuencia
Un único número que especifica sí y cuando un sistema de archivos va a realizar una copia de seguridad con el comando dump.

6 Orden
Un único número que especifica en qué orden va a ser chequeado el sistema de archivos con el comando fsck.



Viendo una lista de los sistemas de archivos montados

El comando mount se usa para montar sistemas de archivos. Introducir el comando sin argumentos mostrará una lista de los sistemas de archivos actualmente montados:

[me@linuxbox ~]$ mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda5 on /home type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/dev/sdd1 on /media/disk type vfat (rw,nosuid,nodev,noatime,
uhelper=hal,uid=500,utf8,shortname=lower)
twin4:/musicbox on /misc/musicbox type nfs4 (rw,addr=192.168.1.4)

El formato del listado es: dispositivo on punto_de_montaje type tipo_sistema_archivos (opciones).

Por ejemplo, la primera línea muestra que el dispositivo /dev/sda2 está montado como la raíz del sistema de archivos, en tipo ext3, y que es tanto legible como modificable (la opción “rw”). Este listado también tiene dos entradas interesantes al final de la lista. La ante penúltima entrada muestra una tarjeta de memoria SD de 2 gibabytes montada en /media/disk, y la última entrada es un disco de red montado en /misc/musicbox.

Para nuestro primer experimento, trabajaremos con un CD-ROM. Primero, veamos el sistema antes de insertar el CD-ROM:

[me@linuxbox ~]$ mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

El listado es de un sistema CentOS 5, que usa LVM (Logical Volume Manager) para crear su sistema de archivos raíz. Como muchas distribuciones Linux modernas, este sistema tratará de montar automáticamente el CD-ROM después de ser insertado. Después de insertar el disco, veremos lo siguiente:

[me@linuxbox ~]$ mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/hdc on /media/live-1.0.10-8 type iso9660 (ro,noexec,nosuid,
nodev,uid=500)

Tras insertar el disco, vemos la misma lista de antes con una entrada adicional. Al final de la lista vemos que el CD-ROM (que es el dispositivo /dev/hdc en este sistema) ha sido montado en /media/live-1.0.10-8, y es tipo iso9660 (un CD-ROM). Para el propósito de nuestro experimento, nos interesa el nombre del dispositivo. Cuando hagas este experimento tú mismo, el nombre del dispositivo será probablemente distinto.

Advertencia: En los ejemplos siguientes, es de vital importancia que prestes mucha atención a los nombres reales de los dispositivos en uso en tu sistema y ¡no usar los nombres utilizados en este texto!

Ten en cuenta también que los CDs de audio no son lo mismo que los CD-ROMs. Los CDs de audio no contienen sistemas de archivos y por lo tanto no pueden ser montados en la forma normal.

Ahora que tenemos el nombre de dispositivo de la unidad de CD-ROM, desmontemos el disco y lo montaremos de nuevo en otra localización en el árbol del sistema de archivos. Para hacerlo, nos haremos superusuario (usando el comando apropiado para nuestro sistema) y desmontamos el disco con el comando umount (fíjate en el deletreo):

 [me@linuxbox ~]$ su -
 Password:
 [root@linuxbox ~]# umount /dev/hdc

El siguiente paso es crear un nuevo punto de montaje para el disco. Un punto de montaje es simplemente un directorio en algún lugar del árbol del sistema de archivos. No tiene nada de especial. No tiene por qué ser un directorio vacío, pero si montas un dispositivo en un directorio no vacío, no podrás ver el contenido previo del directorio a no ser que desmontes el dispositivo. Para nuestro propósito, crearemos un nuevo directorio:

 [root@linuxbox ~]# mkdir /mnt/cdrom

Finalmente, montamos el CD-ROM en un nuevo punto de montaje. La opción -t se usa para especificar el tipo de sistema de archivos:

 [root@linuxbox ~]# mount -t iso9660 /dev/hdc /mnt/cdrom
Después de ésto, podemos examinar el contenido del CD-ROM via el nuevo punto de montaje:

 [root@linuxbox ~]# cd /mnt/cdrom
 [root@linuxbox cdrom]# ls

Fíjate que ocurre cuando tratarmos de desmontar el CD-ROM:

 [root@linuxbox cdrom]# umount /dev/hdc
 umount: /mnt/cdrom: device is busy

¿Por qué pasa ésto? La razón es que no podemos desmontar un dispositivo si está siendo usado por alguien o por algún proceso. En este caso, hemos cambiado nuestro directorio de trabajo al punto de montaje del CD-ROM, lo que causa que el dispositivo esté ocupado. Podemos remediar el problema fácilmente cambiando el directorio de trabajo a otro que no sea el punto de montaje:

 [root@linuxbox cdrom]# cd
 [root@linuxbox ~]# umount /dev/hdc

Ahora el dispositivo se desmonta con éxito.


Por qué es importante desmontar

Si vemos la salida del comando free, que muestra estadísticas sobre el uso de memoria, verás una estadística llamada “buffers”. Los sistemas de cómputo está diseñados para ir lo más rápido posible. Uno de los impedimentos a la velocidad del sistema son los dispositivos lentos. Las impresoras son un buen ejemplo. Incluso la impresora más rápida es extremadamente lenta para los estándares de los ordenadores. Un ordenador sería muy lento si tuviera que parar y esperar a que la impresora termine de imprimir una página. En los primeros días de los Pcs (antes de la multitarea), esto era un problema real. Si estabas trabajando en una hoja de cálculo o un documento de texto, el ordenador se paraba y se volvía indisponible cada vez que imprimías. El ordenador enviaba los datos a la impresora tan rápido como la impresora podía aceptarlos, pero era muy lento ya que las impresoras no imprimen muy rápido. Éste problema se solucionó con la llegada del buffer de impresora, un dispositivo con memoria RAM que podía situarse entre el ordenador y la impresora. Con el buffer de impresora instalado, el ordenador podía enviar la salida de la impresora al buffer y era rápidamente almacenado en la rápida RAM para que el ordenador pudiera volver al trabajo sin esperar. Mientras tanto, el buffer de impresora iba enviando la cola de datos a la impresora lentamente desde la memoria del buffer a la velocidad a que la impresora podía aceptarlos.

La idea del buffer se usa abundantemente en ordenadores para hacerlos más rápidos. Evitan que ocasionalmente leer o escribir datos de o hacia dispositivos lentos impidan la velocidad del sistema. Los sistemas operativos almacenan en memoria datos que han sido leídos, y tienen que ser escritos en dispositivos de almacenamiento por el máximo tiempo posible antes que tener que interactuar con el dispositivo lento. En un sistema Linux por ejemplo, notarás que el sistema parece tener la memoria llena cuanto más tiempo se usa. Esto no significa que Linux esté “utilizando” toda la memoria, significa que Linux está sacando beneficio de toda la memoria disponible para hacer todo el buffering que pueda.

Este buffer permite que escribir en dispositivos de almacenamiento se haga rápidamente, porque la escritura en el dispositivo físico ha sido pospuesto a un tiempo futuro. Al mismo tiempo, los datos destinados al dispositivo se van acumulando en la memoria. De vez en cuando, el sistema operativo escribirá estos datos en el dispositivo físico.

Desmontar un dispositivo implica escribir todos los datos restantes en el dispositivo para que pueda ser retirado con seguridad. Si se retira el dispositivo sin desmontarlo primero, existe la posibilidad que no todos los datos destinados al dispositivo hallan sido transferidos. En algunos casos, estos datos pueden incluir actualizaciones vitales de directorios, que causará una corrupción del sistema de archivos, una de las peores cosas que le puede ocurrir a un ordenador.


Determinando los nombres de los dispositivos

A veces es difícil determinar el nombre de un dispositivo. En los viejos tiempos, no era muy difícil. Un dispositivo siempre estaba en el mismo sitio y no cambiaba. Los sistemas como-Unix siguen así. Volviendo a cuando Unix se desarrolló, “cambiar una unidad de disco” implicaba usar un montacargas para retirar un dispositivo del tamaño de una lavadora de la habitación del ordenador. En tiempos recientes, la configuración del hardware de escritorio se ha vuelto algo más dinámica y Linux ha evolucionado para hacerse más flexible que sus antepasados.

En los ejemplos siguientes sacaremos ventaja de la capacidad de los escritorios modernos de Linux para montar los dispositivos “automágicamente” y determinar el nombre después. Pero ¿qué pasa si estamos administrando un servidor o algún otro entorno donde esto no ocurre? ¿cómo podemos resolverlo?

Primero, veamos cómo el sistema nombra los dispositivos. Si listamos el contenido del directorio /dev (donde viven todos los dispositivos), podemos ver que hay montones y montones de dispositivos:

 [me@linuxbox ~]$ ls /dev

El contenido del listado revela algunos patrones en el nombrado de los dispositivos. Aquí tenemos unos pocos:

Nombres de los dispositivos de almacenamiento en Linux

/dev/fd* 

Disquetes

/dev/hd* 
Discos IDE (PATA) en sistemas antiguos. Las placas báse típicas contienen dos conectores IDE o canales, cada una con un cable con dos puntos de conexión para unidades. La primera unidad del cable se llama dispositivo maestro y la segunda se llama dispositivo esclavo. Los nombres de dispositivos se ordenan de tal forma que /dev/hda se refiere al dispositivo maestro del primer canal, /dev/hdb es el dispositivo esclavo del primer canal; /dev/hdc, el dispositivo maestro del segundo canal, etc. Un dígito al final indica el número de partición en el dispositivo. Por ejemplo, /dev/hda1 se refiere a la primera partición del primer disco duro del sistema mientras que /dev/hda se refiere al disco completo.

/dev/lp* 
Impresoras

/dev/sd* 
Discos SCSI. En sistemas Linux recientes, el kernel trata todos los dispositivos que sirven de disco (incluyendo discos duros PATA/SATA, unidades flash, dispositivos de almacenamiento USB como reproductores de música portátiles y cámaras digitales) como discos SCSI. El resto del sistema de nombres es similar al antiguo esquema de nombres /dev/hd* descrito arriba.

/dev/sr* 
Discos ópticos (lectores y grabadores de CD/DVD).

Además, vemos a menudo enlaces simbólicos como /dev/cdrom, /dev/dvd y /dev/floppy que apuntan a los archivos de los dispositivos reales, ofrecidos como un servicio.

Si estás trabajando en un sistema que no monta los dispositivos removibles automáticamente, puedes usar la siguiente técnica para determinar cómo son nombrados los dispositivos removibles cuando son conectados. Primero, arranca una vista en tiempo real del archivo /var/log/messages o /var/log/syslog (puedes necesitar privilegios de superusuario para ello):

 [me@linuxbox ~]$ sudo tail -f /var/log/messages

Las últimas líneas del archivo se mostrarán y luego se pausarán. A continuación, conecta el dispositivo removible. En este ejemplo, usaremos una memoria flash de 16MB. Casi inmediatamente, el kernel detectará el dispositivo y lo probará:

Jul 23 10:07:53 linuxbox kernel: usb 3-2: new full speed USB device
using uhci_hcd and address 2
Jul 23 10:07:53 linuxbox kernel: usb 3-2: configuration #1 chosen
from 1 choice
Jul 23 10:07:53 linuxbox kernel: scsi3 : SCSI emulation for USB Mass
Storage devices
Jul 23 10:07:58 linuxbox kernel: scsi scan: INQUIRY result too short
(5), using 36
Jul 23 10:07:58 linuxbox kernel: scsi 3:0:0:0: Direct-Access Easy
Disk 1.00 PQ: 0 ANSI: 2
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] 31263 512-byte
hardware sectors (16 MB)
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Write Protect is
off
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Assuming drive
cache: write through
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] 31263 512-byte
hardware sectors (16 MB)
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Write Protect is
off
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Assuming drive
cache: write through
Jul 23 10:07:59 linuxbox kernel: sdb: sdb1
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Attached SCSI
removable disk
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: Attached scsi generic
sg3 type 0

Después de que la pantalla se pare de nuevo, pulsa Ctrl-C para volver al prompt. Las partes interesantes de la salida son las referencias repetidas a “[sdb]” que coinciden con nuestra expectativa de un nombre de dispositivo de un disco SCSI. Sabiendo esto, dos líneas pasan a ser particularmente iluminadoras:

 Jul 23 10:07:59 linuxbox kernel: sdb: sdb1
 Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Attached SCSI

 removable disk

Ésto nos dice que el nombre del dispositivo es /dev/sdb para el dispositivo completo y /dev/sdb1 para la primera partición del dispositivo. Como hemos visto, trabajar con Linux está lleno de ¡Interesante trabajo de detective!

Consejo: usar la técnica tail -f /var/log/messages es una gran forma de ver que está haciendo el sistema en el corto plazo.

Con nuestro nombre de dispositivo en la mano, podemos montar la unidad flash:

[me@linuxbox ~]$ sudo mkdir /mnt/flash
[me@linuxbox ~]$ sudo mount /dev/sdb1 /mnt/flash
[me@linuxbox ~]$ df
Filesystem  1K-blocks      Used Available Use% Mounted on
/dev/sda2    15115452   5186944   9775164   35% /
/dev/sda5    59631908  31777376  24776480   57% /home
/dev/sda1      147764     17277    122858   13% /boot
tmpfs          776808         0    776808    0% /dev/shm
/dev/sdb1       15560         0     15560    0% /mnt/flash

El nombre del dispositivo permanecerá igual mientras que permanezca físicamente conectado al ordenador y éste no sea reiniciado.

Creando un nuevo sistema de archivos

Digamos que queremos formatear la unidad flash con un sistema de archivos nativo de Linux, en lugar del sistema FAT32 que tiene ahora. Ésto implica dos pasos: 1. (opcional) crear una nueva tabla de particiones si la existente no es de nuestro gusto, y 2. crear un sistema de archivos nuevo y vacío en el disco.

¡Advertencia! En el siguiente ejercicio, vamos a formatear una unidad flash. ¡Usa una unidad que no contenga nada que necesites porque será borrada! De nuevo, asegúrate completamente de que estás especificando el nombre de dispositivo correcto en nuestro sistema, no el que se muestra en el texto. ¡Incumplir esta medida puede provocar el formateo (osea borrado) del disco equivocado!


Manipulando particiones con fdisk

El programa fdisk nos permite interactuar directamente con los dispositivos que se comportan como discos (como discos duros o unidades flash) a muy bajo nivel. Con esta herramienta podemos editar, borrar y crear particiones en el dispositivo. Para trabajar con nuestra unidad flash, tenemos primero que desmontarla (si es necesario) y luego invocar el programa fdisk como sigue:

 [me@linuxbox ~]$ sudo umount /dev/sdb1
 [me@linuxbox ~]$ sudo fdisk /dev/sdb

Fíjate que tenemos que especificar el dispositivo en términos del dispositivo completo, no por un número de partición. Después de que el programa arranque, veremos el siguiente prompt:

 Command (m for help):

Introducir una “m” mostrará el menú del programa:

Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)



 Command (m for help):

La primera cosa que queremos hacer es examinar la tabla de particiones existente. Lo hacemos introduciendo “p” para imprimir la tabla de particiones del dispositivo:

 Command (m for help): p

 Disk /dev/sdb: 16 MB, 16006656 bytes
 1 heads, 31 sectors/track, 1008 cylinders
 Units = cylinders of 31 * 512 = 15872 bytes
    Device Boot Start End Blocks Id System
 /dev/sdb1 2 1008 15608+ b W95 FAT32

En este ejemplo, vemos un dispositivo de 16 MB con una única partición (1) que usa 1006 de los 1008 cilindros disponibles en el dispositivo. La partición está identificada como una partición FAT32 de Windows 95. Algunos programas usarán este identificador para limitar el tipo de operaciones que pueden hacerse en el disco, pero la mayoría de las veces no es crítico cambiarlo. Sin embargo, a modo de demostración, lo cambiaremos para indicar una partición Linux. Para hacerlo, primero debemos encontrar que ID se usa para identificar una partición Linux. En la lista anterior vemos que se usa el ID “b” para especificar la partición existente. Para ver una lista de los tipos de partición disponibles, volveremos al menú del programa. Allí podemos ver la siguiente opción:

 l    list known partition types

Si introducimos una “l” en el prompt, se muestra una gran lista de los tipos posibles. Entre ellas vemos “b” para nuestro tipo de partición existente y “83” para Linux.
Volviendo al menú, vemos la opción de cambiar la ID de una partición:

 t    change a partition's system id

Introducimos “t” en el prompt y luego la nueva ID:

 Command (m for help): t
 Selected partition 1
 Hex code (type L to list codes): 83
 Changed system type of partition 1 to 83 (Linux)

Esto completa todos los cambios que necesitamos hacer. Hasta ahora, el dispositivo no ha sido tocado (todos los cambios han sido almacenados en la memoria, no en el dispositivo físico), así que escribiremos la tabla de particiones modificada en el dispositivo y saldremos. Para hacerlo, introducimos “w” en el prompt:

 Command (m for help): w
 The partition table has been altered!

 Calling ioctl() to re-read partition table.

 WARNING: If you have created or modified any DOS 6.x
 partitions, please see the fdisk manual page for additional
 information.
 Syncing disks.
 [me@linuxbox ~]$

Si hubieramos decidido dejar el servicio inalterado, podríamos haber introducido “q” en el prompt, que habría salido del programa sin guardar los cambios. Podemos ignorar tranquilamente el ominoso sonido del mensaje de advertencia.


Creando un nuevo sistema de archivos con mkfs

Con nuestra edición de particiones hecha (más sencillamente de lo que parecía) es hora de crear un nuevo sistema de archivos en nuestra unidad flash. Para hacerlo, usaremos mkfs (abreviatura de “make file system” - “fabricar sistema de archivos”), que puede crear sistemas de archivos en una variedad de formatos. Para crear un sistema de archivos ext3 en el dispositivo usamos la opción “-t” para especificar el tipo de sistema “ext3”, seguido por el nombre del dispositivo incluyendo la partición que queremos formatear:

[me@linuxbox ~]$ sudo mkfs -t ext3 /dev/sdb1
mke2fs 1.40.2 (12-Jul-2007)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
3904 inodes, 15608 blocks
780 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=15990784
2 block groups
8192 blocks per group, 8192 fragments per group
1952 inodes per group
Superblock backups stored on blocks:
8193

Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[me@linuxbox ~]$

El programa mostrará un montón de información cuando elegimos el tipo de sistema de archivos ext3. Para reformatear el dispositivos a su sistema de archivos original FAT32, especifica “vfat” como el tipo de sistema de archivos:

 [me@linuxbox ~]$ sudo mkfs -t vfat /dev/sdb1

Este proceso de particionado y formateado puede usarse siempre que añadamos al sistema sistemas de almacenamiento adicionales. Aunque hemos trabajado con una diminuta unidad flash, el mismo proceso puede aplicarse a discos duros internos y otros dispositivos de almacenamiento removibles como discos duros USB.


Probando y reparando sistemas de archivos

En nuestro asunto anterior del archivo /etc/fstab, vimos algunos números misteriosos al final de cada línea. Cada vez que el sistema arranca, chequea rutinariamente la integridad del sistema de archivos antes de montarlo. Esto lo hace el programa fsck (abreviatura de “file system check” - Chequeo del sistema de archivos). El último número de cada línea de fstab especifica el orden en que los dispositivos tienen que ser chequeados. En nuestro ejemplo anterior, vemos que el sistema de archivos raiz es el primero en ser chequeado, seguido del los sistemas de archivos homey boot. Los dispositivos con un cero cómo último número no son chequeados rutinariamente.

Además del chequeo de la integridad del sistema de archivos, fsck puede también reparar sistemas de archivos corruptos con distintos grados de éxito, dependiendo de la magnitud del daño. En sistemas de archivos como-Unix, las porciones recuperadas de archivos se colocan en el directorio lost+found, localizado en la raíz de cada sistema de archivos.

Para chequear nuestra unidad flash (que debe ser desmontada primero), podríamos hacer lo siguiente:

 [me@linuxbox ~]$ sudo fsck /dev/sdb1
 fsck 1.40.8 (13-Mar-2008)
 e2fsck 1.40.8 (13-Mar-2008)
 /dev/sdb1: clean, 11/3904 files, 1661/15608 blocks

En mi experiencia, la corrupción del sistema de archivos es muy rara a menos que haya un problema de hardware, como un disco duro que falle. En la mayoría de los sistemas, la corrupción del sistema archivos detectada en el arranque causará que el sistema se detenga y te lleve a ejecutar fsck antes de continuar.


What the fsck?

En la cultura Unix, la palabra “fsck” a menudo se usa en lugar de una popular palabra con la que comparte tres letras. Esto es especialmente apropiado, dado que probablemente pronunciarás la mencionada palabra si te encuentras en una situación en la que estás forzado a ejecutar fsck.


Formateando disquetes

Para aquellos de nosotros que todavía usamos ordenadores lo suficientemente antiguos como para que estén equipados con unidades de disquetes, podemos manejar también dichos dispositivos. Preparar un disquete en blanco para usar es un proceso en dos pasos. Primero, realizamos un formateo de bajo nivel en el disquete, y luego creamos un sistema de archivos. Para realizar el formateo, usamos el programa fdformatespecificando el nombre del dispositivo del disquete (normalmente /dev/fd0):

 [me@linuxbox ~]$ sudo fdformat /dev/fd0
 Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
 Formatting ... done
 Verifying ... done

A continuación, aplicamos el sistema de archivos FAT al disquete con mkfs:

 [me@linuxbox ~]$ sudo mkfs -t msdos /dev/fd0

Fíjate que usamos el sistema de archivos de “msdos” para tener las tablas de asignación de archivos más antiguas (y pequeñas). Cuando el disquete esté preparado, se montará como otros dispositivos.


Moviendo datos directamente de/desde dispositivos

Mientras que normalmente pensamos en los datos en nuestros ordenadores organizados en archivos, también es posible pensar en los datos en “bruto”. Si miramos un disco duro, por ejemplo, vemos que consiste en un gran números de “bloques” de datos que el sistema operativo ve como directorios y archivos. Sin embargo, si pudiéramos tratar una unidad de disco simplemente como una gran colección de bloques de datos, podríamos realizar tareas útiles, como clonar dispositivos.

El programa dd realiza esta tarea. Copia bloques de datos de un lugar a otro. Usa una sintaxis única (por motivos históricos) y se usa normalmente de esta forma:

 dd if=input_file of=output_file [bs=block_size [count=blocks]]

Digamos que tenemos dos unidades USB del mismo tamaño y queremos copiar exactamente la primera unidad en la segunda. Si conectamos los dos discos al ordenador y están asignados a los dispositivos /dev/sdb y /dev/sdc respectivamente, podríamos copiar todo lo que hay en el primer disco al segundo disco haciendo lo siguiente:

 dd if=/dev/sdb of=/dev/sdc


Alternativamente, si sólo estuviera conectado a nuestro ordenador el primer dispositivo, podríamos copiar su contenido en un archivo normal para restauralo o copiarlo posteriormente:

 dd if=/dev/sdb of=flash_drive.img

¡Aviso! El comando dd es muy potente. Aunque su nombre deriva de “data definition” (definición de datos), a veces se le llama “destroy disk” (destruye discos) porque los usuarios a menudo escriben mal las especificaciones if o of.

Creando imágenes de CD-ROM

Escribir un CD-ROM grabable (tanto un CD-R como un CD-RW) consta de dos pasos: primero, construir un archivo de imagen iso que es la imagen exacta del sistema de archivos del CD-ROM y segundo, escribir el archivo de imagen en el CD-ROM.


Creando una copia imagen de un CD-ROM

Si queremos hacer una imagen iso de un CD-ROM existente, podemos usar dd para leer todos los bloques de datos del CD-ROM y copiarlos en una archivo local. Digamos que tenemos un CD de Ubuntu y queremos hacer un archivo iso que podamos usar más tarde para hacer más copias. Después de insertar el CD y determinar su nombre de dispositivo (asumiremos que es /dev/cdrom), podemos hacer el archivo iso así:

 dd if=/dev/cdrom of=ubuntu.iso

Esta técnica funciona también para DVDs de datos, pero no funcionará para audio CDs, ya que no usan un sistema de archivos para almacenamiento. Para audio CDs, mira el comando cdrdao.


Creando una imagen de una colección de archivos

Para crear una imagen iso conteniendo el contenido de un directorio, usamos el programa genisoimage. Para hacerlo, primero creamos un directorio conteniendo todos los archivos que queramos incluir en la imagen. Por ejemplo, si hubiéramos creado un directorio llamado ~/cd-rom-files y lo llenamos con archivos para nuestro CD-ROM, podríamos crear un archivo de imagen llamado cd-rom.iso con el siguiente comando:

 genisoimage -o cd-rom.iso -R -J ~/cd-rom-files

La opción “-R” añade metadatos para las extensiones Rock Ridge, que permiten usar nombres de archivo largos y permisos de archivos estilo POSIX. Igualmente, la opción “-J” activa las extensiones Joilet, que permiten nombres de archivo largos para Windows.


Un programa con otro nombre…

Si miras tutoriales on-line sobre crear y quemar medios ópticos como CD-ROMs y DVDs, frecuentemente encontrarás dos programas llamados mkisofs y cdrecord. Estos programas eran parte del popular paquete llamado “cdr-tools” creados por Jörg Schilling. En el verano de 2006, Mr. Schilling hizo un cambio de licencia a una parte del paquete cdrtools que, en opinión de muchos en la comunidad Linux, creó una incompatibilidad de licencia con el GNU GPL. Como resultado, surgió un fork del proyecto cdrtools que ahora incluye programas para reemplazar a cdrecord y mkisofs llamados wodim y genisoimage, respectivamente.


Escribiendo imágenes de CD-ROM

Una vez que tenemos un archivo de imagen, podemos quemarlo en nuestro medio óptico. La mayoría de los comandos que veamos a continuación pueden ser aplicados tanto a CD-ROM como a DVD.


Montando una imagen ISO directamente

Hay un truco que podemos usar para montar una imagen iso mientras que está todavía en nuestro disco duro y tratarla como si ya estuviera en un medio óptico. Añadiendo la opción “-o loop” a mount (además del requerido tipo de sistema de archivos “-t iso9660”), podemos montar el archivo de imagen como si fuera un dispositivo y conectarlo al árbol del sistema de archivos:


 mkdir /mnt/iso_image
 mount -t iso9660 -o loop image.iso /mnt/iso_image


En el ejemplo anterior, creamos un punto de montaje llamado /mnt/iso_image y luego montamos el archivo de imagen image.iso en el punto de montaje. Una vez que la imagen está montada, puede ser tratada como si fuera un CD-ROM o DVD real. Recuerda desmontar la imagen cuando ya no la necesites.

Borrando un CD-ROM regrabable

Los CD-RW regrabables necesitan ser borrados antes de ser reutilizados. Para hacerlo, podemos usar wodim, especificando el nombre del dispositivo del grabador de CD y el tipo de borrado a realizar.

El programa wodim ofrece varios tipos. El más simple (y rápido) es el modo “rápido”:

 wodim dev=/dev/cdrw blank=fast

Escribiendo una imagen

Para escribir una imagen, usamos de nuevo wodim, especificando el nombre del dispositivo grabador óptico y el nombre del archivo de imagen:

 wodim dev=/dev/cdrw image.iso

Además del nombre del dispositivo y el archivo de imagen, wodim soporta una gran variedad de opciones. Dos muy comunes son “-v” para salida verbose, y “-dao”, que graba el disco en el modo disc-at-once (disco de una vez). Este modo debería usarse si estás preparando un disco para reproducción comercial. El modo por defecto de wodimes track-at-one (pista de una vez), que es útil para grabar pistas de música.


Resumiendo



En este capítulo hemos visto las tareas básicas de la gestión del almacenamiento. Hay, por supuesto, muchas más. Linux soporta una gran cantidad de dispositivos de almacenamiento y tablas de sistemas de archivos. También ofrece funciones para interoperar con otros sistemas.

Para saber más

Hecha un vistazo a las man pages de los comandos que hemos visto. Algunos de ellos soportan gran número de opciones y operaciones. También, busca tutoriales on-line para añadir discos duros a tu sistema Linux (hay muchos) y funcionan con medios ópticos.

Crédito adicional

A menudo es útil verificar la integridad de una imagen iso que hemos descargado. En la mayoría de los casos, un distribuidor de una imagen iso también proporcionará un archivo checksum. Un checksum es el resultado de un calculo matemático exótico que tiene como resultado un número que representa el contenido del archivo en cuestión. Si el contenido del archivo cambia aunque sea en un sólo bit, el resultado del checksum será muy diferente. El método más común de generación de checksum usa el programa md5sum. Cuando usas md5sum, produce un número hexadecimal único:

 md5sum image.iso
 34e354760f9bb7fbf85c96f6a3f94ece image.iso

Después de descargar la imagen, deberías ejecutar md5sum contra ella y comparar el resultado con el valor de md5sum suministrado por el publicador.

Además de chequear la integridad de un archivo descargado, podemos usar md5sum para verificar el nuevo medio óptico grabado. Para hacerlo, primero calculamos el checksum del archivo de imagen y luego calculamos el checksum del medio óptico. El truco para verificar el medio óptico es limitar el cálculo a sólo una la parte del medio que contiene la imagen. Hacemos ésto determinando el número de bloques de 2048 bytes que contiene la imagen (los medios ópticos están siempre escritos en bloques de 2048 bytes) y leyendo todos esos bloques del medio. En algunos tipos de medios, ésto no es necesario. Un CD-R grabado en modo disc-at-once puede ser chequeado de esta forma:

 md5sum /dev/cdrom
 34e354760f9bb7fbf85c96f6a3f94ece /dev/cdrom

Muchos tipos de medios, como DVDs, requieren un cálculo preciso del número de bloques. En el ejemplo siguiente, chequeamos la integridad del archivo de imagen dvd-image.iso y del disco en el lector de DVD /dev/dvd. ¿Puedes adivinar como funciona?

md5sum dvd-image.iso; dd if=/dev/dvd bs=2048 count=$(( $(stat -c "%s"
dvd-image.iso) / 2048 )) | md5sum

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.