关于i-node的疑问?有点想不明白了!
最近我在自学Linux,遇到了点问题,有点迷糊了。请大家指教!
书上是以Red Hat 7.2讲的!
书上有这样一段话:
[quote:6a947a11c9]假设每个i-node可以存储8KB。
理论上,若是每个存储在区块中的文件都小于8KB,则此区块最多可以存储461216(例子中的数字)个文件,但若是文件超过8KB,则会占用一个以上的i-node,例如一个8MB的文件会占用1024个i-node。因此,若是系统中存储的文件都很大,则允许的文件数量一定远小于i-node数目。
相反,若是区块中的文件都很小,例如新闻组上的文章,[color=red:6a947a11c9]当文件的数目等于i-node数目时,即使区块中仍有许多的空间,系统也会因为没有足够的i-node而无法存储任何文件。[/color:6a947a11c9][/quote:6a947a11c9]
问题:
1.红色字体部分我有点不太明白,如果文件很小,没有足够的i-node,但是仍然有存储空间,为什么还存储不了文件呢?那些空闲的空间怎样使用呢?不是浪费了吗?(想不明白了)
2.如果i-node不够用了,怎样增加i-node呢?
| 網中人 回复于:2005-02-04 19:40:20 |
| 哪本書啊?
你將"黑色部份"的 i-node 換成 block 後再重讀會比較好理解. |
| 網中人 回复于:2005-02-04 20:07:12 |
| 本版精華區, 是個值得多看的地方:
http://bbs.chinaunix.net/forum/viewtopic.php?t=153696&show_type=new |
| zhaodongxi 回复于:2005-02-04 22:48:54 |
| 1. 的确会浪费的 i-node 和 block 任何一个用光了都会这样的
2.不能增加 在分区前要做好规划 根据具体情况指定i-node和block的大小 |
| 網中人 回复于:2005-02-04 22:55:20 |
| block 有大小, 但 i-node 沒有,
i-node 只有"多少"而"大小"之別. |
| 衍水狂客 回复于:2005-02-05 16:05:59 |
| [quote:f352ac6458="網中人"]哪本書啊?
你將"黑色部份"的 i-node 換成 block 後再重讀會比較好理解.[/quote:f352ac6458] 看的是国内一个人写的书,可以凑合看,挺基础的书。 看到那个地方,有点想不明白了。 疑问: i-node如果用光了,可以再增加吗? i-node如果用光了,硬盘上还有空闲空间,如果我还想使用,我应该怎么办呢? |
| peng 回复于:2005-02-05 16:21:55 |
| i-node用光了,不能增加,除非format的时候制定。。
i-node你可以理解成一个大楼。 如果这个楼房建筑的时候,就是100户,只能卖100套房子,住100户人家,没家4室二厅,200平米。。当来了101户人的时候,虽然没家人家200平米,但是也只是人家自己住。不能让其他人住了。。 如果你建立楼房的时候,都是小户型,同样建筑面积200×100平米,但是你每个户型都是100平米的小房间,就可以住200户人家了。。 这个东西,是你盖房子的时候决定的。以后不允许你在顶楼上再加盖了。。 系统的i-noode也是这个意思。。 创建文件系统的时候,就定义了i-noode的个数。计算机是通过i-noode来管理文件系统的。。 讨论一下,我也真平时没有仔细看这个i-noode,但是我认为是有大小的。。 我记得听netapp公司的存储培训的时候,有个系统快照的概念。就是存储某一时刻的i-noode的快照,来定义文件的状态。如果系统文件发生变化,有个文件记录文件变化的i-noode的状态,用来以后恢复成文件,就是通过i-noode的变化,来复原数据。。 这个i-noode的大小,应该是有个概念的。。但不是实际占用的数据,而是一个定义的大小范围。。 |
| 山中无老虎 回复于:2005-02-05 16:27:33 |
| 我是来听讲课的,狂客兄还好吧? |
| 網中人 回复于:2005-02-05 16:50:32 |
| 看 file system 的實作...
當你發現 ext2/ext3 所受的 inode 限制, 再看其他更聰明的 file system 在 inode 與 block space 得處理, 如 reiserfs/jfs/xfs 這些... 你就知道何以那麼多人不用 ext2/ext3 . |
| JohnBull 回复于:2005-02-05 17:14:44 |
| [quote:5065c71fd6="衍水狂客"]
问题: 1.红色字体部分我有点不太明白,如果文件很小,没有足够的i-node,但是仍然有存储空间,为什么还存储不了文件呢?那些空闲的空间怎样使用呢?不是浪费了吗?(想不明白了) 2.如果i-node不够用了,怎?..........[/quote:5065c71fd6] 这本书说错了,烧掉! :evil: 大多数32位UNIX系统的一个i-node中有15个32位块指针,其中12个是直接块指针,一个指针指向一个块;剩下的3个分别是一级间接块指针、二级间接块指针和三级间接块指针。 当文件长度小于等于12个块的时候使用直接块指针指向相应的磁盘块,当大于12个块的时候会分配一个指针块,让一级间接块指针指向这个指针块,这个指针块中存放直接指针,再不够了就动用二级和三级间接指针。 无论如何,一个文件实体都是一个i-node! 这是UNIX文件系统的基础知识。 |
| 山中无老虎 回复于:2005-02-05 17:28:15 |
| [quote:a95e9de48c="JohnBull"]
这本书说错了,烧掉! :evil: 大多数32位UNIX系统的一个i-node中有15个32位块指针,其中12个是直接块指针,一个指针指向一个块;剩下的3个分别是一级间接块指针、二级间接块指针和三级间接块指针。 当文件长..........[/quote:a95e9de48c] 老大的意思是不是不可能出现有存储空间,但没有i-node的情况呢?我没太明白老大的意思。 |
| JohnBull 回复于:2005-02-05 17:33:33 |
| [quote:180b0a5882="山中无老虎"]
老大的意思是不是不可能出现有存储空间,但没有i-node的情况呢?我没太明白老大的意思。[/quote:180b0a5882] 会出现的! 我说“一个文件实体永远是一个i-node”,但没说i-node是无限多的啊!那句什么“再用第二个i-node”之类的话纯属放屁! 回去找本关于UNIX/Linux文件系统的书看吧。 |
| 網中人 回复于:2005-02-05 20:25:47 |
| 不如先了解一下 block type:
- data block - inode block - indirect block - super block 我先給 keyword, 內容請自己找文件看. |
| 山中无老虎 回复于:2005-02-06 08:51:55 |
| [quote:2631cbdcef="JohnBull"]
会出现的! 我说“一个文件实体永远是一个i-node”,但没说i-node是无限多的啊!那句什么“再用第二个i-node”之类的话纯属放屁! 回去找本关于UNIX/Linux文件系统的书看吧。[/quote:2631cbdcef] 多谢老大了,我明白了。 |
| skylove 回复于:2005-02-06 08:56:18 |
| 国内的书作者不见得功力有多深的。
论坛幸福吧。。。一有问题就可以来问。。。。个人觉得象这样的探讨交流多一些,cu会员进步会粉神速的。 我对i-node所知很少,跟着看各位的帖子长见识。 |
| peng 回复于:2005-02-06 09:01:36 |
| 看来,俺也该仔细看看了。。
希望回来后继续象大家学习。。。 |
| 衍水狂客 回复于:2005-02-06 16:34:24 |
| 如果i-node用光了,而磁盘还有空间,
那这个空间就是浪费了吗? |
| 衍水狂客 回复于:2005-02-06 16:38:10 |
| [quote:d9e3deb967="山中无老虎"]我是来听讲课的,狂客兄还好吧?[/quote:d9e3deb967]
自学Linux,准备专生本的。 Linux考的是上机。 边看边问! |
| JohnBull 回复于:2005-02-06 18:33:27 |
| [quote:1250426bec="衍水狂客"]如果i-node用光了,而磁盘还有空间,
那这个空间就是浪费了吗?[/quote:1250426bec] 至少对于ext2/ext3来说,就只能浪费了。 |
| 衍水狂客 回复于:2005-02-06 18:37:42 |
| 那什么样的文件系统好一点呢? |
| JohnBull 回复于:2005-02-06 19:03:49 |
| 我一直在用XFS。 |
| 衍水狂客 回复于:2005-02-08 16:58:11 |
| 让Linux在XFS上工作? |
| q1208c 回复于:2005-02-08 18:09:50 |
| 呵呵, I-node这么好玩么?
很早的时候就听说这个东东会没有的, 但我还没做出来没有的呢。 一般的系统一个 I-node差不多就对一个Block,也就差不多是1K,好象也有4K的。就算是4K的好了, 除非你存的全是4K以下的小文件,不然是不太会出现I-node用光了, BLOCK还有的情况的。 |
| 網中人 回复于:2005-02-09 11:21:06 |
| 我前面建议大家去看 block type ,不知道有没看过呢?
要知道不管文件大小如何都最少回占一个 inode (除 hard link 外), 但不见得会占 data block ,比方空白文件欲与 soft link 。 想玩一下的话,跑一下如下的 command 看看: for i in $(seq 100000000000000000); do touch test.$i ; done df -i |
| 采风 回复于:2005-02-09 17:15:00 |
| inode的数量和文件系统容量有关系,不能增加 :roll: |
| foole 回复于:2005-02-09 20:42:16 |
| 前面那位老兄关于建大楼的比喻真形象
呵呵 |
| 網中人 回复于:2005-02-11 00:27:44 |
| 这串讨论我关注到现在, 还没发现比较满意的说法.
今晚给亲友拜完年, 有点时间我就跟大家说一说吧, 不一定准确, 只以记忆说个大概. 首先, 先让我们认识 block device 的定义: 按固定大小空间划分等量单位且能随机(random)存取之设备. 我们常用来存放文件的设备就是 block device . 在进行所谓 format 的时候, 其中一个很重要的处理就是在 device 上划分等量单位的 block . 而 block-size 通常可让我们自行定义, 在 linux mkfs 里, 我们可选用的 size 为 1k, 2k, 4k. 若不指定的话, 程序会自动按实际情况取值. 一旦 format 完成后, 这个 block size 就不能变更了, 除非重新 format (数据也不见了). 然而 block size 只能制定最小的空间使用单位, 但 block 的用途却有很多种的: super block inode block indirect block data block 我们这里既然只谈 inode , 那我就针对 inode 来说好了. 若大家有参考我前面贴的联结, 应该知到 inode 的内容了吧? 大概如下: file type permission mode link count ownership size time stamps(c,m,a) first level pointers to data block(total 15) other attributes 其中要注意的有: * inode 不含 file name, 那是 directory data block 的内容. (请自行抽空看 directory 的细节, 我这次不谈了.) * pointers to data block 是找到 data block 的依据, 共分三层, 细节我也先略过, 有空请自行看文档. 但要知道的一个硬道理是: 若没有 inode, 我们没办法从 file system 中知道文件的 data block(s) 在哪! 因此我们才那么肯定的说: 每一个文件都会用掉一个 inode ! 好了, 再回来看 format 吧, 当 block size 问题解决之后, 接下来伤脑筋的就是: 不同的 block type 要如何分配那些划好的 block unit 呢? 最不伤神的就是让程序自己搞, 但你啥也不能支配. 另一个方法就是用如下两个方法之一: 1) 指定确切数量的 inode, 剩下的给其他 block type 瓜分. 2) 按数据比例来定 inode 数量, 剩下的给其他 block type 瓜分. 前者比较好理解, 比方: total space = 80k block size = 4k 那么总 block 数是20个, 若我明确定了10个 inode , 那我最多能建立案10份文件. 那剩下的就只有10个给其它 block type 了. 第二种方法的话, 若我说每4k data 就得分配一个 inode, 然则每当一个 data block 被建力起来, 则肯定也会建一个 inode . 为方便计算, 假设暂时不管 super block , 将indirect block 也视为 data block, 那么当建了 10 个 data block 时, 所有 block 也就用光了! 假如, 我将比例修改为每 8k data 才分配一个 inode 的话, 理论上我大约可建 12 个 data block 与 6 个 inode (你自己想一下剩下的两个 block 怎么用吧!) 然而, 若将比例修改为每 2k data 才分配一个 inode 呢? okay, 假设我们用第一种方法 format 工作已经完成, 接下来让我们写入文件吧(假设 mount 好了) 首先建一个空白文件(file1), 这时, 剩下9个 inode 与 10 个 data block.(因空白文件不消耗 data block!) 再建一个只有 1byte 的文件(file2), 这时剩下8个 inode 与 9 个 data block. (虽不满4k, 但也得耗一个 data block!)
本文关键:关于i-node的疑问?有点想不明白了!
|