我不想存储任何数据时是否需要文件系统


8

我在这里问了一个问题是否必须要有文件系统

评论之一是:

没有文件系统的系统如何在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放入flash)。

现在参考上面的注释,如果所有内容都在linux中,那么如何成功加载驱动程序?您可以看到USB,GPIO,SD在请求文件系统之前一切都已经来了(失败了)。

所以说技术上正确吗

linux必须有一个文件系统

我想要达到的一些背景是让Linux在将运行控制应用程序的系统上运行。该应用程序仅捕获一些数据并将其发送给一些从属设备。完全没有存储数据的问题。所以想彻底摆脱文件系统。根据我的理解,存储数据需要文件系统,并且由于我不会存储任何数据,所以为什么要使用文件系统并增加资源使用率?

更新资料

尽管我在后台提到了这一点,但是具体来说,数据的发送将使用USB或以太网进行,因此具有相应的驱动程序是很自然的。


1
很高兴被引用为B
Kiwy 2014年

您想将控制应用程序存储在哪里?
el.pescado 2014年

@ el.pescado在我将保留操作系统的位置,基本上是闪存。
user2799508 2014年

@ user2799508中initrd
el.pescado 2014年

Answers:


15

如果需要Linux,则需要文件系统。

(我的意思是Linux是操作系统,而不是Linux OS内核。我将在下面进行更狭义的解释。)

关于文件系统存在之前在引导时加载设备驱动程序的观察是一个红色鲱鱼。您可以在没有文件系统的情况下加载驱动程序。什么,你不能做的是fd = open("/dev/foo", O_RDONLY)没有一个文件系统。

这并不意味着您需要像传统JFFS2示例那样用传统文件系统格式化的持久可重写存储介质。支持传统/dev树所需要的只是一个数据结构其行为类似于磁盘文件系统。例如,现代Linux 在内存文件系统上使用udev允许访问/dev节点而无需为节点持久存储/dev

