блудный init
Прошу прощения у всех кто отозвалсо на предыдущий пост - не поблагодарил вовремя. Всем риспект.
Продолжаю воевать. Пока все косяки, которые вылазят связаны с конфигурацией ядра: то APIC, который то ли есть то ли нету - убрал из ядра - проехали. Потом не включил поддержку IDE: kernel panic ... Check "root=" parameter (или что типа того). Выбрал нужный чипсет из DRIVERS->ATA/ATAPI... - проехали.
Сейчас еще одна психоделическая картинка.
Grub.conf:
default 0
timeout 30
title=Gentoo
root (hd0,0)
kernel /boot/kernel_0 root=/dev/hda3
fstab:
/dev/hda1 /boot ext2 defaults,noatime 1 2
/dev/hda2 none swap sw 0 0
/dev/hda3 / reiserfs notail 0 1
none /proc proc defaults 0 0
none /dev/shm tmpfs nodev,nosuid,noexec 0 0
Пускаетсо кернел, шуршит. Определяет там чего-то. Монтирует reiser. И упс(по памяти все, но смысл такой):
cant`t found init. Try to put "init=" parameter ...
Чего-то я не догоняю. Если пустил он уже ядро, чего ему еще надо? Где находитсо init? Разве он не часть ядра?
Еще вопрос, по ходу. Если в rc.conf не стоит пуск иксов, где я окажусь в оконцовке? Где то видел кусок кода ядра, там такая картинка была:
ля ля ля .../rc
ля ля ля .../rc
ля ля ля .../rc
ля ля ля .../rc
ля ля ля /bin/bash
ля ля ля " cant`t found init. Try to put "init=" parameter ... "
Я так понимаю этот код имеет отношение к inittab. У меня он выглядит как нибудь так:
# Level to run in
id:2:initdefault:
# System initialization before anything else.
si::sysinit:/etc/rc.d/bcheckrc
# Runlevel 0,6 is halt and reboot, 1 is maintenance mode.
l0:0:wait:/etc/rc.d/rc.halt
l1:1:wait:/etc/rc.d/rc.single
l2:2345:wait:/etc/rc.d/rc.multi
l6:6:wait:/etc/rc.d/rc.reboot
# What to do at the "3 finger salute".
ca::ctrlaltdel:/sbin/shutdown -t5 -rf now
# Runlevel 2&3: getty on console, level 3 also getty on modem port.
1:23:respawn:/sbin/getty tty1 VC linux
2:23:respawn:/sbin/getty tty2 VC linux
3:23:respawn:/sbin/getty tty3 VC linux
4:23:respawn:/sbin/getty tty4 VC linux
S2:3:respawn:/sbin/uugetty ttyS2 M19200
Это не мой, я просто хотел сказать, что в нем нет указания на /bin/bash/
Возможен ли такой вариант:
ядро шуршит, пускает init, он лезет в inittab, там его отправляют в rc, а в rc не прописано, што мне нужен shell (в rc.conf у меня пусто по этому поводу) и в итоге я получаю кусок из исходника "can`t found init, try "init=""?
Или это глупость полная?
- Для комментирования войдите или зарегистрируйтесь
Попробуй
Попробуй указать
init=/bin/sh
Какой еще
Какой еще /bin/sh!!
init лежит в /sbin/init и это особый процесс, он пораждается нестандартным образом, имеет PID=1 и является родителем остальных процессов. Отвечает за отдачу команд для выполнения всяких инитскриптов, потом порождает процессы getty для каждой консоли и перезапускает их, когда они завершаются, помимо этого он становится родителем всех сиротских процессов и занимается кремацией их тркпов, т.е. забирарает записи о зомби процессах, освобождая тем самым системные ресурсы. Так же он отвечает за завершение работы.
ЗЫ К ядру он тоже не имеет никакого отношения!
Немного не
Немного не так.
1) Он имеет отношение к ядру так как именно оно (ядро) запускает init на последнем шаге загрузки.
2) Он не "забирает запись о зомби", а родителем становится либо один поток из группы потомков завершившегося родительского процесса, либо init. После этого он всего лишь переодически вызывает wait().
3) init=/bin/sh старейший способ загрузить систему когда вы напортачили с ядром или забыли пароль рута. Попробуйте сами. Стыдно этого не знать.
Если внимательно посмотреть исходники можно увидеть:
Таким образом запуск /bin/sh вполне себя оправдывает!
1) Я в том плане,
1) Я в том плане, что он не есть часть ядра. Это отдельный процесс и, в принципе, вместо обычного init можно что угодно запустить, например в initrd (initramfs) образах вместо него shell скрипты часто вешают.
2) Именно вызываю wait он и забирает записи о зомби. При этом вызове ему передается код завершения потомка и его статистика, после чего ядро с чистой совестью выкидывает эту информацию из своих таблиц и освобождает PID.
Осиротевшие процессы всегда отдаются иниту. Если будет возможность, что у твоего приложения вдруг возьмут да и потомки появятся, будет очень сложно пистаь программы, появятся дыры в безопасности.
Попробуй исходя из своего предположения породить процесс и дождаться его завершения при помощи функции wait, не получится, только при помощи waitpid, а тогда вообще зачем wait, почему оно во всех примерах используется?
3)
Запуск /bin/sh - это однопользовательский режим, аварийный или для сервисных целей.
Появится косоль с правами root, ничего не будет инициализированно, по завершении работы консоли система ребутнется.
Ему то нужен нормальный режим, а не аварийный.
ЗЫ А про пароль или ядро... Если отдельной строчкой в загрузчике вывести, то да, но я мало встречал людей, которые так делают. Очень прикольно будет, если прийдет кто-то загрузится, сразу получит рута и сотрет все с моего диска. А как иначе grub.conf поправить если система не грузится? Загрузиться с LiveCD или дискетки и поправить. Но тогда проще сразу пароль сменить или ядро пересобрать.
если гузиться
если гузиться сам граб - то там шелл есть или можно просто подкорректировать что-то
Quote:Я в том
Именно это я предложил сделать. Запустить вместо init что-нить другое с целью получить хоть как-то работающую систему и разобраться в случившемся.
Код завершения - да, PID - да, указатель на область памяти - да, статистика??? Покажите мне в исходниках ядра где там возвращается "статистика"?
Нет. Посмотрите в exit.c функцию forget_original_parent(), она сначала пытается переставить указатель родителя на другой процесс в группе потоков данного процесса, и уж если и там никого нет - тогда init.
Не понял. Какие проблемы в появлении потомков? Откуда дыры в безопасности?
Попрбовал. Получилось. Как же так???
Для восстановления системы и анализа это лучше чем ничего?
Зачем отдельной строчкой? И grub и lilo позволяют дописывать опции ядру ничего не меняя в конфигах. После загрузки вы можете сделать с системой всё что угодно.
Ладно, признаю
Ладно, признаю свою неправоту. В ядре копаться сейчас некогда, как будет возможность, так посмотрю, может потом пригодится.
Quote: Это не мой,
И не надо, происходит инициализация консоли, в качестве оболочки по-умолчанию берётся /bin/sh , который есть симлинк на /bin/bash
Дело по-видимому в том, что либо вы примонтировали как / не тот раздел и на нем нет этого самого /bin/sh, либо он поврежден.
спасибо.
спасибо. попробую.
По-моему что-то
По-моему что-то не то написано в Grub.conf. Должно быть что-то вроде:
default 0
timeout 30
title=Gentoo
kernel=(hd0,0)/kernel_0 root=/dev/hda3
Еще проверь: поддержка reiserfs должна быть в ядре.
У тебя ядро не находит /sbin/init. Это может быть из-за неправильного параметра root= или из-за неподдерживаемой FS.
А в конфиге
А в конфиге граба не должно быть опции real_root или как-то так? У тебя рут раздел либо не монтируется, либо монтируется не туда. Вот и не получается найти программулину /sbin/init.
Повнимательнее прогляди хэндбук на тему конфигурации граба.
думаеться
думаеться просто поддержка в ядре рейзера стоит модулем, а надо насмерть
Не уверен, но
Не уверен, но по-моему тогда идет ругань про root=
Джентелмены,
Джентелмены, всем спасибо. Очень дружно тут у вас.
Я наконетс загрузилсо. В чем была причина не знаю до сих пор. Все грабли которые вы описывали проходил шаг за шагом. Должен сказать, что ошибок в grub`е fstab`е у меня не было. Manual толково написан. А вот чего в нем действительно не хватает, и из за чего лезут все вилы - непонятно штош включать в config`e. У меня была включена поддержка reiserfs, /proc, tmpfs тока все равно ему мало было. Што помогло: не ведаю. Слишком уж много опций.
Я понимаю, конечно, что в головушке должно быть какое-то представление о железе, но это - явно перебор. Приходитсо тыкаца в слепую: поможет/ не поможет.
чует сердце
беда во включеном CONFIG_INITRAMFS_....была*)