欢迎各位兄弟 发布技术文章

这里的技术是共享的

请问linux系统中inode和block的关系?

目前我正在学习linux操作系统,现在在学习ext2文件系统原理,看的鸟哥的linux一书,书上开始谈到一个文件系统中inode和block的关系,说的是inode中存着指向block的指针。书上说一个文件占用一个inode,如果文件太大会占用多个block.我这里就有个问题,为什么...


最佳答案
 
1. inode和block
---------------------------------
    
提到inode,我们不得不先介绍硬盘的整体结构。硬盘中包含多个硬盘盘片,硬盘盘片为圆形,每个硬盘盘片都有一个可以读写的磁头(Head),将这个磁
头固定,使硬盘盘片旋转一周,所走轨迹就是磁道(Track)。硬盘内所有盘片的相同磁道号的集合成为磁柱(Cylinder)。每一磁道被划分成许多区
域,每个区域叫一个扇区(Sector)。扇区是硬盘的最小存储物理量,一个扇区的存储容量大约是512字节(约0.5K)。

    知道了硬盘的大体结构之后,再来谈谈怎么进行硬盘分区。进行硬盘分割的最小单位是磁柱,分割完之后自然就是格式化(format)。在Linux中进行格式化必须考虑Block与inode,Block还好理解,它是磁盘可以记录的最小单位,是由数个扇区组成,所以大小通常为n*512Bytes,例如4K。

    那么inode是什么呢Block是记录文件内容的区域,inode则是记录该文件的属性及其放置在哪个Block之内的信息。所
以,每个文件都会占用一个inode。当Linux系统要查找某个文件时,它会先搜索inode 
table找到这个文件的属性及数据存放地点,然后再查找数据存放的Block进而将数据取出。inode数量在一开始已被设定好,其设定方式通常是"硬
盘大小/一个容量",这个容量比Block大一些较佳,例如刚才将Block设为4K,那么这个容量可以设为8K左右。所以,一块1GB的硬盘如果以8K
大小划分它的inode数,则会有131072个inode。一个inode的大小为128Byte,这样,我们就可以清楚地知道,一个分区被格式化为一个文件系统之后,基本上它一定会有inode table与数据区域两大块,一个用来记录文件的属性信息与该文件存放的Block块,一个用来记录文件的内容。

2. 硬链接
---------------------------------
    刚才说过,当系统要读取某个文件时,它会先读inode 
table,然后根据inode的信息到数据区域将数据取出备用。硬链接就是再建立一个inode链接到文件放置的Block块。也就是说,进行硬链接
时,实际上您的文件内容不会改变,只是原来的inode与后来添加的inode均可指定到该文件存放的地点,因此,读取两个inode的结果都是读取同一
个文件的内容。不过,这样一来就有个问题,因为inode会链接到Block块,而"目录"本身仅消耗inode,这样,硬链接就不能链接目录。所以,硬
链接有两个最大的限制:
    (1) 不能跨文件系统,因为不同的文件系统有不同的inode table;
    (2) 不能链接目录。

3. 软链接(符号链接)
---------------------------------
    相对于硬链接,符号链接比较好理解,基本上,它是再建立一个独立文件,而这个文件会让数据读取操作指向它链接的那个文件。由于只是利用文件作为指向的动作,所以,当源文件被删除,符号链接的文件就打不开了,屏幕会显式"无法开启某文件"。
    因此,硬链接比较安全,因为即某一个inode被删除,只要还有一个inode,该文件就能被找到。

4. 分区和文件系统
---------------------------------
    磁盘分割的重点了: 也就是记录每一个分割区(Partition)的起始与结束磁柱。好了,那么这个分割区的起始与结束磁柱的信息放在哪里呢? 存放在Master Boot Recorder(MBR)

    告知系统分割区所在的起始与结束磁柱之后,接着需要将分割区格式化为操作系统认识的文件系统(Filesystem)。因为每个操作系统认识的文件系统并不相同,所以要针对操作系统来格式化分割区 。

一个分割区就是一个文件系统。硬盘的最小储存单位是扇区(Sector),不过数据储存的最小单位并不是扇区,因为用 
扇区来存储数据效率低下。因为一个扇区只有512Bytes,而磁头是一个扇区一个扇区地读取数据,如果文件有10MBytes,那么为了读这个文件,磁
头必须要进行20480次读取(I/O)操作。

