Administración del sistema de archivos de Linux

Un sistema de archivos consiste en un espacio de disco con un formato determinado que sirve para almacenar datos. Veamos un ejemplo:

# df -hP /
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 8.0G 1.6G 6.5G 19% /
#

Lo que vemos aquí es:

  • /dev/xda1 –> Es el nombre del dispositivo (o disco) que le da el sistema operativo.
  • / –> Es el punto de montaje que utiliza el dispositivo. Es decir, los datos que guardemos en el filesystem «/» utilizan el disco /dev/xda1.
  • El comando df también nos muestra otros datos relativos al tamaño del disco, espacio utilizado y libre.

Por lo tanto, ya sabemos lo que es un filesystem. Sin embargo, en Linux existen muchos tipos de filesystems o formatos, cada uno con sus casuísticas.

En RedHat 7 se ha estandarizado el formato XFS, aunque en RedHat 6 el estándar era EXT4, en HP-UX utilizan VXFS, etc.

inodos

Todos los filesystems en común, sean del formato que sean, se alimentan de la tabla de inodos para acceder a la información de cada fichero almacenado en cada filesystem. La información que guarda la tabla de inodos es la siguiente:

  • Identificador del dispositivo que contiene el sistema de archivos.
  • Número único de inodo.
  • Tipo de fichero.
  • Propietario y grupo del archivo.
  • Permisos de lectura, escritura y ejecución.
  • Fecha de creación.
  • Tamaño del archivo.
  • Número de enlaces asociados a un mismo inodo.

Algunos comandos de sistema como, por ejemplo, find, utilizan la tabla de inodos para encontrar archivos de una manera ágil.

Es importante saber que no cabrán más ficheros en un filesystem tanto si agotamos su espacio como si agotamos todos sus inodos (aunque haya espacio disponible).

Podemos personalizar el número de inodos de un sistema de archivos cuando lo creamos. Por ejemplo:

mkfs.ext4 -N 35000 -j -T largefile /dev/vg00/lvoltest

¿Cuánto espacio ocupan todos los filesystems del sistema en su conjunto?

Si queremos sumar el espacio total que ocupan todos los filesystems del sistema, podremos utilizar el siguiente comando:

[root@server1 ~]# df -kP | awk 'NR>2{sum+=$2}END{print sum}' |awk '{print "expr " $1 " / 1024 / 1024"}' |sh
7623
[root@server1 ~]#

El resultado lo da en GB.

Particiones

Una partición significa que podemos dividir un disco en una o más particiones, cada una de un tamaño distinto sobre, la cuál, podemos crear filesystems de diferentes formatos.

Por ejemplo, si tenemos el disco /dev/sda de 100GB, podemos crear una sola partición de 100GB o dos particiones de diferentes tamaños, por ejemplo:

  • /dev/sda1 de 75GB
  • /dev/sda2 de 25GB

/dev/sda1 puede contener un filesystem de tipo xfs, mientras que en /dev/sda2 podemos crear un FS ext4.

Para crear una partición menos de 2TB podemos utilizar fdisk, pero parted permite crear particiones de mayor tamaño.

Ejemplo:

# fdisk /dev/sda
The number of cylinders for this disk is set to 8631.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
 (e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): m
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): p
Disk /dev/sda: 70.9 GB, 70999080960 bytes
255 heads, 63 sectors/track, 8631 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 32 257008+ 83 Linux
/dev/sda2 33 554 4192965 82 Linux swap / Solaris
/dev/sda3 555 8631 64878502+ 8e Linux LVM
Command (m for help): d
Partition number (1-4): 2
Command (m for help): p
Disk /dev/sda: 70.9 GB, 70999080960 bytes
255 heads, 63 sectors/track, 8631 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 32 257008+ 83 Linux
/dev/sda3 555 8631 64878502+ 8e Linux LVM
Command (m for help): w


Con fdisk podemos crear hasta cuatro particiones primarias en cada disco. El resto, deberán ser extendidas.

Configuración de fstab

Una vez que ya hemos creado la partición y el filesystem, las montaremos en un punto de montaje, es decir, en un nombre que le damos como, por ejemplo, /aplicaciones, /root, /opt, etc.

Para que los filesystems arranquen con el boot del sistema, configuraremos el fichero /etc/fstab, indicando el filesystem, el punto de montaje, el tipo de filesystem y las opciones de montaje. Veamos un ejemplo:

