0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

要學習Linux,得從Linux系統(tǒng)結構開始吧!

jf_TEuU2tls ? 來源:浩道linux ? 2023-07-09 16:18 ? 次閱讀

今天浩道跟大家Linux相關的硬核干貨,也讓想學習Linux的小伙伴有一個認識過程,一起看看Linux系統(tǒng)結構!

文章來源:https://www.jianshu.com/p/85b255a73761

Linux系統(tǒng)一般有4個主要部分:內核、shell、文件系統(tǒng)和應用程序。內核、shell和文件系統(tǒng)一起形成了基本的操作系統(tǒng)結構,它們使得用戶可以運行程序、管理文件并使用系統(tǒng)。

7cf5822c-1e0d-11ee-962d-dac502259ad0.png

1. linux內核

內核是操作系統(tǒng)的核心,具有很多最基本功能,它負責管理系統(tǒng)的進程、內存、設備驅動程序、文件和網(wǎng)絡系統(tǒng),決定著系統(tǒng)的性能和穩(wěn)定性。

Linux 內核由如下幾部分組成:內存管理、進程管理、設備驅動程序、文件系統(tǒng)和網(wǎng)絡管理等。如圖:

7d1d49d8-1e0d-11ee-962d-dac502259ad0.png

系統(tǒng)調用接口:SCI 層提供了某些機制執(zhí)行從用戶空間到內核的函數(shù)調用。這個接口依賴于體系結構,甚至在相同的處理器家族內也是如此。SCI 實際上是一個非常有用的函數(shù)調用多路復用和多路分解服務。在 ./linux/kernel 中您可以找到 SCI 的實現(xiàn),并在 ./linux/arch 中找到依賴于體系結構的部分。

1.1 內存管理

對任何一臺計算機而言,其內存以及其它資源都是有限的。為了讓有限的物理內存滿足應用程序對內存的大需求量,Linux 采用了稱為“虛擬內存”的內存管理方式。Linux 將內存劃分為容易處理的“內存頁”(對于大部分體系結構來說都是 4KB)。Linux 包括了管理可用內存的方式,以及物理和虛擬映射所使用的硬件機制。

不過內存管理要管理的可不止 4KB 緩沖區(qū)。Linux 提供了對 4KB 緩沖區(qū)的抽象,例如 slab 分配器。這種內存管理模式使用 4KB 緩沖區(qū)為基數(shù),然后從中分配結構,并跟蹤內存頁使用情況,比如哪些內存頁是滿的,哪些頁面沒有完全使用,哪些頁面為空。這樣就允許該模式根據(jù)系統(tǒng)需要來動態(tài)調整內存使用。

為了支持多個用戶使用內存,有時會出現(xiàn)可用內存被消耗光的情況。由于這個原因,頁面可以移出內存并放入磁盤中。這個過程稱為交換,因為頁面會被從內存交換到硬盤上。內存管理的源代碼可以在 ./linux/mm 中找到。

1.2 進程管理

進程實際是某特定應用程序的一個運行實體。在 Linux 系統(tǒng)中,能夠同時運行多個進程,Linux 通過在短的時間間隔內輪流運行這些進程而實現(xiàn)“多任務”。這一短的時間間隔稱為“時間片”,讓進程輪流運行的方法稱為“進程調度” ,完成調度的程序稱為調度程序。

進程調度控制進程對CPU的訪問。當需要選擇下一個進程運行時,由調度程序選擇最值得運行的進程??蛇\行進程實際上是僅等待CPU資源的進程,如果某個進程在等待其它資源,則該進程是不可運行進程。Linux使用了比較簡單的基于優(yōu)先級的進程調度算法選擇新的進程。

通過多任務機制,每個進程可認為只有自己獨占計算機,從而簡化程序的編寫。每個進程有自己單獨的地址空間,并且只能由這一進程訪問,這樣,操作系統(tǒng)避免了進程之間的互相干擾以及“壞”程序對系統(tǒng)可能造成的危害。為了完成某特定任務,有時需要綜合兩個程序的功能,例如一個程序輸出文本,而另一個程序對文本進行排序。為此,操作系統(tǒng)還提供進程間的通訊機制來幫助完成這樣的任務。Linux 中常見的進程間通訊機制有信號、管道、共享內存、信號量和套接字等。

內核通過 SCI 提供了一個應用程序編程接口(API)來創(chuàng)建一個新進程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函數(shù)),停止進程(kill、exit),并在它們之間進行通信和同步(signal 或者 POSⅨ 機制)。

1.3 文件系統(tǒng)

和 DOS 等操作系統(tǒng)不同,Linux 操作系統(tǒng)中單獨的文件系統(tǒng)并不是由驅動器號或驅動器名稱(如 A: 或 C: 等)來標識的。相反,和 UNIX 操作系統(tǒng)一樣,Linux 操作系統(tǒng)將獨立的文件系統(tǒng)組合成了一個層次化的樹形結構,并且由一個單獨的實體代表這一文件系統(tǒng)。Linux 將新的文件系統(tǒng)通過一個稱為“掛裝”或“掛上”的操作將其掛裝到某個目錄上,從而讓不同的文件系統(tǒng)結合成為一個整體。Linux 操作系統(tǒng)的一個重要特點是它支持許多不同類型的文件系統(tǒng)。Linux 中最普遍使用的文件系統(tǒng)是 Ext2,它也是 Linux 土生土長的文件系統(tǒng)。但 Linux 也能夠支持 FAT、VFAT、FAT32、MINIX 等不同類型的文件系統(tǒng),從而可以方便地和其它操作系統(tǒng)交換數(shù)據(jù)。由于 Linux 支持許多不同的文件系統(tǒng),并且將它們組織成了一個統(tǒng)一的虛擬文件系統(tǒng).

虛擬文件系統(tǒng)(VirtualFileSystem,VFS):隱藏了各種硬件的具體細節(jié),把文件系統(tǒng)操作和不同文件系統(tǒng)的具體實現(xiàn)細節(jié)分離了開來,為所有的設備提供了統(tǒng)一的接口,VFS提供了多達數(shù)十種不同的文件系統(tǒng)。虛擬文件系統(tǒng)可以分為邏輯文件系統(tǒng)和設備驅動程序。邏輯文件系統(tǒng)指Linux所支持的文件系統(tǒng),如ext2,fat等,設備驅動程序指為每一種硬件控制器所編寫的設備驅動程序模塊。