为了克服这个效率上的困扰,引入了逻辑区块(Block)。逻辑区块是在对分割区进行格式化时,所指定的数据最小储存单位,这个最小储存单位是建立在扇区
的大小之上的(因为扇区是硬盘的最小物理储存单位),所以,逻辑区块的大小为扇区 
的2的次方倍数。此时,磁头一次可以读取一个逻辑区块(若干个连续的扇区),如果在格式化时,指定逻辑区块为4KBytes(亦8个连续的扇区构成一个逻
辑区块),那么同样一个10MBytes的文件,磁头要读取的次数则为2560次,可以大幅提高文件的读取效率。

不过,逻辑区块单位的规划并不是越大越好。因为一个逻辑区块最多仅能容纳一个文件。假如逻辑区块规划为4KBytes,而一个文件大小为
0.1KBytes,这个小文件将占用一个逻辑区块的空间,该逻辑区块虽然可以容纳4Kbytes的容量,然而由于文件只占用了0.1Kbytes,所
以,实际上剩下的3.9KBytes是不能再被使用了。在考虑逻辑区块的规划时,需要同时考虑到:
    * 文件读取的效率
    * 文件大小可能造成的硬盘空间浪费

    因此,在规划磁盘时,需要根据主机的用途来进行规划较佳。例如BBS主机由于文章较短, 逻辑区块小一点的好;而如果主机主要用在储存大容量的文件,那么考虑到效率,逻辑区块规划的大一点会比较妥当。
 

https://gss0.bdstatic.com/7Ls0a8Sm1A5BphGlnYG/sys/portrait/item/402f6c696a696e6773616e6479b100.jpg " href="http://zhidao.baidu.com/usercenter?uid=402f4069236f25705e79b100" log="pms:newqb,pos:bestreplyer" rel="nofollow" style="color: rgb(63, 136, 191); display: inline-block; height: 50px; overflow: hidden; border-radius: 50%;" target="_blank">

其他回答

因为inode的数量决定了文件的数量,所以是不能新建文件了。
另外,这样的设置也同时限制了文件的大小?
 
追问
没有限制文件大小,block之前设置的是4k,mke2fs命令里面要我输入一个inode对应的空间大小,我输入的是16k,那就是inode和block是1比4的关系.不知道是我理解错了还是怎么样,我觉得不管设置的是几比几,反正不可能最终inode和block都刚好用完,要么inode先用完,要么block先用完. 我感觉这里怪怪的,难道linux系统就这么死板么...
追答
16K只是设定了单个block的大小,而不是inode节点可以使用block的数量。

文件可以使用的block数量是动态的。
浪费是说,一个block中虽然有空闲空间,但也不能被别的文件占用。同一个block只能属于一个文件。
来自 https://zhidao.baidu.com/question/1957759418941921100.html
最佳答案
 
1. inode和block
---------------------------------
    
提到inode,我们不得不先介绍硬盘的整体结构。硬盘中包含多个硬盘盘片,硬盘盘片为圆形,每个硬盘盘片都有一个可以读写的磁头(Head),将这个磁
头固定,使硬盘盘片旋转一周,所走轨迹就是磁道(Track)。硬盘内所有盘片的相同磁道号的集合成为磁柱(Cylinder)。每一磁道被划分成许多区
域,每个区域叫一个扇区(Sector)。扇区是硬盘的最小存储物理量,一个扇区的存储容量大约是512字节(约0.5K)。

    知道了硬盘的大体结构之后,再来谈谈怎么进行硬盘分区。进行硬盘分割的最小单位是磁柱,分割完之后自然就是格式化(format)。在Linux中进行格式化必须考虑Block与inode,Block还好理解,它是磁盘可以记录的最小单位,是由数个扇区组成,所以大小通常为n*512Bytes,例如4K。

    那么inode是什么呢Block是记录文件内容的区域,inode则是记录该文件的属性及其放置在哪个Block之内的信息。所
以,每个文件都会占用一个inode。当Linux系统要查找某个文件时,它会先搜索inode 
table找到这个文件的属性及数据存放地点,然后再查找数据存放的Block进而将数据取出。inode数量在一开始已被设定好,其设定方式通常是"硬
盘大小/一个容量",这个容量比Block大一些较佳,例如刚才将Block设为4K,那么这个容量可以设为8K左右。所以,一块1GB的硬盘如果以8K
大小划分它的inode数,则会有131072个inode。一个inode的大小为128Byte,这样,我们就可以清楚地知道,一个分区被格式化为一个文件系统之后,基本上它一定会有inode table与数据区域两大块,一个用来记录文件的属性信息与该文件存放的Block块,一个用来记录文件的内容。

2. 硬链接
---------------------------------
    刚才说过,当系统要读取某个文件时,它会先读inode 
