Reducción partición LVM física para liberar el espacio libre

Antes de iniciar cualquier proceso de modificación de volúmenes LVM se recomienda hacer copias de seguridad de los datos, para en caso de error poder recuperar la información.

Situación Inicial

Antes de explicar las pasos a llevar a cabo voy a explicar el problema o la situación del disco a liberar el espacio.

Utilizo un disco SSD externo, en concreto un Crucial X8 SSD de 1 TB, el cual uso como sistema operativo personal en ordenadores que no son propios, por ejemplo, ordenador de trabajo.

Tengo instalada una distribución Ubuntu, mi distribución en mi equipo personal es OpenSUSE, la idea es añadir OpenSUSE y usarla como distribución por defecto del disco, dejando Ubuntu para pruebas o algún uso puntual.

Como es un disco USB, existen posibilidades de perderlo o que me lo quiten, decidí que la partición de datos estuviera encriptada y que fuera una partición LVM, también distribuí es espacio para instalar una segunda distribución.

El disco tiene actualmente 3 particiones, una es utilizada la EFI, otra para el boot y la 3 es la partición LVM y encriptada con LUKS.

La partición LVM esta a su vez particionada en varios volúmenes y no de ellos sin usar y preparado para la instalación de otra distribución.

En el momento de hacer el particionamiento no dejé fuera de la encriptación espacio para crear otra partición para un segundo boot para instalar otra distribución, tampoco dejé el volumen lógico donde iba a instarla al final del disco sino que está entre otros 2 volúmenes. Por esto motivos tengo que realizar una serie de modificaciones para evitar tener que reinstalar las 2 distribuciones.

Una vez explicado lo anterior, vamos a ver los pasos para hacer.

Todo el proceso se realizará desde un Live USB de OpenSUSE y desde una consola de linea de comando con usuario root.

Información actual del particionamiento del disco

Antes de iniciar el movimiento de las unidades lógicas obtendremos el estado del particionamiento para comprobar que el espacio libre permite mover las unidades lógicas que hay al final.

Información del disco y particiones

# fdisk -l

....
Disco /dev/sda: 931,53 GiB, 1000204886016 bytes, 1953525168 sectores
Disk model: Crucial X8 SSD  
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 33553920 bytes
Tipo de etiqueta de disco: gpt
Identificador del disco: BA807749-D11C-4CBE-A4FD-826EEE4BC1CD

Dispositivo Comienzo      Final   Sectores Tamaño Tipo
/dev/sda1      65535    1048559     983025   480M Sistema EFI
/dev/sda2    1048560    2555864    1507305   736M Sistema de ficheros de Linux
/dev/sda3    2555865 1953467279 1950911415 930,3G Sistema de ficheros de Linux

De la información anterior podemos ver que el disco está en la ruta /dev/sda que tiene 3 particiones, la primera la partición EFI, la segunda corresponde a la partición /boot y la 3 es la partición LVM donde están los volúmnes lógicos. Esta partición está encriptada y lo podemos comprobar con el siguiente comando:

# lsblk -f |grep sda3
└─sda3      crypto_LUKS                          ae1c39f0-a645-448a-94d6-e59e99dfd3be

Para seguir viendo el estado de las particiones lo primero que hay que hacer es desbloquear o abrir la encriptación de esa partición.

# cryptsetup luksOpen /dev/sda3 vgubuntu
Introduzca una contraseña para /dev/sda3:

Introduciendo la clave de acceso. Para obtener la información del estado de LVM ejecutamos los siguientes comandos:

  • Estado de ocupación
# pvs 
  PV                   VG       Fmt  Attr PSize   PFree  
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 250,20g

Donde se puede ver que tiene libres 250,20 GB de un total de 930,20GB. Espacio que dejé libre para instarla la segunda distribución.

  • Volúmenes lógicos asignados con el espacio asignado
# lvs
  LV    VG       Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  datos vgubuntu -wi-a----- 300,00g                                                    
  home  vgubuntu -wi-a----- 100,00g                                                    
  root  vgubuntu -wi-a----- 250,00g                                                    
  swap  vgubuntu -wi-a-----  30,00g 
  • Distribución de los segmentos en el disco
