雖然您已經建立了software raid 5,當硬碟異常時,還是需要一些手動的程序介入.
正常狀況下,當您發現了硬碟有異常,
假設 有 /dev/sda /dev/sdb /dev/sdc /dev/sdd 四顆硬碟(發現sdc損壞)
1. 應該是下,把 /dev/sdc1 由 /dev/md0上移除
#mdadm /dev/md0 -r /dev/sdc1
2. 拔掉 /dev/sdc 換上一顆新的硬碟
3. fdisk /dev/sdc, 切一個partition,將所有空間全劃給 /dev/sdc1.
4. 將 /dev/sdc1的 partition id 設定成 fd ( Linux raid auto ).
5. 將 /dev/sdc1 加回 /dev/md0
mdadm /dev/md0 -a /dev/sdc1
6. 查看 /dev/md0 rebuild 進度
mdadm --detail /dev/md0
以上供您參考.
因為 SOFT RAID 是由 OS 核心控制的,而 OS 又放 RAID 的話,當 RAID 毀損,換句話說核心也毀損了,那就沒有軟體去修復了(其實也可以修復,但需用 Live CD 之類的,外部開機去維修重建 SOFT RAID)。
這就是你只要拔掉硬碟換上一顆之後會出現無法進入系統的原因,看樣子應該是os獨立一個hdd,files的部分做raid5會比較容易處理吧!
至少raid5的部分掛掉,還進的去os裡面進行相關的設定。
Ubuntu預設沒有裝mdadm的套件,要安裝才有,用Ubuntu live cd開機的話要記得裝。
sudo apt-get install mdadm
建立 4顆 硬碟

安裝 Ubuntu
※ Desktop 版的在安裝過程中無法建立 RAID,所以這邊用 alternate 版的。
安裝片:lubuntu-12.04-alternate-i386.iso
*****************[ 安裝過程 ]*************************
每顆硬碟都建一個主分割(使用全部容量)
然後建立 RAID








*****************[ 安裝過程 結束]*************************
安裝完成後,開機,查看 RAID 狀態
終端機指令$ sudo mdadm --detail /dev/md0
3顆 sda1 sdb1 sdc1 已經在 active sync 同步運作中
1顆 sdd1 備用

模擬「抽換硬碟」會發生什麼事?
※ VirtualBox 雖然 4.2.x 版支援 SATA Hotplug 熱抽換,但看網路上的資料,只能用打指令的方法,圖形界面不支援熱抽換,太複雜,所以這邊只模擬停機抽換硬碟。
關機,
把 sdb 硬碟抽掉,插入一顆 新的 同容量「空白硬碟」


開機,
杯具了,沒反應

原因大概是: OS 放 RAID 中,而 RAID 已經損壞,所以 OS 也不能讀取了。
PS. 這個不是 RAID 在 Rebuilding 重建,而是真的掛了,等十幾分鐘沒反應。

只能依靠外部開機去修復了
使用光碟開機
Live CD 開機片:ubuntu-12.04-desktop-i386.iso
※ Ubuntu 的 alternate、server 版,只能用於安裝。desktop 版的才有 Live 開機功能。

使用「磁碟公用程式」,看一下磁碟狀況


「磁碟公用程式」要去啟動 RIAD 陣列 /dev/md0
會出現錯誤訊息:
Not enough components to start the RAID array
這邊有說明為什麼:
http://askubuntu.com/questions/21987/not-enough-components-to-start-the-raid-array
原因是預設沒有安裝 mdadm 這個 RAID 管理套件
所以要安裝 mdadm
指令:sudo apt-get install mdadm

安裝 mdadm ,會要求一併安裝相依套件 postfix
過程中會出現這個畫面,不用理它,直接不設定跳出
(這個只是 Live CD,臨時修系統用的,關機就沒用了)

裝好 mdadm 後,掃描一下本機電腦 RAID 狀態
指令:sudo mdadm --assemble --scan
會順便啟動 RAID

