Я получаю ошибку разрешений в CentOS 7, когда пытаюсь создать жесткую ссылку. С теми же разрешениями, установленными в CentOS 6, я не получаю ошибку. Проблема сосредоточена на групповых разрешениях. Я не уверен, какая версия ОС правильная, а какая нет.
Позвольте мне проиллюстрировать, что происходит. В моем текущем рабочем каталоге у меня есть два каталога: исходный и целевой. В начале пункт назначения пуст; Источник содержит текстовый файл.
[root@tc-dlx-nba cwd]# ls -l
total 0
drwxrwxrwx. 2 root root 6 Jun 12 14:33 destination
drwxrwxrwx. 2 root root 21 Jun 12 14:33 source
[root@tc-dlx-nba cwd]# ls -l destination/
total 0
[root@tc-dlx-nba cwd]# ls -l source/
total 4
-rw-r--r--. 1 root root 8 Jun 12 14:20 test.txt
[root@tc-dlx-nba cwd]#
Как видите, в отношении разрешений две директории - 777, причем для владельца и группы установлено значение root. Владелец и группа текстового файла также установлены в root. Тем не менее, разрешения для текстового файла доступны для чтения и записи для владельца, но только для чтения для группы.
Когда я вошел в систему как пользователь root, у меня нет проблем с созданием жесткой ссылки в целевом каталоге, указывающей на текстовый файл (в исходном каталоге).
[root@tc-dlx-nba cwd]# ln source/test.txt destination/
[root@tc-dlx-nba cwd]# ls destination/
test.txt
Однако, если я вхожу в систему как другой пользователь, в этом случае, администратор, я не могу создать ссылку. Я получаю: «Операция не разрешена».
[root@tc-dlx-nba cwd]# rm -f destination/test.txt
[root@tc-dlx-nba cwd]# su admin
bash-4.2$ pwd
/root/cwd
bash-4.2$ ln source/test.txt destination/
ln: failed to create hard link ‘destination/test.txt’ => ‘source/test.txt’: Operation not permitted
То, что происходит, на самом деле имеет смысл для меня, но, поскольку вышеизложенное разрешено в CentOS 6, я хотел проверить, не понял ли я что-либо. Для меня это похоже на ошибку в CentOS 6, которая была исправлена в CentOS 7.
Кто-нибудь знает, что дает? Правильно ли я считаю, что вышеуказанное поведение является правильным поведением? Это CentOS 6, что правильно? Или оба правы, и, возможно, есть какая-то скрытая проблема с правами доступа группы, которую я пропускаю? Спасибо.
Изменить: я только что попробовал тот же тест на виртуальной машине Debian v7, что у меня есть. Debian согласен с CentOS 7: «Операция не разрешена».
Правка № 2: Я только что попробовал то же самое на Mac OS X (Yosemite). Это работало так же, как и CentOS 6. Другими словами, это позволило создать ссылку. (Примечание. На OS X корневая группа называется «wheel». Насколько я могу судить, это единственное отличие.)
источник
Ответы:
Я развернул несколько свежих CentOS 6 и 7 виртуальных машин и смог воссоздать то поведение, которое вы показали. После некоторых копаний выясняется, что это на самом деле изменение в ядре относительно поведения по умолчанию в отношении жестких и мягких ссылок в целях безопасности. Следующие страницы указали мне правильное направление:
http://kernel.opensuse.org/cgit/kernel/commit/?id=561ec64ae67ef25cac8d72bb9c4bfc955edfd415
http://kernel.opensuse.org/cgit/kernel/commit/?id=800179c9b8a1
Если вы сделаете файл доступным для записи, ваш администратор сможет создать жесткую ссылку.
Чтобы вернуться к поведению CentOS 6 в масштабе всей системы, были добавлены новые параметры ядра. Установите следующее в /etc/sysctl.conf:
тогда беги
Что касается того, почему ваша программа предпочитает использовать ссылки вместо копирования файлов, зачем создавать точную копию файла, который вам нужно использовать, когда вы можете просто создать запись, которая указывает на исходные блоки? Это экономит дисковое пространство, а операция обходится дешевле с точки зрения использования процессора и ввода-вывода. Новая жесткая ссылка - это тот же файл, но с другими метаданными / индексами. Если вы удалите исходный файл после создания жесткой ссылки, это не повлияет на ссылку. Файл удаляется только после удаления всех ссылок.
источник