一侠驯、文件和目錄的基本存儲說明
之前說過分區(qū),每個分區(qū)都可以理解為分成兩部分,一小部分里邊是存放文件的i節(jié)點咖刃,大部分放的是Block文件塊。
在文件的i節(jié)點當(dāng)中保存的信息有:i節(jié)點號私蕾,時間僵缺,權(quán)限,保存位置踩叭。而Block塊中保存的是文件中的數(shù)據(jù)磕潮。
每個文件夾中都會有i節(jié)點和對應(yīng)的Block文件。
- 但是有一個問題容贝,一個文件的文件名是存放哪里自脯?
我們就以在文件夾root中有一個文件abc為例。/root/abc斤富。
在root目錄中膏潮,所有的文件都有i節(jié)點名和對應(yīng)的Block塊,而root目錄也有自己的i節(jié)點信息的满力。有i節(jié)點信息焕参,就有與之對應(yīng)的Block塊,root目錄的Block塊中存放的數(shù)據(jù)是root目錄下所有的子文件和子目錄的文件名油额,和它對應(yīng)的i節(jié)點號叠纷。
也就是說,root目錄下文件的文件名潦嘶,沒有寫在該文件的i節(jié)點里涩嚣。而是寫在上級目錄的Block塊中。
如果我要查找abc文件的文件名掂僵,要先找到root文件夾的i節(jié)點航厚,然后在root目錄的Block塊中找到abc的文件名和對應(yīng)的i節(jié)點號才能找到。通過abc文件的i節(jié)點號最終讀取到abc文件中的數(shù)據(jù)锰蓬。
- 那root目錄的文件名或者說是i節(jié)點存儲在哪里幔睬?
那root目錄是在根目錄下的,根目錄會有自己的i節(jié)點信息芹扭,也會有自己的Block麻顶,綜上所述,那root目錄的文件名和i節(jié)點號的信息是放在根目錄的Block塊中的冯勉。
那根的i節(jié)點號怎么獲瘸喊觥摹芙?根的i節(jié)點號是固定的灼狰,根的i節(jié)點號為2。(因為編號1在系統(tǒng)內(nèi)核加載的時候被占用了)[root@192 ~]# ls -ild / 2 dr-xr-xr-x. 25 root root 4096 12月 27 22:27 / 第一位顯示的就是i節(jié)點號浮禾。
- 總結(jié)
綜上所訴交胚,要查看abc文件的內(nèi)容份汗,就先用通過根的i節(jié)點號,讀取根的Block塊中數(shù)據(jù)蝴簇,找到root目錄的i節(jié)點信息杯活,讀取root目錄的Block塊中數(shù)據(jù),找到abc文件的i節(jié)點信息熬词,讀取abc文件的Block塊中數(shù)據(jù)旁钧。
以上就是文件和目錄的基本存儲。
二互拾、In命令
1歪今、我們來看看ln命令的基本信息。
- 命令名稱:ln颜矿。
- 英文原意:make links between file寄猩。
- 所在路徑:/bin/ln。
- 執(zhí)行權(quán)限:所有用戶骑疆。
- 功能描述:在文件之間建立鏈接田篇。
2、ln命令的基本格式如下:
[root@localhost ~ ] # ln [選項] 源文件 目標(biāo)文件
選項:
-s:建立軟鏈接文件箍铭。如果不加“-s”選項泊柬,則建立硬鏈接文件
-f:強制。如果目標(biāo)文件已經(jīng)存在坡疼,則刪除目標(biāo)文件后再建立鏈接文件
3彬呻、如何創(chuàng)建硬鏈接:
[root@localhost ~] # touch cangls
[root@localhost ~ ]# ln /root/cangls /tmp/
建立硬鏈接文件,目標(biāo)文件沒有寫文件名柄瑰,會和原合一致
也就是/root/cangls和/tmp/cangls 是硬鏈接文件
說明ln命令應(yīng)用
新創(chuàng)建一個文件abc闸氮,查看abc文件的硬連接數(shù) [root@192 ~]# touch abc [root@192 ~]# ls -il abc 1043285 -rw-r--r--. 1 root root 0 12月 29 18:18 abc 可以看到abc文件的硬連接數(shù)為1。 在tmp目錄中給abc文件創(chuàng)建一個硬連接文件教沾,然后查看這兩個文件硬連接數(shù)蒲跨。 [root@192 ~]# ln abc /tmp/abc_h [root@192 ~]# ls -il abc /tmp/abc_h 1043285 -rw-r--r--. 2 root root 0 12月 29 18:18 abc 1043285 -rw-r--r--. 2 root root 0 12月 29 18:18 /tmp/abc_h 可以看到abc文件的引用計數(shù)(硬連接數(shù))增加了1。 同時還可以看到授翻,上邊的兩個文件的i節(jié)點號是一樣的或悲。
硬鏈接特征:
- 源文件和硬鏈接文件擁有相同的Inode和Block。
- 修改任意一個文件堪唐,另一個都改變巡语。
- 刪除任意一個文件,另一個都能使用淮菠。
- 硬鏈接標(biāo)記不清男公,很難確認(rèn)硬鏈接文件位置(很難確定這是一個硬連接文件,自己創(chuàng)建的還可能記住合陵,要是別人創(chuàng)建的枢赔,我根本無法判定一個文件是硬連接文件)澄阳,不建議使用。
- 硬鏈接不能鏈接目錄踏拜。
- 硬鏈接不能跨分區(qū)(因為兩個文件需要同一個分區(qū)的同一個i節(jié)點號碎赢。所以跨分區(qū)找不到)。
硬連接原理
我上邊在root目錄下創(chuàng)建了一個abc文件速梗,然后在/tmp/目錄下創(chuàng)建一個abc文件硬連接文件abc_h肮塞。
root目錄、abc文件姻锁、tmp目錄峦嗤,每個都有自己的i節(jié)點號和對應(yīng)的Block塊。通過root目錄的i節(jié)點號屋摔,找到對應(yīng)的Block塊烁设。Block塊中記錄著abc文件的名稱和i節(jié)點號,就可以找到abc文件钓试。而硬連接文件abc_h的i節(jié)點號和文件名是記錄在tmp目錄的Block塊中的装黑。并且上邊查詢到abc文件和abc_h硬連接文件的i節(jié)點號是相同的嗦随,所以通過tmp的Block塊中的abc_h信息砂碉,也可以找到abc文件的i節(jié)點號。
所以root目錄中記錄的abc文件信息和tmp目錄記錄的abc_h文件信息漓踢,都指向了root目錄下的abc文件挽鞠【渭眨看下圖。
所以上圖證明了:
修改任意一個文件信认,另一個都改變
刪除任意一個文件材义,另一個都能使用
4、如何創(chuàng)建軟鏈接:
軟連接可以直接看作為windows系統(tǒng)中的快捷方式嫁赏。
[root@localhost ~]# touch abc
[root@localhost ~ ]# ln -s /root/abc /tmp/
建立軟鏈接文件
在root目錄下cde文件其掂,然后創(chuàng)建軟連接/tmp/cde_s文件,查看這兩個文件
[root@localhost ~ ] # touch cde
[root@localhost ~ ] # ln -s /root/cde /tmp/cde_s
[root@localhost ~ ] # ls -il /root/cde /tmp/cde_s
1055972-rw-r--r--1 root root 0 2月1715:30 /root/cde
261634 1rwxrwxrwx 1root root 9 2月1715:30 /tmp/cde_s->/root/cde
第一潦蝇、可以看到創(chuàng)建的軟連接文件有明確的提示這個一個軟鏈接文件款熬,和它的源文件的位置在哪里。 /tmp/cde_s->/root/cde攘乒。這也就是為什么說硬連接標(biāo)記不清的原因贤牛。
第二、文件的引用鏈接數(shù)沒有增加则酝。
第三殉簸、兩個文件的i節(jié)點號完全不同。
第四、源文件abc是0字節(jié)喂链,空的。而軟連接的文件大小為9個字節(jié)妥泉。
軟鏈接特征:
- 軟鏈接和源文件擁有不同的Inode和Block椭微。
- 兩個文件修改任意一個,另一個都改變盲链。
- 刪除軟鏈接蝇率,源文件不受影響;刪除源文件刽沾,軟鏈接不能使用本慕,因為軟鏈接沒有實際數(shù)據(jù),只保存源文件的Inode侧漓,不論源文件多大锅尘,軟鏈接文件大小不變。
- 軟鏈接的權(quán)限是最大權(quán)限lrwxrwxrwx.布蔗,但是由于沒有實際數(shù)據(jù)藤违,最終訪問時需要參考源文件權(quán)限。
- 軟鏈接可以鏈接目錄纵揍,軟鏈接可以跨分區(qū)顿乒。
- 軟鏈接特征明顯,建議使用軟連接泽谨。
軟連接原理
在root目錄下有一個cde文件璧榄,在tmp目錄創(chuàng)建一個cde文件的軟鏈接文件cde_s。通過root目錄的i節(jié)點號吧雹,可以找到root目錄的block塊骨杂,root目錄的block塊中記錄了cde文件的文件名和i節(jié)點號。查到cde文件的i節(jié)點號就找到了cde文件的block塊雄卷,就能讀取里邊的數(shù)據(jù)腊脱。
tmp目錄有自己的i節(jié)點號,與之對應(yīng)的block塊龙亲,tmp目錄的block塊中有cde_s文件的文件名和i節(jié)點號陕凹,(之前說硬連接這兩個i節(jié)點號是相同的,所以指向的同一個文件)鳄炉,而軟連接文件和源文件的i節(jié)點號是不相同的杜耙。說明cde_s文件有自己的i節(jié)點號,并且cde_s文件有自己的block塊拂盯。
現(xiàn)在的關(guān)鍵是佑女,cde_s文件的block塊中存放的是什么?
如果里邊存放的是數(shù)據(jù),那cde文件和cde_s文件就不是鏈接的關(guān)系了团驱,就完全是復(fù)制關(guān)系了摸吠,這樣就不會出現(xiàn)修改源文件時軟鏈接文件也變,修改軟鏈接文件后源文件也改變的情況嚎花。其實在cde_s文件的block塊中存放的是源文件的i節(jié)點號寸痢。如下圖
這也就說明了為什么新創(chuàng)建的軟連接文件創(chuàng)建完成后就有數(shù)據(jù),并且數(shù)據(jù)大小不隨源文件的改變而改變紊选。
還有一點要注意啼止,軟鏈接文件的權(quán)限是最大的,但這個權(quán)限是針對軟鏈接文件的兵罢,軟鏈接文件的block塊中并不存放數(shù)據(jù)献烦,如果要操作源文件,還是要看源文件權(quán)限卖词,這里需要注意巩那。
windows系統(tǒng)中創(chuàng)建快捷方式是為了軟件安裝位置太深,不好找此蜈,所以在桌面創(chuàng)建一個快捷方式拢操,那Linux系統(tǒng)創(chuàng)建軟鏈接的作用是什么,反正都是通過目錄訪問?
在Linux系統(tǒng)中舶替,軟鏈接最主要的作用是照顧管理員的使用習(xí)慣令境。如下圖:
在老式的Linux系統(tǒng)中,/etc/rc.local文件的位置我們用著已經(jīng)習(xí)慣了顾瞪,系統(tǒng)更新之后舔庶,為了升級的需要,/etc/rc.local文件的位置改變了陈醒。我們在找這個文件就很麻煩了惕橙。解決這個問題的方法就是給這兩個文件創(chuàng)建一個軟鏈接來解決上邊問題,既照顧了升級需要钉跷,也照顧了使用習(xí)慣弥鹦。
還要注意一個情況,用相對路徑創(chuàng)建def文件的軟鏈接爷辙,用絕對路徑創(chuàng)建anaconda-ks.cfg文件的軟鏈接彬坏。
從上圖中可以看到用相對路徑創(chuàng)建的軟鏈接出現(xiàn)了報錯。
提示:創(chuàng)建軟鏈接時一定要使用絕對路徑膝晾,硬連接沒有要求栓始。