Bug 30351

Summary: cp: cannot create hard link
Product: Sisyphus Reporter: Радюк Михаил <torabora08>
Component: mkimageAssignee: Michael Shigorin <mike>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: enp, evg, glebfm, ildar, kostyalamer, legion, mistor-klimaks, shaba, snejok
Version: unstable   
Hardware: all   
OS: Linux   

Description Радюк Михаил 2014-09-23 23:11:25 MSK
При попытке собрать дистро на mkimage-profiles ловлю ошибку:
mki-copy-our2out: has started executing.
'./live' -> '/tmp/.private/mike/mkimage-profiles.build.BpNTgGc/live/.work/.out/live'
cp: cannot create hard link
'/tmp/.private/mike/mkimage-profiles.build.BpNTgGc/live/.work/.out/live'
to './live': Operation not permitted

$ rpm -qa | grep mkimage
mkimage-0.2.12.1-alt1
mkimage-preinstall-0.2.12.1-alt1

Установка Сизифных версий помогла только до перезагрузки. До перезагрузки также помогает обход вида: 'echo 0 > /proc/sys/fs/protected_hardlinks' (спасибо Константину Четверикову).
Comment 1 Michael Shigorin 2014-09-24 17:45:35 MSK
mkimage-preinstall делает такое echo сам:

$ rpm -q --scripts mkimage-preinstall
postinstall scriptlet (through /bin/sh):
if grep -Fqsx 1 "/proc/sys/fs/protected_hardlinks"; then
        echo "mkimage-preinstall: allowing to hardlink non-owned files..." >&2
        echo 0 > /proc/sys/fs/protected_hardlinks
fi

и создаёт /etc/sysctl.d/mkimage.conf на случай перезагрузки.

Если установка mkimage-preinstall приводит к выставлению содержимого /proc/sys/fs/protected_hardlinks в 0, а перезагрузка после этого -- нет, то надо понять, что сломалось в системе (с учётом того, что /etc/sysctl.d/ живёт в filesystem, а action 'Configuring kernel parameters:' происходит в /etc/rc.d/rc.sysinit по крайней мере на системах с sysvinit).
Comment 2 Michael Shigorin 2014-10-08 01:39:16 MSK
Так, а что говорит chkconfig --list sysfs ?
Comment 3 Радюк Михаил 2014-10-08 19:59:44 MSK
Говорит, что он не добавлен:
chkconfig --list sysfs

Внимание: в выводе отображены только SysV службы (нативные службы systemd отсутствуют)
      конфигурация SysV  может быть сброшена нативной
      конфигураией systemd.

сервис sysfs поддерживает chkconfig, но не используется ни на одном уровне выполнения (запустите 'chkconfig --add sysfs')
Comment 4 Michael Shigorin 2014-10-08 22:52:10 MSK
Вот, теперь понятно.  Просьба глянуть 0.2.17:
ttp://git.altlinux.org/tasks/131779/
Comment 5 Michael Shigorin 2014-10-08 22:52:36 MSK
http://git.altlinux.org/tasks/131779/
Comment 6 Радюк Михаил 2014-10-10 19:52:25 MSK
Хм, почему-то не помогло.
rpm -qa | grep mkimage
mkimage-0.2.17-alt1
mkimage-preinstall-0.2.17-alt1
Comment 7 Michael Shigorin 2014-10-13 22:36:31 MSK
(В ответ на комментарий №6)
> Хм, почему-то не помогло.
А что теперь говорит chkconfig --list sysfs ?
Comment 8 Радюк Михаил 2014-10-14 13:19:14 MSK
$  chkconfig --list sysfs 

Внимание: в выводе отображены только SysV службы (нативные службы systemd отсутствуют)
      конфигурация SysV  может быть сброшена нативной
      конфигураией systemd.

sysfs           0:выкл  1:выкл  2:вкл   3:вкл   4:вкл   5:вкл   6:выкл


#cat /proc/sys/fs/protected_hardlinks
1
Comment 9 Michael Shigorin 2014-10-16 00:09:50 MSK
(В ответ на комментарий №8)
> $  chkconfig --list sysfs 
[...]
> sysfs           0:выкл  1:выкл  2:вкл   3:вкл   4:вкл   5:вкл   6:выкл
> #cat /proc/sys/fs/protected_hardlinks
> 1
Не воспроизводится -- взял регулярку, apt-repo add 131779; apt-get update; apt-get install mkimage-preinstall; reboot -- в protected_hardlinks 0, образы собираются...

