Здравствуйте коллеги!
Собираю initrd для собственных нужд и столкнулся с проблеммой:
если в /init скрипте вызываю bash или sh то они нормально отрабатывают в виртуальной машине.
Если же на реальной, то:
1. init скрипт доходит до /bin/bash и все намертво виснет. Точнее, не идет ввод с клавиатуры
2. init, вообще, не обращает внимания на /bin/bash и проскакивает его без остановки
Как добиться что бы на реальной машине init скрипт нормально реагировал на вызов /bin/bash?
а ты vmlinuz и initrd изначальный какое взял?
например linux*-kvm (ядро, образ и заголовки), оптимизированы для запуска внутри kvm виртуалки, очень быстро проходят инициализацию, но на реальной машине там практически ничего не будет работать
rPman, ну насчёт того, что ядро и initrd из виртуаки не будут работать на реальной машине - сильно сомневаюсь. Скорее некоторые сложности (не значительные) могут быть с переносом реальной машины в виртуал. Впрочем я такое не встречал ещё ни разу.
Я же использую vmlinuz & initrd с рабочей реальной машины.
А для другой задачи я, вообще, использовал root из lxc, запакованную в squashfs с последующим overlay.
с root проблем никаких не будет, откуда бы ты его не взял, за исключением установленных kernel modules и kernel headers, если они не будут соответствовать используемому ядру то многое не будет работать
речь именно о выбранном vmlinuz и initramfs.img и ключами запуска
rPman, ключи запуска - хренота из под ногтей :)
Ведру они до свечки.
Их использует лишь initrd.
Можно, вообще, обойтись без параметров, если самому собирать initrd.
Не так сложно найти root раздел и все остальное.
Я, правда, использую параметры, передаваемые ведру. Я передаю initrd UUID раздела, где лежит root squashfs и UUID RW раздела.
Впрочем, скорее всего, я буду переделывать.
Идея в следующем: передать юзверю систему, где он при всем желании, ни чего поломать не может.
Потому, я сендвич рут раздела буду делать с RAM диском, а всечто нужно сохранить, будет монтироваться.
Информбез - жуть с ружжом, но такой подход выбивает почву из под ног их придирок. Самое главное: initrd может при загрузке проверять cheksum root.sfs и отказываться грузить его, если контрольная сумма не совпадает с прошитой в initrd. Безпасники, после подобного, даже не знают к чему придраться.
Ну и дополнительные плюшки: обновить/заменить ВСЮ систему может даже юзверь сиволапый. ПО большому чету запустить немудреный скрипт с флешки, и готова новая система! Пять минут ожидания и готова полноценная система, которую еще и поломать крайне затруднительно.
Сейчас, правда, у меня еще один проект: в initrd запихнуть функционал для быкапа системы. Сама технология быкапа уже отработана. Немудреный скрипт делает полный оффлайновый бэкап нужного раздела. Но этот скрипт у меня живет в лайв системе, котрая ему на хрен не нужна. Достаточно впихуть невпихуемое в initrd и радоваться жизни.
Я сократил размер initrd до 900кб. Как бы, без вопросов, в него можно напихать еще сотню МБ. Эксперементальным путем установлено, что грузится initrd весом в 170 мб. С большим размером могут возникнуть проблемы. Но мне, по скромным подсчетам, понадобится запихнуть разнобезобразного ПО, на десяток мегабайт.
И тогда из initrd можно будет делать даже сетевые бэкапы.
Зачем в initrd bash?! Если взяли уже готовый initrd, то скорее всего его там и нет! Обычно туда пихают busybox, а все тяжелое запускают гораздо позже, после монтирования корневого раздела.
Ну и хорошо бы знать, как и по какой инструкции собираете initrd, ибо не два пальца облизать.
В качестве донора, в силу ряда причин, пришлось взять Altlinux. У него в initrd уже bash есть. Есть и есть. Всегда можно убрать.
А ещё лучше собрать с чистого листа. Но речь не о том!
В init скрипте что-то нужно прописать дополнительно, для корректной работы оболочки.
Может это TTY, может что-то с DISPLAY мутить нужно. Я с этими суЧностями совсем не знаком.
Что же касается сборки initrd и убеждения его правильно работать - некоторый опыт есть.
Просто мне сейчас нужно сделать своеобразную систему бэкапа, которую нужно запихнуть в initrd, что возможно, но нужна взаимодействовать с пользователем, а это пока работает лишь на виртуалке, а вот на реальной машине все совсем иначе. Или не воспринимает клавиатуру, или не обращает внимание на попытки тормознуть скрипт с помощью вызова шела.
HighMan, вам в предыдущем вопросе уже говорили, что вы занимаетесь чем-то не тем. initramfs не нужно редактировать вручную, его нужно генерировать соответствующими скриптами. У систем сборки initramfs есть собственные модули/хуки.
А по теме — наиболее вероятно, у вас не загружается драйвер клавиатуры, поэтому и нет ввода с клавиатуры.
Алексей Черемисин, нету его там, откуда бы он там взялся? Я в прошлом году потрошил initrd от simply linux, когда байкал запускал - там обычный initrd, даже остался где-то.
Я на 100500 согласен с ValdikSS - сборка initramfs вручную - это прям офигенно высший пилотаж, что-то типа правки макросов в sendmail.cf. Есть dracut, который по-моему может все, нужно только правильно его приготовить
Алексей Черемисин, видел и чтл?
Даже на Хабре статейку прочёл, где один товарищ диферамбы пел этому make-initrd. Только вот объяснить чем же он так крут не удосужился.
Тот initrd что я взял в качестве исходного, скорее всего, сделан с помощью make-initrd. Честно говоря, ни одного доброго слова в его сторону сказать не могу.
Несчастный init скрипт вызывает ещё пару десятков скриптов и разобраться в нем - чёрт ногу сломит.
Вроде, у init скрипта, не такая уж сложная задача: загрузить моды, смонтировать root раздел и передать ему управление.
И ради этого нужна пара десятков скриптов?
Я, по началу, пытался забраться в той писанине, что бы впихнуть нужный мне функционал, и потратил на это ни мало времени.
Потом пршсто стёр его к чертям собачьим и написал заново.
У меня initrd грузит squashfs образ root раздела, накладывает на него RW слой (overlay), да ещё и основательно парсит переданные ядру параметры.
CityCat4, в initrd живого рабочего Altlinux есть bash. Я сам удивился.
Что касается редактирования и даже полной сборки initrd, то это не высшая магия. Совсем.
Сами посмотрите, ЧТО должен делать initrd. Богатого функционала не предусмотрено.
Другое дело, что тестировать initrd долго.
Ещё сложно, по началу, собрать необходимое количество модов.
Если перетаскивать их все, то ,initrd разрастается до неприличия.
Пришлось заняться модулями.
Спасибо доброму человеку, который посоветовал рыть в сторону depmod.
Почитал. Понял не много, по началу, но идея появилась.
Раскрываю как подойти к проблеме, не обладая глубокими познаниями по модам
Собираем initrd со всеми модами. Грузимся и когда обнаружили нужные устройства вызываем lsmod и сохраняем результат.
Дальше я написал скрипт, который "парсит" выдачу lsmod и modules.dep.
Таким образом генерируем нужную пачку модов. Дальше, например, запускаем на виртуалке и смотрим какие моды загружены. Добавляем их.
Мне удалось немного ужать конечный размер initrd. Со 190mb ,до 900кб.
HighMan, Ну, у меня размер initrd - 10-11 Мб, я не знаю, что туда нужно запихать, чтобы он стал 190. Я ничтоже сумняшеся использую dracut, который был специально для этого придуман :)
CityCat4, что бы initrd вырос до 190 всего-то нужно туда в него впихнуть ПОЛНОСТЬЮ /lib/modules/$(uname -r), что я и сделал, т.к. не знал, какие моды понадобятся ведру, что бы, хотя бы, узреть диски!
Потом не было времени разбираться. Ну большой и большой. Хрен с ним.
Немного времени нашлось лишь вчера. Разобрался (поверхностно с depmod) полазил по modules.dep (обычный текстовой файл). Там модули со всеми зависимостями. Небольшой скрипт и в initrd попадают лишь те моды, которые мне нужны или те, которые, возможно, будут нужны. Так размр ужался до 900 кб. Можно еще немного почистить, но зачем?
Проще озаботится и написать скрипт, который будет полностью генерировать нужный initrd и запихивать в него все нужные модули.
Вполне возможно, что это изобретение велосипеда.
Есть же make-initrd!
Но, блин, сначала нужно изучить как им пользоваться. Дальше, наверняка, окажется, что -то нужное мне там не предусмотрено и придется изобретать костыллинг.
Временные затраты на изучение make-initrd и последующий костылинг, будут несоизмеримо больше, чем написать с чистого листа, особенно, когда начал понимать что там к чему.
какие моды понадобятся ведру, что бы, хотя бы, узреть диски!
М-да, уж на что я любитель костылей и покопаться в потрохах системы.... но до такого пока не доходил, потому что у меня сразу возникает вопрос - а накуа? Ведь есть же dracut?
У меня была примерно подобная задача - если я загрузился с ведра, где нет LVM, потом ставлю систему с LVM, то для того, чтобы после перезагрузки у меня все не посыпалось, мне нужно в initramfs передать каким-то образом имена томов и вообще тот факт, что тут LVM.
Сначала я тоже хотел что-то как обычно парсить, грепать, патчить... а потом нашел dracut, который как оказалось мало того, что сам все сделает, так еще и initramfs сам соберет и запакует его так, как скажешь. И все - то, что я хотел там в простыню развернуть - в две команды уложилось:
CityCat4, "М-да, уж на что я любитель костылей и покопаться в потрохах системы.... но до такого пока не доходил, потому что у меня сразу возникает вопрос - а накуа? Ведь есть же dracut? "
А если нет?
Думаете я из квасного патриотизма ковыряюсь с altlinux?
Ни разу!
Выбора нет. Altlinux 8 SP или Astra Linux Smolensk. Со вторым мне "посчастливилось" столкнуться несколько ранее.
Если бы у меня была возможность выбирать дистрибутив, то уж точно, на "отечественные" я бы даже смотреть не стал. Debian или Centos Stream. Может, даже, Fedora.
Но имеем, что имеем. Шаг в сторону - попытка бегаства. В Украину.
Спасибо хоть на рабочий комп не распостраняются требования, и я, возможно, если найдется время, поставлю любимую Федору.
И поставить, надо полагать, нельзя... Ну да, Смоленск же, сертификация все такое. Любое хорошее начинание могут убить чрезменым рвением в реализации :) Надо полагать нужно засунуть в initrd дрова для некоей хитровыделанной железяки?
чтобы в initramfs можно было кнопки нажимать, на сколько я знаю нужно чтобы работал эмулятор терминала (т.е. привязать текущий терминал к одному из системных tty), с помощью getty , в вартуалке как я понимаю это сделано по особому, а вот на реальной машинее нужно явно указывать.
Огромное спасибо!
Пока не проверил, но это первый осмысленый совет во всей теме.
Как разберусь - обязательно выложу тут решение.
Вообще, нужно создать некую викимучильню, куда выкладывать найденные решения с кратким описанием и заскриптованным решением.