虛擬文件系統(tǒng)(VFS)是 Linux 內核中非常有用的一個方面,因為它為文件系統(tǒng)提供了一個通用的接口抽象。VFS 在 SCI 和內核所支持的文件系統(tǒng)之間提供了一個交換層。即VFS在用戶和文件系統(tǒng)之間提供了一個交換層。

VFS在用戶和文件系統(tǒng)之間提供了一個交換層:

7dd1b18e-1e0d-11ee-962d-dac502259ad0.png

在 VFS 上面,是對諸如 open、close、read 和 write 之類的函數(shù)的一個通用 API 抽象。在 VFS 下面是文件系統(tǒng)抽象,它定義了上層函數(shù)的實現(xiàn)方式。它們是給定文件系統(tǒng)(超過 50 個)的插件。文件系統(tǒng)的源代碼可以在 ./linux/fs 中找到。

文件系統(tǒng)層之下是緩沖區(qū)緩存,它為文件系統(tǒng)層提供了一個通用函數(shù)集(與具體文件系統(tǒng)無關)。這個緩存層通過將數(shù)據(jù)保留一段時間(或者隨即預先讀取數(shù)據(jù)以便在需要是就可用)優(yōu)化了對物理設備的訪問。緩沖區(qū)緩存之下是設備驅動程序,它實現(xiàn)了特定物理設備的接口。

因此,用戶和進程不需要知道文件所在的文件系統(tǒng)類型,而只需要象使用 Ext2 文件系統(tǒng)中的文件一樣使用它們。

1.4 設備驅動程序

設備驅動程序是 Linux 內核的主要部分。和操作系統(tǒng)的其它部分類似,設備驅動程序運行在高特權級的處理器環(huán)境中,從而可以直接對硬件進行操作,但正因為如此,任何一個設備驅動程序的錯誤都可能導致操作系統(tǒng)的崩潰。設備驅動程序實際控制操作系統(tǒng)和硬件設備之間的交互。

設備驅動程序提供一組操作系統(tǒng)可理解的抽象接口完成和操作系統(tǒng)之間的交互,而與硬件相關的具體操作細節(jié)由設備驅動程序完成。一般而言,設備驅動程序和設備的控制芯片有關,例如,如果計算機硬盤是 SCSI 硬盤,則需要使用 SCSI 驅動程序,而不是 IDE 驅動程序。

1.5 網(wǎng)絡接口(NET)

提供了對各種網(wǎng)絡標準的存取和各種網(wǎng)絡硬件的支持。網(wǎng)絡接口可分為網(wǎng)絡協(xié)議和網(wǎng)絡驅動程序。網(wǎng)絡協(xié)議部分負責實現(xiàn)每一種可能的網(wǎng)絡傳輸協(xié)議。眾所周知,TCP/IP 協(xié)議是 Internet 的標準協(xié)議,同時也是事實上的工業(yè)標準。

Linux 的網(wǎng)絡實現(xiàn)支持 BSD 套接字,支持全部的TCP/IP協(xié)議。Linux內核的網(wǎng)絡部分由BSD套接字、網(wǎng)絡協(xié)議層和網(wǎng)絡設備驅動程序組成。網(wǎng)絡設備驅動程序負責與硬件設備通訊,每一種可能的硬件設備都有相應的設備驅動程序。

2. Linux Shell

shell是系統(tǒng)的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令并把它送入內核去執(zhí)行,是一個命令解釋器。另外,shell編程語言具有普通編程語言的很多特點,用這種編程語言編寫的shell程序與其他應用程序具有同樣的效果。

目前主要有下列版本的shell。

1.Bourne Shell:是貝爾實驗室開發(fā)的。

2.BASH:是GNU的Bourne Again Shell,是GNU操作系統(tǒng)上默認的shell,大部分linux的發(fā)行套件使用的都是這種shell。

3.Korn Shell:是對Bourne SHell的發(fā)展,在大部分內容上與Bourne Shell兼容。

4.C Shell:是SUN公司Shell的BSD版本。

3. linux 文件系統(tǒng)

文件系統(tǒng)是文件存放在磁盤等存儲設備上的組織方法。Linux系統(tǒng)能支持多種目前流行的文件系統(tǒng),如EXT2、 EXT3、 FAT、 FAT32、 VFAT和ISO9660。

3.1 文件類型

Linux下面的文件類型主要有:

  1. 普通文件:C語言元代碼、SHELL腳本、二進制的可執(zhí)行文件等。分為純文本和二進制。

  2. 目錄文件:目錄,存儲文件的唯一地方。

  3. 鏈接文件:指向同一個文件或目錄的的文件。

  4. 設備文件:與系統(tǒng)外設相關的,通常在/dev下面。分為塊設備和字符設備。

  5. 管道(FIFO)文件: 提供進程之間通信的一種方式

  6. 套接字(socket) 文件:該文件類型與網(wǎng)絡通信有關

可以通過ls –l, file, stat幾個命令來查看文件的類型等相關信息。

3.2 Linux目錄

文件結構是文件存放在磁盤等存貯設備上的組織方法。主要體現(xiàn)在對文件和目錄的組織上;

目錄提供了管理文件的一個方便而有效的途徑。

Linux使用標準的目錄結構,在安裝的時候,安裝程序就已經(jīng)為用戶創(chuàng)建了文件系統(tǒng)和完整而固定的目錄組成形式,并指定了每個目錄的作用和其中的文件類型。

完整的目錄樹可劃分為小的部分,這些小部分又可以單獨存放在自己的磁盤或分區(qū)上。這樣,相對穩(wěn)定的部分和經(jīng)常變化的部分可單獨存放在不同的分區(qū)中,從而方便備份或系統(tǒng)管理。目錄樹的主要部分有 root、/usr、/var、/home 等。這樣的布局可方便在 Linux 計算機之間共享文件系統(tǒng)的某些部分。

7eb0289c-1e0d-11ee-962d-dac502259ad0.png