Можно, конечно, брать audit в руки и выяснять, кто последним в этот /proc-файл по записи ломился -- но проверь для начала, совершенно случайно нигде больше в /etc не упоминается protected_hardlinks?
Comment 10 Радюк Михаил 2014-10-16 21:38:28 MSK
Нет, не упоминается:
[root@torabora etc]# grep -ir protected_hardlinks
sysctl.d/mkimage.conf:fs.protected_hardlinks = 0

audit пока мне не поддался, не хочет работать.
Comment 11 Michael Shigorin 2014-10-31 20:10:40 MSK
(В ответ на комментарий №10)
> Нет, не упоминается:
Если используется systemd -- похоже, это на самом деле бага на sysfsutils о том, что не хватает sysfs.service, который запускался бы достаточно поздно, чтоб перекрывать любую самодеятельность в процессе загрузки.

Такой файлик упоминается в http://forum.altlinux.org/index.php/topic,29916.msg211031.html#msg211031 и отсутствует в сизифе.
Comment 12 Alexey Shabalin 2014-10-31 21:59:32 MSK
может вам просто мешает в /lib/sysctl.d/50-default.conf ?
# Enable hard and soft link protection
fs.protected_hardlinks = 1
fs.protected_symlinks = 1

Причем под sysV он тоже обрабатывается.
Comment 13 Michael Shigorin 2014-11-01 00:10:47 MSK
"На третий день Зоркий Джо заметил"...

Спасибо, Лёш -- туда заглянуть не додумался.  Да, мешает.  Как бы перекрыть или убрать в что-нить, с чем спокойно может конфликтовать mkimage?
Comment 14 Michael Shigorin 2014-11-01 00:27:47 MSK
Тёзка, а гляньте на всякий http://git.altlinux.org/tasks/133785/
Comment 15 Радюк Михаил 2014-11-01 23:24:08 MSK
Переустановил mkimage из этого таска - помогло только до перезагрузки.
#cat /proc/sys/fs/protected_hardlinks
1
Comment 16 Michael Shigorin 2014-11-01 23:50:10 MSK
(В ответ на комментарий №15)
> Переустановил mkimage из этого таска
Надо mkimage-preinstall -- там файлик /lib/sysctl.d/90-mkimage.conf
Comment 17 Радюк Михаил 2014-11-02 02:46:06 MSK
Переустановил и его, не помогло:
[root@torabora ~]# cat /proc/sys/fs/protected_hardlinks
1
[root@torabora ~]# cat /lib/sysctl.d/90-mkimage.conf
fs.protected_hardlinks = 0
Comment 18 Alexey Shabalin 2014-11-05 14:44:33 MSK
не, Миша ты на правильно сделал.
Выдержка из man sysctl.d:

--------------
Files in /etc/ override files with the same name in /lib/ and /run/.
Files in /run/ override files with the same name in /lib/. Packages should install their configuration files in /lib/. Files in /etc/ are
reserved for the local administrator, who may use this logic to override the configuration files installed by vendor packages. All
configuration files are sorted by their filename in lexicographic order, regardless of which of the directories they reside in. If multiple
files specify the same variable name, the entry in the file with the lexicographically latest name will be applied. It is recommended to
prefix all filenames with a two-digit number and a dash, to simplify the ordering of the files.
-----------------

Т.е. если хочется вообще отменить действие /lib/sysctl.d/50-default.conf, то надо создать /etc/sysctl.d/50-default.conf с нужными параметрами (а может даже лучше и /run/sysctl.d/50-default.conf во время загрузки, каким-нибудь генератором)

Хотя судя по man, /lib/sysctl.d/90-mkimage.conf должен перекрывать действие /lib/sysctl.d/50-default.conf, если этого не происходит - надо разбираться почему.

