Roc*_*173 9 linux unix file-attributes attributes
当我在文件属性定义列表中看到以下内容时,我正在阅读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.
Run Code Online (Sandbox Code Playgroud)
我个人不知道 Linux/UNIX 的“项目 ID”是什么,而且很多谷歌搜索也没有结果,所以我希望这里有人可以帮助我。
你问的是项目配额概念的一部分。项目配额是管理磁盘配额的一种方式。特定的文件系统类型可能支持也可能不支持项目 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
Run Code Online (Sandbox Code Playgroud)
(或mke2fs
在创建新文件系统时提供它们)。然后启用项目配额(如果您愿意,可以使用用户配额和/或组配额):
tune2fs -Q prjquota /your/device
Run Code Online (Sandbox Code Playgroud)
安装它:
mount /your/device /the/mountpoint
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用setquota
和quota
(请注意,旧(-ish)版本的工具可能缺少-P
处理项目配额的选项)之类的工具管理配额。传统上,您会限制用户或组可以使用的磁盘空间量。使用项目配额,您可以为“项目”执行此操作,无论参与的用户和组如何。
它是这样工作的。首先将自己置于挂载点并创建几个目录:
cd /the/mountpoint
mkdir foo bar baz
Run Code Online (Sandbox Code Playgroud)
在它们上启用项目层次结构:
chattr +P foo bar baz
Run Code Online (Sandbox Code Playgroud)
将它们分配给两个不同的项目:
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
Run Code Online (Sandbox Code Playgroud)
在以下位置创建文件:
echo "lorem ipsum" > foo/file1
echo "lorem ipsum" > bar/file2
echo "lorem ipsum" > baz/file3
Run Code Online (Sandbox Code Playgroud)
现在调用:
lsattr -pR .
Run Code Online (Sandbox Code Playgroud)
你会看到(除其他外)这样的行:
123 --------------e---P ./foo/file1
5 --------------e---P ./bar/file2
5 --------------e---P ./baz/file3
Run Code Online (Sandbox Code Playgroud)
即file1
属于id 的项目123
,file2
也file3
属于id 的项目5
。如果为这些项目定义配额(即限制项目可以使用的磁盘空间量),每个文件都会影响其各自项目的配额消耗。
现在你引用的很有意义:
在目录中创建的文件和目录将继承该目录的项目id
在我们的示例中file1
,从foo
. 如果您在其中创建更多文件/目录,foo
那么它们也将继承 ID。这允许您(和其他用户)在其指定目录中处理项目,而您创建的文件会自动计入相应的配额。
只有当文件的项目 ID 和目标目录匹配时,才能创建文件的硬链接。
ln ./baz/file3 ./foo/
会失败(尝试)但ln ./baz/file3 ./bar/
会成功。操作系统不会让您轻松地将属于一个项目的文件(并且必须保持这种状态,因为源路径未取消链接)“嵌入”到不同的项目目录中。允许在其项目中链接文件。
当文件或目录移动到另一个目录时,项目 ID 必须匹配
我认为这是相当具有误导性的。mv
即使 id 不匹配也会完成它的工作。关键是如果你调用
mv baz/file3 foo/
Run Code Online (Sandbox Code Playgroud)
该工具将首先尝试rename(2)
将文件添加到新路径,这将失败(ln
如上所示)。通常或在同一个项目中,它会成功并且原来的名字会消失。显然,这种行为就是“项目 ID 必须匹配”的内容。
但mv
还不会退出。这就像在文件系统之间移动:mv
重命名失败后,它会退回到复制+删除模式。实际上,它在目标目录中创建了一个副本(带有新的 inode 编号)。在我们的例子中,副本继承了项目 ID foo
(就像这个目录中的任何新文件一样),所以它会影响 project 的配额消耗123
。然后取消链接原始路径。这可能会影响项目的配额消耗5
;或可能不会:硬链接或打开的文件描述符将导致原始 inode 和数据继续存在。
请注意,这有点令人惊讶:创建了一个新文件,旧硬链接(如果有)未链接到新文件,指向旧文件的文件描述符与新文件无关;好像移动操作是在文件系统之间执行的。
有一种方法可以mv
重命名而不是复制+删除。如果手动将原始文件分配给目标项目
chattr -p 123 baz/file3
Run Code Online (Sandbox Code Playgroud)
然后mv baz/file3 foo/
将真正移动它而不进行复制,而不会破坏硬链接(如果有的话)。但请注意,项目编号属于 inode(不是路径、不是名称、不是目录条目),因此chattr -p
会影响所有硬链接。
因此,如果您需要将一个大文件(即某个 inode 后面的数据,而不仅仅是许多硬链接中的一个)移动到另一个项目,更改项目然后移动将节省您不必要的复制。
归档时间: |
|
查看次数: |
878 次 |
最近记录: |