Linux采用的是樹型結構。最上層是根目錄,其他的所有目錄都是從根目錄出發(fā)而生成的。

微軟的DOS和windows也是采用樹型結構,但是在DOS和windows中這樣的樹型結構的根是磁盤分區(qū)的盤符,有幾個分區(qū)就有幾個樹型結構,他們之間的關系是并列的。最頂部的是不同的磁盤(分區(qū)),如:C,D,E,F(xiàn)等。

但是在linux中,無論操作系統(tǒng)管理幾個磁盤分區(qū),這樣的目錄樹只有一個。從結構上講,各個磁盤分區(qū)上的樹型目錄不一定是并列的。

3.3 Linux磁盤分區(qū)

主分區(qū),擴展分區(qū)和邏輯分區(qū):

linux分區(qū)不同于windows,硬盤和硬盤分區(qū)在Linux都表示為設備.

硬盤分區(qū)一共有三種:主分區(qū),擴展分區(qū)和邏輯分區(qū)。

硬盤的分區(qū)主要分為主分區(qū)(Primary Partion)和擴展分區(qū)(Extension Partion)兩種,主分區(qū)和擴展分區(qū)的數(shù)目之和不能大于四個。

主分區(qū)(Primary Partion):可以馬上被使用但不能再分區(qū)。

擴展分區(qū)(Extension Partion):必須再進行分區(qū)后才能使用,也就是說它必須還要進行二次分區(qū)。

邏輯分區(qū)((Logical Partion)):由擴展分區(qū)建立起來的分區(qū),邏輯分區(qū)沒有數(shù)量上限制。

擴展分區(qū)只不過是邏輯分區(qū)的“容器”,實際上只有主分區(qū)和邏輯分區(qū)進行數(shù)據(jù)存儲。

Linux下硬盤分區(qū)的標識

硬盤分區(qū)的標識一般使用/dev/hd[a-z]X或者/dev/sd[a-z]X來標識,其中[a-z]代表硬盤號,X代表硬盤內的分區(qū)號。

整塊硬盤分區(qū)的塊號標識:Linux下用hda、hdb、sda、sdb 等來標識不同的硬盤;

其中:

IDE接口硬盤:表示為/dev/hda1、/dev/hdb …;

SCSI 接口的硬盤、SATA接口的硬盤表示為/dev/sda、/dev/sdb … … ;

硬盤內的分區(qū):如果X的值是1到4,表示硬盤的主分區(qū)(包含擴展分區(qū));邏輯分區(qū)從是從5開始的,比如/dev/hda5肯定是邏輯分區(qū)了;

例如:

用hda1、hda2、 hda5、hda6 來標識不同的分區(qū)。其中,字母a代表第一塊硬盤,b代表第二塊硬盤,依次類推。而數(shù)字1 代表一塊硬盤的第一個分區(qū)、2 代表第二個分區(qū),依次類推。1 到4 對應的是主分區(qū)(Primary Partition)或擴展分區(qū)(Extension Partition)。從5開始,對應的都是硬盤的邏輯分區(qū)(Logical Partition)。一塊硬盤即使只有一個主分區(qū),邏輯分區(qū)也是從5開始編號的,這點應特別注意。

總結:一個硬盤分區(qū)首先要確認在哪個硬盤,然后再確認它所在硬盤內的哪個分區(qū)。

對于/dev/hda 類似的表示方法,也并不寞生吧;我們在Linux通過fdisk -l 就可以查到硬盤是/dev/hda還是/dev/hdb;

[root@localhost~]#fdisk-l
Disk/dev/hda:80.0GB,80026361856bytes
255heads,63sectors/track,9729cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBootStartEndBlocksIdSystem
/dev/hda1*19707791493+7HPFS/NTFS
/dev/hda2971972970356667+5Extended
/dev/hda5971291515623181bW95FAT32
/dev/hda6291641319767488+83linux
/dev/hda7413255901171938683linux
/dev/hda8559168069767488+83linux
/dev/hda9680796572290062683linux
/dev/hda1096589729578308+82linuxswap/Solaris

請注意第一行, Disk /dev/hda: 80.0 GB, 80026361856 bytes ,這個就是表示機器中只有一個硬盤設備/dev/hda ,體積大小為 80.0G;下面的就是硬盤的分區(qū),每個分區(qū)都有詳細的信息,在這里不詳細說了;

Linux下磁盤分區(qū)和目錄的關系如下:

– 任何一個分區(qū)都必須掛載到某個目錄上。

– 目錄是邏輯上的區(qū)分。分區(qū)是物理上的區(qū)分。

– 磁盤Linux分區(qū)都必須掛載到目錄樹中的某個具體的目錄上才能進行讀寫操作。

– 根目錄是所有Linux的文件和目錄所在的地方,需要掛載上一個磁盤分區(qū)。

3.4 linux主要目錄的功用。

/bin 二進制可執(zhí)行命令

/dev 設備特殊文件

/etc 系統(tǒng)管理和配置文件

/etc/rc.d 啟動的配置文件和腳本

/home 用戶主目錄的基點,比如用戶user的主目錄就是/home/user,可以用~user表示

/lib 標準程序設計庫,又叫動態(tài)鏈接共享庫,作用類似windows里的.dll文件

/sbin 系統(tǒng)管理命令,這里存放的是系統(tǒng)管理員使用的管理程序

/tmp 公用的臨時文件存儲點

/root 系統(tǒng)管理員的主目錄(呵呵,特權階級)

/mnt 系統(tǒng)提供這個目錄是讓用戶臨時掛載其他的文件系統(tǒng)。

/lost+found 這個目錄平時是空的,系統(tǒng)非正常關機而留下“無家可歸”的文件(windows下叫什么.chk)就在這里

/proc 虛擬的目錄,是系統(tǒng)內存的映射??芍苯釉L問這個目錄來獲取系統(tǒng)信息。

/var 某些大文件的溢出區(qū),比方說各種服務的日志文件

/usr 最龐大的目錄,要用到的應用程序和文件幾乎都在這個目錄。其中包含:

/usr/X11R6 存放X window的目錄

/usr/bin 眾多的應用程序

