Inicio / Comunidad / Blog / Como usar un disco duro externo USB en sistemas GNU/Linux como medio de almacenamiento adicional basado en LVM

Como usar un disco duro externo USB en sistemas GNU/Linux como medio de almacenamiento adicional basado en LVM

Introducción

Actualmente uso una Laptop con dos discos duros internos, un disco es SSD de 32 GB que uso para almacenar el sistema operativo Kubuntu 14.04, y un disco SATA de 500 GB que uso para almacenar datos personales. El disco de datos ya esta llegando al 80% de su capacidad máxima, por lo que es buen tiempo de mover datos a un medio externo.

Para un proyecto de trabajo requiero tener un disco duro externo para almacenar los datos del proyecto, principalmente almacenare las configuraciones y discos duros virtuales de un entorno de máquinas virtuales que uso para laboratorios de estudio e investigación. Para esto quiero usar un disco duro USB externo, prepararlo e intercambiar los accesos del disco local al externo.

Objetivos

En este articulo voy a describir como preparar un disco duro USB externo para utilizarlo como medio de almacenamiento adicional a mi Laptop y sincronizar datos de diferentes volúmenes. Describiremos procedimientos a detalle usando diferentes programas en la línea de comandos y además mostramos las referencias a documentación del sistema acerca de los diferentes programas utilizados.

El articulo lo dividimos en las siguientes secciones:

  • Requerimientos de sistema
  • Conociendo el disco duro externo
  • Revisando el disco vía SMART
  • Particionando el disco
  • Configurando los volúmenes lógicos LVM
  • Creando los sistemas de archivos en los volúmenes lógicos LVM
  • Montando temporalmente los sistemas de archivos de los volúmenes lógicos LVM
  • Asignando permisos
  • Sincronizando los archivos
  • Intercambiamos acceso a datos desde el disco externo
  • Conclusiones
  • Referencias

Requerimientos de sistema

Antes de empezar a particionar y crear sistemas de archivos, he definido los siguientes requerimientos de sistema:

  • Los datos del disco deben de estar disponibles para cualquier equipo GNU/Linux reciente.
  • Usar el tipo de tabla de particiones GPT para soporte de particiones mayor a 4TB.
  • En lugar de usar particiones nativas voy a usar volúmenes lógicos LVM para mayor control.
  • Los sistemas de archivos será ext4 y btrfs, no requiero acceso a clientes Windows.
  • Sincronizar de forma intacta los datos del volumen local al volumen del disco duro externo.
  • En un futuro debería de poder conectar el disco a un equipo Raspberry PI para convertirlo en NAS.

Teniendo bien definidos los requerimientos veamos como realizar nuestro objetivo.

Conociendo el disco duro externo

Tengo el siguiente disco duro externo, el cual es un disco SATA de 320 GB, a continuación muestro la información del disco usando diferentes herramientas de línea de comandos.

Veamos la información de los discos SATA usando el comando lsscsi(8):

# lsscsi
[0:0:0:0] disk ATA ST500LM012 HN-M5 2AR1 /dev/sda
[1:0:0:0] disk ATA SanDisk SSD U100 10.5 /dev/sdb
[2:0:0:0] cd/dvd MATSHITA DVD-RAM UJ8C2 S 1.00 /dev/sr0
[6:0:0:0] disk TOSHIBA MK3276GSX GS00 /dev/sdc

El disco es un TOSHIBA modelo MK3276GSX GS00, y el sistema lo identifica como /dev/sdc.

Ahora veamos la información de capacidades y particiones con el comando fdisk(8):

# fdisk -l /dev/sdc
Disco /dev/sdc: 320.1 GB, 320072933376 bytes
255 cabezas, 63 sectores/pista, 38913 cilindros, 625142448 sectores en total
Unidades = sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
Identificador del disco: 0x00000000
El disco /dev/sdc no contiene una tabla de particiones válida

En la salida del comando fdisk podemos ver la cantidad de cabezas, sectores, pistas, cilindros, ver las unidades y el detalle de la tabla de particiones y las particiones.

El disco duro está vacío, no tiene ninguna tabla de particiones, por lo que está bueno para iniciar desde el principio a preparar este disco.

Revisando el disco vía SMART

Es importante revisar la buena salud del disco duro, y estarlo revisando periodicamente para asegurarnos que almacenamos nuestra información en un medio confiable, para esto, usaremos las herramientas smartmontools para revisar la información S.M.A.R.T del disco.

Primero instalamos las herramientas:

# apt-get install smartmontools

Ahora ejecutamos el comando smartctl con la opción -i para ver la información general:

