===== Guía rápida y completa de LVM (Logical Volume Manager)===== **Grupos de volúmenes (VG)**: es la parte superior de la LVM. Es la "caja" en la que tenemos nuestros volúmenes lógicos (LV) y nuestros volúmenes físicos (PV). Se puede ver como una unidad administrativa en la que se engloban nuestros recursos. Hay que hacer notar que mientras un PV no se añada al VG, no podemos comenzar a usarlo. **Volúmenes físicos (PV)**: Son los discos / particiones con sistema de archivos LVM. Se puede usar cualquier dispositivo de bloques. **Volúmenes lógicos (LV)**: Es el equivalente a una partición en un sistema tradicional. El LV es visible como un dispositivo estándar de bloques, por lo que puede contener un sistema de archivos (por ejemplo /home). **Áreas / extensiones físicas (PE)**: Los PV se dividen en bloques de datos conocidos como Áreas Físicas (PE), estas áreas físicas tienen todas el mismo tamaño dentro del Grupo de Volumen (VG) al que pertenecen. 4MB. Cada Área Física tiene un identificador que es único dentro del Volumen Físico (PV) al que pertenece. **Las Áreas / extensiones Lógicas (LE)**: No es más que una forma de indicar que Áreas Físicas (PE) forman un Volumen Lógico (LV). Son necesarias porque los identificadores de las Áreas Físicas (PE) sólo son únicos dentro del PV al que pertenecen, pudiendo repetirse en el Volumen Lógico (VG), las Áreas Lógicas (LE) sirven precisamente para solventar este problema, existiendo un mapeado 1:1 entre un Área Lógica (LE) y un Área Física (PE) de un Volumen Físico (PV). **Lectura recomendada**: [[https://access.redhat.com/documentation/es-ES/Red_Hat_Enterprise_Linux/5/html/Logical_Volume_Manager_Administration/index.html| Red Hat (Logical Volume Manager Administration)]] ==== Crear dos dispositivos de bloque usando loopback ==== Para practicar sin usar discos / memorias físicas crearemos dispositivos de bloque (ficheros loop). dd if=/dev/zero of=fichero0 bs=1M count=100 dd if=/dev/zero of=fichero1 bs=1M count=100 losetup /dev/loop1 fichero1 losetup /dev/loop0 fichero0 NOTA: Desactivar completamente un punto de acceso montado mediante ficheros loop. En caso contrario si se quiere reutilizar Linux dirá que ya están en uso y por lo tanto ocupado. umount /dev/loop0 losetup -d /dev/loop0 ==== Inicializar los dispositivos ==== Crea un área de descriptor de grupo de volumen (VGDA) al principio de los discos / dispositivos de bloque. Se perderán los datos contenidos en dichos dispositivos. pvcreate /dev/loop0 pvcreate /dev/loop1 ==== Crear un grupo de volumen==== En LVM, el concepto de grupo de volúmenes (VG) incluye a varios volúmenes lógicos y/o físicos. Podemos crear un VG a partir de los dos dispositivos físicos creados anteriormente. vgcreate mi_vg /dev/loop0 /dev/loop1 ==== Activando/ Desactivando los VG ==== El comando //vgchange// puede cambiar varios atributos de los VG, su función principal es activarlos y desactivarlos (mediante el parámetro -a). Sólo cuando un VG está activo, se puede acceder a los volumenes lógicos que contiene. Si está desactivado (n) el VG, puede activarlo (y) de la siguiente manera: vgchange -a y mi_vg Si estamos utilizando ficheros de loopback, necesitamos volver a crear los dispositivos de bloque losetup /dev/loop0 fichero0 losetup /dev/loop1 fichero1 vgchange -a y prueba_vg ==== Eliminar un VG ==== No debe tener LV en su interior y primero se debe desactivar. vgchange -a n my_volume_group vgremove mi_vg NOTA: Asegúrate de que el volumen físico no está siendo usado por ningún volumen lógico usando el comando '//pvdisplay//'. Si el volumen físico está todavía en uso tendrás que migrar los datos a otro volumen físico usando //pvmove//. ==== Eliminar un LV ==== No tiene que estar montado para poder ser eliminado. lvremove /dev/prueba_vg/congelado Información sobre los PV y los LV. pvdisplay lvdisplay Migrar los datos a otro PV para vaciar de contenido un determinado PV. # Sintaxis: pvmove [-n volumen_lógico] volumen_físico_origen [volumen_fisico_destino ...] pvmove -n /dev/prueba_vg/primer_LV /dev/loop1 /dev/loop0 **volumen_físico_origen**: Indica el Volumen Físico que contiene las Áreas Físicas que se desean migrar. **volumen_físico_destino**: Designa uno o varios Volúmenes Físicos a los que migrar las Áreas Físicas, si no se indica este último parámetro, entonces pvmove lo pondrá donde considere oportuno. **volumen_lógico**: Sirve para concretar que sólo deseamos migrar las Áreas Físicas correspondientes a un determinado Volumen Físico, ya que de lo contrario, intentaría mover todos los Volúmenes Lógicos que haya en el Volumen Físico. Esto se usa para que un dispositivo o partición pueda salir del PV, entonces, los datos se deben reorganizar primero para que quede limpio, en caso contrario se perderían datos. NOTA: Para saber si se puede o no mover datos, tenemos que mirar con el comando pvdisplay cada unidad cuantos PE tiene libres y cuantos ocupados. Se recomienda hacer copias de seguridad antes de hacer migraciones. ==== Eliminar un PV de un VG ==== Para eliminar un disco o partición de un grupo de volumenes, es necesario que haya las mismas extensiones físicas (PE) libres en el VG como ocupadas en el PV que se quiere retirar. Si no hay extensiones físicas libres, se debe instalar un nuevo disco / partición e inicializarlo dentro del VG para que puedan pasarse los datos del disco que se desea retirar. Identificamos el PV que se quiere retirar (sdb1). pvs -o+pv_used PV VG Fmt Attr PSize PFree Used /dev/sda4 Volgroup00 lvm2 a-- 736,02g 0 736,02g /dev/sdb1 Volgroup00 lvm2 a-- 232,88g 0 232,88g pvdisplay pvdisplay --- Physical volume --- PV Name /dev/sda4 VG Name Volgroup00 PV Size 736,02 GiB / not usable 564,00 KiB Allocatable yes (but full) PE Size 4,00 MiB Total PE 188420 Free PE 0 <------------------- Allocated PE 188420 PV UUID yBGKWg-scED-yWi9-sTxo-eRxR-NcjE-8UZebC --- Physical volume --- PV Name /dev/sdb1 VG Name Volgroup00 PV Size 232,88 GiB / not usable 1,18 MiB Allocatable yes (but full) PE Size 4,00 MiB Total PE 59618 Free PE 0 <------------------- Allocated PE 59618 PV UUID 2I1VnJ-x9cN-JVc5-43FK-VO1V-Eneu-v7eIb6 Como en este caso no hay extensiones disponibles, se agrega un nuevo disco (sdd) y se crea una partición (sdd1) igual o mayor al tamaño del disco que se desea expulsar del VG, por ejemplo por mal funcionamiento. Crear la partición no es algo obligatorio para obtener extensiones lógicas libres, pero para nuestro caso se usará una partición ya que no está en mente utilizar todo el disco duro para el grupo de volúmenes Volgroup00. pvcreate /dev/sdd1 vgextend Volgroup00 /dev/sdd1 Volume group "Volgroup00" successfully extended pvdisplay ... --- Physical volume --- PV Name /dev/sdd1 VG Name Volgroup00 PV Size 465,00 GiB / not usable 4,00 MiB Allocatable yes PE Size 4,00 MiB Total PE 119039 Free PE 119039 <------------------- Allocated PE 0 <------------------- PV UUID MZNzzT-eGLJ-aWOr-t5O6-jA8J-jkb9-b3fFLJ pvs -o+pv_used PV VG Fmt Attr PSize PFree Used /dev/sda4 Volgroup00 lvm2 a-- 736,02g 0 736,02g /dev/sdb1 Volgroup00 lvm2 a-- 232,88g 0 232,88g /dev/sdd1 Volgroup00 lvm2 a-- 465,00g 465,00g 0 Movemos los datos del PV /dev/sdb1 al nuevo y disponible /dev/sdd1. pvmove /dev/sdb1 /dev/sdd1 /dev/sdb1: Moved: 0,0% /dev/sdb1: Moved: 0,5% pvs -o+pv_used PV VG Fmt Attr PSize PFree Used /dev/sda4 Volgroup00 lvm2 a-- 736,02g 0 736,02g /dev/sdb1 Volgroup00 lvm2 a-- 232,88g 232,88g 0 /dev/sdd1 Volgroup00 lvm2 a-- 465,00g 232,11g 232,88g Eliminamos el PV /dev/sdb1 del grupo de volúmenes Volgroup00. vgreduce Volgroup00 /dev/sdb1 Removed "/dev/sdb1" from volume group "Volgroup00" pvs -o+pv_used PV VG Fmt Attr PSize PFree Used /dev/sda4 Volgroup00 lvm2 a-- 736,02g 0 736,02g /dev/sdb1 lvm2 --- 232,88g 232,88g 0 /dev/sdd1 Volgroup00 lvm2 a-- 465,00g 232,11g 232,88g Ya se puede retirar el disco duro sin problemas. Lógicamente, si al apagar el sistema, se intercambian los cables de los discos duros, se puede tener de nuevo el disco que actualmente es /dev/sdd, como /dev/sdb. ==== Añadiendo volúmenes físicos (PV) inicializados a un grupo de volúmenes (VG) ==== vgextend mi_vg /dev/loop2 ==== Crear volumen lógico LV ==== El volumen físico es opcional, pero se puede indicar si queremos, uno o varios. lvcreate -L 10M -n primer_lv mi_vg /dev/loop1 ==== Crear un LV que use el espacio total de un VG ==== lvcreate -n mylv --extents 100%FREE testvg Otra opción es usar //vgdisplay// para buscar el tamaño total de PE y ejecutar lo siguiente. vgdisplay testvg | grep "Total PE" --> Total PE 10230 lvcreate -l 10230 testvg -n mylv ==== Utilizar un LV ==== Simplemente hay que darle formato con mkfs u otra aplicación. mkfs.ext3 /dev/mi_vg/primer_lv ==== Añadiendo volúmenes físicos a un grupo de volumen existente ==== vgextend my_volume_group /dev/hdc1 Error: Couldn't find device with uuid XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX. vgextend VolGroup /dev/sdb1 Couldn't find device with uuid yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS. Cannot change VG VolGroup while PVs are missing. Consider vgreduce --removemissing. **Solución**: Eliminar el volumen físico "no encontrado" del grupo de volúmenes, para que siga funcionando como anteriormente. Una vez esté como al principio podemos volver a intentar la tarea que fuera. vgextend VolGroup /dev/sdb1 Couldn't find device with uuid yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS. Cannot change VG VolGroup while PVs are missing. Consider vgreduce --removemissing. pvscan Couldn't find device with uuid yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS. PV /dev/sda2 VG VolGroup lvm2 [19.51 GiB / 0 free] PV unknown device VG VolGroup lvm2 [4.66 GiB / 4.66 GiB free] <-------- PV /dev/sdb1 lvm2 [4.66 GiB] Total: 3 [28.82 GiB] / in use: 2 [24.16 GiB] / in no VG: 1 [4.66 GiB] vgreduce --removemissing --verbose VolGroup Finding volume group "VolGroup" Couldn't find device with uuid yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS. There are 1 physical volumes missing. Trying to open VG VolGroup for recovery... Couldn't find device with uuid yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS. There are 1 physical volumes missing. Archiving volume group "VolGroup" metadata (seqno 4). Removing PV with UUID yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS from VG VolGroup <-------- Creating volume group backup "/etc/lvm/backup/VolGroup" (seqno 5). Wrote out consistent volume group VolGroup pvscan PV /dev/sda2 VG VolGroup lvm2 [19.51 GiB / 0 free] PV /dev/sdb1 lvm2 [4.66 GiB] Total: 2 [24.17 GiB] / in use: 1 [19.51 GiB] / in no VG: 1 [4.66 GiB] ==== Instantánteas (Snapshots) ==== Comprobar que se tienen los módulos del núcleo cargados. dmsetup targets mirror v1.12.0 striped v1.4.1 linear v1.1.0 error v1.0.1 modprobe dm-snapshot dmsetup targets snapshot-merge v1.1.0 <----------- snapshot-origin v1.7.1 <----------- snapshot v1.10.0 mirror v1.12.0 striped v1.4.1 linear v1.1.0 error v1.0.1 lvcreate -L20M -s -n congelado /dev/Volgroup00/lv_root Logical volume "congelado" created. El concepto de instantánea es similar a los enlaces simbólicos que conocemos, cuando se crea un enlace simbólico a un archivo no se realiza una copia del archivo real, sino sólo una referencia al mismo. Los volúmenes lógicos guardan la información de forma muy similar y se compone de dos partes esenciales: Punteros de metadatos (Información sobre donde están los bloques de datos) y Bloques de datos. Cuando se crea una instantánea, simplemente se crea una copia de todos los punteros de metadatos de un volumen lógico. Los metadatos no consumen demasiado espacio, por lo que una instantánea de 5 Mb puede referenciar un volumen de 2GB. El volumen de instantánea sólo aumenta cuando los datos del volumen original a los que referencia crece, cada vez que se elimina o se crea un fichero se crea una copia de este en la instantánea. La recomendación es crear instantáneas con un margen del 5 al 10% del tamaño del volumen lógico original. Por eso, una vez se crea la instantánea, se debe montar, hacer el backup de la misma, desmontarla y eliminarla. No son un proceso de backup, si no una ayuda para hacer copias de seguridad del disco en caliente en un determinado momento. ==== Fusionar / Restablecer / Restaurar una instantánea (Snapshots) ==== Para montar la instantanea para consultar o hacer un backup. mount /dev/Volgroup00/congelado /mnt/XXXX/ # Listar las instantaneas: lvdisplay Fusionar / Restablecer / Restaurar una instantánea (Snapshots) umount /dev/Volgroup00/congelado # En el caso de que esté montada lvconvert --merge /dev/Volgroup00/congelado Si la instantánea hace referencia al sistema de ficheros raíz, este no se podrá desmontar mientras esté el sistema encendido, por lo que se mostrará un mensaje como el siguiente avisando de que se restablecerá la instantánea después de reiniciar. Este suele ser el mensaje cuando se trata de particiones raíz. Logical volume Volgroup00/lv_root contains a filesystem in use. Can't merge over open origin volume. Merging of snapshot Volgroup00/congelado will occur on next activation of Volgroup00/lv_root. **Problema al fusionar una snapshot** (No aplicable a particiones raíz). Can't merge over open origin volume Can't merge when snapshot is open Merging of snapshot XXX will start next activation. **Solución**: La causa suele ser que el snapshot está montada, se debe desmontar (umount) y probar de nuevo. **Problema al fusionar una snapshot** (No aplicable a particiones raíz). Can't merge over open origin volume Merging of snapshot XXX will start next activation. **Solución**: lvchange -an # Desactivamos lvchange -ay # Activamos # Ahora se debe intentar de nuevo fusionar la instantánea. Típico error al querer restaurar una instantánea. Volume group "XXXX" has insufficient free space (0 extents): XXX required. **Solución**: Generar espacio (PE libres) en ese grupo de volúmenes mediante nuevos dispositivos de almacenamiento o bien, reduciendo los volúmenes. Si hiciera referencia a una instantánea del sistema raíz se tendría que usar un LiveCD, ya que los sistemas de ficheros cuando están montados, dependiendo de cuales, se pueden ampliar sin desmontar, pero no reducirlos. ==== Ejemplo de reducción de volumen con un LiveCD ==== Primero se debe activar el grupo de volúmenes desde el LiveCD. LiveCD# pvdisplay (Prestamos especial atención al nombre del grupo de volúmenes "VG Name") LiveCD# lvchange -ay VolGroup (Activamos el VG) LiveCD# e2fsck -f /dev/VolGroup/lv_root (En el caso de ser un sistema de ficheros EXT3.) LiveCD# lvresize -r -L -2G /dev/VolGroup/lv_root (Reducimos 2Gb de su tamaño) LiveCD# lvreduce -r -L 2G /dev/VolGroup/lv_root (Reduce el tamaño de /dev/VolGroup/lv_root a 2 Gb, NO es lo mimso que lo anterior.) Si intentamos ejecutar el comando lvresize en una unidad montada como puede ser "/" pese al aviso, lo más probable es que el sistema no arranque (kernel panic). WARNING: Reducing active and open logical volume to 16.76 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce lv_root? [y/n]: ==== Extendiendo / Expandiendo un volumen lógico ==== Si se extiende un volumen lógico instalando / utilizando una nueva unidad de almacenamiento, primero debemos particionarla (cfdisk), asignarle un sistema de ficheros LVM y posteriormente incluirla dentro de nuestro grupo de volúmenes. Una vez realizado ese proceso, ya podremos usar ese espacio para cualquiera de los volumenes lógicos mediante la orden "lxextend". cfdisk /dev/sdb pvcreate /dev/sdb1 vgextend VolGroup /dev/sdb1 lvextend -r -L+500M /dev/prueba_vg/segundo_LV lvextend -r -l+100%FREE /dev/VolGroup/lv_root Hay muchas formas de especificar la cantidad de espacio que se quiere extender (Mb, Gb, PE, %FREE, etc...) NOTA: Se puede extender el directorio raiz con ext3/ext4 en caliente. ==== Sintaxis lvextend ==== lvextend -l, --extents [+]LogicalExtentsNumber[%{VG|LV|PVS|FREE|ORIGIN}] lvextend -L, --size [+]LogicalVolumeSize[bBsSkKmMgGtTpPeE] De no usar la opción "-r" se debe extender el sistema de ficheros posteriormente: resize2fs (ext) / xfs_growfs (xfs) / resize_reiserfs (reiserfs) / ... resize2fs /dev/prueba_vg/segundo_LV Ext (Siempre desmontado, ext4 puede hacerse montado) resize_reiserfs -f /dev/prueba_vg/segundo_LV Reiser (Montado / desmonado) xfs_growfs /media/puntodemontaje Xfs (Debe estar montado y especificar punto de montaje) mount -o remount,resize /home Jfs (Debe estar montado y especificar punto de montaje) NOTA: Al usar resize2fs es probable que nos pida antes de redimensionar el sistema, ejecutar un e2fsck -f sobre el LV. ==== Extendiendo / Expandiendo un volumen físico (PV) ==== En LVM cabe la posibilidad de querer aumentar el tamaño de un PV, por ejemplo en los supuestos en los que el disco de una máquina virtual ha sido agrandado o bien porque la partición donde teníamos nuestro sistema LVM ha sido redimensionada. Supongamos un ejemplo donde ///dev/sda4// tiene un tamaño limitado pero en el disco hay espacio libre. Si el sistema utiliza MBR, no se podrían poner más particiones, por lo que la única solución sería redimensionar dicha partición, extender el PV y posteriormente extender también el LV o bien crear otro LV dentro del PV previamente extendido. NOTA: Como es lógico no se pueden tener dos VG en un mismo PV. **Redimensionar una partición en GNU/Linux / disco duro virtual**. Una ver redimensionado, la forma más fácil de adaptarlo al nuevo tamaño es borrar la partición que se desea expandir con cfdisk y crear otra nueva que ocupe el nuevo tamaño, seleccionando las mismas opciones que tenía la anterior (boot, tipo, etc). Si se trata de la partición raíz se debe reiniciar el sistema. **Extender el PV para que ocupe ese nuevo tamaño adquirido al redimensionar la partición / VDI** (///dev/sda4//). Muy útil cuando se redimensionan particiones o discos duros virtuales, por ejemplo de VirtualBox. Espacio ocupado por el grupo de volumen PV en ///dev/sda4//. pvs PV VG Fmt Attr PSize PFree /dev/sda4 Volgroup00 lvm2 a-- 186,26g 0 Como hemos redimensionado la partición con cfdisk o cualquier otro software, indicamos al PV que ocupe todo el nuevo espacio físico disponible. pvresize /dev/sda4 Physical volume "/dev/sda4" changed 1 physical volume(s) resized / 0 physical volume(s) not resized Como podemos ver, ahora el PV sí engloba todo el espacio utilizable en ///dev/sda4//. /home/maria pvs PV VG Fmt Attr PSize PFree /dev/sda4 Volgroup00 lvm2 a-- 736,02g 549,76g El siguiente paso sería extender también el LV que queramos ([[guia_rapida_y_completa_de_lvm#extendiendo_expandiendo_un_volumen_logico|leer]]) o bien crear otro LV nuevo, el cual incluso podemos cifrar siguiendo las siguientes instrucciones. ==== Crear un volumen lógico cifrado ==== # Creamos el LV indicanco que use el espacio libre en el grupo de volumen Volgroup00 (Por ejemplo). lvcreate -n cifrado --extents 100%FREE Volgroup00 # Comprobamos que se haya creado. lsblk # Ciframos y formateamos: http://www.busindre.com/cifrar_particiones_en_gnu_linux_facil cryptsetup luksFormat /dev/Volgroup00/cifrado cryptsetup luksUUID /dev/Volgroup00/cifrado cryptsetup luksOpen /dev/Volgroup00/cifrado cifrado mkfs.xfs /dev/mapper/cifrado ==== Reconocer un disco duro / partición instalado en caliente (hotplugged) ==== NOTA: Esto es independiente de LVM, es decir, se use o no LVM en el disco duro se pueden seguir estos pasos para intentar que el sistema lo reconozca. Se presentan varias opciones a continuación. ##### Usando /sys/class/scsi_host (Util para reconocer nuevos discos / particiones) # Se listan todos los posibles "scan" para revisar. ls /sys/class/scsi_host/ host0 host1 host2 host3 host4 host5 echo "- - -" > /sys/class/scsi_host/host0/scan echo "- - -" > /sys/class/scsi_host/host1/scan echo "- - -" > /sys/class/scsi_host/host2/scan ... ##### Comando partprobe (Útil para reconocer particiones cuando no han sido todavía reconocidas por el kernel). partprobe ##### Comando partx (Útil para reconocer particiones cuando no han sido todavía reconocidas por el kernel). # Lista las particiones del disco partx -s /dev/sdb # Forzar que el kernel kernel reconozca todas las paticiones de /dev/sdb. partx -v -a /dev/sdb Una vez reconocido el disco/partición, si queremos utilizarlo para expandir el espacio de / debemos hacer lo siguiente (Pasos vistos y explicados anteriormente en esta guía). ls /sys/class/scsi_host host0 host1 host2 echo "- - -" > /sys/class/scsi_host/host0/scan echo "- - -" > /sys/class/scsi_host/host1/scan echo "- - -" > /sys/class/scsi_host/host2/scan fdisk -l # Debemos ver el nuevo disco duro virtual. cfdisk /dev/sdb # Creamos la partición (/dev/sdb1) lvscan # Se comprueba el espacio actual del LV. pvcreate /dev/sdb1 vgextend VolGroup /dev/sdb1 lvextend -r -l+100%FREE /dev/VolGroup/lv_root lvscan # Se comprueba el nuevo espacio actual del LV. ==== Simular retirada / conexión de un disco duro ==== echo offline > /sys/block/sda/device/state # Pone el disco inaccesible. echo running > /sys/block/sda/device/state # Vuelve a poner el disco accesible. # Borrar un disco (Se usa antes de sacarlo del servidor) # echo 1 > /sys/block/sda/device/delete ==== Reduciendo un volumen lógico ==== Al contrario que al extender no se puede hacer con sistemas de ficheros montados. Para reducir un volumen lógico se debe antes reducir el tamaño del sistema de ficheros, eso lo podemos hacer de forma manual o bien con la opción "-r" (Utiliza fsdam) para que se encargue lvreduce de reducir el sistema de ficheros (Recomendado) lvreduce -r -L-5G /dev/myvg/homevol De hacerlo manualmente hay que especificar el nuevo tamaño del sistema de ficheros resultante en Kb (1 bloque -> 1 kbyte), NO el tamaño que se quiere reducir resize2fs /dev/prueba_vg/segundo_LV 68157440 # Si era LV de 70, ahora le sistema de ficheros es de 65, debemos quitarle 5 al LV lvreduce -L-5G /dev/myvg/homevol **Reiserfs**. lvreduce -r -L-1G /dev/myvg/homevol resize_reiserfs -s-1G /dev/myvg/homevol lvreduce -L-1G /dev/myvg/homevol **XFS / JFS**: No se puede reducir actualmente: [[http://xfs.org/index.php/XFS_FAQ#Q%3A_Is_there_a_way_to_make_a_XFS_filesystem_larger_or_smaller.3F|Leer]] NOTA: De hacerlo manualmente, resize2fs nos avisa si hemos puesto un numero demasiado pequeño indicando el mínimo. resize2fs: New size smaller than minimum (20477). ==== Mover grupos de volumenes a otros sistemas ==== **Exportar**: - Se desmontan las unidades montadas. - Se desactiva. (//vgchange -an design//) - Exportamos el volumen. (//vgexport design//) - Apagamos y sacamos los discos. **Importar**: - Conectamos los discos y escribimos el comando pvscan para encontrar el disco con el VG "//design//" - Importamos (indicando el nombre del VG) todo o bien lo que nos interese: vgimport design /dev/sdb1 /dev/sdb2 - Activamos: vgchange -ay design - Montamos como queramos / como estaba antes: mount /dev/design/users /mnt/design/users ==== Dividir un grupo de volumen para crear un nuevo ==== Útil cuando tenemos todos los discos o particiones ocupados por el mismo. Tenemos que tener el PV limpio, podemos usar pvmove para sacar los datos a otos pv. Se debe desmontar antes el sistemas de ficheros y desactivar. **Supuesto**: Mover sdg2 del vg "caracola" a "design". **Opción 1** vgsplit caracola design /dev/sdg2 **Opción 2** (//vgsplit nos ahorra el ejecutar estos dos comandos//) vgreduce dev /dev/sdg2 # Elimina el PV vgextend design /dev/sdg2 # Lo agraga a otro VG ==== Montar un disco duro con LVM desde un LiveCD ==== Listamos los volúmenes físicos y grupos de volumenes de los discos duros conectados. pvscan PV /dev/sda2 VG VolGroup00 lvm2 [74.41 GB / 32.00 MB free] Total: 1 [74.41 GB] / in use: 1 [74.41 GB] / in no VG: 0 [0 ] vgscan Reading all physical volumes. This may take a while... Found volume group "VolGroup00" using metadata type lvm2 Activamos todos los grupos de volumenes disponibles. vgchange -a y 2 logical volume(s) in volume group "VolGroup00" now active Ejecutamos lvscan para listar todos los volúmenes lógicos existentes para saber cual montar. lvscan ACTIVE '/dev/VolGroup00/LogVol00' [72.44 GB] inherit ACTIVE '/dev/VolGroup00/LogVol01' [1.94 GB] inherit Montamos por ejemplo el volumen lógico LogVol00 en /mnt/volumen0 mount /dev/VolGroup00/LogVol00 /mnt/volumen0 ==== Comandos útiles que muestran información ==== pvscan (-u muestra el uuid) # Dice los tamaños usados de los discos / particiones del VG lvs lvm pvdisplay vgdisplay lvdisplay lsblk ==== Identificar el VG y LV al que pertenece un determinado fichero ==== df -T /home/maria/jondo_linux.tar.bz2 |tail -n 1 |awk '{print $1}' /dev/mapper/Volgroup00-lv_root ==== Conocer el tipo de volumen lógico utilizado (linear / striped) ==== lvs --segments LV VG Attr #Str Type SSize cifrado Volgroup00 -wi-a----- 1 linear 549,76g lv_root Volgroup00 -wi-ao---- 1 linear 184,00g lv_root Volgroup00 -wi-ao---- 1 linear 232,88g lv_swap Volgroup00 -wc-ao---- 1 linear 2,26g ==== Conocer el tamaño de las areas (extents)dentro de un grupo de volúmenes ==== pvdisplay | grep -i "PV Name\|VG Name\|PE Size" PV Name /dev/sda4 VG Name Volgroup00 PE Size 4,00 MiB <------- PV Name /dev/sdb1 VG Name Volgroup00 PE Size 4,00 MiB <------- Como sabemos, existen dos sistemas de medidas para representar múltiplos de bits (o bytes). El SI (sistema internacional de unidades) entiende que un kilobyte son 1000 bytes, mientras que en sistema binario se entienden que son 1024. Por ello, a la medida binaria, en este caso, se le llama Kibibyte, para distinguirlos. Ocurre lo mismo con los MiB (mebibytes) y Gib (gibibytes), que no son exactamente iguales a los MB (megabytes) y GB (gigabytes). ==== Identificar y ubicar las areas lógicas y físicas de los volúmenes lógicos ==== Conocer el número y ubicación física de las áreas (extents) lógicas y físicas de los LVs. lvdisplay --maps |egrep 'Physical|LV Name|Type' ... --- Segments --- Logical extents 0 to 47103: Type linear Physical volume /dev/sda4 Physical extents 0 to 47103 Logical extents 47104 to 106721: Type linear Physical volume /dev/sdb1 Physical extents 0 to 59617 ==== Identificar los bloques / áreas que forman un fichero en disco ==== Si el volumen fue definido como linear y no "striping", es muy difícil encontrar ficheros que tengan partes en más de un dispositivo físico. Obtener la disposición de bloques de un archivo concreto utilizando la utilidad hdparm. hdparm --fibmap /home/maria/Desktop/World_of_Goo_JC4D2G-1.41_Linux.zip /home/maria/Desktop/World_of_Goo_JC4D2G-1.41_Linux.zip: filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors. byte_offset begin_LBA end_LBA sectors 0 186384384 186400767 16384 8388608 187678720 187826175 147456 83886080 187858944 187891711 32768 100663296 188104704 188186623 81920 142606336 188203008 188268543 65536 176160768 188334080 188378919 44840 * byte_offset: Byte en el que empieza cada parte que conforma el fichero. * begin_LBA: En qué bloque comienza una determinada parte. * end_LBA: En qué bloque termina la parte del fichero (se debe contabilizar también). * sectors: El número de sectores que ocupa dicha parte. Interpretando y entendiendo correctamente los campos, se puede calcular el tamaño del fichero en bytes de manera simple: "(44840 x 512)+176160768". Calcular los byte_offset también sería una tarea trivial, "176160768 = 65536 x 512" y ya tenemos los bytes que ocupa esa parte, ahora se debe sumar los bytes que ocupaban las partes anteriores y ya tenemos el byte donde comienza dicha parte "142606336 + (65536 x 512)". Obtener la disposición de áreas de un archivo concreto utilizando la utilidad hdparm. debugfs 1.42.13 (17-May-2011) debugfs: stat /home/cacas/Desktop/World_of_Goo_JC4D2G-1.41_Linux.zip Inode: 270599 Type: regular Mode: 0600 Flags: 0x80000 Generation: 3352783085 Version: 0x00000000:00000001 User: 1000 Group: 1000 Size: 199116706 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 388912 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x55c3c0c0:2b8593ac -- Thu Aug 6 22:17:04 2015 atime: 0x55c3c08f:e4ee4cf0 -- Thu Aug 6 22:16:15 2015 mtime: 0x55c3c0c0:2b8593ac -- Thu Aug 6 22:17:04 2015 crtime: 0x55c3c08f:e4ee4cf0 -- Thu Aug 6 22:16:15 2015 Size of extra inode fields: 28 EXTENTS: (ETB0):1081694, (0-2047):23298048-23300095, (2048-20479):23459840-23478271, (20480-24575):23482368-23486463, (24576-34815):23513088-23523327, (34816-43007):23525376-23533567, (43008-48612):23541760-23547364 /home/maria/Desktop/World_of_Goo_JC4D2G-1.41_Linux.zip: filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors. byte_offset begin_LBA end_LBA sectors 0 186384384 186400767 16384 ---> 186400767 - 186384384 + 1 = 16384 ----> ((23300095 x 8) +8) - (23298048 x 8) ----> ((2047 - 0) x 8 ) + 8 -------> (8388608 - 0) / 512 8388608 187678720 187826175 147456 ---> 187826175 - 187678720 + 1 = 147456 ----> ((23478271 x 8) +8) - (23459840 x 8) ----> ((20479 - 2048) x8 ) + 8 ----> (83886080 - 8388608) / 512 83886080 187858944 187891711 32768 ---> 187891711 - 187858944 + 1 = 32768 ----> ((23486463 x 8) +8) - (23482368 x 8) ----> ((24575 - 20480) x 8 ) +8 ----> (100663296 - 83886080) / 512 100663296 188104704 188186623 81920 ---> 188186623 - 188104704 + 1 = 81920 ----> ((23523327 x 8) +8) - (23513088 x 8) ----> ((34815 - 24576) x 8 ) +8 ----> (142606336 - 100663296) / 512 142606336 188203008 188268543 65536 ---> 188268543 - 188203008 + 1 = 65536 ----> ((23533567 x 8) +8) - (23525376 x 8) ----> ((43007 - 34816) x 8 ) +8 ----> (176160768 - 142606336) / 512 176160768 188334080 188378919 44840 ---> 188378919 - 188334080 + 1 = 44840 ----> ((23547364 x 8) +8) - (23541760 x 8) ----> ((48612 - 43008) x 8 ) +8 NOTA: Se debe sumar 1 ya que el sector final debe ser también contabilizado. En el caso de utilizar sectores físicos, se debe sumar 8 por ese mismo motivo. El valor 8 se debe a que "debugfs" utiliza el tamaño de sector físico (4096 bytes) y no el lógico (512 bytes), por tanto 8 es el resultado de dividir 4096 entre 512. Comentar que es perfectamente posible que las partes que conforman un determinado fichero, ni tienen que ser decuenciales ni tienen por qué estar ordenadas de manera ascendente. Veamos un ejemplo. hdparm --fibmap /home/cacas/archivo.txt /home/mamria/archivo.txt: filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors. byte_offset begin_LBA end_LBA sectors 0 933888 966655 32768 16777216 884736 917503 32768 <---------- 33554432 983040 1015807 32768 50331648 1097728 1163263 65536 ==== Ubicar ficheros cuando el volumen lógico ocupa múltiples discos ==== Para averiguar en que PV se encuentra un determinado fichero, se puede identificar mediante un hash alguna de sus partes y luego buscar una coincidencia en cada disco físico que ocupado por el volumen. Lo primero, es identificar qué volumenes físicos están en uso por el volumen lógico. Para el ejemplo, el volumen lógico "lv_root" está repartido entre sda4 y sdb1, por los que deberemos buscar en esos dos VPs. lvs -o +seg_pe_ranges,vg_extent_size LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert PE Ranges Ext cifrado Volgroup00 -wi-a----- 549,76g /dev/sda4:47682-188419 4,00m lv_root Volgroup00 -wi-ao---- 416,88g /dev/sda4:0-47103 4,00m lv_root Volgroup00 -wi-ao---- 416,88g /dev/sdb1:0-59617 4,00m lv_swap Volgroup00 -wc-ao---- 2,26g /dev/sda4:47104-47681 4,00m ################# pvdisplay --- Physical volume --- PV Name /dev/sda4 ... Allocated PE 188420 -------> 0-47103 (/ ) 47104-4768 (swap) 47682-188419 (cifrado) ... --- Physical volume --- PV Name /dev/sdb1 Total PE 59618 -------> 0-59617 (/ ) ... Identificamos la ubicación de las distintas partes del fichero "jondo_linux.tar.bz2" hdparm --fibmap jondo_linux.tar.bz2 jondo_linux.tar.bz2: filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors. byte_offset begin_LBA end_LBA sectors 0 8314880 8318975 4096 2097152 29638656 29642751 4096 4194304 44793856 44802047 8192 8388608 694616064 694625847 9784 Obtenemos el hash perteneciente a los primeros 2 MiB del fichero. dd if=jondo_linux.tar.bz2 bs=512 skip=0 count=4096 | md5sum 4096+0 registros leídos 4096+0 registros escritos 2097152 bytes (2,1 MB, 2,0 MiB) copied, 0,00767018 s, 273 MB/s 6870dcb82fa7aa7077936036f0b03bec - Obtenemos el hash perteneciente a los primeros 2 MiB del fichero pero usando el volumen lógico donde se ubica. dd if=/dev/mapper/Volgroup00-lv_root bs=512 skip=8314880 count=4096 | md5sum 4096+0 registros leídos 4096+0 registros escritos 2097152 bytes (2,1 MB, 2,0 MiB) copied, 0,0261066 s, 80,3 MB/s 6870dcb82fa7aa7077936036f0b03bec - Obtenemos el espacio ocupado por los metadatos y otra información de LVM al principio del disco. pvck -d -v /dev/sda4 Scanning /dev/sda4 Found label on /dev/sda4, sector 1, type=LVM2 001 Found text metadata area: offset=4096, size=1044480 <---------------------------------- Found LVM2 metadata record at offset=34304, size=2048, offset2=0 size2=0 Found LVM2 metadata record at offset=32256, size=2048, offset2=0 size2=0 Este área de información empieza en el ofsset 4096 y ocupa 1044480 bytes. Si se divide 1044480 entre 512, se obtienen 2040 sectores, pero hay que sumarle los otros 8 (4096/512). Ahora preguntamos por esa parte, en la partición /dev/sda4 incluyendo ese "desplazamiento" de información LVM al principio de disco. dd if=/dev/sda4 bs=512 skip=$(8314880 + 2048) count=4096 | md5sum 4096+0 registros leídos 4096+0 registros escritos 2097152 bytes (2,1 MB, 2,0 MiB) copied, 0,0220594 s, 95,1 MB/s 6870dcb82fa7aa7077936036f0b03bec - Localizado, se encuentra en sda4. NOTA: Si se utilizan discos de diferente tamaño y se identifican el número de sectores de cada uno de ellos, en algunos casos se identificará rápidamente el disco que contiene el fichero, ya que este puede estar ubicado en un bloque que solo esté presente en uno de los dos discos (que coincidiría con el de mayor tamaño.) Si se tiene el volumen lógico usando mapeado lineal repartido en un disco de 3Gb y otro de 4T, la parte correspondiente a 8314880 nunca podría estar en el disco de 3Gb (6291456 sería el último bloque que podría usarse). ==== Relación entre mapeado de dispositivo (dm-0, dm-1, etc) y los volúmenes lógicos.==== Si se está usando LVM, es común encontrarse en métricas de disco o simplemente en la salida de comandos como iostat, los llamados mapeados de dispositivo (dm-0, dm-1, etc). Con estos comandos se puede averiguar a qué volumen lógico se está refiriendo un mapeo dm-x" en concreto, se muestran dos opciones. dmsetup ls luks-20b2aaf7-9353-4732-8f62-ff83bb5e54b7 (254:3) <--- dm-3 Volgroup00-lv_swap (254:1) <--- dm-1 Volgroup00-lv_root (254:0) <--- dm:0 Volgroup00-cifrado (254:2) <--- dm:2 lvdisplay|awk '/LV Name/{n=$3} /Block device/{d=$3; sub(".*:","dm-",d); print d,n;}' dm-0 lv_root dm-1 lv_swap dm-2 cifrado ==== Enlaces de interés ==== [[https://www.busindre.com/nociones_sobre_el_tamano_de_bloque_de_disco | Nociones básicas sobre tamaño de bloque]]\\ [[https://access.redhat.com/documentation/es-ES/Red_Hat_Enterprise_Linux/5/html/Logical_Volume_Manager_Administration/index.html| Red Hat (Logical Volume Manager Administration)]]\\ [[http://busindre.com/recuperar_pv_y_lv_tras_cambios_lvm|Recuperación de Volúmenes físicos / lógicos]]\\ [[http://linuxalbacete.org]] (Muy recomendable).\\ [[http://www.vilecha.com/hellguest/lvm2_info.asp]]\\ [[http://www.olafrv.com/wordpress/wp-content/uploads/2013/08/hp_3par_with_debian_v7.txt]]\\ [[https://www.zimbra.com/products/zimbra-collaboration/calendar-collaboration.html]] (Extender directorio raíz sin reiniciar con ext3/ext4)