“chattr”命令设置的属性是否作为扩展属性实现?

Joh*_*ohn 4 linux

chattr命令用于设置文件的一些属性(例如: 仅追加 (a)不可变 (i)等)。

这些属性是作为扩展属性实现的,还是它们自己的属性类别?

Sté*_*las 8

否,这些标志是使用设置FC_IOC_SETFLAGS ioctl()(也称为EXT2_IOC_SETFLAGSext*文件系统,以及相应的一个为其它文件系统)。

在支持它的大多数文件系统中,这会转换为 inode 结构的一个位图。

例如,在ext4和其他几个文件系统中,这是i_flagsinode 结构成员(一个 32 位整数)。

一些外国(非 Linux)文件系统,如 Apple 的 HFS+ 具有类似的概念,带有等效标志,FC_IOC_SETFLAGSioctl 在那里进行翻译。

在文件系统中使用stat命令(转储 inode 结构)时,这是输出中的数字:debugfsext*Flags:

 $ sudo debugfs /dev/vda
 debugfs: stat /tmp/file
 Inode: 1835209   Type: regular    Mode:  0644   Flags: 0x80010
 [...]
Run Code Online (Sandbox Code Playgroud)

0x80000 是FS_EXTENT_FLelsattr输出中),0x10 是FS_IMMUTABLE_FLi)。

statx()系统调用还可以返回(部分)该信息(目前(2019 年初)并非所有系统都具有足够新的 GNU libc(2.28 或更高版本)版本,以便能够轻松调用它)。

在最近的系统上,您可以使用xfs_io'sstatx命令作为statx()系统调用的接口:

$ xfs_io -rc 'statx -r' /tmp/a
[...]
stat.attributes = 0x10
[...]
Run Code Online (Sandbox Code Playgroud)

(这里 0x10 是STATX_ATTR_IMMUTABLE,那个FS_EXTENT_FL没有相应的statx()标志)。