Ubuntu 12.04版 做軟體raid5 更換硬碟問題!! 請大大幫幫忙!!

建議您應該先了解一下Linux手動建立Raid 5的過程,
雖然您已經建立了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

以上供您參考.
fedora大大的重點
因為 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

感謝大大們我的問題終於解了^^
讓小弟我受獲良多!!
用 VirtualBox 做了一個實驗:

建立 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 出現問題時,儘快收到通知,並去做處理。

或者也可以乾脆通知後,就腳本自動處理。

所以其實指令模式的東西,對於管理自動化,是很好用的,省心省力,不需要排斥,不過前提要懂寫腳本。


fedora wrote:
Ubuntu 的 a...(恕刪)


真是受益良多
我不是科班出身的 幾年前才開使用Ubuntu
一直以來我都在用Linux慢慢侵蝕公司裡的設備
現在只有FTP server固定用CentOS在跑
以前在XP用軟體式FTP 常常程式會當掉
現在我只要做在自己位置上就好 還可以知道客人下載過檔案沒
那台還裝了論壇內部使用

我第一次看到awk這個指令 剛剛看一下網路上英文說明
好像是文字界面的Ctrl+F
awk這指令的主要功能是什麼? 跟grep有什麼差別?

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點人數最少,就是離峰時間,主機可利用離峰時間進行自動備份和自動相關更新維護。

離峰時間,進行耗系統資源的自動備份和更新維護,對線上瀏覽的人,影響最小。
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!