Linuxinode學習_第1頁
Linuxinode學習_第2頁
Linuxinode學習_第3頁
Linuxinode學習_第4頁
Linuxinode學習_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Linuxinode學習在Linux文件系統(tǒng)中,很多人對Inode都不太明白,今天我就和大家一起來分享一下我對Inode的認識,如果有理解錯誤的地方,請大家多多批評指點。先看看Inode的結構圖再來了解一下文件系統(tǒng)如何存取文件的1、根據文件名,通過Directory里的對應關系,找到文件對應的Inodenumber2、再根據Inodenumber讀取到文件的Inodetable3、再根據Inodetable中的Pointer讀取到相應的Blocks這里有一個重要的內容,就是Directory,他不是我們通常說的目錄,而是一個列表,記錄了一個文件/目錄名稱對應的Inodenumber。如下圖Di

2、rectory:Adirectoryisamappingbetweenthehumannameforthefileandthecomputer'sinodenumber.所以說,這個Directory不是文件,我們可以看作是文件系統(tǒng)中的一個屬性,只是用來關鍵文件名與Inodenumber。這個一定要理解好,否則后面關于硬鏈接的內容,就不容易理解了。我在一天一點學習Linux之文件與目錄權限的基本概念中講到第二欄表示的是有多少文件連接到inode如果是一個文件,此時這一字段表示這個文件所具有的硬鏈接數,如果是一個目錄,則此字段表示該目錄所含子目錄的個數?,F在是不是容易理解了?如果你還不是

3、很明白,那么下面我們就再通過實例讓大家明白。我們以RHEL6系統(tǒng)為例在根目錄下創(chuàng)建一個test目錄,我們進入此目錄,進行操作。rootyufeitest#pwd/testrootyufeitest#touchtestfilerootyufeitest#mkdirtestdir創(chuàng)建實驗文件和目錄rootyufeitest#ls-litotal4977drwxr-xr-x.2rootroot4096Apr516:48testdir976-rw-r-r-.1rootroot0Apr516:47testfile查看到文件與目錄的Inode和inodecount分別為977<&gt

4、;2<>testdir976<>1<>testfile現在目錄的鏈接數為2,文件的鏈接數為1。為什么會這樣呢?其實很好理解。對于目錄而言,每個目錄里面肯定會有兩個特殊目錄,那就是.和.這兩個目錄,我們前面的課程中也講到,.表示當前的目錄,而.則是表示上層目錄。我們也知道,在Linux系統(tǒng)中,是從根來開始查找的,要想找到某個目錄,必需要先找到他的上層目錄,所以說,空目錄(嚴格的來說,不能叫空目錄)是有兩個鏈接到相應的Inodenumber的。作為文件很明顯,他只有一個鏈接到相應的Inodenumber。也不用多說

5、,下面我們就來看看這個鏈接數是如何改變的。繼續(xù)上面的操作rootyufeitest#lntestfiletestfile.hardrootyufeitest#ln-stestfiletestfile.soft對testfile建立一個硬鏈接和一個軟鏈接rootyufeitest#ls-il977 drwxr-xr-x. 2 root root 4096 Aprtotal4976 -rw-r-r-. 2 root root976 -rw-r-r-. 2 root root978 lrwxrwxrwx. 1 root root-> testfile再查看文件和目錄的屬性,516:48

6、testdir0Apr516:47testfile0Apr516:47testfile.hard8Apr517:03testfile.soft我們就發(fā)現:創(chuàng)建一個硬鏈接后,testfile的inodecount增加了一個。而且testfile和testfile.hard這兩個的Inodenumber是一樣的。這個硬鏈接就是重新創(chuàng)建Inode。實質就是在Directory中增加了一個新的對應關系。通過這個例子,你是不是更清楚了,這個Inodecount的含義了。他就是指,一個Inode對應了多少個文件名。F面我們再來看看硬鏈接的其他特點Tue Aprrootyufei#watch-n1"