/usr/sbin 超級用戶的一些管理程序

/usr/doc linux文檔

/usr/include linux下開發(fā)和編譯應用程序所需要的頭文件

/usr/lib 常用的動態(tài)鏈接庫和軟件包的配置文件

/usr/man 幫助文檔

/usr/src 源代碼,linux內核的源代碼就放在/usr/src/linux里

/usr/local/bin 本地增加的命令

/usr/local/lib 本地增加的庫

3.5 linux文件系統(tǒng)

文件系統(tǒng)指文件存在的物理空間,linux系統(tǒng)中每個分區(qū)都是一個文件系統(tǒng),都有自己的目錄層次結構。linux會將這些分屬不同分區(qū)的、單獨的文件系統(tǒng)按一定的方式形成一個系統(tǒng)的總的目錄層次結構。一個操作系統(tǒng)的運行離不開對文件的操作,因此必然要擁有并維護自己的文件系統(tǒng)。

1.文件系統(tǒng)類型:

ext2 :早期linux中常用的文件系統(tǒng)
ext3 :ext2的升級版,帶日志功能
RAMFS :內存文件系統(tǒng),速度很快
NFS :網(wǎng)絡文件系統(tǒng),由SUN發(fā)明,主要用于遠程文件共享
MS-DOS :MS-DOS文件系統(tǒng)
VFAT :Windows 95/98 操作系統(tǒng)采用的文件系統(tǒng)
FAT :Windows XP 操作系統(tǒng)采用的文件系統(tǒng)
NTFS:Windows NT/XP 操作系統(tǒng)采用的文件系統(tǒng)
HPFS :OS/2 操作系統(tǒng)采用的文件系統(tǒng)
PROC:虛擬的進程文件系統(tǒng)
ISO9660:大部分光盤所采用的文件系統(tǒng)
ufsSun:OS所采用的文件系統(tǒng)
NCPFS :Novell 服務器所采用的文件系統(tǒng)
SMBFS :Samba 的共享文件系統(tǒng)
XFS :由SGI開發(fā)的先進的日志文件系統(tǒng),支持超大容量文件
JFS :IBM的AIX使用的日志文件系統(tǒng)
ReiserFS:基于平衡樹結構的文件系統(tǒng)
udf:可擦寫的數(shù)據(jù)光盤文件系統(tǒng)

2.文件系統(tǒng)特性:

磁盤分區(qū)完畢后還需要進行格式化(format),之后操作系統(tǒng)才能夠使用這個分區(qū)。格式化的目的是能使操作系統(tǒng)可以使用的文件系統(tǒng)格式(即我們上面提到文件系統(tǒng)類型).

每種操作系統(tǒng)能夠使用的文件系統(tǒng)并不相同. 如windows 98 以前的微軟操作系統(tǒng)主要利用的文件系統(tǒng)是 FAT (或 FAT16),windows 2000 以后的版本有所謂的 NTFS 文件系統(tǒng),至于 Linux 的正統(tǒng)文件系統(tǒng)則為 Ext2 (Linux second extended file system, ext2fs)這一個。此外,在默認的情況下,windows 操作系統(tǒng)是不會認識 Linux 的 Ext2 的。

傳統(tǒng)的磁盤與文件系統(tǒng)之應用中,一個分區(qū)就是只能夠被格式化成為一個文件系統(tǒng),所以我們可以說一個 filesystem 就是一個 partition。但是由于新技術的利用,例如我們常聽到的LVM與軟件磁盤陣列(software raid), 這些技術可以將一個分區(qū)格式化為多個文件系統(tǒng)(例如LVM),也能夠將多個分區(qū)合成一個文件系統(tǒng)(LVM, RAID)!所以說,目前我們在格式化時已經(jīng)不再說成針對 partition 來格式化了, 通常我們可以稱呼一個可被掛載的數(shù)據(jù)為一個文件系統(tǒng)而不是一個分區(qū)喔!

那么文件系統(tǒng)是如何運行的呢?這與操作系統(tǒng)的文件數(shù)據(jù)有關。較新的操作系統(tǒng)的文件數(shù)據(jù)除了文件實際內容外, 通常含有非常多的屬性,例如 Linux 操作系統(tǒng)的文件權限(rwx)與文件屬性(擁有者、群組、時間參數(shù)等)。文件系統(tǒng)通常會將這兩部份的數(shù)據(jù)分別存放在不同的區(qū)塊,權限與屬性放置到 inode 中,至于實際數(shù)據(jù)則放置到 data block 區(qū)塊中。另外,還有一個超級區(qū)塊 (superblock) 會記錄整個文件系統(tǒng)的整體信息,包括 inode 與 block 的總量、使用量、剩余量等。

對于一個磁盤分區(qū)來說,在被指定為相應的文件系統(tǒng)后,整個分區(qū)被分為 1024,2048 和 4096 字節(jié)大小的塊。根據(jù)塊使用的不同,可分為:

超級塊(Superblock): 這是整個文件系統(tǒng)的第一塊空間。包括整個文件系統(tǒng)的基本信息,如塊大小,inode/block的總量、使用量、剩余量,指向空間 inode 和數(shù)據(jù)塊的指針等相關信息。

inode塊(文件索引節(jié)點) : 文件系統(tǒng)索引,記錄文件的屬性。它是文件系統(tǒng)的最基本單元,是文件系統(tǒng)連接任何子目錄、任何文件的橋梁。每個子目錄和文件只有唯一的一個 inode 塊。它包含了文件系統(tǒng)中文件的基本屬性(文件的長度、創(chuàng)建及修改時間、權限、所屬關系)、存放數(shù)據(jù)的位置等相關信息. 在 Linux 下可以通過 “l(fā)s -li” 命令查看文件的 inode 信息。硬連接和源文件具有相同的 inode 。

數(shù)據(jù)塊(Block) :實際記錄文件的內容,若文件太大時,會占用多個block。為了提高目錄訪問效率,Linux還提供了表達路徑與inode對應關系的dentry結構。它描述了路徑信息并連接到節(jié)點inode,它包括各種目錄信息,還指向了inode和超級塊。

