FHS文件結構

我們在前面學習的過程中有了解到,linux的發現版有很多種類型,那么如果每個版本都有著自己的想法去配置文件應該放置的目錄,那么將造成管理上的困擾,于是為了解決這個問題,就有了FHS標準。

1.1 FHS 結構

1.1.1 軟件的概念

之前,我們提到過,一個完整的計算機系統應該有兩部分組成,即:計算機系統=軟件+硬件。沒有軟件的硬件,計算機只不過是一堆只會發熱的廢鐵。我們之前也比喻了,如果將硬件比喻成軀體,那么軟件就是它的靈魂。軟件有應用軟件和系統軟件之分,而操作系統就是一款系統軟件。對于一個完整的操作系統來說,我們可以將它理解為:內核+程序。

我們要知道的是,要想要計算機進行相關的工作,那么必須要讓CPU接受到相關的指令,這樣CPU才能進行相關的操作。但是,對于我們人來說,理解這個CPU指令實在太難了。在早期,程序員通過匯編語言寫程序,然后由匯編器轉換成機器可以認識的機器語言。使用匯編語言的缺點是:代碼冗長并且難以編寫,另外還不具有兼容性。后來C語言出現了,至少我們現在要明白的是,用C語言編寫的程序和硬件沒啥多大關系,并且Linux內核大部分都是用C語言來編寫的。

C源代碼被組織成了多個子程序,每個子程序單獨執行某一個任務,我們可以把它稱為模塊,那么Linux內核就是由許多單獨的C源代碼模塊組成。每個模塊都有其自身的子程序和數據結構,這些模塊組合起來又能共同完成某種更為復雜的功能,如文件處理。

不管是匯編程序也好,C語言程序也好,它們都要轉換成機器所認識的機器指令,對于C語言程序來說,處理一般經過四個處理階段:預處理階段、編譯階段、匯編階段和鏈接階段。如下圖:

 

                                               

blob.png

在預處理階段中,gcc會把C程序傳遞給C前處理器CPP,對C語言程序中指示符和宏進行替換處理,輸出純C語言代碼。這是什么意思呢?那么學習C語言的都知道,我們在寫程序的時候,應該有這樣寫過:

#include<stdio.>
#define PI 3.1415926
int main(void){
        printf("hello\n");
        return 0;
}

那么,在預處理的時候,前處理器CPP就會將以#開頭的指示符,如#include<stdio.h>、#define PI 3.1415926進行預處理。前面代表的是標準輸出,后面代表的是將3.1415926替換成PI。

編譯階段,將C語言程序編譯成匯編代碼。

匯編階段,將匯編代碼編譯成機器指令,并以特定的二進制格式保存在目標文件中。

鏈接階段,最后,通過ld鏈接器把程序相關的目標文件和庫文件組合鏈接在一起,這樣就生成了可執行文件。

那么對于鏈接這個過程,我們現在知道,它是將目標文件和一些庫文件連接起來形成一個單一的程序。那么,這種鏈接方式我們稱為靜態鏈接。但是要知道的是靜態鏈接的最大缺點是生成的可執行文件太大,需要更多的系統資源,在裝入內存時也會消耗更多的時間。隨著靜態鏈接方式諸多缺點逐一暴露出來,比如浪費內存和磁盤空間,模塊更新困難。那么我們就需要一種更好的方式來組織程序。

為了解決內存和磁盤空間上的浪費和模塊更新困難,我們不再通過靜態鏈接的方式將各個模塊鏈接到一起,簡單的說,不對那些組成程序的庫文件進行綁定了,而是將這些庫文件根據其功能劃分開來,形成一個獨立的文件,但是它們不能運行,只能被調用。

如果你還是不明白,我們換種方式來描述一下:

我們說過,所謂的鏈接,就是將目標文件和一些功能模塊組合起來形成一個能夠完成單一任務的程序。那么,根據這些模塊的功能描述,我們將這些相似功能的模塊打包在一個單元中,這些單元能夠被程序開發人員所共享,我們把這些共享單元集合在一起叫做庫。Linux支持兩種類型的庫,即動態庫和靜態庫,所謂的靜態庫就是說,在程序編譯時,將該庫中的某個模塊綁定到程序中去。動態庫則不同,它是在應用程序時被加載到內核而被加載的,而且它與應用程序是在運行時綁定的。也就是說,當我們開發人員在開發程序的時候,編譯時并沒有把相關的模塊與應用程序綁定,而只是提供了一個調用接口(API接口),當程序運行時,內核將程序加載至虛擬地址空間,并且內核需將這個程序的相關模塊裝載進來之后,這個程序才能執行。

