我进行了搜索,但找不到任何东西 - 我正在寻找 ext 文件系统中符号链接的文件结构(以字节为单位)的详细信息。
我尝试创建一个符号链接文件,然后hexdump
在该符号链接上使用,但它抱怨它是一个目录(链接指向一个文件夹),因此它显然试图转储链接指向的文件/文件夹而不是链接本身。
答案1
您没有提供更多详细信息,因此本说明暂时集中于 Linux 中常见的 EXT 文件系统。
如果您查看 eg 提供的符号链接的“大小” ls -l
,您会注意到该大小与它指向的目标名称一样长。因此,您可以推断“实际”文件仅包含链接目标的路径作为文本,并且作为符号链接的解释存储在文件类型元数据中(特别是链接文件 inode 字段S_IFLINK
中的标志)i_mode
附加到,权限位也存储在其中;请参阅这个内核文档参考)。
为了提高性能并减少设备 IO,如果符号链接短于 60 字节,它将存储在i_block
inode 本身的字段中(请参阅这里)。由于这使得不需要单独的块访问,因此这些链接被称为“快速符号链接”,而不是指向较长路径的符号链接,后者退回到将链接目标作为文本存储在外部数据块中的“传统”方法。
答案2
这完全取决于文件系统。
通常,符号链接目标按原样存储在 inode 块的额外空间内,就像小目录和小文件一样。不需要任何特殊的数据格式——文件模式位已经确定它是符号链接并且应该如此对待。目标是“实际内容”:readlink -n /path/to | hexdump
如果你确实想使用,就可以使用hexdump
。
在符号链接上调用 lstat(2) 时,st.st_size
将包含目标的长度(不包括任何终止 NUL 字节)。
答案3
在符号链接上使用hexdump
根本不查看 ext4 文件系统。它着眼于面向应用程序的抽象。在这一层没有什么可看的。打开符号链接将尝试根据路径解析语义打开它所引用的内容 (no O_NOFOLLOW
) 或失败 ( O_NOFOLLOW
)。读取此抽象层内容的方法是,它只会为您提供传递来创建它的readlink
字节序列。symlink
这并没有告诉您有关它在磁盘上如何表示的任何信息。
要检查磁盘上的表示形式,您需要打开(或使用打开的工具)块设备,并遍历文件系统结构,直到到达您想要查看的符号链接。我相信 ext4 将小内容符号链接内联存储在 inode 结构中(磁盘上没有单独的数据块),并将大内容仅存储为包含链接内容的文件,但类型为符号链接。