Сценарий оболочки для отображения файловых систем, которые используют более 90% использования диска

Первая и основная задача ядра при загрузке - найти и вызвать 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 как о имени программы, а вместо этого как имя параметра , который определяет исполняемую программу. которому ядро ​​передает первоначальный контроль над пользовательским пространством в целом.

0
10.01.2019, 21:04
1 ответ

У вас несколько ошибок.

  1. У вас есть пробелы до и после=
  2. Вы сравниваете числа с >, вы должны использовать-gt
  3. Вы используете скобки ()в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
2
28.01.2020, 02:30

Теги

Похожие вопросы