Перезагрузка в образе initrd
Я ищу метод для перезапуска / сброса моей системы Linux из скрипта init-bottom *. Во время выполнения моего скрипта система находится в /root, и у меня есть доступ к busybox.
Но команда "перезагрузка", которая является частью моего busybox, не работает. Есть ли другая возможность?
Моя система загружается нормально с образом initramfs, и мой скрипт в конечном итоге вызывает процесс обновления. Новый systemd, поставляемый с Debian, раздражает это. Но с перезагрузкой все нормально.
2 ответа
Я нашел это:
echo b >/proc/sysrq-trigger
(это как нажатие клавиш CTRL+ALT+DEL)
Если вы -are- init (PID вашего процесса / скрипта равен 0), то запуск программы перезагрузки busybox не будет работать, так как она попытается подать сигнал init (который не запущен) для перезагрузки.
Вместо этого, как PID 0, вы должны делать то, что сделал бы init. Это вызов правильного API ядра для перезагрузки. Смотрите Man reboot(2) для подробностей.
Предполагая, что вы запускаете программу переменного тока или что-то, можно сделать:
#include <unistd.h>
#include <sys/reboot.h>
void main() { reboot(0x1234567); }
Это намного лучше, чем выполнение триггера sysrq, который будет действовать скорее как панический перезапуск, чем чистый перезапуск.
В заключение отметим, что init в busybox фактически разветвляет процесс для его перезагрузки. Это потому, что перезагрузка systemcall на самом деле также существует программа, и система никогда не должна работать без процесса инициализации (который также будет паниковать ядро). Следовательно, в этом случае вы бы сделали что-то вроде:
pid_t pid;
pid = vfork();
if (pid == 0) { /* child */
reboot(0x1234567);
_exit(EXIT_SUCCESS);
}
while (1); /* Parent (init) waits */