Linux根目录名称中是否包含斜杠(/)?


46

斜杠(/)确实是Linux根目录名称的一部分吗?还是仅仅是它的象征?

那又如何/etc呢?

更新资料

假设/dev/sda2是Linux根目录的块设备。

$ sudo debugfs / dev / sda2
debugfs 1.44.1(2018年3月24日)
debugfs:   pwd
[pwd] INODE:2路径:/
[root] INODE:2路径:/
debugfs:   统计信息/    索引节点
:2    类型:目录模式:0755标志:0x80000
世代:0版本:0x00000000:00000077
用户:0组:0项目:0大小:4096
文件ACL:0
链接:25阻止计数:8
片段:地址:0数字:0大小:0
 ctime:0x5b13c9f1:3f017990-2018年6月3日15:28:57
 atime:0x5b13ca0f:3b3ee380-2018年6月3日15:29:27
 mtime:0x5b13c9f1:3f017990-2018年6月3日15:28:57
crtime:0x5aad1843:00000000-2018年3月17日星期六16:59:39
额外的inode字段的大小:32
延伸:
(0):9249

因此,其中存在一个目录,即索引节点2,但没有名称。


1
关于您最近的更新显示了一些debugfs输出。您能否阐明这如何改变问题?
库萨兰达

没有。我只是想完成答案。但我不想添加另一个。所以我更新了它。如果您可以在答案中加入thease行,则会将其删除
mlibre

Answers:


61

POSIX.1-2008标准说

由单个组成的路径名/应解析到进程的根目录。空路径名将无法成功解析。

该标准进一步区分了文件名路径名/是根目录路径的路径名。目录的名称是“根目录”,但是在文件系统中它是无名的,它没有文件名。如果它具有文件名,则该名称将是根目录上方目录中的目录条目,并且没有这样的目录。

字符/永远不能成为文件名的一部分,因为它是路径分隔符。

为了清楚起见:/不是根目录的名称,而是它的路径,即它的pathname

/etc是另一个路径名。它是etc目录的绝对路径的名称。该路径下的目录名称为etc(其文件名为etc)。

/usr/local/bin/curlcurl可执行文件的路径名,其方式/etcetc目录的路径名相同。


“如果有文件名,那么该名称将是根目录上方目录中的目录条目”从技术上讲,这将是两件事-索引节点号和名称(我们知道这是索引节点2)。还有趣的是,它/..指向/,并且/本身具有目录条目-这是旧的/.;所有这些3两件事都指向相同的inode - 2
谢尔盖Kolodyazhnyy

@SergiyKolodyazhnyy 从技术上讲,根目录是“每个进程”,这在chroot环境中很重要。在chroot中,根目录的inode号不是特定的数字(它是chroot根的inode号)。另外,我认为数字2(在非受限情况下)取决于所使用的文件系统。
库沙兰南达

我还注意到这/是根据每个进程的根定义的,但我不知道inode chroot不一定是2。这是一个非常有趣的事实。它还提出了一个问题,即/特权内核进程的目录是什么。这是否意味着只有用户空间进程/与之关联?
Sergiy Kolodyazhnyy

37

斜线是分隔符 ; 目录不包含分隔符,但完整路径名包含分隔符。

因此,“根级别” /没有名称。在大多数类Unix系统,这被视为就像一个特例...(当然有在根级别两者之间没有差别)。

