Exijo um sistema de arquivos quando não quero armazenar nenhum dado

8

Eu fiz uma pergunta aqui É obrigatório ter um sistema de arquivos

Um dos comentários é:

how a system without file system would work on linux as even a printer or ethernet card is considered as a file ? What is your goal here ? ...Kiwy Feb 24 at 14:18

Agora aqui está uma mensagem de log ao inicializar o linux sem um sistema de arquivos (que está no 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:

Estou inicializando do flash.

Agora, a partir do log, é muito claro que muitos dos drivers já estão carregados, mesmo que o carregamento do sistema de arquivos falhe (porque eu intencionalmente não coloquei o sistema de arquivos rootfs.jffs2 em flash).

Agora, referindo-se ao comentário acima, se tudo é um arquivo no linux, como é que os drivers são carregados com sucesso? Você pode ver USB, GPIO, SD tudo está chegando antes de pedir sistema de arquivos (e falhou).

Então, é tecnicamente correto dizer que

linux MUST have a file system

Algumas informações O que eu estou tentando alcançar é ter o Linux rodando em um sistema onde um aplicativo de controle estará rodando. O aplicativo apenas captura alguns dados e os envia para alguns escravos. Não há questão de armazenar dados em todos. Então, gostaria de se livrar completamente do sistema de arquivos. De acordo com o meu sistema de arquivos de compreensão é necessário para armazenar dados e desde que eu não vou armazenar quaisquer dados então por que ter sistema de arquivos e aumentar o uso de recursos?

Atualizar

Embora eu tenha mencionado isso em plano de fundo , mas para ser específico, o envio dos dados seria feito usando USB ou Ethernet, por isso é natural ter drivers correspondentes.

    
por user2799508 09.04.2014 / 17:31

8 respostas

15

Se você precisa do Linux, você precisa de um sistema de arquivos.

(refiro-me ao Linux, o sistema operacional aqui, ao invés do Linux, o kernel do sistema operacional. Eu vou chegar a essa interpretação mais estreita abaixo).

Sua observação sobre drivers de dispositivo carregando na inicialização antes do sistema de arquivos existir é um arenque vermelho. Você pode carregar um driver sem ter um sistema de arquivos. O que você não pode fazer é fd = open("/dev/foo", O_RDONLY) sem um sistema de arquivos.

Isso não significa que você precisa de um meio de armazenamento regravável persistente formatado com um sistema de arquivos tradicional, como no exemplo JFFS2. Tudo o que você precisa para suportar uma árvore tradicional /dev é uma estrutura de dados que se comporta como uma sistema de arquivos no disco. Os Linuxes modernos usam o udev em um sistema de arquivos na memória para permitir acesso a /dev nós sem precisar de armazenamento persistente para o /dev nós, por exemplo.

Você também precisa de um sistema de arquivos para usar vários outros recursos do Linux-the-OS:

  • Precisa de bibliotecas compartilhadas ou módulos de linguagem de script? Você precisa de um sistema de arquivos para armazenar /lib/libfoo.* , /usr/lib/perl5/* , /lib/ld.so , /etc/ld.so.cache , etc.

  • Precisa de módulos carregáveis do kernel? Você precisa de um sistema de arquivos para /lib/modules/$(uname -r)/*

  • Precisa de mais de um executável, como um shell ou um editor de texto? Eles precisam de um sistema de arquivos para viver.

  • Precisa que o kernel reforce o controle de acesso? A maior parte disso é feita através de bits de permissão , ACLs e SELinux rotula em um arquivo ou diretório em algum lugar.

Eu provavelmente poderia ter mais exemplos, mas isso será suficiente.

É possível carregar todos os recursos que seu sistema precisa de armazenamento persistente na RAM, para que, uma vez inicializado, o sistema não use armazenamento persistente. Distribuições Live Linux fazem isso. Também é comum que os sistemas operacionais Linux embutidos construam todo o seu sistema de arquivos na RAM ao inicializar, de modo que, uma vez inicializados, eles não continuem mais referenciando o armazenamento persistente, como o dispositivo de armazenamento flash .

Se você está construindo um sistema embarcado de tarefa única com escopo limitado, provavelmente não precisa do Linux-the-OS. Você pode precisar apenas de um SO incorporado menor, com menos recursos, ou talvez seja capaz de escrever direito ao metal .

Algumas das outras respostas aqui falam sobre remover o Linux até o ponto em que tudo o que resta é Linux-o-kernel, ou emparelhado com um único executável - seu programa, rodando sob o kernel - ou rodando como um programa monolítico com o seu código incorporado estaticamente dentro dele. De qualquer maneira, você pode se afastar completamente da necessidade de um sistema de arquivos, mas o que você acaba não é mais o Linux-OS.

    
por 09.04.2014 / 18:14
7

Eu escrevi uma resposta a uma pergunta relacionada que detalha como o conceito de um arquivo é fundamental para a maneira como o Unix funciona, e como você não pode ter um arquivo sem algum tipo de sistema de arquivos, significa que você definitivamente precisa de um.

No entanto é possível sobreviver sem um sistema de arquivos que existe em qualquer mídia de armazenamento persistente. Sua imagem initramfs pode ser compilada no próprio kernel (ou, de outra forma, colocada em algum lugar onde o gerenciador de inicialização possa acessá-lo). Tecnicamente, a imagem que é gravada na mídia de armazenamento é um arquivo e não um sistema de arquivos; só fica assim depois de ser carregado. Se você colocar todos os arquivos binários que você precisa dentro dele, não há necessidade de colocá-los em um sistema de arquivos na mídia de armazenamento. Dessa forma, você pode garantir que todos os sistemas de arquivos necessários que o sistema precisa executar existam apenas na memória.

É claro que as desvantagens são que, como tudo o que o sistema precisa tem que existir na memória, você pode descobrir que não tem o suficiente para o que deseja fazer. Além disso, você terá dificuldades para gravar os dados que deseja manter após a reinicialização.

    
por 09.04.2014 / 18:44
5

Na verdade, tecnicamente falando, você não precisa de um sistema de arquivos. O comportamento padrão é ter um sistema de arquivos a partir do qual inicializar. (por exemplo, /sbin/init é lançado a partir daí). No entanto, se você quiser, pode ver o que acontece em do_basic_setup() em linux-source/init/main.c . No momento em que a rotina é chamada, o kernel e o CPU0 estão prontos para o trabalho real. Você pode destruir todo o trabalho necessário para inicializar o initramfs - que também é um sistema de arquivos! - e qualquer coisa depois e substitua-o pelo seu próprio código para funcionar sem os sistemas de arquivos.

Você poderia, então, usar encadeamentos do kernel para gerar os processos desejados. No entanto, tudo isso seria super feio.

    
por 09.04.2014 / 21:28
1

Um sistema de arquivos fornece mais do que apenas um local para armazenar arquivos. É onde os executáveis (programas), bibliotecas e arquivos de configuração do seu sistema estão ativos. No mínimo, o kernel do Linux requer um sistema de arquivos para permitir que ele encontre / execute o processo " init ", que é responsável por garantir que outros processos sejam iniciados conforme apropriado para o seu sistema.

Em relação a tudo é um arquivo , essa frase significa que os sistemas Linux / Unix fornecem acesso a dispositivos, recursos e arquivos por meio de uma abstração de arquivos. Isso significa que existe uma interface consistente (abrir, fechar, ler, escrever, ...) para (quase!) Tudo.

Sua confusão com os drivers de dispositivo ocorre porque você está confundindo a origem das instruções do driver de dispositivo com as instruções reais da máquina executável que implementam o driver de dispositivo. No exemplo que você forneceu, os drivers de dispositivo são construídos diretamente no kernel e podem ser executados assim que a imagem do kernel for carregada na memória. Se os drivers de dispositivo são construídos como módulos eles estão contidos em arquivos no sistema de arquivos e as instruções da máquina executável são carregadas do arquivo na memória do kernel, onde são executadas. Uma vez que o driver de dispositivo é carregado e executado, normalmente torna os dispositivos que ele controla disponíveis em / dev através do sistema de arquivos.

Quando o kernel está executando o processo init, todos os seus filhos precisam acessar o arquivo para interagir com outros processos, acessar dispositivos, solicitar memória virtual, obter fontes de números aleatórios, enviar mensagens entre si. Isso é feito principalmente pelo acesso ao sistema de arquivos. Enviar / receber através da rede é uma exceção para exigir acesso ao sistema de arquivos, mas você provavelmente encontrará uma necessidade de acessar um sistema de arquivos muito rapidamente de qualquer maneira.

Realmente, considerando seu caso de uso, você deve estar usando uma pequena distribuição configurável, como OpenWrt . Com isso, você pode criar um sistema que tenha um conjunto mínimo de software instalado e que, basicamente, seja executado a partir da RAM sem precisar gravar nada no armazenamento estável. Uma vez executado, você sempre pode remover componentes desnecessários, mas não subestime a ajuda de ter uma distribuição com ferramentas de depuração e uma base de usuários ativa.

    
por 09.04.2014 / 18:41
0

Os sistemas de arquivos são um meio para os sistemas operacionais organizarem dados armazenados persistentemente. Especificamente, eles permitem que o sistema operacional armazene e recupere dados de maneira eficiente. Quando você diz que inicializou a partir de uma unidade flash, isso significa que essa unidade flash certamente tem um sistema de arquivos. O fato de o kernel ter carregado um driver significa que ele deve ter uma maneira de encontrá-lo em algum lugar. Este "encontrar em algum lugar" é alcançado pelo sistema de arquivos. Mas mesmo que o kernel seja monolítico e tenha tudo compilado, então pelo menos o boot loader deve ter uma maneira de encontrar o kernel.

Em teoria, você poderia fazer isso sem um sistema de arquivos sofisticado, basta colocar tudo em algum local fixo e codificar esse local, mas qual propósito isso serviria? E nós não estamos falando sobre seus arquivos de dados, como e-mails e tudo mais, ainda. Sem um sistema de arquivos, não há maneira de armazenar (e depois encontrá-los). Mesmo que você não queira armazenar nenhum arquivo, o SO é mais do que apenas o kernel, ele inclui vários serviços e programas de usuário armazenados em arquivos.

Para encurtar a história, você deve ter um sistema de arquivos em algum lugar, pois se o kernel não encontrar nenhum (como no seu exemplo) ele entra em pânico (como seu log mostra) - o que significa que se recusa a fazer qualquer coisa. Mas se executar uma instalação do Linux em uma unidade flash (com um sistema de arquivos) se adequa às suas necessidades, então você não precisa de um sistema de arquivos no disco ou em qualquer outro lugar.

    
por 09.04.2014 / 22:20
0

Se você quiser que o sistema operacional Linux funcione, ele precisa ter um sistema de arquivos.

Mas não há exigência de que o sistema de arquivos esteja em um disco rígido (ou SSD, etc.). Na verdade, não há nem mesmo um requisito de que o Linux esteja no dispositivo.

Você pode usar o protocolo BOOTP para carregar o sistema operacional pela rede. Você precisa de um pouco de memória RAM para que isso seja eficaz. O gerenciador de inicialização é uma ROM padrão na placa de rede. Todo o resto é transferido através da rede e armazenado num sistema de ficheiros virtual criado na RAM.

No entanto, para um dispositivo dedicado, seria melhor instalar a memória flash com o equivalente a um disco USB Live Boot e executar o seu programa a partir daí. Parece que você já está tentando fazer algo assim. Ao executar a partir de um Flash Disk ou ROM, um Virtual File System também é criado na RAM, mas você precisa de menos RAM do que se estivesse usando o método BOOTP.

Ao contrário do Ubuntu, o Debian usa uma imagem Hybrid Boot que pode ser copiada diretamente para um disco flash USB usando dd, você pode achar isso mais fácil de se trabalhar, especialmente porque o Ubuntu requer o uso de um programa especial para criar o USB inicializável e esse programa é um pouco buggy.

Você pode adicionar seus próprios programas a uma imagem do sistema operacional usando várias ferramentas para montar o ISO como um sistema de arquivos de leitura / gravação. Você pode usar o rc.local para iniciar o programa, mas cuidado com o rc.local que é executado várias vezes durante a inicialização. Você também pode criar um script /etc/init.d/, mas isso é mais complicado.

Em Resumo: Seu programa não precisa de um sistema de arquivos, mas sim do sistema operacional, no entanto, nenhum disco físico / real é necessário.

    
por 10.04.2014 / 10:25
0

Computadores anteriores (e alguns sistemas embarcados modernos) não possuem um sistema de arquivos. My Apple] [(e o Commodore PET da escola) tinha o sistema operacional na ROM e estava pronto para rodar cerca de 2 segundos depois de uma inicialização a frio. Quer carregar o software? Digite a origem manualmente ou digite LOAD, pressione enter e, em seguida, toque em PLAY na unidade de fita. Então nós temos um drive de disco - e houve muita alegria.

No entanto, o próprio núcleo do Linux pressupõe que um sistema de arquivos está presente e quase todo o resto se baseia nisso. Se você quer implementar um verdadeiro sistema de arquivos sem sistema, certamente é possível, mas seu hardware e sistema operacional terão que ser construídos em torno do conceito.

O método da Apple era ligar o sistema operacional nos últimos 16k de memória, o processador (MC6502) foi programado para pular para o local permanentemente armazenado nos últimos 2 bytes de memória.

    
por 10.04.2014 / 14:22
-3

Não, o Linux não precisa ter um sistema de arquivos em um sentido muito restrito. No seu caso, você tem um problema diferente.

"Nenhum sistema de arquivos pode montar raiz, tentei: jffs2" "MTD: dispositivo MTD com nome" jffs2 "não encontrado."

Meu palpite é que alguma parte do processo de carregamento não está encontrando um / o local para montar ou não tem a capacidade de montar esse sistema de arquivos.

    
por 09.04.2014 / 18:05