Bug 51235

Summary: sysvinit/reboot не работает с отдельным /usr после обновления p10 -> p11
Product: Sisyphus Reporter: Sergey Y. Afonin <asy>
Component: startupAssignee: Alexey Gladkov <legion>
Status: NEW --- QA Contact: qa-sisyphus
Severity: critical    
Priority: P5 CC: arseny, cas, glebfm, ldv, legion, legion, placeholder
Version: unstable   
Hardware: x86_64   
OS: Linux   
Attachments:
Description Flags
Картинка с финальными сообщениями
none
A proposed fix
none
A proposed fix v2 none

Description Sergey Y. Afonin 2024-08-22 08:32:12 MSK
Обновил вчера стартеркит p10 до p11, перестал работать reboot. Система тормозится, но финальная перезагрузка не происходит. Может быть, на самом деле, надо sysvinit вешать:

# rpm -qf /sbin/reboot
sysvinit-3.00-alt2.i586
Comment 1 Sergey Y. Afonin 2024-08-22 08:32:53 MSK
Created attachment 16672 [details]
Картинка с финальными сообщениями

Картинка с финальными сообщениями
Comment 2 Sergey Y. Afonin 2024-08-22 08:33:57 MSK
Filesystem      Size  Used Avail Use% Mounted on

runfs           990M  2,1M  988M   1% /run
shmfs           990M     0  990M   0% /dev/shm
tmpfs           990M  4,0K  990M   1% /tmp
udevfs          5,0M     0  5,0M   0% /dev