7、;df-i;df"Every1.0s:df-i;df521:52:532011FilesystemInodesIUsedIFree IUse%Mountedon/dev/sda196099210541585557711% /tmpfs63946639451%/dev/shmFilesystem1K-blocksUsed Available Use%Mountedon/dev/sda1151187282747612 1160311620%/tmpfs2557842557840%/dev/shm用上面的命令可以實時查看系統(tǒng)中所剩的block和inode的變化數量。建議大家不要用deump

8、e2fs和tune2fs這兩個命令,如果使用他們來查看的話,將會很郁悶你會發(fā)現,你無論怎么創(chuàng)建文件或對文件寫入內容,Inode和block的值都不會變,除非你每操作一次,重新啟動一次系統(tǒng),而用了上面的命令,就是第秒鐘監(jiān)視他們的變化情況。關于df的命令使用,大家可以自行查看幫助進行學習。當然還有du這個命令,他們都和文件系統(tǒng)有關。我們再來創(chuàng)建一個硬鏈接rootyufeitest#ls-li5 16:48 testdirtotal4977drwxr-xr-x.2rootroot4096Apr976 -rw-r-r-. 2 root root0 Apr5 16:47 testfile976 -rw-

9、r-r-. 2 root root0 Apr5 16:47 testfile.hard978 lrwxrwxrwx. 1 root root8 Apr 5 17:03 testfile.soft->testfilerootyufeitest#lntestfiletestfile.hard1rootyufeitest#ls-li5 16:48 testdirtotal4977drwxr-xr-x.2rootroot4096Apr976 -rw-r-r-. 3 root root0 Apr5 16:47 testfile976 -rw-r-r-. 3 root root0 Apr5

10、16:47 testfile.hard976 -rw-r-r-. 3 root root0 Apr5 16:47 testfile.hard1978 lrwxrwxrwx. 1 root root8 Apr 5 17:03 testfile.soft->testfile可以再觀察一下Inodecount和Inodenumber的對應關系。inodes和blocks的變化rootyufei#watch-n1"df-i;df"Every 1.0s: df -i;df 5 21:53:38 2011FilesystemMounted on/dev/sda1 tmpf

11、s/dev/shmFilesystemInodes IUsedTue AprIFree IUse%960992 105415 85557711% /639461K-blocks1639451%Used Available Use%Mountedon/dev/sda11511872827476121160311620%/tmpfs25578402557840%/dev/shm我們發(fā)現,inodes和blocks是沒有減少的,所以說,硬鏈接是不會占用磁盤的空間的。如果說刪除硬鏈接的話,就會改變Inodecount的數量。硬鏈接還有其他的兩個特性:不能跨Filesystem也不能link目錄。下面再

12、來看看這個軟鏈接rootyufeitest#ls-iltestfile.softtestfile976-rw-r-r-.3rootroot0Apr521:50testfile978lrwxrwxrwx.1rootroot8Apr521:52testfile.soft->testfile他的Inodenumber和原文件不一樣。而且大小也發(fā)生了變化??梢?,這個軟鏈接是重新建立了一個文件,而文件是指向到原文件,而不是指向原Inode。當然他會占用掉inode與block。當我們刪除了源文件后,鏈接文件不能獨立存在,雖然仍保留文件名,但我們卻不能查看軟鏈接文件的內容了。但軟鏈接是可以跨

13、文件系統(tǒng),而且是可以鏈接目錄。他就相當于windows系統(tǒng)下的快捷方式一樣。通過這個特性,我們可以通過軟鏈接解決某個分區(qū)inodeconut不足的問題(軟鏈接到另一個inodecount足夠多的分區(qū))。接下來,我們再來分析一下復制文件、移動文件和刪除文件對inode的影響rootyufei#watch-n1"df-i;df"Every1.0s:df-i;dfTueApr521:57:382011FilesystemInodesIUsedIFreeIUse%Mountedon/dev/sda196099210541585557711%/tmpfs/dev/shm6394616

