再建一个 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 上的差异, 那就更好了!
但, 我最不乐见的是信口开河, 自己没深入了解就算了, 乱吹一通害了别人就实在不该了~~~
最后, 祝福大家新的一年学业进步!
哈哈,要是i节点不足的话你可以按照上面的方法去做啊。
與其這麼麻煩, 何不改用 reiserfs 這累按需分配 inode 的系統呢?
* 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系统里面的技术是非常精彩而先进的。
與其這麼麻煩, 何不改用 reiserfs 這累按需分配 inode 的系統呢?[/quote:db614cff0f]
你真的应该了解一下XFS!相信我,你肯定会弃用其他的分区格式!reiserfs对于存储极大尺寸和极小尺寸文件的时候效率远不如XFS。
由 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
是的, 我沒明確說清楚而已, 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 .