ps:期末考試 終於結束了,這下我也終於有時間開始繼續經營我的博客。這個學期上的一些課真的非常有用,感覺很多課程細地講都可以寫成非常精致的技術博文,比如流水線技術,數據庫的一些技術,大學里的考試考的內容“不痛不癢”真正有價值的一些內容避而不考,但是追很多有的沒的的概念很雞肋。不管如何,這個暑假給自己留了很多本官方技術書籍慢慢去看,我也會在博客里繼續補充一些自己的體會和心得。
一. 關於設備在linux中的名字
附:(linux中常見設備和設備在linux中的名字的對照表)
-------------------------------------------------------------
| IDE接口硬盤 | /dev/hd[a~d] |
| SCSI/SATA/USB硬盤 | /dev/sd[a~p] |
| U盤 | /dev/sd[a~p] |
| 軟驅 | /dev/fp[0~1] |
| 打印機 | /dev/lp[0~2] |
| 鼠標 | /dev/usb/mouse[0~15] |
| | 或者 /dev/psaux |
| 當前CD ROM | /dev/cdrom |
| 當前鼠標 | /dev/mouse |
--------------------------------------------------------------
雖說使用linux的fedora distribution有快一年多的時間了,但是其實有很多細節的知識都沒有仔細去思考了解,比如硬件設備在linux的/dev目錄下的一些命名規則。
首先看看和我們接觸最多的硬盤:
現在主流的硬盤按照接口可以分類為兩種: IDE接口和SATA接口,其中IDE接口類型的硬盤幾乎大部分現在已經被淘汰了,SATA接口比較淺顯的一個特征是由兩個接口槽組成分別是信號接口和電源接口,每個SATA接口只可以連接一個硬盤,主板上的SATA接口的個數並不是固定的,隨着廠商的設定而改變。另外一種硬盤的傳輸接口為SCSI接口,比較常見於工作站以上的等級的計算機中,SCSI接口硬盤在控制器上含有一塊處理器,運行速度快而且不會消耗CPU資源。
對於IDE接口硬盤:
一個IDE扁平電纜可以連接兩個IDE設備,這個兩個電纜接口分別被稱為IDE1(primary)和IDE2(secondary),而每條扁平電纜上面的兩個設備分別被叫做Master設備和Slave設備,因此有如下名稱對應表:
---------------------------------------------------
| IDE1--Master | /dev/hda |
| IDE1--Slave | /dev/hdb |
| IDE2--Master | /dev/hdc |
| IDE2--Slave | /dev/hdd |
---------------------------------------------------
對於SATA接口硬盤:
由於主板上的SATA接口數量不一致,SATA設備在linux中的命名往往是”先來后到“關系,假如一個主板上有10個SATA接口且SATA0號接口槽和3號接口槽上分別有一個設備並且還有一個USB設備,則命名則為SATA0-->/dev/sda,SATA3-->/dev/sdb,U盤-->/dev/sdc,這里的U盤之所以排在后面是因為BIOS程序往往最后識別USB線上的設備,而且大多數的U盤都是在開機完成之后再插入的所以往往就命名最靠后。
以上為止的硬盤命名都是在為對其進行過分區的前提之下進行的,就是所謂的”一張大餅“沒有被切開,在介入分區后的設備命名之前,先了解下關於硬盤分區及系統開機過程的一些知識。
二. 磁盤的分區和系統啟動簡述
這里所說的硬盤是指傳統的由盤片,機械手臂,主軸馬達構成的磁盤,我的筆記本上的硬盤的規格就是這個樣子5400轉/秒,磁盤的構成的具體知識這里不贅述了,對於硬盤來講在磁道的第一個扇區是非常重要的,它記錄了關於磁盤的兩個非常重要的信息:
(1)主引導分區(Master Boot Record)安裝引導加載程序的地方。占用446B
(2)分區表(Partition Table)記錄硬盤分區狀態。占用64B
首先看一下分區表:
所謂對磁盤進行的分區有三個比較重要的概念:
(1)主分區(Primary)
(2)擴展分區(Extended)
(3)邏輯分區(Logical)
最直觀意義上的磁盤分區就是主分區,主分區就是直接在64B的分區表中記錄下來4組分區的情況,由於64B的限制,硬盤默認的分區表最多只可以容納4組分區信息,那么最直接的假設就是當我們把一個硬盤直接分區為4個主分區時候的命名情況對照表如下所示(假設使用的硬盤為SATA接口類型):
-------------------------------------------------
| 主分區1 | /dev/sda1 |
| 主分區2 | /dev/sda2 |
| 主分區3 | /dev/sda3 |
| 主分區4 | /dev/sda4 |
-------------------------------------------------
其中分區的最小單位為 柱面(cylinder)
然而在實際中我們使用的硬盤卻會分區為大於4個甚至10個以上的分區,這里是如何實現的呢?其實使用的就是擴展分區的功能,擴展分區在這里更像是一個廣義表,里面記錄了更下一級的分區情況,這就是邏輯分區。如下圖所示:
那么對上圖來講在linux中的命名對照表如下所示:
---------------------------------------------------------------------------------
| 主分區1 | /dev/sda1 |
| 擴展分區--------D | /dev/sda5 |
| --------E | /dev/sda6 |
| --------F | /dev/sda7 |
---------------------------------------------------------------------------------
這里要注意邏輯分區的數標命名是從5開始的,因為1~4的命名只能留給主分區/擴展分區使用,除了以上的概念之外有幾點需要注意:
1.對於一塊硬盤只能有0~1個擴展分區,可以有1~3個主分區,也就是說 |主分區|+|擴展分區|<=4
2.能夠作為數據進行訪問的分區只有主分區和邏輯分區,擴展分區無法格式化!
3.linux中IDE硬盤最多有59個邏輯分區,SATA硬盤最多有11個邏輯分區
4.所謂的分區過程只是在對分區表內的那64B內容進行修改。
接下來通過第一個扇區中MBR(Master Boot Record)看一下計算機啟動的主要過程:
1.系統加點自檢,通過CMOS和BIOS主動執行開機。CMOS主要存儲有關開機啟動的一些參數,BIOS的功能這里就不贅述啦。
2.通過MBR執行bootloader程序,bootloader提供不同的開機選項,載入內核文件或者將引導加載功能轉交給其他的loader負責。
(以下是隨便嘮叨兩句,若已經了解推薦跳過)
既然說到了loader的轉交,就不得不提多操作系統的實現,當今最主流的多操系統引導程序莫過於grub,grub就是被寫進了mbr中的,正常的操作系統啟動比如windows啟動的時候,在mbr中的引導程序執行的時候會直接把計算機的控制權交給windows內核,然而grub在這里做的事情就是實現了一個”菜單“,不同的選項會把產生分支引導不同的操作系統引導程序,這些引導程序是卸載不同的分區之中的,每個分區都會有一個啟動扇區,其功能和MBR一致。引導程序只認識在自己分區內的內核文件,這樣一來就是實現了操作系統之間的隔離,但是由於是在同一個硬盤之中的不同分區完成的,所以分區情況對於用戶還是不透明的,比如你可以在linux上明顯看到windows內核文件所在的分區(嗯,打不開!)
三. linux文件系統和磁盤分區
(對於linux文件系統架構原理沒有初步了解的朋友,請看我之前的博文:http://www.cnblogs.com/guguli/p/4556445.html )
首先,還是那句老話,linux下的一切設備都是以文件形式進行管理,這個形式歸功於linux的虛文件系統VFS對功能模塊進行的分離做到的。然而linux中的文件都是以樹結構進行管理的,這種向下分支的結構和磁盤的分區有着很大的聯系:
在VFS的管理下,同一個磁盤的不同分區或者不同的磁盤之間的關系都是一致的,都是文件系統中的節點。假設我們的SATA硬盤被分為了兩個主分區sda1和sda2,在抽象為vfsmount完成了像文件系統目錄的掛載之中,假設sda1被掛載到了“/”根目錄,sda2被掛載到了“/test”目錄,那么比如我對/test/file1進行的讀寫操作自然就會被寫入磁盤的第二個主分區,過程細化來講就是:首先從file1文件的目錄向上回溯,依次看各個目錄節點是否是文件系統的掛載點(參見super_block結構體),這里向上回溯到/test目錄發現這是一個掛載點,然后找到原來這是sda硬盤的第二個主分區,再通過sda硬盤的第一個扇區中的分區表找到屬於第二個主分區的柱面范圍,然后按地址進行讀寫。