![Linux에서 읽기 전용 디렉터리 삭제를 허용하지 않는 이유는 무엇입니까? [폐쇄]](https://linux55.com/image/131860/Linux%EC%97%90%EC%84%9C%20%EC%9D%BD%EA%B8%B0%20%EC%A0%84%EC%9A%A9%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%20%EC%82%AD%EC%A0%9C%EB%A5%BC%20%ED%97%88%EC%9A%A9%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
저는 리눅스를 처음 접했습니다. 파일을 읽기 전용으로 설정해도 파일을 삭제할 수 있습니다. 파일 삭제는 파일이 들어 있는 폴더의 권한에 따라 다르다는 내용을 온라인에서 읽었습니다.
명확하게 설명하기 위해 읽기 전용 파일 "abc.txt"가 포함된 디렉터리 테스트(모든 권한 포함)가 있다고 가정해 보겠습니다. 이 파일은 읽기 전용이지만 쉽게 삭제할 수 있습니다.
이제 다음 상황을 생각해 보십시오. 테스트 중인 "sub"라는 하위 디렉터리가 있습니다. 이 디렉터리는 읽기 전용입니다. 이 하위 디렉터리를 삭제하려고 하면 이 디렉터리를 삭제할 수 없다는 오류가 발생합니다.
Linux에서는 디렉터리도 파일로 간주됩니다. 그러나 읽기 전용 파일은 읽기 전용 디렉터리와 다르게 동작합니다.
그 이유는 무엇입니까?
답변1
Unix가 그렇게 정의되어 있고 POSIX에서는 이러한 동작이 필요하기 때문입니다. Linux는 Unix 및 POSIX와 호환되도록 시도합니다.
어떤 내용인지 오해가 있을 수 있습니다.문서예(Unix와 Windows에서는 완전히 동일하지는 않습니다). 그건 그렇고, 그들은 많은 사람들에게 중요합니다시스템 호출(에 나열됨시스템 호출(2)), 여러 시스템 호출이 제공됩니다.파일 설명자파일 경로에서(참조:경로 해상도(7)). 다른 운영 체제와 비교할 때 파일(Linux, Unix 또는 POSIX 시스템의)은하나이름(또는길): 일부 파일에는 이름이 없으며 일부 파일에는 여러 이름이 있지만 실제로 대부분의 파일에는 하나의 이름이 있습니다.
파일은 다음과 같습니다.추상적인제공하기 위해사용자 공간(그리고애플리케이션-포함하다유용프로그램 - 실행됨프로세스)의지하다운영 체제 커널. 시스템 호출은 프로그램(및 이를 실행하는 프로세스)이 커널과 상호 작용하는 유일한 방법입니다.
디스크는 파일에 대해 알지 못합니다(그러나 운영 체제는 알고 있습니다). 디스크에는 바이트 블록만 포함됩니다. 운영 체제는 이를 파일로 이해합니다.
파일(Unix 및 Linux의 경우)은인덱스 노드. 당신은 또한 볼 수 있습니다인덱스 노드(7). inode에는 파일에 대한 메타데이터가 포함되어 있습니다(다음 명령을 사용하여 쿼리할 수 있음).통계(2)etc
fstat
...) - 유형, 생성 시간, 권한, 소유권, 크기 등을 포함합니다. - 파일 데이터(바이트 시퀀스)를 포함합니다(또는 더 일반적으로 가리킵니다).
하지만 읽기 전용 디렉터리를 삭제해도 문제가 없습니다.
ㅏ목차특별한 유형의 파일입니다(일반 파일 및 디렉토리 외에도 다음과 같은 다른 유형의 파일이 있습니다).선입선출(7)-에스,심볼릭 링크(7)-s 등). 여기에는 문자열을 inode로 매핑하는 사전 매핑이 포함되어 있습니다. 이것이 발생하는 방식은 각 파일 시스템 유형에 따라 다릅니다. 사용디렉토리 열기(3)(그리고 나중에 closedir
) 그리고디렉터리 읽기(3)읽어.
....폴더가 위치한 폴더의 권한...
오해. 폴더는 Linux에 존재하지 않습니다.GUI인공 생산때때로당신이 표시한데스크탑 환경), 당신은 아마도 디렉토리에 대해 이야기하고 있을 것입니다.파일 시스템다양한 유형의 파일(디렉토리 및 기호 링크 포함)을 포함합니다.
주어진 inode는 다음에 나타날 수 있습니다.일부디렉토리(파일이일부경로가 있으면 모두 동일한 "권한"과 유사한 "역할"을 갖습니다. 사용링크(2)시스템 호출 - 아마도 다음을 통해ln(1)명령 - 파일에 추가 경로를 추가하는 데 사용됩니다. 사용연결 해제(2)파일 경로를 삭제하는 시스템 호출입니다. 어떤 경우에는 어떤 디렉토리에도 나타나지 않고 inode가 존재할 수 있습니다. 일반적인 경우(임시 파일 구현)는 -eg를 사용하여 파일을 생성하는 경우입니다.만들기(2)아니면 open
그때 unlink
(또는삭제(3)) 파일 바로 뒤에 있습니다(예: 동일한 프로세스에 있지만 아마도 그렇지 않을 수도 있음).
inode에 액세스할 수 없게 되면(열린 파일 설명자가 없고 일부 디렉토리에서 더 이상 언급되지 않기 때문에) 커널은 inode(및 관련 데이터 블록)를 삭제합니다.
파일을 "삭제"할 때(예:방(1)유틸리티), /bin/rm
프로그램(및 명령을 실행하는 프로세스)은 단지 사용합니다 unlink
(그리고 이름과 inode 사이의 일부 매핑이 포함된 디렉토리에 쓰고 있습니다). 해당 inode에 더 이상 "포인트"가 없으면 실제로 삭제됩니다. 커널이 디렉토리에 쓰고 있으므로 프로세스에 쓰기 권한이 필요합니다. 당신은 또한 볼 수 있습니다바우처(7).
디렉토리가 필요하다목차(2)생산될 예정이며,목차(2)(부모로부터) 제거됨: 다음을 사용하는 경우연결 해제(2)삭제하면 실패합니다 EISDIR
. 하지만목차(2)커널에서는 파일 계층 구조가 비어 있어야 하기 때문에 디렉토리가 비어 있어야 합니다.방향성 비순환 그래프, 그리고순환 참조어떤 식으로든 금지됨참조 카운팅). mkdir
시스템 호출은 모두 디렉토리 rmdir
매직 .
과 항목을 처리합니다...
하지만 읽기 전용 디렉터리를 삭제해도 문제가 없습니다. 이것이 상위 디렉토리에 의존하지 않는 이유는 무엇입니까?
이는 일반적으로 사실입니다(그러나끈끈한 비트카탈로그에는 몇 가지 구체적인 의미가 있습니다.
편집에 관한 질문
수정된 질문에서 귀하는 다음과 같이 주장합니다(잘못되었거나 일부 중요한 세부정보가 누락됨).
sub
이제 다음 상황을 고려해보세요. under 라는 하위 디렉터리가 있습니다test
. 이 디렉터리는 읽기 전용입니다. 이 하위 디렉터리를 삭제하려고 하면 이 디렉터리를 삭제할 수 없다는 오류가 발생합니다.
나는 당신의 주장을 재현할 수 없습니다(일부 제공해주세요MCVE). 가독성을 위해 귀하의 이름 testdir
대신 목차를 고려하고 있습니다. subdir
(그러나 이것은 아무것도 변경되지 않습니다. 그러나 귀하의 이름은 test
쉽게 혼동됩니다.테스트(1))
% /bin/mkdir testdir
% /bin/mkdir testdir/subdir
% /bin/ls -la testdir
total 12
drwxr-xr-x 3 basile basile 4096 Apr 24 13:09 .
drwxr-xr-x 6 basile basile 4096 Apr 24 13:08 ..
drwxr-xr-x 2 basile basile 4096 Apr 24 13:09 subdir
% /bin/chmod a-w testdir/subdir
% /bin/ls -la testdir
total 12
drwxr-xr-x 3 basile basile 4096 Apr 24 13:09 .
drwxr-xr-x 6 basile basile 4096 Apr 24 13:08 ..
dr-xr-xr-x 2 basile basile 4096 Apr 24 13:09 subdir
% /bin/rmdir testdir/subdir
% /bin/ls -la testdir
total 8
drwxr-xr-x 2 basile basile 4096 Apr 24 13:14 .
drwxr-xr-x 6 basile basile 4096 Apr 24 13:08 ..
기억해주세요목차(1)(이것은목차(2)시스템 호출)을 사용하려면 삭제된 디렉터리가 비어 있어야 하며 일부 파일(점으로 시작하는 이름)은 셸 또는 ls
삭제된 디렉터리의 모든 파일을 나열하는 데 의해 차단될 수 있습니다.ls -a
당신은 읽을 수 있습니다운영 체제: 세 가지 간단한 부분
답변2
아니요, 상위 디렉터리가 읽기 전용인 경우 디렉터리를 삭제할 수 없습니다. 직접 시도해 보세요:
$ cd /tmp
$ mkdir -p /tmp/readonly1/readonly2
$ chmod 555 /tmp/readonly1/readonly2 /tmp/readonly1 # dr-xr-xr-x
$ rmdir /tmp/readonly1/readonly2
rmdir: failed to remove '/tmp/readonly1/readonly2': Permission denied
강제 삭제도 도움이 되지 않습니다.
$ rm -rf /tmp/readonly1/readonly2
rm: cannot remove '/tmp/readonly1/readonly2': Permission denied
$ rm -rf /tmp/readonly1
rm: cannot remove '/tmp/readonly1/readonly2': Permission denied
$ chmod 755 /tmp/readonly1/readonly2 # drwxr-xr-x
$ rm -rf /tmp/readonly1
rm: cannot remove '/tmp/readonly1/readonly2': Permission denied
readonly1
그러나 디렉토리를 쓰기 가능하게 만든 후에는 해당 하위 디렉토리를 삭제할 수 있습니다 readonly2
.
$ chmod 555 /tmp/readonly1/readonly2 # dr-xr-xr-x
$ chmod 755 /tmp/readonly1 # drwxr-xr-x
$ rmdir /tmp/readonly1/readonly2
$ rmdir /tmp/readonly1 #... or just rm -rf /tmp/readonly1 all at once
$ ls /tmp/readonly1
ls: cannot access '/tmp/readonly1': No such file or directory