PS: А вот сервис sysfs мне кажется вообще не нужен, и в дистрибутивы его включать по-умолчанию тоже не надо.
Comment 19 Alexey Shabalin 2014-11-05 15:03:42 MSK
как вариант, можно вынести
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
из /lib/sysctl.d/50-default.conf в отдельный файл, типа /lib/sysctl.d/51-protectedlinks.conf
и уже его переопределять в /etc/sysctl.d/51-protectedlinks.conf
Comment 20 Michael Shigorin 2014-11-05 17:12:17 MSK
(В ответ на комментарий №19)
> как вариант, можно вынести fs.protected_hardlinks = 1 
> fs.protected_symlinks = 1 из /lib/sysctl.d/50-default.conf в отдельный файл,
> типа /lib/sysctl.d/51-protectedlinks.conf
> и уже его переопределять в /etc/sysctl.d/51-protectedlinks.conf
...или упаковать в отдельный подпакет, с которым можно конфликтовать (выглядит более коряво, но зато более надёжно).

(В ответ на комментарий №18)
> If multiple files specify the same variable name, the entry in the file
> with the lexicographically latest name will be applied.
[...]
> Хотя судя по man, /lib/sysctl.d/90-mkimage.conf должен перекрывать действие
> /lib/sysctl.d/50-default.conf, если этого не происходит - надо разбираться
> почему.
Вот и я не понял.

> PS: А вот сервис sysfs мне кажется вообще не нужен, и в дистрибутивы его
> включать по-умолчанию тоже не надо.
Почему?  Приходится крутить и другие вынужденно интересные ручки вроде /sys/devices/system/cpu/intel_pstate/no_turbo
Comment 21 Alexey Shabalin 2014-11-05 22:34:28 MSK
(В ответ на комментарий №20)
> > PS: А вот сервис sysfs мне кажется вообще не нужен, и в дистрибутивы его
> > включать по-умолчанию тоже не надо.
> Почему?  Приходится крутить и другие вынужденно интересные ручки вроде
> /sys/devices/system/cpu/intel_pstate/no_turbo

Это пример, на который мне нечего возразить :) Умеешь озадачить :)
Для остального есть cpupower. Возможно в будущем cpupower научат работать с P-States.
На десктопе можно взамен использовать thermald, а вот на сервере зависимость у thermald на dbus излишняя. Кроме thermald ничего для управления P-States не нашел. Но это не касается текущего бага, совсем другая тема, для рассылки.
Comment 22 kostyalamer 2015-03-28 18:50:57 MSK
(В ответ на комментарий №19)
> как вариант, можно вынести
> fs.protected_hardlinks = 1
> fs.protected_symlinks = 1
> из /lib/sysctl.d/50-default.conf в отдельный файл, типа
> /lib/sysctl.d/51-protectedlinks.conf
> и уже его переопределять в /etc/sysctl.d/51-protectedlinks.conf
Подтверждаю, свежий t7, система на systemd - те же грабли
можно еще и так ( изобретение не мое а sb ):
[root@host-2 ~]# apt-get install --reinstall mkimage-preinstall
или так на скорую руку:
[root@host-2 ~]# sysctl -w fs.protected_symlinks=0
[root@host-2 ~]# sysctl -w fs.protected_hardlinks=0
Comment 23 Evgenii Terechkov 2015-05-27 05:51:39 MSK
Вообще не очень понятно, как связаны пакет sysfsutils (который менеджит /sys) и /proc/sys/... (которое sysctl). Запуск сервиса sysfs при загрузке не должен влиять на содержимое /proc/sys, только /sys. Что собственно и подтвердилось.

И да, пакет sysfsutils нужен, потому что кроме него никто не пишет в /sys при запуске (AFAIK). Мне например регулярно требуется устанавливать /sys/block/foobar/queue/scheduler для разных дисков. Cpufreq настроить на ноутбуке, опять же. Держать ради простых целей записи одного слова в один файл отдельную программу на каждую хотелку смысла не вижу.

И да, не хватает sysfs.service.
Comment 24 Michael Shigorin 2015-05-27 10:55:26 MSK
(В ответ на комментарий №23)
> Вообще не очень понятно, как связаны пакет sysfsutils (который менеджит /sys) и
> /proc/sys/... (которое sysctl).
Заскок; но тогда тем более непонятно, procps-то есть всегда (требуется startup).

