用了這么久 Linux ,才知道這些概念
我們大家應(yīng)該知道,Linux 和 UNIX 中的文件系統(tǒng)是一個(gè)以 / 為根的樹狀式文件結(jié)構(gòu),/ 是 Linux 和 UNIX 中的根目錄,同樣它也是文件系統(tǒng)的起點(diǎn)。所有的文件和目錄都位于 / 路徑下,包括我們經(jīng)常聽到的 /usr、/etc、/bin、/home 等。在早期的 UNIX 系統(tǒng)中,各個(gè)廠家都定義了自己文件系統(tǒng)的命名構(gòu)成,比較混亂,而且難以區(qū)分。
為了避免在 Linux 系統(tǒng)上也出現(xiàn)這種命名混亂的問題,在 1994 年推出了 FSSTND(FileSystem Standard) 的 Linux 文件系統(tǒng)層次結(jié)構(gòu)標(biāo)準(zhǔn),后來(lái) UNIX 團(tuán)隊(duì)把 FSSTND 發(fā)揚(yáng)光大,成為了后來(lái)的 FHS(FileSystem Hierarchy Standard) 。
FHS 標(biāo)準(zhǔn)使得眾多的 Linux distributions(Linux 發(fā)行版) 有了統(tǒng)一的文件系統(tǒng)命名標(biāo)準(zhǔn),換一種說法:FHS 就是一種文件系統(tǒng)的命名標(biāo)準(zhǔn)。一般來(lái)說,Linux distributions 都需要遵循 FHS 規(guī)定的
- 目錄結(jié)構(gòu)和目錄內(nèi)容
- 文件類型的權(quán)限
但是,F(xiàn)HS 僅僅定義了兩層規(guī)范,第一層是 / 下面的各個(gè)目錄要放什么文件數(shù)據(jù),比如 /etc 下面需要放設(shè)置文件,/bin 和 /sbin 下面需要放可執(zhí)行文件等;第二層是針對(duì) /usr 和 /var 這兩個(gè)目錄來(lái)定義的,比如 /usr/share 需要放共享數(shù)據(jù),/var/log需要放系統(tǒng)登錄文件等。
下面我就來(lái)為你介紹一下 Linux 在 / 下都有哪些定義和規(guī)范。
FHS 規(guī)范
我下面介紹的這些規(guī)范,只是 FHS 文檔指定的目錄和文件的一部分,完整的標(biāo)準(zhǔn)可在 http://www.pathname.com/fhs/ 在線獲得。
首先先來(lái)介紹一下根目錄的重要性和意義:
根目錄是整個(gè)系統(tǒng)中最重要的一個(gè)目錄,后續(xù)的目錄都是以根目錄為基礎(chǔ)進(jìn)行衍生,更重要的一點(diǎn),根目錄與開機(jī)、還原、系統(tǒng)修復(fù)有關(guān),由于系統(tǒng)開機(jī)需要特定的環(huán)境,所以系統(tǒng)出現(xiàn)錯(cuò)誤時(shí),根目錄也必須要包含有能夠修復(fù)文件系統(tǒng)的程序才行。所以 FHS 規(guī)定不要將根目錄的分區(qū)大小設(shè)置的過大,實(shí)際上是越小越好,以減少出錯(cuò)率。
FHS 同樣規(guī)定了根目錄下面應(yīng)該要有這些目錄的存在。
/home 目錄
/home 目錄是系統(tǒng)默認(rèn)的使用者主文件夾(home directory)。
/boot 目錄
/boot 目錄包含啟動(dòng)操作系統(tǒng)所需的靜態(tài)文件,比如 Linux 內(nèi)核,這些文件對(duì)系統(tǒng)的啟動(dòng)至關(guān)重要。Linux Kernel 常用的文件名為 vmlinuz, 但是如果你使用的是 grub2 這個(gè)開機(jī)程序,還會(huì)存在 /boot/grub2 這個(gè)目錄。
我剛剛搭建完成的 Linux ,boot 下面是這樣的。
千萬(wàn)不要?jiǎng)h除 /boot 目錄,這樣做可能會(huì)導(dǎo)致系統(tǒng)無(wú)法啟動(dòng)。
/dev 目錄
/dev 目錄都是一些設(shè)備節(jié)點(diǎn),這些設(shè)備節(jié)點(diǎn)是 Linux 系統(tǒng)中的設(shè)備或者是內(nèi)核提供的虛擬設(shè)備。這些設(shè)備節(jié)點(diǎn)同樣也對(duì)系統(tǒng)正常運(yùn)行至關(guān)重要。/dev 目錄和子目錄下的設(shè)備是字符設(shè)備和塊設(shè)備。字符設(shè)備就是鼠標(biāo)、鍵盤、調(diào)制解調(diào)器,塊設(shè)備就是硬盤、軟盤驅(qū)動(dòng)器。存儲(chǔ) /dev 目錄下的文件就相當(dāng)于是存儲(chǔ)某個(gè)設(shè)備。
比較重要的文件有
/dev/hda:主 IDE 通道上的主設(shè)備,當(dāng)提到 IDE/ATA 硬盤時(shí),主通道是第一和第二驅(qū)動(dòng)器連接到主板或接口卡的通道。
/dev/hdb:主 IDE 通道上的從設(shè)備。
/dev/tty0:第一個(gè)虛擬控制臺(tái)。虛擬控制臺(tái)又被稱為 VC,也稱為虛擬終端 VT,是用于計(jì)算機(jī)用戶界面的鍵盤和顯示器的概念組合。
/dev/tty1:第二個(gè)虛擬控制臺(tái)。
/dev/sda:主 SCSI 和 SATA 通道上的第一個(gè)設(shè)備。
/dev/lp0:第一個(gè)并行端口。
下面是我 Linux 下面的目錄。
/etc 目錄
/etc 目錄是為計(jì)算機(jī)本地的配置文件保留的,系統(tǒng)主要的配置文件都放在這個(gè)目錄下,比如賬號(hào)密碼,服務(wù)的啟停,一般來(lái)說,這個(gè)目錄下面一般用戶只有讀權(quán)限,只有 root 用戶具有修改權(quán)限(關(guān)于權(quán)限的問題,可以閱讀筆者的上一篇文章 看完這篇 Linux 權(quán)限,通透了!)
/etc 下比較重要的幾個(gè)文件有
/etc/modprobe.d 內(nèi)核驅(qū)動(dòng)模塊
/etc 下比較重要的幾個(gè)文件有
/etc/modprobe.d 內(nèi)核驅(qū)動(dòng)模塊
/etc/passwd 存儲(chǔ)用戶密碼
/etc/fstab 存儲(chǔ)掛載信息
/etc/issue 存儲(chǔ)系統(tǒng)啟動(dòng)顯示的內(nèi)容
/etc 目錄下不要存放二進(jìn)制文件,二進(jìn)制文件最好放在 /sbin 和 /bin 中。
/etc 目錄下有兩個(gè)重要的文件,/etc/x11 用于存放 X Window 系統(tǒng)配置文件,例如 xorg.conf,/etc/opt 這個(gè)主要存放第三方協(xié)力軟件 /opt 的相關(guān)配置文件。
/lib 目錄
系統(tǒng)的函數(shù)庫(kù)有很多,而 /lib 目錄就像一個(gè)倉(cāng)庫(kù),它用于存放執(zhí)行 /bin 和 /sbin 中二進(jìn)制文件所需要的庫(kù),這些共享庫(kù)映像對(duì)于系統(tǒng) boot 和執(zhí)行根文件系統(tǒng)中的命令特別重要。
/media 目錄
media 媒體的英文,也就是說 /media下可以存放用于可移動(dòng)媒體(例如 USB、DVD、CD-ROM 和 Zip 磁盤)的安裝點(diǎn)和子目錄。
/mnt 目錄
如果你想要暫時(shí)掛載某些額外的設(shè)備,你可以放在 /mnt 這個(gè)目錄下,其實(shí)最早的時(shí)候,/mnt 用途和 /media 一樣,只是后來(lái)有了 /media 之后,這個(gè)目錄就被用來(lái)臨時(shí)掛載了。
/opt 目錄
/opt/ 目錄為大多數(shù)應(yīng)用程序軟件包提供存儲(chǔ)空間,將文件放置在 /opt/ 目錄中的包會(huì)創(chuàng)建一個(gè)與包同名的目錄。反過來(lái),該目錄保存了原本會(huì)分散在整個(gè)文件系統(tǒng)中的文件,從而為系統(tǒng)管理員提供了一種簡(jiǎn)單的方法來(lái)確定特定包中每個(gè)文件的角色。
例如,如果 sample 是位于 /opt/ 目錄中的特定軟件包的名稱,那么所有文件都放置在 /opt/sample/ 目錄中的目錄中,例如 /opt/sample/bin/ 表示二進(jìn)制文件 和 /opt/sample/man/ 用于手冊(cè)頁(yè)。
/proc 目錄
/proc 目錄本身是一個(gè)虛擬文件系統(tǒng)(virtual filesystem),他放置的數(shù)據(jù)是在內(nèi)存中,比如系統(tǒng)核心信息,行程信息,周邊設(shè)備網(wǎng)絡(luò)狀態(tài)等。因?yàn)檫@個(gè)目錄下的數(shù)據(jù)都是在內(nèi)存中的,所以本身不占用磁盤空間。
這個(gè)目錄下比較重要的文件有/proc/cpuinfo、/proc/dma、/proc/interrupts、/proc/net/。
/sbin 目錄
/sbin 目錄存儲(chǔ) root 用戶使用的可執(zhí)行文件。/sbin 中的可執(zhí)行文件在啟動(dòng)時(shí)使用,用于系統(tǒng)管理和執(zhí)行系統(tǒng)恢復(fù)操作。除了 /bin 中的二進(jìn)制之外,/sbin 還包含啟動(dòng)、恢復(fù)和修復(fù)系統(tǒng)所需要的二進(jìn)制文件。
/sbin 目錄下包含 arp、clock、halt、init、grub、ifconfig、route、shutdown 等。
/tmp 目錄
這個(gè)目錄下面存放的都是一些臨時(shí)文件,這些文件在系統(tǒng)重新啟動(dòng)時(shí)被清除。
/sys 目錄
這個(gè)目錄其實(shí)和 /proc 非常類似,也是一個(gè)虛擬文件系統(tǒng),主要是記錄核心與系統(tǒng)硬件相關(guān)信息。這個(gè)目錄同樣也不占用磁盤空間。
/usr 目錄
/usr 目錄是需要好好聊聊的一個(gè)目錄了,很多讀者都誤以為 /usr 是 user 的縮寫,其實(shí) usr 是 Unix Software Resource 的縮寫,F(xiàn)HS 建議軟件開發(fā)者應(yīng)該將數(shù)據(jù)合理的放置在這個(gè)目錄的次目錄下,不要自己創(chuàng)建軟件獨(dú)立的目錄。
所有系統(tǒng)默認(rèn)的軟件都會(huì)放在 /usr 下面,因此這個(gè)目錄有點(diǎn)類似 Windows 中的 C:\Windows\ + C:\Program files\ 這兩個(gè)目錄的綜合,一般來(lái)說,系統(tǒng)剛安裝完畢后,這個(gè)目錄會(huì)占用較多的磁盤容量,/usr 的次目錄建議有下面這些內(nèi)容
*/usr/bin/*一般用戶能夠使用的指令都放在這個(gè)目錄下,CentOS 7 開始,/usr/bin 下指令和 /bin 目錄下指令一毛一樣。
*/usr/lib/*基本上,與 /lib 功能相同,所以 /lib 就是鏈接到這個(gè)目錄中的。
/usr/local 系統(tǒng)管理員在在本機(jī)下載的軟件都建議安裝到這個(gè)目錄下,便于管理。
/usr/sbin 非系統(tǒng)正常運(yùn)行所需要的系統(tǒng)指令,最常見的就是某些網(wǎng)絡(luò)服務(wù)器軟件的服務(wù)指令,不過基本功能與 /sbin 差不多,因此目前 /sbin 就是鏈接到此目錄中的。
/usr/share 共享文件放置區(qū),這個(gè)目錄下還有這些次目錄 /usr/share/man ,/usr/share/doc,/usr/share/zoneinfo
/usr/games 與游戲相關(guān)的數(shù)據(jù)放置處
/usr/include C/C++ 等程序語(yǔ)言的 header 和 include 放置處,也是直接鏈接的。
/usr/src 一般源碼建議放在這,src 是 source 的意思,至于核心源碼則建議放在 /usr/src/linux 目錄下。
/run 目錄
早期的 FHS 規(guī)定系統(tǒng)開機(jī)后所產(chǎn)生的各項(xiàng)信息應(yīng)該要放置到 /var/run 目錄下,新版的 FHS 則規(guī)范到 /run 下面。
/var 目錄
如果說 /usr 是安裝時(shí)會(huì)占用較大磁盤容量的目錄,那么 /var就是在系統(tǒng)運(yùn)行后才會(huì)漸漸占用磁盤容量的目錄。/var 主要包括高速緩存、登錄文件以及某些軟件運(yùn)行所產(chǎn)生的的目錄,包括程序文件,例如 MySQL 數(shù)據(jù)庫(kù)文件等,常見的目錄有
/var/cache 應(yīng)用程序緩存目錄
/var/crash 系統(tǒng)錯(cuò)誤信息
/var/log 日志記錄
/var/run 進(jìn)程的標(biāo)識(shí)數(shù)據(jù)
/var/tmp 臨時(shí)文件目錄
/var/lock 文件鎖定記錄
/srv 目錄
srv 可以看做 service 的縮寫,是一些網(wǎng)絡(luò)服務(wù)啟動(dòng)之后,這些服務(wù)所需要取用的數(shù)據(jù)目錄,常見的服務(wù)例如 WWW, FTP 。
CentOS 7 在目錄的編排上與過去的版本不同,上面已經(jīng)大致描述過了,這里做個(gè)匯總,比較大的差異就是將許多原本應(yīng)該在根目錄里面的目錄,將全部數(shù)據(jù)挪到了 /usr 里面去,然后進(jìn)行鏈接設(shè)置,這些內(nèi)容包括
- /bin -> /usr/bin
- /sbin -> /usr/sbin
- /lib -> /usr/lib
- /lib64 -> /usr/lib64
- /var/lock -> /run/lock
- /var/run -> /run
為了方便大家直觀的看到這些目錄都是做什么的,我手繪了一個(gè)圖,圖中的這些目錄之間的關(guān)系很像一棵樹,所以這個(gè)目錄又叫做目錄樹。
這個(gè)目錄樹已經(jīng)很清晰了,就沒什么可說的了。
絕對(duì)路徑和相對(duì)路徑
和其他系統(tǒng)一樣,Linux 中的路徑也分為絕對(duì)路徑(absolute)和相對(duì)路徑(relative),這兩種的寫法依據(jù)如下:
- 由根目錄開始的路徑都是絕對(duì)路徑,比如上圖目錄樹中的 /boot、/usr/local 等
- 相對(duì)于當(dāng)前文件路徑的寫法是相對(duì)路徑,比如 ../var/log 目錄
這里需要注意一點(diǎn),相對(duì)路徑是以你當(dāng)前所在路徑的相對(duì)位置來(lái)移動(dòng)的,比如你當(dāng)前在 /boot 這個(gè)目錄下,你想要移動(dòng)到 /usr/src 這個(gè)目錄
絕對(duì)路徑表示法:/usr/src
相對(duì)路徑表示法:../usr/src
這里還需要注意兩個(gè)特殊的目錄:
- . :代表當(dāng)前目錄,也可以使用 ./ 來(lái)表示
- .. :代表上一層目錄,也可以用 ../ 來(lái)表示
關(guān)于絕對(duì)路徑和相對(duì)路徑的取舍問題:當(dāng)文件路徑很長(zhǎng)時(shí),推薦使用相對(duì)路徑,因?yàn)槟悴挥孟蚪^對(duì)路徑一樣,把所有的路徑都寫一遍,而直接使用 ../ 即可;
但是從文件路徑的正確性來(lái)說,絕對(duì)路徑要比相對(duì)路徑要好。
如果你是在寫程序來(lái)管理系統(tǒng),務(wù)必使用絕對(duì)路徑,因?yàn)榻^對(duì)路徑不管你的文件路徑在哪,都會(huì)找到指定的文件;而相對(duì)路徑如果文件移動(dòng)后,就可能會(huì)存在找不到文件的情況。
與目錄有關(guān)的指令
下面我們就來(lái)聊一聊和目錄相關(guān)的幾條指令
cd
cd 就是 change directory 的縮寫,這條指令能夠切換當(dāng)前工作目錄,有下面四種切換方式
cd /路徑名 # 表示切換到指定的工作目錄
cd ./ # 表示切換到當(dāng)前工作目錄(無(wú)任何切換)
cd .. # 表示切換到當(dāng)前工作目錄的上一層目錄
cd ~ # 表示返回到當(dāng)前用戶目錄
cd /路徑名 # 表示切換到指定的工作目錄cd ./ # 表示切換到當(dāng)前工作目錄(無(wú)任何切換)cd .. # 表示切換到當(dāng)前工作目錄的上一層目錄cd ~ # 表示返回到當(dāng)前用戶目錄
下面我們來(lái)演示一下這四個(gè) cd 切換方式的操作
可以看到,我們分別使用 cd /usr/local 切換到了指令目錄下;使用 cd ./ 沒有切換任何目錄(白浪費(fèi)了兩秒鐘);使用 cd .. 切換到了當(dāng)前工作目錄的上一級(jí);使用 cd ~ 切換到了當(dāng)前登錄用戶的默認(rèn)工作目錄。
這里需要注意的就是 cd ~ ,如果你直接使用 cd ,切換效果和 cd ~ 一樣,也就是說 "cd ~ == cd "。
pwd
上面還有一條指令是 pwd ,這個(gè)指令是我們最常用的指令,它的使用頻率幾乎和 cd 一樣,因?yàn)橐粭l cd 指令往往后面跟著一條 pwd 指令,所以你可以看出 pwd 指令有多么重要了吧。
pwd 是 Print Working Directory 的縮寫,它是打印出當(dāng)前所在目錄的指令。
但是 pwd 不一定只用于顯示當(dāng)前工作路徑,它還可以用來(lái)顯示指定工作目錄下的文件路徑
不過這個(gè)指令好像沒什么用,因?yàn)槲覀円呀?jīng)知道工作目錄下的路徑了,還打印出來(lái)做什么呢?
mkdir
mkdir 用于創(chuàng)建新目錄,它是 make directory 的縮寫,一般來(lái)說,它后面會(huì)跟著兩個(gè)參數(shù)。
- -m :設(shè)置文件的權(quán)限,直接設(shè)置,不用考慮默認(rèn)文件的創(chuàng)建權(quán)限
- -p :遞歸創(chuàng)建目錄
下面是使用 mkdir 創(chuàng)建文件目錄的操作
如上圖所示,我們?cè)?/tmp 文件目錄下創(chuàng)建了一個(gè)叫做 test1 的空目錄,并打印出了當(dāng)前的工作目錄。
如果你想要?jiǎng)?chuàng)建不想讓其他用戶訪問的目錄,你可以使用下面的命令
mkdir -m 711 test2
上圖中的 ls -ld 列出文件目錄的詳細(xì)信息,可以看到,詳細(xì)信息最前面的是文件的權(quán)限。
一個(gè)一個(gè)創(chuàng)建目錄太麻煩了,現(xiàn)在我們想要快速創(chuàng)建這些目錄,比如我們想要?jiǎng)?chuàng)建 /test1/test2/test3/test4 這種目錄格式,我們使用了下面代碼
Linux 會(huì)提出我們不能使用這種創(chuàng)建方式。
此時(shí)就需要 -p 這個(gè)參數(shù)的出現(xiàn)了,這個(gè)參數(shù)能夠允許我們遞歸創(chuàng)建目錄,如下所示
只不過使用 -p 這種方式并不推薦使用,因?yàn)楹苋菀状蝈e(cuò)字。。。
rmdir
rmdir 用于刪除空目錄,它的使用和 mkdir 非常類似,mkdir -p 用于遞歸創(chuàng)建目錄,同樣的,rmdir -p 也能夠遞歸刪除目錄。如下圖所示
這里需要注意,rmdir 只是刪除空目錄,這也意味著目錄里面有內(nèi)容的話是無(wú)法刪除的,那該如何刪除呢?可以直接使用 rm -r 來(lái)進(jìn)行刪除。
mv
使用 mv 能夠修改目錄的名稱,比如我們創(chuàng)建了一個(gè)叫做 test 的目錄,后來(lái)我們覺得這個(gè)目錄無(wú)法體現(xiàn)出來(lái)它的所有者,我們想要改一下它的名字,這時(shí)候就可以使用 mv 指令就可以修改。
在了解完基本的目錄操作之后,下面來(lái)想一個(gè)問題,為什么我們能夠在各種目錄下執(zhí)行 ls 指令都能夠顯示內(nèi)容?按理說 ls 不應(yīng)該只是在其存放路徑下才能夠使用嗎?
首先大家需要先了解一個(gè) PATH 的概念,PATH 是環(huán)境變量,當(dāng)我們?cè)趫?zhí)行一條指令的時(shí)候,首先系統(tǒng)會(huì)按照 PATH 的設(shè)置去每個(gè) PATH 下搜尋文件名為 ls 的可執(zhí)行文件,如果有多個(gè)可執(zhí)行文件,那么優(yōu)先搜索到的先被執(zhí)行。
本文轉(zhuǎn)載自微信公眾號(hào)「程序員cxuan」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序員cxuan公眾號(hào)。