# smartctl  -i /dev/sdc
smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.2.0-32-generic] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net
=== START OF INFORMATION SECTION ===
Device Model:     ST31000524AS
Serial Number:    5VP8BVRV
LU WWN Device Id: 5 000c50 03809a021
Firmware Version: JC45
User Capacity:    1,000,204,886,016 bytes [1.00 TB]
Sector Size:      512 bytes logical/physical
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  ATA-8-ACS revision 4
Local Time is:    Tue Jan  8 14:29:00 2013 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

Ahora ejecutamos un test de saludo general:

# smartctl -H /dev/sdc
smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.2.0-32-generic] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

Como se puede ver en la última línea, el disco paso las pruebas sin errores.

Y en caso de que queramos estar completamente seguros de que el disco duro tiene una buena salud, podemos ejecutar un test completo:

# smartctl -a /dev/sdc

O también podemos ejecutar un test corto:

# smartctl -t short /dev/sdc

Si quiere ver el estado del test, cuando éste aun está en ejecución:

# smartctl -l selftest /dev/sdc

Particionando el disco

Para crear las particiones en el disco usaremos el programa parted(8), el cual nos permitirá crear una tabla de particiones de tipo GUID Partition Table o GPT, el cual no tiene el limitante de 15 números de particiones.

# parted /dev/sdc
(parted) print
Error: /dev/sdc: etiqueta de disco no reconocida
(parted) mklabel gpt
(parted) print
Modelo: TOSHIBA MK3276GSX (scsi)
Disco /dev/sdc: 320GB
Tamaño de sector (lógico/físico): 512B/512B
Tabla de particiones. gpt
Numero Inicio Fin Tamaño Sistema de archivos Nombre Banderas
(parted) mkpart primary 0% 100%
(parted) print
Modelo: TOSHIBA MK3276GSX (scsi)
Disco /dev/sdc: 320GB
Tamaño de sector (lógico/físico): 512B/512B
Tabla de particiones. gpt
Numero Inicio Fin Tamaño Sistema de archivos Nombre Banderas
1 1049kB 320GB 320GB ext3 primary
(parted) set 1 lvm on
(parted) print
Modelo: TOSHIBA MK3276GSX (scsi)
Disco /dev/sdc: 320GB
Tamaño de sector (lógico/físico): 512B/512B
Tabla de particiones. gpt
Numero Inicio Fin Tamaño Sistema de archivos Nombre Banderas
1 1049kB 320GB 320GB ext3 primary lvm
(parted) quit

El dispositivo ya tiene una tabla de particiones, ahora procederemos a configurar los volúmenes lógicos LVM.

Configurando los volúmenes lógicos LVM

Instalamos las herramientas para administrar volúmenes lógicos LVM:

# aptitutde install lvm2

Ahora, con el programa pvcreate(8) convertimos la partición /dev/sdc1 en un dispositivo físico o PV:

# pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created

Con el programa pvdisplay(8) vemos los detalles del dispositivo físico:

# pvdisplay /dev/sdc1
"/dev/sdc1" is a new physical volume of "298,09 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc1
VG Name
PV Size 298,09 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 3nkpbK-yJB5-4Ejj-baB9-LUId-dUfW-fOut7M

Con el programa pvs(8) podemos ver un listado más simple de los dispositivos físicos:

# pvs
PV VG Fmt Attr PSize PFree
/dev/sda1 jmdata lvm2 a-- 465,76g 45,76g
/dev/sdc1 lvm2 a-- 298,09g 298,09g

Ahora, con el programa vgcreate(8) creamos un grupo de volúmenes o VG y le asignamos el dispositivo físico /dev/sdc1:

# vgcreate vgedata /dev/sdc1
Volume group "vgedata" successfully created

Con el comando vgdisplay(8) vemos la información del volume group vgedata:

# vgdisplay vgedata
--- Volume group ---
VG Name vgedata
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 298,09 GiB
PE Size 4,00 MiB
Total PE 76310
Alloc PE / Size 0 / 0
Free PE / Size 76310 / 298,09 GiB
VG UUID BrYvOz-TrNi-qljU-7WOf-JYSt-QoVL-ZN5tx3

Con el comando vgs(8) podemos ver un listado más sencillo de los volume groups, y sus capacidades:

# vgs
VG #PV #LV #SN Attr VSize VFree
jmdata 1 2 0 wz--n- 465,76g 45,76g
vgedata 1 0 0 wz--n- 298,09g 298,09g

Y por último crearemos un par de volúmenes lógicos sobre el VG vgedata.

Con el comando lvcreate(8) creamos un LV de 200 GB llamado velab:

# lvcreate -L 200GB vgedata -n velab
Logical volume "velab" created

Y otro de 50GB llamado vebackup:

# lvcreate -L 50GB vgedata -n vebackup
Logical volume "vebackup" created

Con el comando lvdisplay(8) mostramos la información del volumen lógico:

