1、X window系統的概念
整個X Window由三個部分組成:
X服務器:是一個運行在本地計算機上的程序。它響應來自X客戶程序的請求,在屏幕上畫圖或者讀取鍵盤或鼠標的輸入,並將它傳給客戶端。
X客戶端:是一個用諸如Xlib, Xt的庫寫成的運用X協議的應用程序。它通過向負責管理自己的X服務器提出對顯示和輸出資源的請求來使用其他計算機的這些資源。
X協議:X Client與X Server之間的通信協議。
一個基於X的應用程序需要運行並顯示內容時他就聯接到X服務器,開始用X協議和服務器交談。
架構:CXS
比如一個X應用程序要在屏幕上輸出一個圓那麼他就用X協議對X服務器說:喂!我需要在屏幕上畫一個圓。
X應用程序只負責告訴X服務器在屏幕的什麼地方用什麼顏色畫一個多大的圓。
而具體的“畫”的動作,比如這個圓如何生成,用什麼顯卡的驅動程序去指揮顯卡完成等等工作是由X服務器來完成的。
2、Linux系統的分區方式和Windows截然不同
一塊硬盤最多只能劃4個主分區
一般劃分區都是只劃一個主分區(Windows一般認作C盤)
然後利用剩下的所有空間建立一個擴展分區(擴展分區在Windows下不被分配盤符,它不會是 C,D,E……盤中的任何一個)
在這個擴展分區下面建立若干個邏輯分區(這些邏輯分區才是Windows下的D,E,F盤等等)
Linux把第一塊硬盤認作hda,第二塊認作hdb,第三塊hdc,以此類推。SCSI硬盤被認作sda,sdb,等等。硬盤的各個分區用數字來表示,比如hda1就是第一塊硬盤上的第一個分區。
注意,數字1-4專門留給主分區和擴展分區,邏輯分區是從數字5開始的,主分區和邏輯部分如果不滿4個則留空。
如有一塊硬盤,上面分了一個主分區,一個擴展分區,擴展分區上建立了3個邏輯分區,那在Linux下被標記為hda1(主分區,即windows下的C),hda2(擴展分區,windows下無標記),hda5(邏輯分區,windows下的D),hda6(邏輯分區,windows下的E),hda7(邏輯分區,windows下的F)。
3、磁盤掛載命令(mount)
(1)作用
掛載文件系統,它的使用權限是超級用戶或/etc/fstab 中允許的使用者。掛載是指把分區和目錄對應的過程,而掛載點是指掛載在文件樹中的位置。mount 命令就可以把文件系統掛載到相應的目錄下,並且由於 Linux 中把設備都當作文件一樣使用,因此,mount 命令也可以掛載不同的設備。
通常,在 Linux 下“/mnt”目錄是專門用於掛載不同的文件系統的,它可以在該目錄下新建不同的子目錄來掛載不同的設備文件系統。
(文件系統內容)將一個文件系統的頂層目錄掛到另一個文件系統的子目錄上,使它們成為一個整體,稱為“安裝(mount)”。把該子目錄稱為“安裝點(mount point)”
(2)格式: mount [選項] [類型] 設備文件名 掛載點目錄
其中的類型是指設備文件的類型。
4、ifconfig
(1)作用
用於查看和配置網絡接口的地址和參數,包括 IP 地址、網絡掩碼、廣播地址,它的使用權限是超級用戶。
(2)格式
ifconfig 有兩種使用格式,分別用於查看和更改網絡接口。
① ifconfig [選項] [網絡接口]:用來查看當前系統的網絡配置情況。
② ifconfig 網絡接口 [選項] 地址:用來配置指定接口(如 eth0,eth1)的 IP 地址、網絡掩碼、廣播地址等。
(3)使用說明
用 ifconfig 命令配置的網絡設備參數不需重啟就可生效,但在機器重新啟動以後將會失效。
5、Linux文件系統(含設備驅動簡介)
文件系統層次結構標准(Filesystem Hierarchy Standard,FHS)定義了Linux操作系統中的主要目錄及目錄內容。在大多數情況下,它是一個傳統BSD文件系統層次結構的形式化與擴充。
Linux系統中把CPU、內存之外所有其他設備都抽象為文件來處理。
進程只和文件系統打交道,具體的細節,由設備管理部分具體實現並為文件系統提供盡可能簡潔統一的接口。
文件系統還同時充當著設備管理接口的角色,用戶進程使用和操作具體的設備,都必須通過文件系統進行。
文件系統是操作系統中與管理文件有關的所有軟件和數據的集合。
不同的操作系統可能采用不同的文件系統。支持多種不同類型的文件系統(多樣性)是Linux操作系統的主要特色之一。
Linux系統自身的文件系稱為ext2,它也是Linux默認的文件系統。
把ext2以及Linux支持的文件系統稱為邏輯文件系統, 通常每一種邏輯文件系統服務於一種特定的操作系統,具有不同的組織結構和文件操作函數,相互之間差別很大。
Linux在傳統的邏輯文件系統的基礎上,增加了一個稱為虛擬文件系統(VFS)的接口層。
系統中所有的設備,包括字符設備、塊設備和網絡設備,都按照某種方式由邏輯文件系統統一管理,邏輯文件系統為它們提供訪問接口
虛擬文件系統在最上層,管理各種邏輯文件系統,屏蔽了它們之間的差異,為用戶命令、函數調用和內核其他部分提供訪問文件和設備的統一接口, 使得不同的邏輯文件系統按照同樣的模式呈現在使用者面前
對於普通用戶來講,覺察不到邏輯文件系統之間的差異,可以使用同樣的命令來操作不同邏輯文件系統所管理的文件,可以在它們之間自由地復制文件
虛擬文件系統只存在於內存中,並沒有真正存在於磁盤分區中,磁盤分區存放的是邏輯文件系統的內容,所有虛擬文件系統的數據結構都是在系統啟動之後才建立完成,並在系統關閉時撤銷。
同時,它必須和其他實際存在於磁盤的文件系統,比如Linux默認的Ext2或者Windows NT的NTFS等邏輯文件系統一起,才能構成一個完整的文件系統。
6、虛擬文件系統又稱虛擬文件系統轉換(Virual Filesystem Switch ,簡稱VFS)。
說它虛擬,是因為它所有的數據結構都是在運行以後才建立,並在卸載時刪除,而在磁盤上並沒有存儲這些數據結構,顯然如果只有VFS,系統是無法工作的,因為它的這些數據結構不能憑空而來,只有與實際的文件系統,如Ext2、Minix、MSDOS、VFAT等相結合,才能開始工作。
所以VFS並不是一個真正的文件系統。與VFS相對,我們稱Ext2、Minix、MSDOS等為具體文件系統。
內核的一個子系統,提供了一個通用文件系統模型,該模型囊括了所能見到的文件系統常用功能和行為,並為應用程序提供一致性的文件系統接口,安裝的所有物理文件系統不但依賴於VFS共存,而且也依靠VFS協同工作。
它的主要設計思想有以下3點:
(1)應用層:VFS模型源於UNIX文件系統,使得用戶可以直接使用標准UNIX文件系統調用來操作文件,無需考慮具體文件系統特性和物理存儲介質,通過VFS訪問文件系統,才使得不同文件系統之間的協作性和通用性成為可能。
(2)虛擬層:在對所有具體文件系統的共同特性進行抽象的基礎上,形成一個與具體文件系統實現無關(如通用命令,都用.on表示開)的虛擬層,並在此層次上定義與用戶的一致性接口。
(3)實現層:該層使用類似開關表技術進行具體文件系統轉接,實現各種文件系統的物理操作細節,每個文件系統是自包含的,包含文件系統實現的各種設施,如超級塊、節點區、數據區以及各種數據結構和文件類的操作函數。
VFS是一個軟件層,是用戶應用程序與具體文件系統實現之間的抽象層:
對用戶界面:一組標准的、抽象的文件操作,以系統調用提供,如read()、write()、open()等。
對具體文件系統界面:主體是file_operations結構,全是函數指針,提供函數跳轉表。
VFS在一個簡單文件復制操作中的作用:
假設用戶輸入命令:$ cp /floppy/TEST /tmp/test
在cp命令中,它通過VFS提供的系統調用接口進行文件操作。
cp命令不用了解test或TEST的具體文件系統,它所看到和操作的對象是VFS。
四個基本對象(VFS中的數據結構):
超級塊(superblock)對象: 存放系統中已安裝文件系統的有關信息
索引節點(inode)對象: 存放關於具體文件的一般信息
目錄項(dentry)對象: 存放目錄項與對應文件進行鏈接的信息
文件(file)對象: 存放打開文件與進程之間進行交互的有關信息
每個主要對象中都包含一個操作對象,這些操作對象描述了內核針對主要對象可以使用的方法。最主要的幾種操作對象如下:
super_operations對象,其中包括內核針對特定文件系統所能調用的方法,比如讀i節點read_inode()和sync_fs()方法等。
inode_operations對象,其中包括內核針對特定文件所能調用的方法,比如create()和link()方法等。
dentry_operations對象,其中包括內核針對特定目錄所能調用的方法,比如d_compare()和d_delete()方法等。
file_operations對象,其中包括,進程針對已打開文件所能調用的方法,比如read()和write()方法等。
除了上述的四個主要對象外,VFS還包含了許多對象,比如每個注冊文件系統都是由file_system_type對象表示——描述了文件系統及其能力(如比如ext3或XFS);另外每一個安裝點也都利用vfsmount對象表示——包含了關於安裝點的信息,如位置和安裝標志等。
超級塊是對一個文件系統的描述;索引節點是對一個文件物理屬性的描述;而目錄項是對一個文件邏輯屬性的描述
一個進程所處的位置是由fs_struct來描述的,而一個進程(或用戶)打開的文件是由files_struct來描述的,而整個系統所打開的文件是由file結構來描述
7、設備的分類
字符設備:字符設備是能夠像字節流(例如文件)一樣被訪問的設備,一般不使用緩存技術。字符設備驅動程序實現這種特性至少需要實現open、close、read和write系統調用。
塊設備:對塊設備來說,最大的不同就是能夠容納文件系統(例如磁盤),並且大都使用緩存技術,可以看成是可以任意存取字節數的字符設備。 塊設備和字符設備的區別僅僅在於內核內部管理數據的方式,也就是內核和驅動程序的接口不同。然而這些差異對用戶是透明的。另外,塊設備的接口必須支持掛載(mount)文件系統。
網絡接口設備:任何網絡事務都要經過一個網絡接口來完成。網絡接口由內核中的網絡子系統驅動,負責發送和接收數據包,但它無需了解每項事務是如何映射實際傳送的數據包的。 內核和網絡驅動程序之間的通信完全不同於內核和字符以及塊設備驅動程序之間的通信,內核調用一套和數據包傳輸相關的函數,而不是read、write等。
8、fork()
在 Linux 中創建一個新進程使用 fork 函數。它執行一次卻返回兩個值。
(1)fork 函數說明
fork 函數用於從已存在進程中創建一個新進程。
新進程稱為子進程,而原進程稱為父進程。
這兩個分別帶回它們各自的返回值,其中父進程的返回值是子進程的進程號,而子進程則返回 0。用getpid()返回當前ID,getppid()返回父進程ID,pid是子進程號
因此,可以通過返回值來判定該進程是父進程還是子進程。
使用 fork 函數得到的子進程是父進程的一個復制品,它從父進程處繼承了整個進程的地址空間,包括進程上下文、進程堆棧、內存信息、打開的文件描述符、信號控制設定、進程優先級、進程組號、當前工作目錄、根目錄、資源限制、控制終端等,而子進程所獨有的只有它的進程號、資源使用和計時器等。
因此可以看出,使用 fork 函數的代價是很大的,它復制了父進程中的代碼段、數據段和堆棧段裡的大部分內容,使得 fork 函數的執行速度並不很快。
(2) fork 函數語法(見PPT)
(3)函數使用注意點
fork 函數使用一次就創建一個進程,所以若把 fork 函數放在了 if else 判斷語句中則要小心,不能多次使用 fork 函數。
9、Shell腳本
Shell是一種具備特殊功能的程序, 它是介於使用者和 UNIX/Linux 操作系統核心程序(kernel)之間的一個接口。
一個命令解釋器,類似於DOS下的command.com。它接收用戶命令,然後調用相應的應用程序。
為了對用戶屏蔽內核的復雜性,也為了保護內核以免用戶誤操作造成損害,在內核的周圍建了一個外殼(shell)。用戶向shell提出請求,shell解釋並將請求傳給內核。
使用較廣的shell有標准的Bourne shell (sh)、Korn Shell(ksh)、C shell (csh)、Bourne Again Shell(bash)等。
查看當前環境所用shell:echo $SHELL
shell的另一個重要特性是它自身就是一個解釋型的程序設計語言,shell程序設計語言支持絕大多數在高級語言中能見到的程序元素,如函數、變量、數組和程序控制結構。shell編程語言簡單易學,任何在提示符中能鍵入的命令都能放到一個可執行的shell程序中。
本質上,shell 腳本是利用shell的功能所寫的一個程序,這個程序是使用純文本文件,將一些shell的語法與指令寫在裡面。
shell和shell腳本有什麼區別?
確切一點說,Shell就是一個命令行解釋器,它的作用就是遵循一定的語法將輸入的命令加以解釋並傳給系統。它為用戶提供了一個向Linux發送請求以便運行程序的接口系統級程序,用戶可以用Shell來啟動、掛起、停止甚至是編寫一些程序。 Shell本身是一個用C語言編寫的程序,它是用戶使用Linux的橋梁。Shell既是一種命令語言,又是一種程序設計語言(就是所說的shell腳本)。
Shell(殼和管理工具):交互接口(與內核打交道)和腳本編程(解釋型)的重要手段。
shell腳本在linux系統管理員的運維工作中非常非常重要。它是一個腳本,並不能作為正式的編程語言。因為是跑在linux的shell中,所以叫shell腳本。說白了,shell腳本就是一些命令的集合。
一次一次敲鍵盤輸入命令會很麻煩。所以不妨把所有的操作都記錄到一個文檔中,然後去調用文檔中的命令,這樣一步操作就可以完成。其實這個文檔呢就是shell腳本了,只是這個shell腳本有它特殊的格式。
.sh 後綴
#!
#表注釋
echo屏幕回顯
不同的Linux版本,shell版本不同。
Shell腳本通常都是以.sh 為後綴名的,這個並不是說不帶.sh這個腳本就不能執行,只是一個習慣而已。所以,以後發現了.sh為後綴的文件那麼它可能是一個shell腳本了。
第一行要以 “#! /bin/bash” 開頭,它代表的意思是,該文件使用的是bash語法。如果不設置該行,雖然shell腳本也可以執行,但是這不符合規范。
# 表示注釋,後面跟一些該腳本的相關注釋內容以及作者和創建日期或者版本等等。當然這些注釋並非必須的。
數學計算要用[ ]括起來並且外頭要帶一個 ‘$’
Shell腳本還可以和用戶交互
read -p "Please input a number: " x
read -p "Please input another number: " y