Yo he descubierto que son las cosas pequeñas de las acciones diarias de las personas ordinarias lo que mantiene a raya a la oscuridad. Actos simples de amabilidad y amor.

Gandalf en El Hobbit de J.R.R. Tolkien

Anteriormente había publicado, a manera de acordeón, una guía de como manejar los volúmenes lógicos en AIX; ahora toca turno de realizar el mismo ejercicio sobre Linux.

La administración de los volúmenes lógicos en Linux tiene conceptos similares a los conceptos vistos en el post de AIX, basados en el siguiente diagrama tendremos:

lvm_diag

Physical Volumes (PV): Elemento físico del arreglo, pueden ser particiones de discos físicos, primarias o extendidas, o incluso discos completos; internos o externos, abriendo la posibilidad a dispositivos de almacenamiento externo de alto desempeño, como lo son los discos proporcionados por un arreglo de discos de un storage de fibra (fibre channel)

Volume Group (VG): Conjunto de volúmenes físicos (PV’s) para proporcionar espacio de almacenamiento dinámico en ambos sentidos (ampliación y reducción). Además de ofrecer la posibilidad de configuración de alta disponibilidad (LVM HA – clusterizado)

Logical Volumes (LV): Espacio de almacenamiento, equivalente a una partición, con las misma naturaleza dinámica del volume group.

FileSystems: Espacio de almacenamiento asociado a un punto de montaje para el resguardo de archivos.

Redimensionar VG root

Uno de los primeros casos con los que nos encontramos al recibir una asignación de un sistema Linux, es tener un servidor sin un particionamiento adecuado para administrarlo, tal como:

[root@fedora20 ~]# df -h
Filesystem             Size Used Avail Use% Mounted on
/dev/mapper/fedora-root 11G 1.8G 7.8G  19%  /
devtmpfs               994M    0 994M   0%  /dev
tmpfs                 1002M    0 1002M  0%  /dev/shm
tmpfs                 1002M 472K 1001M  1%  /run
tmpfs                 1002M    0 1002M  0%  /sys/fs/cgroup
tmpfs                 1002M 4.0K 1002M  1%  /tmp
/dev/vda1              477M  75M 374M  17%  /boot
[root@fedora20 ~]# vgs
 VG    #PV #LV #SN Attr   VSize  VFree
 fedora 1  2   0   wz--n- 11.51g 0 
[root@fedora20 ~]# lvs
 LV   VG     Attr       LSize Pool Origin Data% Move Log Cpy%Sync Convert
 root fedora -wi-ao---- 10.31g 
 swap fedora -wi-ao---- 1.20g 
[root@fedora20 ~]#

Como podemos observar, se generó un sólo logical volume dentro del volume group, el cual ocupa todo el espacio disponible, si por ejemplo, los logs (como /var/log/messages ó /var/log/httpd/error.log) crecieran más allá de lo normal, podrían ocasionar una caída de nuestro equipo.

Para solucionarlo es necesario realizar un procedimiento con un disco de rescate, ya que no es posible realizarlo con el sistema ejecutándose de manera normal. Utilizaremos el disco de rescate (rhel-server-7.0-x86_64-boot.iso) de RHEL7, que podemos bajar de:

http://ftp.redhat.com/redhat/rhel/rc/7/Server/x86_64/iso/

Reiniciamos el server con el disco de rescate y booteamos sin montar el sistema de archivos que encuentre:

Cuando estamos dentro del ambiente de rescate, activamos el volumen que contiene nuestro LV root, ejecutando:

sh-4.2# lvmdiskscan
 /dev/loop0            [ 259.58 MiB]
 /dev/mapper/live-rw   [   2.00 GiB]
 /dev/loop1            [   2.00 GiB]
 /dev/vda1             [ 500.00 MiB]
 /dev/mapper/live-base [   2.00 GiB]
 /dev/loop2            [ 512.00 MiB]
 /dev/vda2             [  11.51 GiB] LVM physical volume
 /dev/fedora/swap      [   1.02 GiB]
 /dev/fedora/root      [  10.31 GiB]
 4 disks
 4 partitions
 0 LVM physical volume whole disks
 1 LVM physical volume
sh-4.2# 
sh-4.2# vgscan
 Reading all physical volumes. This may take a while...
 Found volume group "fedora" using metadata type lvm2
sh-4.2# 
sh-4.2# vgchange -ay fedora
 2 logical volume(s) in volume group "fedora" now active
sh-4.2# 
sh-4.2# lvs
 LV   VG     Attr      LSize Pool Origin Data% Move Log Cpy%Sync Convert
 root fedora -wi-a---- 10.31g
 swap fedora -wi-a---- 1.20g
sh-4.2#

Con el LV root activo, realizamos un fsck para validar su integridad:

