📄 88.html
字号:
<br>
2、目录文件:目录可以理解成放其它文件和/或其它目录的容器,是一种特殊文件,其内容由目录项组成,每个 <br>
目录项主要包括两部分内容:文件名name和索引节点号inode,两者和起来称为连接,我们将在下小节对inode <br>
进行更详细的介绍。 <br>
<br>
3、设备文件:不知道诸位是否有使用DOS的经验,如果我们的机器只有三个DOS系统文件IO.SYS, MSDOS.SYS, <br>
COMMAND.COM,而你需要编辑一份英文文档,日后再通过打印机输出,你能怎么办? <br>
<br>
COPY CON MYDOC.TXT <br>
<br>
;在此输入文档内容 <br>
<br>
^+D ;结束存盘 <br>
<br>
COPY MYDOC.TXT > PRN ;打印文档 <br>
<br>
如果你熟悉这个过程,那你就已经理解设备文件了。以上的CON和PRN分别是DOS定义的两个设备文件,分别对应 <br>
终端和并行打印口。这种设计使我们不必了解设备使用的具体硬件细节,按使用普通文件相同的方法来使用外部 <br>
设备。 <br>
<br>
<br>
Linux下的设备文件分为三大类:字符设备、块设备和网络设备,要想准确区别它们可能需要单独写一篇更臭更 <br>
长的文章,大致情况是:字符设备是直接读取的,不使用缓冲区,象串行口、终端等;而块设备都是通过缓冲区 <br>
进行读取的,并且每次只能读取一定数量的块,比如磁盘每次至少要读取一个扇区(如512字节),块设备可以实 <br>
现随机读写;网络设备即前面提到的socket,因为我还不很熟悉,就不乱说了。设备文件一般都保存在/dev目 <br>
录下,诸位可以用ls -l命令看看都有什么?反正本文的重点在于介绍普通文件和目录,设备文件不是重点,所 <br>
以就只介绍到这里。 <br>
<br>
<br>
四、索引节点、硬连接和连接计数 <br>
============================== <br>
<br>
1、索引节点inode: <br>
<br>
Linux为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的 <br>
具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。例如: <br>
<br>
假设我们在硬盘当前目录下建立了一个名为mytext文本文件,其内容只有一行: <br>
This is my file. <br>
当然这行文字一定是存储在磁盘数据区某个具体位置里(物理上要通过磁头号、柱面号和扇区号来描述,在本例 <br>
中假设分别是1、20、30)。 <br>
假设其inode是262457,那么系统通过一段标准程序,就能将这个inode转换成存放此文件的具体物理地址(1磁 <br>
头、20柱面、30扇区),最终读出文件的内容:“This is my file.” <br>
所以inode是指向一个文件数据区的指针号码,一个inode对应着系统中唯一的一片物理数据区,而位于两个不 <br>
同物理数据区的文件必定分别对应着两个不同的inode号码。 <br>
<br>
文件拷贝命令: <br>
# cp /home/zyd/mytext newfile <br>
在当前工作目录建立了一个新文件newfile,其实际操作主要包括如下三步: <br>
1、在当前目录中增加一个目录项,其文件名域填入newfile,并分配了一个新的inode,假设是262456。 <br>
2、将原文件(在1磁头、20柱面、30扇区)的内容复制了一份到新的空闲物理块(假设是1磁头、20柱面、31扇 <br>
区)。 <br>
3、填写一些其他关键信息,使系统通过这些信息及inode号码可以完成物理地址的转换。 <br>
<br>
所以文件复制要分配新的inode和新的数据区,虽然两个文件的内容是一样的。 <br>
<br>
<br>
2、硬连接hardlink: <br>
我们实际使用文件时一般是通过文件名来引用的。通过上面的讨论,我们知道:1个inode号码肯定和一片完全 <br>
属于一个文件的数据区一一对应。那么一个文件系统中两个或更多个不同的文件名能否对应同一个文件呢?答案 <br>
是肯定的。我们知道inode号码是记录在文件名对应的目录项中的,我们可以使两个或多个文件的目录项具有相 <br>
同的inode值,实际上就使它们对应着同一个文件。有几个目录项具有相同的inode号,我们就说这个文件有几 <br>
个硬连接(hardlink),对于普通文件,ls -l命令的连接计数count域的数值就是本文件拥有的硬连接数。硬连 <br>
接可以通过ln命令建立,例如: <br>
<br>
# ln /home/zyd/mytext hardlink_mytext <br>
就建立了一个新的文件hardlink_mytext,这个文件的inode同样是262457。建立硬连接实际上只是增加了一个 <br>
目录项,但并复制文件数据区,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保 <br>
证两个文件能同步更新。 <br>
<br>
'ls -il'可以显示文件的inode(在下面最左边): <br>
<br>
262456 -rw-rw-r-- 1 zyd zyd 17 Nov 3 14:52 newfile <br>
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext <br>
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext <br>
<br>
<br>
3、连接计数count: <br>
<br>
前面我们介绍了,文件的连接计数域表明本系统中共有几个文件目录项的inode和本文件相同,也就是本文件共 <br>
有几个硬连接。如上面的例子中hardlink_mytext和mytext文件的count值都是2。 <br>
<br>
那么对于目录,其count域的含义是什么呢?目录的count同样表示共有多少个目录项指向此目录,不过要详细 <br>
说明必须进一步解释VFS文件系统的结构,为简单起见,只要这样理解就行了:(count-2)等于本目录包含的直 <br>
接子目录数(就是只包括儿子,不包括孙子啦!)。例如:如果一个目录/abc的count域为5,那么 <br>
/abc目录一定包含3个子目录。 <br>
<br>
至此我们已经介绍了普通文件、目录文件、设备文件、硬连接、连接计数、索引节点等非常重要的概念。 <br>
<br>
4、进一步说明: <br>
<br>
硬连接文件实际上并不是一种新的文件类型,两个文件互为对方的硬连接。它们应该都是普通文件(谁能告诉 <br>
我:其它类型的文件可以硬连接吗?)。两个文件除了名称或/和文件目录不同外,其它部分完全相同,更改了一 <br>
个文件,另一个的文件长度、内容、更改时间等都将相应发生变化,更改了一个文件的权限位mode,另一个也会 <br>
发生同样的变化。 <br>
<br>
注意连接计数字段count,互为硬连接的两个文件的count值都是2,表明有两个inode指向同一文件的inode。 <br>
当我们删除其中一个文件时,系统首先将(count-1)->count,如果结果是零,就将其目录项和数据区都删除, <br>
否则只将本目录项删除,数据区仍然保留,仍然可以通过另外的文件名访问。根据这个特性,可以通过为重要的 <br>
文件建立硬连接的方法来防止其被误删除。 <br>
<br>
一个文件系统允许的inode节点数是有限的,如果文件数量太多,即使每个文件都是0字节的空文件,系统最终 <br>
也会因为节点空间耗尽而不能再创建文件。所以当发现不能建立文件时首先要考虑硬盘数据区是否还有空间(可 <br>
通过du命令),其次还得检查节点空间。 <br>
<br>
互为硬连接的多个文件必须位于同一个文件系统上。根设备及任何一个需要mount才能挂接进来的分区、软盘、 <br>
NFS、光驱等都是一个独立的文件系统,每个文件系统有一个相应的设备号,不同文件系统中具有相同inode节 <br>
点的文件间没有任何联系。系统则通过设备号和inode号的组合唯一确定一个文件。 <br>
<br>
Linux之所以能支持多种文件系统,其实是由于Linux提供了一个虚拟文件系统VFS,VFS作为实际文件系统的上 <br>
层软件,掩盖了实际文件系统底层的具体结构差异,为系统访问位于不同文件系统的文件提供了一个统一的接 <br>
口。实际上许多文件系统并不具备inode结构,其目录结构也和以上的讨论不同,但通过VFS,系统均为其提供 <br>
了虚拟一致的inode和目录项结构。所以,'ls -il'命令实际显示的inode应该是VFS inode,也就是说, <br>
inode是存在于内存中的数据结构,而不一定是实际的硬盘结构。但为Linux量身定做的ext2文件系统具备实际 <br>
的inode和连接型目录项结构,所以,对于ext2文件系统,可以认为我们上面讨论的关于硬连接的概念是完全正 <br>
确的。 <br>
<br>
本节最后两段的说明如果您暂时理解不了也没关系,随着学习的深入,慢慢就能理解了。 <br>
<br>
<br>
五、符号连接 <br>
============ <br>
<br>
不同文件系统中的文件不能建立硬连接,但可以通过符号连接进行同步。符号连接是一种独立的文件类型,它有 <br>
自己的数据区,但数据区的内容只是一个被它指向的文件的路径名。前言那节的例子1.5说明文件sym_link是一 <br>
个指向/tmp/sym_target文件的符号连接,如果我们cat sym_link,系统自动将它指向的文件打开显示而不是 <br>
显示sym_link文件本身,注意sym_link的文件长度是15,正是字符串/tmp/sym_target的长度。建立符号连接 <br>
和建立硬连接一样使用ln命令,不过要加入'-s'选项: <br>
<br>
ln -s /home/zyd/file_system/mytext my_sym_link <br>
# ls -li my_sym_link <br>
262458 lrwxrwxrwx 1 zyd zyd 28 Nov 3 14:55 my_sym_link -> /home/zyd/file_system/mytext <br>
<br>
思考题:建立符号连接时一般都要输入目标文件的绝对路径,为什么? <br>
(提示:假设我们想让用户在任意当前目录都能执行/usr/local/my_bin/myproc而运行如下命令: <br>
# cd /usr/local/bin <br>
# ln -s ../my_bin/myproc myproc) <br>
<br>
<br>
六、文件模式位mode <br>
================== <br>
<br>
通过chmod命令可以改变用户对相应文件的存取权限。 <br>
Linux系统用一个16位的字来存储每个文件的type和mode,其中高4位通过组合来决定文件的type,它是在文件 <br>
创建时写入的,用户不能更改。下面介绍后面的12位模式位 <br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -