教你看懂 Linux 系統(tǒng)結(jié)構(gòu)

2021-02-25    分類: 網(wǎng)站建設(shè)

Linux系統(tǒng)一般有4個主要部分:

內(nèi)核、shell、文件系統(tǒng)和應(yīng)用程序。內(nèi)核、shell和文件系統(tǒng)一起形成了基本的操作系統(tǒng)結(jié)構(gòu),它們使得用戶可以運行程序、管理文件并使用系統(tǒng)。部分層次結(jié)構(gòu)如圖1-1所示。

在 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)無關(guān))。這個緩存層通過將數(shù)據(jù)保留一段時間(或者隨即預(yù)先讀取數(shù)據(jù)以便在需要是就可用)優(yōu)化了對物理設(shè)備的訪問。緩沖區(qū)緩存之下是設(shè)備驅(qū)動程序,它實現(xiàn)了特定物理設(shè)備的接口。

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

5、設(shè)備驅(qū)動程序

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

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

6、網(wǎng)絡(luò)接口(NET)

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

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

7、Linux shell

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

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

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

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

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

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

8、Linux 文件系統(tǒng)

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

8.1 文件類型

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

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

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

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

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

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

6)套接字(socket) 文件: 該文件類型與網(wǎng)絡(luò)通信有關(guān)

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

8.2 Linux目錄

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

對于其他操作系統(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è)備名稱] [掛載點]

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

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

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

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

例如:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/dev/hda2 / ext3 defaults 1 1/dev/hda1 /boot ext3 defaults 1 2none /dev/pts devpts gid=5,mode=620 0 0none /proc proc defaults 0 0none /dev/shm tmpfs defaults 0 0/dev/hda3 swap swap defaults 0 0/dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0/dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0/dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0

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

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

rw 以可讀寫模式掛載

suid 開啟用戶ID和群組ID設(shè)置位

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

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

auto 自動掛載

nouser 使一般用戶無法掛載

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

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

8.8 .軟連接、硬鏈接

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

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

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

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

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

當(dāng)然刪除這個連接,也不會影響到源文件,但對連接文件的使用、引用都是直接調(diào)用源文件的。

具體關(guān)系可以看下圖:

一文看懂 Linux 系統(tǒng)結(jié)構(gòu)

圖5:軟鏈接和硬鏈接

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

1:硬鏈接原文件和新文件的inode編號一致。而軟鏈接不一樣。2:對原文件刪除,會導(dǎo)致軟鏈接不可用,而硬鏈接不受影響。3:對原文件的修改,軟、硬鏈接文件內(nèi)容也一樣的修改,因為都是指向同一個文件內(nèi)容的。

8.9.文件目錄管理命令

磁盤和文件空間 :fdisk df du

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

查看文件內(nèi)容 cat、tac、more、less、head 、tail

文件目錄與權(quán)限 :chmod chown chgrp umask

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

9、Linux 應(yīng)用

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

10、Linux內(nèi)核參數(shù)優(yōu)化

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

網(wǎng)站名稱:教你看懂 Linux 系統(tǒng)結(jié)構(gòu)
文章分享:http://www.muchs.cn/news41/102841.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、軟件開發(fā)、微信小程序、品牌網(wǎng)站建設(shè)搜索引擎優(yōu)化、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化