Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1045370
  • 博文数量: 227
  • 博客积分: 5951
  • 博客等级: 大校
  • 技术积分: 2598
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-22 17:42
文章分类
文章存档

2015年(2)

2014年(12)

2013年(16)

2012年(22)

2011年(19)

2010年(36)

2009年(77)

2008年(39)

2007年(16)

我的朋友

分类: LINUX

2008-01-30 08:25:46

i-node你可以理解成一个大楼。 


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 上的差异, 那就更好了! 
但, 我最不乐见的是信口开河, 自己没深入了解就算了, 乱吹一通害了别人就实在不该了~~~ 

最后, 祝福大家新的一年学业进步!

阅读(1509) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~