就像一本書有封面、目錄和正文一樣。在文件系統(tǒng)中,超級塊就相當于封面,從封面可以得知這本書的基本信息;inode 塊相當于目錄,從目錄可以得知各章節(jié)內容的位置;而數(shù)據(jù)塊則相當于書的正文,記錄著具體內容。

Linux正統(tǒng)的文件系統(tǒng)(如ext2、3等)將硬盤分區(qū)時會劃分出超級塊、inode Table區(qū)塊和data block數(shù)據(jù)區(qū)域。一個文件由一個超級塊、inode和數(shù)據(jù)區(qū)域塊組成。Inode包含文件的屬性(如讀寫屬性、owner等,以及指向數(shù)據(jù)塊的指針),數(shù)據(jù)區(qū)域塊則是文件內容。當查看某個文件時,會先從inode table中查出文件屬性及數(shù)據(jù)存放點,再從數(shù)據(jù)塊中讀取數(shù)據(jù)。

7ee056e8-1e0d-11ee-962d-dac502259ad0.png

我們將 inode與block區(qū)塊用圖解來說明一下,如下圖所示,文件系統(tǒng)先格式化出inode與block的區(qū)塊,假設某一個文件的屬性與權限數(shù)據(jù)是放置到 inode 4號(下圖較小方格內),而這個inode記錄了文件數(shù)據(jù)的實際放置點為 2, 7, 13, 15 這四個 block 號碼,此時我們的操作系統(tǒng)就能夠據(jù)此來排列磁盤的閱讀順序,可以一口氣將四個 block 內容讀出來!那么數(shù)據(jù)的讀取就如同下圖中的箭頭所指定的模樣了。

7eff9b52-1e0d-11ee-962d-dac502259ad0.png

這種數(shù)據(jù)存取的方法我們稱為索引式文件系統(tǒng)(indexed allocation)。那有沒有其他的慣用文件系統(tǒng)可以比較一下?。坑械?,那就是我們慣用的閃盤(閃存),閃盤使用的文件系統(tǒng)一般為 FAT 格式。FAT 這種格式的文件系統(tǒng)并沒有 inode 存在,所以 FAT 沒有辦法將這個文件的所有 block 在一開始就讀取出來。每個 block 號碼都記錄在前一個 block 當中, 其讀取方式有點像下圖所示:

7f2a455a-1e0d-11ee-962d-dac502259ad0.png

上圖中我們假設文件的數(shù)據(jù)依序寫入1->7->4->15號這四個 block 號碼中, 但這個文件系統(tǒng)沒有辦法一口氣就知道四個 block 的號碼,他得要一個一個的將 block 讀出后,才會知道下一個 block 在何處。如果同一個文件數(shù)據(jù)寫入的 block 分散的太過厲害時,則我們的磁盤讀取頭將無法在磁盤轉一圈就讀到所有的數(shù)據(jù), 因此磁盤就會多轉好幾圈才能完整的讀取到這個文件的內容!

**常常會聽到所謂的“碎片整理”吧?**需要碎片整理的原因就是文件寫入的 block 太過于離散了,此時文件讀取的效能將會變的很差所致。這個時候可以透過碎片整理將同一個文件所屬的 blocks 匯整在一起,這樣數(shù)據(jù)的讀取會比較容易?。∠氘斎?,F(xiàn)AT 的文件系統(tǒng)需要經(jīng)常的碎片整理一下,那么 Ext2 是否需要磁盤重整呢?

由于 Ext2 是索引式文件系統(tǒng),基本上不太需要常常進行碎片整理的。但是如果文件系統(tǒng)使用太久, 常常刪除/編輯/新增文件時,那么還是可能會造成文件數(shù)據(jù)太過于離散的問題,此時或許會需要進行重整一下的。不過,老實說,鳥哥倒是沒有在 Linux 操作系統(tǒng)上面進行過 Ext2/Ext3 文件系統(tǒng)的碎片整理說!似乎不太需要啦!

可以用ln命令對一個已經(jīng)存在的文件再建立一個新的連接,而不復制文件的內容。連接有軟連接和硬連接之分,軟連接又叫符號連接。它們各自的特點是:

硬連接:原文件名和連接文件名都指向相同的物理地址。目錄不能有硬連接;硬連接不能跨越文件系統(tǒng)(不能跨越不同的分區(qū))文件在磁盤中只有一個拷貝,節(jié)省硬盤空間;

由于刪除文件要在同一個索引節(jié)點屬于唯一的連接時才能成功,因此可以防止不必要的誤刪除。

符號連接:用ln -s命令建立文件的符號連接符號連接是linux特殊文件的一種,作為一個文件,它的數(shù)據(jù)是它所連接的文件的路徑名。類似windows下的快捷方式。

可以刪除原有的文件而保存連接文件,沒有防止誤刪除功能。

這一段的的內容過于抽象,又是節(jié)點又是數(shù)組的,我已經(jīng)盡量通俗再通俗了,又不好加例子作演示。大家如果還是云里霧里的話,我也沒有什么辦法了,只有先記住,日后在實際應用中慢慢體會、理解了。這也是我學習的一個方法吧。

3.6 文件系統(tǒng)在內核中的表示

內核數(shù)據(jù)結構

Linux內核的VFS子系統(tǒng)可以圖示如下:

7f5208c4-1e0d-11ee-962d-dac502259ad0.png

文件與IO: 每個進程在PCB(Process Control Block)中都保存著一份文件描述符表,文件描述符就是這個表的索引,每個表項都有一個指向已打開文件的指針,現(xiàn)在我們明確一下:已打開的文件在內核中用file結構體表示,文件描述符表中的指針指向file結構體。

在file結構體中維護File Status Flag(file結構體的成員f_flags)和當前讀寫位置(file結構體的成員f_pos)。在上圖中,進程1和進程2都打開同一文件,但是對應不同的file結構體,因此可以有不同的File Status Flag和讀寫位置。file結構體中比較重要的成員還有f_count,表示引用計數(shù)(Reference Count),后面我們會講到,dup、fork等系統(tǒng)調用會導致多個文件描述符指向同一個file結構體,例如有fd1和fd2都引用同一個file結構體,那么它的引用計數(shù)就是2,當close(fd1)時并不會釋放file結構體,而只是把引用計數(shù)減到1,如果再close(fd2),引用計數(shù)就會減到0同時釋放file結構體,這才真的關閉了文件。

