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:89600–103679
# 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://es.linux-console.net/?p=868
https://www.redeszone.net/tutoriales/seguridad/cifrar-discos-particiones-archivos-luks-linux/