하드 링크 권한은 CentOS 6과 CentOS 7 간에 다르게 작동합니다.

하드 링크 권한은 CentOS 6과 CentOS 7 간에 다르게 작동합니다.

하드 링크를 생성하려고 하면 CentOS 7에서 권한 오류가 발생합니다. CentOS 6에 설정된 동일한 권한을 사용하면 오류 메시지가 표시되지 않습니다. 문제는 그룹 권한과 관련이 있습니다. 어떤 OS 버전이 올바른지, 어떤 버전이 잘못된지 잘 모르겠습니다.

무슨 일이 일어났는지 설명하겠습니다. 현재 작업 디렉터리에는 소스 디렉터리와 대상 디렉터리라는 두 개의 디렉터리가 있습니다. 처음에는 대상이 비어 ​​있습니다. 소스에는 텍스트 파일이 포함되어 있습니다.

[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@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 가상 머신에서 동일한 테스트를 시도했습니다. 데비안은 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 비용으로 작동합니다. 새로운 하드 링크는 메타데이터/인덱스 노드만 다를 뿐 동일한 파일입니다. 하드링크 생성 후 원본 파일을 삭제해도 링크에는 영향이 없습니다. 모든 링크가 제거된 경우에만 파일이 "삭제"됩니다.

관련 정보