每個file結構體都指向一個file_operations結構體,這個結構體的成員都是函數(shù)指針,指向實現(xiàn)各種文件操作的內核函數(shù)。比如在用戶程序中read一個文件描述符,read通過系統(tǒng)調用進入內核,然后找到這個文件描述符所指向的file結構體,找到file結構體所指向的file_operations結構體,調用它的read成員所指向的內核函數(shù)以完成用戶請求。在用戶程序中調用lseek、read、write、ioctl、open等函數(shù),最終都由內核調用file_operations的各成員所指向的內核函數(shù)完成用戶請求。

file_operations結構體中的release成員用于完成用戶程序的close請求,之所以叫release而不叫close是因為它不一定真的關閉文件,而是減少引用計數(shù),只有引用計數(shù)減到0才關閉文件。對于同一個文件系統(tǒng)上打開的常規(guī)文件來說,read、write等文件操作的步驟和方法應該是一樣的,調用的函數(shù)應該是相同的,所以圖中的三個打開文件的file結構體指向同一個file_operations結構體。如果打開一個字符設備文件,那么它的read、write操作肯定和常規(guī)文件不一樣,不是讀寫磁盤的數(shù)據(jù)塊而是讀寫硬件設備,所以file結構體應該指向不同的file_operations結構體,其中的各種文件操作函數(shù)由該設備的驅動程序實現(xiàn)。

每個file結構體都有一個指向dentry結構體的指針,“dentry”是directory entry(目錄項)的縮寫。我們傳給open、stat等函數(shù)的參數(shù)的是一個路徑,例如/home/akaedu/a,需要根據(jù)路徑找到文件的inode。為了減少讀盤次數(shù),內核緩存了目錄的樹狀結構,稱為dentry cache,其中每個節(jié)點是一個dentry結構體,只要沿著路徑各部分的dentry搜索即可,從根目錄/找到home目錄,然后找到akaedu目錄,然后找到文件a。dentry cache只保存最近訪問過的目錄項,如果要找的目錄項在cache中沒有,就要從磁盤讀到內存中。

每個dentry結構體都有一個指針指向inode結構體。inode結構體保存著從磁盤inode讀上來的信息。在上圖的例子中,有兩個dentry,分別表示/home/akaedu/a和/home/akaedu/b,它們都指向同一個inode,說明這兩個文件互為硬鏈接。inode結構體中保存著從磁盤分區(qū)的inode讀上來信息,例如所有者、文件大小、文件類型和權限位等。每個inode結構體都有一個指向inode_operations結構體的指針,后者也是一組函數(shù)指針指向一些完成文件目錄操作的內核函數(shù)。

和file_operations不同,inode_operations所指向的不是針對某一個文件進行操作的函數(shù),而是影響文件和目錄布局的函數(shù),例如添加刪除文件和目錄、跟蹤符號鏈接等等,屬于同一文件系統(tǒng)的各inode結構體可以指向同一個inode_operations結構體。

inode結構體有一個指向super_block結構體的指針。super_block結構體保存著從磁盤分區(qū)的超級塊讀上來的信息,例如文件系統(tǒng)類型、塊大小等。super_block結構體的s_root成員是一個指向dentry的指針,表示這個文件系統(tǒng)的根目錄被mount到哪里,在上圖的例子中這個分區(qū)被mount到/home目錄下。

file、dentry、inode、super_block這幾個結構體組成了VFS的核心概念。對于ext2文件系統(tǒng)來說,在磁盤存儲布局上也有inode和超級塊的概念,所以很容易和VFS中的概念建立對應關系。而另外一些文件系統(tǒng)格式來自非UNIX系統(tǒng)(例如Windows的FAT32、NTFS),可能沒有inode或超級塊這樣的概念,但為了能mount到Linux系統(tǒng),也只好在驅動程序中硬湊一下,在Linux下看FAT32和NTFS分區(qū)會發(fā)現(xiàn)權限位是錯的,所有文件都是rwxrwxrwx,因為它們本來就沒有inode和權限位的概念,這是硬湊出來的。

3.7 掛載文件系統(tǒng)

linux系統(tǒng)中每個分區(qū)都是一個文件系統(tǒng),都有自己的目錄層次結構。linux會將這些分屬不同分區(qū)的、單獨的文件系統(tǒng)按一定的方式形成一個系統(tǒng)的總的目錄層次結構。這里所說的“按一定方式”就是指的掛載。

將一個文件系統(tǒng)的頂層目錄掛到另一個文件系統(tǒng)的子目錄上,使它們成為一個整體,稱為掛載。把該子目錄稱為掛載點.

例如要讀取硬盤中的一個格式化好的分區(qū)、光盤或軟件等設備時,必須先把這些設備對應到某個目錄上,而這個目錄就稱為“掛載點(mount point)”,這樣才可以讀取這些設備。掛載后將物理分區(qū)細節(jié)屏蔽掉,用戶只有統(tǒng)一的邏輯概念。所有的東西都是文件。

注意:

1、掛載點必須是一個目錄。

2、一個分區(qū)掛載在一個已存在的目錄上,這個目錄可以不為空,但掛載后這個目錄下以前的內容將不可用。

對于其他操作系統(tǒng)建立的文件系統(tǒng)的掛載也是這樣。但是需要理解的是:光盤、軟盤、其他操作系統(tǒng)使用的文件系統(tǒng)的格式與linux使用的文件系統(tǒng)格式是不一樣的。光盤是ISO9660;軟盤是fat16或ext2;windows NT是fat16、NTFS;windows98是fat16、fat32;windows2000和windowsXP是fat16、fat32、 NTFS。掛載前要了解linux是否支持所要掛載的文件系統(tǒng)格式。

掛載時使用mount命令,其格式:mount [-參數(shù)] [設備名稱] [掛載點]

其中常用的參數(shù)有:

-t 指定設備的文件系統(tǒng)類型(什么提到的文件類型)

-o 指定掛載文件系統(tǒng)時的選項。有些也可用在/etc/fstab中。常用的有