blob.png

在Linux中,這些庫文件主要存放在C庫中,即我們叫做glibc。

那么,說了這么多,這里我們也應該理解了,對于Linux內核來說,如果沒有應用程序,那么僅僅靠一個內核是沒有用的。那么對于一個應用程序的運行,它主要通過兩種方式來啟動。一種是通過終端啟動,另一種是在操作引導啟動過程當中自動啟動。那么不管是哪種啟動方式,它最終要被加載至內核的虛擬地址空間。

1.1.2 文件系統的概念

在Linux系統當中,應用程序是以文件的形式存在,問題就是,Linux上有許多應用程序,那么是如何有效管理這眾多文件的呢?那么這里就要說一下文件系統了。文件系統是操作系統中最基層的組織,操作系統與用戶進行交互的方式取決于文件系統是怎樣在磁盤上有效的組織文件。文件系統提供了一個公共文件系統結構,確保用戶能夠訪問和寫文件。

文件系統將文件大致分區兩個邏輯類別:

Shareable vs. unsharable files

Variable vs. static files

Shareable文件可以被本地主機和遠程主機訪問,unsharable文件只能被本地主機訪問,variable文件表示可以動態的文件,如文檔,可以隨時被修改,static文件表示不能被修改(除管理員操作之外),如一些二進制文件。

文件以這樣的形式分類有助于將每個文件的功能與權限分配給持有這個文件相關的目錄,用戶要訪問一個文件的前提是,這個文件是放置在哪個目錄中?這個目錄是否掛載并且用戶是否擁有其相關的權限,已經用戶是否有對這個文件的訪問權限,那么可見,這種分級是至關重要的,這樣保證了文件系統的安全。FHS就定義了類似這樣,它定義了文件的類型,文件應該存放的目錄,已經用戶對目錄的訪問權限等定義。

那么什么是目錄呢?目錄就是文件的路徑映射,在Linux中,文件系統不是通過設備標志符來訪問,而是通過表示文件系統的層次樹結構來進行訪問。我們可以使用tree命令來查看一下CentOS的目錄結構。

