首页 > 编程知识 正文

python生成linux可执行文件,linuxPython找不到文件

时间:2023-05-06 20:13:50 阅读:52378 作者:4151

为了明确ln命令,首先需要说明ext文件系统(Linux文件系统)是如何工作的。 前面介绍的分区格式是写入文件系统,但Linux当前使用的是ext4文件系统。 用图像说明ext4文件系统,可以参考图1。

图1 ext4文件系统映像

在ext4文件系统中,分区主要分为两大部分。 我不会提到超级块。 这意味着用于存储文件的inode信息的一部分。 剩下的大部分用于存储块信息。

索引节点的默认大小为128字节,包括文件权限(r、w、x )、文件所有者和所属组、文件大小、文件状态更改时间(ctime )、文件上次读取时间)、文件仔细看,你会发现inode没有记录文件名。 那是因为文件名记录在文件所在目录的block中。

块大小为1KB、2KB和4KB,默认值为4KB。 块用于实际的数据存储,如果一个块容纳不下数据,则可以占用多个块。 例如,如果需要保存10KB的文件,则会占用三个块。 最后一个块不能满,但不能包含其他文件中的数据。 这三个块可以是连续的,也可以是分散的。

这样可以了解以下两个重要信息:

每个文件自己占用一个inode,文件内容通过inode的记录表示;

要读取文件的内容,必须使用目录中记录的文件名找到文件的inode,才能正确找到包含文件内容的块。

了解Linux系统基础文件的保存状态后,接下来学习ln命令。

ln命令用于创建指向文件的链接。 根据Linux系统存储文件的特点,链接方法分为以下两种:

软链接:类似于在Windows系统上创建文件的快捷方式。 这意味着生成指向另一个文件的特殊文件。 此链接方法也适用于目录。

硬链接:我们知道文件的基本信息存储在inode中。 硬链接是为一个文件的inode分配多个文件名,从其中一个文件名中找到该文件的inode,然后读取该文件的数据信息。

ln命令的基本格式如下:

[根@ localhost~] # ln [选项]源文件目标文件

可选:

-s :创建软链接文件。 如果不指定“-s”选项,则创建硬链接文件;

(f )强迫。 如果目标文件已经存在,请删除目标文件,然后创建链接文件;

【例1】硬链接的创建:

[root@localhost ~]# touch cangls

[ root @ localhost~] # ln/root/can gls/tmp

#创建硬链接文件。 目标文件中没有写入文件名,而是与原始名称一致

#也就是说,/tmp/cangls是硬链接文件

【例2】制作软链接:

[root@localhost ~]# touch bols

[ root @ localhost~] # in-s/root/bols/tmp

#创建软链接文件

需要注意的是,软链接文件的源文件必须以绝对路径写,而不是以相对路径写(硬链接没有这样的要求)。 软链接文件报告错误。 这是初学者非常容易犯的错误。

局域网创建链路的深度分析

做硬链接和软链接很容易,那两个链接有什么区别? 它有什么作用呢? 这是链接文件最难理解的地方。 分开说吧。

创建ln硬链接

再创建一次硬链接文件,看看这两个文件的特点。

[root@localhost ~]# touch test

#创建源文件

[ root @ localhost~] # ln/root/test/tmp/test-hard

#创建指向源文件的硬链接文件/tmp/test-hard

[ root @ localhost~] # ll-I/root/test/tmp/test-hard

62147-rw-r----r----2路由06月19日10:06/路由/测试

硬盘

62147-rw-r----r----2rootroot06月19日19 10:06 /tmp/test-hard

#查看两个文件的详细信息,可以看到这两个文件的inode编号相同,“ll”与“ls -l”相同。

这里有件奇怪的事。 我们以前谈到inode号码时,说每个文件的inode号码应该不一样。 I节点编号相当于文件ID。 查找文件时,必须先查找inode编号,然后才能读取文件的内容。

但是,这里源文件和硬链接文件的inode编号竟然是一样的

