перезагрузиться в образе initrd

Я ищу способ перезапустить/сбросить мою систему Linux из скрипта инициализации*. Во время выполнения моего скрипта система находится в /root, и у меня есть доступ к busybox.

Но команда «перезагрузка», которая является частью моего busybox, не работает. Есть ли другая возможность?


Моя система нормально загружается с образом initramfs, и мой сценарий в конечном итоге вызывает процесс обновления. Новый systemd, поставляемый с Debian, раздражает. А вот с сбросом питания все нормально.


person user2715068    schedule 27.02.2015    source источник
comment
Это было бы лучше на unix.stackexchange.com   -  person mathematician1975    schedule 27.02.2015
comment
Могу ли я перенести эту тему или мне нужно создать ее там заново? (unix.stackexchange.com)   -  person user2715068    schedule 27.02.2015


Ответы (2)


Я нашел это:

echo b >/proc/sysrq-trigger

(это как нажать CTRL+ALT+DEL)

person Sergeant    schedule 04.10.2015

Если вы -are- init (PID вашего процесса/скрипта равен 0), то запуск программы перезагрузки busybox не будет работать, поскольку она пытается подать сигнал init (который не запущен) на перезагрузку.

Вместо этого, как PID 0, вы должны делать то, что сделал бы init. Это вызов правильного API ядра для перезагрузки. Подробнее см. Man reboot(2).

Предполагая, что вы используете программу c или что-то в этом роде, можно было бы сделать:

#include <unistd.h>
#include <sys/reboot.h>

void main() { reboot(0x1234567); }

Это намного лучше, чем выполнение триггера sysrq, который будет действовать больше как панический перезапуск, чем чистый перезапуск.

И последнее замечание: init busybox фактически разветвляет процесс, чтобы выполнить перезагрузку за него. Это связано с тем, что системный вызов перезагрузки на самом деле также существует в программе, и система никогда не должна работать без процесса инициализации (который также вызовет панику ядра). Следовательно, в этом случае вы должны сделать что-то вроде:

pid_t pid;
pid = vfork();
if (pid == 0) { /* child */
    reboot(0x1234567);
    _exit(EXIT_SUCCESS);
}
while (1); /* Parent (init) waits */
person Arnout    schedule 15.05.2017