Нужно ли ядру Linux для работы файловая система?


19

Мое мнение - да, это так, потому что все полезное воздействие внешнего мира (режим непривилегированного процессора) сначала потребует процесса, выполняющегося во внешнем мире. Для этого потребуется файловая система, даже временная файловая система в оперативной памяти.

Другой инженер не согласен со мной, но я не могу доказать это за пределами всех (неизвестных мне) случаев.

Зависит ли ответ на этот вопрос от определения «бег»?


4
я думаю, что работающее ядро ​​не "требует"useful exposure to the outside world
jsotola

19
Напоминает старый остановленный брандмауэр Linux (около 2002 года)
Джефф Шаллер

1
Если вы добавите новый код в ядро, вы можете сделать что угодно. Если вы не можете, он будет инициализироваться нормально до того момента, когда он попытается запустить init(первый процесс в пространстве пользователя), и это не удастся.
user253751

1
Определите «беги» ...
Торбьерн Равн Андерсен

Ответы:


27

Это довольно странный вопрос, потому что вы не запускаете ядро, как вы запускаете программу. Ядро - это платформа для запуска программ. Конечно, есть код установки и завершения работы, но невозможно запустить ядро ​​самостоятельно. Всегда должен быть основной процесс init. И ядро ​​будет паниковать, если его там нет. Если init попытается выйти, ядро ​​также запаникует.

В эти дни процесс инициализации напоминает systemd. Если не указано иное, ядро ​​будет пытаться запустить программу из списка мест, начинающихся с /sbin/init. См. Параметр init здесь http://man7.org/linux/man-pages/man7/bootparam.7.html в чрезвычайной ситуации, с которой вы можете загрузить Linux init=/bin/bash. Но обратите внимание, как вы всегда указываете файл в файловой системе для запуска.

Таким образом, ядро ​​будет паниковать, если оно запускается и не имеет файловой системы, потому что без нее нет способа загрузить init.

Некоторая путаница может возникнуть из-за ситуации, когда ядро ​​должно загружать драйверы для доступа к своей файловой системе. Чтобы обойти это, начальный виртуальный диск загружается из образа на диске, содержащего важные драйверы и установочные сценарии. Они выполняются до загрузки файловой системы. Но не заблуждайтесь, исходный ramdisk сам по себе является файловой системой. С начальным виртуальным диском /initназывается (который хранится на начальном виртуальном диске). Во многих дистрибутивах это в конечном счете то, что вызывает /sbin/init. Опять же без файловой системы это невозможно.


Не существует ли условия, когда ядро ​​прекращает попытки инициализировать аппаратное обеспечение и загружать известную файловую систему (не initrd, передаваемый в ядро ​​через параметры init), а затем падает в очень ограниченную оболочку (без init = / bin / bash)? Кроме того, поскольку вы вызываете / bin / bash, будет ли у ядра всегда иметь эту минимальную файловую систему доступной, даже если она была построена с другими параметрами .config, которые потенциально могут устранить это?
Питер Л.

1
@PeterL. эта предельная оболочка - это какая-то оболочка из initrd / initramfs / независимо от того, с каким ядром была загружена IIRC.
Муру

3
Обратите внимание, что вы можете встроить initramfs (архив CPIO, который извлекается в файловую систему ramfs или tmpfs) в ядро. Независимо от того, считается ли это ядром "нуждающимся в файловой системе", зависит от вас, поскольку это означает, что вы можете загрузить ядро ​​и ничего, кроме ядра, и иметь функциональную (если немного ограниченную) систему. Также обратите внимание, что даже если вы исправите ядро ​​так, чтобы оно больше не требовало инициализации, оно все равно будет создавать внутренние виртуальные файловые системы, которые никогда не будут доступны.
лес

@forest Система не должна быть «ограниченной» - вы можете упаковать systemd и gnome в свой initrd (вместе с вещами, которые действительно полезны ;-)). Одно ограничение initramfs было (еще есть?) , Что он не поддерживает расширенные атрибуты - Я сделал работу вокруг него на андроид, включив ext4 изображение в INITRD архива CPIO который затем был смонтирован в качестве устройства петли из init.$DEV.rcсценария.
Дядя Билли

1
@IsmaelMiguel, нет, initramfs как таковой является архивом cpio. Squashfs - хороший выбор для встраиваемых файловых систем, и можно создать initrd (против initramfs), который его использует (термины часто используются взаимозаменяемо, но это не совсем одно и то же), но это не тот формат, который Linux распаковывает в свои initramfs. (Действительно, изображение squashfs не нужно распаковывать перед тем, как его вообще можно будет использовать; оно правильно проиндексировано).
Чарльз Даффи

16

Ответ будет зависеть от того, имеете ли вы в виду буквально без файловой системы, или вопрос предназначен для интерпретации немного отличается от того, как он на самом деле сформулирован. Ответы на небольшие различия в интерпретации вопроса:

  • Запуск Linux без каких-либо блочных устройств вполне возможен и полезен для некоторых специализированных случаев использования.
  • Запуск Linux без каких-либо файловой системы потребует переписывания некоторых частей кода ядра, и это вряд ли будет полезным усилием.
  • Запуск Linux без использования каких-либо файловых дескрипторов потребует больших усилий. Я уверен, что это не будет стоить усилий.

Причины, по которым вам придется переписывать части кода ядра, чтобы сделать работающую систему без файловой системы:

  • Каждый поток имеет корневой каталог и текущий рабочий каталог, который должен указывать на некоторую файловую систему.
  • Программы запускаются execve системным вызовом, которому нужен исполняемый файл из файловой системы.
  • Ядро создает файловую систему на основе памяти во время процесса загрузки.