查看 /dev/md0 狀態
指令:sudo mdadm --detail /dev/md0
只剩下 3 顆了,sdb1 消失了,sdd1 (原先備份碟)頂上去那個位置
※ 因為資料量不大,所以這邊已經是 active sync 運作同步狀態,如果硬碟中資料量很大,應該會看到狀態是 Rebuilding 重建中。

如何把新插入的空白硬碟 sdb 加入磁碟陣列 /dev/md0?
這邊請參考 #11 樓 mingjian 大大的解說,非常詳細
mingjian wrote:
正常狀況下,當您發現了硬碟有異常,
假設 有 /dev/sda /dev/sdb /dev/sdc /dev/sdd 四顆硬碟(發現sdc損壞)
1. 應該是下,把 /dev/sdc1 由 /dev/md0上移除
#mdadm /dev/md0 -r /dev/sdc1
2. 拔掉 /dev/sdc 換上一顆新的硬碟
3. fdisk /dev/sdc, 切一個partition,將所有空間全劃給 /dev/sdc1.
4. 將 /dev/sdc1的 partition id 設定成 fd ( Linux raid auto ).
5. 將 /dev/sdc1 加回 /dev/md0
mdadm /dev/md0 -a /dev/sdc1
6. 查看 /dev/md0 rebuild 進度
mdadm --detail /dev/md0
把 sdb1 加入 /dev/md0
再看一次 RAID 狀態
sdb1 變成「備用」的

*************************************************
前後差別比較:

↑ 一開始建的 RAID-5

↑ 把「原先 編號2 的 sdb1 硬碟抽掉」,換插入一顆全新空白硬碟,"手動修復"之後的狀態
由比較結果可以看到:
● 原先 "備用的硬碟",會在 "主要運作硬碟" 抽掉後,頂上去,並自動重建。
● 新插入的空白硬碟,會變成備用的(需要手動 fdisk 和 加入磁碟陣列)。
● 號碼不會繼承,而是增加編號,所以由編號可知道換過幾次硬碟。
viphone wrote:
請問一下,這個部份要怎麽處置?
已安裝的套件或.deb可以把這些程式備份出來再丟到重灌好的系統上?
我現在重灌Ubuntu都是從頭做起,灌完再把最重要的東西手動安裝好
Ubuntu 的 apt(或軟體中心、新立得)
會把下載的 deb 軟體包,放在 /var/cache/apt/archives
實際去看一下 /var/cache/apt/archives 這個目錄,就可以了解
裡頭很多 *.deb 的檔案,都是安裝或更新時下載的
預設不會自動清除,除非使用者去把它清除
所以把那個目錄中的 *.deb 備份起來,下次重灌就不用再下載一次。
※ 區網中若有 Transpart Proxy,也可以快取 deb 包,因為它下載是走 http 協定,不過要把 proxy 的最小檔案快取大小,提高到 64MB~128MB 左右。
可以用 tar 去把它打包備份起來,變成一個檔案
然後放在別處,比如別的硬碟、別的電腦、隨身碟.....
不建議直接拷貝 *.deb,因為會遺失權限資訊。
打包,再解回去,檔案權限還是一樣,就不用去改。
打包更新套件具體方法:(不用壓縮,因為 deb 包本來就壓縮的)
cd /var/cache/apt/archives
sudo tar cvf *.deb 備份的更新包.tar
重灌後,
先不要急著更新
把備份的更新包,解打包回去:
sudo tar xvf 備份的更新包.tar /var/cache/apt/archives
然後再更新,硬碟裡面已經有軟體 deb 包,就不必重複下載了,可節省很多時間。
安裝軟體的話,如果已經知道軟體名稱
可以寫一支 shell script 腳本
比如:
自動安裝軟體.sh
------------------------
#!/bin/sh
# 把更新包的備份,解回去
sudo tar xvf 備份的更新包.tar /var/cache/apt/archives
# 先更新一下軟體庫列表
apt-get update
# 開始連續自動安裝
# 參數 -y 不詢問,直接 yes
apt-get -y install [軟體名稱]
apt-get -y install [軟體名稱]
apt-get -y install [軟體名稱]
..............................(以此類推)
-----------------------------
把更新包備份,和腳本檔,都放一起
然後用 sudo 權限執行這個「自動安裝軟體.sh」腳本
這樣就不必一個個軟體去安裝,自動裝到好,懶人包。
不過前提是要知道想裝哪些軟體,還有那些軟體的名稱,以及要寫支腳本。
*********************************
伺服器設定檔的話,我個人是習慣全部都放同一個目錄
比如:/conf
每種服務的設定檔,通常散布各個地方
比方說:
/etc/squid/squid.conf
/etc/samba/smb.cfon
/etc/dhcpd.conf
............ 總之很雜,散布很多地方
全部 mv 到 /conf
然後在原地建軟連結,欺騙作業系統,以便正常運作
比方說:
cd /etc/squid
mv squid.conf /conf
ln -s /conf/squid.conf squid.conf
這樣的好處:
備份 /conf 就行了,就備份了所有設定檔,不會"漏勾"
Linux 很穩定,連續開機幾年都不會壞,人的記憶容易忘,幾年後某天突然想重灌,當初裝什麼早忘光了.....所以集中放一起,直接去備份 /conf,就能保證備份到所有設定檔,就不用檢查老半天,想說還有什麼沒備份到。

