歡迎使用ueditor!我們再來回顧一下整個情境:1)在運行陣列的時候調用md_wakeup_thread喚醒主線程2)主線程調用md_check_recovery檢查同步3)md_check_recovery函數中檢查需要同步調用md_register_thread建立同步線程4)同步線程調用md_do_sync函數處理同步過程5)md_do_sync做同步過程的管理,一步步推同步點,記錄同步完成點,調用sync_request進行各種陣列層級的同步6)sync_request做同步資料流的派
在上一小節裡講到啟動同步線程:7824 mddev->sync_thread = md_register_thread(md_do_sync, 7825 mddev, 7826
陣列同步在md_do_sync,那麼入口在哪裡呢?就是說陣列同步觸發點在哪裡呢?聽說過md_check_recovery吧,但這還不是同步的進入點。那raid5d函數是進入點吧?如果要認真分析起來還不算是。真正的同步進入點在do_md_run函數,就是在運行陣列run函數之後,有這麼一行:5171 md_wakeup_thread(mddev->thread);是這一行把raid5d喚醒的,raid5d函數如下:4823
raid10的run函數與raid5的run函數最大區別在於setup_conf,那就直接深入核心:3540 static struct r10conf *setup_conf(struct mddev *mddev) 3541 { 3542 struct r10conf *conf = NULL; 3543 int err = -EINVAL; 3544 struct geom geo; 3545 int copies;
如果看懂了raid1陣列的run函數,那麼看raid5陣列run就非常輕鬆了,因為兩者要做的事情都是大同小異。raid5的run函數很長,但很大一部分跟建立運行是沒有關係的,特別是有一段跟reshape相關的,大多數系統都不關注該功能,因此可以直接跳過。經過刪減之後的run函數如下:5307 static int run(struct mddev *mddev) 5308 { 5309 struct r5conf *conf; 5310 int
運行陣列意味著陣列經曆從無到有,建立了作為一個raid應有的屬性(如同步重建),並為隨後的讀寫做好的鋪墊。那麼運行陣列的時候到底做了哪些事情,讓原來的磁碟像變形金剛一樣組成一個新的巨無霸。現在就來看陣列運行處理流程:5158 static int do_md_run(struct mddev *mddev) 5159 { 5160 int err; 5161 5162 err = md_run(mddev); 5163 if (err)
這一節我們閱讀陣列的建立過程。按照常理出牌,我們到ioctl中找陣列建立命令,md對應的ioctl函數是md_ioctl,當找對應的cmd命令字時,卻完全沒有類似CREATE_ARRAY的命令,那麼就說明md裝置並不是通過ioctl函數來建立的。其實如果我們仔細閱讀一下md_ioctl函數的原型就會發現其實建立md裝置根本就不在這個地方,函數原型如下:6303 static int md_ioctl(struct block_device *bdev, fmode_t mode, 6304
在編譯完成linux核心原始碼的時候,drivers/md目錄下會產生多個ko檔案,那麼這些核心模組哪一個先載入,哪一個後載入的呢?例如md-mod.ko, raid5.ko, raid10.ko,這些模組是一起載入的呢,還是有先後順序呢?如果熟悉linux核心編程的話,知道有一個request_module函數,這個函數用於請求載入一個模組,但這個函數並不能說明一個模組對另一個模組的依賴關係。準確的資訊還是來自於Kconfig,這裡只抽取Kconfig中相關的部分:config
最近花了一段時間認真地學習了一下md代碼,並且在原代碼的基礎上開發了一系列的新功能,這些新功能讓md更完善、更適合於企業大型存放區,通過增加陣列緩衝和bitmap最佳化大大提升了儲存速度,提高了資料的可靠性,在任何掉電的情況下保證資料一致性,超級塊異常情況下完全不影響陣列使用,完全控制了踢盤問題,簡化了使用者操作。簡單地概括一下,就是讓儲存不再有門檻。說了這麼多,其實想表達的意思就是md的學習之路並非十分順利,特此寫此博文與所有兄弟姐妹們共用一下我的學習經驗,如果您看完之後能有所收穫,那就不枉費
一 Linux的啟動流程分析1 目前各大Linux發行版本的主流引導裝載程式使用的軟體為grub2 簡單來說,系統啟動的過程如下:1. 載入BIOS的硬體資訊與自我測試,並依據設定取得第一個可開機裝置2. 讀取並執行第一個啟動裝置內的MBR的boot Loader也就是一般的grub3. 依據boot Loader的設定載入Kernel,Kernel會開始檢測硬體與載入驅動程式4. 在硬體驅動成功後,Kernel會主動調用init進程,而init會取得run-level資訊5.
1 FTP1 FTP是一個相當古老並且應用極為廣泛的互連網協議,FTP為我們提供了一種可靠的方式在網路上進 行檔案分享權限設定2 FTP是一種CS架構的服務,擁有一個服務端和用戶端,FTP使用TCP協議作為底層傳輸協議,提供了 資料轉送的可靠性,FTP的標準連接埠為20,21,20做為資料介面,21為指令介面3 所有的共用的檔案都是放在服務端2 FTP模式FTP用戶端和服務端串連有兩種模式1 主動模式:指的是假設用戶端要向服務端請求檔案分享權限設定的時候,首先用戶端先發送一個請求到服務
1 網域名稱1 比如www.LinuxCast.net,實際上網域名稱只是後面的一部份,但是我們一般都是整個叫為網域名稱2 對於網域名稱來說,我們一般使用.來分割,嚴格的網域名稱最後一位還是有一個.的,但是我們都直接省略3 網域名稱分為三個部分主機名稱 該域中的某台主機,對於網頁伺服器來說都是www,但是也有ftp,mail等等網域名稱 網域名稱稱類型
1 日誌1 日誌是系統用來記錄系統運行時候的一些相關的資訊的純文字檔案2 日誌的目的是儲存相關程式的運行狀態,錯誤資訊等。為了對系統進行分析,儲存記錄以及 在出現錯誤的時候發現分析錯誤使用3 Linux一般會儲存以下類型的日誌核心資訊服務資訊應用程式資訊2 rsyslog1 LInux系統中用來實現日誌功能的服務稱為rsyslog,在早期的Linux發行版本中使用的sysLog, rsyslog是syslog的增強版本2
一 壓縮檔的用途與技術1 目前我們的電腦是使用byte來計量的,不過事實上電腦最小的計量單位是bit。我們知道1byte = 8bit2 簡單的說,檔案裡面會有很多的“空間”存在,並不是完全填滿的,而壓縮的技術就是 將這些“空間”填滿,以讓這些檔案的佔用的容量下降。由於壓縮過的檔案並無法直接被我 們的作業系統使用,因此若要使用這些檔案資料,我們必須進行解壓縮3 目前很多的www網站利用壓縮的技術來進行資料的傳送,好讓網站寬頻可利用率上升。二
1 掛載操作1 磁碟或者分區需要建立好檔案系統後,需要掛載到一個目錄才能夠使用2 windows或者是Mac會自動的掛載檔案系統,一旦建立好檔案系統後會自動的掛載3 對於Linux來說我們必須要手動的去掛載或者配置系統進行自動的掛載,比如2 Mount命令來掛載檔案系統1 mount 要掛載的裝置 掛載點mount /dev/sdb1 /mnt2 常用的參數1 不帶參數的mount命令是顯示所有的掛載的檔案系統2-t 指定檔案系統的類型,如:
1 檔案系統1 作業系統通過檔案系統來管理檔案及資料,磁碟或分區需要建立檔案系統之後才能為作業系統使用 ,建立檔案系統的過程稱為格式化2 沒有檔案系統的裝置稱為裸裝置3 常見的檔案系統有fat32 , NFTS , ext2 , ext3 , xfs , HFS等4 windows下的主流的檔案系統是NTFS,Linux下的主流檔案系統為ext2 和 ext35 判斷一個檔案系統的好壞主要是: 最大的分區的大小,支援最大的檔案的個數 , 支援檔案名稱的長 度,日子功能,檔案存取效能2
1 FDISK分區工具1 fsidk是來自IBM的分區工具,支援絕大多數的作業系統,幾乎所有的Linux都裝有fdisk2 fdisk是一個支援MBR的分區工具,如果要使用GPT的話我們無法使用fdisk進行分區3 fidsk是只有具有超級使用者的命令才能使用,比如su 或者sudo4 使用fdisk -l能夠列出所有安裝的磁碟及其分區資訊,這裡面我插入了隨身碟做測試也就是圖中的 sdb45 使用fdisk /dev/sd[a~z]可以對目標目錄進行分區。下面我以插入的隨身碟即sdb4做為示範1
1 磁碟的基本概念1 Track(軌道), Cylinder(柱面), Sector(扇區), Head(磁頭)2 磁碟在Linux系統中的表示1 Linux所有裝置都被抽象成檔案儲存在 /dev目錄下2 裝置的名稱一般為hd[a-z]或者sd[a-z],[a-z]為分區號,比如hda , hdb , sda , sdb3 IDE裝置的名稱為hd[a-z] , SATA , SCSI , SAS , USB等裝置的名稱為sd[a-z]3 分區的概念1
一 什麼是進程1 在Linux系統當中,觸發任何一個事件時,系統都會將它定義成為一個進程,並且給予這個進程一 個ID,稱為PID,同時依據觸發這個進程的使用者與相關屬性關聯性,給予這個PID一組有效使用權限設定2 我們說過,系統應該是僅認識二進位檔案的,那麼當我們要讓系統工作的時候,當然就需要啟動一 個二進位檔案,那個二進位檔案就是程式3 程式:通常為二進位程式放置在儲存媒介中(如硬碟,光碟片,磁碟片,磁帶等),以物理檔案的形式
1 YUM1 rpm軟體包形式管理軟體雖然方便,但是需要手工的解決軟體包的依賴關係,很多的時候安裝一個 軟體需要首先安裝1個或者多個的其它軟體,但是我們YUM可以解決這個問題2 YUM(Yellowdog Updater Modified) 是一個RPM的前端程式,主要目的是設計用來解決RPM的依賴關 系3 YUM的特點如下自動解決依賴關係對於對RPM進行分組,並基於組進行安裝操作引入倉庫的概念,支援多個倉庫配置簡單4