После запуска программы с помощью execve она может отменить отображение исполняемого файла, из которого она была запущена, хотя для того, чтобы сделать это без немедленного сбоя, сначала необходимо создать отображение исполняемой памяти, которое не поддерживается файлом, и он должен инициализировать это с помощью некоторого полезного кода, прежде чем перейти к нему и отменить отображение исполняемого файла.

Таким образом, работающая программа пользовательского режима может существовать в состоянии, в котором у нее нет отображений памяти, поддерживаемых файлами, и она может закрыть все файловые дескрипторы, поддерживаемые файлами. Он не может перестать иметь корневой каталог и текущий рабочий каталог, но он может воздерживаться от них.

Поэтому, хотя в этом состоянии вы могли бы реализовать код ядра, чтобы вырвать файловую систему из-под программы и заставить ее продолжать работать, это не похоже на то, что это полезно. А переход в это конечное состояние без прохождения промежуточного состояния использования файловой системы будет еще большей работой без какой-либо полезной выгоды.

Полезная настройка для некоторых специализированных случаев использования

Избегание использования блочных устройств может быть полезным. Во время загрузки ядро ​​создает файловую систему памяти и может также заполнить эту файловую систему содержимым из cpioархива перед выполнением init. Таким образом, вы можете запустить систему полностью из файловой системы на основе памяти без какого-либо блочного устройства для ее поддержки.

Это может быть полезно для систем, в которых вы не хотите сохранять какое-либо состояние, и например, когда система запускается с чистого листа после перезагрузки.

Конечно, ядро ​​и архив cpio должны каким-то образом существовать в памяти, прежде чем ядру будет дан контроль. Как они туда попали - это работа для загрузчика. Загрузчик мог загрузить их с блочного устройства, даже если в окончательно работающей системе блочные устройства не используются. Но для загрузчика также возможно получить архив ядра и cpio без использования блочного устройства, например, при загрузке по сети.


1
Вопрос в том, может ли ядро ​​Linux в любой встроенной конфигурации (без переписывания чего-либо) работать без какой-либо файловой системы. Он не должен делать ничего полезного или сохранять состояние. Из всех ответов я понимаю, что какая- то файловая система предоставляется и предполагается внутри самого ядра, по крайней мере, до завершения работы. Даже '/' является файловой системой. Итак, я думаю, чтобы упростить ответ, это «да».
Питер Л.

2
@PeterL. Да, если вы ничего не переписываете, Linux потребует файловую систему. Когда люди говорят о практическом использовании Linux без файловой системы, они обычно ссылаются на те, которые поддерживаются блочным устройством, и вы можете запустить Linux без файловой системы, поддерживаемой блочным устройством. У вас все еще есть какая-то файловая система.
Касперд

3

В Linux почти каждое устройство представляет собой файл , поэтому для его запуска необходима файловая система.


8
Но, разумеется, драйверы устройств существуют внутри ядра независимо от того, указывает на них файл устройства или нет.
Филипп Коулинг

6
Не каждое устройство - это файл. Сетевые интерфейсы ( eth0и wlan0т. Д.) Не являются, например.
Руслан

1
Это распространенное заблуждение. Хотя в теории все является файлом в UNIX и UNIX-подобных системах, это полностью верно только для узкоспециализированных систем, таких как Plan 9 (хотя это гораздо более верно, чем для Windows). Для Linux довольно много не файлов. Это становится все более и более актуальным, поскольку многие драйверы начали использовать netlink, а не ioctl на символьных устройствах (которые являются файлами).
лес

@forest Plan 9 не является «узкоспециализированной» системой - она ​​должна была быть системой общего назначения, такой как Unix или Windows (почему она не смогла заменить Unix и осталась исследовательской системой, это совсем другая история). В любом случае, как и Linux, plan9 предоставляет виртуализированные интерфейсы своему оборудованию (и у него нет ioctls - я не вижу, как во всем этом используется фактор netlink против ioctls), даже если он стремится быть более последовательным (например, . сетевые интерфейсы доступны через файловую систему). С введением пространств имен Linux уже больше похож на plan9, чем на классический unix.
Дядя Билли

1
Очень хороший аргумент: либо есть devfs, который является файловой системой по определению, либо нет devfs, и в этом случае вам нужна файловая система для размещения узлов устройства ...
pmf

-1

Ядро - это программа, как и любая другая. По умолчанию ядро ​​Linux пытается получить доступ к файловой системе, однако это поведение может быть тривиально устранено путем модификации ядра (фактически просто добавлением функции «arch_call_rest_init ()»). Для того чтобы выполнить «полезную работу», мы ожидаем, что разработчик может включить потоки ядра (kthreads), которые могут быть использованы в собственном драйвере, для выполнения некоторой желаемой инициализации и рабочей нагрузки типа приложения. Ядро Linux уже содержит много kthreads, но в первую очередь для выполнения вспомогательных операций с ядром или драйверами. API, доступные в контексте ядра, сильно отличаются от тех, которые доступны в пользовательском пространстве Linux. Большая часть функциональности системных вызовов станет бесполезной в сценарии без файловой системы.

Да, Linux ожидает доступ к файловым системам по умолчанию. Нет, модифицированное ядро, безусловно, может быть сделано для выполнения полезной работы без любой файловой системы. Практическое использование Linux без файловой системы IMO довольно ограничено, но не ноль. FWIW, в прошлом многие ядра реального времени были встроены в то же пространство имен и двоичные файлы, что и приложения RT.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.