Disco virtual

Existen muchos métodos para crear y montar máquinas virtuales y también muchos formatos. Por lo general utilizamos hipervisores para crearlas y ponerlas en producción. Pero hablamos de sistemas completos virtualizados.
Y si solo queremos crear un disco virtual vacío, bien sea para almacenar archivos o para crear unidades de disco en red y muchos otros usos. En este caso, muchos afirman que compartir un disco físico es mejor, más fiable y simple, y tienen toda la razón, pero hay algunos escenarios en que tenemos un solo disco y necesitamos crear volúmenes independientes para el manejo de archivos privados y públicos para muchos usuarios o propósitos, y para lograrlo tendríamos que hacer tantas particiones como volúmenes necesitemos, en cambio, los discos virtuales, al ser tratados por los sistemas operativos como archivos, podrían ser una buena alternativa de solución, ya que es mejor tener muchos discos virtuales (archivos) dentro de un solo disco físico, que un disco físico con un montón de particiones. Y sin mencionar que es más sencillo hacer un backup de un disco virtual que de un físico.
Existen muchos formatos para los discos virtuales, tales como .vhd o .vhdx (Microsoft Virtual PC / Hyper-V), .vmdk (VMware), .vdi (Oracle VirtualBox), .img (archivos binarios), etc, etc; algunos de los cuales pertenecen al estándar abierto Open Virtualization Format.
Estos discos se crean en dependencia de su tamaño, por ejemplo Fixed Size (Tamaño Fijo. Este formato es el más parecido a un disco físico. Tienen un tamaño establecido en su creación, sin importar la cantidad de datos), Dynamically Expanding (Expansión Dinámica. Se incrementa a medida que el disco se va llenando) y Differencing (Diferenciales), siendo los de Tamaño Fijo los más confiables.
Para crearlos podemos hacer uso de hipervisores, como Virtualbox, pero el procedimiento es algo engorroso, ya que primero hay que crear la VM y luego convertir el disco de formato VDI a otro formato más amigable como IMG.
VBoxManage clonehd --format RAW MyDisk.vdi MyDisk.img
Y luego montarlo en dependencia del tipo de partición que tengan:
mount -t ntfs -o loop,rw MyDisk.img /mnt
El rey por excelencia para estos menesteres es Gparted...
Gparted Interface
Que con su potente e intuitiva interfaz gráfica podemos particionar nuestros discos virtuales de acuerdo a nuestras necesidades.
GParted Create Partition
Sin embargo, para aquellos que no disponen de entorno gráfico está Parted, ideal para trabajar por terminal.
En el siguiente ejemplo, vamos a automatizar la creación de un disco virtual en formato .img (que es más universal por ser binario). Lo podemos adaptar, cambiando los valores de las variables. Por ejemplo, el script establece "mydisk.img" como el nombre de la imagen, la partición msdos y 1 GB de tamaño (o sea 1024) y la etiqueta de la partición "MyDisk". Y al lanzar la pregunta sobre el sistema de archivos, debemos escribir: ext4, fat32 o ntfs (puede agregarle más opciones):
#!/bin/bash
# maravento.com and novatoz.com

vdisk="mydisk.img"
vptable="msdos" # msdos, gpt
vsize="1024" # MB/MiB
vlabel=MyDisk
vbs="1M" # 1M or 1k/2k/4k/16k
ptype="primary" # primary/logical/extended

dd if=/dev/zero of=$vdisk iflag=fullblock bs=$vbs count=$vsize && sync

function pntfs(){
 parted $vdisk \
   mklabel $vptable \
   mkpart $ptype ntfs 2048s 100% \
   set 1 lba on \
   align-check optimal 1
 mkntfs -Q -v -F -L "$vlabel" $vdisk
 ntfsresize -i -f -v $vdisk
 ntfsresize --force --force --no-action $vdisk
 ntfsresize --force --force $vdisk
 fdisk -lu $vdisk
}

