https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/
在windows系统中,我们称之为快捷方式,在Linux中我们称其为连接。
Linux中,连接又分为两种,软连接和硬连接。
硬链接后,修改任何一个文件,所有inode号相同的文件内容都会被修改。
这要从Linux的文件系统说起:
UNIX系统中除了进程之外的一切皆文件,而Linux保持了这一特性。
Linux上文件被分为两部:用户数据(user data) 和 元数据(metadata)。
用户数据:即文件数据块(data block),数据块是记录真实文件内容的地方。
元数据: 元数据则是文件的附加属性,如文件大小,创建时间,所有者等信息,还有一个inode号。
元数据中的inode文件索引号才是文件的唯一标识而非文件名,文件名只是为了让人们方便记忆和使用。
下图展示了程序通过文件名获取文件内容的过程:
在Linux中查看inode号可以使用stat或ls -i命令。
使用命令mv移动并且重命名文件file.txt,其结果不影响文件的用户数据以及inode号,文件移动前后inode号均为:20447702
[pzs@pzs-server:Test_CanRemove]$ ls -i file.txt
20447702 file.txt
[pzs@pzs-server:Test_CanRemove]$ mv file.txt file.txt.new
[pzs@pzs-server:Test_CanRemove]$ ls -i file.txt.new
20447702 file.txt.new
为了解决文件共享问题,Linux系统引入了硬连接,若一个inode号对应多个文件名,则称这些文件为硬链接。换而言之,硬链接就是同一个文件使用了多个别名。
硬链接可以由命令link或ln创建,如下对文件file.txt.new创建硬连接(file.txt.new.hardLink就是file.txt.new的一个别名):
$ ln file.txt.new file.txt.new.hardLink
$ ls -ilF
total 8
20447702 -rw-rw-r-- 2 pzs pzs 6 Sep 3 15:24 file.txt.new
20447702 -rw-rw-r-- 2 pzs pzs 6 Sep 3 15:24 file.txt.new.hardLink
会自动创建一个file.txt.new.hardLink文件。
硬链接存在一下几个特点:
Linux系统是支持一台机器具有不同文件系统的,比如设备文件目录/dev使用的文件系统是devtmpfs,而/root使用的是磁盘文件系统ext4。
使用df命令可以查看当前系统挂载的文件系统信息:
[pzs@pzs-server:/]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 8131172 0 8131172 0% /dev
tmpfs 1630140 157100 1473040 10% /run
/dev/sda5 47929224 21042236 24429236 47% /
tmpfs 8150696 599472 7551224 8% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 8150696 0 8150696 0% /sys/fs/cgroup
/dev/sda1 4871876 3492 4868384 1% /boot/efi
/dev/sda7 419940008 371789120 26796136 94% /home
cgmfs 100 0 100 0% /run/cgmanager/fs
tmpfs 1630140 132 1630008 1% /run/user/1000
inode在不同文件系统下是唯一的,当Linux挂载多个文件系统后将出现inode号重复的现象,因此硬链接创建时不可以跨文件系统。
查找具有下同inode号的文件:
[pzs@pzs-server:/]$ df -i --print-type
Filesystem Type Inodes IUsed IFree IUse% Mounted on
udev devtmpfs 2032793 515 2032278 1% /dev
tmpfs tmpfs 2037674 843 2036831 1% /run
/dev/sda5 ext4 3055616 450682 2604934 15% /
tmpfs tmpfs 2037674 422 2037252 1% /dev/shm
tmpfs tmpfs 2037674 6 2037668 1% /run/lock
tmpfs tmpfs 2037674 18 2037656 1% /sys/fs/cgroup
/dev/sda1 vfat 0 0 0 - /boot/efi
/dev/sda7 ext4 26673152 2847292 23825860 11% /home
cgmfs tmpfs 2037674 14 2037660 1% /run/cgmanager/fs
tmpfs tmpfs 2037674 61 2037613 1% /run/user/1000
值得一提的是,Linux系统存在inode号被用完但磁盘空间还有剩余的情况。
软连接与硬链接不同,若文件用户数据块内容是另一个文件的路径名的指向,则该文件就是软连接。
没错,软连接是一个普通文件,只是数据块内容有点特殊。
软连接文件有自己的inode号。
特点如下:
软连接的访问:
创建软连接用ln -s 命令:
(软连接显示为天蓝色)
访问软连接就像访问正常文件/文件夹一样:
[pzs@pzs-server:Test_CanRemove]$ cat file.txt.new.softLink
hello
[pzs@pzs-server:Test_CanRemove]$ vim file.txt.new.softLink
ubuntu经常用要添加PPA源,就是使用如下命令:
sudo add-apt-repository ppa:XXX
但不知什么时候开始,就出现了错误Error: No module named ‘apt_pkg’ 。
那么如何解决这个问题呢?
我们发现"apt-add-repository"命令其实就是一个python脚本,打开这个脚本:
sudo gedit /usr/bin/apt-add-repository
发现最上面一行写着:#! /usr/bin/python3
看到python3命令是个软链接(天蓝色):
那么命令(软连接)是指向哪个可执行程序呢?
[pzs@pzs-server:bin]$ sudo ls -l /usr/bin/python3
lrwxrwxrwx 1 root root 18 Aug 28 17:16 /usr/bin/python3 -> /usr/bin/python3.6
[pzs@pzs-server:bin]$
可以看到指向的是python3.6,问题就出现在这里
接下来:
cd /usr/lib/python3/dist-packages/
ls apt_pkg*
显示:apt_pkg.cpython-35m-x86_64-linux-gnu.so
注意35m,这表示python3.5可以安全使用这个组件!而我们系统python3是链接到python3.6的。
( /usr/lib/python3/dist-packages/ 该路径是python3的公共库之一
python3.5是ubuntu推荐使用的python版本)
那么只要修改python3的链接就行了
sudo rm /usr/bin/python3
sudo ln -s /usr/bin/python3.5 /usr/bin/python3
第二种解决方法
修改add-apt-repository脚本,将第一行改为#! /usr/bin/python3.5