[root@MyLabC7 ~]# tree -L 1 /
/
|-- bin -> usr/bin
|-- boot
|-- dev
|-- etc
|-- home
|-- lib -> usr/lib
|-- lib64 -> usr/lib64
|-- media
|-- mnt
|-- opt
|-- proc
|-- root
|-- run
|-- sbin -> usr/sbin
|-- srv
|-- sys
|-- tmp
|-- usr
`-- var

這里我們列出來的只是/下的目錄,有必要說明一下的是,Linux層次結構遵循著FHS標準。對于FHS標準,它針對以下三個目錄來進行定義,分別是 / 、/usr、/var。其它的用戶可以選擇性的去定義、選擇。我們針對這三層目錄來進行說明。

The Root Filesystem

/目錄是是所有目錄的起點,所有的目錄都掛載在 / 目錄下,當系統開機的時候,內核會從磁盤中加載/,我們也可以換句話說,/ 目錄與系統開機有關。FHS標準建議/目錄所在分區應該越小越好,且應用程序所安裝的軟件最好不要和/目錄放在同一分區內,保持/目錄越小越好。如此不但效能較佳,/目錄所在的文件系統也不容易發生問題。

那么在/目錄中,會放入哪些文件了,這里是由FHS標準已經定義好的,并且FHS標準也不建議我們在/分區中去創建目錄。

現在,我們來說說,放在/目錄下的這些目錄到底是用來干嘛的。

/bin:Essential user command binaries (for use by all users)

二進制程序文件的存放目錄,在CentOS7中,這個目錄為鏈接文件,指向/usr/bin。

/boot: Static files of the boot loader

該目錄包含了系統開機時需要的靜態文件,如:內核常用文件名:vmlinuz。grub2這個開機管理程序還會有/boot/grub2這個目錄。

/dev: Device files

在linux中,一切皆文件,當然也將設備虛擬成了文件。這些設備在/dev下以兩種形式存在。一種是字符設備(串行的數據流,如鼠標,鍵盤),另一種是塊設備(隨機訪問,如硬盤)

/etc : Host-specific system configuration

系統程序配置文件存放的目錄,該目錄里面的文件都是靜態文件。

/home : User home directories 

普通的家目錄的集中位置;一般每個普通用戶的家目錄默認為此目錄下與用戶名同名的子目錄,/home/USERNAME;

/lib : Essential shared libraries and kernel modules

為系統啟動或根文件系統上的應用程序(/bin, /sbin等)提供共享庫,以及為內核提供內核模塊,在CentOS7上,這個目錄為鏈接文件 ,指向/usr/lib。

如果你的機器是64位,那么與之對應的庫目錄就是:/lib64,這也是個鏈接文件,執行/usr/lib64。

/media : Mount point for removeable media

便攜式設備掛載點,cdrom, floppy等;

/mnt : Mount point for a temporarily mounted filesystem

其它文件系統的臨時掛載點;

/opt : Add-on application software packages

附加應用程序的安裝位置;可選路徑;

/root : Home directory for the root user

管理員用戶的家目錄。

/sbin : System binaries

管理員能夠執行的二進制程序的指令存放目錄,在CentOS7中,是/usr/sbin的鏈接目錄。

/srv : Data for services provided by this system

srv可以視為service的縮寫,表示當前主機為服務提供的數據;

/tmp : Temporary files

為那些會產生臨時文件的程序提供的用于存儲臨時文件的目錄;可供所用戶執行寫入操作;有特殊權限;

/proc : Kernel and process information virtual filesystem

它是一個虛擬的文件系統,在內存里存放,所以不占磁盤空間,用于為內核及進程存儲其相關信息,而且將這些系統信息抽象為了文件系統格式;它們多為內核參數,例如net.ipv4.ip_forward, 虛擬為net/ipv4/ip_forward, 存儲于/proc/sys/, 因此其完整路徑為/proc/sys/net/ipv4/ip_forward;

/sys

sysfs虛擬文件系統提供了一種比proc更為理想的訪問內核數據的途徑;其主要作用在于為管理Linux設備提供一種統一模型的的接口;

sysfs 是 Linux 內核中設計較新的一種虛擬的基于內存的文件系統,它的作用與 proc 有些類似,但除了與 proc 相同的具有查看和設定內核參數功能之外,還有為 Linux 統一設備模型作為管理之用。相比于 proc 文件系統,使用 sysfs 導出內核數據的方式更為統一,并且組織的方式更好,它的設計從 proc 中吸取了很多教訓。

sysfs 文件系統總是被掛載在 /sys 掛載點上。

[root@MyLabC7 ~]# ls /sys
block  bus  class  dev  devices  firmware  fs  hypervisor  kernel  module  power

參考:https://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/

The /usr Hierarchy

/usr目錄是文件系統中第二個重要的目錄,它里面中存放的是shareable、read-only的數據,這就意味著/usr目錄中的文件是靜態的,可共享的,并且能在兼容FHS的主機上使用。一般建議單獨分區。現在我們來看一下,/usr下應該包含哪些子目錄。

[root@MyLabC7 ~]# tree -L 1 /usr
/usr
├── bin
├── etc
├── games
├── include
├── lib
├── lib64
├── libexec
├── local
├── sbin
├── share
├── src
└── tmp -> ../var/tmp

同樣的,我們來說說,一些重要的目錄是用來干嘛的:

/usr/bin: Essential user command binaries

用戶二進制存放的路徑

/usr/include : Directory for standard include files

C或C++的函數頭文件存放的目錄

/usr/lib : Libraries for programming and packages

為系統啟動或根文件系統上的應用程序(/bin, /sbin等)提供共享庫,以及為內核提供內核模塊。

    如果你的機器是64位,那么與之對應的庫目錄就是:/usr/lib64

/usr/share : Architecture-independent data

命令手冊頁和自帶文檔等架構特有的文件的存儲位置,如/usr/share/man

/usr/sbin : System binaries

管理員能夠執行的二進制程序的指令存放目錄

/usr/src : Source code 

系統源代碼所存放的目錄

/usr/local : Local hierarchy

這是管理員在本地安裝軟件時的層級目錄,我們可以使用tree查看一下:

[root@MyLabC7 ~]# tree -L 1 /usr/local
/usr/local
├── bin
├── etc
├── games
├── include
├── lib
├── lib64
├── libexec
├── sbin
├── share
└── src

這里我們根據我們上面的目錄結構的理解,這些我們應該能明白是什么意思。

The /var Hierarchy

如果說/usr是安裝時會占用磁盤較大容量的目錄,那么/var就是系統在運行后逐漸占用磁盤容量。因為/var目錄主要針對一些動態文件的存放。

同樣的,我們使用tree來查看一下/var下的目錄結構。

[root@MyLabC7 ~]# tree -L 1 /var
/var
├── account
├── adm
├── cache
├── crash
├── db
├── empty
├── games
├── gopher
├── kerberos
├── lib
├── local
├── lock -> ../run/lock
├── log
├── mail -> spool/mail
├── nis
├── opt
├── preserve
├── run -> ../run
├── spool
├── target
├── tmp
└── yp

我們來說說一般常用的目錄:

/var/cache : Application cache data

用于緩存應用程序的數據

/var/lib : Variable state information

注意,這里的lib指的不是庫文件,而是系統的狀態信息

/var/lock : Lock files

某些設備或者文件資源一次只能被一個應用程序所使用,如果同時有兩個程序使用該資源時,可能就會產生一些錯誤的狀況,因此就得要將該設備或文件資源上鎖(lock),以確保該設備或文件資源只會給單一軟件所使用。 目前此目錄已挪到/run/lock中

/var/log : Log files and directories

系統日志文件所存放的目錄

/var/mail : User mailbox files 

放置個人郵件信箱的目錄,不過被挪到/var/spool/mail

/var/opt : Variable data for /opt

安裝在opt目錄中的第三方應用程序所產生的可變的數據。

/var/run : Run-time variable data

某些程序或服務啟動時,會將它們的PID放置在這個目錄下,這個目錄已經挪到/run

/var/spool : Application spool data

通常這個目錄放置一些隊列數據。所謂的隊列就是排隊等待其他程序使用的數據。這些數據被使用后通常都會被刪除。如:系統收到新信會放置到/var/spool/mail/中,但使用者收下該信后原則上該信就會被刪除。信件如果暫時寄不出去會被放到/var/spool/mqueue/中,等到被送出后就刪除。如果是crontab數據,就會被放置到/var/spool/cron目錄中。

原創文章,作者:N24_小輝,如若轉載,請注明出處:http://www.www58058.com/54921

(0)
N24_小輝N24_小輝
上一篇 2016-10-27
下一篇 2016-10-27

相關推薦

  • 網絡服務之Nginx

      在之前一篇博客中我們講述了httpd網絡服務器,那么httpd是個非常穩定安全的一個服務器,這次我們介紹一個新的網絡服務器—-nginx。   Nginx 是俄羅斯人編寫的十分輕量級的 HTTP 服務器,Nginx,它的發音為“engine X”,是一個高性能的HTTP和反向代理服務器(我們主要圍繞這兩…

    2017-06-07
  • 文件查找命令之find

    文件查找命令一共有兩種,locate 和find ,那么他們在用法和功能上面有什么區別呢?     locate:查找速度快,模糊查找,遍歷整個文件系統的目錄到數據庫中,然后在去數據庫中查找,依賴于事先創建好的索引庫,該數據庫屬于系統自動創建,定期自動更新,也可手動跟新,更新命令updatedb,更新數據庫需要遍歷整個根文件系統…

    Linux干貨 2016-08-16
  • CentOS通過bind配置DNS服務器

    一、創建DNS主服務器 1、安裝bind并配置主配置文件     主服務器為CentOS 7,主服務地址為172.16.11.55     安裝bind [root@xinfeng ~]# yum install bind  &n…

    Linux干貨 2016-04-18
  • 如何解決生產機上php代碼連接mysql報錯的故障

    大家好: 今天分享一則當生產機上的網站php代碼不能連接Mysql服務器時怎么辦? 當LNMP的網站建立好后,我們需要測試網站中的php代碼。但發現如下報錯怎么辦? 解決方法如下:  mysql> show databases; +——————–+ | Dat…

    Linux干貨 2016-12-18
  • Linux簡要發展史

    目錄 Linux簡述 Linux之父 Linux標志 企鵝的來源 Tux的來源 歷史 Unix GNU BSD Minix Linux 主要特性 Linux內核版本 Linux發行版 Linux簡述 ·         Linux是一套自由加開放源代碼的類Unix操作系統,誕生于…

    Linux干貨 2016-10-18
  • 馬哥第一天

    來這兒的第一天

    2018-03-26

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-11-02 15:50

    詳實有料,生動有趣,作者有心了,以后拿出來就可以直接當參考文檔,加油!

欧美性久久久久