标签:进一步 应用程序 进程 uri bytes 升级 logs 可见 并且
在mac文件系统中可以对一个文件进行标题中的这5种操作,操作的结果都是生成一份副本,但是其中却有很大区别。
首先操作上的区别很明显
然后其中的 复制和拷贝 跟另外三种方式本质上不同,它们之间的区别也很好理解
但 软连接、硬连接、替身 间的区别就需要进一步分析。
它们本质上都不会生成文件的副本,而是通过各种方式去指向原文件,让你可以跟访问原文件一样访问连接或是替身。
这里先分析软连接(或者说符号链接 symbolic link)和硬连接(hard link),它们都是在「POSIX」标准中就有的,所以在Linux和macOS上都会有,而且也是一样的。
他们的作用有:
从使用的角度讲,两者没有任何区别,都与正常的文件访问方式一样,支持读写,如果是可执行文件的话也可以直接执行。区别在于底层原理:软连接本身是一个文件,类似Windows 的快捷方式,可以让你通过连接文件到原文件;硬连接是通过文件系统的inode连接来产生新文件名,跟访问原文件一样进行访问,中间不会产生新文件,下面举个例子详细说明。
我们先以文件为例(目录稍有不同),在一个目录中创建一个文件和它的软硬连接
(注:因为涉及一些linux系统有关的讨论,本文中一律使用「目录」这个名称代替「文件夹」)
$ touch myfile && echo "my file first line" > myfile
$ ln myfile hard # 创建一个硬连接文件hard
$ ln -s myfile soft # 创建一个软连接文件soft
首先,我们会发现,通过软连接、硬连接和文件本身myfile对「文件内容」进行操作的效果都是一样的,实际上都是操作myfile
$ echo "new line by hard" >> hard
$ cat myfile
my file first line
new line by hard
$ echo "new line by soft" >> soft
$ cat myfile
my file first line
new line by hard
new line by soft
但如果我们我们对文件本身进程操作,对软连接和硬连接的影响就不太一样了
删除 myfile 文件,然后分别输出软硬链接的文件内容,你会发现软连接会找不到文件,但硬连接却能正常访问
$ rm myfile
$ cat hard
my file first line
new line by hard
new line by soft
$ cat soft
cat: soft: No such file or directory
# 先查看下现在目录的状态
$ ls -lhi
87446916 -rw-r--r-- 1 bigbear staff 63B 11 30 10:51 hard
87450113 lrwxr-xr-x 1 bigbear staff 6B 11 30 10:44 soft -> myfile
来解释原因,首先回到删除文件之前,在目录下查看文件和连接的详细信息(目录文件的block内容)
$ ls -lhi
# inode号 文件属性 连接数 拥有者 所属用户组 大小 文件创建时间 文件名(路径)
87446916 -rw-r--r-- 2 bigbear staff 28B 11 30 10:42 hard
87446916 -rw-r--r-- 2 bigbear staff 28B 11 30 10:42 myfile
87450113 lrwxr-xr-x 1 bigbear staff 6B 11 30 10:44 soft -> myfile
关于每列信息代表的意思都在注释里写了,几个特殊的稍微解释一下
所以进一步分析:
软连接
硬连接
这样就能解释前面修改文件内容和修改文件本身的表现不同的原因
可以画图演示两种连接读取过程的区别
从上面的说明来看,软连接缺点很大,似乎硬连接更安全,因为即使某一个目录下的文件被删掉了也没有关系,只要有任何一个目录下存在文件,那么该文件就不会不见。但由于硬连接的限制太多, 所以在用途上是比较受限的,反而是软连接的使用面更广。
软连接缺点
硬连接的限制
另外,虽然上面说解决硬连接无法连接目录的方法有软连接,但其实还有一个办法,在Linux中还能使用mount --bind命令
有些程序里对软连接的支持并不好,这时就可以通过mount --bind命令来将两个目录连接起来
但不同于硬连接是把两个文件名关联同一个inode记录,当mount --bind命令执行后:
由上述过程可知,mount --bind 和硬连接的主要区别是:
其实从上面的描述,你会发现,不管是软连接还是硬连接,都有各自的缺点:
那能不能设计一种连接方式,避免这些缺点,比这两种连接方式更稳定?
重新设计有点困难,我们可以从优化开始:假设能把这两种方式结合在一起,是不是就完全没有缺点了?看上去可行,因为软连接的问题硬连接完全没有,硬连接的问题软连接也完全没有,只要两者结合就能互补,但你仔细想一下,软连接的问题硬连接也有,那就是虽然硬连接删除了原文件也能工作,但是需要在同一文件系统内才行,所以两种方式都有同样的问题:跨文件系统删除原文件,都会找不到原文件。
假如忽略这个问题,结合软连接和硬连接的最简单方式就是扩展软连接了,因为硬连接本身就是文件系统的元功能,修改的动静太大,所以扩展软连接比较靠谱。扩展的方式很简单:在软连接文件的block中添加一条信息,也就是inode号,先找路径,如果找不到,就看Inode在不在,或者查找顺序反过来。
而如果要进一步解决最后的问题,只能升级Inode了,让它能带有不同文件系统的前缀之类的,让inode号整个操作系统唯一。
我们的思考先到这里,来看苹果公司的思考吧,苹果不仅思考了这个问题,而且还给出了他们的解决方案:替身(Alias)。
其实说白了苹果的解决方案跟我们刚才想的一样,替身文件包含了原文件的路径和inode(好像不完全是这样,但是是类似的),当用户访问替身文件时,系统分析替身文件,找到原始文件的路径信息,然后判断原始文件是否存在,如果存在就访问它,如果不存在,就找具有相同inode的文件,然后访问该文件。
所以替身虽然具有软硬连接的优点,但还会面临上面提到的最后一个问题。
同时替身只是macOS自己的概念,并且是Finder层级的概念,所以终端下的程序(比如vim)是不能识别替身的。
比如我手动创建一个替身「myfile的替身」,能看到确实是新文件,inode号不一样,大小也大很多,同时会看到文件属性稍微有点不一样(是普通文件类型,但是最后多了一个属性@),然后使用cat查看时,不会自动定向到myfile上,而是直接看到了它的内容。
$ ls -lhi
87455259 -rw-r--r-- 1 bigbear staff 63B 11 30 10:51 hard
87455259 -rw-r--r-- 1 bigbear staff 6B 11 30 11:00 myfile
87824419 -rw-r--r--@ 1 bigbear staff 880B 12 4 01:40 myfile的替身
87450113 lrwxr-xr-x 1 bigbear staff 6B 11 30 10:44 soft -> myfile
$ cat myfile的替身
bookm??s/b????n?Aop/tUsersbigbearDesktoptemp2myfile 0@m*???A??? file:///
Macintosh H ?A???$72B43??0F-211??88C???/0dn?`??@?T U V ?? l | ?0 ???P"??%
但是在finder中,你会看到替身的图标也是链接状的,你也可以双击替身打开myfile文件
标签:进一步 应用程序 进程 uri bytes 升级 logs 可见 并且
原文地址:http://www.cnblogs.com/bellkosmos/p/8016911.html