El archivo /etc/fstab
Introducción.
Un archivo fundamental en cualquier sistema Linux es el /etc/fstab, cuyo nombre es una especie de abreviatura de File System Table. El mismo reune la información sobre los sistemas de archivos y es leído por el demonio init para poder montarlos al bootear el sistema operativo. También se utiliza su información una vez iniciado el sistema al invocar al comando mount.
La estructura del archivo es extremadamente simple y aún así muchas veces confunde o se desconocen sus parámetros. A continuación se puede ver un ejemplo de un archivo /etc/fstab y luego la explicación de cada elemento.
El archivo /etc/fstab.
# /etc/fstab: static file system information. # # file system mount point type options dump pass /dev/sda1 /boot ext4 defaults 1 2 /dev/sda5 / ext4 defaults 1 1 /dev/sda6 /home ext4 defaults 0 0 /dev/sda7 /storage ext4 defaults 1 2 /dev/sda8 swap swap defaults 0 0
Las líneas que comienzan con # son ignoradas como en la mayoría de los archivos de configuración de Linux por tratarse de comentarios. Por lo tanto, la parte interesante arranca a partir de la cuarta línea. Se puede ver que cada una de las líneas del archivo representan un filesystem distinto. A su vez, es sencillo notar que todas las líneas presentan seis columnas cada una, cuyo significado se detalla a continuación:
- Primera: en este campo se indica el dispositivo o la partición donde se encuentra el filesystem.
- Segunda: aquí va el punto de montaje para el dispositivo especificado.
- Tercera: el tipo de sistema de archivos. Puede tomar varios valores, entre los que se destacan: ext2, ext3, ext4, iso9660, nfs, ntfs, reiserfs, smbfs, swap, vfat, xfs.
- Cuarta: en esta columna van las opciones para el montaje del filesystem. Son muchas y a continuación se mencionan las más comunes. Para un listado más completo se pueden leer el manual del comando mount y el del nfs (para los parámetros específicos de nfs).
- async: las escrituras al filesystem se demoran, es decir que no se hacen en el momento sino que se hacen varias escrituras juntas. Esto da un mayor rendimiento, aunque si el sistema se cuelga, apaga o el filesystem se desmonta, los datos se pederán si aún no han sido escritos.
- auto: el sistema de archivos será montado automáticamente al iniciar el sistema o al ejecutar el comando mount -a.
- noauto: debe ser montado explícitamente.
- defaults: utiliza las opciones por defecto, que son rw, suid, dev, exec, auto, nouser, async.
- ro: monta el filesystem como de sólo lectura.
- rw: monta el filesystem como lectura/escritura.
- user: permite que cualquier usuario pueda montar el filesystem.
- nouser: especifica que el filesystem sólo puede ser montado por el usuario root y no por un usuario común.
- sync: todas las escrituras al filesystem se hacen en el momento. Esto da mayor seguridad a los datos pero un menor rendimiento.
- Quinta: esta columna indica a la utilidad dump si debe o no hacer backup del filesystem. Puede tomar dos valores: 0 y 1. Con 0 se indica que no se debe backupear, con 1 que sí se haga. Lógicamente, depende de que se tenga instalado y configurado dump, por lo que en la mayoría de los casos este campo es 0.
- Sexta: en este caso se trata de una indicación para el fsck (comando que chequea el filesystem) y nuevamente se define con un valor numérico. Las posibilidades son 0, 1 y 2. El 0 indica que el filesystem no debe ser chequeado, mientras que el 1 y el 2 le dicen a fsck que sí lo chequee. La diferencia es que el 1 representa una prioridad mayor que el 2, por lo que debe utilizarse para el sistema raíz y el 2 para el resto de los sistemas de archivos.
Referencias.
Existen multitud de documentos a los que acudir para obtener información sobre fstab. Entre ellos recomiendo los manuales de los comandos fstab, mount y nfs. Además hay buena información en la wiki de ArchLinux y en un post en TuxFiles.
Soporte para ext3 y NTFS en Mac
Si trabajamos con diferentes sistemas operativos es muy común encontrarse con la situación en la que se necesita leer o escribir diferentes sistemas de archivos. En este caso, me ocurrió que necesitaba acceder a filesystems NTFS y ext3 con Mac OS X y ninguno de los dos tiene soporte nativo en el sistema operativo mencionado, por lo cuál es necesario valerse de algún agregado.
Para NTFS el soporte es completo de lectura/escritura utilizando NTFS-3G, el mismo software utilizado para obtener el soporte de lectura/escritura de NTFS en Linux.
En el caso de ext3 se puede utilizar fuse-ext2 que requiere tener instalado en el sistema Mac Fuse. No obstante, el soporte para ext3 es de sólo lectura, al menos hasta lo que pude encontrar.
LVM (parte 3): reducir y eliminar volúmenes
Al momento se ha tratado la parte teórica de LVM introduciendo los conceptos del mismo y se ha visto también cómo crear y extender volúmenes. En el post del día de hoy se explicará la forma de reducir el tamaño de un volumen y eliminar volúmenes.
Reducir un volumen
Cuando se trató el tema de aumentar el tamaño de un volumen se vio que los pasos básicamente consistían en extender el tamaño del grupo de volúmenes, luego el tamaño del volumen lógico a expandir y, finalmente, el tamaño del sistema de archivos.
Para el caso de reducir un volumen los pasos son los mismos pero en orden inverso, aunque no es necesario achicar el grupo de volúmenes (eso dependerá de la necesidad particular).
En la siguiente salida se puede verificar que el filesystem está montado y tiene una tamaño total de 2.9G.
testing:/home/leandro# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/testing-storage
2.9G 36M 2.8G 2% /storage
Lo que hay que hacer entonces es redimensionar el filesystem. Para poder hacerlo el mismo no debe estar montado, dado que de lo contrario da un error al intentar la ejecución, tal como se muestra a continuación:
testing:/home/leandro# resize2fs /dev/testing/storage 1G resize2fs 1.41.3 (12-Oct-2008) Filesystem at /dev/testing/storage is mounted on /storage; on-line resizing required On-line shrinking from 772096 to 262144 not supported.
Se ve que dice claramente que la reducción del filesystem de forma on-line no puede llevarse a cabo. Entonces sí es necesario desmontarlo y luego hacer la reducción. Es muy recomendado hacer un chequeo del filesystem antes de achicarlo.
testing:/home/leandro# umount /dev/mapper/testing-storage testing:/home/leandro# e2fsck -f /dev/mapper/testing-storage e2fsck 1.41.3 (12-Oct-2008) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/mapper/testing-storage: ***** FILE SYSTEM WAS MODIFIED ***** /dev/mapper/testing-storage: 12/195840 files (0.0% non-contiguous), 21270/772096 blocks testing:/home/leandro# resize2fs /dev/mapper/testing-storage 1G resize2fs 1.41.3 (12-Oct-2008) Resizing the filesystem on /dev/mapper/testing-storage to 262144 (4k) blocks. The filesystem on /dev/mapper/testing-storage is now 262144 blocks long.
Muy bien, con los pasos anteriores logró reducirse el tamaño del sistema de archivos a 1GB. Dicha modificación puede constatarse volviendo a montar el filesystem y viendo que ahora el tamaño es de 1008M contra los 2.9G que mostraba antes.
testing:/home/leandro# mount /storage/
testing:/home/leandro# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/testing-storage
1008M 35M 923M 4% /storage
testing:/home/leandro# cat /storage/archivo.txt
prueba
Ahora bien, hasta aquí sólo se achicó el filesystem y no se modificó nada del volumen lógico, por lo que es de suponer que el mismo se haya mantenido sin cambios. Se puede verificar esto mediante el siguiente comando:
testing:/home/leandro# lvdisplay /dev/testing/storage | grep Size LV Size 2.95 GB
Entonces, para reducir efectivamente el volumen hay que indicarle con el comando lvreduce cuál será su nuevo tamaño. En este caso, 1GB.
testing:/home/leandro# lvreduce -L 1GB /dev/testing/storage
WARNING: Reducing active and open logical volume to 1.00 GB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce storage? [y/n]: y
Reducing logical volume storage to 1.00 GB
Logical volume storage successfully resized
testing:/home/leandro# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/testing-storage
1008M 35M 923M 4% /storage
testing:/home/leandro# lvdisplay /dev/testing/storage | grep Size
LV Size 1.00 GB
En este punto sí se ve claramente que se ha reducido tanto el tamaño del filesystem como el del volúmen. Faltaría asegurarse que los datos sigan estando bien. Para ello se puede ver que el contenido de “archivo.txt” sea legible.
testing:/home/leandro# cat /storage/archivo.txt prueba
Obviamente, lo anterior no asegura que todo esté bien. El archivo se creó como una demostración de que los datos se mantienen, pero una medida más precisa implicaría tener un volumen más amplio de información, en lo posible cerca del límite del tamaño del filesystem.
Finalmente, con el siguiente comando se puede verificar que, si bien se achicaron el filesystem y el volúmen lógico, el grupo de volúmenes sigue teniendo la misma dimensión, con la diferencia que en este caso tiene espacio libre que podrá ser asignado a un nuevo volumen. Esta información puede verse en las variables VG Size, Alloc Size, Free Size.
testing:/home/leandro# vgdisplay testing --- Volume group --- VG Name testing System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 5 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 2 Act PV 2 VG Size 2.95 GB PE Size 4.00 MB Total PE 755 Alloc PE / Size 256 / 1.00 GB Free PE / Size 499 / 1.95 GB VG UUID epQoNY-6JWP-1vUX-IZm0-LRwo-4fR4-AEEo1p
Remover volúmenes
Llegó el momento de deshacer todo el trabajo que se llevó adelante hasta el momento.
Eliminar un volumen lógico.
testing:/home/leandro# umount /storage/ testing:/home/leandro# lvremove /dev/testing/storage Do you really want to remove active logical volume "storage"? [y/n]: y Logical volume "storage" successfully removed
Eliminar un grupo de volúmenes.
testing:/home/leandro# vgremove testing Volume group "testing" successfully removed
Eliminar un volumen físico.
testing:/home/leandro# pvremove /dev/hdb Labels on physical volume "/dev/hdb" successfully wiped
Conclusión
Luego de tres posts se han visto las funcionalidades básicas de LVM que consisten en crear volúmenes, expandirlos, achicarlos y eliminarlos. Quedan como temas de algún otro post dos tópicos interesantes: las instantáneas de los volúmenes y los volúmenes encriptados. Probablemente haya algo de eso en un tiempo.
LVM (parte 2): crear y expandir volúmenes
Luego de haber tenido un post introductorio a LVM, explicaré en esta oportunidad cómo:
- Crear volúmenes físicos, grupos de volúmenes y volúmenes lógicos.
- Redimensionar los volúmenes.
- Eliminar volúmenes.
Preparándose para utilizar LVM
Para este tutorial utilizaré Debian. El mismo se puede aplicar a cualquier Linux, aunque daré ciertas cosas por supuestas además de mostrar algunos comandos específicos de los sistemas Debian like.
Antes que nada, será necesario contar con el soporte para LVM. Para ello:
testing:~# aptitude install lvm2
Creación de un volumen lógico
Para crear un volumen lógico es necesario primero crear los volúmenes físicos que se necesitarán y luego el grupo de volúmenes. Finalmente se podrá crear el volumen lógico que se busca y asignar un sistema de archivos al mismo. Para este paso vamos a suponer que tenemos un disco rígido nuevo, sin particionar. El disco en cuestión se identifica en el sistema como /dev/hdb.
Crear el volumen físico.
testing:~# pvcreate /dev/hdb Physical volume "/dev/hdb" successfully created
Crear el grupo de volúmenes.
testing:~# vgcreate testing /dev/hdb Volume group "testing" successfully created
Crear un volumen lógico.
testing:~# lvcreate testing -L 1.99G -n storage Rounding up size to full physical extent 1.99 GB Logical volume "storage" created testing:~# ls -l /dev/testing/storage lrwxrwxrwx 1 root root 27 2010-06-10 16:01 /dev/testing/storage -> /dev/mapper/testing-storage
Crear el sistema de archivos en el volumen lógico.
testing:~# mkfs.ext3 /dev/mapper/testing-storage
mke2fs 1.41.3 (12-Oct-2008)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
130560 inodes, 522240 blocks
26112 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
Agregar el nuevo volumen al FSTAB.
testing:~# vi /etc/fstab /dev/mapper/testing-storage /storage ext3 defaults 0 2
Montar el nuevo sistema de archivos y probarlo.
testing:~# mkdir /storage
testing:~# mount /storage/
testing:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/testing-storage
2.0G 36M 1.9G 2% /storage
testing:~# echo "prueba" > /storage/archivo.txt
testing:~# cat /storage/archivo.txt
prueba
Redimensionar un volumen lógico
Hasta aquí se ha visto cómo crear volúmenes físicos, grupos de volúmenes y volúmenes lógicos. A su vez, se mostró cómo utilizar el volumen creado. En este punto se verá el tema de redimensionar el volumen lógico recién creado, primero agrandando su tamaño y luego achicándolo (tema de un próximo post). Es de destacar que el primero de los redimensionamientos será llevado a cabo sin desmontar el volumen lógico.
Aumentar el tamaño
En este punto se considerará que se tiene un disco rígido adicional identificado como /dev/hdc y que el mismo tiene dos particiones, /dev/hdc1 y /dev/hdc2. Se utilizará la primera de ellas para extender el volumen creado en los pasos anteriores.
Crear volumen físico.
testing:~# pvcreate /dev/hdc1 Physical volume "/dev/hdc1" successfully created
Extender el grupo de volúmenes.
En este paso se le indica al grupo de volúmenes testing que se le agregará un nuevo volumen físico.
testing:~# vgextend testing /dev/hdc1 Volume group "testing" successfully extended
Extender el volumen lógico.
El siguiente comando toma el volumen storage ya existente y le agrega 0.95G de tamaño, tomados a partir de la integración del nuevo volumen físico.
testing:~# lvextend -L +0.95G /dev/testing/storage Rounding up size to full physical extent 976.00 MB Extending logical volume storage to 2.95 GB Logical volume storage successfully resized
Redimensionar el sistema de archivos.
Hasta aquí está todo bien, sin embargo aún nuestro volumen no ha crecido en tamaño, según muestra la salida del comando df.
testing:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/testing-storage
2.0G 36M 1.9G 2% /storage
Lo que ha ocurrido es que, si bien el volumen ya cuenta con una mayor capacidad de almacenamiento, el sistema de archivos que se creó está limitando el tamaño del mismo. Por ello, es necesario extender el sistema de archivos existente. Este paso se realizará on-line, es decir, sin desmontar el volumen.
testing:~# resize2fs /dev/testing/storage
resize2fs 1.41.3 (12-Oct-2008)
Filesystem at /dev/testing/storage is mounted on /storage; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/testing/storage to 772096 (4k) blocks.
The filesystem on /dev/testing/storage is now 772096 blocks long.
testing:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/testing-storage
2.9G 36M 2.8G 2% /storage
testing:~# cat /storage/archivo.txt
prueba
Como puede verse, el sistema de archivos ha sido extendido sin desmontar el volumen y los datos que se tenían fueron conservados.
Herramientas informativas
Es posible ver el estado y detalles de los diferentes volúmenes físicos, grupos de volúmenes y volúmenes lógicos mediante tres sencillos comandos que se muestran a continuación: pvdisplay, vgdisplay y lvdisplay.
testing:/home/leandro# pvdisplay --- Physical volume --- PV Name /dev/hdb VG Name testing PV Size 2.00 GB / not usable 4.00 MB Allocatable yes (but full) PE Size (KByte) 4096 Total PE 511 Free PE 0 Allocated PE 511 PV UUID pE7qSU-COhd-j6a4-YnWg-1mR7-xZ48-XDstZk --- Physical volume --- PV Name /dev/hdc1 VG Name testing PV Size 976.96 MB / not usable 984.50 KB Allocatable yes PE Size (KByte) 4096 Total PE 244 Free PE 1 Allocated PE 243 PV UUID rmvKFh-0hGJ-mBby-zPjT-eyvf-2CrP-TjTKG3 testing:/home/leandro# vgdisplay --- Volume group --- VG Name testing System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 2 Act PV 2 VG Size 2.95 GB PE Size 4.00 MB Total PE 755 Alloc PE / Size 754 / 2.95 GB Free PE / Size 1 / 4.00 MB VG UUID epQoNY-6JWP-1vUX-IZm0-LRwo-4fR4-AEEo1p testing:/home/leandro# lvdisplay --- Logical volume --- LV Name /dev/testing/storage VG Name testing LV UUID ywXZGl-kafG-CoHV-3jGt-wt1S-rnlY-IBIgF8 LV Write Access read/write LV Status available # open 1 LV Size 2.95 GB Current LE 754 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:2
Para la próxima
En otro nuevo post se mostrará cómo achicar un volumen lógico y cómo eliminar volúmenes lógicos, grupos de volúmenes y volúmenes físicos.
LVM2: administración de volúmenes lógicos en Linux
Introducción
LVM2 es un administrador de volúmenes lógicos desarrollado para el kernel de Linux, compatible con su predecesor LVM1. En la actualidad, LVM está disponible en la mayoría de los sistemas Linux para utilizarlo al momento de la instalación. De hecho, sistemas como Fedora utilizan LVM si se los particiona como lo sugiere el instalador por defecto.
La primer ventaja fundamental de LVM es que nos quita el inconveniente de dimensionar exactamente las particiones tal cuál las necesitaremos, encontrándonos luego con que el esquema de particionamiento escogido no es el más adecuado. Este caso es muy fácil verlo con un ejemplo.
Se tiene un disco de 40G (pequeño para los tamaños actuales, lo reconozco, pero sirve para el ejemplo). Se desea instalar Linux allí entonces se decide particionarlo de la siguiente manera:
/boot 200M / 4G swap 1G /home 34G
El problema al que nos enfrentamos en este caso (me ha ocurrido en alguna oportunidad) es quedarnos sin espacio en alguna partición y tener lugar de sobra en otra. Por ejemplo, supongamos que se llena el disco raíz y sin embargo tenemos aún 14G libres en /home. Eso representa una situación donde se hace un uso ineficiente del espacio en disco, además de un problema. La solución más obvia en este caso es hacer algún link simbólico apuntando a algún lugar de /home, pero es una solución bastante mala.
Con LVM, la solución a este problema es trivial, dado que se podría simplemente achicar la partición que contiene /home y aumentar luego el espacio asignado al directorio raíz.
Características de LVM2
LVM2 cuenta, básicamente, con las siguientes funcionalidades.
- Redimensión de grupos de volúmenes y volúmenes lógicos en línea.
- Crear instantáneas (snapshots) de lecturea/escritura del sistema de archivos.
- Constituir los volúmenes lógicos separados en los diferentes volúmenes físicos, de manera similar que RAID 0.
- Mover los volúmenes lógicos entre los diferentes volúmenes físicos.
Conceptos básicos de LVM
Para entender cómo funciona LVM es necesario conocer algunos conceptos elementales, que son:
- Volumen físico (PV): un PV es un disco rígido, una partición o un RAID.
- Volumen lógico (LV): un LV es el equivalente a una partición tradicional.
- Grupo de volúmenes (VG): un grupo de volúmenes reúne uno o más PVs. Los PVs pueden comenzar a utilizarse en LVM recién cuando pasan a formar parte de un VG.
- Physical extent (PE): un PE es una porción de cada volumen físico, de tamaño fijo. Un volumen físico se divide en mútiples PEs del mismo tamaño.
- Logical extent (LE): un LE es una porción de cada volumen lógico, de tamaño fijo. Un volumen lógico se divide en mútiples LEs del mismo tamaño.
- Device mapper: es un framework genérico del kernel de Linux que permite realizar un mapeo de un dispositivo de bloques a otro. Es la herramienta fundamental en la que se basa LVM para hacer el mapeo de los dispositivos virtuales con los dispositivos físicos.
Conclusión
LVM es un sistema muy interesante para utilizar ya sea en sistemas pequeños como en sistemas con muchos discos y esquemas complejos de particionamiento. Por su flexibilidad y sus capacidades puede reducir mucho el trabajo de mantenimiento de los equipos y cualquier cambio a nivel de almacenamiento.
En un próximo post explicaré cómo trabajar con LVM, desde la creación de los PVs, VGs y LVs, cómo redimensionarlos y eliminarlos e, incluso, cómo trabajar con las instantáneas.