> И да, не хватает sysfs.service.
Это уж отдельно на sysfsutils.
Comment 25 Michael Shigorin 2015-06-05 08:49:59 MSK
(В ответ на комментарий №23)
> Вообще не очень понятно, как связаны пакет sysfsutils (который менеджит /sys) и
> /proc/sys/... (которое sysctl). Запуск сервиса sysfs при загрузке не должен
> влиять на содержимое /proc/sys, только /sys. Что собственно и подтвердилось.
А кто под этим вашим systemd обрабатывает sysctl.d/ и как его отлаживать?

> И да, не хватает sysfs.service.
bug 31048
Comment 26 Michael Shigorin 2015-07-02 16:54:30 MSK
Просьба проверить sysfsutils-2.1.0-alt8 (см. #31048).
Comment 27 Alexey Shabalin 2015-07-03 15:42:21 MSK
(В ответ на комментарий №25)
> (В ответ на комментарий №23)
> > Вообще не очень понятно, как связаны пакет sysfsutils (который менеджит /sys) и
> > /proc/sys/... (которое sysctl). Запуск сервиса sysfs при загрузке не должен
> > влиять на содержимое /proc/sys, только /sys. Что собственно и подтвердилось.
> А кто под этим вашим systemd обрабатывает sysctl.d/ и как его отлаживать?
обрабатывает sysctl.d/ - /lib/systemd/systemd-sysctl.
И под systemd, и под sysV.

> > И да, не хватает sysfs.service.
> bug 31048
Comment 28 enp 2016-01-15 08:38:59 MSK
В связи с https://lists.altlinux.org/pipermail/sisyphus/2016-January/364681.html прошу сделать возможность отключения хардлинков
Comment 29 enp 2016-01-15 09:01:00 MSK
Кстати, а где это по-быстрому меняется? В /usr/share/mkimage/tools/mki-sh-functions комментирование -l для cp_args не помогает - все равно получается:

mkimage: Processing 'copy-tree' ...
mkimage: Processing 'copy-subdirs' ...
cp: cannot create hard link '/.image/live' to './live': Operation not permitted
make: *** [copy-subdirs] Ошибка 1
Comment 30 Lenar Shakirov 2017-01-11 16:26:09 MSK
На сколько я понял из обсуждения баги:
https://bugzilla.redhat.com/show_bug.cgi?id=924433

наш systemd-sysctl работает так:
1. читает последовательно /etc/sysctl.conf, /lib/sysctl.d/, /etc/sysctl.d/
2. ругается, если находит ВТОРОЕ упоминание опции и НЕ ПРИМЕНЯЕТ эту опции

# # grep -R protected_hardlinks /etc/sysctl.conf /lib/sysctl.d/ /etc/sysctl.d/
/lib/sysctl.d/50-default.conf:fs.protected_hardlinks = 1
/etc/sysctl.d/mkimage.conf:fs.protected_hardlinks = 0

# SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-sysctl
parse: /etc/sysctl.conf
parse: /lib/sysctl.d/50-default.conf
Duplicate assignment of kernel/sysrq in file '/lib/sysctl.d/50-default.conf', ignoring.
parse: /etc/sysctl.d/mkimage.conf
Duplicate assignment of fs/protected_hardlinks in file '/etc/sysctl.d/mkimage.conf', ignoring.
Setting 'kernel/sysrq' to '1'
Setting 'kernel/core_pattern' to '/'
Setting 'vm/mmap_min_addr' to '65536'
Setting 'kernel/core_uses_pid' to '1'
Setting 'net/ipv4/conf/default/rp_filter' to '1'
Setting 'net/ipv4/conf/default/accept_source_route' to '0'
Setting 'fs/protected_hardlinks' to '1'
Setting 'fs/protected_symlinks' to '1'

Получается, если хотим переопределить что-то из /lib/sysctl.d/,
нужно в /etc/sysctl.d/ создать файл, имя которого lexically _раньше_ переопределяемого

пример:
1. имеем "fs.protected_hardlinks = 1" в /lib/sysctl.d/50-default.conf
2. создаем /etc/sysctl.d/49-mkimage.conf с содержимым "fs.protected_hardlinks = 0"

и все начинает работать, как хотим мы


однако, в баге 924433 в комментах #17 и #18 говорят что в fedora/rhel это переопределили
https://bugzilla.redhat.com/show_bug.cgi?id=924433#c18
(или я не правильно понял?)

и в http://mirror.yandex.ru/fedora/linux/development/rawhide/Everything/source/tree/Packages/s/systemd-232-6.fc26.src.rpm
в файле sysctl.conf.README пишут:

# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

*lexically later name*

Я так понял они сделали поведение, которое ожидал получить mike@, я и другие у нас,
поведение похожее на обработку /etc/security/limits.d/, при котором файл, имя которого lexically _позже_
будет переопределять _все_ что было до него
Comment 31 Michael Shigorin 2017-01-11 16:31:44 MSK
Ленар, дружище, напомни при встрече -- с меня причитается :)
Comment 32 Michael Shigorin 2017-01-11 17:21:17 MSK
Просьба к заинтересованным: гляньте http://webery.altlinux.org/task/176090
Comment 33 Repository Robot 2017-01-11 17:31:53 MSK
mkimage-0.2.19-alt1 -> sisyphus:

