1. 
          

          1. 新聞動(dòng)態(tài)

            Linux系統結構詳解

            網(wǎng)站建設 發(fā)布者:cya 2020-01-01 09:25 訪(fǎng)問(wèn)量:147

            來(lái)自:真實(shí)的歸宿-CSDN博客

            鏈接:http://blog.csdn.net/hguisu/article/details/6122513

            Linux系統一般有4個(gè)主要部分:


            內核、shell、文件系統和應用程序。內核、shell和文件系統一起形成了基本的操作系統結構,它們使得用戶(hù)可以運行程序、管理文件并使用系統。部分層次結構如圖1-1所示。




            一、linux內核


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


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


            圖1


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


            1、內存管理 


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


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


            為了支持多個(gè)用戶(hù)使用內存,有時(shí)會(huì )出現可用內存被消耗光的情況。由于這個(gè)原因,頁(yè)面可以移出內存并放入磁盤(pán)中。這個(gè)過(guò)程稱(chēng)為交換,因為頁(yè)面會(huì )被從內存交換到硬盤(pán)上。內存管理的源代碼可以在 ./linux/mm 中找到。


            2、進(jìn)程管理


            進(jìn)程實(shí)際是某特定應用程序的一個(gè)運行實(shí)體。在 Linux  系統中,能夠同時(shí)運行多個(gè)進(jìn)程,Linux  通過(guò)在短的時(shí)間間隔內輪流運行這些進(jìn)程而實(shí)現“多任務(wù)”。這一短的時(shí)間間隔稱(chēng)為“時(shí)間片”,讓進(jìn)程輪流運行的方法稱(chēng)為“進(jìn)程調度” ,完成調度的程序稱(chēng)為調度程序。


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


            通過(guò)多任務(wù)機制,每個(gè)進(jìn)程可認為只有自己獨占計算機,從而簡(jiǎn)化程序的編寫(xiě)。每個(gè)進(jìn)程有自己?jiǎn)为毜牡刂房臻g,并且只能由這一進(jìn)程訪(fǎng)問(wèn),這樣,操作系統避免了進(jìn)程之間的互相干擾以及“壞”程序對系統可能造成的危害。 為了完成某特定任務(wù),有時(shí)需要綜合兩個(gè)程序的功能,例如一個(gè)程序輸出文本,而另一個(gè)程序對文本進(jìn)行排序。為此,操作系統還提供進(jìn)程間的通訊機制來(lái)幫助完成這樣的任務(wù)。Linux 中常見(jiàn)的進(jìn)程間通訊機制有信號、管道、共享內存、信號量和套接字等。


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


            3、 文件系統 


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


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


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


            VFS         在用戶(hù)和文件系統之間提供了一個(gè)交換層:




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


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


            因此,用戶(hù)和進(jìn)程不需要知道文件所在的文件系統類(lèi)型,而只需要象使用 Ext2  文件系統中的文件一樣使用它們。


            4、設備驅動(dòng)程序 


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


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


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


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


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


            二、linux shell


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


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


            1、Bourne Shell:是貝爾實(shí)驗室開(kāi)發(fā)的。
            2、BASH:是GNU的Bourne Again Shell,是GNU操作系統上默認的shell,大部分linux的發(fā)行套件使用的都是這種shell。
            3、Korn Shell:是對Bourne SHell的發(fā)展,在大部分內容上與Bourne Shell兼容。
            4、C Shell:是SUN公司Shell的BSD版本。


            三。linux 文件系統


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


            3.1 文件類(lèi)型


            Linux下面的文件類(lèi)型主要有:


            1) 普通文件:C語(yǔ)言元代碼、SHELL腳本、二進(jìn)制的可執行文件等。分為純文本和二進(jìn)制。
            2) 目錄文件:目錄,存儲文件的唯一地方。
            3) 鏈接文件:指向同一個(gè)文件或目錄的的文件。
            4) 設備文件:與系統外設相關(guān)的,通常在/dev下面。分為塊設備和字符設備。

            5)管道(FIFO)文件 :  提供進(jìn)程建通信的一種方式
            6)套接字(socket) 文件: 該文件類(lèi)型與網(wǎng)絡(luò )通信有關(guān)


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


            3.2  Linux目錄


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


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


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


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


            圖2


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


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


            但是在linux中,無(wú)論操作系統管理幾個(gè)磁盤(pán)分區,這樣的目錄樹(shù)只有一個(gè)。從結構上講,各個(gè)磁盤(pán)分區上的樹(shù)型目錄不一定是并列的。


            3.3 Linux磁盤(pán)分區


            一、主分區,擴展分區和邏輯分區: 


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


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


            硬盤(pán)的分區主要分為主分區(Primary Partion)和擴展分區(Extension Partion)兩種,主分區和擴展分區的數目之和不能大于四個(gè)。


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


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


            邏輯分區((Logical Partion)):由擴展分區建立起來(lái)的分區。邏輯分區沒(méi)有數量上限制。


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


            二、Linux下硬盤(pán)分區的標識


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


            整塊硬盤(pán)分區的塊號標識:Linux下用hda、hdb、sda、sdb 等來(lái)標識不同的硬盤(pán);


            其中:


            IDE接口硬盤(pán):表示為/dev/hda1、/dev/hdb …;


            SCSI 接口的硬盤(pán)、SATA接口的硬盤(pán)表示為/dev/sda、/dev/sdb … … ;


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


            例如:


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


            總結:一個(gè)硬盤(pán)分區首先要大確認在哪個(gè)硬盤(pán),然后再確認它所在硬盤(pán)內的哪個(gè)分區。


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

                [root@localhost ~]# fdisk -l        
               Disk /dev/hda: 80.0 GB, 80026361856 bytes     255 heads, 63 sectors/track, 9729 cylinders     Units = cylinders of 16065 * 512 = 8225280 bytes      Device Boot Start End Blocks Id System     /dev/hda1 * 1 970 7791493+ 7 HPFS/NTFS     /dev/hda2 971 9729 70356667+ 5 Extended     /dev/hda5 971 2915 15623181 b W95 FAT32     /dev/hda6 2916 4131 9767488+ 83 linux     /dev/hda7 4132 5590 11719386 83 linux     /dev/hda8 5591 6806 9767488+ 83 linux     /dev/hda9 6807 9657 22900626 83 linux     /dev/hda10 9658 9729 578308+ 82 linux swap / Solaris

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


            Linux下磁盤(pán)分區和目錄的關(guān)系如下:


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

            – 目錄是邏輯上的區分。分區是物理上的區分。

            – 磁盤(pán)Linux分區都必須掛載到目錄樹(shù)中的某個(gè)具體的目錄上才能進(jìn)行讀寫(xiě)操作。

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


            3.4 linux主要目錄的功用。

               /bin 二進(jìn)制可執行命令     
              /dev 設備特殊文件     /etc 系統管理和配置文件     /etc/rc.d 啟動(dòng)的配置文件和腳本     /home 用戶(hù)主目錄的基點(diǎn),比如用戶(hù)user的主目錄就是/home/user,可以用~user表示     /lib 標準程序設計庫,又叫動(dòng)態(tài)鏈接共享庫,作用類(lèi)似windows里的.dll文件     /sbin 系統管理命令,這里存放的是系統管理員使用的管理程序     /tmp 公用的臨時(shí)文件存儲點(diǎn)     /root 系統管理員的主目錄(呵呵,特權階級)     /mnt 系統提供這個(gè)目錄是讓用戶(hù)臨時(shí)掛載其他的文件系統。    /lost+found 這個(gè)目錄平時(shí)是空的,系統非正常關(guān)機而留下“無(wú)家可歸”的文件(windows下叫什么.chk)就在這里     /proc 虛擬的目錄,是系統內存的映射??芍苯釉L(fǎng)問(wèn)這個(gè)目錄來(lái)獲取系統信息。    /var 某些大文件的溢出區,比方說(shuō)各種服務(wù)的日志文件     /usr 最龐大的目錄,要用到的應用程序和文件幾乎都在這個(gè)目錄。其中包含:          /usr/X11R6 存放X window的目錄           /usr/bin 眾多的應用程序           /usr/sbin 超級用戶(hù)的一些管理程序           /usr/doc linux文檔           /usr/include linux下開(kāi)發(fā)和編譯應用程序所需要的頭文件           /usr/lib 常用的動(dòng)態(tài)鏈接庫和軟件包的配置文件           /usr/man 幫助文檔           /usr/src 源代碼,linux內核的源代碼就放在/usr/src/linux里           /usr/local/bin 本地增加的命令           /usr/local/lib 本地增加的庫

            3.5  linux文件系統


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


            1、文件系統類(lèi)型:


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


            2、文件系統特性:


            磁盤(pán)分區完畢后還需要進(jìn)行格式化(format),之后操作系統才能夠使用這個(gè)分區。格式化的目的是能使操作系統可以使用的文件系統格式(即我們上面提到文件系統類(lèi)型).


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


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


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


            對于一個(gè)磁盤(pán)分區來(lái)說(shuō),在被指定為相應的文件系統后,整個(gè)分區被分為 1024,2048 和 4096 字節大小的塊。根據塊使用的不同,可分為:


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


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


            3、數據塊(Block) :實(shí)際記錄文件的內容,若文件太大時(shí),會(huì )占用多個(gè) block。為了提高目錄訪(fǎng)問(wèn)效率,Linux 還提供了表達路徑與 inode 對應關(guān)系的 dentry 結構。它描述了路徑信息并連接到節點(diǎn) inode,它包括各種目錄信息,還指向了 inode 和超級塊。


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


            Linux正統的文件系統(如ext2、3等)將硬盤(pán)分區時(shí)會(huì )劃分出超級塊、inode Table區塊和data block數據區域。一個(gè)文件由一個(gè)超級塊、inode和數據區域塊組成。Inode包含文件的屬性(如讀寫(xiě)屬性、owner等,以及指向數據塊的指針),數據區域塊則是文件內容。當查看某個(gè)文件時(shí),會(huì )先從inode table中查出文件屬性及數據存放點(diǎn),再從數據塊中讀取數據。


            ext2文件系統示意圖


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



            圖 inode/block 數據存取示意圖


            這種數據存取的方法我們稱(chēng)為索引式文件系統(indexed allocation)。那有沒(méi)有其他的慣用文件系統可以比較一下???有的,那就是我們慣用的閃盤(pán)(閃存),閃盤(pán)使用的文件系統一般為 FAT 格式。FAT 這種格式的文件系統并沒(méi)有 inode 存在,所以 FAT 沒(méi)有辦法將這個(gè)文件的所有 block 在一開(kāi)始就讀取出來(lái)。每個(gè) block 號碼都記錄在前一個(gè) block 當中, 其讀取方式有點(diǎn)像下圖所示:



            圖、FAT文件系統數據存取示意圖


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


            常常會(huì )聽(tīng)到所謂的“碎片整理”吧? 需要碎片整理的原因就是文件寫(xiě)入的 block 太過(guò)于離散了,此時(shí)文件讀取的效能將會(huì )變的很差所致。 這個(gè)時(shí)候可以透過(guò)碎片整理將同一個(gè)文件所屬的 blocks 匯整在一起,這樣數據的讀取會(huì )比較容易??! 想當然爾,FAT 的文件系統需要經(jīng)常的碎片整理一下,那么 Ext2 是否需要磁盤(pán)重整呢?


            由于 Ext2 是索引式文件系統,基本上不太需要常常進(jìn)行碎片整理的。但是如果文件系統使用太久, 常常刪除/編輯/新增文件時(shí),那么還是可能會(huì )造成文件數據太過(guò)于離散的問(wèn)題,此時(shí)或許會(huì )需要進(jìn)行重整一下的。不過(guò),老實(shí)說(shuō),鳥(niǎo)哥倒是沒(méi)有在 Linux 操作系統上面進(jìn)行過(guò) Ext2/Ext3 文件系統的碎片整理說(shuō)!似乎不太需要啦!^_^


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

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


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


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


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


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


            3.6 文件系統在內核中的表示


            內核數據結構


            Linux內核的VFS子系統可以圖示如下:



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


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


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


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


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


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


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


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


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


            3.6  掛載文件系統


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


            將一個(gè)文件系統的頂層目錄掛到另一個(gè)文件系統的子目錄上,使它們成為一個(gè)整體,稱(chēng)為掛載。把該子目錄稱(chēng)為掛載點(diǎn).


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


            注意:1、掛載點(diǎn)必須是一個(gè)目錄。


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


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

            掛載時(shí)使用mount命令,其格式:mount [-參數] [設備名稱(chēng)] [掛載點(diǎn)]
            其中常用的參數有


            -t 指定設備的文件系統類(lèi)型(什么提到的文件類(lèi)型)
            -o 指定掛載文件系統時(shí)的選項。有些也可用在/etc/fstab中。常用的有

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

            例如:


            1、掛載windows的文件系統:

            1)首先我們使用sudo fdisk -l查看掛載的設備,例如最下面有:/dev/hda5
            2)mkdir創(chuàng )建一個(gè)目錄,這里的目錄是作為掛在目錄,就是你要把E盤(pán)掛到這個(gè)目錄下:mk /mnt/winc
            3)windows和linux使用的不是一個(gè)文件系統,一般情況下linux不掛載windows文件系統,所以要你手動(dòng)mount:
            # mount -t vfat /dev/hda5 /mnt/winc  ( -t vfat指出這里的文件系統fat32)
            現在就可以進(jìn)入/mnt/winc等目錄讀寫(xiě)這些文件了。


            2、掛載光盤(pán):# mk /mnt/cdrom


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


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


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


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


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


            3). 在ubuntu下掛載這個(gè)共享文件夾:sudo mount -t vboxsf myshare /media/share
            其中”myshare”是之前取的共享文件夾的名字,”/media/share”是要掛載到的目標文件.


            3.7  自動(dòng)掛載windows分區


            每次開(kāi)機訪(fǎng)問(wèn)windows分區都要運行mount命令顯然太煩瑣,為什么訪(fǎng)問(wèn)其他的linux分區不用使用mount命令呢?


            其實(shí),每次開(kāi)機時(shí),linux自動(dòng)將需要掛載的linux分區掛載上了。那么我們是不是可以設定讓linux在啟動(dòng)的時(shí)候也掛載我們希望掛載的分區,如windows分區,以實(shí)現文件系統的自動(dòng)掛載呢?


            這是完全可以的。在/etc目錄下有個(gè)fstab文件,它里面列出了linux開(kāi)機時(shí)自動(dòng)掛載的文件系統的列表。我的/etc/fstab文件如下:

               /dev/hda2 / ext3 defaults 1 1        
              /dev/hda1 /boot ext3 defaults 1 2        
              none /dev/pts devpts gid=5,mode=620 0 0        
              none /proc proc defaults 0 0        
              none /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文件里,第一列是掛載的文件系統的設備名,第二列是掛載點(diǎn),第三列是掛載的文件系統類(lèi)型,第四列是掛載的選項,選項間用逗號分隔。第五六列不知道是什么意思,還望高手指點(diǎn)。


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


            rw 以可讀寫(xiě)模式掛載
            suid 開(kāi)啟用戶(hù)ID和群組ID設置位
            dev 可解讀文件系統上的字符或區塊設備
            exec 可執行二進(jìn)制文件
            auto 自動(dòng)掛載
            nouser 使一般用戶(hù)無(wú)法掛載
            async 以非同步方式執行文件系統的輸入輸出操作


            大家可以看到在這個(gè)列表里,光驅和軟驅是不自動(dòng)掛載的,參數設置為noauto。(如果你非要設成自動(dòng)掛載,你要確保每次開(kāi)機時(shí)你的光驅和軟驅里都要有盤(pán),呵呵。)


            3.8 .軟連接、硬鏈接


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

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


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


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


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


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


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


            圖5:軟鏈接和硬鏈接


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

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

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

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


            3.9.文件目錄管理命令


            磁盤(pán)和文件空間 :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系統一般都有一套都有稱(chēng)為應用程序的程序集,它包括文本編輯器、編程語(yǔ)言、X Window、辦公套件、Internet工具和數據庫等。


            5、linux內核參數優(yōu)化


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



            關(guān)鍵字: Linux系統結構詳解 開(kāi)封晨展科技

            文章連接: http://www.gostscript.com/wzjss/663.html

            版權聲明:文章由 晨展科技 整理收集,來(lái)源于互聯(lián)網(wǎng)或者用戶(hù)投稿,如有侵權,請聯(lián)系我們,我們會(huì )立即刪除。如轉載請保留

            双腿国产亚洲精品无码不卡|国产91精品无码麻豆|97久久久久久久极品|无码人妻少妇久久中文字幕
                1.