Linux 和 UNIX 中的檔案系統是一個以 / 為根的樹狀式檔案結構,/ 是 Linux 和 UNIX 中的根目錄,同樣它也是檔案系統的起點。所有的檔案和目錄都位於 / 路徑下,包括我們經常聽到的 /usr、/etc、/bin、/home 等。在早期的 UNIX 系統中,各個廠家都定義了自己檔案系統的命名構成,比較混亂,而且難以區分。
為了避免在 Linux 系統上也出現這種命名混亂的問題,在 1994 年推出了 FSSTND(FileSystem Standard) 的 Linux 檔案系統層次結構標準,後來 UNIX 團隊把 FSSTND 發揚光大,成為了後來的 FHS(FileSystem Hierarchy Standard) 。
FHS 標準使得眾多的 Linux distributions(Linux 發行版) 有了統一的檔案系統命名標準,換一種說法:FHS 就是一種檔案系統的命名標準。一般來說,Linux distributions 都需要遵循 FHS 規定的
- 目錄結構和目錄內容
- 檔案型別的許可權
但是,FHS 僅僅定義了兩層規範,第一層是 / 下面的各個目錄要放什麼檔案資料,比如 /etc 下面需要放設定檔案,/bin 和 /sbin 下面需要放可執行檔案等;第二層是針對 /usr 和 /var 這兩個目錄來定義的,比如 /usr/share 需要放共享資料,/var/log需要放系統登入檔案等。
下面我就來為你介紹一下 Linux 在 / 下都有哪些定義和規範。
FHS 規範
我下面介紹的這些規範,只是 FHS 文件指定的目錄和檔案的一部分,完整的標準可在 http://www.pathname.com/fhs/ 線上獲得。
首先先來介紹一下根目錄的重要性和意義:
根目錄是整個系統中最重要的一個目錄,後續的目錄都是以根目錄為基礎進行衍生,更重要的一點,根目錄與開機、還原、系統修復有關,由於系統開機需要特定的環境,所以系統出現錯誤時,根目錄也必須要包含有能夠修復檔案系統的程式才行。所以 FHS 規定不要將根目錄的分割槽大小設定的過大,實際上是越小越好,以減少出錯率。
FHS 同樣規定了根目錄下面應該要有這些目錄的存在。
/home 目錄
/home 目錄是系統預設的使用者主資料夾(home directory)。
/boot 目錄
/boot 目錄包含啟動作業系統所需的靜態檔案,比如 Linux 核心,這些檔案對系統的啟動至關重要。Linux Kernel 常用的檔名為 vmlinuz, 但是如果你使用的是 grub2 這個開機程式,還會存在 /boot/grub2 這個目錄。
我剛剛搭建完成的 Linux ,boot 下面是這樣的。
千萬不要刪除 /boot 目錄,這樣做可能會導致系統無法啟動。
/dev 目錄
/dev 目錄都是一些裝置節點,這些裝置節點是 Linux 系統中的裝置或者是核心提供的虛擬裝置。這些裝置節點同樣也對系統正常執行至關重要。/dev 目錄和子目錄下的裝置是字元裝置和塊裝置。字元裝置就是滑鼠、鍵盤、調變解調器,塊裝置就是硬碟、軟盤驅動器。儲存 /dev 目錄下的檔案就相當於是儲存某個裝置。
比較重要的檔案有
/dev/hda:主 IDE 通道上的主裝置,當提到 IDE/ATA 硬碟時,主通道是第一和第二驅動器連線到主機板或介面卡的通道。
/dev/hdb:主 IDE 通道上的從裝置。
/dev/tty0:第一個虛擬控制檯。虛擬控制檯又被稱為 VC,也稱為虛擬終端 VT,是用於計算機使用者介面的鍵盤和顯示器的概念組合。
/dev/tty1:第二個虛擬控制檯。
/dev/sda:主 SCSI 和 SATA 通道上的第一個裝置。
/dev/lp0:第一個並行埠。
下面是我 Linux 下面的目錄。
/etc 目錄
/etc 目錄是為計算機本地的配置檔案保留的,系統主要的配置檔案都放在這個目錄下,比如賬號密碼,服務的啟停,一般來說,這個目錄下面一般使用者只有讀許可權,只有 root 使用者具有修改許可權(關於許可權的問題,可以閱讀筆者的上一篇文章 看完這篇 Linux 許可權,通透了!)
/etc 下比較重要的幾個檔案有
/etc/modprobe.d核心驅動模組
/etc/passwd儲存使用者密碼
/etc/fstab 儲存掛載資訊
/etc/issue儲存系統啟動是顯示的內容
/etc 目錄下不要存放二進位制檔案,二進位制檔案最好放在 /sbin 和 /bin 中。
/etc 目錄下有兩個重要的檔案,/etc/x11 用於存放 X Window 系統配置檔案,例如 xorg.conf,/etc/opt 這個主要存放第三方協力軟體 /opt 的相關配置檔案。
/lib 目錄
系統的函式庫有很多,而 /lib 目錄就像一個倉庫,它用於存放執行 /bin 和 /sbin 中二進位制檔案所需要的庫,這些共享庫映像對於系統 boot 和執行根檔案系統中的命令特別重要。
/media 目錄
media 是媒體的英文,也就是說 /media下可以存放用於可移動媒體(例如 USB、DVD、CD-ROM 和 Zip 磁碟)的安裝點和子目錄。
/mnt 目錄
如果你想要暫時掛載某些額外的裝置,你可以放在 /mnt 這個目錄下,其實最早的時候,/mnt 用途和 /media 一樣,只是後來有了 /media 之後,這個目錄就被用來臨時掛載了。
/opt 目錄
/opt/ 目錄為大多數應用程式軟體包提供儲存空間,將檔案放置在 /opt/ 目錄中的包會建立一個與包同名的目錄。 反過來,該目錄儲存了原本會分散在整個檔案系統中的檔案,從而為系統管理員提供了一種簡單的方法來確定特定包中每個檔案的角色。
例如,如果 sample 是位於 /opt/ 目錄中的特定軟體包的名稱,那麼所有檔案都放置在 /opt/sample/ 目錄中的目錄中,例如 /opt/sample/bin/ 表示二進位制檔案 和 /opt/sample/man/ 用於手冊頁。
/proc 目錄
/proc 目錄本身是一個虛擬檔案系統(virtual filesystem),他放置的資料是在記憶體中,比如系統核心資訊,行程資訊,周邊裝置已經網路狀態等。因為這個目錄下的資料都是在記憶體中的,所以本身不佔用磁碟空間。
這個目錄下比較重要的檔案有 /proc/cpuinfo、/proc/dma、/proc/interrupts、/proc/net/。
/sbin 目錄
/sbin 目錄儲存 root 使用者使用的可執行檔案。/sbin 中的可執行檔案在啟動時使用,用於系統管理和執行系統恢復操作。除了 /bin 中的二進位制之外,/sbin 還包含啟動、恢復和修復系統所需要的二進位制檔案。
/sbin 目錄下包含 arp、clock、halt、init、grub、ifconfig、route、shutdown 等。
/tmp 目錄
這個目錄下面存放的都是一些臨時檔案,這些檔案在系統重新啟動時被清除。
/sys 目錄
這個目錄其實和 /proc 非常類似,也是一個虛擬檔案系統,主要是記錄核心與系統硬體相關資訊。這個目錄同樣也不佔用磁碟空間。
/usr 目錄
/usr 目錄是需要好好聊聊得一個目錄了,很多讀者都誤以為 /usr 是 user 的縮寫,其實 usr 是 Unix Software Resource 的縮寫,FHS 建議軟體開發者應該將資料合理的放置在這個目錄的次目錄下,不要自己建立軟體獨立的目錄。
所有系統預設的軟體都會放在 /usr 下面,因此這個目錄有點類似 Windows 中的 C:\Windows\ + C:\Program files\ 這兩個目錄的綜合,一般來說,系統剛安裝完畢後,這個目錄會佔用較多的磁碟容量,/usr 的次目錄建議有下面這些內容
/usr/bin/一般使用者能夠使用的指令都放在這個目錄下,CentOS 7 開始,/usr/bin 下指令和 /bin 目錄下指令一毛一樣。
/usr/lib/基本上,與 /lib 功能相同,所以 /lib 就是連結到這個目錄中的。
/usr/local 系統管理員在在本機下載的軟體都建議安裝到這個目錄下,便於管理。
/usr/sbin 非系統正常執行所需要的系統指令,最常見的就是某些網路伺服器軟體的服務指令,不過基本功能與 /sbin 差不多,因此目前 /sbin 就是連結到此目錄中的。
/usr/share 共享檔案放置區,這個目錄下還有這些次目錄 /usr/share/man ,/usr/share/doc,/usr/share/zoneinfo
/usr/games 與遊戲相關的資料放置處
/usr/include C/C++ 等程式語言的 header 和 include 放置處,也是直接連結的。
/usr/src 一般原始碼建議放在這,src 是 source 的意思,至於核心原始碼則建議放在 /usr/src/linux 目錄下。
/run 目錄
早期的 FHS 規定系統開機後所產生的各項資訊應該要放置到 /var/run 目錄下,新版的 FHS 則規範到 /run 下面。
/var 目錄
如果說 /usr 是安裝時會佔用較大磁碟容量的目錄,那麼 /var就是在系統執行後才會漸漸佔用磁碟容量的目錄。/var 主要包括快取記憶體、登入檔案以及某些軟體執行所產生的的目錄,包括程式檔案,例如 MySQL 資料庫檔案等,常見的目錄有
/var/cache 應用程式快取目錄
/var/crash 系統錯誤資訊
/var/log 日誌記錄
/var/run 程式的標識資料
/var/tmp 臨時檔案目錄
/var/lock 檔案鎖定記錄
/srv 目錄
srv 可以看做 service 的縮寫,是一些網路服務啟動之後,這些服務所需要取用的資料目錄,常見的服務例如 WWW, FTP 。
CentOS 7 在目錄的編排上與過去的版本不同,上面已經大致描述過了,這裡做個彙總,比較大的差異就是將許多原本應該在根目錄裡面的目錄,將全部資料挪到了 /usr 裡面去,然後進行連結設定,這些內容包括
- /bin -> /usr/bin
- /sbin -> /usr/sbin
- /lib -> /usr/lib
- /lib64 -> /usr/lib64
- /var/lock -> /run/lock
- /var/run -> /run
為了方便大家直觀的看到這些目錄都是做什麼的,我手繪了一個圖,圖中的這些目錄之間的關係很像一棵樹,所以這個目錄又叫做目錄樹。
這個目錄樹已經很清晰了,就沒什麼可說的了。
絕對路徑和相對路徑
和其他系統一樣,Linux 中的路徑也分為絕對路徑(absolute)和相對路徑(relative),這兩種的寫法依據如下:
- 由根目錄開始的路徑都是絕對路徑,比如上圖目錄樹中的 /boot、/usr/local 等
- 相對於當前檔案路徑的寫法是相對路徑,比如 ../var/log 目錄
這裡需要注意一點,相對路徑是以你當前所在路徑的相對位置來移動的,比如你當前在 /boot 這個目錄下,你想要移動到 /usr/src 這個目錄
絕對路徑表示法:/usr/src
相對路徑表示法:../usr/src
這裡還需要注意兩個特殊的目錄:
- . :代表當前目錄,也可以使用 ./ 來表示
- .. :代表上一層目錄,也可以用 ../ 來表示
關於絕對路徑和相對路徑的取捨問題:當檔案路徑很長時,推薦使用相對路徑,因為你不用向絕對路徑一樣,把所有的路徑都寫一遍,而直接使用 ../ 即可;
但是從檔案路徑的正確性來說,絕對路徑要比相對路徑要好。
如果你是在寫程式來管理系統,務必使用絕對路徑,因為絕對路徑不管你的檔案路徑在哪,都會找到指定的檔案;而相對路徑如果檔案移動後,就可能會存在找不到檔案的情況。
與目錄有關的指令
下面我們就來聊一聊和目錄相關的幾條指令
cd
cd 就是 change directory 的縮寫,這條指令能夠切換當前工作目錄,有下面四種切換方式
cd /路徑名 # 表示切換到指定的工作目錄
cd ./ # 表示切換到當前工作目錄(無任何切換)
cd .. # 表示切換到當前工作目錄的上一層目錄
cd ~ # 表示返回到當前使用者目錄
下面我們來演示一下這四個 cd 切換方式的操作
可以看到,我們分別使用 cd /usr/local 切換到了指令目錄下;使用 cd ./ 沒有切換任何目錄(白浪費了兩秒鐘);使用 cd .. 切換到了當前工作目錄的上一級;使用 cd ~ 切換到了當前登入使用者的預設工作目錄。
這裡需要注意的就是 cd ~ ,如果你直接使用 cd ,切換效果和 cd ~ 一樣,也就是說 "cd ~ == cd "。
pwd
上面還有一條指令是 pwd ,這個指令是我們最常用的指令,它的使用頻率幾乎和 cd 一樣,因為一條 cd 指令往往後面跟著一條 pwd 指令,所以你可以看出 pwd 指令有多麼重要了把。
pwd 是 Print Working Directory 的縮寫,它是列印出當前所在目錄的指令。
但是 pwd 不一定只用於顯示當前工作路徑,它還可以用來顯示指定工作目錄下的檔案路徑
不過這個指令好像沒什麼用,因為我們已經知道工作目錄下的路徑了,還列印出來做什麼呢?
mkdir
mkdir 用於建立新目錄,它是 make directory 的縮寫,一般來說,它後面會跟著兩個引數。
- -m :設定檔案的許可權,直接設定,不用考慮預設檔案的建立許可權
- -p :遞迴建立目錄
下面是使用 mkdir 建立檔案目錄的操作
如上圖所示,我們在 /tmp 檔案目錄下建立了一個叫做 test1 的空目錄,並列印出了當前的工作目錄。
如果你想要建立不想讓其他使用者訪問的目錄,你可以使用下面的命令
mkdir -m 711 test2
上圖中的 ls -ld 列出檔案目錄的詳細資訊,可以看到,詳細資訊最前面的是檔案的許可權。
一個一個建立目錄太麻煩了,現在我們想要快速建立這些目錄,比如我們想要建立 /test1/test2/test3/test4 這種目錄格式,我們使用了下面程式碼
Linux 會提出我們不能使用這種建立方式。
此時就需要 -p 這個引數的出現了,這個引數能夠允許我們遞迴建立目錄,如下所示
只不過使用 -p 這種方式並不推薦使用,因為很容易打錯字。。。
rmdir
rmdir 用於刪除空目錄,它的使用和 mkdir 非常類似,mkdir -p 用於遞迴建立目錄,同樣的,rmdir -p 也能夠遞迴刪除目錄。如下圖所示
這裡需要注意,rmdir 只是刪除空目錄,這也意味著目錄裡面有內容的話是無法刪除的,那該如何刪除呢?可以直接使用 rm -r 來進行刪除。
mv
使用 mv 能夠修改目錄的名稱,比如我們建立了一個叫做 test 的目錄,後來我們覺得這個目錄無法體現出來它的所有者,我們想要改一下它的名字,這時候就可以使用 mv 指令就可以修改。
在瞭解完基本的目錄操作之後,下面來想一個問題,為什麼我們能夠在各種目錄下執行 ls 指令都能夠顯示內容?按理說 ls 不應該只是在其存放路徑下才能夠使用嗎?
首先大家需要先了解一個 PATH 的概念,PATH 是環境變數,當我們在執行一條指令的時候,首先系統會按照 PATH 的設定去每個 PATH 下搜尋檔名為 ls 的可執行檔案,如果有多個可執行檔案,那麼優先搜尋到的先被執行。