`

linux的文件系统及节点表

 
阅读更多

linux的文件系统及节点表  

一  linux的文件系统
1 我们都知道当我们安装linux时会首先给系统分区,然后我们会把分区格式化成EXT3格式的文件系统。那么在linux系统中还有没有其他的文件系统呢,下面我们就简单的介绍一下linux系统中常见的几种文件系统。

(1)EXT3文件系统:ext3(第三级扩展linux文件系统,third extended linux filesystem)跟EXT2文件不同之处就是增加了日志功能。
(2)EXT2和MSDOS:一般用于软盘
(3)ISO9660:光盘的文件系统
(4)GFS和GFS2:主要用于集群服务器的文件系统(SAN)
 linux文件系统的节点(Inodes)
1 Inode(index node )索引节点
2 首先我们要清楚地是:一个文件其实是由两部分组成:节点表和数据区。Inodes table (节点表)包含了ext2ext3文件系统的所有属性。节点表里面主要存放文件的类型,权限,UIDGIDLink count,大小和时间戳,数据存放在磁盘的什么位置。数据区里面就是存放真正的数据。

一个inodes(节点号)的大小大概为128B,一个文件至少要占有1inodes。通过tune2fs
-l /dev/sda7
 可以查看这个分区的inode sizeinode countblock count

我们知道,计算机在识别一个用户是通过UID来识别的,识别一个进程是通过进程号来识别的,那么,同样,计算机识别一个文件是通过一个inode number来识别文件的。而文件名只是给人的识别的。

4 查看节点号的方法:#ls
-li

[root@localhost ~]# ls -li

total 56

533587 -rw------- 1 root root
1050
Mar
6 02:15 anaconda-ks.cfg

919063 drwxr-xr-x 2 root root 4096
Mar
6 02:43 
Desktop

524290 -rw-r--r-- 1 root root
29302
Mar
6 02:15 install.log

524291 -rw-r--r-- 1 root root
3738
Mar
6 02:15 install.log.syslog

前面的一串数字就是文件的节点号,

其实我们的节点号是在分区创建的时候就已经分配好了的。

下面我们来学习复制,剪切,删除对文件inode的影响


(1)复制对文件inode的影响

[root@localhost ~]# cd /boot/

[root@localhost boot]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar
6 13:26 file

a   可以看到,这个文件的节点号是6030,现在我们将它复制到另外一个分区

 

[root@localhost boot]# cp file /var/

[root@localhost boot]# cd /var/

[root@localhost var]# ls -li file

2115361 -rw-r--r-- 1 root root 0 Mar
6 13:27 file

将这个文件复制到/var分区下面后,这个文件的inode number就改变了。

当一个文件从一个分区复制到另外一个分区的时候,系统就分配了另外一个inode给这个文件。

b     那么在同一个分区复制文件节点号会有什么改变呢

[root@localhost boot]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar
6 13:26 file

[root@localhost boot]# cp file /boot/grub/

[root@localhost boot]# cd grub/

[root@localhost grub]# ls -li file

22091 -rw-r--r-- 1 root root 0 Mar
6 13:29 file

可以看到,刚才这个文件的节点号是6030,现在就变成了22091了。

在同一个分区里面复制文件,这个文件的节点号也是会发生改变的。因为在这个分区有两份相同的文件,只是文件的内容相同,但是文件的inode属性却是不一样的。

2. 剪切对文件inode的影响

a 同一分区的剪切

[root@localhost ~]# cd /boot/

[root@localhost boot]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar
6 13:26 file

可以看到,这个文件的节点号是6030,现在我们将这个文件在同个分区里剪切一份。

[root@localhost boot]# mv file /boot/test/

[root@localhost test]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar
6 13:26 file

可以看到,这个文件节点号是没有改变的。

当在同一个分区里面移到文件,文件的节点号没有发生改变。

b 不同的分区剪切

[root@localhost ~]# cd /boot/test/

[root@localhost test]# ls -li file

6030 -rw-r--r-- 1 root

[root@localhost test]# mv /boot/test/file /var/ftp/pub/

[root@localhost test]# cd /var/ftp/pub/

[root@localhost pub]# ls -li file

325584 -rw-r--r-- 1 root root 0 Mar
6 13:26 file

可以看到,这个文件的节点号是肯定会变的。

3 删除对inode的影响

[root@localhost ~]# cd /boot/

[root@localhost boot]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar
6 13:44 file

[root@localhost boot]# rm -rf file

现在我们把file这个文件给删除了,其实我们只是将file这个文件的节点表给删除了,其实我们的数据都还在。这也就是为什么当我们删除一个文件,这个文件还可以被找回来的原因。当然如果我们在到这个分区里面写入数据,那么原来的数据就会被覆盖。

[root@localhost boot]# touch file1

[root@localhost boot]# ls -li file1

6030 -rw-r--r-- 1 root root 0 Mar
6 13:49 file1

现在我们又新建了一个文件file1,这个文件的节点号也是6030,它就已经覆盖了以前的数据的节点号。那么以前的数据就找不回来了。

 


4 总结

复制:在同一个分区,节点号改变。


在不同的分区,节点号改变。

剪切:在同一个分区,节点号不变。


在不同的分区,节点号改变。

删除:只是删除了文件的节点表,数据没有被真正删除,只有当往这个分区在写入数据的时候,才会覆盖原来的数据。

 

 

2:inode - linux文件系统的关键  

[命令基础]
$ ls -li
 427333 drwx------      2 abao abao 4096 2009-08-12 20:19 amsn_received
 989840 -rwxrwxrwx    1 abao abao  144 2009-10-22 22:19 chroot-lfs.sh
1038353 drwxr-xr-x   13 abao abao 4096 2009-11-04 21:42 data
[注释: 上面的例子中,红色的就是inode number,蓝色的是当前文件的link count。]

inode是理解linux文件系统的核心概念。iNode的意思就是index node,就是索引的意思。linux中目录也被被看成是广义的文件,而理解inode正是理解这个广义文件的最好的办法。每个文件和目录都对应着一个inode,inode在一个分区内是唯一的。
对于文件而言,它的信息可以人为的看成三个部分,文件名,文件属性和文件内容。文件名就是我们通常使用的名字,文件属性则包括文件大小,权限设置,修改时间等。文件内容就是我们用cat命令能看到的东西。文件属性是全部保存在文件对应的inode当中的,文件内容在物理上和inode并不是存放在一起,而是放在稍微靠后的磁盘区,也可以称为数据区。在inode里面有指向数据区的指针。
对于目录而言,目录的存储也分成三个部分,也是目录名称,目录属性和目录内容这里提到的目录内容其实就是目录中包含的所有文件/子目录的对应关系(文件名-inode-关系表)。目录属性也存储在inode中,而目录内容就存储在inode所对应的数据区当中。
你可能会问,那么名字呢?文件和目录的名字跑到哪里去了呢?其实,这个名字就存储在它的父目录的内容当中。 举个例子如下。
/tmp包含了两个文件file1和file2。
那么在系统中就会有三个inode,比如说他们的inode number分别是1000(/tmp), 10001(/tmp/file1), 10002(/tmp/file2)。
那么1000#号inode中,保存了/tmp中所有的下属文件的inode和名字,已经目录自身的属性。
10001#号inode中,保存了/tmp/file1自己的文件属性,以及指向数据区的指针。
10002#号inode中,保存了/tmp/file2自己的文件属性,以及指向数据区的指针。
而/tmp这个目录名字,则是由它的父目录(也就是/)来负责管理的。
从上面的例子可以看到,名字,属性和内容,后两者是联系在一起的,名字则是归父目录去管理。当有两个目录都指向同一个inode的时候,就会出现同样的属性+内容,出现在两个不同的目录中。甚至可以以不同的名字出现在相同的目录中。这就是连接的概念,有多少个目录指向当前这个文件(或当前这个目录),这个数字就是link count。在连接中,inode number是父目录识别子体的关键信息。
注意到,每个分区(partition)都会有自己的inode列表,也就是每个分区的inode系统是独立的。那么当我们把一个分区设备装载到当前使用的分区时,两个inode系统就会重叠在一起。比如我的linux是mount在/dev/sda1上作为root的,然后我把/dev/sda2装载到/home上。就会发现/home和/的inode number都是2。这是两个分区inode表重叠在一起的表现。
如果你明白了以上的这个例子,就会能够回答如下的一些看上去很难的问题。


在上面的例子里面为什么我不能ln /home/abc/d  /file呢?因为这样去做相当于让一个/dev/sda1中的目录去连接/dev/sda2中的一个文件,这是inode系统所不允许的。
能够让ln作用在一个目录上呢?也就是ln <dir1> <dir2>呢?这样也不行,因为这样会出现<dir1>有两个父目录的情况,从直观上讲,这就是不合理的。
我用ls -li 命令,为什么看到空目录的inode link count是2呢?这是linux的系统就是这么设计的。当一个目录创建出来,它的"文件名-inode-关系表"里面就有两个元素,其一是".",表示指向自身,其二是".."指向它的父目录。而我们看到的这个2,一个是自身指向自身的link,另一个是它的父目录指向它的link(想想看"文件名-inode-关系表")。这里还有一个有意思的现象,就是这个新目录指向它的父目录,它的父目录也指向它,这种连接是双向的。
为什么我在目录里面增加一个文件,这个文件的link count是1,而它的父目录的link count却不变呢?由于一个文件可以被多次link的特性,暗示了文件不会记录它的父目录的inode,这样目录和它的子文件之间的关联是单向的。所以就会出现这样的情况。
ln -s的本质是什么?从编程的角度来看,symbolic link(符号连接)和连接从根本上不是一回事,符号连接其实就是名字的快捷方式,和windows中的快捷方式很类似。符号连接是从属于原始文件的,而连接创造出来的文件和原来文件是等同的。
ln -s的用处是什么呢?ln -s有三种主要的特性,一来它可以进行跨分区的操作,二来可以作用在目录上,三来是许多linux的脚本运行机制需要这样的符号连接。
/的inode是多少呢?我观察了几个系统,/目录的inode是2,但是目前我还没有不太了解原因。/proc /sys的inode是1,等我以后再来解释,现在我还不太明白。
如何知道一个系统能使用多少个inode呢?用如下的命令 tune2fs -l /dev/sda1,这个命令在e2fsprogs工具里面。
如果inode之间的连接出现问题,应该怎么解决?这是一个复杂的问题,简单的说,可以用e2fsck工具来进行检修,那些没有被link的inode会被挂到/lost+found目录下。

分享到:
评论

相关推荐

    Linux文件系统的模拟实现.pdf

    在内存中,Linux文件系统有系统打开文件表、活动索引节点表、用户打开文件表以及文件缓冲区等。 Linux文件系统的模拟实现可以分为三个部分:文件管理、目录管理和存储管理。文件管理包括文件的创建、打开、读写、...

    linux文件系统结构分析

    本篇将深入探讨Linux文件系统的结构,并阐述进程如何操作文件。 首先,Linux文件系统采用了一种层次式的目录结构,这种结构起始于根目录 `/`。所有其他目录和文件都是从这个根目录开始的,通过斜线 `/` 分隔的路径...

    Linux文件系统.pdf

    这篇学习资料详细介绍了Linux文件系统的一些关键概念和技术。 1. 文件系统类型 Linux支持多种文件系统类型,如EXT2、EXT3、EXT4、XFS、Btrfs、FAT、NTFS等。EXT4是目前最常用的一种,它在EXT2的基础上进行了优化,...

    linux文件系统分析与研究

    Linux文件系统使用位图来管理磁盘块和I节点的分配状态,包括块位图和I节点位图。 - **块位图**:每个位代表一个数据块的状态,“1”表示空闲,“0”表示已分配。 - **I节点位图**:每个位代表一个I节点的状态,“1...

    Linux文件系统中Ⅰ节点的分析.pdf

    【I节点】是Linux文件系统中的一个重要概念,它在文件系统中存储了关于文件的所有元数据,包括文件的大小、创建时间、修改时间、访问权限、所有者信息、链接数等。I节点是Linux实现文件系统的核心机制之一,用于快速...

    linux文件系统浅谈

    ### Linux文件系统浅谈 #### 文件系统概述 文件系统作为操作系统的重要组成部分,承载着管理和组织存储设备上的数据的责任。在Linux环境下,用户可以通过文件系统进行文件的创建、删除、读写以及目录的操作等一...

    Linux XFS文件系统误删除文件恢复.pdf

    在 Linux 文件系统中,文件是由目录项、索引节点和数据块组成的。目录项包括文件的管理与组织信息 ;索引节点包括文件属性及数据块指针信息 ;数据块存储文件的内容。当删除一个文件的时候,操作系统并不会擦除磁盘...

    模拟linux文件系统

    本篇文章将深入探讨“模拟Linux文件系统”的相关知识,主要涉及Linux文件系统的结构、工作原理以及如何通过编程来模拟这一系统。 首先,我们了解Linux文件系统的层次结构。在Linux中,一切皆为文件,包括硬件设备、...

    模拟Linux文件系统

    7. **inode**:在Linux文件系统中,每个文件都关联有一个inode(索引节点),存储文件的元信息,如大小、修改时间、权限等。在模拟中,你需要设计一个结构来模拟inode。 8. **磁盘管理**:模拟文件系统需要模拟磁盘...

    Linux系统文件系统的工作原理

    Linux文件系统由几个关键部分组成: 1. **Superblock(超级块)**:超级块包含文件系统的元数据信息,例如文件系统类型、块大小、空闲块数量等。它是文件系统的一个关键组成部分,对于文件系统的正常运行至关重要。...

    嵌入式Linux文件系统

    嵌入式Linux文件系统是操作系统的核心组成部分,负责管理和组织存储设备上的数据,使得程序和用户能够高效地访问和操作文件。文件系统不仅包含常规的文件和目录,还映射了与设备相关的各种实体,如磁盘、打印机和...

    Linux文件系统模拟---代码加文档

    每个文件在Linux文件系统中都有一个唯一的标识——I节点,它包含了文件的所有元数据,如文件大小、权限、修改时间等。超级块则存储了文件系统的全局信息,如总块数、空闲块列表、I节点表等。 4. 文件操作: 文件...

    linux文件系统概念解释

    总之,Linux文件系统的设计充分体现了其开放性、灵活性和高效性,通过层次分明的文件类型划分、逻辑文件系统与虚拟文件系统的结合,以及索引节点的使用,构建了一个既强大又易于使用的文件管理框架。无论是对于...

    linux文件系统基础知识

    Linux文件系统基础知识是理解Linux操作系统核心概念的关键。文件系统是操作系统用于组织和管理磁盘上数据的机制。本文将深入探讨Linux中常见的文件系统类型、分配策略、文件记录形式、元信息以及虚拟文件系统(VFS)...

    linux文件系统

    接着,Linux文件系统中最重要的四个主要对象:超级块(superblock)、索引节点(inode)、目录项(dentry)和文件对象(file)。超级块对象存储了文件系统的整体信息,比如文件系统的类型、块大小、文件系统的状态等...

    顺藤摸瓜之Linux文件系统

    ### 顺藤摸瓜之Linux文件系统 #### 引言 在深入了解Linux文件系统的运作机制前,我们需要先明确几个基础概念。文件系统是操作系统的重要组成部分,它负责管理和组织计算机存储设备上的文件。对于Linux这样的多用途...

    Linux操作系统文件系统基础知识详解.pdf

    Linux 文件系统使用索引节点来记录文件信息,索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引...

    Linux文件系统实验报告.docx

    根据提供的文件标题“Linux文件系统实验报告.docx”以及标签“cs”,我们可以推断出这份文档主要关注的是计算机科学(Computer Science,简称CS)领域内关于Linux操作系统中的文件系统相关内容。尽管描述部分未提供...

Global site tag (gtag.js) - Google Analytics