二、linux文件目錄結構

原文:http://c.biancheng.net/view/2833.html

Linux一切皆文件(包含好處和弊端)

Linux 中所有內容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,目錄(Windows 下稱爲文件夾)是文件,硬件設備(鍵盤、監視器、硬盤、打印機)是文件,就連套接字(socket)、網絡通信等資源也都是文件。

Linux系統中,文件具體可分爲以下幾種類型:

1) 普通文件

類似 mp4、pdf、html 這樣,可直接拿來使用的文件都屬於普通文件,Linux 用戶根據訪問權限的不同可以對這些文件進行查看、刪除以及更改操作。

2) 目錄文件

對於用慣 Windows 系統的用戶來說,目錄是文件可能不太好理解。

Linux 系統中,目錄文件包含了此目錄中各個文件的文件名以及指向這些文件的指針,打開目錄等同於打開目錄文件,只要你有權限,可以隨意訪問目錄中的任何文件。

注意,目錄文件的訪問權限,同普通文件的執行權限,是一個意思。

3) 字符設備文件和塊設備文件

這些文件通常隱藏在 /dev/ 目錄下,當進行設備讀取或外設交互時纔會被使用。

例如,磁盤光驅屬於塊設備文件,串口設備則屬於字符設備文件。

Linux 系統中的所有設備,要麼是塊設備文件,要麼是字符設備文件。

4) 套接字文件(socket)

套接字文件一般隱藏在 /var/run/ 目錄下,用於進程間的網絡通信。

5) 符號鏈接文件(symbolic link)

類似與 Windows 中的快捷方式,是指向另一文件的簡介指針(也就是軟鏈接)。

6) 管道文件(pipe)

主要用於進程間通信。例如,使用 mkfifo 命令創建一個 FIFO 文件,與此同時,啓用進程 A 從 FIFO文件讀數據,啓用進程 B 從 FIFO文件中寫數據,隨寫隨讀。

“一切皆文件”的利弊

和 Windows 系統不同,Linux 系統沒有 C 盤、D 盤、E 盤那麼多的盤符,只有一個根目錄(/),所有的文件(資源)都存儲在以根目錄(/)爲樹根的樹形目錄結構中。

這樣做最明顯的好處是,開發者僅需要使用一套 API 和開發工具即可調取 Linux 系統中絕大部分的資源。舉個簡單的例子,Linux 中幾乎所有讀(讀文件,讀系統狀態,讀 socket,讀 PIPE)的操作都可以用 read 函數來進行;幾乎所有更改(更改文件,更改系統參數,寫 socket,寫 PIPE)的操作都可以用 write 函數來進行。

不利之處在於,使用任何硬件設備都必須與根目錄下某一目錄執行掛載操作,否則無法使用。我們知道,本身 Linux 具有一個以根目錄爲樹根的文件目錄結構,每個設備也同樣如此,它們是相互獨立的。如果我們想通過 Linux 上的根目錄找到設備文件的目錄結構,就必須將這兩個文件系統目錄合二爲一,這就是掛載的真正含義。


Linux文件系統的層次結構

在 Linux 操作系統中,所有的文件和目錄都被組織成以一個根節點“/”開始的倒置的樹狀結構,如圖 1 所示。

                    Linux系統文件和目錄組織示意圖

                                              圖1 Linux系統文件和目錄組織示意圖


其中,目錄就相當於 Windows 中的文件夾,目錄中存放的既可以是文件,也可以是其他的子目錄,而文件中存儲的是真正的信息。

文件系統的最頂層是由根目錄開始的,系統使用“/”來表示根目錄,在根目錄之下的既可以是目錄,也可以是文件,而每一個目錄中又可以包含(子)目錄或文件。如此反覆就可以構成一個龐大的文件系統。

其實,使用這種樹狀、具有層次的文件結構主要目的是方便文件系統的管理和維護,想象一下,如果所有的文件都放在一個目錄下,其文件系統的管理和維護將變成一場噩夢。

現實中也有許多類似的例子,例如在整個行政管理體制中,村民就相當於文件,他們住在一個村莊中,村莊就是存儲村民的目錄。許多村又組成了個鄉,這個鄉就相當於存儲村的目錄,依此類推,最終就構建出了一個龐大的行政區域管理結構圖。

注意,目錄名或文件名都是區分大小寫的,如 dog、DOG 和 Dog 爲 3 個不同的目錄或文件。完整的目錄或文件路徑是由一連串的目錄名所組成的,其中每一個目錄由“/”來分隔。如 cat 的完整路徑是 /home/cat。

