一.inode size 定義 | |||||
|
inode table是data area的索引表.
Inode分內存中的inode和文件系統中的inode,我們這說的是文件系統中的inode。
1.linux FS 可以簡單分成 inode table與data area兩部份。inode table上有許多的inode, 每個inode分別記錄一個檔案的屬性與這個檔案分佈在哪些datablock上(也就是我們說的指針)。
inode兩個功能:記錄檔案屬性和指針
2.inode table中紅色區域即inode size,是128Byte,在liunx系統上通過命令我們可以看到,系統就是這麼定義的。
Inode size是指分配給一個inode來記錄文檔屬性的磁盤塊的大小。
dumpe2fs -h /dev/hda6 | grep node
Inode size: 128
3.data ares中紫色的區域block size:這就是我們一般概念上的磁盤塊。這塊區域是我們用來存放我們的數據的地方。
4.還有一個邏輯上的概念:是指FS中每分配2048 byte給data area, 就分配一個inode。但是一個inode就並不是一定就用掉2048 byte, 也不是說files allocation的最小單位是2048 byte, 它僅僅只是代表filesystem中inode table/data area分配空間的比例是128/2048 也就是1/16。
mkfs.ext3 -i 2048 這個-i參數就是我們所說的邏輯概念,它的大小決定inode count的大小,redhat5默認-i最小爲可設置爲1024.
5.網上很多介紹關於inode的文章,把inode size的定義搞錯了,他們把-i參數這個值或block size解讀爲inode size 所以很多文章令人費解。
6.inode參數是可以通過mkfs.ext3命令改變的:
mkfs.ext3 -i 2048 -b 8192 -f 1024 /dev/sdb2
-i 2048更改inode每2KB創建一個
-b 8192設置block size的大小爲8kB
-f 1024設置fragments的大小爲1KB
mkfs.ext3 –N 2939495 /dev/sdb2
–N 2939495更改inode count。
二.更改一個分區inode參數的完整操作過程:
1.卸載硬盤分區:
[root@localhost ~]# umount /dev/hda7
2.調整inode參數
[root@localhost ~]# mkfs.ext3 -i 1024 -b 8192 /dev/hda7
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2048256 inodes, 512064 blocks
25603 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=525250560
63 block groups
8240 blocks per group, 8240 fragments per group
32512 inodes per group
Superblock backups stored on blocks:
8240, 24720, 41200, 57680, 74160, 206000, 222480, 403760
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
3.修改/etc/fstab
修改前
[root@localhost ~]# vi /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
LABEL=/opt /opt ext3 defaults 1 2
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
LABEL=SWAP-hda8 swap swap defaults 0 0
~
修改後:
[root@localhost ~]# vi /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
/dev/hda7 /opt ext3 defaults 1 2
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
LABEL=SWAP-hda8 swap swap defaults 0 0
4.掛載分區
mount -a
5.完成後
參數-i 最小值是1024,這個值的大小決定inode count的大小,對應關係:
i=2048 Inode count:1025024
i=1024 Inode count:2048256
inode size的值在這是沒有變化的,這也可以證明我上面定義的inode size。
讓我們更加清晰的這幾個定義之間的關係。
Inode size
Block size
Inode conut
[root@localhost ~]# dumpe2fs -h /dev/hda7
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 440696ad-80e7-4810-8648-a9efda177ea9
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal resize_inode dir_index filetype needs_recovery sparse_super
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 2048256
Block count: 1024128
Reserved block count: 51206
Free blocks: 873767
Free inodes: 2048245
First block: 0
Block size: 2048
Fragment size: 2048
Reserved GDT blocks: 512
Blocks per group: 8176
Fragments per group: 8176
Inodes per group: 16256
Inode blocks per group: 1016
Filesystem created: Fri Jul 11 18:10:33 2008
Last mount time: Fri Jul 11 18:11:02 2008
Last write time: Fri Jul 11 18:11:02 2008
Mount count: 1
Maximum mount count: 34
Last checked: Fri Jul 11 18:10:33 2008
Check interval: 15552000 (6 months)
Next check after: Wed Jan 7 18:10:33 2009
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal inode: 8
Default directory hash: tea
Directory Hash Seed: ad1b7c40-6978-49e9-82f6-2331c5cac122
Journal backup: inode blocks
Journal size: 32M
註釋:由於時間關係:
關於mkfs.ext3 -i 2048 -b 8192 -f 1024 /dev/sdb2
中這個-i參數的定義,我是根據對應關係推斷,給了它只是個邏輯概念的定義。
歡迎大蝦們有更有力的論據來解釋一下,或推翻我的觀點。
三.讀取一個樹狀目錄下的文件/etc/crontab 的流程
<!--[if !supportLists]-->1. 操作系統根據根目錄( / )的相關資料可取得 /etc 這個目錄所在的 inode ,並前往讀取 /etc 這個目錄的所有相關屬性;<!--[endif]-->
<!--[if !supportLists]-->2. 根據 /etc 的 inode 的資料,可以取得 /etc 這個目錄底下所有文件的關連數據是放置在哪一個 Block 當中,並前往該 block 讀取文件的關連性容;<!--[endif]-->
<!--[if !supportLists]-->3. 由上個步驟的 Block 當中,可以知道 crontab 這個文件的 inode 所在地,並前往該 inode ;<!--[endif]-->
<!--[if !supportLists]-->4. 由上個步驟的 inode 當中,可以取得 crontab 這個文件的所有屬性,並且可前往由 inode 所指向的 Block 區域,順利的取得 crontab 的文件內容<!--[endif]-->
<!--[endif]-->
四.硬鏈接
Hard Link 只是在某個目錄下新增一個該檔案的關連數據而已!
1.舉個例子來說,我的 /home/vbird/crontab 爲一個 hard link 的檔案,他連結到 /etc/crontab 這個檔案,也就是說,其實 /home/vbird/crontab 與 /etc/crontab 是同一個檔案,只是有兩個目錄( /etc 與 /home/vbird )記錄了 crontab 這個檔案的關連數據罷了!也就是說,我由 /etc 的 Block 所記錄的關連數據可知道 crontab 的 inode 放置在 A 處,而由 /home/vbird 這個目錄下的關連數據,contab 同樣也指到 A 處的 inode !所以, crontab 這個檔案的 inode 與 block 都沒有改變,有的只是有兩個目錄記錄了關連數據.
2.使用 hard link 設定連結文件時,磁盤的空間與 inode 的數目都不會改變!由上面的說明來看,我們可以知道, hard link 只是在某個目錄下的 block 多寫入一個關連數據,所以當然不會用掉 inode 與磁盤空間。
3.當我們修改其中一個文件的內容時,互爲硬鏈接的文件的內容也會跟着變化。如果我們刪除互爲硬鏈接關係的某個文件時,其它的文件並不受影響.
4.由於 hard link 是在同一個 partition 上面進行數據關連的建立,所以 hard link 是有限制的:
a. 不能跨 Filesystem.
b. 不能 link 目錄。
五.軟鏈接
1.軟鏈接也叫符號鏈接,他和硬鏈接有所不同,軟鏈接文件只是其源文件的一個標記。當我們刪除了源文件後,鏈接文件不能獨立存在,雖然仍保留文件名,
但我們卻不能查看軟鏈接文件的內容了.
2.Symbolic Link 與 Windows 的快捷方式可以給他劃上等號,由 Symbolic link 所建立的檔案爲一個獨立的新的檔案,所以會佔用掉 inode 與 block
3.所以可用使用軟鏈接解決某個分區inode conut不足的問題(軟鏈接到另一個inode count足夠多的分區)
本文出自 “足球痞子” 博客,請務必保留此出處http://dianping.blog.51cto.com/427241/95041
本文出自 51CTO.COM技術博客