El objetivo de este informe es montar un disco duro USB en una máquina VirtualBox que no tiene instalado Guest Additions. Normalmente nos encontraremos en esta situación en servidores Linux virtualizados en los que no queremos instalar Guest Additions. Con este truco podremos acceder al disco duro como si estuviera pinchado directamente en la máquina virtual. Básicamente la idea es crear un fichero VMDK directamente enlazado con el disco duro (no un fichero con el contenido del disco), y colocar ese disco en el bus SATA de la máquina virtual.
Las razones para no tener VirtualBox Guest Additions en el huésped van asociadas a lo que aporta:
- drivers adecuados para el modo gráfico,
- drivers de ratón y teclado mejor integrados con el escritorio del anfitrión,
- conectividad USB (a veces Plug & Play),
- y poder compartir carpetas entre el anfitrión y el huésped.
Estas características son muy deseables en máquinas virtuales «de escritorio», pero no son necesarias en servidores. Por contra, tendremos que instalar software adicional en la máquina huésped, y si ésta es Linux implica compilar en la máquina los drivers que viene en la imagen ISO de VirtualBox Guest Additions, y eso mismo cada vez que se actualice el núcleo.
Estaremos condenados a tener la máquina huésped aislada del mundo: sólo podrá recibir información desde ficheros en red (FTP, HTTP, SFTP, CIFS ó NFS principalmente). Pero ante un escenario como, por ejemplo, restaurar los ficheros de una copia de seguridad (no serán uno ni dos ficheros precisamente…), colocar el disco entero en red no parece una buena idea. De esta forma veremos el disco duro como si estuviera directamente conectado a nuestra máquina virtual.
Escenario
- Un anfitrión Fedora 15 con VirtualBox 4.1 instalado.
- Un huesped Linux (da igual la versión).
- Un disco duro USB.
- El usuario que ejecuta VirtualBox tiene permisos suficientes (rw) para leer y escribir en el dispositivo /dev/xx que tiene asignado el disco USB en el anfitrión. En Fedora esto se cumple si el usuario pertenece al grupo disk.
- El usuario tiene permisos para adquirir la identidad de root en la máquina huesped.
Procedimiento
- Pinchamos el disco USB en una unidad del anfitrión. La acción habitual de éste será montar el disco y abrirnos una ventana con su contenido. Cerramos esa ventana (no nos sirve para nada).
- Abrimos una ventana del terminal y buscamos qué dispositivo /dev/xxx ha asignado a mi disco externo. Para ello escribimos el comando df -h, y obtendremos un listado con una línea por cada sistema de ficheros montado. Una de las líneas se corresponderá a mi disco duro. Si el disco duro fue formateado con una etiqueta LABEL, el sistema lo monta en /media/LABEL. Así que en mi caso la etiqueta era BACKUP así que obtuve esta línea (entre otras):
/dev/sdb1 299G 173G 126G 58% /media/BACKUP
- Anotamos la ruta del dispositivo. El término sdb1 que me ha salido significa: Scsi Disk B (A es el primero, B el segundo, etc.) 1ª partición. Como yo quiero acceder al disco entero y no sólo a la partición 1, mi dispositivo es /dev/sdb.
- Desmonto el disco externo para que el sistema operativo del anfitrión no lo utilice: umount /dev/sdb1.
- Compruebo que tengo acceso completo al dispositivo mediante el comando ls -l /dev/sdb, y sale algo así:
brw-rw—- 1 root disk 8, 16 sep 28 17:32 /dev/sdb
Lo que implica que sólo el usuario root y los usuarios del grupo disk pueden leer y escribir ese dispositivo. - Compruebo si formo parte del grupo disk o no tendré nada que hacer: getent group | grep «^disk:» y miro a ver si mi login está en la lista de usuarios del grupo. Si no estás arregla eso porque no puedes seguir.
- Bien, ahora tengo que decidir dónde quiero crear el fichero VMDK que le dirá a VirtualBox cómo acceder al disco. En mi caso lo dejé en el directorio /var/lib/VirtualBox/mmartin/HardDisks porque ya lo tenía preparado para estas cosas.
- Ejecutamos estos comandos:
cd /var/lib/VirtualBox/mmartin/HardDisks VBoxManage internalcommands createrawvmdk -filename BACKUP.vmdk -rawdisk /dev/sdb chgrp disk BACKUP.vmdk chmod 660 BACKUP.vmdk
- Abrimos el VirtualBox. Si el huésped se está ejecutando, lo apagamos, para poder editar su configuración. En Almacenamiento añadimos al bus SATA un disco duro ya existente. Nos saldrá un cuadro de diálogo para que le digamos el fichero del disco, y buscamos nuestro BACKUP.vmdk.
- Si arrancamos la máquina, ahora tendrá un dispositivo de disco duro nuevo, pongamos que /dev/sdc. Para el huésped es un disco duro fijo, no un disco USB. Esto implica que (1) tendremos que montarlo a mano porque no hay eventos de tipo «disco pinchado» que lancen el proceso de montaje automático; y (2) el disco externo debe permanecer pinchado en el anfitrión en tanto el huesped esté encendido.
- Creamos una entrada en /etc/fstab para simplicar el montaje. Como ejemplo, en mi caso monté usando la etiqueta, un disco que tenía formateado como ReiserFS. La opción noauto es importante para que el sistema operativo no trate de montarlo en el arranque, y la opción sync para garantizar que no se demora la escritura de datos, y hacerlo menos vulnerable a extracciones incorrectas de la unidad. Las opciones acl y user_xattr las pongo porque el disco externo tiene copias de otros discos que se montan con esas opciones, de forma que garantizo que los metadatos del fichero también se copian en el disco externo, mientras que las opciones nodev, nosuid limita lo que pueden hacer los ficheros de esa unidad (que puede ser cualquiera).
LABEL=BACKUP /media/usb reiserfs noauto,sync,nodev,nosuid,acl,user_xattr 0 0
- Creamos el directorio del punto de montaje, en mi caso mkdir /media/usb.
- Probamos a montar el disco en el huesped, en mi caso mount /media/usb, y si todo es correcto podemos desmontarlo si hemos terminado, umount /media/usb.
Observaciones
- El disco no puede estar montado al mismo tiempo en el anfitrión ni en el huésped, ni desde luego, ser conectado a otros huéspedes.
- El disco no debe concectarse ni desconectarse con el huésped arrancado.
- El huésped no puede arrancarse sin el disco duro externo mientras en su configuración esté instalado en su bus SATA.