Quiero ejecutar Linux en un dispositivo integrado (mips) que tiene algunas restricciones muy estrictas:
- sólo 16 MB de almacenamiento
- sin ethernet por cable (solo wifi)
Buenas noticias:
- Tengo un gestor de arranque funcionando (arranque en u)
- También tengo un kernel que funciona (versión 3.10.14 #2 PREEMPT)
- y tengo un sistema de archivos raíz en funcionamiento (Linux puede iniciarse y puedo iniciar sesión)
Ahora el problema es que no me queda más espacio para ejecutar ninguna aplicación de usuario en este hardware, por eso quiero pasar a NFS.
Aquí no estoy seguro del procedimiento.
El proceso de arranque lo maneja U-boot como mencioné. Pero U-boot no puede inicializar el Wifi; por lo tanto, necesitaré un pequeño sistema operativo Linux para este propósito.
Idea principal
- U-boot carga el kernel y lo inicia
- El kernel contiene controladores para el chip wifi y monta los rootfs
- rootfs contiene los archivos necesarios para conectarse al AP (contraseñas, ssid, etc.)
- una vez que la conexión esté activa, NFS montará el fs remoto en /opt o algo así
¿Es posible de alguna manera reemplazar el sistema de archivos raíz (/) por el que está en NFS? (A pesar de que la configuración wifi está almacenada en esta partición que era necesaria para iniciar la conexión)
Actualizar
Sin embargo, he compilado con éxito programas cliente nfs para mips y el dispositivo ahora puede montar el nuevo rootfs a través de nfs en algún directorio.raíz_pivotefalla:
# mount -o nolock IPADDRESS:/srv/fs /tmp/nfs
# ls /tmp/nfs
bin
etc
...
# ls /tmp
nfs
old
# pivot_root /tmp/nfs /tmp/old
pivot_root: Invalid argument
# pivot_root
BusyBox v1.29.0.git (2018-06-23 20:08:52 CEST) multi-call binary.
Usage: pivot_root NEW_ROOT PUT_OLD
Move the current root file system to PUT_OLD and make NEW_ROOT the new root file system
Respuesta1
Sí, y básicamente estás haciendo lo mismo que hace initramfs en las PC con Linux. El initramfs comienza como un sistema de archivos raíz normal en un /
rootfs en memoria ; luego monta el sistema de archivos raíz real en algún lugar de /mnt o /real.
(En realidad, esto se utiliza a menudo para implementar NFS-root en servidores, en situaciones en las que el soporte NFS integrado del kernel es insuficiente, por ejemplo, cuando se necesita Kerberos).
El paso importante es utilizar elraíz_pivote()syscall para intercambiar la raíz actual con la recién montada. Después de la llamada, el rootfs original aún permanece montado, pero ya no en /: la llamada mueve el montaje a un subdirectorio del "nuevo" rootfs.
También hay una
pivot_root
programaen Busybox (así como en util-linux) que se puede usar si su proceso de inicio es un shellscript (como suele ser el caso). La página de manual de util-linux vinculada tiene ejemplos de su uso.Alternativamente, segúnLino, puede ser suficiente simplementechroot()en la raíz recién montada, es decir, si ya no necesita acceso a la raíz original. Nuevamente, existe una
chroot
herramienta de línea de comandos para eso.
Nota: usted nonecesidadconstruir y utilizar un initramfs para lograr esto; A las funciones no les importa si se llaman desde una imagen initrd o desde un rootfs real.
Sin embargo, debido a que un initramfs "normal" se ejecuta desde un sistema de archivos temporal descomprimido en memoria, es habitual que herramientas como switch_root
eliminar todos los archivos initramfs justo antes de pasar a la nueva raíz. Pero si estás arrancando directamente desde un sistema de archivos en disco, probablemente estonolo que deseas, así que asegúrate de no usar la switch_root
herramienta, solo pivot_root
.