Init bin bash что это
Перейти к содержимому

Init bin bash что это

  • автор:

Можно ли загрузиться с init=/bin/bash в системах с systemd

В том, что systemd много чего пытается делать сам и у меня не было уверенности в том, что init=/bin/bash вообще работоспособен на подобных системах.

unanimous ★★★★★
( 09.05.12 22:53:11 MSK ) автор топика
Ответ на: комментарий от unanimous 09.05.12 22:53:11 MSK

дык инит же не сам по себе стартует, ядру нет дела что там, системд, bash или mc.

Novell-ch ★★★★★
( 09.05.12 22:58:15 MSK )
Ответ на: комментарий от unanimous 09.05.12 22:53:11 MSK

Systemd в данном конкретном случае вообще ни при чём. Ты же в качестве init-а используешь bash. Или сейчас «ругать» systemd настолько модно? Линуксоиды нашли себе новую затычку для любой бочки вместо 12309.

imul ★★★★★
( 09.05.12 22:58:48 MSK )
Ответ на: комментарий от imul 09.05.12 22:58:48 MSK

Тихо-тихо, без далеко идущих обобщений. Я понимаю, что ядру все равно, но как-то есть еще обычно initrd, откуда systemd может что-то важное для загрузки делать, а bash — нет.

Кроме того, я пока ничего плохого о systemd не говорил. Если всё работает по старому с init=/bin/bash, значит все ОК.

unanimous ★★★★★
( 09.05.12 23:11:53 MSK ) автор топика
Ответ на: комментарий от unanimous 09.05.12 23:11:53 MSK

но как-то есть еще обычно initrd, откуда systemd может что-то важное для загрузки делать, а bash — нет.

В initrd systemd тоже нет. Там обычно бизибокс. 🙂 Если происходит передача на bash, то не отрабатывает ни одного инициализационного скрипта из /etc. В этом как раз и основная особенность. То есть / в ro, из фээс и псевдофээс только те, которые были нужны для подгрузки модулей: /proc /dev /sys.

imul ★★★★★
( 09.05.12 23:34:33 MSK )
Ответ на: комментарий от imul 09.05.12 22:58:48 MSK

Или сейчас «ругать» systemd настолько модно?

Это не «модно», за такие вещи, их создателей надо вообще усыплять.

48. Восстановление доступа

При работе вы можете сталкиваться с ситуациями, когда вам нужно восстановить доступ к системе. К примеру, потерялся пароль или предыдущий админ его не предоставил. Прежде чем начнём, небольшой совет — используйте парольные менеджеры, например, keepassxc. У вас может быть множество серверов, различные аккаунты на сайтах и везде требуется пароль. Придумать для различных ресурсов разные пароли и потом всё это запомнить — нереально. Использовать один и тот же пароль, каким бы сложным он не был — тоже не правильно — всегда есть риск утечки. А с парольным менеджером вы можете сгенерировать рандомные пароли для различных ресурсов и не беспокоиться, что кто-то где-то украдёт пароль и получит доступ ко всем системам. Но саму базу паролей надо бэкапить, иначе можете остаться без единого пароля.

Сейчас мы займёмся сбросом пароля root пользователя. В рабочей системе без прав суперпользователя это сделать невозможно, если не принимать во внимание всякие уязвимости. Поэтому пароль надо сбрасывать ещё до того, как система запустилась. Чтобы понять, как это сделать, вспомним процесс запуска операционной системы. Мы знаем, что пароли хранятся в файле /etc/shadow. Корень у нас монтируется ещё на этапе с временным корнем — initramfs — откуда берутся необходимые для монтирования модули. Дальше у нас запускается система инициализации. Надо вклиниться в промежуток после монтирования корня и до запуска системы инициализации. Это можно сделать несколькими способами — я сначала покажу самый простой и быстрый на мой взгляд, ну и потом разберу самый популярный в интернете.

И так, чтобы изменить процесс запуска, надо изменить настройки загрузчика grub. Для этого при запуске системы в меню grub на первом пункте нажимаем e — edit.

Спустимся на строчку с параметрами ядра linux. Здесь есть параметр ro — read only. Во время запуска основной корень предварительно монтируется в режиме чтения.

Заменим ro на rw — нам нужно, чтобы корень был доступен для изменений, всё таки мы собираемся изменить файл /etc/shadow. Также добавляем опцию init=/bin/bash — таким образом мы вместо системы инициализации запускаем bash, тем самым предотвращаем нормальный запуск системы и сразу получаем доступ к оболочке на незапущенной системе. Наши изменения в grub сохраняются только на текущую сессию и после перезагрузки всё сбросится, так что тут ничего страшного нет. Чтобы запуститься с новыми параметрами, нажимаем ctrl+x.

