Linux文件系统

1. 存储设备分区

一个磁盘可以划分为很多个扇区,每个扇区有512个字节,扇区是磁盘的基本存储单元。将每个扇区编号,这样磁盘就变为了一系列编了号的块组合。一个磁盘主要包括引导块,超级块,i节点表,文件存储区,进程对换区等。


  1. 引导块。引导块占用第0号物理块,不属于文件系统管辖;如果系统中有多个文件系统,只有跟文件系统才有引导程序放入引导块中,其余文件系统都不使用引导块。
  2. 超级块。文件系统的第一个块被称为超级块,这个块存放的是文件系统本身的结构信息;比如超级块记录了每个区域的大小,存放未使用磁盘的信息等。
  3. i节点表。超级块是下一个部分就是i节点表,每个文件对应一个i节点,每个文件都有一些属性,如文件大小,所有者,创建时间等。这些信息存放在对应的i节点的结构中,所有的文件都具有相同大小的i节点,这些i节点组成一个i节点表,文件系统创建后,i节点的数目是有限的。所以一个文件系统能够创建的文件也是有限的。
  4. 文件存储区。文件系统的第3个部分是文件存储区,文件的内容保存在这里,磁盘所有的块大小都是一样,如果文件大小超过一个块的大小,则文件会存放在多个次磁盘块中。
  5. 进程对换区。磁盘上会开辟一块区域, 为对换区, 当内存中的进程需要扩大占用的内存空间, 而当前内存空间不足时, 则把某些不常用的进程暂时替换到对换区中, 在适用的时候又把他们换进 内存,解决内存不足和进程之间对内存的竞争问题。

2. 文件结构

大部分的Linux文件系统(如ext2、ext3)规定,一个文件由目录项、inode和数据块组成:目录项记录了文件的i节点号和文件名;i节点则包含了文件的基础信息以及数据块的指针;数据块则包含文件的具体内容。

Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。一个目录文件的内容为目录下所有文件的目录项的列表,每个目录项有i节点号和文件名组成。因此,通过目录项即可知道文件的i节点,进而对文件内容进行访问。

i节点中通常存放了一个文件的管理信息和一些基本的系统数据(如文件的长度、文件内容存放在磁盘上的位置等)。ls -i可以查看当前目录下所有文件的i节点号;stat filename可以查看文件的系统信息,包括iNode。其结构如下:

struct dinode
{
 ushort di_mode;  /*文件类型+用户权限*/
 short di_nlink;  /*文件链接数*/
 ushort di_uid;  /*属主用户id*/
 ushort di_gid;  /*属主用户组id*/
 off_t di_size;  /*文件大小*/
 char di_addr[40]; /*文件数据区起点地址*/
 time_t di_atime; /*最后访问时间*/
 time_t di_mtime; /*最后修改时间*/
 time_t di_ctime; /*创建时间*/
}; 

i节点数据结构里面没有文件名,那文件系统是如何管理文件名,i节点和文件内容之间的关系的呢?i节点号存储在目录入口的头两个字节中,是文件名字和其内容之间的唯一联系。因此目录中的文件名被称为链,它把目录层次结构中的名称连接到它的i节点,同时也就链接到数据。同一个i节点号可以出现在多个目录中,rm命令并不是真正删除i节点,它删除的是目录入口或链。只有当链接到文件的最后的链消失后,系统才删除i节点,也就是文件本身。

在Linux中,我们通过解析路径,根据沿途的目录文件来找到某个文件。目录中的条目除了所包含的文件名,还有对应的inode编号。当我们输入$cat /var/test.txt时,Linux将在根目录文件中找到var这个目录文件的inode编号,然后根据inode合成var的数据。随后,根据var中的记录,找到text.txt的inode编号,沿着inode中的指针,收集数据块,合成text.txt的数据。整个过程中,我们参考了三个inode:根目录文件,var目录文件,text.txt文件的inodes。

假设要创建一个新文件。该新文件占3个磁盘存储块。创建文件步骤如下:

  1. 内核先找到一块空闲的i节点,内核找到空的i节点号为10,内核把文件信息记录到其中,如文件大小,文件所有者,创建时间等。
  2. 存储数据,即文件的内容存储,由于该文件需要3个数据块,内核从空闲的数据块中找到3个数据块,200,300,400。 将内容复制到这些块中。
  3. 记录分配情况,数据保存到3个数据块中,必须记录起来,以便下次查找。磁盘分配情况记录在文件的i节点的磁盘序列列表中。
  4. 增加文件名和目录。新文件的名字为hello.c,内核将文件的入口添加到目录文件中,文件名和i节点号之间的对应关系,将文件名和文件属性,内容联系起来,找到文件名就找到文件的i节点号,通过i节点号就能够找到文件的属性和内容。

3. 硬链接与软链接

一般情况下,文件名和inode号是"一一对应"关系,每个inode号对应一个文件名。但是,Linux系统允许多个文件名指向同一个inode号。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

ln命令可以创建硬链接,语法为:

ln source_file target_file

运行上面这条命令以后,源文件与目标文件的inode号相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号就是当前目录的inode号,等同于当前目录的"硬链接";后者的inode号就是当前目录的父目录的inode号,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的".硬链接"。

除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。l类似于windows系统中的快捷方式。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

ln -s命令可以创建软链接,语法为:

ln -s source_file target_file

4. 文件权限

每个文件具有3种权限信息,读、写和执行;此外,还可以为不同的访问者赋予不同的权限,有文件所有者、同组用户和其他人三种权限组。ls -l可以在输出其他信息的同时,也输出权限信息。

例子:-rw-r--r--
-:文件类型(-:文件;d:目录;l:软链接文件)
文件只有三种权限:(r:读;w:写;x:执行)
rw-(u所有者);r--(g所属组);r--(o其他人)

chmod命令用于改变文件的权限,权限可以用两种方式表示:八进制数或符号。符号描述可以说明权限的相对改变,但八进制数更加容易使用。在八进制模式下通过给读权限赋值4,给写权限赋值2,给执行权限赋值1来改变权限。和ls中一样,3个数字分别说明文件所有者、组成员和其他成员的权限。

例子:
chmod 754 junk 
给文件所有者赋予读、写和执行的权限(4+2+1),组成员读和执行权限(4+1),其他成员读权限(4)

除了超级用户,就只有文件所有者本人才可以改变一个文件的权限,而不考虑权限本身是什么。

5. 目录层次

因为linux是一个多用户系统,制定一个固定的目录规划有助于对系统文件和不同的用户文件进行统一管理。但就是这一点让很多从windows转到linux的初学者感到头疼。\为根目录,在根目录有很多重要的目录,其名称和功能如下所示:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • inode是什么 理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector...
    狗尾巴草败了阅读 641评论 0 0
  • 1 Linux文件系统基础知识 1.1 文件结构 Linux使用标准的目录结构,在Linux安装的时候,安装程序就...
    疯狂小王子阅读 504评论 0 2
  • 学到linux上的软连接和硬链接,不得不了解inode,要想知道inode,不得不了解一些文件系统,至少是Linu...
    ThinkerWalker阅读 7,603评论 1 11
  • 一个基本的计算机系统由“硬件”和“软件”组成,一台Linux设备,主要的组成如下图所示: 一般情况下,我们所说的L...
    时待吾阅读 1,583评论 0 16
  • 姓名:邝念君 学号:14020150024 【嵌牛导读】:EXT3,EXT4,BTRFS和XFS是现在最常见的四个...
    nianjun阅读 1,548评论 0 0