日期:2014-05-16  浏览次数:20742 次

解析Linux特殊文件

如果您有Dos和Windows經驗,就大概知道系統存在若幹類型的文件,如系統文件、只讀文件、隱含文件等。在Linux/Unix下,文件類型遠比Dos/Windows系統多樣和複雜。本文以RedHat Linux為例,旨在使讀者對Linux下的文件類型有更多的了解。文中的多數內容,對其他發行版的Linux以及Aix、Solaris、Freebsd等操作系統也同樣正確。 Linux下可以用ls Cl 命令來判斷文件類型,如上 圖所示。可以依據第一列中的10個字符來判斷。?

•?
-rw-r―r―指明了1.txt文件是一個普通文件,1.txt和myprog04文件都是普通文件。以”-“開頭的都是普通文件,而以”d”開頭的是目錄文件。?

•?
brw-rw---- 指明了/dev/sda1是一個塊設備(Block Device)文件。以”b”開頭的文件都是塊設備文件。•?


•?
crw-rw----指明了/dev/lp0是一個字符設備(Chartacter Device)文件,以”c”開頭的文件都是字符設備文件。?

•?
srwxrwxrwx 指明了/var/lib/mysql/mysql.sock是一個socket文件。以””開頭的文件都是socket文件。?

•?
prwxr―r--指明了了mypipe 是一個管道文件。管道文件的一個屬性是”p”。?

•?
lrwxrwxrwx 指明了softlinKOF1.txt 是一個軟鏈接文件(或稱符號鏈接文件),該文件指向了1.txt。以”l”開頭的文件是軟鏈接文件。?

•?
-rw-r―r―開頭的hard_link_of_1.txt看上去是個普通文件,但它實際上是一個硬鏈接文件。?

•?
-rwsr-xr-x指明了myprog01是一個setUid的可執行文件,這是根據第四個字符”s”判斷的。?

•?
-rwxr-sr-x指明了myprog03是一個setGid的可執行文件,這是根據第七個字符中的”s”判斷的。?

•?
-rwsr-sr-x指明了myprog02是一個setUid加setGid的可執行文件,這是根據第四個和第七個字符中的”s”判斷的。?

•?
drwxrwxrwt 中的第一個”d”字指明了tmp文件是一個目錄,最後一個字符”t”指明了該目錄被設置了粘著位。 一、設備文件?

Linux下的/dev 目錄中有大量的設備文件。主要是塊設備文件和字符設備文件。?

塊設備文件?

在過去,在添加新磁盤後,往往需要手動增加塊設備文件。現在通常我們不需要手動增加塊設備文件,運行一下service kudzu start ,系統就會自動為您配置相應的設備。塊設備的主要特點是可以隨機讀寫,而最常見的塊設備就是磁盤,如/dev/hda1 、/dev/sda2、/dev/fd0等。?

字符設備文件?

同塊設備一樣,我們一般都可以用service kudzu start命令來自動增加、刪除或修改字符設備。最常見的字符設備是打印機和終端,他們可以接受字符流。?

/dev/null是一個非常有用的字符設備文件,送入這個設備的所有東西都被忽略。如果將任何程序的輸出結果重定向到/dev/null,則看不到任何輸出信息。甚至於,您可以將某一用戶的shell指向/dev/null 以禁止其登陸。?

管道設備文件?

管道設備文件有時候也被叫做FIFO文件(FIFO是先進先出的意思),從字面上理解,管道設備文件就是從一頭流入,從另一頭流出。通常我們會在其中做一些工作,以達到我們“吃的是草,擠出來的是奶”的目的,管道文件也有其妙用。?

以前,Unix系統對文件的最大用量用2GB的限制,雖然現在新版本的Linux、Solaris、FreeBSD等不再有此限制,但處理大文件的需求仍然存在,假設您想用鏡像(dd命令)的方式來備份一個容量為20GB分區的分區,就會產生一個20GB的文件,根據您磁盤實際的使用狀況,這個文件在壓縮後可能只有數MB到數GB,我們可以建立一個管道文件來自動實現這個壓縮過程。?

[root@linux236 root]# mknod mypipe p?

[root@linux236 root]# ls -l mypipe?

prw-r--r-- 1 root root 0 Aug 5 23:27 mypipe?

[root@linux236 root]#?

在這里,我們建立了一個叫mypipe的管道文件,用ls -l 命令可以看到它的屬性是prw-r--r--,用下面的組合命令實現鏡像和壓縮:?

[root@linux236 root]# compress <?
mypipe >?
sda6.img.Z &?


[root@linux236 root]# dd if=/dev/sda6 of=mypipe?

[root@linux236 root]# ls sda6.img.Z?

sda6.img.Z?

第一個命令使得從mypipe管道中流出的文件被壓縮為sda.img.Z文件,注意這個命令的結尾必須使用"&"符號。第二個命令將/dev/sda6分區中的資料道入管道文件mypipe,換句話說,/dev/sda6分區中的數據進入管道,而壓縮文件sda6.img.Z文件從管道中流出。?

在導出Oracle、DB2等大型數據庫時等經常會生成很大的文件,熟練的數據庫管理員往往會選擇通過管道進行壓縮的方式,對於Oracle數據庫,我們可以使用下邊的組合命令: 這樣,就會將Oracle導出的內容直接壓縮成為eXPdat.dmp.Z文件。?

compress <?
mypipe >?
expdat.dmp.Z &?


exp userid=system file=mypipe owner=scott?

第二章 鏈接文件?

鏈接文件有點類似於Windows 的所謂快捷方式,但並不完全一樣。鏈接有兩種方式,軟鏈接和硬鏈接。?

軟鏈接文件?

軟鏈接又叫符號鏈接,這個文件包含了另一個文件的路徑名。可以是任意文件或目錄,可以鏈接不同文件系統的文件。鏈接文件甚至可以鏈接不存在的文件,這就產生一般稱之為"斷鏈"的問題(或曰“現象"),鏈接文件甚至可以循環鏈接自己。類似於編程語言中的遞歸。?

[yaoyao@linux236 yaoyao]$ ls -l?

total 0?

lrwxrwxrwx 1 yaoyao yaoyao

5 Aug 6 17:39 1.txt ->?
3.txt?

lrwxrwxrwx 1 yaoyao yaoyao

5 Aug 6 17:38 2.txt ->?
1.txt?

lrwxrwxrwx 1 yaoyao yaoyao

5 Aug 6 17:39 3.txt ->?
2.txt?

上面的三個文件形成了一個遞歸,實質上沒有任何作用。系統管理員應該避免系統出現斷鏈或循環鏈接。?

用ln -s 命令可以生成一個軟連接,如下:?

[root@linux236 test]# ln -s source_file softlink_file?

在對符號文件進行讀或寫操作的時候,系統會自動把該操作轉換為對源文件的操作,但刪除鏈接文件時,系統僅僅刪除鏈接文件,而不刪除源文件本身。?

硬鏈接文件?

info ln 命令告訴您,硬鏈接是已存在文件的另一個名字(A "hard link" is another name for an existing file),這多少有些令人困惑。硬連接的命令是?

ln -d existfile newfile?

硬鏈接文件有兩個限制?

1、不允許給目錄創建硬鏈接;?

2、只有在同一文件系統中的文件之間才能創建鏈接。?

對硬鏈接文件進行讀寫和刪除操作時候,結果和軟鏈接相同。但如果我們刪除硬鏈接文件的源文件,硬鏈接文件仍然存在,而且保留了願有的內容。這時,系統就“忘記”了它曾經是硬鏈接文件。而把他當成一個普通文件