绝对路径的表示方式为什么是"/usr"而不是"//usr"
今天闲逛贴吧,竟然看到有个人问绝对路径的表示方式为什么不是//usr/local而是/usr/local。原文:

我想99%的人都没想过这个问题,都理所当然的认为:它不就是根"/"吗?
很巧,我是个探索狂和强迫症患者,当年回炉复习文件系统的时候,正好琢磨过这个问题。下面是我的理解,自认能解释的通。但本人毕竟菜鸟,也没法验证是否真是如此,如有错误,欢迎大牛指正。
我的结论是:"//usr/local"是正确的,和"/usr/local"的意义完全相同。
1.根文件系统具有"自引用"性,"/"和"//"无论是功能上还是意义上,都完全相同。
2.除了根目录外的任意目录,其内的"."和".."的inode号不一致,它们分别是当前目录的硬链接和父目录的硬链接。但是根目录下的"."和".."的inode号一致,都是根目录的硬链接。
例如:
[root@node1 ~]# ls -ail /usr
total 204
155 drwxr-xr-x. 13 root root 4096 May 11 2017 .
128 dr-xr-xr-x. 17 root root 4096 May 11 2017 ..
[root@node1 ~]# ls -ail /
total 36
128 dr-xr-xr-x. 17 root root 4096 May 11 2017 .
128 dr-xr-xr-x. 17 root root 4096 May 11 2017 ..
3.在Linux操作系统启动的时候,内核先有"虚拟根文件系统",表示方法为"/",之后找到真实的根文件系统,从"虚拟跟文件系统"切换到"真实根文件系统"。切换的方式就是将真实的根文件系统"挂载"到虚拟根文件系统上(并非真的挂载,但可以这么理解)。所以到这里正确的方式是"//",其中第一个"/"是虚拟根目录,第二个"/"是真实根文件系统。
因此,根文件系统下的".."代表的是第一个"/",即虚根,"."代表的是第二个"/",代表的是真实根目录。
在切换到真实根文件系统时,虚根和实根的inode号是一致的。但为什么能一致?虚根为什么也有inode号?
这是因为在每个分区创建为文件系统的时候,一定会预先保留几个特殊的inode号,相同的文件系统,这些预留inode号一定是相同的。例如ext类的文件系统中,为"/"保留的inode号为2,为"/proc"保留的inode号为1。这些预留的inode号就是为了给切换到真实根文件系统前的虚拟根文件系统使用的,它们记录在initrd/initramfs中。这样一来,既能为虚根分配inode,又能保证在切换时,"/"(虚根)和"//"(实根)的inode号保持一致,并在系统成功启动后使用。
之所以可以使用"/"来代替"//",也许是为了方便,也许是为了某些一致性,谁知道呢,甚至上面我的推理也是错误的呢。此外,除了绝对路径的前缀"/",路径中的任意"/"都可以替换为"//",例如"/usr//local"也能正确表示"/usr/local",但它们和前缀的"//"意义不同,之所以不报错且能正确当成单个斜线/,是因为系统有专门的路径处理函数。
绝对路径的表示方式为什么是"/usr"而不是"//usr"的更多相关文章
- java获得路径的多种方式
本文讲解java语言中获得运行时路径的多种方式,包括java项目.java web项目.jar.weblogic等多种场景. 一.this.getClass().getClassLoader().ge ...
- Linux下/usr/bin与/usr/local/bin/区别总结
Linux下/usr/bin与/usr/local/bin/区别总结 2017年10月13日 12:30:17 2puT 阅读数:15930 版权声明:本文为博主原创文章! github地址:h ...
- -bash: /usr/bin/yum: /usr/bin/python: bad interpreter: No such file or directory
-bash: /usr/bin/yum: /usr/bin/python: bad interpreter: No such file or directory python多版本造成额问题 找不到p ...
- an安装jenkins时遇到ERROR: No Java executable found in current PATH: /bin:/usr/bin:/sbin:/usr/sbin的问题
# sudo /etc/init.d/jenkins restartERROR: No Java executable found in current PATH: /bin:/usr/bin:/sb ...
- Linux /bin、/sbin、/usr/bin、/usr/sbin目录的区别
在linux下我们经常用到的四个应用程序的目录是/bin./sbin./usr/bin./usr/sbin .而四者存放的文件一般如下: bin目录: bin为binary的简写主要放置一些 ...
- linux中/bin和/sbin和/usr/bin和/usr/sbin
首先先解释一下bin和sbin的意思: 1.bin:为任何用户都可以使用的指令 2.sbin:(super bin)也就是只有超级管理员才能使用的指令 /usr UNIX Software Re ...
- 为什么开源外围包安装指导都是按照到/usr/local/目录下,/usr/local与/usr的区别
很多应用都安装在/usr/local下面,那么,这些应用为什么选择这个目录呢?Automake工具定义了下面的一组变量: Directory variable Default value prefix ...
- /bin, /sbin & /usr/bin, /usr/sbin & /usr/local/bin, /usr/local/sbin & glibc
操作系统为自身完成启动所需要的 /bin, /sbin 系统基本管理所需要的 /usr/bin, /usr/sbin 第三方的 /usr/local/bin, /usr/local/sbin 核心库 ...
- 【centos】/usr/bin与/usr/local/bin的区别
首先注意usr 指 Unix System Resource,而不是User 然后通常: /usr/bin下面的都是系统预装的可执行程序,会随着系统升级而改变. /usr/local/bin目录是给用 ...
随机推荐
- flag读取控制台参数
package main import ( "fmt" "os") func main() { arg := os.Args if len(arg) < ...
- Django认证系统
一.cooie与session 1.1 cookie与session cooie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又要保持状态,因此cookie就是在这样的一个场 ...
- Python学习过程中各个难点---函数篇
对于函数,我一直分不清局部变量与全局变量,今天又好好研究了下,终于搞清楚了. 例子: 其次对于global这个关键字我也是一知半解的状态,之前整个人都是懵懵的,现在搞明白了 匿名函数: 匿名函数使用关 ...
- JS中创建多个相同的变量出现的问题
在做轮播图的时候出现了一个问题:如果定义两个完全相同的变量会发生什么: 1.两个全局变量: var num = 10; var num =100; 这种情况下很明显输出num的话会是100,但是内存中 ...
- 64位平台C/C++容易犯的错误
64位平台的介绍 IA-64 is a 64-bit microprocessor architecture developed by Intel and Hewlett Packard compa ...
- mysql5.5 五种日期
mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 D ...
- 【渗透技术】渗透测试技术分析_TomCat
[渗透技术]渗透测试技术分析_TomCat 本文转自:i春秋论坛 渗透测试-中间人攻击(原理)说起“中间人攻击”我想大多数对渗透测试又了解的朋友都多少有所了解,因为我们用到的次数真是非常的多.它可以将 ...
- Spring依赖注入(DI)详解
一.依赖简介 一个典型的企业应用程序不是由一个单一的对象组成(或Spring的说法中的bean).即使是最简单的应用程序也只有几个对象一起工作来呈现最终用户看作是一个连贯的应用程序.如何从定义许多独立 ...
- 5个相见恨晚的Linux命令
阅读本文大概需要 2.4 分钟. 作者 | 李火清 转载自[CU技术社区] 编者按:说到Linux命令相信大家都不陌生,就连前端现在也要经常在 terminal 敲一些 node,gulp等命令,本文 ...
- vi命令详解(转)
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...