另外也可以 cron 排程固定時間,壓縮打包備份 /conf
但重灌後,要怎麼將 /conf 備份的設定檔,還原回去?
建議寫 shell script 腳本
在 mv 設定檔的時候,就順便寫到 sh 腳本,做個紀錄。
腳本檔內容,比方說:
cd /etc/squid/squid.conf
rm squid.conf
ln -s /conf/squid.conf squid.conf
就是直接把設定檔刪了,然後原地建一個軟連結,指向 /conf 備份的那一個。
重灌後,用 sh 腳本,去自動,會比較快,也比較會漏掉。
********************************************************
viphone wrote:
一顆硬碟裡也只掛了/跟/home而已
有看過說掛這兩個目錄,重灌時之要把/格式化重灌就好
/home裡面的資料不會動到(像Windows的C槽跟D槽之分)
只是我沒實做過
如果當初安裝時, / 和 /home 有切開兩個分割區
重灌時,硬碟分割那邊,選手動
(以 Ubuntu 為例,其它 Distro 大同小異)

硬碟分析後,會看到原先的分割區
但是「掛載點」會消失
這時候要憑記憶,
去感覺那個分割區,原先是掛載 / 還是 /home
(或者重灌前,先開機看一下各個分割區大小和掛載點)

容量大小都不要去動到
點兩下分割區
選:檔案系統
選:掛載點
掛載 / 的,需要格式化(類似 windwos C:)

掛載 /home 的,不要格式化(類似 windows D:)

最後檢查一下,
確定 /home 沒有格式化
(格式化資料會消失,不格式化就可以保留)
確定再按繼續。

這個子,重灌後,/home 裡面的資料就都可以保留了
建議硬碟割 /、/home、swap 三個分割區就好
/ 大約 8~60 GB 大小就錯錯有餘了。
SWAP 約 512MB ~2048MB
/home 其餘容量
其它雜七雜八的,
比如:網頁 www 根目錄,資料庫目錄,郵件目錄、log 紀錄檔目錄......
其實都可以用 ln -s 軟連結到 /home 就好了
分割區不宜太多,太多那邊剩一點,這邊剩一點,但是剩下的都不是同一分割區,就無法有效利用。
squid 快取目錄例外,要給獨立的分割區。
重灌時
/ 格式化
/home 不格式化,保留資料
/home 不見得只能放 /home 的東西
unix 萬能的 ln -s 可解決一切路徑問題