的,那我们在查找文件的时候,到底找到的是哪一个文件呢?我们来画一张示意图,如图 2 所示。

图 2 硬链接示意图

在 inode 信息中,是不会记录文件名称的,而是把文件名记录在上级目录的 block 中。也就是说,目录的 block 中记录的是这个目录下所有一级子文件和子目录的文件名及 inode 的对应;而文件的 block 中记录的才是文件实际的数据。

当我们查找一个文件,比如 /root/test 时,要经过以下步骤:

首先找到根目录的 inode(根目录的 inode 是系统已知的,inode 号是 2),然后判断用户是否有权限访问根目录的 block。

如果有权限,则可以在根目录的 block 中访问到 /root 的文件名及对应的 inode 号。

通过 /root/ 目录的 inode 号,可以查找到 /root/ 目录的 inode 信息,接着判断用户是否有权限访问 /root/ 目录的 block。

如果有权限,则可以从 /root/ 目录的 block 中读取到 test 文件的文件名及对应的 inode 号。

通过 test 文件的 inode 号,就可以找到 test 文件的 inode 信息,接着判断用户是否有权限访问 test 文件的 block。

如果有权限,则可以读取 block 中的数据,这样就完成了 /root/test 文件的读取与访问。

按照这个步骤,在给源文件 /root/test 建立了硬链接文件 /tmp/test-hard 之后,在 /root/ 目录和 /tmp/ 目录的 block 中就会建立 test 和 test-hard 的信息,这个信息主要就是文件名和对应的 inode 号。但是我们会发现 test 和 test-hard 的 inode 信息居然是一样的,那么,我们无论访问哪个文件,最终都会访问 inode 号是 262147 的文件信息。

这就是硬链接的原理。硬链接的特点如下:

不论是修改源文件(test 文件),还是修改硬链接文件(test-hard 文件),另一个文件中的数据都会发生改变。

不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件(inode 号是 262147 的文件)都可以被访问。

硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。

硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。

硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂。

硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除 inode 号是一样的之外,没有其他明显的特征。这些特征都使得硬链接并不常用,大家有所了解就好。

我们通过实验来测试一下。

[root@localhost ~]# echo 1111 >>/root/test

#向源文件中写入数据

[root@localhost ~]# cat /root/test

1111

[root@localhost ~]# cat /tmp/test-hard

1111

#源文件和硬链接文件都会发生改变

[root@localhost ~]# echo 2222 >> /tmp/test-hard

#向硬链接文件中写入数据

[root@localhost ~]# cat /root/test

1111

2222

