Bug 40900

Summary: не работает в hasher, так как требует /dev/fd/62
Product: Sisyphus Reporter: Антон Мидюков <antohami>
Component: make-initrdAssignee: Alexey Gladkov <legion>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: major    
Priority: P5 CC: glebfm, klark, ldv, legion, mike, placeholder
Version: unstable   
Hardware: all   
OS: Linux   
See Also: https://bugzilla.altlinux.org/show_bug.cgi?id=41543
Bug Depends on:    
Bug Blocks: 33000    
Attachments:
Description Flags
make-initrd при сборке образа img в mkimage-profiles none

Description Антон Мидюков 2021-09-12 20:29:38 MSK
Created attachment 9660 [details]
make-initrd при сборке образа img в mkimage-profiles

make-initrd 2.23.0 при выполнении в hasher завершается ошибкой:

make-initrd -N -v -k 5.10.63-std-def-alt2 AUTODETECT= 'FEATURES+=add-modules compress cleanup kbd rdshell rootfs usb qemu'
[...]
Sorting sysvinit services ...
/usr/share/make-initrd/tools/sort-services: line 376: /dev/fd/62: No such file or directory
make[2]: *** [/usr/share/make-initrd/mk/make-initrd.mk:127: pack] Error 1

Также присутствует ещё одна не критическая ошибка:
/usr/share/make-initrd/tools/find-terminfo: line 59: /dev/fd/62: No such file or directory
Comment 1 Alexey Gladkov 2021-09-12 21:22:07 MSK
Это требует bash.

$ ls -la /dev/fd
lrwxrwxrwx 1 root root 13 сен 12 18:01 /dev/fd -> /proc/self/fd/
Comment 2 Alexey Gladkov 2021-09-12 21:32:00 MSK
$ git grep readarray |cut -d: -f1,2
features/kickstart/data/bin/kickstart-sh-storage:572
features/kickstart/data/bin/kickstart-sh-storage:581
features/kickstart/data/bin/kickstart-sh-storage:596
guess/smart-card/action:11
tools/find-terminfo:59
tools/find-terminfo:61
tools/find-udev-rule-externals:9
tools/sort-services:376