# pvs --segments -v
  PV                   VG       Fmt  Attr PSize   PFree   Start  SSize LV    Start Type   PE Ranges                         
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 250,20g      0 64000 root      0 linear /dev/mapper/vgubuntu:0-63999      
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 250,20g  64000 25600 home      0 linear /dev/mapper/vgubuntu:64000-89599  
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 250,20g  89600 64000           0 free                                     
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 250,20g 153600 76800 datos     0 linear /dev/mapper/vgubuntu:153600-230399
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 250,20g 230400  7680 swap      0 linear /dev/mapper/vgubuntu:230400-238079
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 250,20g 238080    52           0 free  

Para poder reducir el grupo de volúmenes y liberarlo es necesario que el espacio libre esté al final del grupo, como se puede observar, esto no pasa ya que se encuentra en casi su totalizada entre los volúmenes home y datos.
Debemos mover el volumen datos y swap y de esa forma tener el espacio libre al final, pero aquí nos encontramos con otro problema, el comando pvmove necesita que el bloque destino, donde ubicar el volumen origen, sea igual o mayor que el actual. El volumen datos es de 300GB mientras que el libre es inferior, entorno a 250GB. Por lo que tendremos que dar un paso mas, que consistirá en reducir el volumen datos. Esto también se puede comprobar mirando los valores de la columna SSize del volumen datos y el espacio libre (free), donde 76800 > 64000.

Viendo esta situación y que tengo que reducir la partición datos, voy a aprovechar para liberar unos 100GB del volumen datos, y como no necesito tanto swap lo reduciré a 15GB de swap. Con los 115GB se creará la nueva partición boot para openSUSE y una partición fuera del grupo de volúmenes, con formato NTFS y sin encriptación para usar como disco USB en Windows. Contendrá datos que no me importe que se vea en caso perdida o robo.

Planteamiento ejecución

Para minimizar los tiempo se va a reducir el volumen lógico datos todo lo posible, siendo los pasos los siguientes:

  • Eliminar del volumen swap
  • Realizar el proceso de reducción del volumen datos
  • Mover el volumen datos para dejar el espacio libre al final
  • Reducir el grupo de volúmenes 115GB
  • Realizar los pasos para ampliar el volumen datos hasta los 200GB
  • Crear el volumen donde estará ubicada la distribución OpenSUSE (root-os)
  • Crear el volumen swap y formatearlo

Eliminación volumen swap

Este paso es bastante sencillo se usar el comand lvremove con el path donde se ubica el volumen y confirmando su eliminación

# lvremove /dev/vgubuntu/swap 
Do you really want to remove and DISCARD active logical volume vgubuntu/swap? [y/n]: y
  Logical volume "swap" successfully removed

Pasos reducción volumen LVM

Montamos el volumen para comprobar el espacio ocupado. La idea es disminuir el sistema de ficheros al máximo, de tal forma, que el movimiento del volumen sea el menor posible

# mkdir -p /mnt/datos  
# mount /dev/mapper/vgubuntu-datos /mnt/datos/
# df -h /mnt/datos/
S.ficheros                 Tamaño Usados  Disp Uso% Montado en
/dev/mapper/vgubuntu-datos   295G    31G  249G  11% /mnt/datos

Tiene disponibles 249G, lo reduciremos hasta los 55G. Procedemos a desmontar el sistema de ficheros para iniciar la reducción.

# umount /mnt/datos/

Chequeamos el sistema fichero

# e2fsck -f /dev/vgubuntu/datos 
e2fsck 1.45.5 (07-Jan-2020)
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
/dev/vgubuntu/datos: 92135/19660800 ficheros (0.2% no contiguos), 9440685/78643200 bloques

Realizamos la reducción a nivel de sistema de ficheros

# resize2fs /dev/vgubuntu/datos 55G
resize2fs 1.45.5 (07-Jan-2020)
Cambiando el tamaño del sistema de ficheros en /dev/vgubuntu/datos a 14417920 (4k) bloques.
El sistema de ficheros en /dev/vgubuntu/datos tiene ahora 14417920 bloques (de 4k).