# cat /etc/fstab |grep -v "#" |grep -v ^$
/dev/mapper/vg00-rootvol / ext3 defaults 1 1
UUID=0f16c4b2-0018-44d2-aa9e-e2c4e959c064 /boot ext2 nodev 1 2
/dev/mapper/vg00-homevol /home ext3 nosuid,nodev 1 2
/dev/mapper/vg00-optvol /opt ext3 nodev 1 2
/dev/mapper/vg00-rhomevol /root/home ext3 nosuid,nodev 1 2
/dev/mapper/vg00-tmpvol /tmp ext3 nosuid,nodev 1 2
/dev/mapper/vg00-varvol /var ext3 nodev 1 2
/dev/mapper/vg00-auditvol /var/log/audit ext3 noexec,nosuid,nodev 1 2
/dev/mapper/vg00-swapvol swap swap defaults 0 0
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
/dev/vgall01/lvall01 /AL ext4 defaults,acl 0 0
/dev/vg00/lvstats /stats ext4 defaults 1 2
/dev/vg00/lvplanific /planific ext4 defaults 1 2
/dev/vgrear/lvrear /REAR ext4 defaults 0 0
/dev/vgMySQL/lvbackupmysql /Backup_MySQL ext4 defaults 0 0
/dev/vg00/lvISO /ISO ext4 defaults 0 0
/dev/mapper/vg00-nbupdates /usr/openv/nbupdates ext3 nodev 1 2
/dev/mapper/vg00-nbupdates /usr/openv/nbupdates ext3 nodev 1 2
/dev/vgrear/lvcg2html /cfg2html ext4 defaults 0 0
#

Revisar las propiedades de un filesystem

Utilizaremos el comando «tune2fs -l» y el disco que queremos analizar:

# tune2fs -l /dev/mapper/vg00-lvol2
tune2fs 1.39 (29-May-2005) Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: a1ca33ac-6253-1c56-a13a-a6dfb58c17c3
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal resize_inode dir_index filetype needs_recovery sparse_super large_file
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 1441792
Block count: 2883584
Reserved block count: 144172
Free blocks: 714916
Free inodes: 1287429
First block: 0
Block size: 4096
Fragment size: 4096
Reserved GDT blocks: 575
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 16384
Inode blocks per group: 512
Filesystem created: Thu Mar 20 19:01:35 2007
Last mount time: Thu Mar 30 11:31:01 2007
Last write time: Thu Mar 30 11:31:01 2007
Mount count: 6
Maximum mount count: 36
Last checked: Thu Mar 17 07:15:14 2008
Check interval: 15552000 (6 months)
Next check after: Tue Sep 15 10:07:29 2009
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal inode: 8
First orphan inode: 136705
Default directory hash: tea
Directory Hash Seed: 15c28a28-ddae-1ae1-61fb-42c19d2bc1b3
Journal backup: inode blocks
#

Network filesystem (NFS)

A continuación, vamos a ver un ejemplo sencillo de cómo montar un sistema de archivos por NFS, pero puedes consultar este completo tutorial sobre NFS.

NFS es un sistema de archivos que reside en un servidor remoto como si lo tuviésemos en nuestro sistema local. El servidor NFS permite el acceso a un filesystem o punto de montaje a una serie de servidores clientes que montan el sistema de archivos en local apuntando a la IP y punto de montaje del servidor NFS.

Mejor vemos un ejemplo:

  • En el servidor de NFS exportamos los siguientes filesystems:
# head /etc/exports |grep -v "#"
/serveis/dades/PRO/NAS07/T07V6 lt07stx4(sync,rw) lt07stx5(sync,rw) lt07stx6(sync,rw) lt07stx7(sync,rw) lreesjx0(sync,rw) lt07stx8(sync,rw)
/serveis/dades/PRO/NAS01/CJA/sicja lt07stx9(sync,rw)
/serveis/dades/PRO/NAS07/T07V5/TempAppsPRO/EstaccEAGG/GenData wt07stx4(sync,rw)
#

  • Si vamos a uno de los clientes, veremos cómo el filesystem está montado por NFS:
[root@lt07stx4 ~]# df -hP |grep -i nfs
nfsserver:/serveis/dades/PRO/NAS07/T07V6 1.4T 1.2T 152G 89% /nfs_client
[root@lt07stx4 ~]#

Y el fichero /etc/fstab lo tiene configurado para montar el filesystem NFS durante el boot del sistema:

[root@lt07stx4 ~]# grep -i nfs /etc/fstab |grep -v "#"
nfsserver:/nfs_client nfs vers=3,rw,suid,soft 0 0
[root@lt07stx4 ~]#

En el momento en el que escribo este artículo, ya existe NFS4 que es una mejora del protocolo NFS3. Necesita abrir solamente un puerto (TCP 2049) y mejora el rendimiento.

En NFS hay que tener en cuenta que el UID y GID del usuario origen propietario del filesystem tiene que ser idéntico en el lado del cliente. De lo contrario, en el cliente obtendremos un error de acceso denegado a la hora de acceder al filesystem. Esta es una función importante de la administración de usuarios y grupos.

Creación de un mirror por software con mdadm

Cuando hablamos de crear un mirror nos estamos refiriendo que hay un disco que es una copia de otro disco con el objetivo de asegurar los datos en caso de una avería hardware con alguno de los discos.

Si se estropea un disco, seguiremos pudiendo acceder a los mismos datos almacenados en el otro disco espejo. El disco roto se cambia y se sincronizan los datos desde el disco que sigue vivo.