После этого нас встретит bash. Для начала я покажу все команды, чтобы было легче запомнить, а потом разберём, что и зачем. Пишем:

su - load_policy -i /etc/selinux/targeted/policy/policy.31 

В зависимости от обновления название последнего файла может отличаться — просто в директории policy нажимаете tab и баш дополняет нужный файл, он там обычно единственный. После этого пишем:

passwd 

и вводим новый пароль дважды. Затем через виртуалбокс перезагружаем виртуалку.

su - load_policy -i /etc/selinux/targeted/policy/policy.31 passwd 

После запуска операционной системы проверим новый пароль:

Теперь разберёмся с командами. Первое что мы ввели:

Это нужно, чтобы прогрузилось окружение пользователя. Если проверим bash, который у нас загружается в начале:

echo $PATH

в нём только две директории в переменной PATH — /usr/local/bin и /usr/bin . Если мы напишем просто:

окружение останется, а значит в этой переменной останутся те же директории:

echo $PATH

Из темы про su мы помним, что для загрузки окружения пользователя к su надо добавлять дефис:

После чего в переменной $PATH:

echo $PATH

мы увидим новые директории.

Шаг с load_policy нужен на системах, где стоит selinux. Т.е. на RHEL и Centos-е это нужно, а на том же Debian или Ubuntu — нет, если конечно вы не поставили на них selinux. Зачем этот шаг вообще нужен? При запуске системы у нас не прогрузился selinux:

getenforce 

Как видите, selinux disabled . Когда selinux выключен, работать с файлами не стоит, иначе контекст сбрасывается. Смена пароля — изменение файла /etc/shadow. Посмотрим контекст этого файла:

ls -lZ /etc/shadow 

Сейчас контекст shadow_t . Для наглядности пропустим шаг с load_policy и сразу зададим пароль — passwd. После этого контекст файла пропадёт:

ls -lZ /etc/shadow 

Мы говорили, что selinux блокирует процессам доступ к файлам, если контекст не совпадает. И в итоге из-за потерянного контекста при запуске система не сможет обратиться к /etc/shadow и поэтому не запустится.

Но тут ничего ужасного нет и мы можем исправить. Мы помним, что для восстановления контекста из конфига selinux есть утилита restorecon:

restorecon -v /etc/shadow ls -lZ /etc/shadow 

Но, как видите, ничего не произошло — потому что у нас selinux не запущен. И вот тут нам нужна команда load_policy — она загружает политики:

load_policy -i /etc/selinux/targeted/policy/policy.31 

И вот после неё restorecon всё возвращает:

restorecon -v /etc/shadow ls -lZ /etc/shadow 

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

Теперь попробуем разобрать популярные способы из интернета. Где-то что-то отличается по мелочам, поэтому я покажу что-то среднее. Так или иначе, везде нужно редактировать в grub-е строчку linux. Многие вместо вышеуказанных изменений пишут rd.break — тогда у нас процесс запуска останавливается ещё на initramfs.

В принципе, это полезная опция, которая позволяет решить некоторые проблемы, если не грузится корень. В initramfs обычно утилит мало:

ls /bin /sbin 

но их может хватить на базовые операции для решения проблем, скажем, для проверки и исправления проблем с файловой системой, lvm и т.п.

Настоящий же корень примонтирован в директорию /sysroot:

mount | grep /sysroot 

И, обратите внимание, что он примонтирован в режиме ro — read only. Поэтому мы изначально в grub меняли ro на rw. Тут же придётся перемонтировать:

mount -o remount,rw /sysroot 

Дальше нам необходимо перейти с временного корня на настоящий, для этого есть утилита chroot:

chroot /sysroot 

После чего надо залогиниться и задать новый пароль:

su - passwd 

И мы помним, что это действие сбрасывает контекст с файла /etc/shadow. И для решения этой проблемы советуют создать файл в корне:

touch /.autorelabel 

и перезагрузиться. При виде такого файла при запуске selinux восстанавливает контекст всех файлов. Но это долгий процесс и зависит от количества файлов в системе.

Правда у меня после создания файла контекст не восстановился и система отказывалась запускаться. Но если перезагрузиться и добавить в grub параметр autorelabel=1 — контекст восстановится. Потом понадобится ещё одна перезагрузка и всё заново заработает.

