Eu fiz uma pergunta aqui É obrigatório ter um sistema de arquivos
Um dos comentários é:
como um sistema sem sistema de arquivos funcionaria no linux, mesmo que uma impressora ou placa ethernet seja considerada um arquivo? Qual é o seu objetivo aqui? ... Kiwy 24/02 às 14:18
Agora, aqui está uma mensagem de log ao inicializar o linux sem um sistema de arquivos (que está parado 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 a partir do flash.
Agora, a partir do log, é muito claro que muitos dos drivers já estão carregados, apesar de o carregamento do sistema de arquivos falhar (porque eu intencionalmente não coloquei o sistema de arquivos rootfs.jffs2 em flash).
Agora, referindo-se ao comentário acima, se tudo está no arquivo linux, como é que os drivers são carregados com sucesso? Você pode ver tudo o que vem por USB, GPIO, SD antes de solicitar o sistema de arquivos (e falhar).
Então, é tecnicamente correto dizer que
Linux deve ter um sistema de arquivos
Alguns antecedentes O que estou tentando obter é ter o linux em execução em um sistema em que um aplicativo de controle estará em execução. O aplicativo apenas captura alguns dados e os envia para alguns escravos. Não há dúvida de armazenamento de dados. Então, gostaria de se livrar completamente do sistema de arquivos. De acordo com meu entendimento, o sistema de arquivos é necessário para o armazenamento de dados e, como não armazenarei dados, por que o sistema de arquivos e aumenta o uso de recursos?
Atualizar
Embora eu tenha mencionado isso em segundo plano , mas, para ser específico, o envio dos dados ocorreria usando USB ou Ethernet, por isso é natural ter drivers correspondentes.
fonte
initrd
?Respostas:
Se você precisa do Linux, precisa de um sistema de arquivos.
(Refiro-me ao Linux o sistema operacional aqui, em vez do Linux, o kernel do sistema operacional.
Sua observação sobre o carregamento de drivers de dispositivo na inicialização antes da existência do sistema de arquivos é 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ê precise de uma mídia de armazenamento regravável persistente formatada com um sistema de arquivos tradicional, como no exemplo do JFFS2. Tudo o que você precisa para suportar uma
/dev
árvore tradicional é uma estrutura de dados que se comporta como um sistema de arquivos em disco. Os Linux modernos usam o udev em um sistema de arquivos na memória para permitir o acesso aos/dev
nós sem precisar de armazenamento persistente para os/dev
nós, por exemplo.Você também precisa de um sistema de arquivos para fazer uso de vários outros recursos do Linux, o SO:
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 do kernel para aplicar o controle de acesso? A maior parte disso é feita por meio de bits de permissão , ACLs e etiquetas SELinux em um arquivo ou diretório em algum lugar.
Eu provavelmente poderia ter mais exemplos, mas isso serve.
É possível carregar todos os recursos que o seu sistema precisa do armazenamento persistente na RAM, para que, uma vez inicializado, o sistema não use armazenamento persistente. As distribuições do Live Linux fazem isso. Também é comum que os sistemas operacionais Linux incorporados criem todo o sistema de arquivos na RAM durante a inicialização, para que, uma vez inicializados, não continuem fazendo referência ao armazenamento persistente, como um dispositivo de armazenamento flash .
Se você estiver construindo um sistema incorporado de tarefa única de escopo restrito, provavelmente não precisará do sistema operacional Linux. Você pode precisar apenas de um sistema operacional menor e com menos recursos , ou conseguir escrever diretamente no metal .
Algumas das outras respostas aqui falam sobre reduzir o Linux até o ponto em que tudo o que resta é o Linux-kernel, emparelhado com um único executável - seu programa, executando sob o kernel - ou executando como um programa monolítico com seu código estaticamente incorporado nele. De qualquer forma, você pode se livrar completamente da necessidade de um sistema de arquivos, mas o que você acaba usando não é mais o Linux-OS.
fonte
init
. Ah, mas onde seriainit
carregado? Bingo!init
e modificar o kernel para fazer outra coisa além de carregarinit
.Eu escrevi uma resposta para uma pergunta relacionada que detalha como o conceito de um arquivo é essencial para o funcionamento do Unix e, como você não pode ter um arquivo sem algum tipo de sistema de arquivos, isso significa que você definitivamente precisa de um.
No entanto , é possível sobreviver sem um sistema de arquivos existente em qualquer mídia de armazenamento persistente. Sua
initramfs
imagem pode ser compilada no próprio kernel (ou então 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ó se torna tal depois de carregado. Se você colocar todos os arquivos binários necessários dentro deste, 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 puramente 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 achar que simplesmente não tem o suficiente para o que deseja fazer. Além disso, você terá dificuldade em escrever os dados que deseja persistir após uma reinicialização.
fonte
initramfs
imagens é que você não está limitado a apenas 1. Simplesmentecpio
outra imagem no topo da primeira e pronto. OU compile no primeiro e adicione o restante após a inicialização. As possibilidades são infinitas. Observe também que, como ascpio
ferramentas estão incluídas no kernel, não é inconcebível salvar as alterações dessa maneira, embora você esteja limitado a gravar acpio
imagem salva em um dispositivo bruto, se você não tiver outro sistema de arquivos.cpio
imagem não se torna um sistema de arquivos, mas é descompactada em um sistema de arquivos -initramfs
ourootfs
como você preferir.Na verdade, tecnicamente falando, você não precisa de um sistema de arquivos. O comportamento padrão é ter um sistema de arquivos do qual inicializar. (por exemplo,
/sbin/init
é lançado a partir daí). No entanto, se você quiser, pode ver o que acontecedo_basic_setup()
emlinux-source/init/main.c
. No momento em que a rotina é chamada, o kernel e a 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 por seu próprio código para funcionar sem os sistemas de arquivos.Você pode usar os threads do kernel para gerar os processos que desejar. No entanto, tudo isso seria super feio.
fonte
initramfs
- eles usaminitrd
.Um sistema de arquivos fornece mais do que apenas um local para armazenar arquivos. É onde estão os executáveis (programas), bibliotecas e arquivos de configuração do seu sistema. No mínimo, o kernel do linux requer um sistema de arquivos para permitir que ele encontre / execute o processo " init " responsável por garantir que outros processos sejam iniciados conforme apropriado para o seu sistema.
Quanto a tudo, há um arquivo que significa que os sistemas Linux / Unix fornecem acesso a dispositivos, recursos e arquivos por meio de uma abstração de arquivo. 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 fonte 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, você forneceu os drivers de dispositivo embutidos diretamente no kernel e pode executar uma vez que a imagem do kernel foi carregada na memória. Se os drivers de dispositivo são construídos como módulos, eles estão contidos nos arquivos do 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. Depois que o driver do dispositivo é carregado e em execução, normalmente os dispositivos que ele controla estão disponíveis no / dev por meio do sistema de arquivos.
Depois que o kernel está executando o processo init e 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 e enviar mensagens um ao outro. Isto é para a parte principal feita através do acesso ao sistema de arquivos. Enviar / receber pela rede é uma exceção para exigir o acesso ao sistema de arquivos, mas você provavelmente encontrará uma necessidade de acessar um sistema de arquivos muito rapidamente de qualquer maneira.
Dado o seu caso de uso, você deve considerar uma pequena distribuição configurável, como o OpenWrt . Com isso, você pode criar um sistema que tenha um conjunto mínimo de software instalado e que basicamente execute a partir da RAM sem precisar gravar nada no armazenamento estável. Depois de executá-lo, você sempre pode remover componentes desnecessários, mas não subestima a ajuda que traz uma distribuição que possui ferramentas de depuração e uma base de usuários ativa.
fonte
Os sistemas de arquivos são um meio para os sistemas operacionais organizarem dados persistentemente armazenados. Especificamente, eles permitem que o sistema operacional armazene e recupere dados com eficiência. Quando você diz que inicializou a partir de uma unidade flash, isso significa que essa unidade flash certamente possui um sistema de arquivos. O fato de o kernel carregar um driver significa que ele deve ter encontrado uma maneira de encontrá-lo em algum lugar. Este "encontre em algum lugar" é alcançado pelo sistema de arquivos. Mas mesmo que o kernel seja monolítico e tenha tudo compilado, pelo menos o gerenciador de inicialização deve ter conseguido encontrar o kernel.
Em teoria, você poderia fazer isso sem um sistema de arquivos sofisticado, basta colocar tudo em um local fixo e codificar esse local, mas que finalidade isso serviria? E não estamos falando sobre seus arquivos de dados, como e-mails e tudo mais, ainda. Sem um sistema de arquivos, não há uma maneira sólida de armazená-los (e depois encontrá-los). Mesmo que você não queira armazenar nenhum arquivo, o sistema operacional é mais do que apenas o kernel, inclui vários serviços e programas de usuários que são armazenados em arquivos.
Para resumir uma longa história, você deve ter um sistema de arquivos em algum lugar, pois se o kernel não encontrar nenhum (como no exemplo), ele entra em pânico (como mostra o seu log) - o que significa que ele se recusa a fazer qualquer coisa. Mas se a execução de uma instalação Linux a partir de uma unidade flash (com um sistema de arquivos) atender às suas necessidades, você não precisará de um sistema de arquivos em disco ou em qualquer outro lugar.
fonte
/proc
,/sys
...), é a espinha dorsal da maioria de controle de acesso, etc.Se você deseja 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). De fato, não existe nem 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 bastante RAM para que isso seja eficaz. O carregador de inicialização é uma ROM padrão na placa de rede. Todo o resto é transferido pela rede e armazenado em um sistema de arquivos 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 programa a partir daí. Parece que você já está tentando fazer algo assim. Ao executar a partir de um disco flash ou ROM, um sistema de arquivos virtual também é criado na RAM, mas você precisa de menos RAM se estiver usando o método BOOTP.
Ao contrário do Ubuntu, o Debian usa uma imagem de inicialização híbrida que pode ser copiada diretamente para um disco flash USB usando dd, você pode achar mais fácil trabalhar com isso, especialmente porque o Ubuntu exige 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 tenha cuidado para que o rc.local seja executado várias vezes durante a inicialização. Você também pode criar um script /etc/init.d/, mas isso é mais complicado.
Em resumo: o seu programa não precisa de um sistema de arquivos, mas o sistema operacional, no entanto, nenhum disco físico / real é necessário.
fonte
Os 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 em ROM e estava pronto para rodar cerca de 2 segundos após uma inicialização a frio. Deseja carregar software? Digite a fonte manualmente ou digite LOAD, pressione enter e, em seguida, PLAY na máquina de fita. Então nós adquirimos uma unidade de disco - e houve muita alegria.
No entanto, o próprio núcleo do linux assume que um sistema de arquivos está presente, e quase tudo o mais se baseia nisso. Se você deseja implementar um verdadeiro sistema operacional sem sistema de arquivos, é 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 conectar o sistema operacional nos últimos 16k de memória, o processador (MC6502) foi conectado para pular para o local permanentemente armazenado nos últimos 2 bytes de memória.
fonte
Não, o linux não precisa ter um sistema de arquivos em um sentido muito estrito. No seu caso, você tem um problema diferente.
"Nenhum sistema de arquivos conseguiu montar o root, tentou: jffs2" "MTD: dispositivo MTD com o nome" jffs2 "não encontrado."
Meu palpite é que parte do processo de carregamento não é encontrar o local para montar ou não tem a capacidade de montar esse sistema de arquivos.
fonte