# lvdisplay /dev/vgedata/velab
--- Logical volume ---
LV Path /dev/vgedata/velab
LV Name velab
VG Name vgedata
LV UUID MNUXi9-hFf2-0fak-1LlB-41xQ-W0go-ifw2C6
LV Write Access read/write
LV Creation host, time jmubook, 2014-05-17 20:01:45 -0500
LV Status available
# open 0
LV Size 200,00 GiB
Current LE 51200
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:2

También la información del volumen vebackup:

# lvdisplay /dev/vgedata/vebackup
--- Logical volume ---
LV Path /dev/vgedata/vebackup
LV Name vebackup
VG Name vgedata
LV UUID RvGFWi-Fb8B-UZCo-cCwV-4NMa-nW0R-sIsvrk
LV Write Access read/write
LV Creation host, time jmubook, 2014-05-18 01:07:07 -0500
LV Status available
# open 0
LV Size 50,00 GiB
Current LE 12800
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:3

Con el comando lvs(8) podemos ver un listado de los volúmenes lógicos en el VG vgedata:

# lvs vgedata
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
vebackup vgedata -wi-a---- 50,00g
velab vgedata -wi-ao--- 200,00g

Por último mostramos un listado del VG vgedata para ver que se refleja el uso:

# vgs vgedata
VG #PV #LV #SN Attr VSize VFree
vgedata 1 2 0 wz--n- 298,09g 48,09g

También se ve reflejado en la salida de pvs:

# pvs /dev/sdc1
PV VG Fmt Attr PSize PFree
/dev/sdc1 vgedata lvm2 a-- 298,09g 48,09g

A continuación crearemos un sistema de archivos sobre el recién volumen lógico.

Creando los sistemas de archivos en los volúmenes lógicos LVM

Con el programa mkfs.ext4(8) crearemos los sistema de archivos ext4 sobre los volumen lógicos velab y vebackup:

# mkfs.ext4 -L velab -m 1 /dev/vgedata/velab
mke2fs 1.42.9 (4-Feb-2014)
Etiqueta del sistema de ficheros=velab
OS type: Linux
Tamaño del bloque=4096 (bitácora=2)
Tamaño del fragmento=4096 (bitácora=2)
Stride=0 blocks, Stripe width=0 blocks
13107200 inodes, 52428800 blocks
524288 blocks (1.00%) reserved for the super user
Primer bloque de datos=0
Número máximo de bloques del sistema de ficheros=4294967296
1600 bloque de grupos
32768 bloques por grupo, 32768 fragmentos por grupo
8192 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: hecho
Escribiendo las tablas de nodos-i: hecho
Creating journal (32768 blocks): hecho
Escribiendo superbloques y la información contable del sistema de ficheros: hecho

Y también creamos el sistema de archivos para el volumen vebackup:

# mkfs.ext4 -L vebackup -m 1 /dev/vgedata/vebackup
mke2fs 1.42.9 (4-Feb-2014)
Etiqueta del sistema de ficheros=vebackup
OS type: Linux
Tamaño del bloque=4096 (bitácora=2)
Tamaño del fragmento=4096 (bitácora=2)
Stride=0 blocks, Stripe width=0 blocks
3276800 inodes, 13107200 blocks
131072 blocks (1.00%) reserved for the super user
Primer bloque de datos=0
Número máximo de bloques del sistema de ficheros=4294967296
400 bloque de grupos
32768 bloques por grupo, 32768 fragmentos por grupo
8192 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424
Allocating group tables: hecho
Escribiendo las tablas de nodos-i: hecho
Creating journal (32768 blocks): hecho
Escribiendo superbloques y la información contable del sistema de ficheros: 0/hecho

Usamos el comando blkid(8) para ver los dispositivos de bloque:

# blkid
/dev/sda1: UUID="5SgakS-YpVQ-7mgA-esNg-s2Ml-z5Fk-g254cI" TYPE="LVM2_member"
/dev/sdb1: UUID="e24f9b67-c130-4f18-82e8-3ac2ec6336a7" TYPE="ext4"
/dev/sdb2: UUID="8eb3deac-e519-4bb0-b482-e1d0ae855947" TYPE="swap"
/dev/sdb5: UUID="2731afeb-8f9e-4bbe-8125-e1d1784cd272" TYPE="ext4"
/dev/sdb6: UUID="3987f2c1-f73f-46ab-bda5-a101d84d686c" TYPE="ext4"
/dev/mapper/jmdata-jmhome: UUID="4c9d2c65-380c-494a-a6f4-052a4e76c49e" TYPE="ext4"
/dev/mapper/jmdata-jmvlabs: UUID="5374d4bd-b90b-41ab-90c3-2fe860825abf" TYPE="ext4"
/dev/sdc1: UUID="3nkpbK-yJB5-4Ejj-baB9-LUId-dUfW-fOut7M" TYPE="LVM2_member"
/dev/mapper/vgedata-velab: LABEL="velab" UUID="24cfeffa-f2eb-4835-a1f8-baf6af5c0730" TYPE="ext4"
/dev/mapper/vgedata-vebackup: LABEL="vebackup" UUID="65c886ec-a1e8-4a36-bcf9-01e4db1fb81c" TYPE="ext4"

