笔记---Linux连接

1 参考文章

https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/

2 什么是Linux的连接?

在windows系统中,我们称之为快捷方式,在Linux中我们称其为连接。
Linux中,连接又分为两种,软连接和硬连接。

2.1 硬链接

硬链接后,修改任何一个文件,所有inode号相同的文件内容都会被修改。

这要从Linux的文件系统说起:
UNIX系统中除了进程之外的一切皆文件,而Linux保持了这一特性。
Linux上文件被分为两部:用户数据(user data) 和 元数据(metadata)。
用户数据:即文件数据块(data block),数据块是记录真实文件内容的地方。
元数据: 元数据则是文件的附加属性,如文件大小,创建时间,所有者等信息,还有一个inode号。

元数据中的inode文件索引号才是文件的唯一标识而非文件名,文件名只是为了让人们方便记忆和使用。

下图展示了程序通过文件名获取文件内容的过程:

笔记---Linux连接_第1张图片
在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文件。

硬链接存在一下几个特点:

  • 文件有相同的inode 及 data block
  • 只能对已存在的文件创建
  • 不能交叉文件系统进行硬连接的创建
  • 不能对目录进行创建,只可以对文件创建
  • 删除一个硬链接文件不会影响到其他具有相同inode号的文件
2.1.1 如何理解第三点 “不能交叉文件系统进行硬连接的创建”?

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号被用完但磁盘空间还有剩余的情况。

2.2 软连接

软连接与硬链接不同,若文件用户数据块内容是另一个文件的路径名的指向,则该文件就是软连接。
没错,软连接是一个普通文件,只是数据块内容有点特殊。
软连接文件有自己的inode号。

特点如下:

  • 软连接有自己的文件属性及权限等
  • 可对不存在的文件或目录创建软连接
  • 软连接可交叉文件系统
  • 软连接可对文件或目录创建
  • 创建软连接时,连接计数器i_nlink不会增加
  • 删除软连接并不影响被指向的文件,但若被指向的文件被删除,则相关软连接被称为死链接(dangling link),若被指向的文件重新创建,死链接可恢复为正常软连接。

软连接的访问:
笔记---Linux连接_第2张图片
创建软连接用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

你可能感兴趣的:(linux)