命名可以不同。例如,POSIX.1-2017列出了一些常用的定义

  • 3.2绝对路径名

    路径名以单个或两个以上的<slash>字符开头;另见Pathname

  • 3.271路径名

    用于标识文件的字符串。在POSIX.1-2008的上下文中,路径名可以限制为{PATH_MAX}个字节,包括终止空字节。它具有可选的起始<slash>字符,后跟零个或多个以<slash>字符分隔的文件名。路径名可以选择包含一个或多个结尾<slash>字符。多个连续<slash>字符被认为与一个相同<slash>,除了恰好两个前导<slash>字符的情况外。

    注意:如果路径名仅包含与可移植文件名字符集中的字符(请参见可移植文件名字符集),<slash>字符和单个终止符相对应的字节<NUL>字符,路径名将在所有支持的语言环境中用作字符串;否则,路径名只能是一个字符串(而不是字符串)。此外,由于<slash>要求字符的单字节编码在所有语言环境中都相同,并且不能出现在多字节字符中,因此<slash>即使路径名不是字符,也必须很好地定义对路径名中字符的引用串。但是,此属性不一定适用于可移植文件名字符集中的其余字符。

  • 3.272路径名组件

    请参阅文件名中的文件名

  • 3.170文件名

    字节序列,由1到字节组成,{NAME_MAX}用于命名文件。组成名称的字节不得包含<NUL><slash>字符。在路径名的上下文中,每个文件名都应后跟一个<slash><NUL>字符;在其他地方,文件名后跟一个<NUL>字符组成一个字符串(但不一定是字符串)。文件名加dot-dot具有特殊含义。文件名有时被称为“路径名组件”。另请参见路径名

所以...如果您需要澄清,那可能不是您的第一站。诸如“ UNIX概念”页面之类的教程会很有帮助,例如,指出“完整路径名”与“绝对”路径名“同义”。


3
Nitpick:点和点点是文件名,而不是路径名。实际上,POSIX标准有一个奇怪的表述:“在特殊情况下,在根目录中,点号可能表示根目录本身。” (我的重点)。
Kusalananda

因此,读取字母说明/不是有效的文件名或路径名组件,也不是包含此类组件的字符串,但对于某个目录仍然是完全有效的路径名。它必须存在,尽管要求这样做的部分没有提及其“名称”。不知何故,我觉得这有点有趣。
ilkkachu

POSIX中回答:它具有可选的开始字符,后跟零个或多个以字符分隔的文件名。
Thomas Dickey

@Kusalananda查看您强调的规格原理。规范中定义的可能是对实施测试的明确保证。在可能使用的地方,该规范可确保定义的行为的任何萌芽坚持者。换句话说,任何实现依靠../链接/
mikeserv

19

在Unix中,文件(和目录只是文件)没有“名称”。链接具有名称,链接是目录中将名称映射到文件的条目。

可能会说,链接为文件提供了名称,但请注意:这意味着一个文件可以具有多个名称,因为它可以具有多个链接。

由于根目录是根目录,因此,在其中没有“上级”目录可以链接到该目录,因此不能有与之关联的名称。从理论上讲,可以在其他目录中的根目录中添加链接,但是大多数Unices禁止添加到现有目录的链接,因为这可能会导致文件系统层次结构(实际上是有向图)中的循环,并检测循环在图中花费很大,但是在尝试解析内核中的名称时,未检测到它们可能导致无限递归。

因此,基本上,根目录没有名称,因为它上面没有目录可以记录名称。

正如其他答案中指出的那样,我们需要区分名称和路径(名称)。可以通过path(name)引用根目录/


是的,文件可以像人一样具有多个名称。我小女儿的丈夫通常以他的中间名命名,但显然他也必须回答他的名字。根目录的主要名称是“ /”,发音为“斜杠”,因为其绝对路径名是“ /”(并且基于相对路径名的名称并不是特别有用)。(将其称为“ root”可能会与“ / root”混淆,后者应始终称为“ slash root”。)
Monty Harder

1
我喜欢它没有名称的观点,因为没有更高的目录可以记录该名称。这很好地阐明了这个概念。

7

“名称”一词的使用有点灵活;它可以引用“完全限定的路径名​​”;它可以参考“目录条目”;它可以引用传递给各种函数或例程的“文件名”。

因此,例如,/etc/fooand /var/tmp/../../etc/foo/tmp/../../../../../../foo都是引用同一文件的所有方式;它们都是有效名称,就像foo/etc目录中一样。

让我们回到基础。

Unix中的文件名由目录分隔符分隔的组件组成/。对组件的唯一限制几乎是它们不能包含/or或NUL字符。允许其他任何事情。

因此,“完全限定的路径名​​” /etc是完整的字符串:/etc。这意味着它etc在根目录中具有该组件。

类似地/x/y/z/foo,该foo组件将在/x/y/z目录中。

现在,根目录是唯一的,因为它在父目录中没有任何组件。它只有完整的路径名作为其名称:/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.