什么是文件系統?
常規認知就是根目錄下那些文件,但其實并不是那樣。文件系統是操作系統用于明確存儲設備(常見的是磁盤,也有基于NAND Flash的固態硬盤)或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件機構稱為文件管理系統,簡稱文件系統。也指用于存儲文件的磁盤或分區,或文件系統種類。因此,可以說"我有2個文件系統"意思是他有2個分區,一個存文件,或他用 “擴展文件系統”,意思是文件系統的種類。 比如在linux源碼下文件下的文件系統代碼存放在fs文件夾(由此可知文件系統是一個程序):
-
文件系統(文件管理系統)的種類有哪些? 既然文件系統是管理磁盤文件的方法,那么肯定不止一種,比如說:FAT、vfat 、NTFS、EXT(ext2、ext3、ext4)、HFS,Linux常用的是EXT系列的文件系統,windows使用的文件系統是NTFS,樹莓派查看文件系統的命令是:
df -T
,如下如所示,type就是文件系統類型。tmpfs:是臨時文件系統也叫作內存文件系統是基于內存的。vfat和ext4是基于磁盤的,也就是我們的SD卡,就是之前掛載到虛擬機的兩個分區,fat分區存放boot(BootLoader)相關文件,ext4分區存放的是根目錄文件。有圖可以看出都是根目錄下的文件但是可能來自不同的分區。
-
什么是分區? 對于windows來說,像是驅動器盤符,C盤是裝系統的分區,D盤存放其他文件,但是C盤也可以放其他文件,比較隨意,但是C盤、D盤的內存都是聯連續的一大塊。對于Linux來說,叫做文件系統結構,按照功能來分區,每個分區嚴格存放文件,內存不一定連續,也就是說我們在linux同一個路徑下看到的文件不一定是來自同一分區。Linux磁盤分區: linux分區不同于windows,硬盤和硬盤分區在Linux都表示為設備。硬盤分區一共有三種:主分區,擴展分區和邏輯分區。 硬盤的分區主要分為主分區(Primary Partion)和擴展分區(Extension Partion)兩種,主分區和擴展分區的數目之和不能大于四個。主分區(Primary Partion):可以馬上被使用但不能再分區。擴展分區(Extension Partion):必須再進行分區后才能使用,也就是說它必須還要進行二次分區。邏輯分區((Logical Partion)):由擴展分區建立起來的分區,邏輯分區沒有數量上限制。擴展分區只不過是邏輯分區的“容器”,實際上只有主分區和邏輯分區進行數據存儲。嵌入式系統可以分為4個區,分別是bootloader(啟動代碼)、para(啟動代碼向內核傳遞參數的位置)、kernel(內核分區)、根分區(文件系統結構)等,與Windows、Linux分區不同 。①在嵌入式系統中,沒有swap分區,只有實際的物理空間。②bootloader、para、kernel這三個分區的功能類似于Linux系統中的/boot分區,這三個分區分別存放嵌入式系統的啟動代碼和內核。注: Linux系統中/boot分區內存放著linux啟動代碼和內核源碼。③根分區(/)可以構造,其功能類似于Linux系統中的根分區在這個分區中可以創建許多目錄,比如/root、/home、/usr等,但不能創建/boot目錄。④分區bootloader、para、kernel只能由地址來區分,而根分區只能由目錄來區分。⑤嵌入式系統的驅動程序、上層軟件都放在根分區.在嵌入式系統啟動后,系統無法查看到bootloader、para、kernel這三個分區。
-
什么是文件系統目錄結構? 文件系統是存儲設備上組織文件的方法,那么常規認知的根目錄是什么呢?其實根目錄就是文件系統目錄結構。在Linux系統中,目錄被組織成一個:單根倒置樹結構,文件系統目錄結構從根目錄開始,用/來表示。文件名稱區分大小寫( 大小寫敏感還需要看具體的文件系統格式 ),以.開頭的為隱藏文件,路徑用/來進行分割(windows中使用\來分割),文件有兩個種類:元數據與數據本身.在操作linux系統時,通常會遵循以下的分層結構規則:LSB (Linux Standard Base) / FHS(Filesystem Hierarchy Standard)。
-
除了分區需要按照功能來劃分,文件系統的目錄結構也是按照功能劃分的:
-
/ 所有linux操作系統的頂點目錄,不像windows,每個分區都有一個頂點目錄
-
/boot 存放系統啟動時相關的文件,比如kernel內核,grub引導菜單.(不要刪除.)
-
/bin 存放的都是命令,但僅普通用戶能執行
-
/sbin 超級管理員能執行的命令.
-
/home 存放普通用戶的家目錄
-
/root 超級管理員的家目錄,普通用戶是無法進入
-
/etc 存放配置文件的目錄
-
/etc/hostname 主機名
-
/etc/hosts 本地解析域名一種方式
-
/etc/sysconfig/network-script/ifcfg-* 網卡的配置文件
-
/dev 設備目錄,設備驅動,硬盤\硬盤的分區\光盤\串口…
-
/dev/null 黑洞,接收所有的東西,只進不出
-
/dev/zero 搖錢樹,可以生產源源不斷的數據
-
/dev/random 產生隨機數的一個設備
-
/dev/pts/0 虛擬的Bash Shell終端,提供給遠程用戶使用 ,0代表一個終端, 1代表2個終端 以此類推
-
/usr 類似于windows的C盤下面的windows目錄
-
/usr/lib 共享庫文件,后綴都是so結尾, share object
-
/usr/lib64 共享庫文件64位,后綴都是so結尾, share object
-
/usr/local 早期大家都把軟件放在這個目錄下,和windows C:\ProgramFile
-
/usr/bin 、/usr/sbin、 /var
存放一些可變化的內容,比如/var/log日志,可以人為讓其發生變化,也或者是隨著時間推移產生變化 -
/tmp 存放臨時文件,無論哪個用戶都可以放
-
/proc 反饋當前運行的進程的狀態信息,還有提供給用戶的一些信息,比如說cpu和內存。
-
/run 存放程序運行后所產生的pid文件
-
/media 、/mnt 提供掛載的一個目錄
-
/opt 早期第三方廠商的軟件存放的目錄.
-
/srv 物理設備產生的一些文件
-
在 Linux 系統中,有幾個目錄是比較重要的,平時需要注意不要誤刪除或者隨意更改內部文件。
/etc
: 這個是系統中的配置文件,如果你更改了該目錄下的某個文件可能會導致系統不能啟動。/bin, /sbin, /usr/bin, /usr/sbin
: 這是系統預設的執行文件的放置目錄,比如 ls 就是在/bin/ls 目錄下的。值得提出的是,/bin, /usr/bin
是給系統用戶使用的指令(除root外的通用戶),而/sbin, /usr/sbin
則是給root使用的指令。/var
: 這是一個非常重要的目錄,系統上跑了很多程序,那么每個程序都會有相應的日志產生,而這些日志就被記錄到這個目錄下,具體在/var/log
目錄下,另外mail的預設放置也是在這里。 -
可以在proc文件下查看CPU相關的情況
cat /proc/cpuinfo
從下面可以看出processor是從0到3,表示cpu是四核的,然后Hardware是cpu的型號BCM2835
-
使用指令:
cat /proc/meminfo
可以查看內存相關信息,由下圖可以看出總內存是948280KB
-
使用指令:
sudo cd root
發現進不去root這個文件夾,可以使用指令sudo passwd root
先為root設置密碼然后:su root
再輸入密碼即可進入。退出使用指令:exit
或者su pi(是要進入普通用戶,pi是用戶名)
-
etc下面是配置文件,若想要開機啟動某個程序可以在
/etc/init
這個文件夾下去配置某些文件,使之開機自啟。比如打開bootmisc.sh.conf:vi /etc/init/bootmisc.sh.conf
然后將指令添加到腳本的最后即可。
-
但是一般不那么做,一般是在init文件夾下去模仿這個文件夾下面的文件自己去新建一個文件,然后再文件里面寫入相關的指令,只需文件以.conf結尾即可。除此之外還可以修改etc下面的
rc .local
也是添加相關的指令即可。
什么是虛擬文件系統?
vfs(虛擬文件系統)就是對各種文件系統的一個抽象,它為各種文件系統提供了一個通用接口,由指令df -T
可以看出不同的文件來源于不同分區,然而每個分區都有自己的文件系統,所以訪問文件的方式因為文件系統的不同而不同,因為不同的文件系統文件、數據存儲的方式不一樣。這樣訪問不同分區的文件就比較麻煩,而linux通過叫做VFS的中間層對這些文件系統提供了完美的支持。在大部分情況下,用戶通過libc和kernel的VFS交互,不需要關心底層文件系統的具體實現。這樣就使我們使用open、read、write等函數對文件展開操作,不需要關心它底層的文件系統。虛擬文件系統的目的: 將接口暴露給用戶,屏蔽底層文件系統的差異性,它是對所有不同文件系統的抽象。
- 虛擬文件系統的分層結構:上層:虛擬文件系統,底層:特定文件系統模塊,例如:網絡文件系統(nfs、smb)等其他類型文件系統。虛擬文件系統存在于內核態,用戶在用戶態使用open、read等函數操作文件或驅動的時候,先到vfs,然后就可以操作處于不同文件系統的文件。
- VFS在用戶和文件系統之間提供了一個交換層,在 VFS 上面,是對諸如open、close、read 和 write 之類的函數的一個通用 API 抽象。在 VFS 下面是文件系統抽象,它定義了上層函數的實現方式。它們是給定文件系統(超過 50 個)的插件,文件系統的源代碼可以在 ./linux/fs 中找到。文件系統層之下是緩沖區緩存,它為文件系統層提供了一個通用函數集(與具體文件系統無關)。這個緩存層通過將數據保留一段時間(或者隨即預先讀取數據以便在需要是就可用)優化了對物理設備的訪問。緩沖區緩存之下是設備驅動程序,它實現了特定物理設備的接口。因此,用戶和進程不需要知道文件所在的文件系統類型,而只需要象使用 Ext2 文件系統中的文件一樣使用它們。
linux內核結構框圖:
-
Unix和Linux系統內核都采用的都是如下圖所示的結構,其中可以看到三個層次:硬件級、內核級和用戶級。用戶程序通過陷入完成由用戶態到內核態的轉換。系統調用作為用戶級與內核級交互方式,分為2部分:與文件子系統的交互和與進程控制子系統的交互。文件子系統管理文件。包括:分配文件空間、管理空閑空間、控制對文件的存取以及為用戶檢索數據。進程控制子系統負責進程同步、進程間通信、進程調度和存儲管理。其中用戶應用程序由基礎C和程序庫組成,程序庫提供應用程序支配內核干活的接口,程序庫通過系統調用接口然后操控底層各種東西,比如:程序里面調用open、read、write函數,通過程序庫到達系統調用,然后會在系統調用那里會調用sys_open、sys_read、sys_write等函數,然后sys_open、sys_read、sys_write等函數會根據程序里面函數的參數判斷你要打開什么類型的文件會產生不一樣的指令信息,然后系統調用那里的函數會去分析打開文件的類型(磁盤上的文或者串口等設備文件),然后進行操作。
-
還有一種結構圖如下圖所示:
-
shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令并把它送入內核去執行,是一個命令解釋器。另外,shell編程語言具有普通編程語言的很多特點,用這種編程語言編寫的shell程序與其他應用程序具有同樣的效果。目前主要有下列版本的shell:① Bourne Shell:是貝爾實驗室開發的。② BASH:是GNU的Bourne Again Shell,是GNU操作系統上默認的shell,大部分linux的發行套件使用的都是這種shell。③ Korn Shell:是對Bourne SHell的發展,在大部分內容上與Bourne Shell兼容。④ C Shell:是SUN公司Shell的BSD版本。
-
Linux內核主要包括5個模塊:進程調度模塊、內存管理模塊、文件系統模塊、進程間通信模塊和網絡接口模塊。
-
進程調度模塊用來負責控制進程對CPU資源的使用。
-
內存管理模塊用于確保所有進程能夠安全地共享機器主內存區。
-
文件系統模塊用于支持對外部設備的驅動和存儲。(一些皆文件)
-
進程間通信模塊用于支持多種進程間的信息交換方式。通過系統調用實現進程間的信息交換。
-
網絡接口模塊提供多種網絡通信標準的訪問并提供對多種網絡硬件的支持。所有的模塊都要通過進程調度來運行。
Linux 系統結構:
Linux系統一般有4個主要部分:內核、shell、文件系統和應用程序。內核、shell和文件系統一起形成了基本的操作系統結構,它們使得用戶可以運行程序、管理文件并使用系統。linux內核:內核是操作系統的核心,具有很多最基本功能,它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定著系統的性能和穩定性。系統調用接口:SCI 層提供了某些機制執行從用戶空間到內核的函數調用。這個接口依賴于體系結構,甚至在相同的處理器家族內也是如此。SCI 實際上是一個非常有用的函數調用多路復用和多路分解服務。在 ./linux/kernel 中您可以找到 SCI 的實現,并在 ./linux/arch 中找到依賴于體系結構的部分。如圖:
- 內存管理: 對任何一臺計算機而言,其內存以及其它資源都是有限的。為了讓有限的物理內存滿足應用程序對內存的大需求量,Linux 采用了稱為“虛擬內存”的內存管理方式。Linux 將內存劃分為容易處理的“內存頁”(對于大部分體系結構來說都是 4KB)。Linux 包括了管理可用內存的方式,以及物理和虛擬映射所使用的硬件機制。不過內存管理要管理的可不止 4KB 緩沖區。Linux 提供了對 4KB 緩沖區的抽象,例如 slab 分配器。這種內存管理模式使用 4KB 緩沖區為基數,然后從中分配結構,并跟蹤內存頁使用情況,比如哪些內存頁是滿的,哪些頁面沒有完全使用,哪些頁面為空。這樣就允許該模式根據系統需要來動態調整內存使用。為了支持多個用戶使用內存,有時會出現可用內存被消耗光的情況。由于這個原因,頁面可以移出內存并放入磁盤中。這個過程稱為交換,因為頁面會被從內存交換到硬盤上。內存管理的源代碼可以在 ./linux/mm 中找到。
- 進程管理: 進程實際是某特定應用程序的一個運行實體。在 Linux 系統中,能夠同時運行多個進程,Linux 通過在短的時間間隔內輪流運行這些進程而實現“多任務”。這一短的時間間隔稱為“時間片”,讓進程輪流運行的方法稱為“進程調度” ,完成調度的程序稱為調度程序。進程調度控制進程對CPU的訪問。當需要選擇下一個進程運行時,由調度程序選擇最值得運行的進程。可運行進程實際上是僅等待CPU資源的進程,如果某個進程在等待其它資源,則該進程是不可運行進程。Linux使用了比較簡單的基于優先級的進程調度算法選擇新的進程。通過多任務機制,每個進程可認為只有自己獨占計算機,從而簡化程序的編寫。每個進程有自己單獨的地址空間,并且只能由這一進程訪問,這樣,操作系統避免了進程之間的互相干擾以及“壞”程序對系統可能造成的危害。 為了完成某特定任務,有時需要綜合兩個程序的功能,例如一個程序輸出文本,而另一個程序對文本進行排序。為此,操作系統還提供進程間的通訊機制來幫助完成這樣的任務。Linux 中常見的進程間通訊機制有信號、管道、共享內存、信號量和套接字等。內核通過 SCI 提供了一個應用程序編程接口(API)來創建一個新進程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函數),停止進程(kill、exit),并在它們之間進行通信和同步(signal 或者 POSⅨ 機制)。
- 設備驅動程序: 設備驅動程序是 Linux 內核的主要部分。和操作系統的其它部分類似,設備驅動程序運行在高特權級的處理器環境中,從而可以直接對硬件進行操作,但正因為如此,任何一個設備驅動程序的錯誤都可能導致操作系統的崩潰。設備驅動程序實際控制操作系統和硬件設備之間的交互。設備驅動程序提供一組操作系統可理解的抽象接口完成和操作系統之間的交互,而與硬件相關的具體操作細節由設備驅動程序完成。一般而言,設備驅動程序和設備的控制芯片有關,例如,如果計算機硬盤是 SCSI 硬盤,則需要使用 SCSI 驅動程序,而不是 IDE 驅動程序。
- 網絡接口(NET): 提供了對各種網絡標準的存取和各種網絡硬件的支持。網絡接口可分為網絡協議和網絡驅動程序。網絡協議部分負責實現每一種可能的網絡傳輸協議。眾所周知,TCP/IP 協議是 Internet 的標準協議,同時也是事實上的工業標準。Linux 的網絡實現支持 BSD 套接字,支持全部的TCP/IP協議。Linux內核的網絡部分由BSD套接字、網絡協議層和網絡設備驅動程序組成。網絡設備驅動程序負責與硬件設備通訊,每一種可能的硬件設備都有相應的設備驅動程序。
參考博文:Linux文件系統目錄結構、虛擬文件系統、虛擬文件系統、linux框圖、Linux 系統結構