fedora wrote:
查看 /dev/md0 狀態
指令:sudo mdadm --detail /dev/md0
只剩下 3 顆了,sdb1 消失了,sdd1 (原先備份碟)頂上去那個位置
※ 因為資料量不大,所以這邊已經是 active sync 運作同步狀態,如果硬碟中資料量很大,應該會看到狀態是 Rebuilding 重建中。
大大您以上的操作 我都順利!!
也換一顆空的硬碟到第二個位子!!
卡在上面的指令動作 他的跑出這個訊息 md device /dev/md0 does not appear to be active.
是甚麼問題呢!? 是我那邊步驟做錯了嗎><??
請求大大幫忙一下 感謝!!
andy2159 wrote:
也換一顆空的硬碟到第二個位子!!
卡在上面的指令動作 他的跑出這個訊息 md device /dev/md0 does not appear to be active.
是甚麼問題呢!? 是我那邊步驟做錯了嗎><??...(恕刪)
因為你的描述並不是很清楚,所以不方便釐清問題點原因為何,很難給出一個建議
其實 Linux SOFT RAID 都是靠 mdadm 這個指令工具
可以說,掌握了 mdadm,就掌握了 Linux SOFT RAID
網路上有一些 mdadm 的中文教學,可以試著花些時間 K 一下
對了解 mdadm 的使用方法,有很大幫助:
快速查閱:
http://ericbbs.blogspot.tw/2009/05/mdadm-raid.html
詳細原理(鳥哥網站):
http://linux.vbird.org/linux_basic/0420quota.php#raid
其它:
http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-ig-s390-multi-zh_tw-4/s1-s390info-raid.html
若英文底子不錯,也可以 man mdadm 看內建的英文使用手冊。
**********************************************
mdadm 有沒有前端圖形界面,這個我不太清楚
不過指令並不難,且指令可以寫 shell script 腳本
腳本就可以無人值守自動化
比如:
可以固定時間 cron 排程,去 mdadm 指令一下秀出 RAID 狀態,輸出到 txt 純文字檔。
然後同一支腳本,去抓文字檔裡面的字串
比方說,抓 Failed Devices: 0 (磁碟錯誤)這個字串
若後面數字不是 0,換句話說,RAID 出事了
就 mail 通知給管理員,或其它什麼的處理方法
範例:
check-raid.sh
#!/bin/sh
# 將 /dev/md0 狀態,輸出到暫存文字檔
mdadm --detail /dev/md0 > /dev/shm/raid-stat.tmp
# 分析暫存文字檔
# 裡面的 Failed Devices 這一行,取第4個字串(失效的硬碟數)
# 代入變數 $failDev
failDev=` cat /dev/shm/raid-stat.tmp | grep "Failed Devices" | awk '{print $4}' `
# 判斷失效的硬碟數,執行相關的動作
if [ $failDev -eq 0 ] ; then
# 如果失效硬碟數=0,執行這一區段
echo "RAID 健康狀態 = 正常"
else
# 如果失效硬碟數不等於 0,執行這一區段
echo "RAID 健康狀態 = 危險"
# 其它動作....比方說 mail 給管理員
fi
# 刪除暫存檔
rm /dev/shm/raid-stat.tmp
這腳本可執行一次看看效果
sudo bash check-raid.sh
將這個範例腳本,放到 crontab 排程中,每日固定時間以 root 權限執行,就可以在 raid 出現問題時,儘快收到通知,並去做處理。
或者也可以乾脆通知後,就腳本自動處理。
所以其實指令模式的東西,對於管理自動化,是很好用的,省心省力,不需要排斥,不過前提要懂寫腳本。
viphone wrote:
我第一次看到awk這個指令 剛剛看一下網路上英文說明
好像是文字界面的Ctrl+F
awk這指令的主要功能是什麼? 跟grep有什麼差別?...(恕刪)
awk 是一個非常強大的「字串處理工具」
可以取代 perl 或其它程式語言,做一些複雜的字串處理
比如:搜尋並替代字串,找出特定字串、用正規表示式檢查字串組成(例:檢查 email 格式).....等等
功用比較類似 sed 的強化板
grep 則是單純的搜尋字串用的,並沒有取代字串的功能,也沒有剪接字串的功能。
O'Lelly 有一本書專門在講 awk
可見如果要把 awk 摸熟,需要下多大功夫,甚至得看一本書...
不過一般在 shell script 使用 awk
最常用的,就只會使用一個功能而已
awk '{print $號碼}'
這個是用來取第幾個字串,awk 只要會這一個用法就夠了
我也只會這一個功能

