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的大小,应该是有个概念的。。但不是实际占用的数据,而是一个定义的大小范围。。
——————————————————————————————————————————————————————————————————————————————
这串讨论我关注到现在, 还没发现比较满意的说法.
今晚给亲友拜完年, 有点时间我就跟大家说一说吧, 不一定准确, 只以记忆说个大概.
首先, 先让我们认识 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 = 40k
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 上的差异, 那就更好了!
但, 我最不乐见的是信口开河, 自己没深入了解就算了, 乱吹一通害了别人就实在不该了~~~
最后, 祝福大家新的一年学业进步!