文档章节

Linux系统中普通文件和目录文件的区别

Michael_Yuan
 Michael_Yuan
发布于 2013/02/19 11:55
字数 2411
阅读 3830
收藏 20
看了赵小兵老师的RHCE和一些相关贴子,受了一些启发,根据平常所知,说说Linux系统中,文件的权限控制,在对于普通文件和目录文件时,有何区别。


文件权限一般可认为是0 123 456 789,一共十位:
0:表示该文件的文件类型。Windows里面是使用了一种文件关联的技术,通过扩展名来关联相应的应用程序,使得双击某个文件,就能达到调用相应的应用程序来打开它的目的,这样简单快捷。然而对于用户来说,好处是方便,坏处是隐藏了一个实质性的东西:文件的真正的类型,与其扩展名实际上是毫无关联的。
举例来说:一个纯粹的文本文件,我可以给它命名“我的歌声里.mp3”,然后在win下双击,会调用相应的音乐播放器来打开,结果显而易见,肯定是错误的。那反过来,一个真正的MP3文件我也可以给它命名“花名册.txt”,在win下双击,一般会调用相应的文本编辑器来打开,不过我说你也知道,显示的一定是乱码。
上面两个例子是为了说明一个观点,某个文件真正的类型与其扩展名没一毛钱关系。
那么在不知道文件扩展名的情况下,如何知道文件的类型呢?在Linux是这样的。
Linux中文件类型只有以下这几种:
1.-,普通文件。
2.d,目录文件,d是directory的简写。
3.l,软连接文件,亦称符号链接文件,s是soft或者symbolic的简写。
4.b,块文件,是设备文件的一种(还有另一种),b是block的简写。
5.c,字符文件,也是设备文件的一种(这就是第二种),c是character的文件。
Linux系统最原始的也只有这五种,所以第0位,只能是以上五者之一。
那么你会有疑问,
1.MP3文件是是哪种?答案:普通文件。
2.二进制文件是哪种?答案:普通文件。
3.文本文件是哪种?答案:普通文件。
4.为什么硬连接没有类型表示?答案:硬连接和软连接,名字上虽然只差一个字,本质完全不同,硬连接也是文件。其类型是普通文件。


为什么上面要说这么多呢?目的是为下文做知识铺垫。


那么 123-456-789 都好说,了解这块儿的人都知道,他们只是 用户-属组-其他 这三组之间的区别,我们拿其中任意一组作为例子来讲解rwx皆可。
r:read,w:write,x:execute。




我们应该如何去记忆这两者之间的区别呢??难道死记硬背?NO。
我们应该知其然还得知其所以然,下面我试图从这查询文件以及内容的本质出发,来阐述rwx权限在这两者身上为何有不同的意义!


理解下面的所说的,需要关于Linux的文件系统的知识做铺垫。如果不知道inode这个概念,基本上就会很吃亏了。


再次强调,文件的内容和该文件当时所用的文件名毫无关联;该文件的类型,也与该文件当时的文件名,毫无关系。


查看一个文件的内容,实际上是这样的一个过程:


举例来说,你用了这个命令:cat /tmp/abc.txt


1.你只传递了一个绝对路径,/tmp/abc.txt,系统首先要知道/tmp/abc.txt文件的inode是多少才行,如何得知呢?
2.记住一个规律,某文件的父目录会(记录)知道该文件的inode号!(此刻我想你是不是悟出一点什么了,不用急,接着往下看)
3.那么我得到“/tmp/abc.txt”这个文件名,我得先知道/tmp目录的情况,要知道/tmp目录的情况,我得先知道/目录的情况,所以我就可以从/目录开始(假设/目录的inode号是0,并且这是写死的),然后再去一张叫做inode-table的表中查找inode号0所指向的数据域,然后从数据域里面可以找到一些类似于下面的内容:(看起来像一张表,不是么?其实可以想象到,目录文件就是一张表,存储了它内部有哪些文件名,以及该文件名对应的inode号)
文件名 inode号
bin    18
var    19
tmp    20
...    ...
好了,我们从“/”,这个目录文件中找到了“/tmp”文件名对应的inode号,就是20。(假设啊)
4.然后我们通过inode号20,去inode-table里面找寻20对应的数据域,然后从数据域中,我们又会找到一张表:(为什么又是表呢?因为“/”是一个目录,“/tmp”也是一个目录,那当然数据域里面存的还是表啦)
文件名  inode号
abc.txt 8899
bbb.mp3 10088
kkk.jpg 20000
... ...
好了,我们找到了/tmp/abc.txt的inode号了,就是8899。根据上面的规律,我们是不是又得去inode-table里面找8899号对应的数据域了?对,就是这样。
5.我们找到inode号8899对应的数据域,于是我们会发现如下一些内容:
“abcdefg”(假设文件内容就是这样)
...


又有疑问了,为毛这次不是表了?
答案:/tmp/abc.txt文件不是目录文件了,它是一个普通文件,他存储的一般都是一些字符串。




体现在本质上:
普通文件:存储普通数据,一般就是字符串。
目录文件:存储了一张表,该表就是该目录文件下,所有文件名和inode的映射关系。
从父目录中获得本文件的inode号---->找到inode-table表中找到这个inode号对应的数据域中的起点以及其他信息---->去这个数据域中读取该文件的内容(普通文件的内容一般是字符串,目录文件的内容是一张表)
如果你真心看懂上面我说的了,那么接下来就变得简单多了。