Realizamos la reducción del volumen lógico

# lvreduce -L -245G /dev/vgubuntu/datos 
  WARNING: Reducing active logical volume to 55,00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vgubuntu/datos? [y/n]: y
  Size of logical volume vgubuntu/datos changed from 300,00 GiB (76800 extents) to 55,00 GiB (14080 extents).
  Logical volume vgubuntu/datos successfully resized.

Comprobamos que se ha realizado la reducción

# pvs -v
  PV                   VG       Fmt  Attr PSize   PFree   DevSize  PV UUID                               
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 525,20g <930,24g BS2eDF-wRqn-esFk-ZROi-8BQp-G7NI-UXXDJP

# lvs
  LV    VG       Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  datos vgubuntu -wi-a-----  55,00g                                                    
  home  vgubuntu -wi-a----- 100,00g                                                    
  root  vgubuntu -wi-a----- 250,00g  

Mover todo el espacio libre al final del grupo de volúmenes

Obtenemos el rango del los segmentos al mover, en nuestro caso es un rango

# pvs -v --segments
  PV                   VG       Fmt  Attr PSize   PFree   Start  SSize LV    Start Type   PE Ranges                         
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 525,20g      0 64000 root      0 linear /dev/mapper/vgubuntu:0-63999      
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 525,20g  64000 25600 home      0 linear /dev/mapper/vgubuntu:64000-89599  
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 525,20g  89600 64000           0 free                                     
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 525,20g 153600 14080 datos     0 linear /dev/mapper/vgubuntu:153600-167679
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 525,20g 167680 70452           0 free

Calculamos el tamaño y la nueva ubicación que partirá de la posición 89600, primera libre después del final del volumen home sien la posición final el tamaño del volumen datos.
Esto se calcula restando el rango del volumen datos (final – inicial) 167679 – 153600 = 14079.

Como se puede observar, otra forma de calcular el tamaño es restando 1 al valor de la columna SSize del volumen 14080 – 1 = 14079.

Con el valor de inicio 89600 y final ( 89600+14079) se obtiene el valor el destino que será: /dev/mapper/vgubuntu:89600103679

# pvmove --alloc anywhere /dev/mapper/vgubuntu:153600-167679 /dev/mapper/vgubuntu:89600-103679

Este paso tardará bastante tiempo, dependiendo del tamaño de la partición y la velocidad del disco, en mi caso son 55G, que ha tardado aproximadamente 1 hora.

# pvmove --alloc anywhere /dev/mapper/vgubuntu:153600-167679 /dev/mapper/vgubuntu:89600-103679
  /dev/mapper/vgubuntu: Moved: 0,13%
  /dev/mapper/vgubuntu: Moved: 0,59%
  /dev/mapper/vgubuntu: Moved: 1,05%
  /dev/mapper/vgubuntu: Moved: 1,50%
  /dev/mapper/vgubuntu: Moved: 1,96%
  /dev/mapper/vgubuntu: Moved: 2,41%
...

Confirmamos que esta el espacio al final

# pvs -v --segments
  PV                   VG       Fmt  Attr PSize   PFree   Start  SSize  LV    Start Type   PE Ranges                        
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 525,20g      0  64000 root      0 linear /dev/mapper/vgubuntu:0-63999     
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 525,20g  64000  25600 home      0 linear /dev/mapper/vgubuntu:64000-89599 
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 525,20g  89600  14080 datos     0 linear /dev/mapper/vgubuntu:89600-103679
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  930,20g 525,20g 103680 134452           0 free

Reducir el grupo de volúmenes 115GB

Reducimos el grupo de volúmenes desde los 930,2GB a los 812,2G:

# pvresize -v --setphysicalvolumesize 812,2G /dev/mapper/vgubuntu
  Archiving volume group "vgubuntu" metadata (seqno 40).
/dev/mapper/vgubuntu: Requested size <812,20 GiB is less than real size <930,24 GiB. Proceed?  [y/n]: y
  Accepted input: [y]
  WARNING: /dev/mapper/vgubuntu: Pretending size is 1703306854 not 1950845880 sectors.
  Resizing volume "/dev/mapper/vgubuntu" to 1703306854 sectors.
  Resizing physical volume /dev/mapper/vgubuntu from 238132 to 207915 extents.
  Updating physical volume "/dev/mapper/vgubuntu"
  Creating volume group backup "/etc/lvm/backup/vgubuntu" (seqno 41).
  Physical volume "/dev/mapper/vgubuntu" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

Con el valor del número de sectores 1703306854, re dimensionamos el cifrado. Nos pide la clave de descifrado para poder realizar la operación.

# cryptsetup --size 1703306854 resize vgubuntu
Introduzca una contraseña para /dev/sda3:

Ahora toca realizar los cambios que se han realizado para minimizar el tiempo de mover datos, 1 ampliamos el volumen datos hasta su nuevo espacio y creamos de nuevo el espacio swap

Realizar los pasos para ampliar el volumen datos hasta los 200GB

Ampliamos el volumen de datos hasta los 200

# lvextend -L 200G /dev/vgubuntu/datos
  Size of logical volume vgubuntu/datos changed from 55,00 GiB (51200 extents) to 200,00 GiB (88320 extents).
  Logical volume vgubuntu/datos successfully resized.

Comprobamos el sistema de ficheros y los amplicamos

# e2fsck -f /dev/vgubuntu/datos 
e2fsck 1.45.5 (07-Jan-2020)
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
/dev/vgubuntu/datos: 11/3604480 ficheros (0.0% no contiguos), 501727/14417920 bloques

Extendemos el sistema de fichero hasta los 200G

# resize2fs /dev/vgubuntu/datos 200G
resize2fs 1.45.5 (07-Jan-2020)
Cambiando el tamaño del sistema de ficheros en /dev/vgubuntu/datos a 52428800 (4k) bloques.
El sistema de ficheros en /dev/vgubuntu/datos tiene ahora 52428800 bloques (de 4k).

Crear el volumen donde estar ubicada la distribución OpenSUSE (root-os)

Como prefiero tener el espacio swap al final, realizamos primero la creación del volumen donde instalar la nueva distribución, sin formatearla, el formateo se realizará durante la instalación.

# lvcreate -L 250G -n root_os vgubuntu
  Logical volume "root_os" created.

Crear el volumen swap y formatearlo

Creamos el espacio swap asignado todo el espacio libre restantes

# lvcreate -l 100%FREE -n swap vgubuntu
  Logical volume "swap" created.

Formateamos el espaco swap

# mkswap /dev/vgubuntu/swap 
Configurando espacio de intercambio versión 1, tamaño = 12,2 GiB (13065252864 bytes)
sin etiqueta, UUID=6831c051-69bf-4181-a444-dec0231bbab5

Redimensionamiento partición sda3

Por último queda redimensionar la partición del disco sda3, como la partición está encriptada con LUKS se debe redimensionar primero la encriptación.
Optenemos la información de tamaño de los sectores (sector size)

# cryptsetup status vgubuntu
/dev/mapper/vgubuntu is active.
  type:    LUKS2
  cipher:  aes-xts-plain64
  keysize: 512 bits
  key location: keyring
  device:  /dev/sda3
  sector size:  512
  offset:  65535 sectors
  size:    1950845880 sectors
  mode:    read/write

También obtenemos el espacio del grupo de volúmenes

# pvs -v 
  PV                   VG       Fmt  Attr PSize    PFree DevSize  PV UUID                               
  /dev/mapper/vgubuntu vgubuntu lvm2 a--  <812,17g    0  <930,24g BS2eDF-wRqn-esFk-ZROi-8BQp-G7NI-UXXDJP

Como vemos el espacio de grupo de volúmenes es de 812,17G y el del dispositivo sigue siendo de 930,24G.