codepage=XXX代碼頁
iocharset=XXX字符集
ro以只讀方式掛載
rw以讀寫方式掛載
nouser使一般用戶無法掛載
user可以讓一般用戶掛載設備

例如:

  1. 掛載windows的文件系統(tǒng):

1)首先我們使用sudo fdisk -l查看掛載的設備,例如最下面有:/dev/hda5

2)mkdir創(chuàng)建一個目錄,這里的目錄是作為掛在目錄,就是你要把E盤掛到這個目錄下:mk /mnt/winc

3)windows和linux使用的不是一個文件系統(tǒng),一般情況下linux不掛載windows文件系統(tǒng),所以要你手動mount:

#mount-tvfat/dev/hda5/mnt/winc(-tvfat指出這里的文件系統(tǒng)fat32)

現(xiàn)在就可以進入/mnt/winc等目錄讀寫這些文件了。

2.掛載光盤:# mk /mnt/cdrom

#mount-tiso9660/dev/cdrom/mnt/cdrom(關盤的名字一般都是cdrom,這條命令一般都通用)

3.虛擬機共享文件夾:例如在VirtualBox下,主機是Windows,Ubuntu是Guest。共分三步:

1). 首先要安裝虛擬電腦工具包:

在VirtualBox的菜單里選擇”設備”->”安裝虛擬電腦工具包”,你會發(fā)現(xiàn)在Ubuntu桌面上多出一個光盤圖標,這張光盤默認被自動加載到了文件夾/media/cdom0,而且/cdrom自動指向這個文件夾。默認設置下文件管理器會自動打開這張光盤,可以看到里面有個”VBoxLinuxAdditions.run”文件。打開一個命令行終端,依次輸入”cd /cdrom”和”sudo sh ./VBoxLinuxAdditions.run”,不含雙引號,開始安裝工具包。安裝完畢,會用英文提示要重啟Ubuntu,建議立刻重啟。重啟后,比較明顯的變化是鼠標是共享模式,并且剪貼板也和Windows共享了。如果有這些變化,說明虛擬電腦工具包已經(jīng)裝成功。

2). 下一步設置共享文件夾。

在共享文件夾設置窗口中,單擊右側的”添加一個共享文件夾”,路徑選擇你想要共享的Windows文件夾,共享名任取一個自己喜歡的,比如”myshare”,選項read-only是指是否只允許ubuntu讀這個文件夾,請根據(jù)需要選擇這個選項。

3). 在ubuntu下掛載這個共享文件夾:sudo mount -t vboxsf myshare /media/share

其中”myshare”是之前取的共享文件夾的名字,”/media/share”是要掛載到的目標文件.

3.8 自動掛載windows分區(qū)

每次開機訪問windows分區(qū)都要運行mount命令顯然太煩瑣,為什么訪問其他的linux分區(qū)不用使用mount命令呢?

其實,每次開機時,linux自動將需要掛載的linux分區(qū)掛載上了。那么我們是不是可以設定讓linux在啟動的時候也掛載我們希望掛載的分區(qū),如windows分區(qū),以實現(xiàn)文件系統(tǒng)的自動掛載呢?

這是完全可以的。在/etc目錄下有個fstab文件,它里面列出了linux開機時自動掛載的文件系統(tǒng)的列表。我的/etc/fstab文件如下:

/dev/hda2/ext3defaults11
/dev/hda1/bootext3defaults12
none/dev/ptsdevptsgid=5,mode=62000
none/procprocdefaults00
none/dev/shmtmpfsdefaults00
/dev/hda3swapswapdefaults00
/dev/cdrom/mnt/cdromiso9660noauto,codepage=936,iocharset=gb231200
/dev/fd0/mnt/floppyautonoauto,owner,kudzu00
/dev/hdb1/mnt/wincvfatdefaults,codepage=936,iocharset=cp93600
/dev/hda5/mnt/windvfatdefaults,codepage=936,iocharset=cp93600

在/etc/fstab文件里,第一列是掛載的文件系統(tǒng)的設備名,第二列是掛載點,第三列是掛載的文件系統(tǒng)類型,第四列是掛載的選項,選項間用逗號分隔。第五六列不知道是什么意思,還望高手指點。

在最后兩行是我手工添加的windows下的C;D盤,加了codepage=936和iocharset=cp936參數(shù)以支持中文文件名。參數(shù)defaults實際上包含了一組默認參數(shù):

rw 以可讀寫模式掛載

suid 開啟用戶ID和群組ID設置位

dev 可解讀文件系統(tǒng)上的字符或區(qū)塊設備

exec 可執(zhí)行二進制文件

auto 自動掛載

nouser 使一般用戶無法掛載

async 以非同步方式執(zhí)行文件系統(tǒng)的輸入輸出操作

大家可以看到在這個列表里,光驅和軟驅是不自動掛載的,參數(shù)設置為noauto。(如果你非要設成自動掛載,你要確保每次開機時你的光驅和軟驅里都要有盤,呵呵。)

3.9 軟連接、硬鏈接

可以用ln命令對一個已經(jīng)存在的文件再建立一個新的連接,而不復制文件的內容。連接有軟連接和硬連接之分,軟連接又叫符號連接。它們各自的特點是:

硬連接:是給文件一個副本,原文件名和連接文件名都指向相同的物理地址。目錄不能有硬連接;硬連接不能跨越文件系統(tǒng)(不能跨越不同的分區(qū))文件在磁盤中只有一個拷貝,節(jié)省硬盤空間;

修改其中一個,與其連接的文件同時被修改。如果刪除其中任意一個其余的文件將不受影響。

由于刪除文件要在同一個索引節(jié)點屬于唯一的連接時才能成功,因此可以防止不必要的誤刪除。

符號連接(軟連接):用ln -s命令建立文件的符號連接符號連接是linux特殊文件的一種,作為一個文件,它的數(shù)據(jù)是它所連接的文件的路徑名。類似windows下的快捷方式。

當然刪除這個連接,也不會影響到源文件,但對連接文件的使用、引用都是直接調用源文件的。

具體關系可以看下圖:

7f8d46be-1e0d-11ee-962d-dac502259ad0.png

