? ? ? ? ? ? ? ? ? ? ? ? ?>>轉載請注明來源:
飄零的代碼 piao2010 ’s blog
,謝謝!^_^
>>本文鏈接地址:
Linux cp mv rm ln 命令對于 inode 和 dentry 的影響
在看《unix環境高級編程》文件系統一節的時候,發現自己對文件系統相關的概念不是很清晰。
首先介紹兩個基本概念:
第一個重要概念
inode (中文名:索引節點)
,包含文件的大部分信息:
* 文件的字節數
* 文件擁有者的User ID
* 文件的Group ID
* 文件的讀、寫、執行權限
* 文件的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指文件內容上一次變動的時間,atime指文件上一次打開的時間。
* 鏈接數,
即有多少目錄項指向這個inode
* 文件數據block的位置
通過stat命令可以很方便地查看文件inode。
第二個重要概念 dentry (中文名:目錄項) ,它包含文件名和指向inode的指針等信息,也就是說 通過dentry可以找到對應的inode,再通過inode找到文件存儲的block位置 。
如果要更加深入學習文件系統,可以參考 這篇文章
接下來步入正題:分析 Linux cp mv rm ln 命令對于 inode 和 dentry 的影響。
實驗方法也很簡單,只要有一臺linux主機就行,分別用cp mv rm ln 命令對文件操作,然后利用 ls -il 查看文件inode號,stat查看inode信息。
我直接給出測試結論:
cp命令:
1)分配一個未使用的inode號,在inode 表中添加一個新項目;(注意:如果是cp到一個
已經存在的文件,則inode號采用被覆蓋之前的目標文件的inode號
,如果你對運行中的apache 共享模塊so文件進行這種操作,就會出現
Segmentation fault
)
2)在目錄中新建一個目錄項,并指向步驟1)中的inode;
3)把數據復制到block中。
mv命令:
a. 如果mv命令的目標和源文件所在的文件系統相同:
1)使用新文件名建立目錄項;
2)刪除帶有原來文件名的目錄項;
備注:該操作對inode表沒有影響(除時間戳),對數據的位置也沒有影響,不移動任何數據。(即使是mv到一個
已經存在的
目標文件,新目錄項指源文件inode,會先刪除目標文件的目錄項,所以如果你對運行中的apache的共享模塊so文件進行這種操作的話不會有問題,新的so文件
inode號變了
)
b. 如果目標和源文件所在文件系統不相同,就是cp和rm;
rm命令:
1)減少鏈接數量,如果鏈接數為0釋放inode(inode號碼可以被重新使用);
2)如果inode被釋放,則數據塊放到可用空間列表中;
3)刪除目錄中的目錄項
ln命令:
a. 硬鏈接 ln 文件名 鏈接名
多個目錄項指向同一個inode號;
用rm來刪除硬鏈接文件:
1)僅僅是減少鏈接數量;
2)只要有一個鏈接存在文件就存在;
3)當鏈接數為零,文件就被刪除了。
b. 軟鏈接(符號鏈接) ln -s 文件名 鏈接名
符號鏈接的內容就是它所指向的文件名;
符號鏈接文件有自己的inode;
rm刪除的話只是刪除這個鏈接文件。
參考資料:
http://blog.csdn.net/rstevens/article/details/1824785
http://iminmin.blog.51cto.com/689308/402660
《unix環境高級編程》
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