14、39451%Filesystem1K-blocksUsed Available Use%Mountedon/dev/sda1151187282747612 1160311620%/tmpfs2557842557840%/dev/shmrootyufeitest#ls-li5 16:48 testdirtotal4977drwxr-xr-x.2rootroot4096Apr976 -rw-r-r-. 3 root root0 Apr5 18:54 testfile976 -rw-r-r-. 3 root root0 Apr5 18:54 testfile.hard976 -rw-r-r-. 3

15、root root0 Apr5 18:54 testfile.hard1978 lrwxrwxrwx. 1 root root8 Apr 5 17:03 testfile.soft->testfile我們先記錄以上的信息先看復制文件的情況rootyufeitest#cptestfiletestfile.cprootyufeitest#ls-li976-rw-r-r-.3rootroot0Apr521:50testfile979-rw-r-r-.1rootroot0Apr521:58testfile.cp我們只對比這兩個文件,發(fā)現Inodenumber不一樣,我們再來看看inode

16、s和blocks的剩余情況Every1.0s:df-i;dfTueApr522:02:492011FilesystemInodesIUsedIFreeIUse%Mountedon/dev/sda196099210541685557611%/tmpfs639461639451%/dev/shmFilesystem1K-blocksUsedAvailableUse%Mountedon/dev/sda11511872827476201160310820%/tmpfs25578402557840%/dev/shm發(fā)現inodes減少了一個,而blocks也少了,這就說明,復制文件是創(chuàng)建文件,并占Ino

17、de和Block的。文件創(chuàng)建過程是:先查找一個空的Inode,寫入新的Inodetable,創(chuàng)建Directory,對應文件名,向block中寫入文件內容關于移動文件和刪除文件的實驗,大家可以自己動手來實踐吧。我直接給出相應的說明。移動文件,他分兩種情況:在同一個文件系統(tǒng)中移動文件時創(chuàng)建一個新的文件名和Inode的對應關系(也就是在Directory中寫入信息),然后在Directory中刪除舊的信息,更新CTIME,其他的信息如Inode等等均無任何影響在不同文件系統(tǒng)移動文件時先查找一個空的Inode,寫入新的Inodetable,創(chuàng)建Directory中的對應關系,向block中寫入文件內

18、容,同時還會更改CTIME。刪除文件他實質上就是減少linkcount,當linkcount為0時,就表示這個Inode可以使用,并把Block標記為可以寫,但并沒有清除Block里面數據,除非是有新的數據需要用到這個block。最后我們來做個總結:1、一個Inode對應一個文件,而一個文件根據其大小,會占用多塊blocks。2、更為準確的來說,一個文件只對應一個Inode。因為硬鏈接其實不是創(chuàng)建新文件,只是在Directory中寫入了新的對應關系而已。3、當我們刪除文件的時候,只是把Inode標記為可用,文件在block中的內容是沒有被清除的,只有在有新的文件需要占用block的時候,才會被

19、覆蓋。附錄:kernel部分inode數據結構列表*、*索引節(jié)點對象由inode結構體表示,定義文件在中*/structinodestructhlist_nodei_hash;哈希表*/structlist_headi_list;引節(jié)點鏈表*/structlist_headi_dentry;目錄項鏈表*/unsignedlongi_ino;節(jié)點號*/atomic_ti_count;/*引用記數*/umode_ti_mode;/*訪問權限控制*/linux/fs.h/*/* 索/*/*/*unsignedinti_nlink;硬鏈接數*/uid_ti_uid;/*使用者id*/gid_ti_gi

20、d;/*使用者id組*/kdev_ti_rdev;/*實設備標識符*/loff_ti_size;/*以字節(jié)為單位的文件大小*/structtimespeci_atime;/*最后訪問時間*/structtimespeci_mtime;/*最后修改(modify)時間*/structtimespeci_ctime;/*最后改變(change)時間*/unsignedinti_blkbits;/*以位為單位的塊大小*/unsignedlongi_blksize;/*以字節(jié)為單位的塊大小*/unsignedlongi_version;/*版本號*/unsignedlongi_blocks;/*文件的

21、塊數*/unsignedshorti_bytes;/*使用的字節(jié)數*/spinlock_ti_lock;/*自旋鎖*/structrw_semaphorei_alloc_sem;/*索引節(jié)點信號量*/structinode_operations*i_op;/*索引節(jié)點操作表*/structfile_operations*i_fop;/*默認的索引節(jié)點操作*/structsuper_block*i_sb;/*相關的超級塊*/structfile_lock*i_flock;/*文件鎖鏈表*/structaddress_space*i_mapping;/*相關的地址映射*/structaddress