* Wed Jan 11 2017 Michael Shigorin <mike@altlinux> 0.2.19-alt1
- preinstall: fixed sysctl file name, *thanks* snejok@ (closes: #30351)
- mki-copy-efiboot: adjusted for dosfstools-3.0 either
Comment 34 Lenar Shakirov 2017-01-11 18:51:40 MSK
Миша, ты наверное будешь меня бить, но на Сизифе обратная ситуация, которую я описал во второй части комментария #30

Они таки это починили как мы и ожидали изначально:
---
# SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-sysctl
Parsing /lib/sysctl.d/49-coredump-null.conf
Parsing /etc/sysctl.d/49-mkimage.conf
Parsing /lib/sysctl.d/50-default.conf
Overwriting earlier assignment of fs/protected_hardlinks in file '/lib/sysctl.d/50-default.conf'.
Parsing /etc/sysctl.d/99-sysctl.conf
Setting 'kernel/core_uses_pid' to '1'
Setting 'vm/mmap_min_addr' to '65536'
Setting 'kernel/sysrq' to '1'
Setting 'fs/protected_hardlinks' to '1'
Setting 'fs/protected_symlinks' to '1'
Setting 'kernel/core_pattern' to '/'

# sysctl fs.protected_hardlinks
fs.protected_hardlinks = 1
---

# mv /etc/sysctl.d/49-mkimage.conf /etc/sysctl.d/51-mkimage.conf

# SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-sysctl
Parsing /lib/sysctl.d/49-coredump-null.conf
Parsing /lib/sysctl.d/50-default.conf
Parsing /etc/sysctl.d/51-mkimage.conf
Overwriting earlier assignment of fs/protected_hardlinks in file '/etc/sysctl.d/51-mkimage.conf'.
Parsing /etc/sysctl.d/99-sysctl.conf
Setting 'vm/mmap_min_addr' to '65536'
Setting 'kernel/sysrq' to '1'
Setting 'fs/protected_hardlinks' to '0'
Setting 'fs/protected_symlinks' to '1'
Setting 'kernel/core_pattern' to '/'
Setting 'kernel/core_uses_pid' to '1'

# sysctl fs.protected_hardlinks
fs.protected_hardlinks = 0
---

и даже так:
# mv /etc/sysctl.d/51-mkimage.conf /etc/sysctl.d/mkimage.conf
# SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-sysctl
Parsing /lib/sysctl.d/49-coredump-null.conf
Parsing /lib/sysctl.d/50-default.conf
Parsing /etc/sysctl.d/99-sysctl.conf
Parsing /etc/sysctl.d/mkimage.conf
Overwriting earlier assignment of fs/protected_hardlinks in file '/etc/sysctl.d/mkimage.conf'.
Setting 'fs/protected_hardlinks' to '0'
Setting 'kernel/core_pattern' to '/'
Setting 'fs/protected_symlinks' to '1'
Setting 'vm/mmap_min_addr' to '65536'
Setting 'kernel/core_uses_pid' to '1'
Setting 'kernel/sysrq' to '1'

# sysctl fs.protected_hardlinks
fs.protected_hardlinks = 0
---

так же прошу удалить
Requires: sysfsutils
из mkimage-preinstall за ненадобностью (проверил на Сизифе и c7)