sh-4.2# e2fsck -y /dev/fedora/root
e2fsck 1.42.9 (28-Dec-2013)
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/fedora/root: clean, 22423/675952 files (0.1% non-contiguos), 260495/27022336 blocks
sh-4.2#

Después de esto, procedemos a reducir el LV root:

sh-4.2# resize2fs /dev/fedora/root 3G
Resizing the filesystem on /dev/fedora/root to 786432 (4k) blocks.
The filesystem /dev/fedora/root is now 786432 blocks long.

sh-4.2# 
sh-4.2# lvreduce -L 3G /dev/fedora/root
 WARNING: Reducing active logical volume to 3.00 GiB
 THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce root? [y/n]: y
 Reducing logical volume root to 3.00 GiB
 Logical volume root successfully resized
sh-4.2# 
sh-4.2# lvs
 LV   VG     Attr      LSize Pool Origin Data% Move Log Cpy%Sync Convert
 root fedora -wi-a---- 3.00g
 swap fedora -wi-a---- 1.20g
sh-4.2# 
sh-4.2# exit

Al reiniciar, encontramos modificado nuestro particionamiento:

[root@fedora20 ~]# df -h
Filesystem             Size Used Avail Use% Mounted on
/dev/mapper/fedora-root2.9G 1.8G 1.1G  54%  /
devtmpfs               994M    0 994M   0%  /dev
tmpfs                 1002M    0 1002M  0%  /dev/shm
tmpfs                 1002M 472K 1001M  1%  /run
tmpfs                 1002M    0 1002M  0%  /sys/fs/cgroup
tmpfs                 1002M 4.0K 1002M  1%  /tmp
/dev/vda1              477M  75M 374M  17%  /boot
[root@fedora20 ~]# vgs
 VG    #PV #LV #SN Attr   VSize  VFree
 fedora 1  2   0   wz--n- 11.51g 7.31g 
[root@fedora20 ~]# lvs
 LV   VG     Attr       LSize Pool Origin Data% Move Log Cpy%Sync Convert
 root fedora -wi-ao---- 3.0g 
 swap fedora -wi-ao---- 1.20g 
[root@fedora20 ~]#

Operaciones básicas

Ya con espacio disponible podemos crear un particionamiento que consideremos conveniente para nuestro sistema. Por ejemplo, separar los logs en su propio filesystem; para ello, primeramente, validamos el espacio utilizado actualmente:

[root@fedora20 ~]# du -sh /var/log
10M /var/log
[root@fedora20 ~]#

Considerando un crecimiento diez veces su tamaño actual, creamos el volumen correspondiente y lo formateamos como ext4:

[root@fedora20 ~]# lvcreate -L+100M -n logs fedora
 Logical volume "logs" created
[root@fedora20 ~]# 
[root@fedora20 ~]# lvs
 LV   VG     Attr       LSize Pool Origin Data% Move Log Cpy%Sync Convert
 logs fedora -wi-a----- 100.00m 
 root fedora -wi-ao---- 3.00g 
 swap fedora -wi-ao---- 1.20g 
