ここで質問しました ファイルシステムが必須ですか
コメントの1つは:
プリンターやイーサネットカードでさえファイルと見なされるため、ファイルシステムのないシステムはLinux上でどのように機能しますか?ここでのあなたの目標は何ですか? ... Kiwy 2月24日14:18
ファイルシステムなしでLinuxを起動したときのログメッセージは次のとおりです(最後にハングしています)。
[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:
フラッシュから起動しています。
ログから、ファイルシステムのロードに失敗した場合でも、多くのドライバーがすでにロードされていることが非常に明確です(ファイルシステムrootfs.jffs2を意図的にフラッシュに入れないため)。
上記のコメントを参照すると、すべてがLinuxのファイルである場合、どうしてドライバーが正常にロードされるのでしょうか。 USB、GPIO、SDがファイルシステムを要求する前に(そして失敗して)すべてが来ているのを見ることができます。
それで、それを言うことは技術的に正しいですか
linuxにはファイルシステムが必要です
いくつかの背景私が達成しようとしているのは、制御アプリケーションが実行されるシステムでLinuxを実行することです。アプリケーションは、いくつかのデータをキャプチャして、それをいくつかのスレーブに送信するだけです。データの保存に問題はありませんAT ALL。ファイルシステムを完全に削除したいと思います。私の理解では、データの保存にはファイルシステムが必要であり、データを保存しないので、なぜですか。ファイルシステムを持っていて、リソース使用量を増やしますか?
更新
これについてはbackgroundで説明しましたが、具体的には、データの送信はUSBまたはイーサネットを使用して行われます。したがって、対応するドライバーがあるのは自然なことです。
Linuxが必要な場合は、ファイルシステムが必要です。
(ここでは、OSカーネルのLinuxではなく、オペレーティングシステムのLinuxを意味します。以下でその狭い解釈について説明します。)
ファイルシステムが存在する前に起動時にロードされるデバイスドライバについてのあなたの観察は赤いニシンです。ファイルシステムがなくてもドライバをロードできます。あなたができないことは、ファイルシステムなしでfd = open("/dev/foo", O_RDONLY)
です。
これは、JFFS2の例のように、従来のファイルシステムでフォーマットされた永続的な書き換え可能なストレージメディアが必要であることを意味するものではありません。従来の_/dev
_ツリーをサポートするために必要なのは データ構造がディスク上のファイルシステムのように動作する 。最近のLinuxは、メモリ内ファイルシステムで dev を使用して、たとえば_/dev
_ノード用の永続ストレージを必要とせずに_/dev
_ノードへのアクセスを許可します。
Linux-the-OSの他のいくつかの機能を利用するには、ファイルシステムも必要です。
共有ライブラリまたはスクリプト言語モジュールが必要ですか? _/lib/libfoo.*
_、_/usr/lib/Perl5/*
_、_/lib/ld.so
_、_/etc/ld.so.cache
_などを保存するファイルシステムが必要です。
ロード可能なカーネルモジュールが必要ですか? /lib/modules/$(uname -r)/*
用のファイルシステムが必要です
シェルやテキストエディタなど、複数の実行可能ファイルが必要ですか?彼らは住むためにファイルシステムを必要としています。
アクセス制御を実施するためにカーネルが必要ですか?そのほとんどは、どこかのファイルまたはディレクトリで permission bits 、 ACLs 、および SELinuxlabels を介して行われます。
私はおそらくもっと多くの例を思い付くことができますが、それで十分です。
システムが必要とするすべてのリソースを永続ストレージからRAMにロードできるため、一度起動すると、システムは永続ストレージをまったく使用しません。 ライブLinuxディストリビューション これを行います。また、組み込みLinux OSは、起動時にファイルシステム全体をRAMで構築するため、起動すると、 フラッシュストレージなどの永続ストレージを参照し続けることはありません)も一般的です。デバイス 。
スコープの狭い単一目的の単一タスク組み込みシステムを構築している場合は、おそらくLinux-the-OSは必要ありません。小さくて機能性の低い 組み込みOS だけが必要な場合もあれば、 金属に直接 と書くことができる場合もあります。
ここでの他の回答のいくつかは、Linuxを削除して、カーネルの下で実行されている単一の実行可能ファイルとペアになっている、またはカーネルの下で実行されているLinux-the-kernelだけを残すことについて説明しています。コードが静的に組み込まれています。いずれにせよ、ファイルシステムの必要性から完全に逃れることができますが、最終的にはLinux-the-OSではなくなります。
私は 関連する質問への回答 を書きました。これは、ファイルの概念がUnixの動作の核となる方法を詳しく説明しています。ある種のファイルシステムがないとファイルを作成できないため、間違いなく必要です。
ただし永続ストレージメディアにファイルシステムが存在しなくても存続することは可能です。 initramfs
イメージは、カーネル自体にコンパイルできます(または、ブートローダーがアクセスできる場所に配置できます)。技術的には、ストレージメディアに書き込まれるイメージはアーカイブであり、ファイルシステムではありません。それがロードされた後にのみそのようになります。この中に必要なすべてのバイナリファイルを配置する場合、それらをストレージメディア上のファイルシステムに配置する必要はありません。このようにして、システムの実行に必要なすべてのファイルシステムが純粋にメモリ内に存在することを確認できます。
もちろん、欠点は、システムに必要なものはすべてメモリに存在する必要があるため、やりたいことを実行するのに十分ではないことに気付くかもしれないということです。また、再起動後に保持したいデータを書き込むのに苦労するでしょう。
実際、技術的に言えば、ファイルシステムは必要ありません。デフォルトの動作では、起動元のファイルシステムがあります。 (例:_/sbin/init
_はそこから起動されます)。ただし、必要に応じて、 _linux-source/init/main.c
_ のdo_basic_setup()
で何が起こるかを確認できます。そのルーチンが呼び出されるまでに、カーネルとCPU0は実際の作業の準備ができています。 initramfsの起動に必要なすべての作業を細断処理できます—これもファイルシステムです! —そしてその後は何でも、ファイルシステムなしで機能するように独自のコードに置き換えます。
次に、 カーネルスレッド を使用して、必要なプロセスを生成できます。しかし、これはすべて非常に醜いでしょう。
ファイルシステムは、ファイルを保存する場所以上のものを提供します。これは、システムの実行可能ファイル(プログラム)、ライブラリ、および構成ファイルが存在する場所です。少なくとも、Linuxカーネルは、他のプロセスが次のように開始されることを保証する責任がある「init」プロセスを検索/実行できるようにするファイルシステムを必要とします。システムに適しています。
すべてがファイルであるということは、Linux/Unixシステムがファイルの抽象化を介してデバイス、リソース、ファイルへのアクセスを提供することを意味します。つまり、(ほぼ!)すべてに対して一貫した(開く、閉じる、読み取る、書き込むなど)インターフェイスがあります。
デバイスドライバーとの混乱は、デバイスドライバーの命令のソースを、デバイスドライバーを実装する実際の実行可能マシンの命令と混同しているために発生します。指定した例では、デバイスドライバーはカーネルに直接組み込まれており、カーネルイメージがメモリにロードされると実行できます。デバイスドライバがモジュールとして構築されている場合、それらはファイルシステム内のファイルに含まれ、実行可能マシンの命令はファイルからカーネルメモリにロードされます。実行されました。デバイスドライバがロードされて実行されると、通常、それが制御するデバイスがファイルシステムを介して/ devで使用可能になります。
カーネルがinitプロセスを実行し、そのすべての子がファイルにアクセスして他のプロセスと対話したり、デバイスにアクセスしたり、仮想メモリを要求したり、乱数のソースを取得したり、相互にメッセージを送信したりする必要があります。これは、ファイルシステムアクセスを介して行われる主要部分のためのものです。ネットワークを介した送受信は、ファイルシステムへのアクセスを要求する場合の1つの例外ですが、とにかくファイルシステムに非常に迅速にアクセスする必要がある場合があります。
実際にユースケースを考えると、 OpenWrt などの小さな構成可能なディストリビューションの使用を検討する必要があります。これにより、最小限のソフトウェアセットがインストールされ、基本的にRAMから実行され、安定したストレージに何も書き込む必要がない)システムを構築できます。実行すると、不要なコンポーネントをいつでも削除できます。ただし、デバッグツールとアクティブなユーザーベースを備えたディストリビューションがもたらすヘルプを過小評価しないでください。
ファイルシステムは、オペレーティングシステムが永続的に保存されたデータを整理するための手段です。具体的には、OSがデータを効率的に保存および取得できるようにします。あなたがフラッシュドライブから起動したと言うとき、それはこのフラッシュドライブが確かにファイルシステムを持っていることを意味します。カーネルがドライバーをロードしたという事実は、それがどこかでそれを見つける方法を持っていたに違いないことを意味します。この「どこかで見つける」は、ファイルシステムによって実現されます。ただし、カーネルがモノリシックですべてがコンパイルされている場合でも、少なくともブートローダーにはカーネルを見つける方法が必要です。
理論的には、洗練されたファイルシステムがなくても、すべてを固定された場所に置き、その場所にハードコーディングするだけでそれを行うことができますが、それはどのような目的に役立ちますか?また、電子メールなどのyourデータファイルについてはまだ話していません。ファイルシステムがなければ、それらを保存する(そして後で見つける)ための適切な方法はありません。ファイルを保存したくない場合でも、OSは単なるカーネルではなく、ファイルに保存されるさまざまなサービスやユーザーランドプログラムが含まれています。
簡単に言うと、必須ファイルシステムがどこかにある必要があります。カーネルが(例のように)何も見つからない場合は(ログが示すように)パニックになります-つまり、実行を拒否します何でも。ただし、フラッシュドライブ(ファイルシステムを使用)からLinuxインストールを実行することがニーズに合っている場合は、ディスクやその他の場所にファイルシステムは必要ありません。
Linux OSを機能させたい場合は、ファイルシステムが必要です。
ただし、ファイルシステムがハードディスク(またはSSDなど)にある必要はありません。実際、Linuxがデバイス上にあるという要件すらありません。
BOOTPプロトコルを使用して、ネットワーク経由でOSをロードできます。これを有効にするには、かなりのRAMが必要です。ただし、ブートローダーはネットワークカードの標準ROMです。他のすべては経由で転送されます。ネットワークであり、RAMに作成された仮想ファイルシステムに保存されます。
ただし、専用デバイスの場合は、USBライブブートディスクと同等のフラッシュメモリをインストールし、そこからプログラムを実行することをお勧めします。あなたはすでにそのようなことをしようとしているようです。フラッシュディスクまたはROMから実行する場合、仮想ファイルシステムもRAMに作成されますが、BOOTP方式を使用する場合は、必要なRAM)が少なくて済みます。
Ubuntuとは異なり、Debianはddを使用してUSBフラッシュディスクに直接コピーできるハイブリッドブートイメージを使用します。特にUbuntuでは起動可能なUSBを作成するために特別なプログラムを使用する必要があり、そのプログラムはややバグが多い。
さまざまなツールを使用して独自のプログラムをOSイメージに追加し、ISOを読み取り/書き込みファイルシステムとしてマウントできます。 rc.localを使用してプログラムを起動できますが、起動中にrc.localが複数回実行されることに注意してください。 /etc/init.d/スクリプトを作成することもできますが、それはもっと複雑です。
要約:プログラムにはファイルシステムは必要ありませんが、OSには必要ですが、実際の/物理ディスクは必要ありません。
以前のコンピューター(および一部の最新の組み込みシステム)にはファイルシステムがありません。私のApple] [(および学校のCommodore PET)のOSはROMで、コールドブートの約2秒後にロールする準備ができていました。ロードしたいソフトウェア?ソースを手動で入力するか、LOADと入力し、Enterキーを押してから、テープマシンでPLAYと入力します。その後、ディスクドライブを入手しましたが、多くの喜びがありました。
ただし、Linuxのコアはファイルシステムが存在することを前提としており、他のほとんどすべてがその上に構築されています。真のファイルシステムなしのOSを実装したい場合は確かに可能ですが、ハードウェアとOSの両方をこの概念に基づいて構築する必要があります。
Appleの方法は、OSをメモリの最後の16kに配線することでした。プロセッサ(MC6502)は、メモリの最後の2バイトに永続的に格納されている場所にジャンプするように配線されていました。