inode及相關概念

一.inode size 定義







inode tabledata area的索引表.

 

Inode分內存中的inode和文件系統中的inode,我們這說的是文件系統中的inode

 

1.linux FS 可以簡單分成 inode tabledata 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 bytedata area, 就分配一個inode。但是一個inode就並不是一定就用掉2048 byte, 也不是說files allocation的最小單位是2048 byte, 它僅僅只是代表filesysteminode 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更改inode2KB創建一個

-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]-->

 

<!--[if !vml]-->
<!--[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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章