¿Cómo configurar un dispositivo de bucle en el momento del arranque?

14

Quiero configurar un dispositivo de bucle en el momento del arranque. Me pregunto cuál es la mejor manera de hacer esto.

Lo he buscado en google. Algunos dicen que agregar una regla udev, algunos dicen que poner un script en/etc/init.d , algunos incluso modifican los initramfs.

Entonces, ¿cuál es la mejor o la mejor manera de hacer esto? ¿Podría por favor dar algunos detalles (sobre cómo hacerlo)?

Gracias.

Roun
fuente
Yo iría con /etc/init.d/something, o /etc/rc.local, pero sugiero quedarme con cualquier método que funcione.
enzotib
66
¿Para qué? Si desea que se monte un archivo en el momento del arranque, simplemente agréguelo a / etc / fstab con la opción de bucle y mount se encargará de configurar el dispositivo de bucle invertido por usted.
psusi
@psusi: Gracias por su consejo, pero para mi propósito, el montaje no es suficiente y, de hecho, el archivo no se puede montar simplemente. Es una imagen de disco en lugar de una imagen de partición. Y necesito saber el nombre exacto del dispositivo de bucle para usarlo para hacer un disco virtual en VirtualBox. (Hago este tipo de disco virtual pensando que es más fácil compartir archivos entre la máquina virtual y la máquina host. La carpeta compartida incorporada no funciona para alguna aplicación)
Roun
44
Simplemente puede apuntar la máquina virtual al archivo en lugar del dispositivo de bucle invertido. También debe tener mucho cuidado para asegurarse de nunca ejecutar la máquina virtual (o suspenderla) y montar el sistema de archivos en el host al mismo tiempo, o dañará el fs. Por esa razón, es una idea mucho mejor usar redes para que los archivos de acceso de invitados que el host comparte a través de nfs o samba o sshfs.
psusi
@Roun: las particiones en el archivo aún se pueden montar, aunque debe especificar el desplazamiento del sector de la partición desde el principio del archivo (por ejemplo, mount /disk.img /mnt -o loop,offset=2048para la primera partición). Las compensaciones se pueden encontrar con parted o fdisk una vez que el dispositivo de bucle está configurado (vea mi respuesta a continuación para eso).
zanfur

Respuestas:

7

Hay al menos tres formas "apropiadas" de hacer cosas de inicio en Ubuntu (suponiendo que no solo desee montarlo), enumeradas aquí en orden de preferencia decreciente:

  1. /etc/init/*.conf (Advenedizo)
  2. /etc/init.d/* (sysvinit)
  3. /etc/rc.local (secuencia de comandos de cambio de nivel de ejecución)

También existe la posibilidad de utilizar las reglas de udev, pero será complicado. Lo recomiendo en contra. El script sysvinit es excesivo para una cosa tan pequeña, así que me centraré en las otras dos opciones. El script de cambio de nivel de ejecución es el más simple (aunque el menos preferido), así que comenzaré allí.

El /etc/rc.localarchivo simplemente se ejecuta mediante la /etc/init.d/rc.localsecuencia de comandos sysvinit, que (por defecto) se ejecuta en último lugar al cambiar a cualquier nivel de ejecución "on" normal (p. Ej., Cuando arranca normalmente, pero no cuando cierra o pasa al modo de recuperación). Para implementar la configuración del dispositivo de arranque, simplemente agregue esto al final de /etc/rc.local, suponiendo que se llame a su archivo /srv/diskimagey desee usarlo /dev/loop0como dispositivo de bucle:

losetup /dev/loop0 /srv/diskimage

Eso es realmente todo lo que hay que hacer. Por supuesto, reemplace los nombres de archivo con lo que funcione mejor en su configuración.

Si desea ser un poco más específico al respecto, puede crear un trabajo Upstart para él que lo configure una vez que se haya montado el sistema de archivos que lo contiene. Un ejemplo sería el siguiente, suponiendo que ese /srvfuera el punto de montaje que contiene su diskimagearchivo:

description     "Setup loop devices after filesystems are mounted"

start on mounted MOUNTPOINT=/srv
task
exec losetup /dev/loop0 /srv/diskimage

Esto debería ser lo suficientemente simple como para seguirlo conceptualmente: la primera línea es solo un comentario para los lectores humanos, y son instrucciones para Upstart esperar hasta que /srvse monte el sistema de archivos, ejecutar el proceso de configuración perdida y considerarse terminado cuando el proceso sale con éxito (un " tarea ", a diferencia de un servicio que es persistente). Simplemente ponga esos contenidos en un archivo que coincida /etc/init/*.conf. Yo elegiría /etc/init/losetup.confyo mismo.

Las ventajas de los trabajos de Upstart /etc/rc.localpor algo tan simple son pequeñas pero importantes. Primero, /etc/rc.localestá en desuso, y su uso como solo un "cajón de arena desordenado para hacer las cosas" está mal visto por todos en estos días. Entre otras razones para desaprobar su uso, algunos programas que sí usan ese archivo simplemente sobrescribirán el contenido, y es difícil conciliar diferentes scripts que deben ir al mismo archivo. En segundo lugar, Upstart realmente maneja la verificación de dependencia por usted (asegurándose de que el sistema de archivos se monte primero), por lo que si hay un problema al montar el sistema de archivos , no lo haráintente configurar el dispositivo de bucle ... pero una vez que lo haya resuelto y lo haya montado. Tercero, Upstart es mucho más flexible: puede, por ejemplo, hacer que sea lo suficientemente inteligente como para encontrar un dispositivo de bucle no utilizado y "emitir" ese dispositivo de bucle para usarlo en otros trabajos de arranque, similar a cómo usamos la variable "MOUNTPOINT" en este ejemplo arriba.

zanfur
fuente
¿Cómo se invoca el /etc/init/losetup.conf ??? No funciona para mí ...
Imran
1

Como señaló @psusi, la forma más fácil es agregar la siguiente línea en su /etc/fstabarchivo

/path/to/loop/device       /path/to/mount/point       auto       loop       0 0

Ahora reinicie o ejecute mount -acomo root. Entonces el dispositivo debe estar montado. Puedes verificar eso con lsblk.

navigaid
fuente