22、_spacei_data;/*設備地址映射*/structdquot*i_dquotMAXQUOTAS;/*節(jié)點的磁盤限額*/struct listheadi_devices;/* 塊設備鏈表*/structpipe_inode_info*i_pipe;/*管道信息*/structblock_device*i_bdev;/*塊設備驅動*/unsignedlongi_dnotify_mask;/*目錄通知掩碼*/structdnotify_struct*i_dnotify;/*目錄通知*/unsignedlongi_state;/*狀態(tài)標志*/unsignedlongdirtied_when;/

23、*首次修改時間*/unsignedinti_flags;/*文件系統(tǒng)標志*/unsignedchari_sock;/*可能是個套接字吧*/atomic_ti_writecount;/*寫者記數*/void*i_security;/*u32安全模塊*/i_generation;/*索引節(jié)點版本號*/unionvoid*generic_ip;/*文件特殊信息*/u;/*索引節(jié)點的操作inode_operations定義在linux/fs.h中*/structinode_operationsint(*create)(structinode*,structdentry*,int);/*VFS通過系統(tǒng)調

24、用create()和open()來調用該函數,從而為dentry對象創(chuàng)建一個新的索引節(jié)點。在創(chuàng)建時使用mode制定初始模式*/structdentry*(*lookup)(structinode*,structdentry*);/*該韓式在特定目錄中尋找索引節(jié)點,該索引節(jié)點要對應于dentry中給出的文件名*/int(*link)(structdentry*,structinode*,structdentry*);/*該函數被系統(tǒng)調用link()電泳,用來創(chuàng)建硬連接。硬鏈接名稱由dentry參數指定,連接對象是dir目錄中l(wèi)d_dentry目錄想所代表的文件*/int(*unlink)(str

25、uctinode*,structdentry*);/*該函數被系統(tǒng)調用unlink()調用,從目錄dir中刪除由目錄項dentry制動的索引節(jié)點對象*/int(*symlink)(structinode*,structdentry*,constchar*);/*該函數被系統(tǒng)電泳symlik()調用,創(chuàng)建符號連接,該符號連接名稱由symname指定,連接對象是dir目錄中的dentry目錄項*/int(*mkdir)(structinode*,structdentry*,int);/*該函數被mkdir()調用,創(chuàng)建一個新魯姆。創(chuàng)建時使用mode制定的初始模式*/int(*rmdir)(stru

26、ctinode*,structdentry*);/*該函數被系統(tǒng)調用rmdir()調用,刪除dir目錄中的dentry目錄項代表的文件*/int(*mknod)(structinode*,structdentry*,int,dev_t);/*該函數被系統(tǒng)調用mknod()調用,創(chuàng)建特殊文件(設備文件、命名管道或套接字)。要創(chuàng)建的文件放在dir目錄中,其目錄項問dentry,關聯的設備為rdev,初始權限由mode指定*/int(*rename)(structinode*,structdentry*structinode*,structdentry*);/*VFS調用該函數來移動文件。文件源路徑在old_dir目錄中,源文件由old_dentry目錄項所指定,目標路徑在new_dir目錄中,目標文件由new_dentry指定*/int(*readlink)(structdentry*,char*,int);/*該函數被系統(tǒng)調用readlink()調用,拷貝數據到特定的緩沖buffer中。拷貝的數據來自dentry指定的符號鏈接,最大拷貝大小可達到buflen字節(jié)*/int(*follow_link)(structdentry*,structnameidata*);/*該函數由VFS調用,從一個符號連接查找他指向的索引節(jié)點,由dentry指向的連接被解析*/int(*put_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論