montar dev, proc, sys en un entorno chroot?

87

Estoy tratando de crear una imagen de Linux con paquetes personalizados seleccionados.
Lo que estoy tratando de hacer es crear a mano los paquetes que voy a usar en una computadora portátil XO, porque la compilación de paquetes lleva mucho tiempo en el hardware XO real, si puedo construir todos los paquetes que necesito y simplemente flashear imagen a la XO, puedo ahorrar tiempo y espacio.

Cuando intenté instalar algunos paquetes, no se pudo configurar debido a la falta de los directorios proc, sys, dev. Entonces, aprendí de otros lugares que necesito "montar" el proceso host, ... directorios a mi entorno chroot.

Vi dos sintaxis y no estoy seguro de cuál usar.

En la máquina host:

  mount --bind /proc <chroot dir>/proc 

y otra sintaxis (en entorno chroot):

  mount -t proc none /proc

¿Cuál debo usar y cuál es la diferencia?

Patricio
fuente
Tenga cuidado: otorgar acceso a los dispositivos de disco significa que pierde algunos de los beneficios de ' chroot()'. En particular, el determinado puede leer archivos fuera de su sección del sistema de archivos si no tiene cuidado.
Jonathan Leffler
2
@ Jonathan Leffler: eso no parece un problema para lo que está haciendo.
Zifre
@JonathanLeffler un usuario root en un chroot siempre puede escapar del chroot de todos modos.
LtWorf

Respuestas:

43

Para /procy /sys, supongo que podrías usar cualquier método. Ambos son sistemas de archivos especiales, por lo que se pueden volver a crear cualquier cantidad de veces (el método de montaje de enlace usa exactamente el mismo montaje que el sistema host, mientras que el otro método usa un montaje nuevo). Siempre he visto el montaje de enlace recomendado en las guías, así que lo usaría. Hasta donde yo sé, no hay una diferencia realmente importante.

Sin embargo, /devgeneralmente es un montaje tmpfs administrado por udev, por lo que debe ser el mismo sistema de archivos que en la máquina host. Eso significa que necesitaría usar el método de montaje de enlace.

Si este chroot va a existir por un tiempo, puede poner estas entradas en /etc/fstabel sistema host para simplificar las cosas.

Zifre
fuente
Me gustaría preguntar si tiene sentido copiar (vincular) el proc / sys del host a otra máquina. ¿Por qué deberían coincidir con esa máquina?
ransh
@ransh tiene sentido que si vincula / proc a $ chrootdir / proc, tendrá la posibilidad de manejar el proceso y lo que sucede dentro / proc de ambos sistemas desde ambos sistemas; por ejemplo: de chroot se puede comprobar si un programa se está ejecutando en el host, etc ...
Jonás
¿Tal vez el sys typesistema de archivos parece ( hoy ) ya no existe?
174140
111

El Linux Wiki Arco sugiere los siguientes comandos:

cd /mnt/arch # or where you are preparing the chroot dir
mount -t proc proc proc/
mount --rbind /sys sys/
mount --rbind /dev dev/
gacrux
fuente
2
También parecían funcionar para mí en ubuntu.
isaaclw
44
En mi caso (también Ubuntu) también necesitaba un "mount -o bind / dev / pts dev / pts".
Thomas
Incluya el enlace a la fuente.
espuma de poliestireno volar
@styrofoamfly Añadido.
gacrux
1
A partir de 2019, el wiki de ArchLinux ahora funciona --rbindpara sysy dev.
Saad Malik
12

El Manual de Gentoo llama específicamente a estos dos comandos para volver a montar / proc y / dev. Los he usado varias veces.

mount -t proc none /mnt/chroot/proc
mount -o bind /dev /mnt/chroot/dev

Sospecho que / sys es solo una carpeta normal, por lo que debería poder hacer un enlace duro.

ln /sys /mnt/chroot/sys
robert
fuente
17
No puede vincular un directorio (por lo general) como sugiere para / sys, y si usa un enlace simbólico se romperá tan pronto como lo haga.
Han agregado algunos nuevos, basados ​​en systemd. Quizás sea una buena idea agregarlos.
AzP
1

Puede valer la pena señalar en esta pregunta popular, que Arch Linux ha creado un script arch-chroot ; descargararch-install-scripts-15-1-any.pkg.tar.xz

Esto se encarga de varios problemas relacionados tanto en Arch-Linux como en Manjaro , donde también lo usé con éxito. Posiblemente, más derivados de Arch, como Parabola, también sean compatibles.

Mientras que una norma sencilla chrooten una instalación secundaria Manjaro no permite llevar a cabo

pacman --sync linux

(la bala de plata después de un bloqueo del sistema), reemplazando la línea con

arch-chroot /run/media/*YOURSELF*/manja-disk2

le permitirá arreglar su instalación secundaria Arch-derivate a través de

pacman --sync linux

como un encanto. El script bash arch-chrootse encarga /dev /sys /procy mucho más, que el estándar deja solo chroot.

ver también: Uso de arch-chroot

y chico
fuente
-1

Hay otros pseudo sistemas de archivos y ubicaciones tmpfs. Esto está en debian:

/dev/pts 
/run
/run/shm
/proc/sys/fs/binfmt_mist
/var/lib/nfs/rpc_pipefs
/proc/fs/nfsd
/proc/bus/usb

Debería estar bien para montar el usbfs, rpc_pipefsy devptspseudo-sistemas de archivos desde dentro del chroot. Recomiendo no vincular /proca los chroot /proc, ya que el núcleo tiene el concepto de espacios de nombres, y en realidad puede poner diferentes cosas en el proceso de chroot.

Actualización: de acuerdo con este hilo de la lista de correo , / sys no se debe montar en enlace, especialmente si los procesos chroot están utilizando su propio espacio de nombres de red.

Es una mala idea montar el sistema /varo /runen el chroot, si el chroot tiene su propio espacio de nombres pid.

Brian Minton
fuente
¿Especulación? En superusuario (y otros foros de pila), generalmente es mejor esperar, o investigar y responder con fuentes vinculadas, si no está seguro. Esto es para evitar el riesgo de difundir pistas equivocadas. Lo siento si decepciono y buena suerte!
Simon B.
@SimonB. Agregué un enlace a una lista de correo que respalda la idea de que / sys no se debe montar en enlace.
Brian Minton
Con el espacio de nombres pid, está hablando de características de espacio de nombres de usuario más avanzadas que podemos encontrar en los núcleos de Linux modernos (es decir, las características "contenedores" se basan en), mientras que cuando usamos el término chroot, nos referimos al cambio de espacio de nombres de archivo tradicional ( y nada más).
Johan Boulé
-1

La forma más fácil es usar un bucle for:

cd /

for i in proc sys dev; do mount -o bind $i /folder/$i; done
oleberlin
fuente