OpenVZ Tutorial · 6 min read · Oct 11, 2025
OpenVZ: Montando Dispositivos/Particiones/Directorios del Host en un Contenedor con Montajes de Enlace (Debian/Ubuntu)
OpenVZ: Montando Dispositivos/Particiones/Directorios del Host en un Contenedor con Montajes de Enlace (Debian/Ubuntu)
Versión 1.0
Autor: Falko Timme
Sígueme en Twitter
A veces te encuentras en una situación en la que necesitas montar un disco duro, partición o directorio del host OpenVZ dentro de un contenedor OpenVZ; por ejemplo, agregas un SSD rápido al host y quieres poner las bases de datos MySQL de tu contenedor en él para hacer que MySQL sea más rápido. Este tutorial explica cómo puedes montar dispositivos/particiones/directorios del host en un contenedor OpenVZ con montajes de enlace.
¡No emito ninguna garantía de que esto funcione para ti!
1 Nota Preliminar
En este tutorial tengo un contenedor OpenVZ con el ID de contenedor 101 que está ejecutando MySQL. Agrego un segundo disco duro al host y quiero poner el directorio MySQL del contenedor /var/lib/mysql en el segundo disco duro.
2 Preparando el Host
Host:
Si has agregado un nuevo disco duro al host, deberías verlo en la salida de…
fdisk -l… y deberías ver que está sin formatear (a menos que hayas creado particiones en él anteriormente); en este ejemplo, el disco duro es /dev/sdb:
root@server1:~# fdisk -l
Disco /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00029d5c
Device Boot Start End Blocks Id System
/dev/sda1 * 1 3793 30461952 83 Linux
/dev/sda2 3793 3917 992257 5 Extended
/dev/sda5 3793 3917 992256 82 Linux swap / Solaris
Disco /dev/sdb: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disco /dev/sdb no contiene una tabla de particiones válida
root@server1:~#Vamos a crear una sola partición en él:
fdisk /dev/sdbroot@server1:~# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x31e0dc4b.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won’t be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It’s strongly recommended to
switch off the mode (command ‘c’) and change display units to
sectors (command ‘u’).
Command (m for help): <– n
Command action
e extended
p primary partition (1-4)
<– p
Partition number (1-4): <– 1
First cylinder (1-3916, default 1): <– ENTER
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-3916, default 3916): <– ENTER
Using default value 3916
Command (m for help): <– t
Selected partition 1
Hex code (type L to list codes): <– L
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 41 PPC PReP Boot 85 Linux extended c7 Syrinx
5 Extended 42 SFS 86 NTFS volume set da Non-FS data
6 FAT16 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility
8 AIX 4f QNX4.x 3rd part 8e Linux LVM df BootIt
9 AIX bootable 50 OnTrack DM 93 Amoeba e1 DOS access
a OS/2 Boot Manag 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 52 CP/M 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs
e W95 FAT16 (LBA) 54 OnTrackDM6 a5 FreeBSD ee GPT
f W95 Ext’d (LBA) 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b
11 Hidden FAT12 5c Priam Edisk a8 Darwin UFS f1 SpeedStor
12 Compaq diagnost 61 SpeedStor a9 NetBSD f4 SpeedStor
14 Hidden FAT16 <3 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary
16 Hidden FAT16 64 Novell Netware af HFS / HFS+ fb VMware VMFS
17 Hidden HPFS/NTF 65 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 70 DiskSecure Mult b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 75 PC/IX bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 80 Old Minix be Solaris boot ff BBT
1e Hidden W95 FAT1
Hex code (type L to list codes): <– 83
Command (m for help): <– w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
root@server1:~#
Después, debería estar la partición /dev/sdb1:
fdisk -lroot@server1:~# fdisk -l
Disco /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00029d5c
Device Boot Start End Blocks Id System
/dev/sda1 * 1 3793 30461952 83 Linux
/dev/sda2 3793 3917 992257 5 Extended
/dev/sda5 3793 3917 992256 82 Linux swap / Solaris
Disco /dev/sdb: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x31e0dc4b
Device Boot Start End Blocks Id System
/dev/sdb1 1 3916 31455238+ 83 Linux
root@server1:~#Vamos a formatearlo con ext4…
mkfs.ext4 /dev/sdb1… y montarlo en /mnt/sdb1:
mkdir /mnt/sdb1
mount /dev/sdb1 /mnt/sdb1Deberías ver /dev/sdb1 en la salida de…
mount… ahora:
root@server1:~# mount
/dev/sda1 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sdb1 on /mnt/sdb1 type ext4 (rw)
root@server1:~#Para que /dev/sdb1 se monte automáticamente al iniciar, agrégalo a /etc/fstab:
vi /etc/fstab| [...] /dev/sdb1 /mnt/sdb1 ext4 errors=remount-ro 0 1 |
3 Preparando el Contenedor
Contenedor:
Como queremos mover /var/lib/mysql a la nueva partición, necesitamos detener MySQL primero, asegurarnos de que no se inicie automáticamente cuando se inicie el contenedor, crear una copia de seguridad de /var/lib/mysql y un nuevo directorio vacío /var/lib/mysql:
/etc/init.d/mysql stop
update-rc.d -f mysql removemv /var/lib/mysql/ /var/lib/mysql_bak
mkdir /var/lib/mysql
chown mysql:mysql /var/lib/mysql
chmod 700 /var/lib/mysql4 Creando un Script de Montaje de Enlace para el Contenedor en el Host
Host:
En el host ahora creamos el script de montaje de enlace /etc/vz/conf/101.mount (asegúrate de reemplazar 101 con el ID de contenedor correcto) de la siguiente manera:
vi /etc/vz/conf/101.mount| #!/bin/bash . /etc/vz/vz.conf . ${VE_CONFFILE} SRC=/mnt/sdb1 DST=/var/lib/mysql if [ ! -e ${VE_ROOT}${DST} ]; then mkdir -p ${VE_ROOT}${DST}; fi mount -n -t simfs ${SRC} ${VE_ROOT}${DST} -o ${SRC} |
Debes ajustar las variables SRC y DST a tus necesidades. SRC es el directorio que queremos montar en el contenedor (/mnt/sdb1 en este ejemplo), y DST es el punto de montaje en el contenedor.
Si deseas agregar opciones de montaje como noatime, puedes agregar el switch -o a la línea de montaje, por ejemplo, de la siguiente manera:
| #!/bin/bash . /etc/vz/vz.conf . ${VE_CONFFILE} SRC=/mnt/sdb1 DST=/var/lib/mysql if [ ! -e ${VE_ROOT}${DST} ]; then mkdir -p ${VE_ROOT}${DST}; fi mount -o noatime -n -t simfs ${SRC} ${VE_ROOT}${DST} -o ${SRC} |
Haz que el script sea ejecutable…
chmod +x /etc/vz/conf/101.mount… y reinicia el contenedor (por eso deshabilitamos los enlaces de inicio del sistema de MySQL para el contenedor en el capítulo tres; /var/lib/mysql está vacío en este momento, lo que resultará en errores de MySQL):
vzctl restart 1015 Usando el Montaje de Enlace en el Contenedor
Contenedor:
Después de que el reinicio del contenedor haya terminado, puedes iniciar sesión en el contenedor y verificar si el nuevo montaje existe:
mountroot@test:~# mount
/dev/simfs on / type simfs (rw,relatime)
/dev/simfs on /var/lib/mysql type simfs (rw,relatime)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,relatime,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,relatime)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620)
root@test:~#df -hroot@test:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/simfs 1.0G 381M 644M 38% /
/dev/simfs 30G 172M 28G 1% /var/lib/mysql
tmpfs 128M 0 128M 0% /lib/init/rw
tmpfs 128M 0 128M 0% /dev/shm
root@test:~#Ve a la carpeta /var/lib:
cd /var/lib
ls -laroot@test:/var/lib# ls -la
total 72
drwxr-xr-x 18 root root 4096 Jul 17 10:25 .
drwxr-xr-x 13 root root 4096 Feb 13 2011 ..
drwxr-xr-x 5 root root 4096 Jul 17 10:16 apt
drwxr-xr-x 2 root root 4096 Oct 16 2010 aptitude
drwxr-xr-x 2 root root 4096 Feb 13 2011 dhcp
drwxr-xr-x 7 root root 4096 Jul 17 10:16 dpkg
drwxr-xr-x 2 root root 4096 Jan 1 2011 initscripts
drwxr-xr-x 2 root root 4096 Jan 1 2011 insserv
drwxrwsr-x 2 libuuid libuuid 4096 Feb 13 2011 libuuid
drwxr-xr-x 2 root root 4096 Apr 17 2010 logrotate
drwxr-xr-x 2 root root 4096 Dec 14 2010 misc
drwxr-xr-x 4 root root 4096 Jul 17 10:53 mysql
drwx------ 3 mysql mysql 4096 Jul 17 10:24 mysql_bak
drwxr-xr-x 2 root root 4096 Feb 13 2011 pam
drwxr-xr-x 2 root root 4096 Jul 17 10:23 quota
drwxr-xr-x 2 root root 4096 Jul 17 10:52 update-rc.d
drwxr-xr-x 2 root root 4096 Jul 17 10:53 urandom
drwxr-xr-x 3 root root 4096 Feb 13 2011 vim
root@test:/var/lib#Como ves, el nuevo directorio /var/lib/mysql tiene permisos/propiedad incorrectos; vamos a corregir eso (los nuevos permisos/propiedad deberían mantenerse incluso después de un reinicio del contenedor):
chown mysql:mysql /var/lib/mysql
chmod 700 /var/lib/mysqlAhora vamos a mover las bases de datos de nuestra copia de seguridad de vuelta a /var/lib/mysql:
cp -pfr /var/lib/mysql_bak/* /var/lib/mysqlLuego inicia MySQL:
/etc/init.d/mysql start¡Eso es todo! Una última cosa que deberías hacer es recrear los enlaces de inicio del sistema de MySQL para que se inicie automáticamente cuando se inicie el contenedor:
update-rc.d mysql defaults6 Enlaces
- OpenVZ: http://openvz.org/
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.