关键就是访问任何一个文件,要看是否能搞到inode号,搞不到就没辙了。搞到inode就好说了,拿着inode号去inode表中查找即可,最后找到数据域,那么就可以找到文件的内容了
然后整个过程这不仅仅跟本文件权限有关,还跟它的父目录(还有父目录的父目录...)权限有关(是否能搞到本文件的inode)


体现在命令上:(话说这才是最实际的表象)
======
对于普通文件来说,rwx的意义是:
r:可以获得这个普通文件的名字和内容。
w:可以修改这个文件的内容和文件名。可以删除该文件,但是用户会得到是否删除写保护文件的prompt。
x:该文件是否具有被执行的权限。
======
对于目录文件来说,rwx的意义是:
r-x:可以进入cd该目录,可以获得该目录下存储情况,但是不能修改这个目录内部存储的文件(目录)的名字,也不能在该目录下新建文件和目录
-wx:可以进入cd该目录,但是看不到该目录下的存储情况(ls不可用),可以往该目录下添加、修改、删除文件。可以通过cat来读取该目录下的文件or目录的内容,由于得不到该目录下存储了那些文件,在不知情的情况下只能通过猜,cat + 文件名获得文件内容,所以这样依然不保密。
--x:可以进入cd该目录,看不到存储情况,也不能往该目录下添加、修改、删除文件。但是依然可以通过cat + xx(猜)来获得该目录下的文件的内容。
rw-:不能进入cd该目录,用ls仅仅可以获得文件名和目录名,因为获取不到这些文件的inode号,当然也不能获得该目录下的文件的内容。不能往该目录下添加、修改、删除文件。
======



最后总结一下吧:
1.目录文件虽然是文件(唉,谁叫Linux的核心理念就是Everything is file),但是存储内容的只是一张表而已,关于文件名和inode号的映射关系。
2.文件的扩展名和文件类型之间,没一毛钱关系。
3.文件的文件名和文件实际存储内容之间,没一毛钱关系。
4.要知道如何查找到一个文件内容的过程。
5.为什么同一个文件系统移动文件要比跨文件系统快?
答:因为只需要修改某个目录中路径和inode对应关系即可,不需要重新写一遍数据域。
6.什么是买来的500G的硬盘,格式化完后总是少了达不到500G?

答:从本文可知,inode-table也是需要占用存储空间的,所以缺少的一部分中inode-table占用了不少。
7.我不想吃亏,那么我要如何了解Linux文件系统和inode的相关知识,能否推荐个文章?
答:http://www.cyberciti.biz/tips/understanding-unixlinux-filesystem-inodes.html



希望大家能指出这里错误,我有时间一定会及时修正的。



© 著作权归作者所有

Michael_Yuan

Michael_Yuan

粉丝 49
博文 49
码字总数 47549
作品 0
深圳
程序员
私信 提问
加载中

评论(3)

youyaoqi
youyaoqi
总结的很好,很好。
kwf2030
kwf2030
貌似懂了一些,不过过两天肯定又忘了。。。
KavonMa
KavonMa
总结得生动形象,非常全面细致
理解 Linux 的硬链接与软链接

理解 Linux 的硬链接与软链接 从 inode 了解 Linux 文件系统 硬链接与软链接是 Linux 文件系统中的一个重要概念,其涉及文件系统中的索引节点 (index node 又称 inode),而索引节点对象是 Li...

大圈
2015/08/10
0
0
怎样理解和识别 Linux 中的文件类型

众所周知,在 Linux 中一切皆为文件,包括硬盘和显卡等。在 Linux 中导航时,大部分的文件都是普通文件和目录文件。但是也有其他的类型,对应于 5 类不同的作用。因此,理解 Linux 中的文件类...

作者: Magesh Maruthamuthu
04/12
0
0
Linux系统的目录结构--Linux入门到精通系列

Linux安装后,由系统产生的目录比较多,初学都对这众多的目录通常会感到很迷或,不知这些目录有何作用,彼此间有何区别,用户自己的目录创建在哪个目录下比较合适。 1、目录结构简介 与DOS和...

长平狐
2012/09/20
147
0
Linux文件结构学习掌握重点

文件结构 /:根目录,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。 /bin:bin 就是二进制(binary)英文缩写。在一般的系统当中,都可以在这个目录下...

ludan60
2018/04/15
0
0
Linux 文件系统的目录结构

Linux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些目录应该是标准的。各个Linux发行版本会存在一些小小的差异,但总体来说,还是大...

山海经
2014/09/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

运维规范

命名规范 发布流程 监控告警 故障定位 状态 日志 监控

以谁为师
今天
2
0
约瑟夫环(报数游戏)java实现

开端 公司组织考试,一拿到考题,就是算法里说的约瑟夫环,仔细想想 以前老师将的都忘了,还是自己琢磨把~ package basic.gzy;import java.util.Iterator;import java.util.LinkedList;...

无极之岚
今天
3
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
今天
3
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
4
0
Spring中如何使用设计模式

关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性。本文主要讲解Spring中如何使用策略模式,工厂方法模式以及Builder模式。 1. 策略模式 关于策略模式的使用方式,在S...

爱宝贝丶
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部