关于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!) 再建一个 9k 的文件(file3), 这时剩下7个 inode 与 6 个 data block. (因为9k会用掉3个 data block!) 再下来, 我再建一个 17k 文件, 这时候, 我可能得到两种结果: 1) 写完剩下的 4 个 data block, 然后遗失 1k 的数据 2) 得到空间不足的错误, 拒绝建立新文件. 各位自己猜一猜 linux ext2/ext3 是怎么处理的? 下面, 到了思考时候了: 我假设是2好了, 也就是刚才的建立失败了. 再接下来, 我一口气新建了7份空白文件. 1) 请问我还能建立新文件吗? 若可, 最多还能建多少份? 2) 我可扩充原有第一份文件(file1)的数据吗? 若可, 最多还能塞多少byte数据? 3) 原有第一份文件(file1)的数据没有扩充(依然为空白), 我可扩充原有第二份文件(file2)的数据吗? 若可, 最多还能塞多少byte数据? 4) 若我先将第三份文件(file3)删除掉, 重新回答以上三题. 我相信, 若你读得懂我的说明, 且能回答以上题目, 你应可回答搂主原问题了吧! 不过, 我这还没扯上 indirect block, direcotry, link, special file 等等概念进来, 因此还不能较为全貌的了解 file system, 这些请大家自行补习了. 若行有余力, 再了解一下其他 file system, 如 reiserfs, xfs 等, 在 tailing block 及 data block location method 上的差异, 那就更好了! 但, 我最不乐见的是信口开河, 自己没深入了解就算了, 乱吹一通害了别人就实在不该了~~~ 最后, 祝福大家新的一年学业进步! |
daniel_w 回复于:2005-02-16 08:34:32 |
sco 里可以先把i-node不足的那个卷的文件备份出来,然后重新设置i-node数量,最后恢复文件。 哈哈,要是i节点不足的话你可以按照上面的方法去做啊。 |
網中人 回复于:2005-02-16 12:24:40 |
backup/reformat/restore 是個方法, 不獨 SCO . 與其這麼麻煩, 何不改用 reiserfs 這累按需分配 inode 的系統呢? |
JohnBull 回复于:2005-02-16 12:41:12 |
[quote:ce0ea6c740] * inode 不含 file name, 那是 directory data block 的内容. (请自行抽空看 directory 的细节, 我这次不谈了.) [/quote:ce0ea6c740] 注意,目录也是一个文件而已,不存在所谓的directory data block。 [quote:ce0ea6c740] 另一个方法就是用如下两个方法之一: [/quote:ce0ea6c740] 你这两个方法都是最传统的UNIX/LINUX采用的,现代或者当代文件系统都不是这样了,以你提到了而又不太了解的XFS为例,整个文件系统,不论是i-node还是文件块都是采用B-tree来组织,完全是动态的、按需分配的!再加上XFS的i-node编号是64位的,所以在XFS文件系统上几乎不可能出现因为i-node耗尽而无法分配磁盘块的情况。 :) 显然你还是看过一些书的,但是你更应该看看内核源码剖析。Linux系统里面的技术是非常精彩而先进的。 |
JohnBull 回复于:2005-02-16 12:46:14 |
[quote:db614cff0f="網中人"]backup/reformat/restore 是個方法, 不獨 SCO . 與其這麼麻煩, 何不改用 reiserfs 這累按需分配 inode 的系統呢?[/quote:db614cff0f] 你真的应该了解一下XFS!相信我,你肯定会弃用其他的分区格式!reiserfs对于存储极大尺寸和极小尺寸文件的时候效率远不如XFS。 |
網中人 回复于:2005-02-16 15:34:44 |
當然, cgi 系統一直執圖像處理的牛耳, hollywood 的特效隨便一個 file 就大得驚人! 由 cgi 發展的 XFS 在大文件的處理上當然是認第二沒人敢認第一的了. 以單一 file size 來說, 最大可到 2TB, 單一 FS 可最大到 8EB . 而 reiserfs 最大 file size 卻可達到 16TB, 但 FS 最大只能到 1EB . 至於 ext2/ext3 則分別是 2TB 與 16TB . 但從演算法來看, XFS 也是用 inode, 但用 b-tree 來作索引. 而 reiserfs 則只用 b-tree. 我不太清楚這兩者之間的差異在哪, 兄若有空, 可否說說? 最好能針對小文件與大文件來比較一下. 據我所知, 對數量多而小的文件系統來說, reiserfs 堪稱是最好的. 不知兄又有何說法呢? 不過, reiserfs 與 jfs 都在 mount 的時可以做 resize (extended only), 而 xfs 只能在 unmount 之後才能作. 這點 reiserfs 略勝一籌... ^_^ p.s. (1EB(exabyte)=1024PB 1PB(petabyte)=1024TB 1TB(terabyte)=1024GB |
大雪飞扬 回复于:2005-02-16 17:02:44 |
精彩!!! |
山中无老虎 回复于:2005-02-16 17:14:22 |
课上完了吗?我长了很多的见识。多谢网中人与JOHNBULL版主。 |
寂寞烈火 回复于:2005-02-16 17:27:03 |
太精彩啦!!! |
shaoping0330 回复于:2005-02-16 18:03:12 |
谢谢! |
網中人 回复于:2005-02-16 21:07:29 |
[quote:743aff7c24="JohnBull"]注意,目录也是一个文件而已,不存在所谓的directory data block。 [/quote:743aff7c24] 是的, 我沒明確說清楚而已, directory=file . file type 在 inode 中定議. 若有 data 才會使用 data block . 而目錄肯定有 data 的, 因為至少會含 . 和 .. 這兩項. 然後透過這個 data block 的讀取, 才知到其下 file(dir) 的 inode , 如此逐層目錄循環下去, 直到最後一層 dir(file) 的 data block, 得知路逕中最後一份 file(dir) 的 inode , 最後才有 data block 的讀取. 反正, 每一層的 directory 都有 data block, 若其內項目 data 超過一個 data block 的長度, 也會再啟用新的 data block. 也就是我曰之為 directory data block 或你提到的也是 file data block . 至於 XFS 我不熟, 我也從沒說我熟. 且我一開始就說明了: "當你發現 ext2/ext3 所受的 inode 限制, 再看其他更聰明的 file system..." 不知 John 兄有否看到? 而我再之前給的 link , 也開宗明義的說明是針對 ext2/ext3 的. 兄台既然來到這裡, 曾多次提到 XFS 的好處, 那, 能否就順便講一下它好在哪裡? 原理如何? 如此, 才是一個討論技術的應有態度哦, 您覺得呢? 關於 source code, 抱歉, 了解我的人, 都知道我對 programing 不熟, 且我從來沒說過我看得懂. 因此, 我只能看書及其他資料, 理解上或不透徹, 這是需要其他朋友來補充的. 不是每一個人都有能力看 source code 的. 要有的話, 這串討論應移到編程版, 而不是 linux 版(甚至不是 linux 高級應用). 既然兄有此能力, 何不拔一毛以利天下呢? 不為之? 還是不能為之呢? 願虛心受教... 也為同好們請命. 當然, 若要求有過份之處, 有請兄台見諒. 若有言語上冒犯閣下, 多是文字字面的誤解, 先行跟您請罪就是了. 最後, 分享一下個人學習心得. 關於 file system 的理解上我一開始也是一塌糊涂的. 也是從不斷的錯誤理解與討論中學過來的... 如下一些討論, 或許大家也可參考一二的: http://phorum.study-area.org/viewtopic.php?t=17506 http://phorum.study-area.org/viewtopic.php?t=12235 |
bbenyu 回复于:2005-02-17 09:38:14 |
最好去看<unix 操作系统设计> 这本书. 对于i-node等等都有较完整和详细的说明! |
NetDC 回复于:2005-02-17 11:42:54 |
http://www.linux-mag.com/2000-08/journaling_01.html 也许这个有帮助。:-) 不过,是英文的。 |
galaxy1975 回复于:2005-02-17 12:01:13 |
你用 #df -k #df -i 这两个命令就可以看出一些不同。 第一个是说空间的占用的。第二个说的是i-node占用比例的。 i-node的多少,和文件系统格式化时,block的大小有关的。 |
galaxy1975 回复于:2005-02-17 12:12:59 |
刚才说的不是很准确,用mke2fs手册中的一段来解释吧: -N number-of-inodes overrides the default calculation of the number of inodes that should be reserved for the filesystem (which is based on the number of blocks and the bytes-per-inode ratio). This allows the user to specify the number of desired inodes directly. |
JohnBull 回复于:2005-02-17 13:36:11 |
看源码确实很累,这就是我为什么说要看看“源码剖析”而不是直接读核的原因。 内核代码中有很多细节是非常tricky的,甚至连程序员都找不着头绪,看剖析的好处就是可以忽略语言的底层细节,由熟悉内核的高手们直接把上层逻辑摘出来给我们看,这非常有助于我们了解什么是Linux,它究竟好在哪里,而又不必在语言上纠缠。 另一方面,这种Linux内核剖析的书籍与那些良心被狗吃了的SB枪手们为对Windows胡吹乱捧的文章有着本质的不同(许多地方,无数SB们吹捧NTFS,可是NTFS究竟好在哪里、安全在哪里,快在哪里,他们连一个屁也放不出来)。 因为代码就摆在那里,一切都可以质疑,一切都可以实证。当我们日后对语言有了更深层了解的时候,会更上一层楼。 |
stonerose 回复于:2005-02-17 14:37:55 |
钦佩网中人的精神! |
JohnBull 回复于:2005-02-18 02:15:23 |
[quote:4f66d913a3="網中人"]當然, cgi 系統一直執圖像處理的牛耳, hollywood 的特效隨便一個 file 就大得驚人! 由 cgi 發展的 XFS 在大文件的處理上當然是認第二沒人敢認第一的了. ..........[/quote:4f66d913a3] 是SGI,不是CGI。SGI的优势是超级计算机,它的图形/3D工作站虽然常见,但远不是它最强的强项。 ReiserFS也有i-node,只是换个名字叫做了“键”,就算真的没有,VFS也会在逻辑上映射出一个来,否则怎么进行文件操作呢? 有过很多宣传渲染ReiserFS的小文件特性,但那是跟ext3比的。而且这个结论的得出基于这样的推理: ReiserFS使用b-tree来优化搜索,而小文件通常会造成很大的目录(考虑源码树的编译),这样来说,因为ReiserFS利用b-tree可以很好地处理巨大的目录,所以它对于小文件组成的文件系统效率很高。 XFS也使用b-tree,同样道理,虽然XFS比Reiser慢一些,但是XFS是支持“实时子卷”的,性能可以接近裸设备操作。 而在大文件IO方面你已经清楚了,而且在这方面ReiserFS甚至还不如ext3,更不要说是XFS了。 实际上XFS也可以在不umount的情况下作调整,只要freeze一下就可以了,这实际上利用了它支持快照的特性。 我的经验都是基于reiser3,6的,不知现在reiser4怎么样,没用过。 你可以去XFS的官方站看看: http://oss.sgi.com/projects/xfs/ |
網中人 回复于:2005-02-18 03:25:59 |
感謝兄的更正及資訊, 受教了! 兄對 file system 的了解遠勝小弟, 有空的話, 多來指點大家, 實是咱們的福氣啊. 两位老大都过谦了,有空儿多来linux版指导指导吧,实是俺们的福气啊! :mrgreen: (嗯? 這句是版主加的吧?) |
大雪飞扬 回复于:2005-02-19 00:10:14 |
呵呵,都很强, 不管是Johnbull,还是netman,在我印象中好象都是特实在的人,很少灌水 都是我很敬佩的人 在此,他们一起为大家上了精彩的一课,hehe, it's show time! |
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/