Ещё вас может заинтересовать вопрос — значит, любой желающий, не зная пароль, может его сбросить? Насколько это безопасно? Тут два варианта. Если у человека есть доступ только к консоли виртуалки, то можно поставить пароль на grub — тогда в меню grub при попытке редактирования будет запрашиваться пароль. Но если у человека есть физический доступ к компьютеру, то единственный способ защититься — это шифровать диски, иначе злоумышленник просто загрузится в livecd. Можно конечно блокировать паролем загрузочное меню компьютера, но и это можно обойти просто вытащив диск и подключив к другому компьютеру.

Подведём итоги. Сегодня мы с вами разобрали, как восстановить доступ к системе, если вы не знаете пароль root-а или другого пользователя с правами sudo. Также мы научились останавливать процесс запуска ещё на этапе initramfs — а это очень важно для решения проблем.

© Copyright 2021, GNU Linux Pro, CC-BY-SA-4.0. Ревизия 5f665cc2 .

Процесс INIT — это движущая сила, которая обеспечивает работу компьютера под управлением Linux

Процесс INIT — это движущая сила, которая обеспечивает работу компьютера под управлением Linux, но она может и убить систему. Эта статья расскажет о том, что такое процесс Init, а также поможет узнать, как подчинить поведение этого процесса себе. (Да, Init — это сила, но администратор системы может управлять этой силой).
Вообще-то в UNIX слово «init» не обозначает конкретную программу, скорее всего целый класс программ. Название «init» используется для вызова первого процесса после загрузки системы, первого и единственного процесса. Когда кернел завершает проверку и настройку аппаратного обеспечения компьютера, он вызывает «init» и передает ему контроль над компьютером. С этого момента кернел обрабатывает только системные вызовы ( system calls), не заботясь более о поведении операционной системы. После того как кернел монтирует корневую файловую систему, все контролируется процессом «init».

Сейчас существует несколько способов реализации процесса «init». Вы можете использовать классическую программу Микеля ван Смаренбурга, которая поставляется с модулем SysVinit, simpleinit Питера Орбака (его можно найти среди модулей приложений util-linux), или простой шелловский скрипт (например, тот, который приведен в этой статье, правда, он обладает гораздо меньшими возможностями, чем любое приложение языка С).
Если Вы настраиваете ограниченную изолированную систему, можно выбрать любое приложение, которое будет использоваться в качестве процесса «init». Некоторые мазохисты, которым не нравится многозадачность, могут даже перенести command.com на Linux и запустить его в качестве процесса «init», хотя Вам никогда не удастся ограничить себя 640 Kb оперативной памяти, пока загружен кернел Linux.
Вне зависимости от того, какую программу Вы выбрали, доступ к ней должен осуществляться по пути /sbin/init, /etc/init или /bin/init, так как именно эти пути жестко скомпиллированы в кернел. Если ни одна из этих программ не может быть найдена и запущена на выполнение, система считается неисправной и кернел порождает шелл администратора системы, пользователя root, чтобы дать возможность исправить ситуацию (таким образом, в качестве процесса «init» используется шелл /bin/sh).
Для достижения максимальной гибкости разработчики кернела предоставили возможность выбирать другой, альтернативный путь для запуска процесса «init». Кернел воспринимает командную строку «init=» именно для этой цели. Параметры кернела могут быть переданы интерактивно во время загрузки, либо можно использовать команду «append=» в файле /etc/lilo.conf. Silo, Milo, Loadlin и другие загрузчики также позволяют передавать некоторые параметры кернелу.

Как Вы уже догадываетесь, простейший путь для получения прав доступа супервизора системы и его администратора на компьютере с ОС Linux — это напечатать строку «init=/bin/sh» в ответ на приглашение загрузчика LILO. Учтите, что это не является «прорехой» в безопасности системы, потому что настоящей угрозой безопасности системы является физический доступ к компьютеру и его системной консоли. Если Вы опасаетесь возможности ввода параметров «init=» в процессе загрузки, то сам загрузчик LILO может предотвратить возможность подобного несанкционированного управления при помощи защиты своим собственным паролем.
Задача процесса Init
Мы уже знаем, что имя «Init» не собственное, а, скорее, нарицательное, и его может использовать почти любая программа. Вопрос лишь в том, чем в самом деле должен заниматься «Init»? Будучи первым (и единственным) процессом, выполняемым кернелом, «Init» должен заботиться о запуске всех остальных процессов в системе, включая различные программы-демоны, используемые операционной системой, а также обеспечивать сеансы связи с текстовыми консолями. «Init» также должен перезапускать некоторые из своих порожденных процессов после завершения их работы. Обычно это касается всех сеансов связи через консоли. Как только Вы отключаетесь от системы, она должна вновь запустить программу getty, чтобы предоставить возможность следующего соединения. Кроме этого, «Init» заботится о мертвых процессах и отделывается от них. В соответствии с понятием процессов в UNIX, процесс не может быть удален из системной таблицы процессов, пока о его смерти не будет сообщено процессу, породившему данный процесс (или другому процессу-предку, в случае, если процесс-родитель больше не существует). В случае, если процесс прекращает работу после системного вызова exit, он остается в состоянии зомби-процесса, пока кто-нибудь не позаботится о нем. «Init», будучи предком любого другого процесса, должен собирать информацию о состоянии завершения каждого усыновленного зомби-процесса. Следует отметить, что грамотно написанная программа должна сама заботиться о всех порожденных собой процессах, зомби появляются только как следствие некорректного поведения программ. Если бы «Init» не собирал все зомби-процессы, то ленивые программисты легко и быстро исчерпали бы все системные ресурсы и компьютер с переполненной системной таблицей процессов просто завис бы.

