Hice una pregunta aquí ¿Es obligatorio tener un sistema de archivos
Uno de los comentarios es:
¿Cómo funcionaría un sistema sin sistema de archivos en Linux ya que incluso una impresora o tarjeta de Ethernet se considera como un archivo? ¿Cuál es tu objetivo aquí? ... Kiwy 24 de febrero a las 14:18
Ahora, aquí hay un mensaje de registro al iniciar Linux sin un sistema de archivos (que se cuelga al final):
[Tue Apr 08 20:07:18.298 2014]
[Tue Apr 08 20:07:18.298 2014]
[Tue Apr 08 20:07:18.298 2014] U-Boot 2013.07 (Apr 08 2014 - 14:27:03)
[Tue Apr 08 20:07:18.298 2014]
[Tue Apr 08 20:07:18.298 2014] Memory: ECC disabled
[Tue Apr 08 20:07:18.298 2014] DRAM: 1 GiB
[Tue Apr 08 20:07:18.308 2014] SF: Detected N25Q128A with page size 64 KiB, total 16 MiB
[Tue Apr 08 20:07:18.341 2014] *** Warning - bad CRC, using default environment
[Tue Apr 08 20:07:18.341 2014]
[Tue Apr 08 20:07:18.341 2014] In: serial
[Tue Apr 08 20:07:18.341 2014] Out: serial
[Tue Apr 08 20:07:18.341 2014] Err: serial
[Tue Apr 08 20:07:18.341 2014] U-BOOT for Xilinx-ZC702-14.7
[Tue Apr 08 20:07:18.341 2014]
[Tue Apr 08 20:07:18.341 2014]
[Tue Apr 08 20:07:18.341 2014] SF: Detected N25Q128A with page size 64 KiB, total 16 MiB
[Tue Apr 08 20:07:18.697 2014] Linux
[Tue Apr 08 20:07:18.697 2014] Load Address: 0x00008000
[Tue Apr 08 20:07:18.697 2014] Entry Point: 0x00008000
[Tue Apr 08 20:07:18.697 2014] Verifying Hash Integrity ... OK
[Tue Apr 08 20:07:18.697 2014] ## Loading fdt from FIT Image at 01000000 ...
[Tue Apr 08 20:07:18.697 2014] Using 'conf@1' configuration
[Tue Apr 08 20:07:18.697 2014] Trying 'fdt@1' fdt subimage
[Tue Apr 08 20:07:18.697 2014] Description: Flattened Device Tree blob
[Tue Apr 08 20:07:18.697 2014] Type: Flat Device Tree
[Tue Apr 08 20:07:18.697 2014] Compression: uncompressed
[Tue Apr 08 20:07:18.697 2014] Data Start: 0x0111d344
[Tue Apr 08 20:07:18.697 2014] Data Size: 11179 Bytes = 10.9 KiB
[Tue Apr 08 20:07:18.697 2014] Architecture: ARM
[Tue Apr 08 20:07:18.697 2014] Hash algo: crc32
[Tue Apr 08 20:07:18.697 2014] Hash value: a7a92b47
[Tue Apr 08 20:07:18.697 2014] Hash algo: sha1sha1+ OK
[Tue Apr 08 20:07:18.702 2014] Booting using the fdt blob at 0x111d344
[Tue Apr 08 20:07:18.702 2014] UncomprOK
[Tue Apr 08 20:07:18.702 2014] Loading Device Tree to 07ffa000, end 07fffbaa ... OK
[Tue Apr 08 20:07:18.702 2014]
[Tue Apr 08 20:07:18.702 2014] Starting kernel ...
[Tue Apr 08 20:07:18.702 2014]
[Tue Apr 08 20:07:19.453 2014] u @c0a7b000 s5568 r8192 d14912 u32768
[Tue Apr 08 20:07:19.453 2014] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 260096
[Tue Apr 08 20:07:19.453 2014] Kernel command line: root=mtd:jffs2 rw rootfstype=jffs2 console=ttyPS0,115200
[Tue Apr 08 20:07:19.453 2014] PID hash table entries: 4096 (order: 2, 16384 bytes)
[Tue Apr 08 20:07:19.453 2014] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
[Tue Apr 08 20:07:19.453 2014] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
[Tue Apr 08 20:07:19.453 2014] __ex_table already sorted, skipping sort
[Tue Apr 08 20:07:19.453 2014] Memory: 1024MB = 1024MB total
[Tue Apr 08 20:07:19.453 2014] Memory: 1036960k/1036960k available, 11616k reserved, 270339 16
[Tue Apr 08 20:07:19.625 2014] I reach build/linux/kernel/xlnx-3.8/source/net/socket.c:
[Tue Apr 08 20:07:19.625 2014] DMA: preallocated 256 KiB pool for atomic coherent allocations
[Tue Apr 08 20:07:19.625 2014] xgpiops e000a000.ps7-gpio: gpio at 0xe000a000 mapped to 0xf004e000
[Tue Apr 08 20:07:19.625 2014] GPIO IRQ not connected
[Tue Apr 08 20:07:19.625 2014] XGpio: /amba@0/gpio@41220000: registered, base is 255
[Tue Apr 08 20:07:19.625 2014] GPIO IRQ not connected
[Tue Apr 08 20:07:19.625 2014] XGpio: /amba@0/gpio@41200000: registered, base is 251
[Tue Apr 08 20:07:19.625 2014] usbcore: registered new interface driver usbfs
[Tue Apr 08 20:07:19.625 2014] usbcore: registered new interface driver hub
[Tue Apr 08 20:07:19.625 2014] usbcore: registered new device driver usb
[Tue Apr 08 20:07:19.625 2014] Switching to clocksoutyPS0 at MMIO 0xe0001000 (irq = 82) is a xuartps
[Tue Apr 08 20:07:19.629 2014] console [ttyPSxusbps-ehci xusbps-ehci.0: irq 53, io mem 0x00000000
[Tue Apr 08 20:07:19.670 2014] xusbps-ehci xusbps-ehci.0: USB 2.0 started, EHCI 1.00
[Tue Apr 08 20:07:19.675 2014] hub 1-0:1.0: USB hub found
[Tue Apr 08 20:07:19.675 2014] hub 1-0:1.0: 1 port detected
[Tue Apr 08 20:07:19.681 2014] xi2cps e0004000.ps7-i2c: 400 kHz mmio e0004000 irq 57
[Tue Apr 08 20:07:19.686 2014] xadcps f8007100.ps7-xadc: enabled: yes reference: external
[Tue Apr 08 20:07:19.709 2014] xwdtps f8005000.ps7-wdt: Xilinx Watchdog Timer at f00ea000 with timeout 10s
[Tue Apr 08 20:07:19.709 2014] sdhci: Secure Digital Host Controller Interface driver
[Tue Apr 08 20:07:19.709 2014] sdhci: Copyright(c) Pierre Ossman
[Tue Apr 08 20:07:19.709 2014] sdhci-pltfm: SDHCI platform and OF driver helper
[Tue Apr 08 20:07:19.729 2014] usbcore: registered new interface driver usbhid
[Tue Apr 08 20:07:19.729 2014] usbhid: USB HID core driver
[Tue Apr 08 20:07:19.729 2014] I am at build/linux/kernel/xlnx-3.8/source/drivers/hid/usbhid/hid-core.c
[Tue Apr 08 20:07:19.729 2014] VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4
[Tue Apr 08 20:07:19.781 2014] MTD: MTD device with name "jffs2" not found.
[Tue Apr 08 20:07:19.781 2014] List of all partitions:
[Tue Apr 08 20:07:19.781 2014] No filesystem could mount root, tried: jffs2
[Tue Apr 08 20:07:19.781 2014] Kernel panic - not syncing: VFS: Unable to mount root fs on mtd:jffs2
[Tue Apr 08 20:07:19.781 2014] CPU1: stopping
[Tue Apr 08 20:07:19.781 2014] Backtrace:
[Tue Apr 08 20:07:19.781 2014] Function entered at [<c0011094>] from [<c01c6408>]
[Tue Apr 08 20:07:19.781 2014] r6:c0246418 r5:00000000 r4:00000001 r3:60000193
[Tue Apr 08 20:07:19.781 2014] Function entered at [<c01c63f0>] from [<c0011fbc>]
[Tue Apr 08 20:07:19.781 2014] Function entered at [<c0011f78>] from [<c0012270>]
[Tue Apr 08 20:07:19.781 2014] r4:c0247ef4 r3:c0011f78
[Tue Apr 08 20:07:19.781 2014] Function entered at [<c001220c>] from [<c00084e4>]
[Tue Apr 08 20:07:19.781 2014] r5:ef07bf68 r4:f8f00100
[Tue Apr 08 20:07:19.824 2014] Function entered at [<c0008484>] from [<c000da00>]
[Tue Apr 08 20:07:19.824 2014] Exception stack(0xef07bf68 to 0xef07bfb0)
[Tue Apr 08 20:07:19.824 2014] bf60: c0a838d0 00000000 00000003 00000000 ef07a000 c01cd528
[Tue Apr 08 20:07:19.824 2014] bf80: ef07a000 c025c418 0000406a 413fc090 00000000 ef07bfbc ef07bfc0 ef07bfb0
[Tue Apr 08 20:07:19.824 2014] bfa0: c000e94c c000e950 60000113 ffffffff
[Tue Apr 08 20:07:19.824 2014] r6:ffffffff r5:60000113 r4:c000e950 r3:c000e94c
[Tue Apr 08 20:07:19.824 2014] Function entered at [<c000e924>] from [<c000eacc>]
[Tue Apr 08 20:07:19.824 2014] Function entered at [<c000ea40>] from [<c01c4208>]
[Tue Apr 08 20:07:19.824 2014] r5:00000001 r4:c024cf68
[Tue Apr 08 20:07:19.824 2014] Function entered at [<c01c4118>] from [<001c37c8>]
[Tue Apr 08 20:07:19.844 2014] r6:10c03c7d r5:00000015 r4:2f06406a r3:c01c37b0
[Tue Apr 08 20:07:19.844 2014] MTD: MTD device with name "jffs2" not found.
[Tue Apr 08 20:07:19.844 2014] List of all partitions:
[Tue Apr 08 20:07:19.844 2014] No filesystem could mount root, tried: jffs2
[Tue Apr 08 20:07:19.844 2014] Kernel panic - not syncing: VFS: Unable to mount root fs on mtd:
Estoy arrancando desde flash.
Ahora, desde el registro, está muy claro que muchos de los controladores ya están cargados aunque la carga del sistema de archivos haya fallado (porque intencionalmente no puse el sistema de archivos rootfs.jffs2 en flash).
Ahora, haciendo referencia al comentario anterior, si todo es un archivo en Linux, ¿cómo es que los controladores se cargan correctamente? Puede ver USB, GPIO, SD todo viene antes de que solicite el sistema de archivos (y falló).
Entonces, ¿es técnicamente correcto decir que
Linux DEBE tener un sistema de archivos
Algunos antecedentes Lo que estoy tratando de lograr es tener Linux ejecutándose en un sistema donde se ejecutará una aplicación de control. La aplicación solo captura algunos datos y los envía a algunos esclavos. No se trata de almacenar datos en absoluto. Por lo tanto, me gustaría deshacerme por completo del sistema de archivos. Según mi comprensión, el sistema de archivos es necesario para almacenar datos y, dado que no almacenaré ningún dato, ¿por qué tener un sistema de archivos y aumentar el uso de recursos?
Actualizar
Aunque he mencionado esto en segundo plano , pero para ser específicos, el envío de los datos se llevaría a cabo mediante USB o Ethernet, por lo que es natural tener los controladores correspondientes.
fuente
initrd
?Respuestas:
Si necesita Linux, necesita un sistema de archivos.
(Me refiero a Linux, el sistema operativo aquí, en lugar de Linux, el núcleo del sistema operativo. Llegaré a esa interpretación más estrecha a continuación).
Su observación sobre la carga de controladores de dispositivo en el arranque antes de que exista el sistema de archivos es una pista falsa. Puede cargar un controlador sin tener un sistema de archivos. Lo que no puedes hacer es
fd = open("/dev/foo", O_RDONLY)
sin un sistema de archivos.Eso no significa que necesite un medio de almacenamiento regrabable persistente formateado con un sistema de archivos tradicional, como con su ejemplo JFFS2. Todo lo que necesita para soportar un
/dev
árbol tradicional es una estructura de datos que se comporte como un sistema de archivos en disco. Los Linux modernos usan udev en un sistema de archivos en memoria para permitir el acceso a los/dev
nodos sin necesidad de almacenamiento persistente para los/dev
nodos, por ejemplo.También necesita un sistema de archivos para utilizar otras capacidades de Linux-the-OS:
¿Necesita bibliotecas compartidas o módulos de lenguaje de script? Es necesario un sistema de archivos para almacenar
/lib/libfoo.*
,/usr/lib/perl5/*
,/lib/ld.so
,/etc/ld.so.cache
, etc.¿Necesita módulos de kernel cargables? Necesita un sistema de archivos para
/lib/modules/$(uname -r)/*
¿Necesita más de un ejecutable, como un shell o un editor de texto? Necesitan un sistema de archivos para vivir.
¿Necesita el núcleo para imponer el control de acceso? La mayor parte de eso se realiza a través de bits de permiso , ACL y etiquetas SELinux en un archivo o directorio en alguna parte.
Probablemente podría encontrar más ejemplos, pero eso servirá.
Es posible cargar todos los recursos que su sistema necesita desde el almacenamiento persistente en la RAM, de modo que una vez que se inicia, el sistema no utiliza el almacenamiento persistente en absoluto. Las distribuciones de Linux en vivo hacen esto. También es común que los sistemas operativos Linux integrados construyan todo su sistema de archivos en la RAM cuando se inician, de modo que una vez que se inician, ya no continúan haciendo referencia al almacenamiento persistente, como un dispositivo de almacenamiento flash .
Si está construyendo un sistema embebido de una sola tarea y un objetivo limitado, probablemente no necesite Linux-the-OS. Es posible que solo necesite un sistema operativo integrado más pequeño y menos funcional , o que pueda escribir directamente en el metal .
Algunas de las otras respuestas aquí hablan de eliminar Linux hasta el punto en que todo lo que queda es Linux-the-kernel, ya sea emparejado con un solo ejecutable, su programa, ejecutándose bajo el kernel, o ejecutándose como un programa monolítico con su código estáticamente incorporado dentro de él. De cualquier manera, puede alejarse por completo de la necesidad de un sistema de archivos, pero lo que termina ya no es Linux-the-OS.
fuente
init
. Oh, pero ¿dónde seinit
cargaría? ¡Bingo!init
y modificar el kernel para hacer algo más que cargarinit
.Escribí una respuesta a una pregunta relacionada que detalla cómo el concepto de un archivo es fundamental para la forma en que funciona Unix, y dado que no puede tener un archivo sin algún tipo de sistema de archivos, significa que definitivamente necesita uno.
Sin embargo , es posible sobrevivir sin un sistema de archivos que exista en cualquier medio de almacenamiento persistente. Su
initramfs
imagen puede compilarse en el núcleo mismo (o colocarse en algún lugar donde el gestor de arranque pueda acceder a ella). Técnicamente, la imagen que se escribe en los medios de almacenamiento es un archivo y no un sistema de archivos; solo se convierte en tal después de que se carga. Si coloca todos los archivos binarios que necesita dentro de este, no es necesario ponerlos en un sistema de archivos en medios de almacenamiento. De esta manera, puede asegurarse de que todos los sistemas de archivos necesarios que el sistema necesita para ejecutarse existan exclusivamente en la memoria.Por supuesto, las desventajas son que, dado que todo lo que necesita el sistema tiene que existir en la memoria, es posible que no tenga suficiente para lo que desea hacer. También tendrá dificultades para escribir los datos que desea conservar después de un reinicio.
fuente
initramfs
las imágenes es que está no limitado a solamente 1. Simplementecpio
otra imagen encima de la primera y ya está bueno para ir. O compile en el primero y agregue el resto después del arranque. Las posibilidades son infinitas. Tenga en cuenta también que debido a que lascpio
herramientas están incluidas en el núcleo, no es inconcebible guardar los cambios de esta manera, aunque estaría limitado a escribir lacpio
imagen guardada en un dispositivo sin formato si no tuviera otro sistema de archivos.cpio
imagen no se convierte en un sistema de archivos, sino que se descomprime en un sistema de archivos,initramfs
orootfs
como prefiera.En realidad, técnicamente hablando, no necesitas un sistema de archivos. El comportamiento predeterminado es tener un sistema de archivos desde el cual iniciar. (por ejemplo,
/sbin/init
se inicia desde allí). Sin embargo, si lo desea, puede ver lo que sucededo_basic_setup()
enlinux-source/init/main.c
. Para cuando se llama a la rutina, el kernel y la CPU0 están listos para el trabajo real. Puede destruir todo el trabajo requerido para iniciar initramfs, ¡que también es un sistema de archivos! - y cualquier cosa posterior y reemplácela con su propio código para trabajar sin los sistemas de archivos.Luego, podría usar hilos de kernel para generar los procesos que desee. Sin embargo, todo esto sería súper feo.
fuente
initramfs
, los usaninitrd
.Un sistema de archivos proporciona más que solo un lugar para almacenar archivos. Es donde viven los ejecutables (programas), las bibliotecas y los archivos de configuración para su sistema. Como mínimo, el kernel de Linux requiere un sistema de archivos que le permita encontrar / ejecutar el proceso " init " que es responsable de garantizar que otros procesos se inicien según sea apropiado para su sistema.
Con respecto a todo, es un archivo que significa que los sistemas Linux / Unix proporcionan acceso a dispositivos, recursos, archivos a través de una abstracción de archivos. Eso significa que hay una interfaz consistente (abrir, cerrar, leer, escribir, ...) para (¡casi!) Todo.
Su confusión con los controladores del dispositivo se produce porque está confundiendo la fuente de las instrucciones del controlador del dispositivo con las instrucciones reales de la máquina ejecutable que implementan el controlador del dispositivo. En el ejemplo que proporcionó, los controladores de dispositivo están integrados directamente en el núcleo y pueden ejecutarse una vez que la imagen del núcleo se ha cargado en la memoria. Si los controladores de dispositivo se compilan como módulos , están contenidos en archivos en el sistema de archivos y las instrucciones de la máquina ejecutable se cargan desde el archivo a la memoria del núcleo donde se ejecutan. Una vez que el controlador del dispositivo se carga y se ejecuta, normalmente hace que los dispositivos que controla estén disponibles en / dev a través del sistema de archivos.
Una vez que el kernel está ejecutando el proceso init y todos sus hijos necesitan acceder al archivo para interactuar con otros procesos, acceder a dispositivos, solicitar memoria virtual, obtener fuentes de números aleatorios, enviarse mensajes entre sí. Esto es para la parte principal realizada a través del acceso al sistema de archivos. Enviar / recibir a través de la red es una excepción a la necesidad de acceder al sistema de archivos, pero de todos modos es probable que necesite acceder a un sistema de archivos muy rápido.
Realmente dado su caso de uso, debería considerar usar una pequeña distribución configurable como OpenWrt . Con eso, puede construir un sistema que tenga un conjunto mínimo de software instalado y que básicamente se ejecute desde la RAM sin necesidad de escribir nada en el almacenamiento estable. Una vez que tiene eso en ejecución, siempre puede quitar los componentes innecesarios, pero no subestime la ayuda que brinda una distribución que tiene herramientas de depuración y una base de usuarios activa.
fuente
Los sistemas de archivos son un medio para que los sistemas operativos organicen datos almacenados de forma persistente. Específicamente, permiten que el sistema operativo almacene y recupere datos de manera eficiente. Cuando dice que ha arrancado desde una unidad flash, eso significa que esta unidad flash ciertamente tiene un sistema de archivos. El hecho de que el kernel haya cargado un controlador significa que debe haber tenido una manera de encontrarlo en algún lugar. Este "encontrarlo en alguna parte" lo logra el sistema de archivos. Pero incluso si el kernel es monolítico y tiene todo compilado, al menos el gestor de arranque debe haber tenido una manera de encontrar el kernel.
En teoría, podría hacerlo sin un sistema de archivos sofisticado, simplemente poner todo en una ubicación fija y codificar esa ubicación, pero ¿para qué serviría? Y aún no estamos hablando de sus archivos de datos como correos electrónicos y todo lo demás. Sin un sistema de archivos, no hay una buena forma de almacenarlos (y luego encontrarlos). Incluso si no desea almacenar ningún archivo, el sistema operativo es más que solo el núcleo, incluye varios servicios y programas de usuario que se almacenan en archivos.
Para abreviar una historia larga, debe tener un sistema de archivos en algún lugar, ya que si el núcleo no encuentra ninguno (como en su ejemplo) entra en pánico (como muestra su registro), lo que significa que se niega a hacer nada. Pero si ejecutar una instalación de Linux desde una unidad flash (con un sistema de archivos) se adapta a sus necesidades, entonces no necesita un sistema de archivos en el disco ni en ningún otro lugar.
fuente
/proc
,/sys
...), que es la columna vertebral de la mayoría de control de acceso, etc.Si desea que el sistema operativo Linux funcione, debe tener un sistema de archivos.
Pero no hay ningún requisito de que el sistema de archivos esté en un disco duro (o SSD, etc.). De hecho, ni siquiera existe el requisito de que Linux esté en el dispositivo.
Puede usar el protocolo BOOTP para cargar el sistema operativo a través de la red. Sin embargo, necesita bastante RAM para que esto sea efectivo. El gestor de arranque es una ROM estándar en la tarjeta de red. Todo lo demás se transfiere a través de la red y se almacena en un Sistema de archivos virtual que se crea en la RAM.
Sin embargo, para un dispositivo dedicado, sería mejor instalar memoria flash con el equivalente de un disco USB Live Boot y ejecutar su programa desde allí. Parece que ya estás tratando de hacer algo así. Cuando se ejecuta desde un disco flash o ROM, también se crea un sistema de archivos virtual en RAM, pero necesita menos RAM que si usa el método BOOTP.
A diferencia de Ubuntu, Debian usa una imagen de arranque híbrido que se puede copiar directamente a un disco flash USB usando dd, puede resultarle más fácil trabajar con esto, especialmente porque Ubuntu requiere el uso de un programa especial para crear el USB de arranque y ese programa es algo con errores.
Puede agregar sus propios programas a una imagen del sistema operativo utilizando varias herramientas para montar el ISO como un sistema de archivos de lectura / escritura. Puede usar rc.local para iniciar el programa, pero tenga en cuenta que rc.local se ejecuta varias veces durante el inicio. También puede crear un script /etc/init.d/ pero eso es más complicado.
En resumen: su programa no necesita un sistema de archivos, pero el sistema operativo sí, sin embargo, no se necesita un disco real / físico.
fuente
Las computadoras anteriores (y algunos sistemas integrados modernos) no tienen un sistema de archivos. Mi Apple] [(y el Commodore PET de la escuela) tenía el sistema operativo en ROM y estaba listo para funcionar unos 2 segundos después de un arranque en frío. ¿Quieres cargar el software? Escriba la fuente manualmente o escriba LOAD, presione enter y luego PLAY en la máquina de cintas. Luego obtuvimos una unidad de disco, y hubo mucha alegría.
Sin embargo, el núcleo mismo de Linux supone que existe un sistema de archivos, y casi todo lo demás se basa en eso. Si desea implementar un verdadero sistema operativo sin sistema de archivos, es ciertamente posible, pero su hardware y sistema operativo tendrán que construirse alrededor del concepto.
El método de Apple fue conectar el sistema operativo en los últimos 16k de memoria, el procesador (MC6502) fue cableado para saltar a la ubicación almacenada permanentemente en los últimos 2 bytes de memoria.
fuente
No, Linux no necesita tener un sistema de archivos en un sentido muy estricto. En su caso, tiene un problema diferente.
"Ningún sistema de archivos pudo montar la raíz, intentó: jffs2" "MTD: dispositivo MTD con el nombre" jffs2 "no encontrado".
Mi conjetura es que alguna parte del proceso de carga no encuentra un lugar para montar o no tiene la capacidad de montar ese sistema de archivos.
fuente