從圖上可以看出硬鏈接和軟鏈接的區(qū)別:

1:硬鏈接原文件和新文件的inode編號一致。而軟鏈接不一樣。

2:對原文件刪除,會導致軟鏈接不可用,而硬鏈接不受影響。

3:對原文件的修改,軟、硬鏈接文件內容也一樣的修改,因為都是指向同一個文件內容的。

3.10 文件目錄管理命令

磁盤和文件空間 :fdisk df du

文件目錄與管理:cd pwd mkdir rmdir ls cp rm mv

查看文件內容 cat、tac、more、less、head 、tail

文件目錄與權限 :chmod chown chgrp umask

文件查找:which、whereis、locate、find、find

4. linux 應用

標準的Linux系統(tǒng)一般都有一套都有稱為應用程序的程序集,它包括文本編輯器、編程語言、X Window、辦公套件、Internet工具和數(shù)據(jù)庫等。

5. linux內核參數(shù)優(yōu)化

內核參數(shù)是用戶和系統(tǒng)內核之間交互的一個接口,通過這個接口,用戶可以在系統(tǒng)運行的同時動態(tài)更新內核配置,而這些內核參數(shù)是通過Linux Proc文件系統(tǒng)存在的。因此,可以通過調整Proc文件系統(tǒng)達到優(yōu)化Linux性能的目的。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10863

    瀏覽量

    211797
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209536
  • 內存管理
    +關注

    關注

    0

    文章

    168

    瀏覽量

    14142

原文標題:要學習Linux,得從Linux 系統(tǒng)結構開始吧!

文章出處:【微信號:浩道linux,微信公眾號:浩道linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    粵嵌長沙嵌入式linux培訓學習路線

    入手,不太現(xiàn)實?! ?、ARM體系結構,其中有匯編?! ?、數(shù)字電路有必要學習,不然你在做底層開發(fā)時真的會不知道怎么看原理圖,起碼也懂與入門?! ?、ARM+
    發(fā)表于 06-02 16:15

    Linux系統(tǒng)學習方法——寫給小白

    Linux也是一個道理,一步一個腳印。對于初學者來說,一定要先看書,從書籍入手,把最基礎的知識都串起來,等到使用的時候才會如魚得水。所以,剛開始學習
    發(fā)表于 08-16 14:14

    學習Linux系統(tǒng)的五條經(jīng)驗總結

    期間把Linux系統(tǒng)安裝到真機硬件上面,因為咱們在學習過程中一定會免不了“折騰”您的Linux操作系統(tǒng)
    發(fā)表于 07-03 06:09

    Linux系統(tǒng)新手學習的11點建議

    隨著Linux應用的擴展許多朋友開始接觸Linux,根據(jù)學習Windwos的經(jīng)驗往往有一些茫然的感覺:不知從何處開始學起。這里介紹
    發(fā)表于 04-15 15:09

    linux怎么學習

    到嵌入式系統(tǒng),我敢說中國的企業(yè)你可以混的很好。1、Linux基礎你挑一個適合你的系統(tǒng),然后在虛擬機安裝它,開始使用它。 如果你想快速學會
    發(fā)表于 06-09 04:35

    小白學習【鴻蒙系統(tǒng)開發(fā)】——學習Linux開始

    ; 3、ping主機IP,可實現(xiàn)連接; 4、開關網(wǎng)卡命令:開:sudo ifconfigxxx up ; 關:sudo ifconfigxxx down; 學習其他指令——命令總結:以上就是基本的學習Linux的基本過程。以后就
    發(fā)表于 11-12 21:48

    linux學習資料下載

    linux學習資料有以下內容:Linux系統(tǒng)管理員指南,Linux基本教程,Linux掃描式教程
    發(fā)表于 10-07 11:22 ?48次下載
    <b class='flag-5'>linux</b><b class='flag-5'>學習</b>資料下載

    Linux系統(tǒng)之miscdevice教程

    Linux系統(tǒng)之miscdevice教程,很好的DSP自學資料,快來學習。
    發(fā)表于 04-15 17:49 ?9次下載

    Linux之chardev_buttom_linux_struc

    Linux之chardev_buttom_linux_struct_poll教程,很好的Linux資料,快來學習
    發(fā)表于 04-15 17:49 ?7次下載

    Linux之chardev_buttom_linux_struc

    Linux之chardev_buttom_linux_struct_timer_debounce教程,很好的Linux自學資料,快來學習。
    發(fā)表于 04-15 17:59 ?5次下載

    如何學習Linux學習Linux的詳細步驟說明

    Linux系統(tǒng)現(xiàn)在越來越滿足人們對技術的要求,因此Linux不論在市場中還是企業(yè)里都備受歡迎,所以學習Linux的人越來越多,那么
    發(fā)表于 01-15 17:17 ?63次下載
    如何<b class='flag-5'>學習</b><b class='flag-5'>Linux</b><b class='flag-5'>學習</b><b class='flag-5'>Linux</b>的詳細步驟說明

    嵌入式linux內核開發(fā)培訓之linux特性

    通常所說的Linux是指Linus Torvald所寫的Linux操作系統(tǒng)內核。誕生開始,Linux
    發(fā)表于 05-12 10:18 ?730次閱讀

    嵌入式Linux系統(tǒng)編程學習之一目錄結構

    嵌入式Linux系統(tǒng)編程學習之一目錄結構文章目錄嵌入式Linux系統(tǒng)編程
    發(fā)表于 11-02 12:06 ?9次下載
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>編程<b class='flag-5'>學習</b>之一目錄<b class='flag-5'>結構</b>

    學習linux內核的一些建議

    學習linux內核,這個可不像學一門語言,c或者java一個月或者3月你就能精通掌握。學習linux內核是需要一步一步循序漸進,掌握正確的linux
    發(fā)表于 05-07 15:20 ?623次閱讀
    <b class='flag-5'>學習</b><b class='flag-5'>linux</b>內核的一些建議

    為什么我們掌握Linux系統(tǒng)編程?

    為什么我們掌握Linux系統(tǒng)編程?
    的頭像 發(fā)表于 05-17 10:00 ?875次閱讀