Последняя задача «Init» — забота об отключении системы. Программа «Init» должна остановить все процессы и размонтировать все файловые системы, когда системный администратор решит, что пришло время выключать компьютер. Программа shutdown не делает ничего, она только сообщает процессу «Init», что все закончено.
Как видно, задача «Init» не так уж трудно выполнима, и простой шелловский скрипт может справиться с большинством из поставленных задач. Вспомним, что любой шелл сам прекрасно заботится о порожденных собой же процессах, так что забота об умерших потомках — не проблема для простого скрипта. Но настоящий «Init» должен заниматься контролем над поведением всей системы и выполнять его достаточно эффективно, надежно и быстро.
Использование /bin/sh в качестве минимального выбора

Как говорилось выше, шелл может использоваться в качестве программы «Init». Использование «голого»шелла (init=/bin/sh) просто открывает сеанс связи системного администратора на абсолютно несконфигурированном компьютере. Эта глава описывает, как скрипт шелла может выполнить все задачи, необходимые для работы системы в минимальной конфигурации. Этот вид упрощенной программы «Init» может использоваться в изолированных системах либо в случаях ограничения системных ресурсов, когда нужно экономить каждый бит памяти. Самым радикальным решением для изолированных систем является прямое использование конкретного приложения в качестве процесса «Init», в результате мы получим закрытую систему (без возможности взаимодействия с ее администратором, что, несомненно, вызовет проблемы), но иногда такая конфигурация удовлетворяет конкретным технологическим требованиям. Типичным примером системы Linux без реальной программы «Init» служит установочный диск с дистрибутивом операционной системы, в ней /sbin/init — это символьная ссылка на программу установки.

Листинг 1. Пример скрипта init
#!/bin/sh
# избегаем указания полного пути к именам файлов
export PATH=/usr/bin:/bin:/sbin:/usr/sbin
# монтируем корневую файловую систему только для чтения,
# и все разделы диска
mount — -n -o remount, rw /
mount -a
swapon -a
# протоколирование работы системы
syslog
klogd
# запуск сети
modprobe eth0 2 /dev/null
ifconfig eth0 192.168.0.1
route add 192.168.92.0 eth0
route add default gw 192.168.92.254
# запуск сетевых служб
inetd
sendmail -bd -q30m
# все остальное: crond, named.
# и запуск одной getty
export PATH=/usr/bin:/bin
/sbin/mingetty tty1

В Листинге 1 приведен скрипт, который может использоваться в качестве программы «Init». Скрипт этот короток и неполон, в частности, видно, что он запускает только одну программу getty, которая не может рестартовать после своего завершения. Будьте осторожны, если Вы решите использовать этот скрипт, так как каждый дистрибутив Linux использует свой собственный вид программы getty. Наберите команду: grep getty /etc/inittab, чтобы узнать, какая программа используется в вашей системе и как она называется.
В этом скрипте есть второй недостаток: он не заботится об отключении системы. Добавить поддержку отключения системы (shutdown) довольно легко, нужно просто отключить все процессы, когда завершит работу сеанс командного интерпретатора. Добавление текста, приведенного в листинге 2, выполнит этот трюк.
Листинг 2. Команды остановки всех процессов перед выключением
# убиваем все процессы, которые мы запустили
killall inetd
killall sendmail
killall klogd
killall syslogd
killall inetd
# убиваем все остальное
kill -TERM -1
sleep 2
kill -KILL -1
# освобождаем диск
swapoff -a
umount -a
mount -n -o remount, ro /
echo «The system is halted»
exit