A nivel de sistema operativo, creamos un metadispositivo que apunta los dos discos en mirror.

Discos en mirror

Ejemplo de creación de un mirror en RedHat 6:

mdadm --create /dev/md0 --level 1 --raid-devices 2 /dev/sda1 /dev/sdb1

mdadm -Db /dev/md0 >>  /etc/mdadm.conf 

Si quisiéramos añadir otro disco más, ejecutaremos:

mdadm --manage /dev/md0 --add /dev/sda3
Discos en mirror mdstat

La configuración de un mirror con dos discos, se la conoce como RAID1, pero existen más tipos de RAID.

Mira lo que ocurre cuando ves un disco del mirror en estado spare.

Sustitución de un disco del mirror con mdadm

Puedes tener la necesidad de sustituir uno de los discos del mirror, por ejemplo, para usar otro de otra cabina porque estás migrando los datos o por una avería hardware, por ejemplo.

[root@lremdox1 ~]# mdadm --detail /dev/md14
/dev/md14:
        Version : 1.2
  Creation Time : Fri Jan 11 18:00:59 2019
     Raid Level : raid1
     Array Size : 209584128 (199.88 GiB 214.61 GB)
  Used Dev Size : 209584128 (199.88 GiB 214.61 GB)
   Raid Devices : 2
  Total Devices : 1
    Persistence : Superblock is persistent

  Intent Bitmap : Internal

    Update Time : Wed Mar  6 17:22:38 2019
          State : active, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
  Spare Devices : 0

           Name : lremdox1:0  (local to host lremdox1)
           UUID : f950683d:6b5542d0:56f9d78a:36511c22
         Events : 3197

    Number   Major   Minor   RaidDevice State
       0     253       16        0      active sync   /dev/dm-16
       2       0        0        2      removed
[root@lremdox1 ~]#

Como vemos, hay un disco en estado «removed» que se ha de sustituir por uno que sí funcione. Lo que haremos será:

  • Despresentar el disco con problemas del mirror
  • Añadir uno nuevo

Los comandos que realizan estas acciones son los siguientes:

mdadm /dev/md14 --fail /dev/dm-30
mdadm /dev/md14 --remove /dev/dm-30
mdadm /dev/md14 --add /dev/mapper/vg7dataguard2

Sé que es el disco dm-30 porque he visto en el log del sistema que es el que estaba fallando.

Una vez añadido el disco, comprobamos que el mirror se ha sincronizado correctamente:

[root@lremdox1 ~]# mdadm --detail /dev/md14
/dev/md14:
        Version : 1.2
  Creation Time : Fri Jan 11 18:00:59 2019
     Raid Level : raid1
     Array Size : 209584128 (199.88 GiB 214.61 GB)
  Used Dev Size : 209584128 (199.88 GiB 214.61 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

  Intent Bitmap : Internal

    Update Time : Wed Mar  6 18:08:44 2019
          State : active
Active Devices : 2
Working Devices : 2
Failed Devices : 0
  Spare Devices : 0

           Name : lremdox1:0  (local to host lremdox1)
           UUID : f950683d:6b5542d0:56f9d78a:36511c22
         Events : 7476

    Number   Major   Minor   RaidDevice State
       0     253       16        0      active sync   /dev/dm-16
       2     253       29        1      active sync   /dev/dm-29
[root@lremdox1 ~]#

Iba a hablar de LVM en este post pero resulta que es demasiado extenso y he querido hacer un tutorial de Logical Volume Manager por separado. Por ahora ya tienes los conocimientos básicos pero aprender LVM es básico para cualquier administrador de sistemas Linux.

Eliminación de un mirror

  • Vemos el estado del mirror antes de eliminarlo para saber qué discos son los que forman parte de él:
[root@localhost ~]# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Sat Nov 28 16:19:05 2020
        Raid Level : raid1
        Array Size : 1046528 (1022.00 MiB 1071.64 MB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Nov 29 16:10:15 2020
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : 86a78bf4:30172b57:96520b91:80838478
            Events : 17

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
[root@localhost ~]#
  • Paramos el mirror:
[root@localhost ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0
[root@localhost ~]#
  • Eliminamos las cabeceras de los dos discos que lo forman (perderemos los datos):
[root@localhost ~]# mdadm --zero-superblock /dev/sdb
[root@localhost ~]# mdadm --zero-superblock /dev/sdc
  • Eliminamos toda información de este mirror del fichero de configuración /etc/mdadm.conf:
[root@localhost ~]# cat /etc/mdadm.conf 
[root@localhost ~]# 
  • Con este último paso ya hemos eliminado el mirror y, obviamente, no nos lo dejará arrancar de nuevo:
[root@localhost ~]# mdadm -A -R /dev/md0 /dev/sdb /dev/sdc
mdadm: no recogniseable superblock on /dev/sdb
mdadm: /dev/sdb has no superblock - assembly aborted
[root@localhost ~]# 

Te puede interesar

COMPÁRTEME

Deja un comentario