table,然后根据inode的信息到数据区域将数据取出备用。硬链接就是再建立一个inode链接到文件放置的Block块。也就是说,进行硬链接
时,实际上您的文件内容不会改变,只是原来的inode与后来添加的inode均可指定到该文件存放的地点,因此,读取两个inode的结果都是读取同一
个文件的内容。不过,这样一来就有个问题,因为inode会链接到Block块,而"目录"本身仅消耗inode,这样,硬链接就不能链接目录。所以,硬
链接有两个最大的限制:
    (1) 不能跨文件系统,因为不同的文件系统有不同的inode table;
    (2) 不能链接目录。

3. 软链接(符号链接)
---------------------------------
    相对于硬链接,符号链接比较好理解,基本上,它是再建立一个独立文件,而这个文件会让数据读取操作指向它链接的那个文件。由于只是利用文件作为指向的动作,所以,当源文件被删除,符号链接的文件就打不开了,屏幕会显式"无法开启某文件"。
    因此,硬链接比较安全,因为即某一个inode被删除,只要还有一个inode,该文件就能被找到。

4. 分区和文件系统
---------------------------------
    磁盘分割的重点了: 也就是记录每一个分割区(Partition)的起始与结束磁柱。好了,那么这个分割区的起始与结束磁柱的信息放在哪里呢? 存放在Master Boot Recorder(MBR)

    告知系统分割区所在的起始与结束磁柱之后,接着需要将分割区格式化为操作系统认识的文件系统(Filesystem)。因为每个操作系统认识的文件系统并不相同,所以要针对操作系统来格式化分割区 。

一个分割区就是一个文件系统。硬盘的最小储存单位是扇区(Sector),不过数据储存的最小单位并不是扇区,因为用 
扇区来存储数据效率低下。因为一个扇区只有512Bytes,而磁头是一个扇区一个扇区地读取数据,如果文件有10MBytes,那么为了读这个文件,磁
头必须要进行20480次读取(I/O)操作。

为了克服这个效率上的困扰,引入了逻辑区块(Block)。逻辑区块是在对分割区进行格式化时,所指定的数据最小储存单位,这个最小储存单位是建立在扇区
的大小之上的(因为扇区是硬盘的最小物理储存单位),所以,逻辑区块的大小为扇区 
的2的次方倍数。此时,磁头一次可以读取一个逻辑区块(若干个连续的扇区),如果在格式化时,指定逻辑区块为4KBytes(亦8个连续的扇区构成一个逻
辑区块),那么同样一个10MBytes的文件,磁头要读取的次数则为2560次,可以大幅提高文件的读取效率。

不过,逻辑区块单位的规划并不是越大越好。因为一个逻辑区块最多仅能容纳一个文件。假如逻辑区块规划为4KBytes,而一个文件大小为
0.1KBytes,这个小文件将占用一个逻辑区块的空间,该逻辑区块虽然可以容纳4Kbytes的容量,然而由于文件只占用了0.1Kbytes,所
以,实际上剩下的3.9KBytes是不能再被使用了。在考虑逻辑区块的规划时,需要同时考虑到:
    * 文件读取的效率
    * 文件大小可能造成的硬盘空间浪费

    因此,在规划磁盘时,需要根据主机的用途来进行规划较佳。例如BBS主机由于文章较短, 逻辑区块小一点的好;而如果主机主要用在储存大容量的文件,那么考虑到效率,逻辑区块规划的大一点会比较妥当。
 

https://gss0.bdstatic.com/7Ls0a8Sm1A5BphGlnYG/sys/portrait/item/402f6c696a696e6773616e6479b100.jpg " href="http://zhidao.baidu.com/usercenter?uid=402f4069236f25705e79b100" log="pms:newqb,pos:bestreplyer" rel="nofollow" style="color: rgb(63, 136, 191); display: inline-block; height: 50px; overflow: hidden; border-radius: 50%;" target="_blank">

其他回答

因为inode的数量决定了文件的数量,所以是不能新建文件了。
另外,这样的设置也同时限制了文件的大小?
 
追问
没有限制文件大小,block之前设置的是4k,mke2fs命令里面要我输入一个inode对应的空间大小,我输入的是16k,那就是inode和block是1比4的关系.不知道是我理解错了还是怎么样,我觉得不管设置的是几比几,反正不可能最终inode和block都刚好用完,要么inode先用完,要么block先用完. 我感觉这里怪怪的,难道linux系统就这么死板么...
追答
16K只是设定了单个block的大小,而不是inode节点可以使用block的数量。

文件可以使用的block数量是动态的。
浪费是说,一个block中虽然有空闲空间,但也不能被别的文件占用。同一个block只能属于一个文件。

唯物品评历史

关注"唯物品评历史",跟着泪痕春雨先生,读懂历史,看彻人生

打开隐藏二维码