[root@localhost ~】# cat /tmp/test-hard

1111

2222

#源文件和硬链接文件也都会发生改变

[root@localhost ~]# rm -rf/root/test

#删除源文件

[root@localhost ~]# cat /tmp/test-hard

1111 2222

#硬链接文件依然可常读取

ln创建软链接

软链接也称作符号链接,相比硬链接来讲,软链接就要常用多了。我们先建立一个软链接,再来看看软链接的特点。

[root@localhost ~]# touch check

#建立源文件

[root@localhost ~]# ln -s /root/check /tmp/check-soft

#建立软链接文件

[root@localhost ~]# ll -id /root/check /tmp/check-soft

262154 -rw-r--r-- 1 root root 0 6月 19 11:30 /root/check

917507 lrwxrwxrwx 1 root root 11 6月 19 11:31 /tmp/ check-soft -> /root/check

#软链接和源文件的 inode 号不一致,软链接通过 -> 明显地标识出源文件的位置

#在软链接的权限位 lrwxrwxrwx 中,l 就代表软链接文件

再强调一下,软链接的源文件必须写绝对路径,否则建立的软链接文件就会报错,无法正常使用。

软链接的标志非常明显,首先,权限位中"l"表示这是一个软链接文件;其次,在文件的后面通过 "->" 显示出源文件的完整名字。所以软链接比硬链接的标志要明显得多,而且软链接也不像硬链接的限制那样多,比如软链接可以链接目录,也可以跨分区来建立软链接。

软链接完全可以当作 Windows 的快捷方式来对待,它的特点和快捷方式一样,我们更推荐大家使用软链接,而不是硬链接。

大家在学习软链接的时候会有一些疑问:Windows 的快捷方式是由于源文件放置的位置过深,不容易找到,建立一个快捷方式放在桌面,方便查找,那 Linux 的软链接的作用是什么呢?

笔者个人觉得,软链接主要是为了照顾管理员的使用习惯。比如,有些系统的自启动文件 /etc/rc.local 放置在 /etc 目录中,而有些系统却将其放置在 /etc/rc.d/rc.local 中,那么干脆对这两个文件建立软链接,不论你习惯操作哪一个文件,结果都是一样的。

如果你比较细心,则应该已经发现软链接和源文件的 inode 号是不一致的,我们也画一张示意图来看看软链接的原理,如图 3 所示。

图 3 软链接示意图

软链接和硬链接在原理上最主要的不同在于:硬链接不会建立自己的 inode 索引和 block(数据块),而是直接指向源文件的 inode 信息和 block,所以硬链接和源文件的 inode 号是一致的;而软链接会真正建立自己的 inode 索引和 block,所以软链接和源文件的 inode 号是不一致的,而且在软链接的 block 中,写的不是真正的数据,而仅仅是源文件的文件名及 inode 号。

我们来看看访问软链接的步骤和访问硬链接的步骤有什么不同。

首先找到根目录的 inode 索引信息,然后判断用户是否有权限访问根目录的 block。

如果有权限访问根目录的 block,就会在 block 中查找到 /tmp/ 目录的 inode 号。

接着访问 /tmp/ 目录的 inode 信息,判断用户是否有权限访问 /tmp/ 目录的 block。

如果有权限,就会在 block 中读取到软链接文件 check-soft 的 inode 号。因为软链接文件会真正建立自己的 inode 索引和 block,所以软链接文件和源文件的 inode 号是不一样的。

通过软链接文件的 inode 号,找到了 check-soft 文件 inode 信息,判断用户是否有权限访问 block。

如果有权限,就会发现 check-soft 文件的 block 中没有实际数据,仅有源文件 check 的 inode 号。

接着通过源文件的 inode 号,访问到源文件 check 的 inode 信息,判断用户是否有权限访问 block。

如果有权限,就会在 check 文件的 block 中读取到真正的数据,从而完成数据访问。

通过这个过程,我们就可以总结出软链接的特点(软链接的特点和 Windows 中的快捷方式完全一致)。

不论是修改源文件(check),还是修改硬链接文件(check-soft),另一个文件中的数据都会发生改变。

删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在。

软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode 号。

软链接可以链接目录。

软链接可以跨分区。

我们测试一下软链接的特性。

[root@localhost ~]# echo 111>>/root/check

#修改源文件

[root@localhost ~]# cat /root/check

111

[root@localhost ~]# cat /tmp/check-soft

111

#不论是源文件还是软链接文件,数据都发生改变

[root@localhost ~]# echo 2222 >>/tmp/check-soft

#修改软链接文件

[root@localhost ~]# cat /tmp/check-soft

111

2222

[root@localhost ~]# cat /root/check

111

2222

#不论是源文件还是软链接文件,数据也都会发生改变

[root@localhost ~]# rm -rf/root/check

#删除源文件

[root@localhost ~]# cat /tmp/check-soft

cat: /tmp/check-soft:没有那个文件或目录

#软链接无法正常使用

软链接是可以链接目录的,例如:

[root@localhost ~]# mkdir test

#建立源目录

[root@localhost ~]# ln -s /root/test/ /tmp/

[root@localhost ~]# ll -d /tmp/test

lrwxrwxrwx 1 root root 11 6月 19 12:43 /tmp/test->/root/test/

#软链接可以链接目录

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。