
chattr
내 Linux 컴퓨터( ) 의 설명서를 읽고 있던 kali4-amd64
중 파일 속성 정의 목록에서 다음을 보았습니다.
A directory with the 'P' attribute set will enforce a hierarchical
structure for project id's. This means that files and directory created in
the directory will inherit the project id of the directory, rename
operations are constrained so when a file or directory is moved into
another directory, that the project id's much match. In addition, a hard
link to file can only be created when the project id for the file and the
destination directory match.
나는 개인적으로 Linux/UNIX에 관한 "프로젝트 ID"가 무엇인지 모르고 많은 인터넷 검색에서도 결과가 나오지 않으므로 여기 누군가가 나를 도와줄 수 있기를 바랍니다.
답변1
당신이 요구하는 것은 프로젝트 할당량 개념의 일부입니다. 프로젝트 할당량은 관리 방법입니다.디스크 할당량. 특정 파일 시스템 유형은 프로젝트 ID를 지원할 수도 있고 지원하지 않을 수도 있습니다. ext4에 집중하고 다음부터 시작해 보겠습니다 man 8 tune2fs
.
-O [^]feature[,...]
파일 시스템에 표시된 파일 시스템 기능(옵션)을 설정하거나 지웁니다. […][…]
project
프로젝트 ID 추적을 활성화합니다. 이는 프로젝트 할당량 추적에 사용됩니다.
quota
내부 파일 시스템 할당량 inode를 활성화합니다.[…]
-Q quota-options
슈퍼블록에 '할당량' 기능을 설정하고 지정된 할당량 유형에 대한 할당량 파일에서 작동합니다. 할당량 옵션은 다음 중 하나 이상이 될 수 있습니다.
[^]usrquota
슈퍼블록의 사용자 할당량 inode를 설정/삭제합니다.
[^]grpquota
슈퍼블록의 그룹 할당량 inode를 설정/삭제합니다.
[^]prjquota
슈퍼블록에서 프로젝트 할당량 inode를 설정/삭제합니다.
기존 파일 시스템에서 다음 옵션을 활성화할 수 있습니다.
tune2fs -O project,quota /your/device
(또는 새 파일 시스템을 생성하는 동안 제공 mke2fs
). 그런 다음 프로젝트 할당량을 활성화합니다(원하는 경우 사용자 할당량 및/또는 그룹 할당량 사용 가능).
tune2fs -Q prjquota /your/device
마운트하세요:
mount /your/device /the/mountpoint
이제 setquota
및 같은 도구를 사용하여 할당량을 관리할 수 있습니다 quota
(이전(-ish) 도구 버전에는 -P
프로젝트 할당량을 처리하는 옵션이 부족할 수 있음). 일반적으로 사용자나 그룹이 사용할 수 있는 디스크 공간의 양을 제한합니다. 프로젝트 할당량을 사용하면 참여하는 사용자 및 그룹에 관계없이 "프로젝트"에 대해 이 작업을 수행할 수 있습니다.
그것은 이렇게 작동합니다. 먼저 마운트 지점에 자신을 배치하고 몇 가지 디렉터리를 만듭니다.
cd /the/mountpoint
mkdir foo bar baz
프로젝트 계층 구조를 활성화합니다.
chattr +P foo bar baz
두 개의 서로 다른 프로젝트에 할당합니다.
chattr -p 123 foo # 123 is an arbitrary number, project id
chattr -p 5 bar baz # so is 5, the point is they are different
다음 범위에서 파일을 생성하세요.
echo "lorem ipsum" > foo/file1
echo "lorem ipsum" > bar/file2
echo "lorem ipsum" > baz/file3
이제 다음을 호출합니다.
lsattr -pR .
그러면 다음과 같은 줄이 표시됩니다.
123 --------------e---P ./foo/file1
5 --------------e---P ./bar/file2
5 --------------e---P ./baz/file3
이는 file1
id가 있는 프로젝트에 속 123
하고 id가 있는 프로젝트에 속한다는 file2
의미 입니다 . 이러한 프로젝트에 대한 할당량을 정의하면(즉, 프로젝트에서 사용할 수 있는 디스크 공간의 양을 제한하는 경우) 각 파일은 해당 프로젝트의 할당량 소비에 영향을 미칩니다.file3
5
이제 당신이 인용한 내용은 많은 의미가 있습니다.
해당 디렉터리에 생성된 파일과 디렉터리는 해당 디렉터리의 프로젝트 ID를 상속받습니다.
이 예에서는 file1
프로젝트 ID를 에서 상속했습니다 foo
. 더 많은 파일/디렉토리를 생성하면 foo
ID도 상속됩니다. 이를 통해 귀하(및 동료 사용자)는 지정된 디렉터리에서 프로젝트 작업을 할 수 있으며, 귀하가 생성한 파일은 해당 할당량에 자동으로 포함됩니다.
파일에 대한 하드 링크는 파일의 프로젝트 ID와 대상 디렉터리가 일치하는 경우에만 생성될 수 있습니다.
ln ./baz/file3 ./foo/
실패하지만(시도해 보세요) ln ./baz/file3 ./bar/
성공할 것입니다. OS에서는 한 프로젝트에 속한 파일(소스 경로가 연결 해제되지 않았기 때문에 이 상태로 유지되어야 함)을 다른 프로젝트 디렉터리에 쉽게 "포함"할 수 없습니다. 프로젝트 내에서 파일을 링크하는 것이 허용됩니다.
파일이나 디렉터리가 다른 디렉터리로 이동되면 프로젝트 ID가 일치해야 합니다.
나는 이것이 오히려 오해의 소지가 있다고 생각합니다. mv
ID가 일치하지 않아도 작업을 수행합니다. 요점은 당신이 호출하는 경우입니다
mv baz/file3 foo/
도구는 먼저 rename(2)
파일을 새 경로로 이동하려고 시도하지만 이는 실패합니다( ln
위와 마찬가지로). 일반적으로 또는 동일한 프로젝트 내에서는 성공하고 원래 이름은 사라집니다. 분명히 이 동작은 "프로젝트 ID가 일치해야 함"에 관한 것입니다.
하지만 mv
아직 종료되지 않습니다. 이는 파일 시스템 간을 이동하는 것과 같습니다. mv
이름 변경에 실패한 후 복사+삭제 모드로 돌아갑니다. 실제로 그것은복사(새 inode 번호 사용)을 대상 디렉터리에 추가합니다. 우리의 경우 복사본은 foo
이 디렉터리의 모든 새 파일과 마찬가지로 프로젝트 ID를 상속하므로 project 의 할당량 소비에 영향을 미칩니다 123
. 그러면 원래 경로가 연결 해제됩니다. 이는 프로젝트의 할당량 소비에 영향을 미칠 수 있습니다 5
. 그렇지 않을 수도 있습니다. 하드링크나 열린 파일 설명자는 원래 inode와 데이터를 유지하게 합니다.
다소 놀라운 점에 유의하세요. 새 파일이 생성되고, 이전 하드링크(있는 경우)가 새 파일에 연결되지 않으며, 이전 파일을 가리키는 파일 설명자가 새 파일과 아무 관련이 없습니다. 마치 파일 시스템 간에 이동 작업이 수행된 것처럼.
mv
복사+삭제 대신 이름을 바꾸는 방법이 있습니다 . 원본 파일을 대상 프로젝트에 수동으로 할당하는 경우
chattr -p 123 baz/file3
그런 다음 mv baz/file3 foo/
하드링크(있는 경우)를 깨지 않고 복사하지 않고 실제로 이동합니다. 그러나 프로젝트 번호는 inode(경로, 이름, 디렉토리 항목이 아님)에 속하므로 chattr -p
모든 하드링크에 영향을 미칩니다.
따라서 큰 파일(예: 많은 하드링크 중 하나가 아닌 일부 inode 뒤에 있는 데이터)을 다른 프로젝트로 이동해야 하는 경우 프로젝트를 변경한 다음 이동하면 불필요한 복사를 줄일 수 있습니다.