ハードリンク権限はCentOS 6とCentOS 7の間で異なる動作をします。

ハードリンク権限はCentOS 6とCentOS 7の間で異なる動作をします。

ハードリンクを作成しようとすると、CentOS 7で権限エラーが発生します。 CentOS 6 で設定したのと同じ権限を使用すると、エラーメッセージは表示されません。問題はグループ権限に関連しています。どのOSバージョンが正しいか、どのバージョンが間違っているのかわかりません。

何が起こったのか説明しましょう。現在の作業ディレクトリには、ソースディレクトリとターゲットディレクトリという2つのディレクトリがあります。最初はターゲットが空です。ソースにはテキストファイルが含まれています。

[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@tc-dlx-nba cwd]# ln source/test.txt destination/
[root@tc-dlx-nba cwd]# ls destination/
test.txt

ただし、他のユーザー(この場合はadmin)でログインするとリンクを作成できません。 「操作は許可されていません」というメッセージが表示されます。

[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では、ルートグループを「ホイール」といいます。私が知っている限り、それは唯一の違いです。)

答え1

新しい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

プログラムがファイルをコピーするのではなくリンクを使用することを選択したのは、元のブロックを指すエントリを作成するために使用する必要があるファイルの正確なコピーを作成する理由です。これはディスク容量を節約し、より低いCPUとI / Oコストで動作します。新しいハードリンクは、メタデータ/インデックスノードのみが異なるだけで同じファイルです。ハードリンクの作成後に元のファイルを削除しても、リンクには影響しません。すべてのリンクが削除された場合にのみ、ファイルは「削除」されます。

関連情報