自學Linux Shell1.1-Linux初識

點擊返回 自學Linux命令行與Shell腳本之路html

1.1-Linux初識(架構、內核、shell)

1. Linux架構

Linux系統通常有4個主要部分:內核、shell、文件系統和應用程序。(有的書籍分爲硬件、內核、系統調用和應用程序linux

內核、shell和文件系統一塊兒造成了基本的操做系統結構,它們使得用戶能夠運行程序、管理文件並使用系統。部分層次結構如圖所示。程序員

 

最內層是計算機資源(硬件),最外層是用戶經常使用的應用; 硬件是物質基礎,而應用提供服務。算法

Linux首先啓動內核 (kernel),內核是一段計算機程序,這個程序直接管理管理硬件,包括CPU、內存空間、硬盤接口、網絡接口等等。全部的計算機操做都要經過內核傳遞給硬件。shell

爲了方便調用內核,Linux將內核的功能接口製做成系統調用(system call)。SCI 層提供了某些機制執行從用戶空間到內核的函數調用。這個接口依賴於體系結構,甚至在相同的處理器家族內也是如此。SCI 其實是一個很是有用的函數調用多路複用和多路分解服務。在 ./linux/kernel 中您能夠找到 SCI 的實現,並在 ./linux/arch 中找到依賴於體系結構的部分。編程

系統調用看起來就像C語言的函數。你能夠在程序中直接調用。Linux系統有兩百多個這樣的系統調用。用戶不須要了解內核的複雜結構,就可使用內核。系統調用是操做系統的最小功能單位。一個操做系統,以及基於操做系統的應用,都不可能實現超越系統調用的功能。一個系統調用函數就像是漢字的一個筆畫。任何一個漢字都要由基本的筆畫(點、橫、撇等等)構成。我不能臆造筆畫。緩存

系統調用提供的功能很是基礎,因此使用起來很麻煩。一個簡單的給變量分配內存空間的操做,就須要動用多個系統調用。Linux定義一些庫函數(library routine)來將系統調用組合成某些經常使用的功能。上面的分配內存的操做,能夠定義成一個庫函數(像malloc()這樣的函數)。再好比說,在讀取文件的時候,系統調用要求咱們設置好所須要的緩衝。我可使用Standard IO庫中的讀取函數。這個讀取函數既負責設置緩衝,又負責使用讀取的系統調用函數。使用庫函數對於機器來講並無效率上的優點,但能夠把程序員從細節中解救出來。庫函數就像是漢字的偏旁部首,它由筆畫組成,但使用偏旁部首更容易組成字,好比"鐵"。固然,你也徹底能夠不使用庫函數,而直接調用系統函數,就像「人」字同樣,不用偏旁部首。(實際上,一個操做系統要稱得上是UNIX系統,必需要擁有一些庫函數,好比ISO C標準庫,POSIX標準等。)服務器

shell是一個特殊的應用。不少用戶將它稱爲命令行。shell是一個命令解釋器(interpreter),一個shell對應一個終端 (terminal)。網絡

應用是一個程序,它能夠架構

  • 直接調用系統函數
  • 調用庫函數
  • 運行shell腳本

這些應用能夠由多種語言開發。最多見的是C語言。

2. Linux內核

內核是操做系統的核心,具備不少最基本功能,它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定着系統的性能和穩定性。

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

2.1 內存管理

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

不過內存管理要管理的可不止 4KB 緩衝區。Linux 提供了對 4KB 緩衝區的抽象,例如 slab 分配器。這種內存管理模式使用 4KB 緩衝區爲基數,而後從中分配結構,並跟蹤內存頁使用狀況,好比哪些內存頁是滿的,哪些頁面沒有徹底使用,哪些頁面爲空。這樣就容許該模式根據系統須要來動態調整內存使用。
爲了支持多個用戶使用內存,有時會出現可用內存被消耗光的狀況。因爲這個緣由,頁面能夠移出內存並放入磁盤中。這個過程稱爲交換,由於頁面會被從內存交換到硬盤上。內存管理的源代碼能夠在 ./linux/mm 中找到。

2.2 進程管理(軟件程序管理)

進程實際是某特定應用程序的一個運行實體。

內核建立第一個進程init進程來啓動系統上全部其餘進程,當內核啓動後,將init進程加載到虛擬內存中,而後啓動其餘進程時候都會在虛擬內存中給新進程分配一塊專有區域存儲該進程用到的數據和代碼。

大部分linux發行版會使用一個表管理系統開機時自啓動的進程,放置於/etc/inittab中;   其餘系統會放置於/etc/init.d中,經過/etc/rc.X.d目錄下的入口啓動。

在 Linux  系統中,可以同時運行多個進程,Linux  經過在短的時間間隔內輪流運行這些進程而實現「多任務」。這一短的時間間隔稱爲「時間片」,讓進程輪流運行的方法稱爲「進程調度」 ,完成調度的程序稱爲調度程序。

進程調度控制進程對CPU的訪問。當須要選擇下一個進程運行時,由調度程序選擇最值得運行的進程。可運行進程其實是僅等待CPU資源的進程,若是某個進程在等待其它資源,則該進程是不可運行進程。Linux使用了比較簡單的基於優先級的進程調度算法選擇新的進程。

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

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

Linux系統有7個運行級別(runlevel)

  • 運行級別0:系統停機狀態,系統默認運行級別不能設爲0,不然不能正常啓動
  • 運行級別1:單用戶工做狀態,root權限,用於系統維護,禁止遠程登錄
  • 運行級別2:多用戶狀態(沒有NFS)
  • 運行級別3:徹底的多用戶狀態(有NFS),登錄後進入控制檯命令行模式
  • 運行級別4:系統未使用,保留
  • 運行級別5:X11控制檯,登錄後進入圖形GUI模式
  • 運行級別6:系統正常關閉並重啓,默認運行級別不能設爲6,不然不能正常啓動

運行級別的原理:

  • 在目錄/etc/rc.d/init.d下有許多服務器腳本程序,通常稱爲服務(service)
  • 在/etc/rc.d下有7個名爲rcN.d的目錄,對應系統的7個運行級別
  • rcN.d目錄下都是一些符號連接文件,這些連接文件都指向init.d目錄下的service腳本文件,命名規則爲K+nn+服務名或S+nn+服務名,其中nn爲兩位數字。
  • 系統會根據指定的運行級別進入對應的rcN.d目錄,並按照文件名順序檢索目錄下的連接文件
     對於以K開頭的文件,系統將終止對應的服務
     對於以S開頭的文件,系統將啓動對應的服務
  • 查看運行級別用:runlevel
  • 進入其它運行級別用:init N
  • init0爲關機,init 6爲重啓系統

    因爲如今的Linux系統安裝完後就運行在第5個級別,即系統啓動後直接進入圖形界面,而不用在字符模式下登陸後用startx或者xinit 來起動圖形界面。

2.3 設備驅動程序(硬件管理)

設備驅動程序是 Linux  內核的主要部分。和操做系統的其它部分相似,設備驅動程序運行在高特權級的處理器環境中,從而能夠直接對硬件進行操做,但正由於如此,任何一個設備驅動程序的錯誤均可能致使操做系統的崩潰。設備驅動程序實際控制操做系統和硬件設備之間的交互。

設備驅動程序提供一組操做系統可理解的抽象接口完成和操做系統之間的交互,而與硬件相關的具體操做細節由設備驅動程序完成。通常而言,設備驅動程序和設備的控制芯片有關,例如,若是計算機硬盤是 SCSI  硬盤,則須要使用 SCSI  驅動程序,而不是 IDE 驅動程序。

2.4 文件系統管理 

和 DOS 等操做系統不一樣,Linux 操做系統中單獨的文件系統並非由驅動器號或驅動器名稱(如 A:  或 C:  等)來標識的。相反,和 UNIX  操做系統同樣,Linux 操做系統將獨立的文件系統組合成了一個層次化的樹形結構,而且由一個單獨的實體表明這一文件系統。Linux  將新的文件系統經過一個稱爲「掛裝」或「掛上」的操做將其掛裝到某個目錄上,從而讓不一樣的文件系統結合成爲一個總體。Linux  操做系統的一個重要特色是它支持許多不一樣類型的文件系統。Linux 中最廣泛使用的文件系統是 Ext2,它也是 Linux  土生土長的文件系統。但 Linux  也可以支持 FAT、VFAT、FAT3二、MINIX 等不一樣類型的文件系統,從而能夠方便地和其它操做系統交換數據。因爲 Linux  支持許多不一樣的文件系統,而且將它們組織成了一個統一的虛擬文件系統.

虛擬文件系統(VirtualFileSystem,VFS):隱藏了各類硬件的具體細節,把文件系統操做和不一樣文件系統的具體實現細節分離了開來,爲全部的設備提供了統一的接口,VFS提供了多達數十種不一樣的文件系統。虛擬文件系統能夠分爲邏輯文件系統和設備驅動程序。邏輯文件系統指Linux所支持的文件系統,如ext2,fat等,設備驅動程序指爲每一種硬件控制器所編寫的設備驅動程序模塊。

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

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

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

文件系統層之下是緩衝區緩存,它爲文件系統層提供了一個通用函數集(與具體文件系統無關)。這個緩存層經過將數據保留一段時間(或者隨即預先讀取數據以便在須要是就可用)優化了對物理設備的訪問。緩衝區緩存之下是設備驅動程序,它實現了特定物理設備的接口。

所以,用戶和進程不須要知道文件所在的文件系統類型,而只須要象使用 Ext2  文件系統中的文件同樣使用它們。

2.5  網絡接口(NET)   

提供了對各類網絡標準的存取和各類網絡硬件的支持。網絡接口可分爲網絡協議和網絡驅動程序。網絡協議部分負責實現每一種可能的網絡傳輸協議。衆所周知,TCP/IP  協議是 Internet  的標準協議,同時也是事實上的工業標準。

Linux  的網絡實現支持 BSD 套接字,支持所有的TCP/IP協議。Linux內核的網絡部分由BSD套接字、網絡協議層和網絡設備驅動程序組成。網絡設備驅動程序負責與硬件設備通信,每一種可能的硬件設備都有相應的設備驅動程序。

3 . linux shell

shell是系統的用戶界面,提供了用戶與內核進行交互操做的一種接口。它接收用戶輸入的命令並把它送入內核去執行,是一個命令解釋器。另外,shell編程語言具備普通編程語言的不少特色,用這種編程語言編寫的shell程序與其餘應用程序具備一樣的效果。
目前主要有下列版本的shell。
1.Bourne Shell:是貝爾實驗室開發的。
2.BASH:是GNU的Bourne Again Shell,是GNU操做系統上默認的shell,大部分linux的發行套件使用的都是這種shell。3.Korn Shell:是對Bourne SHell的發展,在大部份內容上與Bourne Shell兼容。4.C Shell:是SUN公司Shell的BSD版本。

相關文章
相關標籤/搜索