`
xitonga
  • 浏览: 586564 次
文章分类
社区版块
存档分类
最新评论

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)
1Inode(index node )索引节点
2首先我们要清楚地是:一个文件其实是由两部分组成:节点表和数据区。Inodes table (节点表)包含了ext2ext3文件系统的所有属性。节点表里面主要存放文件的类型,权限,UIDGIDLink count,大小和时间戳,数据存放在磁盘的什么位置。数据区里面就是存放真正的数据。

3一个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

919063drwxr-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

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

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

5下面我们来学习复制,剪切,删除对文件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目录下。

文章转自:http://yijiuzai.blog.163.com/blog/static/103756727201010773846782/

分享到:
评论

相关推荐

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

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

    一个linux下ext2/3 文件系统查看器小程序

    linux文件系统将文件索引节点号和文件名同时保存在目录中。所以,目录只是将文件的名称和 它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。 对于一个文件 来说有唯一的索引节点...

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

    文件系统指文件存在的物理空间,linux...Llinux文件系统使用索引节点来记录文件信息,作用像windows的文件分配表。索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。

    Linux试题(简答详细)

    Linux文件系统通过把i节点和文件名进行连接,当需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项,由此得到该文件相对应的i节点号,通过该i节点的磁盘地址表把分散存放的文件物理块连接成文件的逻辑...

    Linux文件系统反删除方法

    作为一个多用户、多任务的操作系统,Linux下的文件一旦被删除,是难以恢复的。...大多数Linux发行版都提供一个debugfs工具,可以用来对Ext2文件系统进行编辑操作。文中介绍了使用这个工具恢复被误删档的方法。

    Linux操作系统文件链接问题

    在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号。在Linux中多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。与硬连接相对应,Lnux系统中还存在另一种...

    linux操作系统IO

    Linux文件概念和模式 文件描述符 基本系统调用 标准I/O库函数 Linux文件系统 文件节点操作 文件目录操作 文件权限控制 文件链接

    linux 64位只读文件系统 romfs64

    linux 64位只读文件系统 内核 2.6.32, 其它内核可能需要相应调整 扩展:从32位到64位 提高文件读取效率。 优化方式: 文件节点读入内存,采用数组管理,实现对分搜索,hash 搜索 性能不是很完美,仅供参考

    C++语言实现一个类UNIX文件系统

    C++语言实现一个类UNIX文件系统,实现文件的创建、打开、读写、删除、及目录的创建、查看、删除等操作。

    仿linux文件管理系统(操作系统课程设计)

    操作系统的课程设计,完成了文件的基本操作,实现的文件目录树,磁盘块的模拟,文件inode节点的模拟,实现了静态硬链接

    XFS文件系统在线扩充i节点.docx

    XFS文件系统在线扩充i节点

    os_file.zip_DEMO_c/C++_linux

    在磁盘空间模拟一个linux文件系统,并提供基本的文件操作命令(如mk, cp, mkdir, rmdir, cd, ls, cat, chmod, chown, chgrp, chnam等)。文件系统的实现采用混合索引式文件结构,包括使用空闲节点号栈管理空闲节点...

    操作系统实验索引结构文件模拟

    索引结构文件包括一级索引,二级索引 #include #include #include #include #include #define BLOCKNUM 8000 //磁盘物理块个数 #define DIRECT_ADDR_NUM 10 //直接寻址地址个数 #define INDEXTABLE_NUM 100 //...

    4-1-1-Linux 系统的SD启动卡制作与固化方法.pdf

    3.5 固化文件系统到NAND FLASH 27 3.6 使用脚本一键固化Linux系统到NAND FLASH 30 4 基于SD系统启动卡固化Linux-4.4.41系统到NAND FLASH 31 4.1 SD系统启动卡分区挂载说明 32 4.2 查看NAND FLASH分区信息 32 ...

    清华大学Linux操作系统原理与应用

    8.6.1 Linux文件系统的实现要素 189 8.6.2 什么是romfs文件系统 191 8.6.3 romfs文件系统的布局与文件结构 191 8.6.4 具体实现的对象 192 习题8 195 第9章 设备驱动 196 9.1 概述 196 9.2 设备驱动程序基础 198 ...

    linux ext4文件系统分析

    讲解Linux系统下ext4文件系统,讲述了文件系统超级块,文件节点的数据结构,助于理解ext4文件系统

    Linux操作系统 局域网内文件同步 脚本 工具

    echo " 说明: 自动将文件上传到系统内的所有节点,支持相对路径绝对路径" echo " 例子: 1-绝对路径 2-相对路径 3-支持多个文件 4-支持通配符" echo " 1. delivery.sh /home/epacs/epacs5000/bin.tar.gz" echo " 2. ...

    Linux文件系统详解

    从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。在LINUX系统中有一个重要的概念:一切都是文件。其实这是UNIX哲学的一个体现,而...

    Linux操作系统跨控制台的登录方法运用

    并且您知道您的系统问题发生在哪里,当以单用户模式登录时,您能打开文件系统的写操作,然后进行您想要进行的系统修复。Linux的修复模式就是linux rescue;修复模式并不需要系统密码,当进入修复模式后,系统会提示...

    linux二级索引文件系统实现

    通过分析linux ext2文件系统,自主实现一个支持2级索引节点的文件系统。提交源代码、运行界面截图和课程设计报告。

Global site tag (gtag.js) - Google Analytics