日期:2014-05-16  浏览次数:20665 次

linux symbolic link之学习总结

1. symbolic link是什么?

linux symbolic link类似于windows系统中的快捷方式。

symbolic link仅仅包含了指向目标文件的相对路径或绝对路径。

早期的symbolic link直接分配磁盘空间来存储这个相对路径或绝对路径,

这种做法效率低,而且会造成磁盘空间的浪费。

现在的symbolic link的做法是将这个信息直接存放在文件的inode上,

所以它不需要磁盘存储空间去存储信息,但symbolic link会占用一个inode。

 

2. 如何创建symbolic link?

ln -fs ./source_file ./link_file用来创建一个新的symbolic link文件link_file,这个link_file实际指向source_file。

其中可选参数-s指定用来创建一个symbolic link;-f用来强制创建,如果已经有一个同样的symbolic link

文件存在了,将其remove掉再重新创建一个。

这里有个问题,因为我们知道对symbolic link文件的访问跟对源文件的访问是一样的,所有使用-f可选参数

来强制创建symbolic link看起来是没有意义的。

所以个人的建议是使用如下的命令来创建symbolic link就可以了。

ln -s ./source_file ./link_file

下面是在当前path下创建的一个symbolic link文件./ooooX,它指向./oooo这个源头文件。

sh# ls -lh ./oooo*
-rw-r--r-- 1 root root 0 Jan  1 01:24 ./oooo
lrwxrwxrwx 1 root root 6 Jan  1 01:25 ./ooooX -> ./oooo

 

3. symbolic link的小应用?

假设有A,B两个程序,他们需要靠共享./IPC.txt来实现进程间通信

(这里仅做示例用,实际process之间通信的IPC机制有很多)。

再假设某次A程序做了升级,他们认为使用./IPC_led_status.txt这样的名称能够更加体现这个文件的真正意义。

但如果没有通知B程序修改,则会导致B程序功能失效以及A/B之间的通信失败;

如果通知了B程序,但B程序不愿意做相应的修改,那怎么办?

在这个问题上,个人的理解是:B程序可以配合A程序修改;B程序也有权利拒绝修改除非有无法拒绝的理由。

如果B程序拒绝,那此时代价较小的一种折中做法是:

ln -s ./IPC_led_status.txt ./IPC.txt

即创建一个指向IPC_led_status.txt的名字为IPC.txt的symbolic link文件。

此例中A程序犯的错误在于他没有考虑到软件设计中的一条重要规则,即软件的兼容性,

不要因为你的改动而造成到别人的程序运行错误。

 

4. hard link以及其与symbolic link的区别?

ln ./test ./test00

如果没有特别指定,那ln会默认创建./test文件的hard link ./test00。

从如下的ls结果可以看到,

如果是hard link,那这两个文件具有同一个inode,而文件的内容在文件系统中则会存在两份,

所有即使删掉其中一个,也不会造成文件信息的丢失;

如果是symbolic link,那这两个文件是具有两个独立的inode,不过symbolic link文件会直接指向源文件,

所以如果你rm了源文件的话,那symbolic link文件就是失去其存在的价值了。

sh# ls -lhi ./test*
14975 -rw-r--r-- 2 root root 0 Jan  1 00:19 ./test
14975 -rw-r--r-- 2 root root 0 Jan  1 00:19 ./test00
15645 lrwxrwxrwx 1 root root 7 Jan  1 00:20 ./test11 -> ./test

 

以上,仅是个人结合学习和工作的理解。

事实上symbolic link的功能和应用应该远不止如此,大家按需学习哈。

1楼