Para redimensionar la encryptación hace falta conocer el número de sectores, se obtiene de dividir el nuevo espacio en bytes entre el tamaño del sector
812,17 * 1024 * 1024 * 1024 (PSize en bytes) / 512 (sector size) = 1703243939,84
Redondeando al entero superior = 1703243940

Hacemos el cambio del tamaño, nos pide la clave para realizarlo:

# cryptsetup --size 1703243940 resize vgubuntu
Introduzca una contraseña para /dev/sda3:

El último paso sería redimensionar la partición física del disco /dev/sda3, esto se puede hacer con GParted y desde linea de comando utilizando la opción resizepart de la aplicación parted . Os pongo como sería con GParted
Elegimos la partición y al redimensionarla seleccionamos en «Alinear con» el valor «Cilindro«, he tenído que alinear con «Cilindro» porque sino dejaba espacio libre en la unidad sda3.

Aplicamos los cambios y habremos finalizado

Conclusiones y notas finales

  • Como he ido realizando el tutorial mientras lo iba haciendo, ha sido un poco lioso todo el proceso.
  • Reitero realizar backup de los datos por si se comete algún error, tocando particiones y volúmnes se puede cometer un error y perder los datos.
  • Tener el sistema Ubuntu instalado sobre volumenes LVM ha tenido sus cosas positivas, ha permitido reducir espacio solo tocando un volumen, pero también me ha complicado porque para redicir el espacio a nivel físico este debe estar al final, esto ha llevado mas tiempo del esperado.
  • Estando en mi situación y si la primera distribución no tiene información importane, sería mucho mas rápido borrar todo, replanificar el disco e instalar las dos distribuciones desde cero. Personalmente lo he realizado por ver como se haría.

Por último os pongo el montajes de particiones como ha quedado ejecutándose la distribución openSUSE:

lsblk -f
NAME                   FSTYPE      FSVER    LABEL       UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
sda                                                                                                           
├─sda1                 vfat        FAT32                B617-AAAD                               468,2M     2% /boot/efi
├─sda2                 ext4        1.0                  abd87bfc-c5b9-48f1-ac6b-a4375fba5189                  
├─sda3                 crypto_LUKS 2                    ae1c39f0-a645-448a-94d6-e59e99dfd3be                  
│ └─cr-auto-1          LVM2_member LVM2 001             BS2eDF-wRqn-esFk-ZROi-8BQp-G7NI-UXXDJP                
│   ├─vgubuntu-root_os btrfs                            ad6ece5c-31c9-4742-afe5-a8d986ce5f07    240,5G     3% /var
│   │                                                                                                         /usr/local
│   │                                                                                                         /root
│   │                                                                                                         /opt
│   │                                                                                                         /srv
│   │                                                                                                         /.snapshots
│   │                                                                                                         /
│   ├─vgubuntu-swap    swap        1                    6831c051-69bf-4181-a444-dec0231bbab5                  [SWAP]
│   ├─vgubuntu-root    ext4        1.0                  45dd6c62-ab9c-4832-a411-3806a8e16824                  
│   ├─vgubuntu-home    ext4        1.0                  30341b74-2a82-4fdb-960f-269ad4d81480     33,5G    60% /home
│   └─vgubuntu-datos   ext4        1.0                  1e0cc03d-99ed-4ad2-9880-377b27f3aa1a    169,8G     8% /mnt/datos
├─sda4                 ext4        1.0                  f0c6f2f6-ad43-47ed-baf0-903692a4f249    599,7M     8% /boot
└─sda5                 vfat        FAT32                6449-F341                               115,8G     0% /mnt/intercambio

En negrita marco las partiones o volúmenes que se comparten entre ambas distribuciones, indicar que en el home no se comparte el mismo nombre el usuario, para evitar conflictos entre ambas distribuciones.

Referencias

https://www.enmimaquinafunciona.com/pregunta/43833/como-reducir-volumenes-logicos-y-fisicos-lvm-ubuntu

https://es.linux-console.net/?p=868

https://www.redeszone.net/tutoriales/seguridad/cifrar-discos-particiones-archivos-luks-linux/