Поведение разрешений жестких ссылок отличается между CentOS 6 и CentOS 7

8

Я получаю ошибку разрешений в 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». Насколько я могу судить, это единственное отличие.)

Марио
источник
1
Похоже, что администратор пользователя не имеет прав, чтобы повлиять на ссылку. Право собственности на ссылку зависит от того, кто владеет связанными файлами / папками. Администратор не совпадает с root. Это мои 2 цента. В качестве администратора попробуйте использовать 'sudo ln source / test.txt destination /'. Вы также можете начать использовать флаг -s. Когда вы создаете ссылку без флага -s, вы делаете жесткую ссылку. Это рецепт катастрофы, потому что если связанный файл / папка будет уничтожен, то же самое произойдет и с оригиналом. С -s 'soft links' уничтожение ссылки на файл не влияет на оригинал.
Баазигар
@Bazazigar - Спасибо. Я посмотрел на это. Вот моя проблема. Я унаследовал приложение Perl, которое полагается на поведение CentOS 6 (возможность создать ссылку). Я переношу приложение в CentOS 7. Это действительно небольшая проблема в общей схеме, но я не знаю, почему вместо функции Perl File :: Copy используется функция связи Perl. Я думаю, что было бы достаточно просто скопировать файл. Тем не менее, я должен проявить должную осмотрительность, прежде чем что-то менять - и нет (конечно) никакой документации или комментариев, чтобы объяснить первоначальное решение, которое я унаследовал.
Марио
Без документации или обоснования того, как оно сейчас, ваше решение будет в равной степени валидным, если оно работает, и более обоснованным, если оно работает и имеет документацию. Я не думаю, что произошло изменение в обработке Centos ссылок. Я думаю, что более вероятно, что вы еще не сталкивались на старой коробке, может быть что-то в / etc / group или где-то еще, что объясняет очевидную аномалию.
Баазигар
@Bazazigar - я только что попробовал то же самое в Mac OS X, хотя мне пришлось использовать группу «wheel» (группа root) вместо группы «root». Как вы, возможно, знаете, OS X является вариантом BSD. Это работало так же, как и CentOS 6 - другими словами, оно позволяло создать ссылку. Я не знаю, что правильно, на данный момент. Разве не должно быть единой практики в отношении (в основном) POSIX-совместимых систем?
Марио

Ответы:

5

Я развернул несколько свежих 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:

fs.protected_hardlinks = 0
fs.protected_symlinks = 0

тогда беги

sysctl -p

Что касается того, почему ваша программа предпочитает использовать ссылки вместо копирования файлов, зачем создавать точную копию файла, который вам нужно использовать, когда вы можете просто создать запись, которая указывает на исходные блоки? Это экономит дисковое пространство, а операция обходится дешевле с точки зрения использования процессора и ввода-вывода. Новая жесткая ссылка - это тот же файл, но с другими метаданными / индексами. Если вы удалите исходный файл после создания жесткой ссылки, это не повлияет на ссылку. Файл удаляется только после удаления всех ссылок.

Шон
источник
Спасибо. Я посмотрю на эти ссылки чуть позже сегодня. (А пока воздержитесь!) Я понимаю разницу между жесткой ссылкой и копией. Однако унаследованная мной программа создает ссылку из исходного файла в область «загрузки» (через интерфейс веб-приложения). Я не думаю, что дисковое пространство является проблемой, так как это просто текстовый файл. Кроме того, просто исходя из того, что обычно означает «загрузка», я не понимаю, как вписывается ссылка: семантически копия, похоже, имеет больше смысла. (Я волнуюсь, что в программе есть другое поведение, основанное на ссылке. Я должен проверить.)
Mario
1
«Я понимаю разницу между жесткой ссылкой и копией». Правильно, я просто писал свой ответ, ориентируясь на общую аудиторию для будущих пользователей, которые могут не знать об этом.
Шон
Я все для написания с общей аудиторией :-) В понедельник я найду лучшее решение для приложения. К счастью, у меня много возможностей. (Мое единственное ограничение - «ты сломаешь это; ты купил это!») Я отмечаю твою как принятый ответ. Еще раз спасибо!
Марио
PS Я предполагаю, что люди CentOS выбрали защищенные ссылки по умолчанию. (По ссылкам, которые вы указали, я понял, что это спорный вопрос.)
Марио