您还需要一个文件系统来利用Linux-the-OS的其他一些功能:

  • 需要共享库或脚本语言模块吗?你需要一个文件系统来存储/lib/libfoo.*/usr/lib/perl5/*/lib/ld.so/etc/ld.so.cache,等。

  • 需要可加载的内核模块吗?您需要一个文件系统/lib/modules/$(uname -r)/*

  • 需要多个可执行文件,例如外壳程序或文本编辑器?他们需要一个文件系统才能居住。

  • 需要内核来执行访问控制吗?大多数操作是通过某个位置的文件或目录上的权限位ACLSELinux标签完成的。

我可能会想出更多的例子,但是那样做。

可以将系统所需的所有资源从持久性存储加载到RAM中,这样,一旦启动,系统根本就不会使用持久性存储。Live Linux发行版可以做到这一点。嵌入式Linux操作系统在引导时通常会在RAM中构建其整个文件系统,因此一旦引导,它们将不再继续引用永久性存储(例如闪存设备)

如果要构建范围狭窄的单用途单任务嵌入式系统,则可能不需要Linux-the-OS。你可能只需要一个更小,更多特征的嵌入式操作系统,或者你也许可以写直奔金属

这里的其他一些答案是关于将Linux剥离到剩下的全部内容,即Linux内核,或者与单个可执行文件(您的程序,在内核下运行)配对,或者与您的代码静态合并到其中。无论哪种方式,您都可以完全摆脱对文件系统的需求,但最终得到的不再是Linux-the-OS。


4
需要共享库吗?不,您可以使用静态二进制文件。需要可加载的模块吗?不,您可以编译一个单片内核。需要多个可执行文件吗?不,把所有东西都放进去了init。哦,但是哪里init可以装载?答对了!
吉尔斯(Gilles)“所以

1
@吉尔斯:沿着那条路走得足够远,您最终会得到艾奇迈德的答案及其随之而来的问题。
沃伦·杨

1
不,拥有init和修改内核以执行除load之外的其他工作之间存在巨大差异init
吉尔斯(Gilles)'所以

我知道。您正在描述迈向Achmed答案的最后一步。我只是警告说过分考虑可能带来的后果。
沃伦·杨

我不同意可能有太多的想法。开源内核的全部要点是其源代码可以更改。将开源软件定制为替代目的是开源软件的目的。如果您做得不好,或者您的目的过于单一,那么您的变更就会与您一同消亡,但是如果您的变更值得,那么其他人将从您的努力中受益,而当他们做出自己的贡献时,您可能会从中受益。
mikeserv 2014年

7

我写了一个相关问题答案,其中详细说明了文件的概念是Unix工作方式的核心,并且由于没有某种文件系统就无法拥有文件,这意味着您肯定需要一个文件系统。

但是,如果任何持久性存储介质上都没有文件系统,则可以生存。您的initramfs映像可以编译到内核本身中(或以其他方式放在引导加载程序可以访问它的位置)。从技术上讲,写入存储介质的映像是归档文件,而不是文件系统。它只有在加载后才变成这样。如果将所需的所有二进制文件放入其中,则无需将它们放入存储介质上的文件系统中。这样,您可以确保系统需要运行的所有必要文件系统都完全存在于内存中。

当然,缺点是,由于系统所需的一切都必须存在于内存中,因此您可能会发现自己没有足够的能力来完成自己想做的事情。另外,重新启动后,您将很难写入要保留的任何数据。


关于initramfs图像的一个非常重要的观点是,您不仅限于1 cpio张图像。只需在第一张图像之上放置另一张图像,就可以了。在第一个中编译,然后在启动后添加其余的。可能性是无限的,还请注意,由于这些cpio工具都包含在内核中,因此以这种方式保存更改并不是不可想象的,尽管cpio如果没有其他文件系统,则只能将保存的图像写入原始设备。
mikeserv

同样,从技术上讲,cpio映像不会成为文件系统,而是解压缩文件系统中- initramfsrootfs根据您的喜好。
mikeserv

5

实际上,从技术上来讲,您不需要文件系统。默认行为是具有要从中引导的文件系统。(例如/sbin/init从那里启动)。但是,如果你喜欢,你可以看看会发生什么do_basic_setup()linux-source/init/main.c。等到例程被调用时,内核和CPU0就可以进行实际工作了。您可以分解启动initramfs所需的所有工作-这也是一个文件系统!-之后的所有内容,并用您自己的代码替换它以在没有文件系统的情况下工作。

然后,您可以使用内核线程生成所需的任何进程。但是,所有这些都是非常丑陋的。


1
尽管这都是事实,但不是很需要您使用GPL系统吗?您不能使用内核模块许可漏洞,因为没有文件系统意味着没有动态可加载的内核模块。
沃伦·杨

+1是简洁明了,技术上正确无误,也是迄今为止正确回答问题的唯一答案。Linux只是一个代码库,您可以随意使用它,包括消除对许多基本组件的需要。

@Ahmed Masud您是说我仍然需要一个文件系统initramfs吗?(尽管我将在我的应用程序中需要以太网和USB)
user2799508 2014年

@mikeserv,不需要2.6版之前的内核initramfs-他们使用initrd
Graeme 2014年

@Graeme这也是事实,据我所知,甚至在本网站的其他地方也提到过我自己。我倾向于认为目前比这更谬论,即使这样做是谬论。但是,为了我的辩护-我并不孤单。尽管最初的Broadcom驱动程序最初赋予了它目的,而且它的名字从未见过与2.6兼容的正式更新,但即使是OpenWRT也已经使用2.6+多年。
mikeserv

1

文件系统提供的不仅仅是存储文件的地方。这是系统的可执行文件(程序),库和配置文件所在的位置。至少Linux内核需要一个文件系统来允许它查找/执行“ init ”进程,该进程负责确保启动其他适合您系统的进程。

关于一切都是文件,短语表示Linux / Unix系统通过文件抽象提供对设备,资源和文件的访问。这意味着对所有内容都有一个一致的(打开,关闭,读取,写入等)接口。

之所以会与设备驱动程序混淆,是因为您将设备驱动程序指令的来源与实现设备驱动程序的实际可执行机器指令相混淆。在示例中,您提供了设备驱动程序直接内置在内核中,并且一旦内核映像加载到内存中就能够运行。如果将设备驱动程序构建为模块,则它们将包含在文件系统中的文件中,并且可执行的机器指令将从文件加载到执行它们的内核内存中。加载并运行设备驱动程序后,通常会通过文件系统在/ dev中提供其控制的设备。

内核运行初始化进程后,其所有子进程都需要访问文件以与其他进程进行交互,从而访问设备,请求虚拟内存,获取随机数源,以及向彼此发送消息。这是通过文件系统访问完成的主要部分。通过网络发送/接收是要求文件系统访问的一个例外,但是您可能仍会发现需要非常快速地访问文件系统。

确实根据您的用例,您应该考虑使用小型可配置发行版,例如OpenWrt。这样一来,您可以构建一个系统,该系统安装了最少的软件,并且基本上从RAM运行,而无需将任何内容写入稳定的存储。一旦运行了该命令,您就可以随时剥离不需要的组件,但是不要低估拥有调试工具和活跃用户群的发行版所带来的帮助。


0

文件系统是操作系统组织持久存储的数据的一种方式。具体来说,它们使操作系统能够有效地存储和检索数据。当您说您从闪存驱动器启动时,这意味着该闪存驱动器肯定具有文件系统。内核已加载驱动程序这一事实意味着,它必须已经可以在某个地方找到它。这种“在某处找到它”是通过文件系统实现的。但是,即使内核是单片的并且已经编译了所有内容,至少引导加载程序也必须有找到内核的方法。

从理论上讲,您可以在没有复杂的文件系统的情况下做到这一点,只需将所有内容放置在某个固定位置并对该位置进行硬编码,但是这将达到什么目的?而且,我们还没有在谈论您的数据文件,例如电子邮件和其他所有内容。没有文件系统,就没有声音的方式来存储(以后找到)它们。即使您不想存储任何文件,OS也不只是内核,它还包含各种服务和存储在文件中的用户登陆程序。

长话短说,您必须在某个地方有一个文件系统,因为如果内核没有找到文件系统(如您的示例所示),则它会发生恐慌(如您的日志所示),这意味着它拒绝执行任何操作。但是,如果通过闪存驱动器(带有文件系统)运行Linux安装符合您的需求,那么您就不需要磁盘上或其他任何地方的文件系统。


1
Unixy操作系统不仅仅将文件系统用于持久性数据。有impersistent树(devfs的,/proc/sys...),这是大多数访问控制等骨干
沃伦·扬

/ proc和/ sys只是助手,如果没有它们,系统原则上可以正常工作。/ sys是特定于Linux的,/ proc可以像FreeBSD一样由sysctl代替。
countermode

0

如果要Linux OS运行,则必须具有文件系统。

但是并不需要文件系统位于硬盘(或SSD等)上。实际上,甚至根本不需要在设备上安装Linux。

您可以使用BOOTP协议通过网络加载OS。为了使此方法有效,您确实需要大量的RAM。引导加载程序是网卡上的标准ROM。其他所有内容都通过网络传输,并存储在RAM中创建的虚拟文件系统中。

但是,对于专用设备,最好安装与USB Live Boot磁盘等效的闪存,然后从那里运行程序。听起来您已经在尝试做类似的事情。从闪存盘或ROM运行时,还会在RAM中创建虚拟文件系统,但是与使用BOOTP方法相比,您需要的RAM更少。

与Ubuntu不同,Debian使用可通过dd直接复制到USB闪存盘的Hybrid Boot映像,您可能会发现它更易于使用,特别是因为Ubuntu需要使用特殊程序来创建可启动USB,并且该程序是有点越野车。

您可以使用各种工具将自己的程序添加到OS映像中,以将ISO挂载为读/写文件系统。您可以使用rc.local来启动程序,但是要注意rc.local在启动期间会多次运行。您也可以创建一个/etc/init.d/脚本,但这更加复杂。

简介:您的程序不需要文件系统,但是操作系统需要文件系统,但是不需要实际/物理磁盘。


0

较早的计算机(和某些现代嵌入式系统)没有文件系统。我的Apple [](和学校的Commodore PET)具有ROM中的操作系统,可以在冷启动后约2秒钟滚动。要加载软件吗?手动输入源,或键入LOAD,按Enter,然后在磁带机上播放。然后我们有了一个磁盘驱动器-充满了欢乐。

但是,Linux的核心假设存在文件系统,并且几乎所有其他内容都基于该文件系统构建。如果您想实现一个真正的无文件系统操作系统,那当然是可能的,但是您的硬件和操作系统都必须围绕该概念构建。

苹果公司的方法是将操作系统连接到内存的最后16k中,将处理器(MC6502)硬接线到永久存储在内存的最后2个字节中的位置。


-3

不,Linux不需要严格意义上的文件系统。您的情况不同。

“没有文件系统可以挂载根,已尝试:jffs2”“ MTD:找不到名称为“ jffs2”的MTD设备。”

我的猜测是加载过程中的某个部分或者找不到安装位置或没有能力安装该文件系统。


2
您的回答是“您不需要文件系统,但是您的问题是您确实需要文件系统”。这没有任何意义,而且内部也不是一致的。
casey 2014年

我不明白这一点……该错误是因为没有文件系统要挂载,因为他没有文件系统。挂载程序工作正常,他的闪存盘上没有有效的fs。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.