Continuamos con los montajes y permisos.

Montando temporalmente los sistemas de archivos de los volúmenes lógicos LVM

Creamos un punto de montaje temporal para el volumen velab:

# mkdir /media/labs

Con el comando mount(8) montamos el volumen:

# mount /dev/vgelab/velab /media/labs

Ahora seguiremos con la asignación de privilegios y sincronización de datos.

Asignando permisos

Asociamos el dueño y grupo al directorio:

# chown -R jmedina:jmedina /media/labs

Y cambio los permisos de acceso:

# chmod 770 /media/labs

Validamos la asignación de permisos:

# ls -ld /media/labs
drwxrwx--- 8 jmedina jmedina 4096 may 17 17:39 /media/labs

Sincronizando los archivos

Como definimos en los objetivos, necesitamos hacer una sincronización intacta de los archivos en el disco de datos hacía el disco externo.

Usando el comando lsof validamos que no haya procesos accediendo a los archivos del directorio origen:

# lsof /labs

En caso de que aparezcan archivos abiertos, identificar los procesos y terminarlos.

Ahora que el sistema de archivos está montado, usamos el programa rsync(1) para sincronizar los archivos que queramos mover:

# rsync -avP /labs/ /media/labs/

Si ya no se van a copiar o crear nuevos archivos desmontamos el volumen:

# umount /media/labs

Ahora que los datos están sincronizados

Intercambiamos acceso a datos desde el disco externo

Desmontamos la partición o volumen actual:

# umount /labs

Desactivamos el montaje anterior de /labs y configuramos el montaje no automático en fstab(5):

# vim /etc/fstab
...
...
...
# Disco externo USB
#/dev/jmdata/jmvlabs /labs ext4 defaults,noatime 0 2
/dev/vgedata/velab /labs ext4 noauto,defaults,noatime,nodiratime 0 2

Montamos el volúmen:

# mount /labs

Vemos su uso:

# df -h
---
---
---
/dev/mapper/vgedata-velab 197G 95G 100G 49% /labs

En caso de que se vaya a desconectar, validamos con lsof(8) que no haya procesos ocupando los archivos, y entonces de forma segura desmontamos el volumen:

# umount /labs

Notas sobre la conexión y desconexión del disco externo y volúmenes lógicos LVM

Cuando conectamos el disco duro a el equipo, el sistema automáticamente tratara de detectar los volúmenes físicos LVM, activarlo, lo mismo para los grupos de volúmenes y los volúmenes lógicos.

Si al conectar el disco no están disponibles los volúmenes lógicos entonces ejecute:

# vgimport -a

y

# vgchange -a y /dev/vgedata

Sin embargo, cuando desconectamos el disco debemos de avisar al sistema que los volúmenes lógicos del disco externo ya no existen, de lo contrario, al volver a conectar el disco habrá un conflicto, para evitarlo es importante que, después de desmontar los sistemas de archivos, desactivemos los volúmenes del disco externo:

# vgchange -a -n /dev/vgedata

Y también:

# vgexport -a

Con esto el sistema desactivará los volúmenes lógicos del volume group especificado.

Conclusiones

Después de haber terminado con el procedimiento anterior resumido que hemos log.ado lo siguiente:

  • Identificado el disco duro y sus capacidades con los programas lsscsi y fdisk.
  • Revisar la información S.M.A.R.T del disco duro,
  • Particionado un disco duro usando el tipo GPT y partición tipo LVM con el programa parted
  • Creado volúmenes físicos PV, grupos de volumen VG, y volúmenes lógivos LV basados en LVM.
  • Creado sistemas de archivos ext4 sobre volúmenes lógicos LVM.
  • Montado sistemas de archivos temporalmente con el programa mount y definiendolos en fstab.
  • Configurado permisos a directorios con los programas chown y chmod.
  • Sincronizado intacto de archivos usando el programa rsync.
  • Intercambiar el acceso a los datos hacía el volumen del disco duro externo.

Espero que el articulo les sea de utilidad, si alguien encuentra algún error o mala referencia no dude en enviarme un mensaje
y lo corregiré.

Referencias

Comments

Log in or create a user account to comment.

Mon Tue Wed Thu Fri Sat Sun
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31