[root@fedora20 ~]# 
[root@fedora20 ~]# mkfs.ext4 /dev/fedora/logs 
mke2fs 1.42.8 (20-Jun-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks: 
 8193, 24577, 40961, 57345, 73729

Allocating group tables: done 
Writing inode tables: done 
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done 

[root@fedora20 ~]#

Montamos temporalmente el LV en /mnt, para copiar el contenido de /var/log en él:

[root@fedora20 ~]# mount /dev/fedora/logs /mnt
[root@fedora20 ~]# 
[root@fedora20 ~]# df -h /mnt
Filesystem              Size Used Avail Use% Mounted on
/dev/mapper/fedora-logs 93M  1.6M 85M   2%   /mnt
[root@fedora20 ~]# 
[root@fedora20 ~]# cp -pRf /var/log/* /mnt/
[root@fedora20 ~]# ls -l /mnt
total 64
drwxr-xr-x. 2 root root 1024 Jun 5 01:04 anaconda
drwxr-x---. 2 root root 1024 Jun 5 01:13 audit
-rw-r--r--. 1 root root 6283 Jun 5 08:52 boot.log
-rw-------. 1 root utmp 384 Jun 5 01:29 btmp
drwxr-sr-x+ 3 root systemd-journal 1024 Jun 5 01:13 journal
-rw-r--r--. 1 root root 292000 Jun 5 08:52 lastlog
drwx------. 2 root root 12288 Jun 5 09:05 lost+found
drwx------. 2 root root 1024 Aug 1 2013 ppp
-rw-r--r--. 1 root root 1040 Apr 7 21:10 README
-rw-------. 1 root root 0 Jun 5 00:55 tallylog
-rw-rw-r--. 1 root utmp 13440 Jun 5 08:52 wtmp
[root@fedora20 ~]#

Configuramos el LV en el /etc/fstab de manera permanente y lo montamos:

[root@fedora20 ~]# vi /etc/fstab 
[root@fedora20 ~]# 
[root@fedora20 ~]# tail -1 /etc/fstab 
/dev/fedora/logs /var/log ext4 defaults 0 0
[root@fedora20 ~]# 
[root@fedora20 ~]# mount /var/log
[root@fedora20 ~]# 
[root@fedora20 ~]# df -h /var/log
Filesystem              Size Used Avail Use% Mounted on
/dev/mapper/fedora-logs 93M  12M  75M   14%  /var/log
[root@fedora20 ~]#

Para evitar que algún log haya detenido su escritura, los rotamos, reiniciamos journald y validamos que la bitácora esté activa:

[root@fedora20 ~]# logrotate /etc/logrotate.conf
[root@fedora20 ~]# 
[root@fedora20 ~]# systemctl restart systemd-journald.service
[root@fedora20 ~]# 
[root@fedora20 ~]# date
Thu Jun 5 09:25:32 CDT 2014
[root@fedora20 ~]# journalctl -f
-- Logs begin at Thu 2014-06-05 01:13:05 CDT. --
Jun 05 09:23:56 fedora20.example-rh.com systemd-journal[1096]: Journal stopped
Jun 05 09:23:56 fedora20.example-rh.com systemd-journal[1103]: Runtime journal is using 8.0M (max allowed 100.1M, trying to leave 150.1M free of 992.7M available → current limit 100.1M).
Jun 05 09:23:56 fedora20.example-rh.com systemd-journal[1103]: Runtime journal is using 8.0M (max allowed 100.1M, trying to leave 150.1M free of 992.7M available → current limit 100.1M).
Jun 05 09:23:56 fedora20.example-rh.com systemd-journald[1096]: Received SIGTERM
Jun 05 09:23:56 fedora20.example-rh.com systemd[1]: Starting Journal Service...
Jun 05 09:23:56 fedora20.example-rh.com systemd[1]: Started Journal Service.
Jun 05 09:23:56 fedora20.example-rh.com systemd-journal[1103]: Journal started
Jun 05 09:23:56 fedora20.example-rh.com systemd[1]: Starting Trigger Flushing of Journal to Persistent Storage...
Jun 05 09:23:56 fedora20.example-rh.com systemd[1]: Started Trigger Flushing of Journal to Persistent Storage.
Jun 05 09:23:56 fedora20.example-rh.com systemd-journal[1103]: Runtime journal is using 8.0M (max allowed 100.1M, trying to leave 150.1M free of 992.7M available → current limit 100.1M).
^C
[root@fedora20 ~]#

Si necesitaramos más espacio en el filesystem, primeramente expandimos el LV y después ejecutamos el resize (contrario a como lo reducimos):

[root@fedora20 ~]# lvextend -L+100M /dev/fedora/logs
Extending logical volume logs to 200.00 MiB
Logical volume logs successfully resized
[root@fedora20 ~]#
[root@fedora20 ~]# resize2fs /dev/fedora/logs
resize2fs 1.42.8 (20-Jun-2013)
Filesystem at /dev/fedora/logs is mounted on /mnt; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/fedora/logs is now 204800 blocks long.
[root@fedora20 ~]#
[root@fedora20 ~]# df -h /var/log/
Filesystem              Size Used Avail Use% Mounted on
/dev/mapper/fedora-logs 190M 12M  168M  7%   /var/log
[root@fedora20 ~]#

En caso de que necesitemos un punto de retorno, creamos un snapshot de nuestro LV:

[root@fedora20 ~]# lvcreate -L 15M -s -n logs5jun /dev/fedora/logs 
 Rounding up size to full physical extent 16.00 MiB
 Logical volume "logs5jun" created
[root@fedora20 ~]#

Si requerimos restaurar a partir del snapshot, ejecutamos:

[root@fedora20 ~]# touch /var/log/test
[root@fedora20 ~]# 
[root@fedora20 ~]# ls -l /var/log/test 
-rw-r--r--. 1 root root 0 Jun 5 09:54 /var/log/test
[root@fedora20 ~]#
[root@fedora20 ~]# lvconvert --merge /dev/fedora/logs5jun 
 Logical volume fedora/logs contains a filesystem in use.
 Can't merge over open origin volume.
 Merging of snapshot logs5jun will start next activation.
[root@fedora20 ~]#

Al reiniciar se habrá restaurado nuestro LV:

[root@fedora20 ~]# ls -l /var/log/test 
ls: cannot access /var/log/test: No such file or directory
[root@fedora20 ~]#

En los próximos posts veremos como configurar un LV en HA para utilizarlo en un clúster.

Espero les sirva…