cut 也可以做到類似功能,但某些情況(字串組成較複雜),cut 去做要很多次,awk 只需一次。
******************************************
應用舉例:
1. 取出特定位置的字串

free -m
查看目前記憶體狀態(參數 -m,以 MB 為單位,較易觀看)
free -m | grep Mem:
查看記憶體狀態,並挑出含有 Mem: 的那一行
free -m | grep Mem: | awk '{print $4}'
查看記憶體狀態,並挑出含有 Mem: 的那一行
然後取 第4個 字串
結果輸出:剩餘記憶體大小
2.查出目前 www 服務,有多少線上人數
#!/bin/sh
# 腳本用途:查看目前 www 線上人數
# 定義變數,www 主機的 IP 和監聽埠號,請修改
www_ip="11.22.33.44:80"
# 計算連線的數目
wwwSession=`netstat -tn | grep "$www_ip" | wc -l`
# 計算連線人數 (同一 IP 來源有可能產生多個連線,去掉重複,得到真實線上人數)
wwwRealPerson=`netstat -tn | grep "$www_ip" | awk '{print $5}' | cut -d ':' -f 1 | sort | uniq | wc -l`
# 輸出顯示
echo "目前 www 線上總連線數 = $wwwSession"
echo "目前 www 實際線上連接人數 = $wwwRealPerson"
※ 變數 www_ip 需修改為你的 www 主機 IP 和 埠號。
說明:
netstat -tn
列出目前主機的所有連線
參數 -t 只列出 tcp 連線
參數 -n 不解析 IP 網域(速度較快)
netstat -tn | grep "$www_ip"
列出主機所有連線
並找出有 www 主機 IP 和 埠號 的 行數
註:www (網頁服務)埠號 80
awk '{print $5}'
取出第5個字串
即:對方連線的 IP 和 埠號
cut -d ':' -f 1
以 ':' 冒號為基準,切割字串,取第1個字串
即:只取出對方連線 IP,把 埠號剪掉
sort
排序
uniq
去掉重複的
wc -l
計算行數
即:計算有多人連線
Q. 為什麼會區分「總連線數 Session」和「實際線上人數」?
A.
因為同一個 IP ,有可能好幾個連線(多開網頁,或下載圖片)
要把 IP 重複的都去掉,才是實際上的連線人數
執行結果範例:

這個有什麼用呢?
這邊只是片段範例
實際比如說:可用在 MRTG 之類的報表分析
MRTG 是只要產生 4個數據給它,就可以畫圖表
4個數據分別是:實線、虛線、開機時間、設備名稱
而產生數據可以用 sh 腳本,echo 輸出即可
換句話說,只要寫支 sh 腳本,就可以實現在 MRTG 上面顯示 www 線上人數分析圖表。
或者不那麼複雜,就單純輸出到一個指定的 log 文字檔,紀錄每一段時間的線上人數。
比方說:
date >> www線上人數紀錄.txt
www.sh >> www線上人數紀錄.txt
data 顯示目前日期和時間
[指令] >> [檔案名稱]
>> 重新導向,累加不覆蓋
排程每小時執行一次,之類的。就有 log 可以看線上人數狀況。
然後可以找出尖峰和離峰時間,比如凌晨 5點人數最少,就是離峰時間,主機可利用離峰時間進行自動備份和自動相關更新維護。
離峰時間,進行耗系統資源的自動備份和更新維護,對線上瀏覽的人,影響最小。