在文件系統中,有兩個特殊的目錄,一個是用戶所在的工作目錄,即當前目錄,可用一個點“.”表示;另一個是當前目錄的上一層目錄,也叫父目錄,用兩個點“..”表示。

如果一個目錄或文件名是以一個點開始,就表示這個目錄或文件是一個隱藏目錄或文件。即以默認方式査找(後續會講查找命令)時,不顯示該目錄或文件。

爲了方便管理和維護,Linux 系統採用了文件系統層次標準,也稱爲 FHS 標準,它規定了根目錄下各個目錄應該存在哪些類型的文件(或子目錄),比如說,在 /bin 和 /sbin 目錄中存放的應該是可執行文件。


由於 Linux 系統免費開源,使得 Linux 發行版本有很多,利用 Linux 開發產品的團隊也有很多,如果任由每個人都按照自己的想法來配置 Linux 系統文件目錄,後期可能會產生諸多的管理問題。試想,如果你進入一家公司,所用 Linux 系統的文件目錄結構與所學的完全不同,實在令人頭疼。

爲了避免諸多使用者對 Linux 系統目錄結構天馬行空,Linux 基金會發布了 FHS 標準。多數 Linux 發行版系統都遵循這一標準。

FHS(Filesystem Hierarchy Standard)文件系統層次化標準,該標準規定了 Linux 系統中所有一級目錄以及部分二級目錄(/usr 和 /var)的用途。發佈此標準的主要目的就是爲了讓用戶清楚地瞭解每個目錄應該存放什麼類型的文件。


Linux 根目錄(/)

FHS 認爲,Linux 系統的根目錄(/)最爲重要(沒有之一),其原因有以下 2 點:

  1. 所有目錄都是由根目錄衍生出來的;

  2. 根目錄與系統的開機、修復、還原密切相關;


因此,根目錄必須包含開機軟件、核心文件、開機所需程序、函數庫、修復系統程序等文件,如表 1 所示。

表 1 Linux一級目錄及其作用
一級目錄功能(作用)
/bin/存放系統命令,普通用戶和 root 都可以執行。放在 /bin 下的命令在單用戶模式下也可以執行
/boot/系統啓動目錄,保存與系統啓動相關的文件,如內核文件和啓動引導程序(grub)文件等
/dev/設備文件保存位置
/etc/配置文件保存位置。系統內所有采用默認安裝方式(rpm 安裝)的服務配置文件全部保存在此目錄中,如用戶信息、服務的啓動腳本、常用服務的配置文件等
/home/普通用戶的主目錄(也稱爲家目錄)。在創建用戶時,每個用戶要有一個默認登錄和保存自己數據的位置,就是用戶的主目錄,所有普通用戶的主目錄是在 /home/ 下建立一個和用戶名相同的目錄。如用戶 liming 的主目錄就是 /home/liming
/lib/系統調用的函數庫保存位置
/media/掛載目錄。系統建議用來掛載媒體設備,如軟盤和光盤
/mnt/掛載目錄。早期 Linux 中只有這一個掛載目錄,並沒有細分。系統建議這個目錄用來掛載額外的設備,如 U 盤、移動硬盤和其他操作系統的分區
/misc/掛載目錄。系統建議用來掛載 NFS 服務的共享目錄。雖然系統準備了三個默認掛載目錄 /media/、/mnt/、/misc/,但是到底在哪個目錄中掛載什麼設備可以由管理員自己決定。例如,筆者在接觸 Linux 的時候,默認掛載目錄只有 /mnt/,所以養成了在 /mnt/ 下建立不同目錄掛載不同設備的習慣,如 /mnt/cdrom/ 掛載光盤、/mnt/usb/ 掛載 U 盤,都是可以的
/opt/第三方安裝的軟件保存位置。這個目錄是放置和安裝其他軟件的位置,手工安裝的源碼包軟件都可以安裝到這個目錄中。不過筆者還是習慣把軟件放到 /usr/local/ 目錄中,也就是說,/usr/local/ 目錄也可以用來安裝軟件
/root/root 的主目錄。普通用戶主目錄在 /home/ 下,root 主目錄直接在“/”下
/sbin/保存與系統環境設置相關的命令,只有 root 可以使用這些命令進行系統環境設置,但也有些命令可以允許普通用戶查看
/srv/服務數據目錄。一些系統服務啓動之後,可以在這個目錄中保存所需要的數據
/tmp/臨時目錄。系統存放臨時文件的目錄,在該目錄下,所有用戶都可以訪問和寫入。建議此目錄中不能保存重要數據,最好每次開機都把該目錄清空