function pfat32(){
 parted $vdisk \
   mklabel $vptable \
   mkpart $ptype fat32 2048s 100% \
   set 1 lba on \
   align-check optimal 1
 mkfs.fat -F32 -v -I -n "$vlabel " $vdisk
 fsck.fat -a -w -v $vdisk
 fdisk -lu $vdisk
}

function pext4(){
 parted $vdisk \
   mklabel $vptable \
   mkpart $ptype 2048s 100%
 mkfs.ext4 -F -L "$vlabel" $vdisk
 parted -s $vdisk align-check optimal 1
 e2fsck -f -y -v -C 0 $vdisk
 resize2fs -p $vdisk
 fdisk -lu $vdisk
}

read -p "Enter File System (e.g. ntfs, fat32, ext4): " pset
    case $pset in
        "ntfs")
            pntfs
        ;;
        "fat32")
            pfat32
        ;;
        "ext4")
            pext4
        ;;
     *)
   echo "unknown option"
    ;;
esac
Si no va a utilizar el 100% del espacio del disco, sino un espacio específico, reemplace:
mkpart primary $vptable 2048s 100%
Por:
mkpart primary $vptable 1 $vsize
Donde $vsize es la variable que almacena el tamaño exacto del disco que va a usar, en MB/MiB.
Linux utiliza Loop Device para el tratamiento de las imágenes de disco (ISO, IMG, etc). Los loops son dispositivos de bucle (/dev/loop*) que hacen que los archivos sean accesibles como dispositivos de bloque (Para mayor información visite How to use loop devices.). Por tanto, ahora solo resta montar el disco virtual .img como si lo hiciéramos con una imagen .ISO (botón derecho sobre la imagen .img, y seleccionar "montador de imágenes de disco") y el sistema la enviará al loop que esté desocupado.
Si carece de entorno gráfico puede montarla desde la consola, puede ser a un punto de anclaje específico (ejemplo: en /Home llamada "vdisk"). Tenga en cuenta que "mount" requiere privilegios, por tanto, si no está trabajando desde root, debe cambiar el propietario de la carpeta, para habilitar su escritura:
sudo mount -o loop,rw,sync mydisk.img ~/vdisk && sudo chown $USER:$USER ~/vdisk
Otra manera de montar la imagen es especificando el loop:
sudo losetup loop1 mydisk.img
Pero es importante que verifique la disponibilidad del loop antes y después de montar el disco virtual:
ls /dev/loop*
losetup --list
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop1      0      0         0    0 /path/mydisk.img
Si queremos verificar la imagen montada en loop con Gparted:
sudo -H gparted /dev/loopx
Y para desmontar
# umount
sudo losetup -d /dev/loopx
Importante:
  • Si utiliza GPT en lugar de msdos, hay cambios significativos, por tanto el script deberá adaptarlo o no le servirá, ya que GPT no admite particiones extendidas/lógicas. Para mayor información pulse AQUI
  • Para los casos de discos virtuales con varias particiones, lo más recomendado es realizar el proceso directamente en el dispositivo de bucle (/dev/loopx) en lugar de la imagen (.img), ya que el comando mkfs eventualmente podría destruir las particiones. Para estos casos utilice el script de GracefulRestart
  • También puede crear la imagen de disco virtual con Gparted, siguiendo el tutorial de Kos
  • Otro script similar es el imgKreator de Nagren
  • Para más opciones lea parted (8) - Linux Man Pages
No queremos terminar sin mencionar a kpartx, un pequeño programa que detecta las particiones en una imagen de disco y genera en /dev/loopx los mapeos necesarios para poder montarlas como si fueran particiones en un disco real. 
 Lista el mapeo de particiones que se agregarían con la opción -a
sudo kpartx -l mydisk.img
Agrega/Monta la partición del disco virtual en /dev/loopX (según el comando anterior):
sudo kpartx -a mydisk.img
Para crear (verificar si existe el mapeo, de lo contrario hágalo en el loop):
sudo mkfs.ext4 /dev/loop0p1
Elimina/desmonta el mapeo de la partición:
sudo kpartx -d mydisk.img
Para más opciones visite Kpartx.

Con la tecnología de Blogger.