Bug 30351 - cp: cannot create hard link
: cp: cannot create hard link
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/mkimage)
: unstable
: all Linux
: P3 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2014-09-23 23:11 by
Modified: 2017-01-11 18:51 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2014-09-23 23:11:25
При попытке собрать дистро на 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 From 2014-09-24 17:45:35 -------
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 From 2014-10-08 01:39:16 -------
Так, а что говорит chkconfig --list sysfs ?
------- Comment #3 From 2014-10-08 19:59:44 -------
Говорит, что он не добавлен:
chkconfig --list sysfs

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

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

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

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


#cat /proc/sys/fs/protected_hardlinks
1
------- Comment #9 From 2014-10-16 00:09:50 -------
(В ответ на комментарий №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 From 2014-10-16 21:38:28 -------
Нет, не упоминается:
[root@torabora etc]# grep -ir protected_hardlinks
sysctl.d/mkimage.conf:fs.protected_hardlinks = 0

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

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

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

Спасибо, Лёш -- туда заглянуть не додумался.  Да, мешает.  Как бы перекрыть или
убрать в что-нить, с чем спокойно может конфликтовать mkimage?
------- Comment #14 From 2014-11-01 00:27:47 -------
Тёзка, а гляньте на всякий http://git.altlinux.org/tasks/133785/
------- Comment #15 From 2014-11-01 23:24:08 -------
Переустановил mkimage из этого таска - помогло только до перезагрузки.
#cat /proc/sys/fs/protected_hardlinks
1
------- Comment #16 From 2014-11-01 23:50:10 -------
(В ответ на комментарий №15)
> Переустановил mkimage из этого таска
Надо mkimage-preinstall -- там файлик /lib/sysctl.d/90-mkimage.conf
------- Comment #17 From 2014-11-02 02:46:06 -------
Переустановил и его, не помогло:
[root@torabora ~]# cat /proc/sys/fs/protected_hardlinks
1
[root@torabora ~]# cat /lib/sysctl.d/90-mkimage.conf
fs.protected_hardlinks = 0
------- Comment #18 From 2014-11-05 14:44:33 -------
не, Миша ты на правильно сделал.
Выдержка из 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 From 2014-11-05 15:03:42 -------
как вариант, можно вынести
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 From 2014-11-05 17:12:17 -------
(В ответ на комментарий №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 From 2014-11-05 22:34:28 -------
(В ответ на комментарий №20)
> > PS: А вот сервис sysfs мне кажется вообще не нужен, и в дистрибутивы его
> > включать по-умолчанию тоже не надо.
> Почему?  Приходится крутить и другие вынужденно интересные ручки вроде
> /sys/devices/system/cpu/intel_pstate/no_turbo

Это пример, на который мне нечего возразить :) Умеешь озадачить :)
Для остального есть cpupower. Возможно в будущем cpupower научат работать с
P-States.
На десктопе можно взамен использовать thermald, а вот на сервере зависимость у
thermald на dbus излишняя. Кроме thermald ничего для управления P-States не
нашел. Но это не касается текущего бага, совсем другая тема, для рассылки.
------- Comment #22 From 2015-03-28 18:50:57 -------
(В ответ на комментарий №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 From 2015-05-27 05:51:39 -------
Вообще не очень понятно, как связаны пакет sysfsutils (который менеджит /sys) и
/proc/sys/... (которое sysctl). Запуск сервиса sysfs при загрузке не должен
влиять на содержимое /proc/sys, только /sys. Что собственно и подтвердилось.

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

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

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

> И да, не хватает sysfs.service.
bug 31048
------- Comment #26 From 2015-07-02 16:54:30 -------
Просьба проверить sysfsutils-2.1.0-alt8 (см. #31048).
------- Comment #27 From 2015-07-03 15:42:21 -------
(В ответ на комментарий №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 From 2016-01-15 08:38:59 -------
В связи с
https://lists.altlinux.org/pipermail/sisyphus/2016-January/364681.html прошу
сделать возможность отключения хардлинков
------- Comment #29 From 2016-01-15 09:01:00 -------
Кстати, а где это по-быстрому меняется? В
/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 From 2017-01-11 16:26:09 -------
На сколько я понял из обсуждения баги:
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 From 2017-01-11 16:31:44 -------
Ленар, дружище, напомни при встрече -- с меня причитается :)
------- Comment #32 From 2017-01-11 17:21:17 -------
Просьба к заинтересованным: гляньте http://webery.altlinux.org/task/176090
------- Comment #33 From 2017-01-11 17:31:53 -------
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 From 2017-01-11 18:51:40 -------
Миша, ты наверное будешь меня бить, но на Сизифе обратная ситуация, которую я
описал во второй части комментария #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)