Что точно делает init?

mount -v включает тип файловой системы в его большее количество подробного списка выводов.

Из Соляриса 10 систем здесь:

/dev/dsk/c1t0d0s0 on / type ufs read/write/setuid/devices/intr/largefiles/logging/xattr/onerror=panic/dev=700040 on Tue May  1 11:33:55 2012
/devices on /devices type devfs read/write/setuid/devices/dev=4380000 on Tue May  1 11:33:43 2012
ctfs on /system/contract type ctfs read/write/setuid/devices/dev=43c0001 on Tue May  1 11:33:43 2012
proc on /proc type proc read/write/setuid/devices/dev=4400000 on Tue May  1 11:33:43 2012
mnttab on /etc/mnttab type mntfs read/write/setuid/devices/dev=4440001 on Tue May  1 11:33:43 2012
swap on /etc/svc/volatile type tmpfs read/write/setuid/devices/xattr/dev=4480001 on Tue May  1 11:33:43 2012
/dev/dsk/c1t0d0p0:boot on /boot type pcfs read/write/setuid/devices/nohidden/nofoldcase/dev=723050 on Tue May  1 11:33:54 2012
43
22.11.2018, 00:06
4 ответа

Система 5 init сообщит вам только небольшая часть истории.

В мире Linux существует своего рода близорукость. Люди думают, что они используют вещь под названием «System 5 init », и это одновременно и традиционный, и лучший способ начать. На самом деле это не так.

Во-первых, традиция на самом деле не такая, как говорят такие люди. System 5 init и System 5 rc относятся к AT&T UNIX System 5, которая была почти так же далека от первого UNIX, как мы сейчас (скажем) после первой версии Linux-Mandrake .

1-е издание UNIX имеет только init . У него не было RC . Ассемблер 1-го издания init (, код которого был восстановлен и предоставлен Warren Toomey et al.) непосредственно порождал и повторно порождал 12 getty процессов, монтировал 3 аппаратные файловые системы из встроенной таблицы и напрямую запускал программу из домашнего каталога пользователя с именем mel . Таблица getty также была непосредственно в образе программы.

Прошло еще одно десятилетие после UNIX System 5, когда появилась так называемая «традиционная» система инициализации Linux. В 1992 году Микель ван Смуренбург (переписал) написал Linux init + rc и связанные с ними инструменты, которые теперь называют «System 5 init ", хотя на самом деле это не программное обеспечение из UNIX System 5 (и не только init ).

Система 5 init / rc - не лучшее место для начала, и даже если добавить информацию о systemd, это не покрывает половину того, что нужно знать . Только за последние два десятилетия было проделано много работы в области проектирования системы инициализации (для Linux и BSD). Обсуждались, принимались, проектировались, внедрялись и применялись всевозможные инженерные решения. Коммерческие Unices тоже немало сделали.

Существующие системы для изучения и изучения

Вот неполный список некоторых из основных систем инициализации , кроме этих двух, и один или два из их (нескольких) основных моментов:

  • Finit Йоахима Нильссона пошли по пути использования более удобочитаемого файла конфигурации.
  • Minit Феликса фон Лейтнера пошел для системы конфигурации файловой системы как базы данных, небольшого объема памяти и зависимостей запуска / остановки среди вещей, которые запускает init .
  • runit Геррита Пейпа пошли на то, что я ранее описал как , подход с использованием четырех сценариев оболочки .
  • InitNG нацелен на наличие зависимостей, именованных целей, нескольких файлов конфигурации и более гибкого синтаксиса конфигурации с полной загрузкой дополнительных настроек для дочерних процессов.
  • выскочка пошла на полную переработку, моделируя систему не как сервисы и взаимозависимости вообще, а как инициируемые ими события и задания.
  • Дизайн nosh включает перенос всего управления службами (включая даже порождение getty и сбор зомби) в отдельный диспетчер служб, а только ] обработка специфичных для операционной системы "API" устройств / символических ссылок / каталогов и системных событий.
  • sinit - очень простой init. Он выполняет /bin/rc.init , задача которого - запускать программы, монтировать файловую систему и т. Д. Для этого вы можете использовать что-то вроде minirc .

Более того, около 10 лет назад среди пользователей daemontools и других было обсуждение использования svscan в качестве процесса №1, что привело к таким проектам, как svscan Пола Джарка в качестве исследования процесса 1 , идеи Геррита Пейпа и svscan как процесс 1 Лорана Берко.

