- Linux命令行與shell腳本編程大全(第4版)
- (美)理查德·布盧姆 克里斯蒂娜·布雷斯納漢
- 6088字
- 2022-08-01 11:42:07
1.1 Linux初探
如果以前從未接觸過Linux,那么你可能不清楚為什么會有這么多不同的Linux版本。在查看Linux軟件包時,你肯定被發行版、LiveDVD、GNU之類的術語搞暈過。初次步入Linux世界會讓人覺得不那么得心應手。在開始學習命令和腳本之前,本章將為你揭開一部分Linux系統的神秘面紗。
Linux系統可劃分為以下4部分。
●Linux內核
●GNU工具
●圖形化桌面環境
●應用軟件
每一部分在Linux系統中各司其職。但就單個部分而言,作用并不是特別大。圖1-1是一個基本結構框圖,展示了各部分是如何彼此協作構成整個Linux系統的。
圖1-1 Linux系統
本節將詳細描述這4部分,幫助你了解它們如何共同構成一個完整的Linux系統。
1.1.1 深入探究Linux內核
Linux系統的核心是內核。內核控制著計算機系統的所有硬件和軟件,在必要時分配硬件,并根據需要執行軟件。
如果你一直都在關注Linux世界,那么肯定聽說過Linus Torvalds。Linus還在赫爾辛基大學上學時就開發了第1版Linux內核。起初他只是想仿造一款Unix系統而已,因為當時Unix操作系統在很多大學非常流行。
完成Linux內核開發工作后,Linus將其發布到了Internet社區并征求改進意見。這個簡單的舉動引發了計算機操作系統領域內的一場革命。很快,Linus就收到了來自世界各地的學生和專業程序員的各種建議。
如果誰都可以修改內核代碼,那么肯定會導致代碼混亂不堪。為簡單起見,Linus擔當起了所有改進建議的把關員。能否將建議代碼并入內核最終取決于Linus。時至今日,在Linux內核代碼開發過程中依然沿用這一思路,只不過是由一組開發人員負責這項任務,不再是Linus一個人了。
內核主要負責以下4種功能。
●系統內存管理
●軟件程序管理
●硬件設備管理
●文件系統管理
下面我們將進一步探究其中的每一項功能。
01.系統內存管理
操作系統內核的主要功能之一是內存管理。內核不僅管理服務器上的可用物理內存,還可以創建并管理虛擬內存(實際并不存在的內存)。
內核通過硬盤上稱為交換空間(swap space)的存儲區域來實現虛擬內存。內核在交換空間和實際的物理內存之間反復交換虛擬內存中的內容。這使得系統以為自己擁有比物理內存更多的可用內存,如圖1-2所示。

圖1-2 Linux系統內存映射
內存被劃分為若干塊,這些塊稱作頁面(page)。內核會將每個內存頁面置于物理內存或交換空間中。然后,內核會維護一張內存頁面表,指明哪些頁面位于物理內存,哪些頁面被交換到了磁盤。
內核會記錄哪些內存頁面正在使用中,自動把一段時間未訪問的內存頁面復制到交換空間區域(稱之為換出,swapping out)——即使還有內存可用。當程序要訪問一個已被換出的內存頁面時,內核必須將物理內存中的另一個頁面換出來為其騰出空間,然后從交換空間換入(swapping in)所請求的頁面。顯然,這個過程要花費時間,并會拖慢運行中的進程。只要Linux系統在運行,為運行中的程序換出內存頁面的過程就不會停歇。
02.軟件程序管理
Linux操作系統稱運行中的程序為進程。進程可以在前臺運行,將輸出顯示在屏幕上;也可以在后臺運行,隱藏到幕后。內核控制著Linux系統如何管理運行在系統中的所有進程。
內核創建了第一個進程(稱為init進程)來啟動系統中所有其他進程。當內核啟動時,它會將init進程載入虛擬內存。內核在啟動其他進程時,會在虛擬內存中給新進程分配一塊專有區域來存儲該進程用到的數據和代碼。
在Linux中,有多種init進程實現,目前最流行的是以下兩種。
●SysVinit:Linux最初使用的是SysVinit(SysV)初始化方法,該方法基于Unix System V初始化方法。盡管如今很多Linux發行版已經不再使用SysVinit了,但在一些比較舊的Linux發行版中還能找到其身影。
●systemd:systemd初始化方法誕生于2010年,現在已經成為Linux發行版中最流行的初始化和進程管理系統。
SysVinit初始化方法使用運行級(runlevel)的概念來決定啟動哪個進程。運行級定義了Linux系統的運行狀態以及每種狀態下應該運行的進程。表1-1顯示了SysVinit初始化方法中定義的各種運行級。
表1-1 SysVinit運行級