Когда Вы загружаете систему в режиме init=/bin/sh, Вы должны по крайней мере перемонтировать корневую файловую систему перед тем, как делать что-либо еще, не забудьте также выполнить команду:
umount -a
перед нажатием ctrl-alt-del, потому что шелл не перехватывает эту комбинацию из трех клавиш.
Программа simpleinit
Модуль util-linux содержит исходники программы Init на языке С. У этой программы гораздо больше возможностей, чем у простого скрипта, и она может хорошо работать с большинством персональных компьютеров, хотя она не обладает такими широкими возможностями изменения своей конфигурации, как модуль SysVinit, поставляемый со многими дистрибутивами Linux.
Роль программы simpleinit (которая должна называться init для нормальной работы) очень похожа на роль скрипта, приведенного выше, с добавлением возможностей управления однопользовательским режимом и интерактивным вызовом сеансов связи через консоли. Также она корректно выполняет процедуру отключения системы. На программу simpleinit интересно посмотреть, она хорошо документирована, Вам, несомненно, понравится знакомство с прилагаемой документацией. Я советую обратиться к дистрибутиву модуля util-linux для получения более свежей информации. Средства программы simpleinit предельно просты, как и обещает ее название. Программа вызывает скрипт ( /etc/rc) и запрашивает файл конфигурации, чтобы определить, какой процесс должен быть перезапущен. Файл конфигурации называется /etc/inittab, аналогично файлам конфигурации других программ «init», хотя его формат и отличается от них. Если Вы планируете установить simpleinit на свой компьютер (который, скорее всего, уже содержит SysVinit), вы должны делать это очень осторожно и быть готовым к загрузке системы с аргументом кернела «init=/bin/sh» для исправления ошибок.

Продолжение следует
Алессандро РубиниLinux Journal, issue 55, November 1998, перевод Игоря Греня

Компьютерная газета. Статья была опубликована в номере 49 за 1998 год в рубрике soft :: unix

Восстановление пароля root

Для смены пароля root, не зная его, делаем следующее:

Получив физический доступ к компьютеру, нажимаем Ctrl + Alt + Del (возможно дважды) — система уходит в перезагрузку.

  • Попробовать загрузиться в однопользовательском режиме (single mode). Для этого в меню загрузчика (Grub или Lilo — всё равно) отредактировать вариант, начинающийся со слова kernel — добавить в конец 1 или слово single, заменив также режим монтирования диска (если указан) с ro на rw (чтобы можно было сохранить новый пароль).
  • Если при загрузке запрашивает пароль root’a, то нужно перезагрузиться и изменить команду загрузчика по другому, добавив вместо single параметр init=/bin/bash, заменив также режим монтирования диска (если указан) с ro на rw
  • Входим в интерактивный режим загрузчика (см выше) и указываем ему опцию:

linux init=/bin/bash

  • После загрузки оболочки необходимо перемонтировать корневой раздел в режим RW:

mount -o remount,rw /

  • Меняем пароль:
  • Сбросим данные из кеша на диск. Для этого достаточно просто перемонтировать корневой раздел обратно в режим только для чтения:

mount -o remount,ro /

  • Теперь можно перезагрузить компьютер в обычный режим. Не забывайте, что скрипты инициализации для нашего сеанса /bash не работают.

Debian, загрузчик GRUB

Проверено
GRUB Debian 6.0 2011.04.13 Участник:Lda

Если вы забыли пароль root в debian, то существует несколько способов, чтобы его восстановить, например с помощью загрузчика GRUB.

  • В меню загрузчика GRUB стрелками выбираем нужную версию linux, для которой нужно восстановить пароль.

Нажимаем клавишу e (Edit). На экране появляется несколько строк, из которых нас интересует строка ядра:

kernel /образ_ядра root=/корневой_раздел ro quiet

  • Теперь нам надо отредактировать строку ядра и сделать её вот такого вида:

kernel /образ_ядра root=/корневой_раздел rw init=/bin/bash
kernel /образ_ядра root=/корневой_раздел rw init=/bin/sh

Нажимаем Ctrl-X (Boot). В результате мы загрузимся в системную консоль с правами root и сможем поменяем пароль, с помощью стандартной команды смены пароля:

Вводим новый пароль два раза и перезагружаемся. Вот этими простыми действиями, мы восстановили пароль root.

Cсылки

Больше про загрузчик Lilo можно узнать в спец статье.

  • http://special.w6.ru/node/37
  • http://itshaman.ru/articles/12/passwd-root-linux

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *