Первая и основная задача ядра при загрузке - найти и вызвать init
- пользовательское пространство. Ваш initramfs
вряд ли будет чем-то большим, чем образ диска Linux, содержащий этот 'init' и столько файлов, сколько необходимо для упаковки в этот образ для init
, чтобы найти и смонтировать ваш настоящий корневая файловая система. По сути, это не жесткие правила, но они являются стандартом де-факто.
Настоящая проблема с ответом на этот вопрос заключается в том, что хотя init
очень часто является оболочкой, а несколько файлов, сопровождающих ее в initramfs, представляют собой просто сценарии оболочки и несколько модулей ядра, необходимых для монтирования вашего корневого устройства, это, конечно, не должно быть. Ядру все равно - оно просто хочет init
.
Так что ответ на этот вопрос, я думаю, будет сразу после того, как вы настроите его для вызова.
ПОДРОБНЕЕ ...
Вы можете проверить это довольно легко - включите выбранную оболочку в образ initramfs и добавьте параметр:
"init=/path/to/shell"
в командную строку ядра загрузчика. Пока зависимости вашей оболочки соблюдены, ваша следующая загрузка должна предоставить вам интерактивную подсказку в раннем пользовательском пространстве.
Вероятно, даже не требуется добавлять оболочку, поскольку существует довольно высокая вероятность того, что ваш init уже является сеансом busybox
со сценарием и
"init=/bin/sh"
подойдет также - хотя я ожидаю, что " точно так же "часть спорна. В любом случае, если вы когда-либо сталкивались с одним из этих « запроса аварийного восстановления », это, вероятно, было просто / bin / sh
в initramfs
, если только вы используете grub
, и ваше ядро не загрузилось полностью, и в этом случае это определенно не так.
Стефан ниже комментирует разницу между init
и init
.Безусловно верно, что как только вызывается switchroot
, следующая вызываемая программа с гораздо меньшей вероятностью будет оболочкой, чем когда ядро распаковало initramfs
(что происходит независимо от того, предоставите ли вы один или нет, кстати) и называется init
. И определенно сообщение, которое он прокомментировал, содержало гораздо меньше информации по этому поводу, чем это редактирование, но в этот момент любой вызываемый init
является второй строкой - это просто пользовательское пространство , вызывающее пользовательское пространство .
Это важно в том, что любая передача управления предоставляется добровольно, обычно в сценарии оболочки, и не является необходимостью для работы, как это было при передаче обслуживания из пространства ядра в пользовательского пространства . Это может проявляться по-разному - например, ваш вариант вообще никогда не вызывать switchroot
и запускать операционную систему из initramfs
, или systemd
, чтобы убить udev
в раннем пользовательском пространстве , так что он может запустить новый процесс udev
в качестве своего дочернего процесса - но я надеюсь, что теперь я немного неуверен в том, что init
] вызывается только один раз, и любая программа с именем init
, вызываемая позже, несет факел init
только после того, как начальный процесс передает его.
Другой ответ здесь комментирует, что init
является традиционным , но, вероятно, сегодня это будет что-то другое .Я не уверен, что следую, но, насколько мне известно, init
был до и до сих пор остается начальным процессом пользовательского пространства , вызываемым ядром при загрузке, как показано в init =
параметр ядра, упомянутый выше, и чаще всего init
является оболочкой.
Подводя итог, вероятно, лучше всего думать о init
как о имени программы, а вместо этого как имя параметра
, который определяет исполняемую программу. которому ядро передает первоначальный контроль над пользовательским пространством в целом.
У вас несколько ошибок.
=
>
, вы должны использовать-gt
()
вif
Используйте этот способ:
df -h | awk '{ print $5, $1 }' > sample.txt
while read -r line;
do
echo $line
var1=$( echo $line | cut -d "%" -f5 )
if [[ "$var1" -gt 90 ]]
then
echo $line sample1.txt
fi
done < sample.txt