Вопрос или проблема
На мой взгляд, да, это так, потому что вся полезная связь с внешним миром (непривилегированный процессорный режим) сначала потребует процесса, работающего в внешнем мире. Это потребует файловой системы, даже временной, в ОЗУ.
Другой инженер не согласен со мной, но я не могу доказать это в некоторых (неизвестных мне) случаях.
Зависит ли ответ на этот вопрос от определения “работающий”?
Это довольно странный вопрос, потому что ядро не запускается так, как запускается программа. Ядро — это платформа для запуска программ. Конечно, есть код настройки и завершения, но нельзя запустить ядро самостоятельно. Всегда должен быть главный процесс “init”. И ядро будет паниковать, если его не будет. Если init попытается завершиться, ядро также паникнет.
В наши дни процесс init — это что-то вроде systemd. Если не указано иное, ядро попытается запустить программу из списка расположений, начиная с /sbin/init
. Смотрите параметры init здесь http://man7.org/linux/man-pages/man7/bootparam.7.html. В экстренной ситуации вы можете загрузить Linux с init=/bin/bash
. Но обратите внимание, как вы всегда указываете файл в файловой системе для запуска.
Таким образом, ядро будет паниковать, если оно запустится и не будет файловой системы, потому что без нее нет способа загрузить init.
Некоторая путаница может возникнуть из-за фазы инициализации ядра. Начальный ramdisk загружается из образа на диске, содержащего жизненно важные драйверы и скрипты настройки. Они выполняются до загрузки файловой системы. Но не заблуждайтесь, начальный ramdisk сам по себе является файловой системой. С начальным ramdisk вызывается /init
(который хранится на начальном ramdisk). В многих дистрибутивах в конечном итоге именно это вызывает /sbin/init
. Снова, без файловой системы это невозможно.
Ответ будет зависеть от того, имеете ли вы в виду буквально отсутствие файловой системы или если вопрос предполагает немного иное толкование, чем оно фактически сформулировано. Ответы на небольшие вариации в том, как вопрос интерпретируется, следующие:
- Запуск Linux без каких-либо блочных устройств вполне осуществим и полезен для некоторых специализированных случаев использования.
- Запуск Linux без какой-либо файловой системы потребует переписывания некоторых частей кода ядра, и маловероятно, что это будет полезное усилие.
- Запуск Linux без использования каких-либо дескрипторов файлов потребует много труда. Я почти уверен, что это не будет стоить затраченных усилий.
Причины, по которым вам нужно будет переписать части кода ядра, чтобы создать работающую систему без файловой системы, следующие:
- Каждый поток имеет корневой каталог и текущий рабочий каталог, которые должны указывать на какую-то файловую систему.
- Программы запускаются с помощью системного вызова
execve
, который требует исполняемого файла из файловой системы. - Ядро создает файловую систему на основе памяти во время процесса загрузки.
После запуска программы с помощью execve
возможно удалить отображение исполняемого файла, из которого она была запущена. Однако для этого, чтобы избежать немедленного краха, сначала нужно создать исполняемое отображение памяти, которое не поддерживается файлом, и инициализировать его полезным кодом перед переходом к нему и отключением исполняемого файла.
Таким образом, работающая программа в пользовательском режиме может существовать в состоянии, когда у нее нет отображений памяти, поддерживаемых файлами, и она может закрыть все дескрипторы файлов, поддерживаемые файлами. Она не может прекратить наличие корневого каталога и текущего рабочего каталога, но может отрезать от них.
Таким образом, хотя в этом состоянии вы могли бы реализовать код ядра, чтобы удалить файловую систему из-под программы и заставить ее продолжать работать, это не звучит полезно. И переход в это конечное состояние без прохождения через промежуточное состояние, использующее файловую систему, потребует еще больше работы без полезной выгоды.
Полезная настройка для некоторых специализированных случаев использования
Избежание использования блочных устройств может быть полезным. Во время загрузки ядро создает файловую систему на основе памяти, и оно также может заполнить эту файловую систему содержимым из архива cpio
перед выполнением init
. Таким образом, вы можете запустить систему полностью из файловой системы на основе памяти без какого-либо блочного устройства для ее поддержки.
Это может быть полезно для систем, где вы не хотите сохранять никакое состояние и хотите, чтобы система начиналась с чистого листа при перезагрузке.
Конечно, ядро и архив cpio должны каким-то образом существовать в памяти, прежде чем ядру будет передан контроль. Как они туда попали, — это работа загрузчика. Загрузчик мог загрузить их с блочного устройства, даже если финальная работающая система не использует блочные устройства. Но также возможно, что загрузчик получит ядро и архив cpio без использования блочного устройства, например, загрузившись через сеть.
В Linux почти каждое устройство является файлом, так что вам нужна файловая система для его запуска.
Ядро — это программа, как любая другая. По умолчанию ядро Linux пытается получить доступ к файловой системе, однако это поведение можно тривиально устранить с помощью модификации ядра (на самом деле, просто добавив функцию “arch_call_rest_init()”). Для выполнения “полезной работы” мы ожидаем, что разработчик может включить потоки ядра (kthreads), возможно, в пользовательский драйвер, чтобы выполнять желаемую инициализацию и рабочую нагрузку приложения. Ядро Linux уже содержит много kthreads, но в основном для выполнения работы, связанной с ядром или драйверами. API, доступные в контексте ядра, сильно отличаются от тех, которые доступны в пользовательском пространстве Linux. Большая часть функциональности системных вызовов станет бесполезной в сценарии без файловой системы.
Да, Linux ожидает доступа к файловым системам по умолчанию.
Нет, модифицированное ядро, конечно, можно заставить выполнять полезную работу без какой-либо файловой системы.
Практическое использование Linux без файловой системы, на мой взгляд, довольно ограничено, но не нулевое. Для вашей информации, в прошлом многие реального времени ядра были встроены в одно и то же пространство имен и бинарный файл, что и RT-приложения.
Хм,
Ядру необходим дамп памяти. Дамп памяти требует постоянного хранилища на файловой системе. Ядру нужна файловая система.
Ядро без файловой системы не может сделать дамп памяти и, следовательно, будет машиной с неопределенным поведением. Ядро может сделать дамп, зависнуть или завершиться/остановиться: но если ядро не может сделать дамп, вы не сможете сказать, где/как оно зависло при завершении.
И под “работающим” я думаю, что автор сообщения может подразумевать что-то стоящее, потому что это действительно компьютер с фактической работой и ответственностью.
Также.
Может ли существовать программа unix, которая не производит значения выхода?
Нет, потому что тогда это не программа UNIX; следовательно, ядро не является программой UNIX.
Ответ или решение
Линукс — одна из самых популярных операционных систем для серверов, личных компьютеров и встроенных систем. Однако вопрос о том, нуждается ли ядро Linux в файловой системе для функционирования, поднимает интересные аспекты программирования и архитектуры операционных систем.
Ядро Linux: специфика и роль
Ядро Linux, как и любое другое ядро операционной системы, выступает в роли посредника между аппаратным обеспечением и пользовательскими приложениями. Его основная задача — управлять ресурсами системы, обеспечивать выполнение процессов и взаимодействие с оборудованием. Однако в этом контексте важно осознать, что сам процесс загрузки и инициализации ядра подразумевал бы существование по крайней мере одной файловой системы для успешного запуска системы в пользовательском режиме.
Обязательная файловая система
В большинстве современных дистрибутивов Linux на этапе загрузки ядро связывается с файлом, который представляет собой программный компонент, исполняемый после запуска ядра. Этот файл, в свою очередь, загружается из файловой системы, которая должна быть доступна после инициализации ядра. К примеру, при стандартной загрузке ядро пытается найти и запустить процесс init
, который обычно располагается по пути /sbin/init
. Если файловая система недоступна, ядро не может эффективно загрузить этот основной процесс, что приведёт к панике ядра.
Кроме того, это также обуславливает необходимость наличия файловой системы для выполнения системных вызовов, таких как execve
, которые используются для запуска процессов. В этом контексте можно утверждать, что ядро Linux требует файловую систему для полноценной работы в нормальном окружении.
Исключения и специализированные случаи
Тем не менее, существует возможность запуска Linux в специализированных сценариях без традиционной файловой системы на блочных устройствах. Например, использование initrd
(инициализационный RAM диск) позволяет создавать временную файловую систему в оперативной памяти, которая может затем загружать необходимые файлы и осуществлять инициализацию системы. Хотя это и файломодная система, по своей сути, она предлагает (временно) имитировать функциональность обычного хранения данных без использования физических устройств.
Также необходимо отметить, что после загрузки ядро может работать в контексте, где программное обеспечение можно управлять без зависимостей от файловой системы. Это может потребовать модификаций ядра и исключительных условий для реализации. Однако, как правило, такие подходы имеют ограниченное практическое применение и требуют значительных усилий по разработке.
Заключение
Таким образом, утверждение о том, что ядро Linux нуждается в файловой системе для работы, имеет под собой веские основания, особенно в среде, где производится взаимодействие с аппаратным обеспечением и пользовательскими процессами. Однако также существует пространство для исследовательских и специализированных реализаций, позволяющих работать в условиях, когда традиционная файловая система отсутствует.
Это ставит перед нами важный вопрос: действительно ли целесообразно исключать файловую систему из рабочего процесса ядра Linux? История показывает, что такие подходы как правило ведут к большим затратам на разработку и ресурсы, а также имеют ограничения в реальной практической применимости. В большинстве случаев файловая система остаётся неотъемлемой частью эффективного функционирования ядра операционной системы.