Linux 中全部內容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,目錄(Windows 下稱爲文件夾)是文件,硬件設備(鍵盤、監視器、硬盤、打印機)是文件,就連套接字(socket)、網絡通訊等資源也都是文件。
Linux系統中,文件具體可分爲如下幾種類型:html
相似 mp四、pdf、html 這樣,可直接拿來使用的文件都屬於普通文件,Linux 用戶根據訪問權限的不一樣能夠對這些文件進行查看、刪除以及更改操做。mysql
對於用慣 Windows 系統的用戶來講,目錄是文件可能不太好理解。
Linux 系統中,目錄文件包含了此目錄中各個文件的文件名以及指向這些文件的指針,打開目錄等同於打開目錄文件,只要你有權限,能夠隨意訪問目錄中的任何文件。linux
注意,目錄文件的訪問權限,同普通文件的執行權限,是一個意思。sql
這些文件一般隱藏在 /dev/ 目錄下,當進行設備讀取或外設交互時纔會被使用。
例如,磁盤光驅屬於塊設備文件,串口設備則屬於字符設備文件。數據庫
Linux 系統中的全部設備,要麼是塊設備文件,要麼是字符設備文件。編程
套接字文件通常隱藏在 /var/run/ 目錄下,用於進程間的網絡通訊。緩存
相似與 Windows 中的快捷方式,是指向另外一文件的簡介指針(也就是軟連接)。網絡
主要用於進程間通訊。例如,使用 mkfifo 命令建立一個 FIFO 文件,與此同時,啓用進程 A 從 FIFO文件讀數據,啓用進程 B 從 FIFO文件中寫數據,隨寫隨讀。socket
和 Windows 系統不一樣,Linux 系統沒有 C 盤、D 盤、E 盤那麼多的盤符,只有一個根目錄(/),全部的文件(資源)都存儲在以根目錄(/)爲樹根的樹形目錄結構中。
這樣作最明顯的好處是,開發者僅須要使用一套 API 和開發工具便可調取 Linux 系統中絕大部分的資源。舉個簡單的例子,Linux 中幾乎全部讀(讀文件,讀系統狀態,讀 socket,讀 PIPE)的操做均可以用 read 函數來進行;幾乎全部更改(更改文件,更改系統參數,寫 socket,寫 PIPE)的操做均可以用 write 函數來進行。
不利之處在於,使用任何硬件設備都必須與根目錄下某一目錄執行掛載操做,不然沒法使用。咱們知道,自己 Linux 具備一個以根目錄爲樹根的文件目錄結構,每一個設備也一樣如此,它們是相互獨立的。若是咱們想經過 Linux 上的根目錄找到設備文件的目錄結構,就必須將這兩個文件系統目錄合二爲一,這就是掛載的真正含義。編程語言
在 Linux 操做系統中,全部的文件和目錄都被組織成以一個根節點「/」開始的倒置的樹狀結構,如圖 1 所示。
圖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)的用途。發佈此標準的主要目的就是爲了讓用戶清楚地瞭解每一個目錄應該存放什麼類型的文件。
FHS 認爲,Linux 系統的根目錄(/)最爲重要(沒有之一),其緣由有如下 2 點:
全部目錄都是由根目錄衍生出來的;
根目錄與系統的開機、修復、還原密切相關;
所以,根目錄必須包含開機軟件、核心文件、開機所需程序、函數庫、修復系統程序等文件,如表 1 所示。
一級目錄 | 功能(做用) |
---|---|
/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 中的幾個一級目錄。
一級目錄 | 功能(做用) |
---|---|
/lost+found/ | 當系統意外崩潰或意外關機時,產生的一些文件碎片會存放在這裏。在系統啓動的過程當中,fsck 工具會檢查這裏,並修復已經損壞的文件系統。這個目錄只在每一個分區中出現,例如,/lost+found 就是根分區的備份恢復目錄,/boot/lost+found 就是 /boot 分區的備份恢復目錄 |
/proc/ | 虛擬文件系統。該目錄中的數據並不保存在硬盤上,而是保存到內存中。主要保存系統的內核、進程、外部設備狀態和網絡狀態等。如 /proc/cpuinfo 是保存 CPU 信息的,/proc/devices 是保存設備驅動的列表的,/proc/filesystems 是保存文件系統列表的,/proc/net 是保存網絡協議信息的...... |
/sys/ | 虛擬文件系統。和 /proc/ 目錄類似,該目錄中的數據都保存在內存中,主要保存與內核相關的信息 |
usr(注意不是 user),全稱爲 Unix Software Resource,此目錄用於存儲系統軟件資源。FHS 建議全部開發者,應把軟件產品的數據合理的放置在 /usr 目錄下的各子目錄中,而不是爲他們的產品建立單獨的目錄。
Linux 系統中,全部系統默認的軟件都存儲在 /usr 目錄下,/usr 目錄相似 Windows 系統中 C:\Windows\ + C:\Program files\ 兩個目錄的綜合體。
FHS 建議,/usr 目錄應具有表 3 所示的子目錄。
子目錄 | 功能(做用) |
---|---|
/usr/bin/ | 存放系統命令,普通用戶和超級用戶均可以執行。這些命令和系統啓動無關,在單用戶模式下不能執行 |
/usr/sbin/ | 存放根文件系統沒必要要的系統管理命令,如多數服務程序,只有 root 可使用。 |
/usr/lib/ | 應用程序調用的函數庫保存位置 |
/usr/XllR6/ | 圖形界面系統保存位置 |
/usr/local/ | 手工安裝的軟件保存位置。咱們通常建議源碼包軟件安裝在這個位置 |
/usr/share/ | 應用程序的資源文件保存位置,如幫助文檔、說明文檔和字體目錄 |
/usr/src/ | 源碼包保存位置。咱們手工下載的源碼包和內核源碼包均可以保存到這裏。不過筆者更習慣把手工下載的源碼包保存到 /usr/local/src/ 目錄中,把內核源碼保存到 /usr/src/linux/ 目錄中 |
/usr/include | C/C++ 等編程語言頭文件的放置目錄 |
/var 目錄用於存儲動態數據,例如緩存、日誌文件、軟件運行過程當中產生的文件等。一般,此目錄下建議包含如表 4 所示的這些子目錄。
/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/yp | NIS 服務機制所使用的目錄,nis 主要記錄全部網絡中每個 client 的鏈接信息;yp 是 linux 的 nis 服務的日誌文件存放的目錄 |
/var/tmp | 一些應用程序在安裝或執行時,須要在重啓後使用的某些文件,此目錄能將該類文件暫時存放起來,完成後再行刪除 |
根據以上各表列舉的各目錄及做用,若是咱們要作一些實驗和練習,須要建立一些臨時文件,應該保存在哪裏呢?
答案是用戶的主目錄或 /tmp/ 臨時目錄。可是要當心有些目錄中不能直接修改和保存數據,好比 /proc/fn/sys/ 目錄,由於它們是保存在內存中的,若是在這裏寫入數據,那麼你的內存會愈來愈小,直至死機;/boot/ 目錄也不能保存額外數據,由於 /boot/ 目錄會單獨分區做爲啓動分區,若是沒有空閒空間,則會致使系統不能正常啓動。
總之,Linux 要在合理的目錄下進行操做和修改。