Как минимум sort-services и find-terminfo используют эту конструкцию и должны выполняться в чруте. Видимо, вам раньше везло. В чруте должен быть смонтирован proc. Вам нужно использовать --mountpoints=/proc.
Comment 3 Антон Мидюков 2021-09-12 21:41:38 MSK
(In reply to Alexey Gladkov from comment #2)
> $ git grep readarray |cut -d: -f1,2
> features/kickstart/data/bin/kickstart-sh-storage:572
> features/kickstart/data/bin/kickstart-sh-storage:581
> features/kickstart/data/bin/kickstart-sh-storage:596
> guess/smart-card/action:11
> tools/find-terminfo:59
> tools/find-terminfo:61
> tools/find-udev-rule-externals:9
> tools/sort-services:376
> 
> Как минимум sort-services и find-terminfo используют эту конструкцию и
> должны выполняться в чруте. Видимо, вам раньше везло.

Везло, потому что раньше sort-services не использовался:
https://github.com/osboot/make-initrd/commit/98a55825bb044b2a78cd25e3918af51431d7b5a4

Да и terminfo тоже:
https://github.com/osboot/make-initrd/commit/7537d23fabecc9eca00015a3cf7e82d362c4250d

> В чруте должен быть
> смонтирован proc. Вам нужно использовать --mountpoints=/proc.

Понятно, но не радует. С этим ничего нельзя поделать и придётся с этим жить?
Comment 4 Leonid Krivoshein 2021-09-12 21:57:19 MSK
А у меня на другом вывалился:

[00:00:04] Packing image to archive ...
touch: setting times of './mtab': Read-only file system
make[2]: *** [/usr/share/make-initrd/mk/make-initrd.mk:129: pack] Error 1
make[1]: *** [/usr/share/make-initrd/mk/make-initrd.mk:187: process-config] Error 2
make: *** [/usr/share/make-initrd/mk/make-initrd.mk:177: all] Error 1
+ fatal 'make-initrd failed'
Comment 5 Alexey Gladkov 2021-09-12 22:03:27 MSK
(Ответ для Антон Мидюков на комментарий #3)
> Везло, потому что раньше sort-services не использовался:
> https://github.com/osboot/make-initrd/commit/
> 98a55825bb044b2a78cd25e3918af51431d7b5a4
> 
> Да и terminfo тоже:
> https://github.com/osboot/make-initrd/commit/
> 7537d23fabecc9eca00015a3cf7e82d362c4250d

Да. Эти конструкции уже были, но так получалось, что они не вызывались в чруте.

> Понятно, но не радует. С этим ничего нельзя поделать и придётся с этим жить?

Я сначала подумал, что можно попробовать заменить в данных скриптах код на другой, но это как по минному полю идти. Неизвестно, где bash захочет использовать /dev/fd в следующий раз. Так что я склонен сказазать, что да, proc нужен. Он в принципе нужен (как и sysfs) для работы make-initrd в обычных условиях.
Comment 6 Alexey Gladkov 2021-09-12 22:06:06 MSK
(Ответ для Leonid Krivoshein на комментарий #4)
> А у меня на другом вывалился:
> 
> [00:00:04] Packing image to archive ...
> touch: setting times of './mtab': Read-only file system
> make[2]: *** [/usr/share/make-initrd/mk/make-initrd.mk:129: pack] Error 1
> make[1]: *** [/usr/share/make-initrd/mk/make-initrd.mk:187: process-config]
> Error 2
> make: *** [/usr/share/make-initrd/mk/make-initrd.mk:177: all] Error 1
> + fatal 'make-initrd failed'

Нужно больше информации. Где запускалось ?
Comment 7 Leonid Krivoshein 2021-09-12 22:12:36 MSK
(In reply to Alexey Gladkov from comment #6)
> Нужно больше информации. Где запускалось ?
make-initrd запускался из mkimage и относительно свежего m-p, но хост на p8 и зеркало Сизифа отстаёт на несколько месяцев. До этой версии собиралось нормально. Сейчас пытаюсь найти, в чём ошибка.
Comment 8 Антон Мидюков 2021-09-12 22:14:07 MSK
(In reply to Alexey Gladkov from comment #6)
> (Ответ для Leonid Krivoshein на комментарий #4)
> > А у меня на другом вывалился:
> > 
> > [00:00:04] Packing image to archive ...
> > touch: setting times of './mtab': Read-only file system
> > make[2]: *** [/usr/share/make-initrd/mk/make-initrd.mk:129: pack] Error 1
> > make[1]: *** [/usr/share/make-initrd/mk/make-initrd.mk:187: process-config]
> > Error 2
> > make: *** [/usr/share/make-initrd/mk/make-initrd.mk:177: all] Error 1
> > + fatal 'make-initrd failed'
> 
> Нужно больше информации. Где запускалось ?

Я добавил /proc и получил эту же ошибку. В hasher та же команда.
Comment 9 Leonid Krivoshein 2021-09-12 22:16:05 MSK
(In reply to Leonid Krivoshein from comment #7)
> Сейчас пытаюсь найти, в чём ошибка.
tools/create-initrd:ln -s /proc/self/mounts ./etc/mtab
Скорее всего, причина общая.

...

touch: setting times of './mtab': Read-only file system
Comment 10 Alexey Gladkov 2021-09-12 22:17:40 MSK
А вот это уже стоит исправить.
Comment 11 Alexey Gladkov 2021-09-12 22:20:12 MSK
(Ответ для Leonid Krivoshein на комментарий #9)
> (In reply to Leonid Krivoshein from comment #7)
> > Сейчас пытаюсь найти, в чём ошибка.
> tools/create-initrd:ln -s /proc/self/mounts ./etc/mtab
> Скорее всего, причина общая.

В create-initrd создаётся внешний симлинк, а pack-image делает touch на этот симлинк [1]. Нельзя там ходить по симлинкам.

[1] https://github.com/osboot/make-initrd/blob/master/tools/pack-image#L29
Comment 12 Alexey Gladkov 2021-09-12 22:23:34 MSK
Патч должен быть типа:

diff --git a/tools/pack-image b/tools/pack-image
index ea90dcc29..7dfd7efbc 100755
--- a/tools/pack-image
+++ b/tools/pack-image
@@ -26,7 +26,7 @@ printf >> "$workdir"/initcpio 'nod ./dev/%s\n' \
        "console 0600 0 0 c 5 1" \
        "ptmx    0666 0 0 c 5 2"
 
-find . -execdir touch -c -m --date="1970-01-01 00:00:00 +0000" '{}' '+'
+find -P . -type f -execdir touch -c -m --date="1970-01-01 00:00:00 +0000" '{}' '+'
 
 sort "$workdir"/initcpio |
        gen_init_cpio -t 0 - > "$outfile"
Comment 13 Alexey Gladkov 2021-09-12 22:27:19 MSK
Можете подтвердить фикс ?
Comment 14 Leonid Krivoshein 2021-09-12 23:16:41 MSK
(In reply to Alexey Gladkov from comment #13)
> Можете подтвердить фикс ?
По крайней мере, с этим патчем проходит дальше и initrd создаётся:
[00:00:05] Packing image to archive ...
[00:00:05] Compressing image ...
...
Остальное сейчас проверяется.
Comment 15 Leonid Krivoshein 2021-09-12 23:23:07 MSK
(In reply to Leonid Krivoshein from comment #14)
> (In reply to Alexey Gladkov from comment #13)
> > Можете подтвердить фикс ?
> Остальное сейчас проверяется.
Да, патч решил проблему, make-initrd вполне рабочий.
Comment 16 Leonid Krivoshein 2021-09-12 23:45:12 MSK
(In reply to Leonid Krivoshein from comment #15)
> Да, патч решил проблему, make-initrd вполне рабочий.
Но на сборке образов с графикой тоже вылезла сабжевая ошибка с /dev/fd/62. Антон, я правильно понимаю, что это уже надо исправлять в профиле?
Comment 17 Alexey Gladkov 2021-09-12 23:53:55 MSK
(Ответ для Leonid Krivoshein на комментарий #15)
> Да, патч решил проблему, make-initrd вполне рабочий.

Ок. Завтра сделаю новую сборку с патчем.
Comment 18 Антон Мидюков 2021-09-13 03:53:25 MSK
(In reply to Leonid Krivoshein from comment #16)
> (In reply to Leonid Krivoshein from comment #15)
> > Да, патч решил проблему, make-initrd вполне рабочий.
> Но на сборке образов с графикой тоже вылезла сабжевая ошибка с /dev/fd/62.
> Антон, я правильно понимаю, что это уже надо исправлять в профиле?

Да. Нужно добавить:
@$(call set,GLOBAL_HSH_PROC,1)
http://git.altlinux.org/people/antohami/packages/mkimage-profiles.git?p=mkimage-profiles.git;a=commitdiff;h=c1efb923eac56c64f7dc6738bae284922e49c09b
Comment 19 Leonid Krivoshein 2021-09-13 04:08:12 MSK
(In reply to Антон Мидюков from comment #3)
> (In reply to Alexey Gladkov from comment #2)
> > В чруте должен быть
> > смонтирован proc. Вам нужно использовать --mountpoints=/proc.
> С этим ничего нельзя поделать и придётся с этим жить?
Коллеги, вы уверены, что в чруте mkimage нужен настоящий /proc с хоста? Может тут вполне достаточно фейкового каталога с симлинками? Не должно же быть косвенного влияния на образы с машины, на которой они генерируются.
Comment 20 Alexey Gladkov 2021-09-13 12:06:55 MSK
(Ответ для Leonid Krivoshein на комментарий #19)
> > > В чруте должен быть
> > > смонтирован proc. Вам нужно использовать --mountpoints=/proc.
> > С этим ничего нельзя поделать и придётся с этим жить?
> Коллеги, вы уверены, что в чруте mkimage нужен настоящий /proc с хоста?

Нет такого понятия как proc с хоста. Есть proc из определённого pid namespace.

> Может тут вполне достаточно фейкового каталога с симлинками?

/proc/self/fd нельзя сэмулировать.

> Не должно же быть косвенного влияния на образы с машины, на которой они генерируются.

proc предоставляет не только информацию о системе, но и о процессах. Если монтировать proc правильно, то доступа к информации о системе не будет.
Comment 21 Антон Мидюков 2021-09-13 12:10:24 MSK
(In reply to Alexey Gladkov from comment #20)
> Если монтировать proc правильно, то доступа к информации о системе не будет.

А mkimage правильно монтирует /proc?
Comment 22 Alexey Gladkov 2021-09-13 12:29:30 MSK
(Ответ для Антон Мидюков на комментарий #21)
> (In reply to Alexey Gladkov from comment #20)
> > Если монтировать proc правильно, то доступа к информации о системе не будет.
> 
> А mkimage правильно монтирует /proc?

Правильнее спрашивать правильно ли монтирует proc хэшер. Он это делает правильно. В том смысле, что "чужих" процессов в чруте не видно, а доступ к системной информации открыт лишь от пользователя. В новых ядрах можно исключить системную информацию совсем оставив только /proc/[pid], но хэшер не умеет так монтировать proc.
Comment 23 Repository Robot 2021-09-13 15:33:25 MSK
make-initrd-2.23.0-alt2 -> sisyphus:

 Mon Sep 13 2021 Alexey Gladkov <legion@altlinux.ru> 2.23.0-alt2
 - Set mtime only for regular files (ALT#40900).