Я задал вопрос здесь Обязательно ли иметь файловую систему
Один из комментариев:
Как система без файловой системы будет работать на Linux, даже если принтер или карта Ethernet рассматривается как файл? Какова ваша цель здесь? ... Киви 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 в системе, где будет работать управляющее приложение. Приложение просто захватывает некоторые данные и отправляет их некоторым рабам. Вопрос о сохранении данных вообще не возникает. Так что хотелось бы полностью избавиться от файловой системы. Согласно моему пониманию, файловая система необходима для хранения данных, и поскольку я не буду хранить какие-либо данные, так зачем иметь файловую систему и увеличивать использование ресурсов?
Обновить
Хотя я упоминал об этом в фоновом режиме , но, если быть точным, отправка данных будет осуществляться через USB или Ethernet, поэтому естественно иметь соответствующие драйверы.
источник
initrd
?Ответы:
Если вам нужен Linux, вам нужна файловая система.
(Я имею в виду Linux - операционную систему здесь, а не Linux - ядро ОС. Ниже приведу более узкую интерпретацию)
Ваше наблюдение о загрузке драйверов устройств при загрузке до того, как файловая система существует, - красная сельдь. Вы можете загрузить драйвер без файловой системы. Что вы не можете сделать, это
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)/*
Нужно больше, чем один исполняемый файл, например, оболочка или текстовый редактор? Им нужна файловая система для жизни.
Нужно ядро для обеспечения контроля доступа? Большая часть этого выполняется с помощью битов прав доступа , списков ACL и меток SELinux в файле или каталоге.
Я мог бы придумать больше примеров, но это подойдет.
Можно загрузить все ресурсы, необходимые вашей системе, из постоянного хранилища в ОЗУ, поэтому после загрузки система вообще не использует постоянное хранилище. Живые дистрибутивы Linux делают это. Встраиваемые ОС Linux также обычно при загрузке создают всю свою файловую систему в ОЗУ, поэтому после загрузки они больше не продолжают ссылаться на постоянное хранилище, такое как устройство флэш-памяти .
Если вы создаете узкопрофильную одноцелевую встроенную систему для одной задачи, вам, вероятно, не нужен Linux-the-OS. Вам может понадобиться только меньшая, менее функциональная встроенная ОС , или вы сможете писать прямо на металл .
В некоторых других ответах здесь говорится о том, чтобы довести Linux до такой степени, что вам остается только Linux-ядро, либо в паре с одним исполняемым файлом - вашей программой, работающей под ядром, либо запущенной как монолитная программа с Ваш код статически включен в него. В любом случае, вы можете полностью избавиться от необходимости в файловой системе, но в итоге вы больше не Linux-the-OS.
источник
init
. Ох, а куда быinit
загрузить? Бинго!init
и модификацией ядра, чтобы сделать что-то еще, кроме загрузкиinit
.Я написал ответ на связанный вопрос, в котором подробно рассказывается о том, как концепция файла является основой для работы Unix, и поскольку у вас не может быть файла без какой-либо файловой системы, это означает, что он вам определенно нужен.
Однако возможно выжить без файловой системы, которая существует на любом постоянном носителе. Ваш
initramfs
образ может быть скомпилирован в само ядро (или иначе помещен куда-нибудь, где загрузчик может получить к нему доступ). Технически образ, который записывается на носитель, является архивом, а не файловой системой; он становится таким только после загрузки. Если вы поместите все необходимые вам двоичные файлы внутрь, вам не нужно помещать их в файловую систему на носителе. Таким образом, вы можете гарантировать, что все необходимые файловые системы, необходимые для работы системы, существуют исключительно в памяти.Конечно, минусы в том, что, поскольку все, что нужно системе, должно существовать в памяти, вы можете обнаружить, что вам просто не хватает того, что вы хотите сделать. Также вам будет сложно записать любые данные, которые вы хотите сохранить после перезагрузки.
источник
initramfs
изображений - это то, что вы не ограничены только 1. Простоcpio
другое изображение поверх первого, и вы готовы к работе. ИЛИ скомпилируйте сначала и добавьте остальные после загрузки. Возможности бесконечны. Также обратите внимание, что, посколькуcpio
инструменты включены в ядро, сохранение изменений таким способом не исключено, хотя вы были бы ограничены записью сохраненногоcpio
образа на необработанное устройство, если у вас не было другой файловой системы.cpio
образ не становится файловой системой, а распаковывается в файловую систему -initramfs
или,rootfs
как вы предпочитаете.На самом деле, технически говоря, вам не нужна файловая система. Поведение по умолчанию - наличие файловой системы для загрузки. (например
/sbin/init
, запускается оттуда). Однако, если вам нравится, вы можете посмотреть, что происходитdo_basic_setup()
вlinux-source/init/main.c
. К тому времени, когда вызывается подпрограмма, ядро и CPU0 готовы к реальной работе. Вы можете уничтожить всю работу, необходимую для загрузки initramfs - тоже файловой системы! - и что-нибудь потом и замените его собственным кодом для работы без файловых систем.Затем вы можете использовать потоки ядра для порождения любых процессов, которые вы хотите. Однако все это было бы супер уродливо.
источник
initramfs
- они используютinitrd
.Файловая система предоставляет больше, чем просто место для хранения файлов. Здесь находятся исполняемые файлы (программы), библиотеки и файлы конфигурации для вашей системы. Как минимум ядру linux требуется файловая система, позволяющая ему находить / выполнять процесс « init », отвечающий за запуск других процессов в соответствии с вашей системой.
Относительно всего файла есть фраза, означающая, что системы Linux / Unix предоставляют доступ к устройствам, ресурсам, файлам через файловую абстракцию. Это означает, что существует согласованный (открытый, закрытый, читаемый, пишущий, ...) интерфейс для (почти!) Всего.
Ваша путаница с драйверами устройств возникает из-за того, что вы путаете источник инструкций драйвера устройства с фактическими исполняемыми машинными инструкциями, которые реализуют драйвер устройства. В приведенном вами примере драйверы устройств встроены непосредственно в ядро и могут работать после загрузки образа ядра в память. Если драйверы устройств построены как модули, они содержатся в файлах в файловой системе, и исполняемые машинные инструкции загружаются из файла в память ядра, где они выполняются. После того, как драйвер устройства загружен и запущен, он обычно делает доступные ему устройства доступными в / dev через файловую систему.
Как только ядро запустит процесс init и все его дочерние элементы должны получить доступ к файлу для взаимодействия с другими процессами, доступа к устройствам, запроса виртуальной памяти, получения источников случайных чисел, отправки сообщений друг другу. Это в основном для доступа к файловой системе. Отправка / получение по сети - это одно из исключений, требующих доступа к файловой системе, но в любом случае вы, скорее всего, обнаружите необходимость быстрого доступа к файловой системе.
На самом деле, учитывая ваш сценарий использования, вы должны использовать небольшой настраиваемый дистрибутив, такой как OpenWrt . При этом вы можете создать систему с минимальным набором установленного программного обеспечения, которая в основном работает из ОЗУ без необходимости что-либо записывать в стабильное хранилище. После запуска вы всегда можете удалить ненужные компоненты, но не стоит недооценивать помощь, которую приносит дистрибутив с инструментами отладки и активной базой пользователей.
источник
Файловые системы - это средство для операционных систем организовывать постоянно хранимые данные. В частности, они позволяют ОС эффективно хранить и извлекать данные. Когда вы говорите, что загрузились с флешки, это означает, что эта флешка, безусловно, имеет файловую систему. Тот факт, что ядро загрузило драйвер, означает, что он должен был где-то найти его. Это «где-то найти» достигается файловой системой. Но даже если ядро монолитное и все скомпилировано, то, по крайней мере, загрузчик должен был найти ядро.
Теоретически, вы могли бы сделать это без сложной файловой системы, просто поместив все в какое-то фиксированное место и жесткий код в этом месте, но какой цели это будет служить? И мы пока не говорим о ваших файлах данных, таких как электронная почта и все остальное. Без файловой системы нет надежного способа сохранить (а потом найти). Даже если вы не хотите хранить какой-либо файл, ОС - это больше, чем просто ядро, оно включает в себя различные сервисы и пользовательские программы, которые хранятся в файлах.
Короче говоря, у вас должна быть где-то файловая система, потому что если ядро не находит ни одной (как в вашем примере), оно паникует (как показывает ваш журнал) - что означает, что оно отказывается что-либо делать. Но если запуск установки Linux с флешки (с файловой системой) соответствует вашим потребностям, то вам не нужна файловая система на диске или где-либо еще.
источник
/proc
,/sys
...), она является основой большинства контроля доступа и т.д.Если вы хотите, чтобы ОС Linux функционировала, то она должна иметь файловую систему.
Но не требуется, чтобы файловая система была на жестком диске (или SSD и т. Д.). На самом деле нет даже требования, чтобы Linux был на устройстве вообще.
Вы можете использовать протокол BOOTP для загрузки ОС по сети. Вам нужно совсем немного оперативной памяти, хотя для того, чтобы это было эффективно. Загрузчик - это стандартное ПЗУ на сетевой карте. Все остальное передается по сети и сохраняется в виртуальной файловой системе, созданной в ОЗУ.
Однако для выделенного устройства было бы лучше установить флэш-память с эквивалентом диска USB Live Boot и запустить программу оттуда. Похоже, вы уже пытаетесь сделать что-то подобное. При работе с флэш-диска или ПЗУ в ОЗУ также создается виртуальная файловая система, но вам требуется меньше ОЗУ, чем при использовании метода BOOTP.
В отличие от Ubuntu, Debian использует образ гибридной загрузки, который можно напрямую скопировать на флэш-диск USB с помощью dd, вам может оказаться, что с этим проще работать, тем более что Ubuntu требует использования специальной программы для создания загрузочного USB, и эта программа несколько глючит.
Вы можете добавлять свои собственные программы в образ ОС, используя различные инструменты для монтирования ISO в качестве файловой системы для чтения / записи. Вы можете использовать rc.local для запуска программы, но имейте в виду, что rc.local запускается несколько раз во время запуска. Вы также можете создать скрипт /etc/init.d/, но это сложнее.
Вкратце: вашей программе не нужна файловая система, но ОС требует, но фактический / физический диск не требуется.
источник
Более ранние компьютеры (и некоторые современные встроенные системы) не имеют файловой системы. У моего Apple] [(и школьного Commodore PET) была ОС в ПЗУ, и он был готов к работе через 2 секунды после холодной загрузки. Хотите загрузить программное обеспечение? Либо введите источник вручную, либо введите LOAD, нажмите enter, а затем PLAY на магнитофоне. Потом мы получили диск - и было много радости.
Однако само ядро linux предполагает наличие файловой системы, и почти все остальное строится на этом. Если вы хотите реализовать настоящую ОС без файловой системы, это, безусловно, возможно, но ваше оборудование и ОС должны быть построены вокруг этой концепции.
Метод Apple состоял в том, чтобы подключить операционную систему к последним 16 КБ памяти, процессор (MC6502) был запрограммирован для перехода к месту, постоянно хранящемуся в последних 2 байтах памяти.
источник
Нет, linux не нуждается в файловой системе в очень строгом смысле. В вашем случае у вас другая проблема.
"Ни одна файловая система не смогла смонтировать root, попытался: jffs2" "MTD: устройство MTD с именем" jffs2 "не найдено."
Я предполагаю, что какая-то часть процесса загрузки либо не находит место для монтирования, либо не имеет возможности монтировать эту файловую систему.
источник