Bug 53410

Summary: Не работают busybox reboot, poweroff, halt
Product: Sisyphus Reporter: Artem Varaksa <varaksaaa>
Component: busyboxAssignee: Vitaly Chikunov <vt>
Status: CLOSED WONTFIX QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: antohami, vt
Version: unstable   
Hardware: x86_64   
OS: Linux   
Attachments:
Description Flags
busybox-reboot.strace.txt
none
busybox-poweroff.strace.txt
none
busybox-halt.strace.txt none

Description Artem Varaksa 2025-03-12 12:48:07 MSK
Created attachment 17955 [details]
busybox-reboot.strace.txt

Шаги
====

По ssh или в tty:

# busybox reboot
# busybox poweroff
# busybox halt

Фактический результат
=====================

Ничего не происходит. Команды завершаются успешно и ничего не выводят.

strace прикреплён.

Ожидаемый результат
===================

Перезагрузка, выключение, остановка системы.

Воспроизводимость
=================

Воспроизводится на виртуальных машинах:

[p11+377443] [sisyphus] ALT Server 11.0 beta20250213 x86_64
busybox-1.37.0-alt1.x86_64

[p11] ALT Workstation 11.0 beta20250213 x86_64
busybox-1.36.1-alt1.x86_64
Comment 1 Artem Varaksa 2025-03-12 12:48:26 MSK
Created attachment 17956 [details]
busybox-poweroff.strace.txt
Comment 2 Artem Varaksa 2025-03-12 12:48:36 MSK
Created attachment 17957 [details]
busybox-halt.strace.txt
Comment 3 Vitaly Chikunov 2025-03-12 23:27:27 MSK
busybox не заменяет всю систему, это минималистичная утилита для работы в ограниченной среде - initrd, контейнеров или для rescue. Философия busybox предоставлять только минимум необходимого функционала без удобств и 100% совместимости с полной системой - тот функционал который он предоставляет можно использовать если использовать правильно.

Данное поведение as intended - поддержки sysv/systemd нет так как есть поддержка bbox init, которая более важна - а если у вас есть полная система, то вам не нужен минималистичный функционал busybox.

[Однако, для чего-то может быть полезно сделать совместимость в будущих версиях, добавлю это в todo.]

Сейчас можно сделать ребут добавив опцию -f (которая обходит init):

  busybox reboot -f
Comment 4 Vitaly Chikunov 2025-05-07 01:02:12 MSK
Я сначала закодил эту фичу, но теперь решил, что это misuse для busybox и не буду ее добавлять.

На всякий случай diff
```
diff --git a/init/halt.c b/init/halt.c
index 7aea8cfec..0afefccc0 100644
--- a/init/halt.c
+++ b/init/halt.c
@@ -38,7 +38,7 @@
 //config:config FEATURE_CALL_TELINIT
 //config:        bool "Call telinit on shutdown and reboot"
 //config:        default y
-//config:        depends on (HALT || POWEROFF || REBOOT) && !INIT
+//config:        depends on (HALT || POWEROFF || REBOOT)
 //config:        help
 //config:        Call an external program (normally telinit) to facilitate
 //config:        a switch to a proper runlevel.
@@ -220,12 +220,8 @@ int halt_main(int argc UNUSED_PARAM, char **argv)
                 }
                 if (rc) {
                         /* talk to init */
-                        if (!ENABLE_FEATURE_CALL_TELINIT) {
-                                /* bbox init assumed */
-                                rc = kill(1, signals[which]);
-                                if (init_was_not_there())
-                                        rc = kill(1, signals[which]);
-                        } else {
+                        if (ENABLE_FEATURE_CALL_TELINIT &&
+                                !access(CONFIG_TELINIT_PATH, F_OK)) {
                                 /* SysV style init assumed */
                                 /* runlevels:
                                  * 0 == shutdown
@@ -238,6 +234,12 @@ int halt_main(int argc UNUSED_PARAM, char **argv)
                                 bb_perror_msg_and_die("can't execute '%s'",
                                                 CONFIG_TELINIT_PATH);
                         }
+                        if (ENABLE_INIT) {
+                                /* bbox init assumed */
+                                rc = kill(1, signals[which]);
+                                if (init_was_not_there())
+                                        rc = kill(1, signals[which]);
+                        }
                 }
         } else {
                 rc = reboot(magic[which]);

diff --git a/config b/config
index 74f27f192..16c40640a 100644
--- a/config
+++ b/config
@@ -507,8 +507,8 @@ CONFIG_HALT=y
 CONFIG_POWEROFF=y
 CONFIG_REBOOT=y
 CONFIG_FEATURE_WAIT_FOR_INIT=y
-# CONFIG_FEATURE_CALL_TELINIT is not set
-CONFIG_TELINIT_PATH=""
+CONFIG_FEATURE_CALL_TELINIT=y
+CONFIG_TELINIT_PATH="/sbin/telinit"
 CONFIG_INIT=y
 CONFIG_LINUXRC=y
 CONFIG_FEATURE_USE_INITTAB=y
```