/etc/inittab文件定義了系統的默認運行級。特定運行級下啟動的進程是在/etc/rc.d目錄下的各個子目錄中定義的。可以使用runlevel
命令隨時查看當前運行級。
$ runlevel
N 5
$
systemd初始化方法得以流行起來的原因在于能夠根據不同的事件啟動進程。
●系統啟動時
●連接到特定的硬件設備時
●服務啟動時
●建立好網絡連接時
●計時器到期時
systemd方法通過將事件與單元文件(unit file)鏈接來決定運行哪些進程。每個單元文件定義了特定事件發生時要啟動的程序。systemctl
程序允許啟動、停止和列出系統中當前運行的單元文件。
systemd方法將單元文件劃歸為目標(target)。目標定義了Linux系統的特定運行狀態,這和SysVinit運行級的概念類似。在系統啟動時,default.target
單元定義了要啟動的所有單元文件。可以使用systemctl
命令查看當前默認目標:
$ systemctl get-default
graphical.target
$
graphical.target
單元文件定義了多用戶圖形環境運行時要啟動的進程,類似于舊的SysVinit運行級5。
注意 在第4章中,你會看到如何使用ps
命令查看Linux系統中當前運行的進程。
03.硬件設備管理
內核的另一職責是管理硬件。任何Linux系統需要與之通信的設備都必須在內核代碼中加入其驅動程序。驅動程序相當于應用程序和硬件設備的“中間人”,允許內核同設備之間交換數據。向Linux內核中插入設備驅動的方法有兩種。
●將驅動程序編譯入內核
●將設備驅動模塊加入內核
以前,插入設備驅動程序的唯一途徑就是重新編譯內核。每次給系統添加新設備時,都不得不重新編譯一遍內核代碼。隨著Linux內核支持的硬件設備越來越多,這個過程也變得越來越低效。不過好在Linux開發人員設計出了一種更好的方法以將驅動程序插入運行中的內核。
開發人員提出了內核模塊的概念,允許在無須重新編譯內核的情況下將驅動程序插入運行中的內核。另外,當設備不再使用時也可將內核模塊從內核中移走。這種方式極大地簡化和擴展了硬件設備在Linux中的使用。
Linux系統將硬件設備視為一種特殊文件,稱為設備文件。設備文件分為3種。
●字符設備文件
●塊設備文件
●網絡設備文件
字符設備文件對應于每次只能處理一個字符的設備。大多數類型的調制解調器和終端是作為字符設備文件創建的。塊設備文件對應于每次以塊形式處理數據的設備,比如硬盤驅動器。
網絡設備文件對應于采用數據包發送和接收數據的設備,這包括網卡和一個特殊的環回設備,后者允許Linux系統使用常見的網絡編程協議同自身通信。
Linux會為系統的每個設備都創建一種稱為“節點”的特殊文件。與設備的所有通信都是通過設備節點完成的。每個節點都有一個唯一的數值對,以供Linux內核標識。數值對包括一個主設備號和一個次設備號。類似的設備會被劃分到相同的主設備號下。次設備號用于標識主設備組下的某個特定設備。
04.文件系統管理
不同于其他一些操作系統,Linux內核支持通過不同類型的文件系統讀寫硬盤數據。除了自有的多種文件系統,Linux還能夠讀寫其他操作系統(比如Microsoft Windows)的文件系統。內核必須在編譯時就加入對所有要用到的文件系統的支持。表1-2列出了Linux系統可以用來讀寫數據的標準文件系統。
表1-2 Linux文件系統

