Что произойдет, если init был удален?

22

Просто теоретический вопрос ...

Но что произойдет, если init/sbin/init) будет удален?

Каз Вулф
источник
Не пытайтесь -L- это не сработает. cp /proc/fd/1/exe /sbin/init && chmod 755 /sbin/initработает хоть. Использование APT для переустановки upstart не так очевидно dpkg, так как он не будет знать, что по умолчанию. «Пакет выскочил уже в текущей версии». Вы могли бы в dpkg --force-depends --force-remove-essential -r upstartпервую очередь.
Джошуа
1
apt-get install --reinstall upstart, Кроме того, у меня нет /proc/fdкаталога. И я только что проверил, ln -L /proc/1/exe /tmp/initработает с /sbin/initпереименованным в /sbin/init.bak, т.е. я могу читать без проблем /tmp/initпосле этого.
Руслан
@muru ОК. Затем я добавлю синоним тега.
Каз Вулф

Ответы:

31

Загрузчик загрузит ядро, ядро ​​попытается запустить init, не найдет его и не запаникует.

Выход из этого - перезагрузка, редактирование параметров загрузки, добавление init=/bin/bashи загрузка таким образом. Ядро будет использовать bash в качестве init. Это даст вам возможность запускать команды и исправлять систему.

Исправление
Очевидно ядро ​​(файл init / main.c ) делает:

if (!try_to_run_init_process("/sbin/init") ||
    !try_to_run_init_process("/etc/init") ||
    !try_to_run_init_process("/bin/init") ||
    !try_to_run_init_process("/bin/sh"))
        return 0;

panic("No working init found.  Try passing init= option to kernel. "
      "See Linux Documentation/init.txt for guidance.");

Таким образом, он найдет / bin / sh (это ссылка на dash), и это даст вам оболочку и возможность исправить ее без использования init=/bin/bashпараметра загрузки.

sмurf
источник
Отличный ответ. Не знал, что ядро ​​ищет что-то большее, чем /sbin/init.
Руслан
А если нет /bin/shфайла? Или /bin/bashили /bin/dashтд? Не уверен, как вы можете удалить все это одновременно, но что произойдет, теоретически?
trysis
Ну, тогда вы увидите панику ядра, часть ответа над строкой исправления . Но не делайте этого в системе, которая вам нужна. Серьезно, не надо. Если вы хотите поэкспериментировать (и это хорошее упражнение), создать виртуальную машину Virtualbox, разбить ее и попытаться исправить. Кстати, ответ от 200_success тоже неплох.
smurf
12

Ничего не происходит, пока не попробуешь перезагрузиться. Пока система работает, и вы не пытаетесь переключать уровни выполнения с помощью /sbin/init n , вы даже не поймете, что она исчезла.

На самом деле, удаление /sbin/initневозможно отменить, если вы рано поймете ошибку и сохраните спокойствие. Системные администраторы оправились от гораздо более неприятных «лоботомий» при сохранении работоспособности операционной системы.

Один из способов восстановления после удаления /sbin/init- переустановить upstartпакет с помощью APT.

Мачо способ восстановления состоит в том, чтобы использовать только ресурсы на самой машине. Одним из факторов в вашу пользу является то, что /sbin/initвсегда работает. Поэтому, когда вы запускаете rm /sbin/init, файл просто не связан с файловой системой. Содержимое индекса и файла остается на диске и в памяти до выхода PID 1. Вам просто нужно заново создать /sbin/initиз соответствующего inode.

Самый простой способ сделать это:

# cp /proc/1/exe /sbin/init
# chmod 755 /sbin/init
200_success
источник