Creo que estoy llegando al límite de capacidad en el disco de sistema del Proxmox VE que instalé en un Dell OptiPlex 7050 hace algo más de un año, en Julio de 2023.

Por este motivo he decidido investigar un poco cómo funciona el almacenamiento en Proxmox para ver si es necesario reemplazarlo por otro de mayor capacidad.

Discos SSD

Inicialmente se hizo una instalación básica de Proxmox VE en el disco /dev/sdb (Micron 1100 SATA 256GB) de 238.47GiB usando ext4 como sistema de ficheros y un hdsize de 214.0 para dejar un 10% de espacio de over provisioning.

Se puede utilizar el comando smartctl -a /dev/sdb para obtener información sobre este disco:

Model Family:     Crucial/Micron Client SSDs
Device Model:     Micron 1100 SATA 256GB
Serial Number:    <Redactado>
LU WWN Device Id: 5 00a075 114d65a16
Firmware Version: M0DL002
User Capacity:    256,060,514,304 bytes [256 GB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    Solid State Device
Form Factor:      M.2
TRIM Command:     Available, deterministic, zeroed
Device is:        In smartctl database 7.3/5319
ATA Version is:   ACS-3 T13/2161-D revision 5
SATA Version is:  SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Tue Nov 26 18:17:14 2024 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

Al finalizar la instalación se añadió un segundo disco /dev/sda (Crucial CT1000MX500SSD1) de 931.51GiB usando ext4 como sistema de ficheros y un hdsize de 838.4 para dejar también un 10% de OP.

La información sobre este segundo disco se obtiene usando el comando smartctl -a /dev/sda:

Model Family:     Crucial/Micron Client SSDs
Device Model:     CT1000MX500SSD1
Serial Number:    <Redactado>
LU WWN Device Id: 5 00a075 1e69da803
Firmware Version: M3CR045
User Capacity:    1,000,204,886,016 bytes [1.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    Solid State Device
Form Factor:      2.5 inches
TRIM Command:     Available
Device is:        In smartctl database 7.3/5319
ATA Version is:   ACS-3 T13/2161-D revision 5
SATA Version is:  SATA 3.3, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Tue Nov 26 18:22:57 2024 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

Logical Volume Manager (LVM)

Proxmox VE utiliza por defecto el framework Logical Volume Manager (LVM) para gestionar el disco local seleccionado durante el proceso de instalación (en mi caso /dev/sdb).

  • Un physical volume (PV) está formados por un único disco o partición física
  • Un volume group (VG) está formado por uno o más PVs
  • Los logical volumes (LVs), una especie de “particiones virtuales”, se crean dentro de los VGs

LVM (Wikimedia)

Particiones

Se puede utilizar el comando fdisk -l para mostrar información sobre las particiones creadas en cada uno de los discos instalados en el servidor Proxmox:

root@pve:~# fdisk -l /dev/sdb
Disk /dev/sdb: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: Micron 1100 SATA
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 7BF8C68E-6BD5-4ADA-99E7-76A2AF97B415

Device       Start       End   Sectors  Size Type
/dev/sdb1       34      2047      2014 1007K BIOS boot
/dev/sdb2     2048   2099199   2097152    1G EFI System
/dev/sdb3  2099200 448790528 446691329  213G Linux LVM

Partition 1 does not start on physical sector boundary.
root@pve:~# fdisk -l /dev/sda
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: CT1000MX500SSD1 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 2432B13C-852B-2344-9022-06AC8CA99F67

Device     Start        End    Sectors   Size Type
/dev/sda1   2048 1758220287 1758218240 838.4G Linux LVM

Se observa que las particiones /dev/sdb3 y /dev/sda1 son de tipo Linux LVM, el tipo utilizado por defecto en Proxmox.

El comando partx -s también permite obtener información sobre las particiones de los discos:

root@pve:~# partx -s /dev/sdb
NR   START       END   SECTORS  SIZE NAME UUID
 1      34      2047      2014 1007K      2f60d165-bb81-430c-bc83-8c25ba48ffef
 2    2048   2099199   2097152    1G      e7ee1e90-f3f1-40aa-a0a6-b4afe1ffe08b
 3 2099200 448790528 446691329  213G      191002ca-91c8-409d-9987-9905b56884b3
root@pve:~# partx -s /dev/sda
NR START        END    SECTORS   SIZE NAME UUID
 1  2048 1758220287 1758218240 838.4G      9bc0bc79-7737-1b41-802d-27db38d0151d

Physical Volume

En mi caso, durante la instalación inicial, se creó un physical volume (PV) en /dev/sdb3, tal como muestra la salida del comando pvs -v:

root@pve:~# pvs -v
  PV         VG  Fmt  Attr PSize    PFree  DevSize  PV UUID                               
  /dev/sdb3  pve lvm2 a--  <213.00g 16.00g <213.00g yXMM4U-NI1V-d2Bx-LGZq-zdXV-BxRD-VuDisz

Se puede utilizar el comando pvdisplay para mostrar información sobre este PV:

root@pve:~# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sdb3
  VG Name               pve
  PV Size               <213.00 GiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              54527
  Free PE               4097
  Allocated PE          50430
  PV UUID               yXMM4U-NI1V-d2Bx-LGZq-zdXV-BxRD-VuDisz

El PV /dev/sdb3, que forma parte del VG pve, tiene un tamaño de <213.00 GiB de los cuales quedan libres 16.00 GiB (4097 PE de 4.00 MiB). Un PE o physical extent es la unidad más pequeñas en la que se divide un PV.

Volume Group

Dentro del PV /dev/sdb3se creó un único volume group (VG) llamado pve, tal como muestra la salida del comando vgs -v:

root@pve:~# vgs -v
  VG  Attr   Ext   #PV #LV #SN VSize    VFree  VG UUID                                VProfile
  pve wz--n- 4.00m   1  21   0 <213.00g 16.00g sFUh8l-RtdT-YCZA-vTJb-6YET-EUM9-2HTwU6

Se puede utilizar el comando vgdisplay para mostrar información sobre este VG:

root@pve:~# vgdisplay
  --- Volume group ---
  VG Name               pve
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  12361
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                21
  Open LV               17
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <213.00 GiB
  PE Size               4.00 MiB
  Total PE              54527
  Alloc PE / Size       50430 / 196.99 GiB
  Free  PE / Size       4097 / 16.00 GiB
  VG UUID               sFUh8l-RtdT-YCZA-vTJb-6YET-EUM9-2HTwU6

El VG pve tiene un tamaño de <213.00 GiB de los cuales quedan libres 16.00 GiB (4097 PE de 4.00 MiB). Un PE o physical extent es la unidad más pequeñas en la que se divide un PV.

Logical Volumes

Finalmente, dentro del VG pve se asignaron los logical volumes (LV) data, root y swap, tal como muestra la salida del comando lvs:

root@pve:~# lvs
  LV               VG  Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  data             pve twi-aotz-- <123.24g             47.45  2.80                            
  root             pve -wi-ao----  <63.25g                                                    
  swap             pve -wi-ao----    8.00g

El LV data, que utiliza Thin Provisioning tal como indica el atributo twi-aotz--, tiene un tamaño virtual de <123.24g pero únicamente el 47.45% de este espacio está efectivamente utilizado.

Se puede utilizar el comando lvdisplay para mostrar información sobre estos LVs:

root@pve:~# lvdisplay 
  --- Logical volume ---
  LV Name                data
  VG Name                pve
  LV UUID                hOJQqQ-IlAz-YMu6-JuDf-LK7H-sXZ5-cosYyZ
  LV Write Access        read/write (activated read only)
  LV Creation host, time proxmox, 2023-07-09 13:27:59 +0200
  LV Pool metadata       data_tmeta
  LV Pool data           data_tdata
  LV Status              available
  # open                 0
  LV Size                <123.24 GiB
  Allocated pool data    47.44%
  Allocated metadata     2.79%
  Current LE             31549
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:5
   
  --- Logical volume ---
  LV Path                /dev/pve/swap
  LV Name                swap
  VG Name                pve
  LV UUID                s5m0EI-15w1-ZtIM-Puep-zYbi-SUs5-xL9mTv
  LV Write Access        read/write
  LV Creation host, time proxmox, 2023-07-09 13:27:55 +0200
  LV Status              available
  # open                 2
  LV Size                8.00 GiB
  Current LE             2048
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0
   
  --- Logical volume ---
  LV Path                /dev/pve/root
  LV Name                root
  VG Name                pve
  LV UUID                jFldLS-iJn5-YO2j-63X5-VYn7-1OSD-saekeD
  LV Write Access        read/write
  LV Creation host, time proxmox, 2023-07-09 13:27:56 +0200
  LV Status              available
  # open                 1
  LV Size                <63.25 GiB
  Current LE             16191
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1

El contenido de cada uno de estos LVs es el siguiente:

  • El LV root (/dev/pve/root) contiene el sistema operativo Proxmox montado en /
  • El LV swap (/dev/pve/swap) se utiliza como espacio de swap
  • El LV data contiene las imágenes de disco de las máquinas virtuales

El LV data no tiene un LV Path porque se trata de un LV-thin pool. Los datos se almacenan directamente en el pool y se gestionan a través de las imágenes de disco.

Tipos de storage

Los diferentes tipos de storage que se pueden utilizar en Proxmox se clasifican en dos clases:

  • File: sistema tradicional que permite acceder a un sistema de ficheros de tipo POSIX. Aquí se puede almacenar todo tipo de contenido
  • Block: permite almacenar imágenes raw grandes y soportan snapshots y clones. No es posible guardar otro tipo de ficheros (ISO, backups, etc.)

En mi instalación, al ser bastante simple, únicamente se utilizan los siguientes tipos de almacenamiento:

Descripción Plugin type Level Shared Snapshots Stable
Directory dir file no no (sí, usando qcow2) yes
LVM lvm block no (sí, usándolo sobre iSCSI) no yes
LVM-thin lvmthin block no yes yes

El capítulo 7 de la “Proxmox VE Administration Guide” está dedicado completamente al almacenamiento en Proxmox VE.

La configuración de los storage pools de Proxmox se define desde DatacenterStorage. En mi caso tengo los siguientes a día de hoy:

Storage Pools

La configuración de estos storage pools se guarda en el fichero /etc/pve/storage.cfg:

root@pve:~# cat /etc/pve/storage.cfg
dir: local
        path /var/lib/vz
        content iso,vztmpl
        shared 0

# default image store on LVM based installation
lvmthin: local-lvm
        thinpool data
        vgname pve
        content rootdir,images

dir: datos
        path /datos
        content backup
        prune-backups keep-all=1
        shared 0

Los diferentes contenidos que se puede almacenar en los storage pool son:

  • images: Imágenes de máquinas virtuales QEMU/KVM
  • rootdir: Datos de los contenedores LXC
  • vztmpl: Plantillas de contenedores LXC
  • backup: Ficheros de backup (vzdump)
  • iso: Imágenes ISO
  • snippets: Fragmentos de fichero, por ejemplo guest hook scripts

El comando pvesm status permite obtener información sobre el estado actual de los storage pools:

root@pve:~# pvesm status
Name             Type     Status           Total            Used       Available        %
datos             dir     active       864183016       476347896       343863280   55.12%
local             dir     active        64962140         7360388        54269452   11.33%
local-lvm     lvmthin     active       129224704        61368811        67855892   47.49%

Se puede ver el contenido de un storage pool usando el comando pvesm list <storage_pool> tal como se muestra a continuación:

root@pve:~# pvesm list datos
Volid                                                    Format  Type            Size VMID
datos:backup/vzdump-lxc-300-2024_11_21-03_00_45.tar.zst  tar.zst backup     329562204 300
[...]
datos:backup/vzdump-qemu-101-2024_11_27-03_00_05.vma.zst vma.zst backup    1829078542 101
oot@pve:~# pvesm list local
Volid                                                    Format  Type           Size VMID
local:vztmpl/debian-11-turnkey-core_17.1-1_amd64.tar.gz  tgz     vztmpl    206782882
local:vztmpl/debian-12-turnkey-core_18.0-1_amd64.tar.gz  tgz     vztmpl    211493902
local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst     tzst    vztmpl    126129049
local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst     tzst    vztmpl    126515062
local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst tzst    vztmpl    129824858
root@pve:~# pvesm list local-lvm 
Volid                      Format  Type             Size VMID
local-lvm:base-700-disk-0  raw     images    17179869184 700
local-lvm:vm-101-disk-0    raw     images        4194304 101
local-lvm:vm-101-disk-1    raw     images    34359738368 101
local-lvm:vm-300-disk-0    raw     rootdir    4294967296 300
local-lvm:vm-301-disk-0    raw     rootdir    2147483648 301
[...]
local-lvm:vm-313-disk-0    raw     rootdir    4294967296 313
local-lvm:vm-700-cloudinit raw     images        4194304 700

Storage pool local-lvm vs Volume group pve

Entonces, ¿qué relación hay entre el storage pool local-lvm y el volume group pve?

  • Volume Group (VG) pve: Durante la instalación de Proxmox se crea un VG llamado pve. Este VG se utiliza para gestionar el espacio de almacenamiento del sistema
  • Logical Volume (LV) data: Dentro del VG pve, se crean varios LVs. Uno de ellos, llamado data, es un LV-thin pool. Este LV se utiliza para almacenar imágenes de máquinas virtuales (VMs) y snapshots de manera eficiente
  • Storage Pool local-lvm: El storage pool local-lvm hace referencia a este LV data. Es un pool de almacenamiento LVM-thin que permite la creación de snapshots y clones de manera eficiente

local-lvm

¿Necesito un disco más grande?

Podemos ejecutar el comando lvs -a para mostrar todos los volúmenes lógicos, incluso los componentes internos y los segmentos que normalmente no se muestran:

root@pve:~# lvs -a
  LV               VG  Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  base-700-disk-0  pve Vri---tz-k   16.00g data                                               
  data             pve twi-aotz-- <123.24g             47.49  2.80                            
  [data_tdata]     pve Twi-ao---- <123.24g                                                    
  [data_tmeta]     pve ewi-ao----    1.25g                                                    
  [lvol0_pmspare]  pve ewi-------    1.25g                                                    
  root             pve -wi-ao----  <63.25g                                                    
  swap             pve -wi-ao----    8.00g                                                    
  vm-101-disk-0    pve Vwi-aotz--    4.00m data        0.00                                   
  vm-101-disk-1    pve Vwi-aotz--   32.00g data        16.53                                  
  vm-300-disk-0    pve Vwi-aotz--    4.00g data        98.63                                  
  vm-301-disk-0    pve Vwi-aotz--    2.00g data        99.51                                  
  vm-302-disk-0    pve Vwi-aotz--   20.00g data        72.66                                  
  vm-303-disk-0    pve Vwi-aotz--    2.00g data        99.77                                  
  vm-304-disk-0    pve Vwi-aotz--    8.00g data        60.37                                  
  vm-305-disk-0    pve Vwi-aotz--    8.00g data        36.88                                  
  vm-306-disk-0    pve Vwi-aotz--    4.00g data        99.83                                  
  vm-307-disk-0    pve Vwi-a-tz--   11.00g data        25.58                                  
  vm-308-disk-0    pve Vwi-aotz--    2.00g data        56.48                                  
  vm-309-disk-0    pve Vwi-aotz--    4.00g data        56.38                                  
  vm-310-disk-0    pve Vwi-a-tz--    8.00g data        97.73                                  
  vm-311-disk-0    pve Vwi-aotz--    4.00g data        46.16                                  
  vm-312-disk-0    pve Vwi-aotz--    4.00g data        32.45                                  
  vm-313-disk-0    pve Vwi-aotz--    4.00g data        32.27                                  
  vm-700-cloudinit pve Vwi-a-tz--    4.00m data        9.38

La suma del tamaño asignado a cada uno de los volúmenes lógicos correspondientes a los discos de las máquinas virtuales y de los contenedores LXC es de 135GB. Si el porcentaje de uso de estos discos fuese del 100% se superaría los 123,24GB asignados al storage pool data.

Ahora bien, hay algo que no cuadra y no consigo entender el porqué. Por ejemplo, si examino el LV vm-300-disk-0 usando el comando lvdisplay se muestra que el 98.63% de los 4.00 GiB está ocupado:

root@pve:~# lvdisplay /dev/pve/vm-300-disk-0
  --- Logical volume ---
  LV Path                /dev/pve/vm-300-disk-0
  LV Name                vm-300-disk-0
  VG Name                pve
  LV UUID                Cf3Gji-VJgm-3YkL-nj2P-AlAz-Vtnc-jcLUV9
  LV Write Access        read/write
  LV Creation host, time pve, 2023-11-01 20:59:45 +0100
  LV Pool name           data
  LV Status              available
  # open                 1
  LV Size                4.00 GiB
  Mapped size            98.63%
  Current LE             1024
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:6

En cambio, si accedemos al contenedor LXC 300 y ejecutamos el comando df -kh se muestra únicamente un 31% de uso:

root@samba ~# df -kh
Filesystem                        Size  Used Avail Use% Mounted on
/dev/mapper/pve-vm--300--disk--0  3.9G  1.2G  2.6G  31% /
none                              492K  4.0K  488K   1% /dev
udev                              7.7G     0  7.7G   0% /dev/tty
tmpfs                             7.7G     0  7.7G   0% /dev/shm
tmpfs                             3.1G  1.5M  3.1G   1% /run
tmpfs                             5.0M     0  5.0M   0% /run/lock

¿Alguien sabría explicarme el motivo?

Errores al crear LXC

En la situación explicada anteriormente, la creación de un LXC con un tamaño de disco de 8GB genera el siguiente error:

WARNING: You have not turned on protection against thin pools running out of space.
WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full.
Logical volume "vm-314-disk-0" created.
WARNING: Sum of all thin volume sizes (<141.01 GiB) exceeds the size of thin pool pve/data and the amount of free space in volume group (16.00 GiB).

Queda claro que, aunque no me cuadren los números, al crear este nuevo LXC estaría por encima de la capacidad real disponible en el disco y eso podría provocar corrupción o pérdida de datos.

Actualización del disco

Para poder actualizar el disco de sistema he comprado un nuevo disco M.2 NVMe y una carcasa compatible:

La idea es la siguiente:

  • Colocar el nuevo disco M.2 NVMe en la carcasa y conectarlo al servidor usando el puerto USB-C del frontal
  • Acceder a la shell de Proxmox y comprobar que el nuevo disco es detectado
  • Reiniciar el servidor y arrancar desde una ISO de Clonezilla
  • Clonar el disco de sistema en el nuevo disco
  • Apagar el servidor, desconectar la carcasa y sacar el nuevo disco clonado
  • Intercambiar el disco de sistema por el nuevo disco clonado
  • Poner en marcha el servidor y comprobar que Proxmox se inicia correctamente
  • Reiniciar el servidor y arrancar desde una ISO de GParted
  • Ampliar la partición de sistema para que ocupe el 90% del nuevo disco
  • Reiniciar el servidor y comprobar que Proxmox se inicia correctamente
  • Extender el volúmen lógico data
  • Comprobar que se pueden crear LXC/VM sin errores

Nuevo disco /dev/sdc

Una vez conectada la carcasa al puerto USB-C del frontal, el comando fdisk -l muestra que se ha detectado un nuevo disco /dev/sdc.

La salida del comando anterior muestra los dos discos físicos existentes (/dev/sda y /dev/sdb):

root@pve:~# fdisk -l
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: CT1000MX500SSD1 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 2432B13C-852B-2344-9022-06AC8CA99F67

Device     Start        End    Sectors   Size Type
/dev/sda1   2048 1758220287 1758218240 838.4G Linux LVM


Disk /dev/sdb: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: Micron 1100 SATA
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 7BF8C68E-6BD5-4ADA-99E7-76A2AF97B415

Device       Start       End   Sectors  Size Type
/dev/sdb1       34      2047      2014 1007K BIOS boot
/dev/sdb2     2048   2099199   2097152    1G EFI System
/dev/sdb3  2099200 448790528 446691329  213G Linux LVM

Partition 1 does not start on physical sector boundary.


Disk /dev/sdc: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: SN580 1TB       
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

El comando fdisk -l también muestra los volúmenes lógicos /dev/mapper/xxxxx correspondientes a los discos de los LXC/VM mapeados a través de LVM, pero se han omitido de la salida anterior.

Clonezilla

Para realizar el clonado del disco /dev/sdb en el disco /dev/sdc he utilizado Clonezilla, una herramienta gratuita y de código abierto que permite clonar y hacer imágenes de discos.

He descargado la versión stable 3.2.0-5 de Clonezilla en formato ISO para amd64 y la he grabado en un pendrive que tengo formateado con Ventoy.

A continuación he reiniciado el servidor y he pulsado F12 para seleccionar el pendrive anterior y arrancar desde él. Una vez dentro de Ventoy se ha seleccionado el fichero clonezilla-live-3.2.0-5-amd64.iso para iniciar Clonezilla:

  • Seleccionar Clonezilla live (VGA 800x600)
  • Lenguaje: English
  • Keyboard layout: US keyboard
  • Ejecutar Clonezilla
  • Seleccionar device-device
  • Seleccionar Beginner mode
  • Seleccionar disk_to_local_disk
  • Seleccionar source: sdb 256GB_Micron_1100_SATA_pci
  • Seleccionar target: sdc 1000GB_SN580_1TB__pci
  • Seleccionar -sfsck (skip checking/repairing source file system)
  • Seleccionar -k0 (use the partition table from the source disk)
  • Seleccionar -p choose (choose reboot/shutdown/etc when everything is finished)

Según se puede ver en los mensajes que aparecen en pantalla, las opciones seleccionadas equivalen al siguiente comando: /usr/sbin/ocs-onthefly -g auto -e1 auto -e2 -r -j2 -sfsck -k0 -p choose -f sdb -d sdc.

Clonezilla va realizando diferentes procesos y mostrando la salida por pantalla (con algunos warning o errores que se supone no tienen importancia) y, al final, se ejecutan diferentes comandos relacionados con LVM (lvresize, resize2fs, e2fsck, etc.)

Una vez finalizado el proceso, elijo la opción poweroff para apagar el servidor e intercambiar los discos NVMe.

En Proxmox por primera vez

Una vez reemplazado el disco NVMe, se pone en marcha el servidor y se comprueba que Proxmox se inicia correctamente. El disco NVMe se detecta en /dev/nvme0n1.

Se puede utilizar el comando smartctl -a /dev/nvme0n1 para obtener información sobre este disco:

smartctl 7.3 2022-02-28 r5338 [x86_64-linux-6.8.12-2-pve] (local build)
Copyright (C) 2002-22, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Number:                       WD Blue SN580 1TB
Serial Number:                      <Redactado>
Firmware Version:                   281010WD
PCI Vendor/Subsystem ID:            0x15b7
IEEE OUI Identifier:                0x001b44
Total NVM Capacity:                 1,000,204,886,016 [1.00 TB]
Unallocated NVM Capacity:           0
Controller ID:                      0
NVMe Version:                       1.4
Number of Namespaces:               1
Namespace 1 Size/Capacity:          1,000,204,886,016 [1.00 TB]
Namespace 1 Formatted LBA Size:     512
Namespace 1 IEEE EUI-64:            001b44 4a41d2b9f0
Local Time is:                      Wed Jan  1 12:25:22 2025 CET
Firmware Updates (0x14):            2 Slots, no Reset required
Optional Admin Commands (0x0017):   Security Format Frmw_DL Self_Test
Optional NVM Commands (0x00df):     Comp Wr_Unc DS_Mngmt Wr_Zero Sav/Sel_Feat Timestmp Verify
Log Page Attributes (0x7e):         Cmd_Eff_Lg Ext_Get_Lg Telmtry_Lg Pers_Ev_Lg *Other*
Maximum Data Transfer Size:         256 Pages
Warning  Comp. Temp. Threshold:     84 Celsius
Critical Comp. Temp. Threshold:     88 Celsius
Namespace 1 Features (0x02):        NA_Fields

Supported Power States
St Op     Max   Active     Idle   RL RT WL WT  Ent_Lat  Ex_Lat
 0 +     4.80W    4.80W       -    0  0  0  0        0       0
 1 +     3.30W    3.00W       -    0  0  0  0        0       0
 2 +     2.20W    2.00W       -    0  0  0  0        0       0
 3 -   0.0150W       -        -    3  3  3  3     1500    2500
 4 -   0.0050W       -        -    4  4  4  4    10000    6000
 5 -   0.0033W       -        -    5  5  5  5   176000   25000

Supported LBA Sizes (NSID 0x1)
Id Fmt  Data  Metadt  Rel_Perf
 0 +     512       0         2
 1 -    4096       0         1

=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

SMART/Health Information (NVMe Log 0x02)
Critical Warning:                   0x00
Temperature:                        43 Celsius
Available Spare:                    100%
Available Spare Threshold:          10%
Percentage Used:                    0%
Data Units Read:                    10,659 [5.45 GB]
Data Units Written:                 447,368 [229 GB]
Host Read Commands:                 234,195
Host Write Commands:                1,774,791
Controller Busy Time:               2
Power Cycles:                       12
Power On Hours:                     1
Unsafe Shutdowns:                   2
Media and Data Integrity Errors:    0
Error Information Log Entries:      0
Warning  Comp. Temperature Time:    0
Critical Comp. Temperature Time:    0
Temperature Sensor 1:               64 Celsius
Temperature Sensor 2:               40 Celsius

Error Information (NVMe Log 0x01, 16 of 256 entries)
No Errors Logged

El comando fdisk -l muestra que las particiones de este disco coinciden exactamente (tamaño, inicio, final, etc.) con las que tenía el disco original, es decir la clonación ha sido un éxito:

root@pve:~# fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: WD Blue SN580 1TB                       
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7BF8C68E-6BD5-4ADA-99E7-76A2AF97B415

Device           Start       End   Sectors  Size Type
/dev/nvme0n1p1      34      2047      2014 1007K BIOS boot
/dev/nvme0n1p2    2048   2099199   2097152    1G EFI System
/dev/nvme0n1p3 2099200 448790528 446691329  213G Linux LVM

La ejecución de los comandos de Proxmox para interactuar con los PV, VG y LV muestran los mismos datos que obtuve inicialmente cuando comencé a mirar este tema.

Physical volumes (PV):

root@pve:~# pvs -v
  PV             VG  Fmt  Attr PSize    PFree  DevSize  PV UUID                               
  /dev/nvme0n1p3 pve lvm2 a--  <213.00g 16.00g <213.00g yXMM4U-NI1V-d2Bx-LGZq-zdXV-BxRD-VuDisz
root@pve:~# pvdisplay 
  --- Physical volume ---
  PV Name               /dev/nvme0n1p3
  VG Name               pve
  PV Size               <213.00 GiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              54527
  Free PE               4097
  Allocated PE          50430
  PV UUID               yXMM4U-NI1V-d2Bx-LGZq-zdXV-BxRD-VuDisz

Volume groups (VG):

root@pve:~# vgs -v
  VG  Attr   Ext   #PV #LV #SN VSize    VFree  VG UUID                                VProfile
  pve wz--n- 4.00m   1  21   0 <213.00g 16.00g sFUh8l-RtdT-YCZA-vTJb-6YET-EUM9-2HTwU6 
root@pve:~# vgdisplay
  --- Volume group ---
  VG Name               pve
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  14161
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                21
  Open LV               17
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <213.00 GiB
  PE Size               4.00 MiB
  Total PE              54527
  Alloc PE / Size       50430 / 196.99 GiB
  Free  PE / Size       4097 / 16.00 GiB
  VG UUID               sFUh8l-RtdT-YCZA-vTJb-6YET-EUM9-2HTwU6

Logical volumes (LV):

root@pve:~# lvs
  LV               VG  Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  base-700-disk-0  pve Vri---tz-k   16.00g data                                               
  data             pve twi-aotz-- <123.24g             47.98  2.82                            
  root             pve -wi-ao----  <63.25g                                                    
  swap             pve -wi-ao----    8.00g   
root@pve:~# lvdisplay 
  --- Logical volume ---
  LV Name                data
  VG Name                pve
  LV UUID                hOJQqQ-IlAz-YMu6-JuDf-LK7H-sXZ5-cosYyZ
  LV Write Access        read/write (activated read only)
  LV Creation host, time proxmox, 2023-07-09 13:27:59 +0200
  LV Pool metadata       data_tmeta
  LV Pool data           data_tdata
  LV Status              available
  # open                 0
  LV Size                <123.24 GiB
  Allocated pool data    47.98%
  Allocated metadata     2.82%
  Current LE             31549
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:5
   
  --- Logical volume ---
  LV Path                /dev/pve/swap
  LV Name                swap
  VG Name                pve
  LV UUID                s5m0EI-15w1-ZtIM-Puep-zYbi-SUs5-xL9mTv
  LV Write Access        read/write
  LV Creation host, time proxmox, 2023-07-09 13:27:55 +0200
  LV Status              available
  # open                 2
  LV Size                8.00 GiB
  Current LE             2048
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0
   
  --- Logical volume ---
  LV Path                /dev/pve/root
  LV Name                root
  VG Name                pve
  LV UUID                jFldLS-iJn5-YO2j-63X5-VYn7-1OSD-saekeD
  LV Write Access        read/write
  LV Creation host, time proxmox, 2023-07-09 13:27:56 +0200
  LV Status              available
  # open                 1
  LV Size                <63.25 GiB
  Current LE             16191
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1

Una vez comprobado que todo funciona igual que con el disco original, llega el momento de utilizar todo el espacio existente en el nuevo disco.

GParted

Para realizar la ampliación de la partición /dev/nvme0n1p3 he utilizado GParted, una herramienta gratuita que permite gestionar las particiones.

He descargado la versión 1.6.0-10 de GParted en formato ISO para amd64 y la he grabado en un pendrive que tengo formateado con Ventoy.

A continuación he reiniciado el servidor y he pulsado F12 para seleccionar el pendrive anterior y arrancar desde él. Una vez dentro de Ventoy se ha seleccionado el fichero gparted-live-1.6.0-10-amd64.iso para iniciar GParted:

  • Seleccionar Gparted live (VGA 800x600)
  • Keymap: Don’t touch keymap
  • Language: 33 US English
  • Ejecutar GParted
  • Seleccionar /dev/nvme0n1p3 213.00GiB; Usados 197.00GiB (92%); Sin usar 16.00GiB (8%)
  • Usar las teclas ALT+P para seleccionar el menú “Partition”
  • Seleccionar “Resize/Move” y usar los siguientes valores:
    • New size: 857560MiB
    • Free space following (MiB) 95284 (dejo un 10% libre para OP igual que estaba el disco original)
  • Usar el tabulador para pulsar el botón “Resize”
  • Usar el tabulador para pulsar el botón “Apply”
  • Aceptar el mensaje para aplicar las operaciones pendientes
  • Usar el tabulador para pulsar el botón “Close”
  • Usar las teclas ALT+G para seleccionar el menú “GParted”
  • Seleccionar “Quit”
  • Usar las teclas ALT+F1 para abrir una terminal
  • Ejecutar el comando sudo shutdown -h now
  • Quitar el pendrive y pulsar ENTER para apagar el servidor

GParted ejecuta un comando similar al siguiente lvm pvresize -v --yes --setphysicalvolumesize 878141440K '/dev/nvme0n1p3' para realizar esta ampliación.

En Proxmox por segunda vez

Una vez ampliada la partición, se pone en marcha el servidor y se comprueba que Proxmox sigue iniciando correctamente.

El comando fdisk -l muestra que la partición se ha ampliado:

root@pve:~# fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: WD Blue SN580 1TB                       
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7BF8C68E-6BD5-4ADA-99E7-76A2AF97B415

Device           Start        End    Sectors   Size Type
/dev/nvme0n1p1      34       2047       2014  1007K BIOS boot
/dev/nvme0n1p2    2048    2099199    2097152     1G EFI System
/dev/nvme0n1p3 2099200 1758382079 1756282880 837.5G Linux LVM

Además, vemos como GParted ha ampliado el physical volume (PV) correspondiente:

root@pve:~# pvs -v
  PV             VG  Fmt  Attr PSize    PFree   DevSize PV UUID                               
  /dev/nvme0n1p3 pve lvm2 a--  <837.46g 540.46g 837.46g yXMM4U-NI1V-d2Bx-LGZq-zdXV-BxRD-VuDisz
root@pve:~# pvdisplay 
  --- Physical volume ---
  PV Name               /dev/nvme0n1p3
  VG Name               pve
  PV Size               <837.46 GiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              214389
  Free PE               138359
  Allocated PE          76030
  PV UUID               yXMM4U-NI1V-d2Bx-LGZq-zdXV-BxRD-VuDisz

Y también se ha expandido el volume group (VG):

root@pve:~# vgs -v
  VG  Attr   Ext   #PV #LV #SN VSize    VFree   VG UUID                                VProfile
  pve wz--n- 4.00m   1  22   0 <837.46g 540.46g sFUh8l-RtdT-YCZA-vTJb-6YET-EUM9-2HTwU6
root@pve:~# vgdisplay 
  --- Volume group ---
  VG Name               pve
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  14378
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                22
  Open LV               17
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <837.46 GiB
  PE Size               4.00 MiB
  Total PE              214389
  Alloc PE / Size       76030 / 296.99 GiB
  Free  PE / Size       138359 / 540.46 GiB
  VG UUID               sFUh8l-RtdT-YCZA-vTJb-6YET-EUM9-2HTwU6

GParted, en versiones recientes, expande automáticamente el PV al nuevo tamaño de la partición. LVM, que es muy eficiente en la gestión de volúmenes, detecta automáticamente el espacio adicional en el PV y ajusta el VG para incluir este nuevo espacio.

Extender el storage pool

Una vez ampliado el tamaño de la partición → PV → VG, se procede a ampliar el tamaño del LV pve/data (storage pool donde se guardan los discos de las VM y LXC).

Para ello se utiliza el comando lvextend y, en este caso, se realiza una ampliación de 100GB:

root@pve:~# lvextend -L +100G pve/data
  Size of logical volume pve/data_tdata changed from <123.24 GiB (31549 extents) to <223.24 GiB (57149 extents).
  Logical volume pve/data successfully resized.
root@pve:~# pvesm status
Name             Type     Status           Total            Used       Available        %
datos             dir     active       864183016       503012928       317198248   58.21%
local             dir     active        64962140         7442572        54187268   11.46%
local-lvm     lvmthin     active       234082304        62640424       171441879   26.76%

Se podría haber usado +100%FREE para ocupar todo el espacio disponible en el VG.

Micron 1100 SATA

El Micron 1100 SATA es un disco M.2 PCIe NVMe de 3ª generación, Clase 40 y tamaño 2280 (22m x 80mm).

El servidor Dell OptiPlex 7050 Micro tiene un socket M.2 que soporta tanto discos SATA M.2 como discos PCI NVMe (PCI 3.0 x4). La siguiente tabla muestra algunos discos compatibles y no excesivamente caros:

Disco Capacidad Velocidad de lectura secuencial Velocidad de escritura secuencial Interfaz Tecnología NAND Factor de forma Garantía
Micron 1100 275 GB - 2 TB Hasta 530 MB/s Hasta 500 MB/s SATA TLC 2.5” y M.2 3 años
Crucial P3 1TB M.2 PCIe Gen3 NVMe SSD 1 TB 3500 MB/s 3000 MB/s PCIe 3.0 QLC M.2 (2280) 5 años
Crucial P3 Plus SSD 1TB PCIe Gen4 NVMe M.2 1 TB 5000 MB/s 4200 MB/s PCIe 4.0 QLC M.2 (2280) 5 años
WD Blue SN580 1 TB, M.2 NVMe SSD, PCIe Gen4 x4 1 TB 5600 MB/s 3100 MB/s PCIe 4.0 TLC M.2 (2280) 5 años
Samsung 980 1 TB PCIe 3.0 1 TB 3500 MB/s 3300 MB/s PCIe 3.0 TLC M.2 (2280) 5 años

Referencias

Historial de cambios

  • 2024-11-26: Documento inicial (investigación y datos técnicos)
  • 2025-01-01: Clonezilla/GParted