Linux服務器所訪問的所有硬盤驅動器都必須采用表1-2所列文件系統類型中的一種進行格式化。
Linux內核采用虛擬文件系統(virtual file system,VFS)作為和各種文件系統交互的接口。這為Linux內核與其他類型文件系統之間的通信提供了一個標準接口。當文件系統被掛載和使用時,VFS會在內存中緩存相關信息。
1.1.2 GNU實用工具
除了由內核來控制硬件設備,操作系統還需要實用工具來實現各種標準功能,比如控制文件和程序。盡管Linus創建了Linux系統內核,但他手頭并沒有能夠運行在內核之上的系統實用工具。幸運的是,就在Linus開發內核的同時,有一群人正在Internet上同心協力,模仿Unix操作系統開發一套標準的計算機系統實用工具。
GNU(GNU代表GNU's Not Unix)組織開發出了一套完整的Unix實用工具,但是缺少用于支撐其運行的內核系統。這些實用工具是在開源軟件(open source software,OSS)理念下誕生的。
開源軟件理念允許程序員開發軟件并將其免費發布。所有人都可以使用、修改該軟件,或將其集成進自己的系統,無須支付任何授權費用。Linus的Linux內核和GNU操作系統實用工具結合在一起,產生了一款完整且功能豐富的自由操作系統。
雖然通常將Linux內核和GNU實用工具的結合體稱為Linux,但是你也會在Internet上看到一些Linux純化論者將其稱為GNU/Linux系統,借此致意GNU組織所做的貢獻。
01.核心GNU實用工具
GNU項目旨在為Unix系統管理員打造出一套可用的類Unix環境。這個目標促使該項目移植了很多常見的Unix系統命令行工具。供Linux系統使用的這組核心工具被稱為coreutils(core utilities)軟件包。
GNU coreutils軟件包由3部分構成。
●文件實用工具
●文本實用工具
●進程實用工具
其中每組都包含了一些對Linux系統管理員和程序員至關重要的實用工具。本書將詳細介紹GNU coreutils軟件包中包含的所有工具。
02.shell
GNU/Linux shell是一種特殊的交互式工具,為用戶提供了啟動程序、管理文件系統中的文件以及運行在Linux系統中的進程的途徑。shell的核心是命令行提示符,負責shell的交互部分,允許用戶輸入文本命令,然后解釋命令并在內核中執行。
shell包含一組內部命令,可用于完成復制文件、移動文件、重命名文件、顯示和終止系統中正在運行的程序這類操作。除此之外,shell也允許在命令行提示符中輸入程序的名稱,它會將程序名稱傳遞給內核以啟動程序。
也可以將多個shell命令放入文件中作為程序執行。這些文件稱作shell腳本。凡是能在命令行中執行的命令都可放入shell腳本中作為一組命令執行。這為創建通常需要執行多個命令的實用工具提供了極大的便利。
在Linux系統中,有相當多的shell可供使用。不同的shell有不同的特性,有些適用于創建腳本,有些則適用于管理進程。所有Linux發行版默認的shell都是bash shell。bash shell由GNU項目開發,被作為標準Unix shell(Bourne shell,以其創建者得名)的替代品。bash shell的名字玩的是一個文字游戲,即Bourne again shell。
除了bash shell,本書中還將介紹其他幾種流行的shell,參見表1-3。
表1-3 Linux shell

大多數Linux發行版包含多個shell,不過通常會選擇其中一種作為默認shell。如果你的Linux發行版也是如此,那么不妨嘗試一下不同的shell,看看哪個能滿足需要。
1.1.3 Linux桌面環境
在Linux初期(20世紀90年代期),只有一個簡單的Linux操作系統文本界面可用。這個文本界面允許系統管理員運行程序、控制程序的執行以及在系統中移動文件。
隨著Microsoft Windows的流行,計算機用戶已經不再滿足于陳舊的文本界面了。這推動了OSS社區的更多開發活動,Linux圖形化桌面環境應運而生。
完成工作的方式不止一種,Linux一直以來都以此而聞名,圖形化桌面更是如此。Linux有多種圖形化桌面可供選擇。接下來會介紹其中一些比較流行的桌面環境。
01.X Window軟件
有兩個基本要素決定了你的視頻環境:顯卡和顯示器。要在計算機上顯示絢麗的畫面,Linux軟件就得知道如何同這兩者互通。X Window軟件是圖形顯示的核心部分。
X Window軟件是直接和PC顯卡以及顯示器打交道的底層程序,控制著Linux應用程序如何在計算機上呈現漂亮的窗口和圖形。
Linux并非唯一使用X Window的操作系統,不同的操作系統均有相應的版本。在Linux世界里,能夠實現X Window的軟件包不止一種。Linux最常用的兩種X Window軟件包如下。
●X.org
●Wayland
X.org基于最初的Unix X Window System版本11(常稱作X11),屬于兩者中比較舊的實現。越來越多的Linux發行版正在向更新的Wayland遷移,后者更加安全,也更易于維護。
在首次安裝Linux發行版時,X Window軟件包會檢測顯卡和顯示器,然后創建一個含有必要信息的X Window配置文件。在安裝過程中,你可能會注意到安裝程序會檢測一次顯示器,以此來確定所支持的視頻模式。有時這會造成顯示器黑屏幾秒。由于顯卡和顯示器的種類繁多,因此這個過程可能需要花費一段時間才能完成。
核心的X Window軟件能夠生成圖形化顯示環境,但僅此而已。盡管這已經足以運行單獨的應用程序,但在日常的計算機使用中并不是特別有用,因為沒有桌面環境可供用戶操作文件或是啟動程序。為此,需要一款建立在X Window系統軟件之上的桌面環境。
02.KDE Plasma桌面
KDE(K desktop environment,K桌面環境)最初于1996年作為開源項目發布,能夠生成類似于Microsoft Windows的圖形化桌面環境。如果你是Windows用戶,那么KDE集成了所有你熟悉的特性。圖1-3展示了運行在openSUSE Linux發行版中的KDE桌面當前版本KDE Plasma。

圖1-3 openSUSE Linux系統的KDE Plasma桌面
KDE Plasma桌面允許你在桌面的特定區域放置應用程序圖標和文件圖標。單擊應用程序圖標,Linux系統就會啟動該應用程序。單擊文件圖標,KDE桌面會嘗試確定使用哪種應用程序來處理該文件。
桌面底部的橫條稱為面板(Panel),由4部分構成。
●K菜單:和Windows的開始菜單非常類似,K菜單包含了啟動已安裝應用程序的鏈接。
●程序快捷方式:這些是直接從面板啟動應用程序的快速鏈接。
●任務欄:任務欄顯示著桌面當前正運行的應用程序的圖標。
●小程序:面板上還有一些小應用程序的圖標,經常會根據應用程序的狀態發生變化。
所有的面板功能都和你在Windows中看到的類似。除了桌面功能,KDE項目還開發了大量的可運行在KDE環境中的應用程序。
03.GNOME桌面
GNOME( GNU network object model environment,GNU網絡對象模型環境)是另一個流行的Linux桌面環境。GNOME于1999年首次發布,現已成為許多Linux發行版默認的桌面環境(用得最多的是Red Hat Linux)。
注意 GNOME桌面在2011年發布的第3版中經歷了一次徹底的改變,脫離了大多數使用標準菜單欄和任務欄的桌面的標準觀感,使其界面在多個平臺(比如平板計算機和手機)上更加友好。這一變化引發了一些爭議(參見“其他桌面”一節),但許多Linux狂熱愛好者也逐漸接受了GNOME 3桌面的新面貌。
圖1-4展示了Ubuntu Linux發行版中使用的標準GNOME桌面。

圖1-4 Ubuntu Linux系統的GNOME 3桌面
GNOME 3桌面通過將可用菜單數減少至3個來清理桌面界面。
●Activities(活動):顯示收藏的以及正在運行的應用程序圖標。
●Calendar(日歷):顯示當前日期 / 時間以及系統提示消息。
●System(系統):顯示網絡連接、系統設置以及系統重啟選項。
GNOME 3桌面旨在運行于多種設備之上,所以你從中找不到太多的菜單。要想運行應用程序,必須使用Activities Overview查找,這是Activities菜單的一項搜索功能。
GNOME不會讓KDE搶了風頭,其開發人員也制作了大量與GNOME桌面集成的圖形應用程序。
04.其他桌面
Linux的主要特色之一就是可選擇性,這一點在圖形化桌面世界中表現得尤為明顯。Linux中有大量不同類型的圖形化桌面可用。如果對Linux發行版中的默認桌面不滿意,可以將其更改為其他桌面,非常簡單。
當GNOME桌面項目在版本3中徹底更改了其界面時,許多喜歡GNOME 2觀感的Linux開發人員創建了基于GNOME 2的衍生版本,其中比較流行的有以下兩個。
●Cinnamon:Cinnamon桌面是由Linux Mint發行版于2011年開發的,旨在延續原先的GNOME 2桌面。該桌面目前在包括Ubuntu、Fedora和openSUSE在內的多個Linux發行版中作為選項提供。
●MATE:MATE桌面是由討厭GNOME 3的Arch Linux用戶于2011年開發的。該桌面融入了一些GNOME 3的特性(比如替換了任務欄),但是維持了GNOME 2的整體觀感。
圖1-5展示了Linux Mint發行版中的Cinnamon桌面。

圖1-5 Linux Mint中的Cinnamon桌面
這些炫目的圖形化桌面環境的缺點在于需要可觀的系統資源才能正常運作。在Linux期,其標志和賣點就是能夠運行在那些無力應付Microsoft桌面產品的老舊PC上。但隨著KDE Plasma和GNOME 3桌面的流行,情況發生了變化,如今運行KDE Plasma或GNOME 3桌面所需的內存已經和運行最新的Microsoft桌面環境旗鼓相當。
如果你的PC已經有些年頭,也不用灰心喪氣。Linux開發人員已經聯手讓Linux返璞歸真。他們開發了一些低內存開銷的圖形化桌面應用程序,這些應用程序提供了可以在老舊PC上完美運行的基本功能。
盡管這些圖形化桌面并沒有專為其設計太多應用程序,但仍然可以運行基本的支持文字處理、電子表格、數據庫、繪圖以及多媒體等功能的圖形化應用程序。
表1-4列出了一些可用于低端PC和筆記本計算機的小型Linux圖形化桌面環境。
表1-4 其他Linux圖形化桌面

雖然這些圖形化桌面環境沒有KDE Plasma桌面和GNOME 3桌面那樣漂亮,但它們提供了恰到好處的基本圖形化功能。圖1-6展示了MX Linux發行版所采用的Xfce桌面的外觀。

圖1-6 MX Linux發行版的Xfce桌面
如果你用的是老舊PC,那么不妨試試上述桌面環境的Linux發行版,看看怎么樣。說不定會有驚喜。
- JBoss Weld CDI for Java Platform
- Practical Data Analysis Cookbook
- 高手是如何做產品設計的(全2冊)
- SQL Server 2012數據庫技術及應用(微課版·第5版)
- C/C++算法從菜鳥到達人
- 碼上行動:零基礎學會Python編程(ChatGPT版)
- 機器人Python青少年編程開發實例
- Java虛擬機字節碼:從入門到實戰
- PLC編程及應用實戰
- Unity 5 for Android Essentials
- Python語言實用教程
- Android驅動開發權威指南
- Mastering Elasticsearch(Second Edition)
- Python Interviews
- Visual C++開發寶典