Чи потрібне ядро ​​Linux для запуску файлової системи?


19

На мою думку, це так, адже все корисне потрапляння до зовнішнього світу (непривілейований режим процесора) спочатку вимагатиме процесу, що працює у зовнішньому світі. Для цього потрібна файлова система, навіть тимчасова файлова система, що є в RAM.

Інший інженер не погоджується зі мною, але я, здається, не можу це довести за всіма (невідомі мені) випадками.

Чи залежить відповідь на це питання від визначення поняття "біг"?


4
Я думаю, що запущене ядро ​​не "вимагає"useful exposure to the outside world
jsotola

19
Звертає увагу на старий зупинений Linux брандмауер (близько 2002 р.)
Джефф Шалер

1
Якщо до ядра додати новий код, ви можете зробити все, що завгодно. Якщо ви не можете, він буде ініціалізуватися штрафом до того моменту, коли він намагається запустити init(перший процес у просторі користувача), і це не вдасться.
користувач253751

1
Визначте "пробіг" ...
Thorbjørn Ravn Andersen

Відповіді:


27

Це досить дивне запитання, оскільки ви не запускаєте ядро ​​так, як запускаєте програму. Ядро - це платформа для запуску програм. Звичайно, існує код налаштування та відключення, але не можна запустити ядро ​​самостійно. Завжди повинен бути основний процес "init". І ядро ​​буде панікувати, якщо його там немає. Якщо init намагається вийти з ядра, також панікує.

Сьогодні процес init - це щось на зразок системного. Якщо інше не вказано, ядро ​​спробує запустити програму зі списку місць, починаючи з /sbin/init. Дивіться про init Param тут http://man7.org/linux/man-pages/man7/bootparam.7.html у надзвичайній ситуації, з якою ви можете завантажувати Linux init=/bin/bash. Але зауважте, як ви завжди вказуєте файл у файловій системі для запуску.

Таким чином, ядро ​​впаде в паніку, якщо воно запустить файлову систему, яка не має файлів, оскільки без неї неможливо завантажити init.

Певна плутанина може виникнути через ситуацію з куркою та яйцями, коли ядро ​​повинно завантажувати драйвери, щоб отримати доступ до файлової системи. Щоб уникнути цього, початковий ramdisk завантажується з зображення на диск, що містить життєві драйвери та сценарії настройки. Вони виконуються до завантаження файлової системи. Але не помиляйтесь, що початковий ramdisk - це сама файлова система. При початковому виклику ramdisk /init(який зберігається на початковому ramdisk). У багатьох дистрибутивах саме це викликає саме це /sbin/init. Знову ж без файлової системи це неможливо.


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

1
@PeterL. ця обмежувальна оболонка - це якась оболонка з initrd / initramfs / що б не було завантажено ядро, IIRC.
муру

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

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

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

16

Відповідь буде залежати від того, чи ви розумієте буквально без файлової системи, або якщо питання призначене для тлумачення трохи інше, ніж те, як воно фактично заявлено. Відповіді на незначні зміни в трактуванні питання:

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

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

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

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

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

Тож хоч у такому стані ви могли реалізувати код ядра, щоб вирвати файлову систему з-під програми та продовжувати працювати, це не здається корисним. І потрапляння в цей остаточний стан без проходження проміжного стану використання файлової системи буде ще більшою роботою без корисної користі.

Корисна установка для деяких випадків спеціалізованого використання

Уникнення використання блокових пристроїв може бути корисним. Під час завантаження ядро ​​створює файлову систему пам'яті, а також може заповнити цю файлову систему вмістом з cpioархіву перед виконанням init. Таким чином ви можете запустити систему повністю з файлової системи на базі пам'яті без блочного пристрою для її резервного копіювання.

Це може бути корисно для систем, де ви не хочете зберігати жоден стан і подобається, що система починає з чистого аркуша після перезавантаження.

Звичайно, ядро ​​та архів cpio повинні якось існувати в пам'яті, перш ніж ядро ​​буде надано контроль. Як вони там потрапили, є робота для завантажувача. Завантажувач міг завантажувати їх із блочного пристрою, навіть якщо в кінцевій запущеній системі не використовуються блокові пристрої. Але також можливий завантажувач завантаження архіву ядра та cpio без використання блочного пристрою, наприклад, завантаження через мережу.


1
Питання полягає в тому, якщо ядро ​​Linux у будь-якій вбудованій конфігурації (без нічого перезапису) може працювати "без будь-якої файлової системи". Тут не потрібно робити нічого корисного чи зберігати стан. З усіх відповідей я розумію, що якась файлова система надається і передбачається в самому ядрі, принаймні до завершення роботи. Навіть '/' - це файлова система. Отже, я думаю, щоб спростити відповідь, це "так".
Петро Л.

2
@PeterL. Так, якщо ви нічого не переписуєте, Linux вимагатиме файлової системи. Коли люди говорять про практичне використання для Linux без файлової системи, вони зазвичай посилаються на тих, які підтримуються блоковим пристроєм, і ви можете запустити Linux без файлової системи, підкріпленої блоковим пристроєм. У вас ще є якась файлова система.
kasperd

3

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


8
Але, звичайно, драйвери пристроїв існують всередині ядра, незалежно від того, чи вказує на них файл пристрою.
Філіп Кулінг

6
Не кожен пристрій - це файл. Мережеві інтерфейси ( eth0, і wlan0т.д.) не є, наприклад.
Руслан

1
Це поширене оману. Хоча теоретично все є файлом у UNIX та UNIX-подібних системах, це справедливо лише для вузькоспеціалізованих систем, таких як План 9 (хоча це набагато правдивіше, ніж для Windows). Для Linux досить багато речей - це не файли. Це стає все більш істинним, оскільки багато драйверів почали використовувати мережеве посилання, а не йоктли на символьних пристроях ( це файли).
ліс

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

1
Дуже приємний аргумент: або є devfs, що є файловою системою за визначенням, або немає devfs, і в цьому випадку вам потрібна файлова система для розміщення вузлів пристроїв ...
pmf

-1

Ядро - це програма, як і будь-яка інша. За замовчуванням ядро ​​Linux намагається отримати доступ до файлової системи, однак цю поведінку можна тривіально усунути модифікацією ядра (фактично лише додаванням функції "arch_call_rest_init ()"). Для того, щоб виконати "корисну роботу", тоді ми очікуємо, що розробник може включити нитки ядра (kthreads), perhapos у користувальницький драйвер, щоб виконати деяку бажану ініціалізацію та навантаження типу додатків. Ядро Linux вже містить багато kthreads, але в першу чергу для виконання допоміжних робіт до ядра або драйверів. API, доступні в контексті ядра, сильно відрізняються від доступних у користувальницькому просторі Linux. Велика частка функціональності системного виклику стане марною в сценарії без файлової системи.

Так, Linux за замовчуванням очікує доступ до файлових систем. Ні, модифіковане ядро, безумовно, може бути виконано для виконання корисної роботи без будь-якої файлової системи. Практичне використання файлової системи Linux без IMO досить обмежене, але не дорівнює нулю. FWIW, в минулому багато ядер в реальному часі були вбудовані в той самий простір імен і бінарний файл, що і додатки RT.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.