FHS 針對根目錄中包含的子目錄僅限於表 1,但除此之外,Linux 系統根目錄下通常還包含表 2 中的幾個一級目錄。


表 2 其他一級目錄及功能
一級目錄功能(作用)
/lost+found/當系統意外崩潰或意外關機時,產生的一些文件碎片會存放在這裏。在系統啓動的過程中,fsck 工具會檢查這裏,並修復已經損壞的文件系統。這個目錄只在每個分區中出現,例如,/lost+found 就是根分區的備份恢復目錄,/boot/lost+found 就是 /boot 分區的備份恢復目錄
/proc/虛擬文件系統。該目錄中的數據並不保存在硬盤上,而是保存到內存中。主要保存系統的內核、進程、外部設備狀態和網絡狀態等。如 /proc/cpuinfo 是保存 CPU 信息的,/proc/devices 是保存設備驅動的列表的,/proc/filesystems 是保存文件系統列表的,/proc/net 是保存網絡協議信息的......
/sys/虛擬文件系統。和 /proc/ 目錄相似,該目錄中的數據都保存在內存中,主要保存與內核相關的信息

Linux /usr目錄

usr(注意不是 user),全稱爲 Unix Software Resource,此目錄用於存儲系統軟件資源。FHS 建議所有開發者,應把軟件產品的數據合理的放置在 /usr 目錄下的各子目錄中,而不是爲他們的產品創建單獨的目錄。

Linux 系統中,所有系統默認的軟件都存儲在 /usr 目錄下,/usr 目錄類似 Windows 系統中 C:\Windows\ + C:\Program files\ 兩個目錄的綜合體。

FHS 建議,/usr 目錄應具備表 3 所示的子目錄。

表 3 /usr 子目錄及其功能
子目錄功能(作用)
/usr/bin/存放系統命令,普通用戶和超級用戶都可以執行。這些命令和系統啓動無關,在單用戶模式下不能執行
/usr/sbin/ 存放根文件系統不必要的系統管理命令,如多數服務程序,只有 root 可以使用。
/usr/lib/應用程序調用的函數庫保存位置
/usr/XllR6/圖形界面系統保存位置
/usr/local/手工安裝的軟件保存位置。我們一般建議源碼包軟件安裝在這個位置
/usr/share/應用程序的資源文件保存位置,如幫助文檔、說明文檔和字體目錄
/usr/src/源碼包保存位置。我們手工下載的源碼包和內核源碼包都可以保存到這裏。不過筆者更習慣把手工下載的源碼包保存到 /usr/local/src/ 目錄中,把內核源碼保存到 /usr/src/linux/ 目錄中
/usr/includeC/C++ 等編程語言頭文件的放置目錄

Linux /var 目錄

/var 目錄用於存儲動態數據,例如緩存、日誌文件、軟件運行過程中產生的文件等。通常,此目錄下建議包含如表 4 所示的這些子目錄。

表 4 /var子目錄及其功能
/var子目錄功能(作用)
/var/lib/程序運行中需要調用或改變的數據保存位置。如 MySQL 的數據庫保存在 /var/lib/mysql/ 目錄中
/var/log/登陸文件放置的目錄,其中所包含比較重要的文件如 /var/log/messages, /var/log/wtmp 等。
/var/run/一些服務和程序運行後,它們的 PID(進程 ID)保存位置
/var/spool/裏面主要都是一些臨時存放,隨時會被用戶所調用的數據,例如 /var/spool/mail/ 存放新收到的郵件,/var/spool/cron/ 存放系統定時任務。
/var/www/RPM 包安裝的 Apache 的網頁主目錄
/var/nis和/var/ypNIS 服務機制所使用的目錄,nis 主要記錄所有網絡中每一個 client 的連接信息;yp 是 linux 的 nis 服務的日誌文件存放的目錄
/var/tmp一些應用程序在安裝或執行時,需要在重啓後使用的某些文件,此目錄能將該類文件暫時存放起來,完成後再行刪除


根據以上各表列舉的各目錄及作用,如果我們要做一些實驗和練習,需要創建一些臨時文件,應該保存在哪裏呢?

答案是用戶的主目錄或 /tmp/ 臨時目錄。但是要小心有些目錄中不能直接修改和保存數據,比如 /proc/fn/sys/ 目錄,因爲它們是保存在內存中的,如果在這裏寫入數據,那麼你的內存會越來越小,直至死機;/boot/ 目錄也不能保存額外數據,因爲 /boot/ 目錄會單獨分區作爲啓動分區,如果沒有空閒空間,則會導致系統不能正常啓動。

總之,Linux 要在合理的目錄下進行操作和修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章