/dev/sda2       989M   76M  846M   9% /boot
/dev/sda5       7,8G   26M  7,4G   1% /
/dev/sda6        29G  4,6G   23G  17% /usr
/dev/sda7        29G  2,0G   26G   8% /var
/dev/sda8        36G   76M   34G   1% /home
Comment 3 Sergey Y. Afonin 2024-08-22 10:57:57 MSK
(In reply to Sergey Y. Afonin from comment #0)

> Может быть, на самом деле, надо на sysvinit вешать:
> 
> # rpm -qf /sbin/reboot
> sysvinit-3.00-alt2.i586

А действительно, почему "Unmounting filesystem [/usr]"? Надо remount в ro наверное?
Comment 4 Sergey Y. Afonin 2024-08-22 11:09:22 MSK
И, даже, startup:

# rpm -qf /etc/rc.d/init.d/halt
startup-0.9.9.16-alt1.noarch

Такой вот хак помогает:

--- halt.bak    2022-11-22 21:23:42.000000000 +0400
+++ halt        2024-08-22 12:02:37.874568993 +0400
@@ -159,10 +159,10 @@
        'Unmounting loopback filesystem (retry)'

 # Unmount all the rest.
-UnmountFilesystems 3 5 \
-       '$2 != "/" && $2 !~ /^\/(dev|proc|sys)(\/.*)?$/ && $1 !~ /^none$/ {print $2}' \
-       'Unmounting filesystem' \
-       'Unmounting filesystem (retry)'
+#UnmountFilesystems 3 5 \
+#      '$2 != "/" && $2 !~ /^\/(dev|proc|sys)(\/.*)?$/ && $1 !~ /^none$/ {print $2}' \
+#      'Unmounting filesystem' \
+#      'Unmounting filesystem (retry)'

 # Turn off encrypted block devices
 cryptdisks_exe=/etc/rc.d/scripts/cryptdisks

Но надо, наверное, как-то аккуратнее сделать.
Comment 5 Sergey Y. Afonin 2024-08-22 13:11:25 MSK
(In reply to Sergey Y. Afonin from comment #4)

> И, даже, startup:
> 
> # rpm -qf /etc/rc.d/init.d/halt
> startup-0.9.9.16-alt1.noarch

Хотя в p10 startup тот же самый. Вопрос тогда открытый, что на это повлияло.
Comment 6 Sergey Y. Afonin 2024-08-28 09:05:32 MSK
Что-то я сразу внимания не обратил. В p10 sysvinit 2.88 c /sbin/reboot, а в p11 sysvinit 3.00 c /usr/sbin/reboot, так что понятно, почему раньше работало со startup 0.9.9.16.

Кого, в итоге, считать виновным?
Comment 7 Arseny Maslennikov 2024-08-28 12:43:33 MSK
systemd для себя давно решил эту проблему, они исполняют программу systemd-shutdown.

man systemd-shutdown(8):
       PID 1 is
       replaced by the /usr/lib/systemd/systemd-shutdown tool
       which is then responsible for the actual shutdown.
       Before shutting down, this binary will try to unmount
       all remaining file systems (or at least remount them
       read-only), disable all remaining swap devices, detach
       all remaining storage devices and kill all remaining
       processes.
Comment 8 Arseny Maslennikov 2024-08-28 12:44:41 MSK
(In reply to Sergey Y. Afonin from comment #6)
> Что-то я сразу внимания не обратил. В p10 sysvinit 2.88 c /sbin/reboot, а в
> p11 sysvinit 3.00 c /usr/sbin/reboot, так что понятно, почему раньше
> работало со startup 0.9.9.16.
> 
> Кого, в итоге, считать виновным?

Судя по всему, надо в p11 в startup считать /usr неотключаемым вдобавок к / (вместо их размонтирования переводить в ro — этого же достаточно для корректного завершения работы?). Я не очень хорошо представляю себе код startup, но вряд ли они там используют при выключении код, запущенный с момента загрузки.

Это аналогично поведению initrd при старте (/usr считается необходимым для pivot root)
Comment 9 Sergey Y. Afonin 2024-08-29 09:07:53 MSK
Наверное вот так как-то:

--- halt.bak    2022-11-22 21:23:42.000000000 +0400
+++ halt        2024-08-29 10:05:26.043098571 +0400
@@ -160,7 +160,7 @@

 # Unmount all the rest.
 UnmountFilesystems 3 5 \
-       '$2 != "/" && $2 !~ /^\/(dev|proc|sys)(\/.*)?$/ && $1 !~ /^none$/ {print $2}' \
+       '$2 != "/" && $2 !~ /^\/(dev|proc|sys|usr)(\/.*)?$/ && $1 !~ /^none$/ {print $2}' \
        'Unmounting filesystem' \
        'Unmounting filesystem (retry)'

@@ -189,6 +189,9 @@
 action 'Remounting remaining filesystems (if any) read-only:' \
        umount -afnr -t noproc,nosysfs,notmpfs,nodevfs,nodevtmpfs,nousbfs,norpc_pipefs,nonfsd
 action 'Remounting root filesystem read-only:' mount -n -o remount,ro /
+if [ -n "`mount | grep " /usr "`" ]; then
+       action 'Remounting /usr filesystem read-only:' mount -n -o remount,ro /usr
+fi

 # See if this is a powerfail situation.
 UPSCTL=/etc/apcupsd/apccontrol
Comment 10 Sergey Y. Afonin 2024-09-05 11:40:26 MSK
(In reply to Sergey Y. Afonin from comment #9)

> Наверное вот так как-то:

Ну так что? Или NMU делать?
Comment 11 Arseny Maslennikov 2024-09-06 13:12:04 MSK
(In reply to Sergey Y. Afonin from comment #10)
> (In reply to Sergey Y. Afonin from comment #9)
> 
> > Наверное вот так как-то:
> 
> Ну так что? Или NMU делать?

Надо скоординироваться с https://git.altlinux.org/tasks/356953 в любом случае.
Comment 12 Arseny Maslennikov 2024-09-06 13:17:42 MSK
(In reply to Sergey Y. Afonin from comment #9)
> Наверное вот так как-то:
> 
> --- halt.bak    2022-11-22 21:23:42.000000000 +0400
> +++ halt        2024-08-29 10:05:26.043098571 +0400

1) Лучше проводить развёртку в обратном порядке: `/usr` стартует после `/`, останавливается перед `/`.
2) Есть же программа mountpoint, зачем городить `test -n "$(mount | grep ' /usr ')"`.

@@ -189,6 +189,9 @@
 action 'Remounting remaining filesystems (if any) read-only:' \
        umount -afnr -t noproc,nosysfs,notmpfs,nodevfs,nodevtmpfs,nousbfs,norpc_pipefs,nonfsd
+if mountpoint -q /usr; then
+       action 'Remounting /usr filesystem read-only:' mount -n -o remount,ro /usr
+fi
 action 'Remounting root filesystem read-only:' mount -n -o remount,ro /

 # See if this is a powerfail situation.
 UPSCTL=/etc/apcupsd/apccontrol

Я, конечно, не мейнтейнер startup.
Comment 13 Arseny Maslennikov 2024-09-06 14:15:26 MSK
Created attachment 16806 [details]
A proposed fix
Comment 14 Arseny Maslennikov 2024-09-06 14:25:18 MSK
Created attachment 16807 [details]
A proposed fix v2

Забыл Suggested-by; /usr в теории может быть среди особых классов точек монтирования (autofs и loop devices)
Comment 15 Sergey Y. Afonin 2024-09-11 08:16:15 MSK
(In reply to Arseny Maslennikov from comment #12)

> 2) Есть же программа mountpoint, зачем городить `test -n "$(mount | grep '
> /usr ')"`.

$ rpm -qf /bin/mountpoint
sysvinit-utils-2.88-alt5

Если в системе без sysvinit это точно не нужно, то можно и mountpoint использовать.
Comment 16 Sergey Y. Afonin 2024-09-17 12:26:51 MSK
Какое будет чьё-нибудь волевое решение? :-)

И, наверное, баг critical для хостов на необслуживаемых площадках. А то и bloker. Это про "sync && reboot -f" надо не забыть...
Comment 17 Sergey Y. Afonin 2024-10-21 19:14:47 MSK
(In reply to Arseny Maslennikov from comment #14)

> Created attachment 16807 [details]
> A proposed fix v2

Кто приложит и обновит? Или я NMU отправлю с этим вот вариантом. Скажем, в среду.
Comment 18 Sergey Y. Afonin 2024-10-28 14:24:40 MSK
https://git.altlinux.org/tasks/360974

кто заапрувит?
Comment 19 Sergey Y. Afonin 2024-11-05 16:13:45 MSK
(In reply to Sergey Y. Afonin from comment #18)

> https://git.altlinux.org/tasks/360974
> 
> кто заапрувит?

Неделя прошла...
Comment 20 Dmitry V. Levin 2024-11-11 17:56:50 MSK
Наверное, новые выражения на awk выполняют свою работу, но у меня рука не поднимается такое аппрувить:

-       '$2 != "/" && (($3 == "supermount") || ($3 == "autofs") || ($3 == "autofs4")) {print $2}' \
+       '$2 != "/" && $2 != "/usr" && ($3 ~ "^(supermount|autofs[0-9]*)$") {print $2}' \

-       '$2 != "/" && $1 ~ /^\/dev\/loop/ {print $2}' \
+       '$2 != "/" && $2 != "/usr" && $1 ~ /^\/dev\/loop/ {print $2}' \

-       '$2 != "/" && $2 !~ /^\/(dev|proc|sys)(\/.*)?$/ && $1 !~ /^none$/ {print $2}' \
+       '$2 != "/" && $2 != "/usr" && $2 !~ /^\/(dev|proc|sys)(\/.*)?$/ && $1 !~ /^none$/ {print $2}' \
Comment 21 Arseny Maslennikov 2024-11-11 18:11:33 MSK
(In reply to Dmitry V. Levin from comment #20)
> Наверное, новые выражения на awk выполняют свою работу, но у меня рука не
> поднимается такое аппрувить:
> 
> -       '$2 != "/" && (($3 == "supermount") || ($3 == "autofs") || ($3 ==
> "autofs4")) {print $2}' \
> +       '$2 != "/" && $2 != "/usr" && ($3 ~ "^(supermount|autofs[0-9]*)$")
> {print $2}' \
> 
> -       '$2 != "/" && $1 ~ /^\/dev\/loop/ {print $2}' \
> +       '$2 != "/" && $2 != "/usr" && $1 ~ /^\/dev\/loop/ {print $2}' \
> 
> -       '$2 != "/" && $2 !~ /^\/(dev|proc|sys)(\/.*)?$/ && $1 !~ /^none$/
> {print $2}' \
> +       '$2 != "/" && $2 != "/usr" && $2 !~ /^\/(dev|proc|sys)(\/.*)?$/ &&
> $1 !~ /^none$/ {print $2}' \
У Сергея было по-другому (comment 9), но в том варианте было написано, что, выключаясь, следует не стопить не только сам /usr, но и все точки монтирования под ним, если таковые имеются. Либо это помешает потом сделать `mount -o remount,ro /usr`, либо не помешает, но тогда это просто неряшливо.
Comment 22 Arseny Maslennikov 2024-11-11 18:14:34 MSK
(In reply to Dmitry V. Levin from comment #20)
> Наверное, новые выражения на awk выполняют свою работу, но у меня рука не
> поднимается такое аппрувить:
> 
> -       '$2 != "/" && (($3 == "supermount") || ($3 == "autofs") || ($3 ==
> "autofs4")) {print $2}' \
> +       '$2 != "/" && $2 != "/usr" && ($3 ~ "^(supermount|autofs[0-9]*)$")
> {print $2}' \
> 
> -       '$2 != "/" && $1 ~ /^\/dev\/loop/ {print $2}' \
> +       '$2 != "/" && $2 != "/usr" && $1 ~ /^\/dev\/loop/ {print $2}' \
> 
> -       '$2 != "/" && $2 !~ /^\/(dev|proc|sys)(\/.*)?$/ && $1 !~ /^none$/
> {print $2}' \
> +       '$2 != "/" && $2 != "/usr" && $2 !~ /^\/(dev|proc|sys)(\/.*)?$/ &&
> $1 !~ /^none$/ {print $2}' \

Если нужный awk позволяет вместо двух сравнений с "/" и "/usr" написать `!~ /\/(usr)?/`, то, наверное, это тоже допустимый вариант.
Comment 23 Sergey Y. Afonin 2024-11-11 21:06:21 MSK
(In reply to Dmitry V. Levin from comment #20)
> Наверное, новые выражения на awk выполняют свою работу, но у меня рука не
> поднимается такое аппрувить:
> 
> -       '$2 != "/" && (($3 == "supermount") || ($3 == "autofs") || ($3 ==
> "autofs4")) {print $2}' \
> +       '$2 != "/" && $2 != "/usr" && ($3 ~ "^(supermount|autofs[0-9]*)$")
> {print $2}' \
> 
> -       '$2 != "/" && $1 ~ /^\/dev\/loop/ {print $2}' \
> +       '$2 != "/" && $2 != "/usr" && $1 ~ /^\/dev\/loop/ {print $2}' \
> 
> -       '$2 != "/" && $2 !~ /^\/(dev|proc|sys)(\/.*)?$/ && $1 !~ /^none$/
> {print $2}' \
> +       '$2 != "/" && $2 != "/usr" && $2 !~ /^\/(dev|proc|sys)(\/.*)?$/ &&
> $1 !~ /^none$/ {print $2}' \

А чем отличаются эти строки, кроме добавления && $2 != "/usr" ?

Ну и, на самом деле, надо уже что-то сделать, а то зависание по команде reboot - это явная проблема, не имеющая отношения к перфекционизму.
Comment 24 Sergey Y. Afonin 2024-11-15 10:28:57 MSK
(In reply to Dmitry V. Levin from comment #20)

> Наверное, новые выражения на awk выполняют свою работу, но у меня рука не
> поднимается такое аппрувить:

Ау. Напишите так, чтобы рука поднялась.

(In reply to Sergey Y. Afonin from comment #23)

> то зависание по команде reboot - это явная проблема

Надо что, на десятке-другом компьютеров систему переустанавливать, чтобы от /usr избавиться?