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