Это подводит нас к тому, что делают программы №1.

Что делают программы процесса №1

Представления о том, какой процесс №1 «предполагается» делать, по своей природе субъективны. Значимым объективным критерием проектирования является то, что процесс №1 как минимум должен делать . Ядро предъявляет к нему несколько требований. И всегда есть какие-то специфические для операционной системы вещи разного рода, которые она должна делать. Когда дело доходит до того, что процесс №1 выполнял традиционно ,тогда мы еще не достигли этого минимума и никогда не были на самом деле.

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

Люди скажут вам, что fork () создание вещей и выполнение роли родительского элемента для осиротевших процессов является основной функцией процесса №1. Как ни странно, это неправда. Работа с потерянными процессами (с недавними ядрами Linux, как объяснено на https://unix.stackexchange.com/a/177361/5132 ) является частью системы, которую можно в значительной степени исключить из процесса №1. в другие процессы, такие как выделенный диспетчер служб . Все это менеджеры служб, которые выполняются вместе с процессом №1:

Точно так же, как объяснено на https://superuser.com/a/888936/38062 , вся идея / dev / initctl не должна быть где-нибудь возле процесса №1. По иронии судьбы, именно высокоцентрализованная система systemd демонстрирует, что ее можно исключить из процесса №1.

И наоборот, обязательными вещами для init , которые люди обычно забывают в своих нестандартных проектах, являются такие вещи, как обработка SIGINT , SIGPWR , SIGWINCH и т.д., отправленные ядром и выполняющие различные запросы на изменение состояния системы, отправленные из программ, которые «знают», что определенные сигналы для процесса №1 означают определенные вещи. (Например: как объяснено на https://unix.stackexchange.com/a/196471/5132 , инструменты BSD «знают», что SIGUSR1 имеет особое значение.)

Существуют также однократные задачи инициализации и завершения, от которых невозможно избавиться или которые будут сильно страдать от невыполнения, такие как монтирование "API" файловых систем или очистка кеша файловой системы.

Основы работы с файловыми системами «API» мало отличаются от работы init в 1-й редакции UNIX: у одного есть список информации, встроенной в программу, а у другого просто mount ( ) - все записи в списке. Вы найдете этот механизм в самых разных системах, от BSD (sic!) init , через системный менеджер nosh до systemd.

«настроить систему на простую оболочку»

Как вы заметили, init = / bin / sh не монтирует файловые системы «API», аварийно завершает работу без очистка кеша при вводе exit ( https: //unix.stackexchange.com / a / 195978/5132 ), и, как правило, предоставляет (суперпользователю) возможность вручную выполнять действия, которые делают систему минимально пригодной для использования.

Чтобы увидеть, что на самом деле нет другого выбора, кроме как делать в программах процесса №1, и, таким образом, направить вас на хороший курс для достижения заявленной цели дизайна, лучше всего посмотреть на совпадения в работе runit Геррита Папе , Minit Феликса фон Лейтнера и программу system-manager из пакета nosh. Первые две демонстрируют две попытки быть минималистичными, но все же справляются с вещами, которых невозможно избежать.

Последний вариант полезен, как я полагаю, для его обширного ручного ввода в программу system-manager , в которой подробно описано, какие именно файловые системы «API» смонтированы, какие задачи инициализации выполняются и какие сигналы используются. обработано; в системе, в которой по замыслу системный менеджер просто порождает три другие вещи (диспетчер служб, сопутствующий регистратор и программу для запуска изменений состояния) и выполняет только неизбежное в процессе №1.

53
27.01.2020, 19:34

Абсолютный минимум, голый минимум, который INIT должен сделать, это запускать хотя бы одну другую программу и не выходить. Если init выходит из аварии системы. Я полагаю, что даже запуск одной другой программы не является строго необходимой, но если вы этого не сделаете, это будет нести ответственность за то, что ожидается, что система будет делать, или она не будет очень полезна.

2
27.01.2020, 19:34

Система V init на Debian (существуют другие варианты и вариации), выполняет следующее:

  • при входе в заголовок, он вызывает скрипты в /etc/rCx.d/s* в буквенно-цифровом порядке. Где x - проговел. Эти скрипты должны настроить пробег. Типичная настройка начинает демоны и выполняет задачи настройки для этого уровня запуска. Это одноразовое, сделанное при входе на протяжку.
  • В то время как на уровне прогона он начинает демоны, которые перечислены в / etc / inittab , что нужно активно активно во время этого уровня запуска. Если эти демоны перестают работать, он перезапускает их. Пока у вас может быть какой-либо демон, который вы хотите, чтобы управлять init , как минимум, вы хотите, чтобы несколько Getty , чтобы вы могли войти. Getty выходит после Войти завершено, то init перезагружается, обеспечивая свежий вход в систему.
    • Если демон перезапускается слишком много раз, слишком мало времени, он перестает пытаться на некоторое время перезапустить его.
    • Просто потому, что что-то было запущено сценариями Kickoff при входе на уровне запуска, не производится init Автоматически пытаться сохранить его. Вам необходимо указать, что отдельно в / etc / inittab .
  • При выходе за протяженностью он вызывает скрипты в /etc/rcx.d/k* в буквенно-цифровом порядке, где x - проговел. Способ реализации отключения или перезагрузки - это определить проговел для тех событий и сделать последнюю задачу, выполненную Halt или REBOOK Команда.
  • Он будет вызывать исполняемые файлы в ответ на определенные события, такие как энергопотребление или Ctrl-Alt-Del.
  • Он слушает розетку, если он получает определенные сообщения, это изменится запущено.

Итак, вы можете использовать init init в качестве элементарного руководителя сервисных услуг, если вы хотите, но это главная задача в наши дни, чтобы сохранить Getty Доступно, чтобы пользователь мог войти в систему, и отключен Переходные переходы.

Мне просто интересно, какие задачи init делают, чтобы установить систему для простой оболочки?

Все, что вы хотите. На Debian в каждом каталог /etc/rcx.d - это симличинка скрипта в /etc/init.d , и вы можете полностью настроить или удалить эти скрипты. Заказ устанавливается предшествующим каждому сценарию 00 , 01 и т. Д.

Вы также можете указать вариант -B на init (т.е. через командную строку ядра), если вы просто хотите init , чтобы вызвать оболочку. При выходе из раковины init умирает и когда init умирает, ядро ​​будет паниковать.

4
27.01.2020, 19:34

Я обнаружил, что Ubuntu 15.04 был обновлен до конца апреля. Внешние USB-накопители можно совместно использовать только через NFS, если они подключены к домашнему каталогу пользователей, а НЕ к папкам музыки/видео по умолчанию. Тогда никто: nogroup на сервере. fsid = 0 для корня экспорта также должен присутствовать. Все работает. Я могу предоставить образцы от первого клиента, затем сервера.

Клиент - fstab
 server:/home/userid/MyMusic    /home/clientid/Music   nfs     auto       0       0
 server:/home/userid/MyVideo    /home/clientid/Videos  nfs     auto       0       0

Я отправлю раздел сервера в качестве отдельного ответа, так как у меня нет доступа ЕЩЕ к корневому каталогу

-121--44156-

Это, вероятно, не официальный способ Debian сделать это, но я бы сделал это именно так.

ar -p foo.deb tmp.tar.gz | tar tzv

Тогда, конечно, вы можете провести этот выход через grep.

ar -p foo.deb tmp.tar.gz | tar tzv | grep -i bar

В качестве объяснения: ar -p foo.deb tmp.tar.gz преобразует архив .deb в gzipped tar. Затем мы направляем файл tar.gz через tar и перечисляем файлы, содержащиеся в tarball ( t списки, z unzips, и v делает это подробно)

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

-121--161198-

Если вы привержены модульному принципу «делай одно и делай это хорошо», то программа init должна начать процессы.

Запуск процессов

Он должен выполняться после того, как ядро успешно распаковано, с учетом всех элементарных задач, связанных с инициализацией всех исходных процессов, которые требуются системе для работы (например, установка дисков в/etc/fstab, включение сетевых интерфейсов и т.д.).

Поскольку процесс загрузки и завершения работы является по существу обратным друг другу, программа init обычно также гарантирует, что процессы будут остановлены по команде завершения работы.

Stop Processes

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

Ссылки

Хорошей ссылкой на то, как это делается другими, является просмотр сценариев Slackware/etc/rc.d , а также простой системы инициализации, которая уже существует, как ninit (преемник minit). Он имеет контроль процесса (означающий, что если процесс умирает, он запускается повторно), который, возможно, не является заданием init, но он все еще достаточно базовый и простой для понимания, особенно через примеры скриптов автора.

0
27.01.2020, 19:34

Теги

Похожие вопросы