現在硬碟價格愈來低, 但是穩定性也一直是為人所詬病的.
所以我目前系統大概是這樣做的
1) 新買的硬碟放不重要的資料, Offline Backup 資料
2) Item 1) 換下來的硬碟做 Raid 1 當作資料碟
3) Item 2) 換下來的硬碟做暫存碟
4) Item 3) 換下來的硬碟做其他電腦的系統碟
5) Item 4) 換下來的硬碟做動物碟和大量資料傳送碟
以這樣的更換頻率來看, Item 1) 和 Item 2) 是最常換的.
像是某 s 長輩搬東西都還要注意 md5 checksum 的問題, 不過我實在是沒有這麼多力氣去處理
所以都只是搬過去就好了.
如果只是 copy data, 那問題還算簡單, 但是 Linux Software Raid Copy 還是需要一些技巧.
我的 Raid 1 Disk 大概二到三年更換一次, 每次都需要查 Software Raid 相關的指令, 很大的機會還會連回到自己的 Blog, 乾脆這次記錄下來, 以後還可以用, 也可以給大家參考
將兩顆新硬碟設定成 Raid 系統
我 Raid 1 系統比較喜歡在 Local 系統上 Copy, 這樣一來可以少掉 network 的 overhead, 也可以確定完整保留檔案的屬性, 是比較好的做法.
在 Copy 之前, 先簡單說一下步驟
1) 將舊的 Raid Disk 卸下來, 換上新的二顆硬碟上去
2) 拿舊的其中一顆裝上去.
3) 使用 Linux LiveCD 開機
4) 將新硬碟(一顆)設上 Raid
5) 將舊硬碟也設上 Raid
6) Copy 系統碟資料
7) 使用新 Raid 重新開機
8) Copy 資料碟資料
9) 卸下舊 Raid 硬碟
10) 將第二顆硬碟加入到 Raid Disk
其中硬體安裝步驟就省略了, 除非我有事業線美女還有大砲級的器材, 不過這二樣我都沒有.
Linux LiveCD 的選擇
這次是使用 Ubuntu 11.04 x86, 新的 Unity 介面看起來不錯, 但是我找不到 Terminal, 要用 Search 的才行, 不過這並不影響使用.
啟動之後主要是要連上網路. 這個就依照個人環境不同修改了.
這是 Static IP 的範例
# ifconfig eth0 211.21.1.1
# route add default gw 211.21.1.254
# echo "nameserver 168.95.1.1" > /etc/resolv.conf
# ping www.hinet.net
安裝 mdadm
因為接下來幾乎都是要在 root 下做, 懶得每次 sudo 的話
就直接切到 root 吧.
# sudo su -
# apt-get install mdadm
設定新硬碟的分割表, 這邊不多說, 用 cfdisk 應該就可以很順利的將二顆硬碟切成一樣的.
sfdisk copy partition
# sfdisk -d /dev/sda > sda.layout
# sfdisk /dev/sdb < sda.layout
sfdisk 已經可以支援 gpt 了(2021年)
或是 sgdisk
$ sgdisk --backup=table /dev/sda
$ sgdisk --load-backup=table /dev/sdb
$ sgdisk -G /dev/sdb
新硬碟是二顆 2T 的硬碟, 新的規劃是三個 partition , /var /tmp 呢…. 呃~ 我懶嘛, / 切大一點就好了.
/dev/md1 (First Partition) : System Disk : 50G
/dev/md2 (Second Partition) : Data Disk : 1945G
/dev/md3 (Third Primary Partition) : Swap Disk : 5G
建立 md device node
一般來說, 以我的狀況 4 個就夠用了, 但是我原先的硬碟 /boot 和 / 是分開的, 所以我多建一個.
# mknod /dev/md0 b 9 0
# mknod /dev/md1 b 9 1
# mknod /dev/md2 b 9 2
# mknod /dev/md3 b 9 3
# mknod /dev/md4 b 9 4
如果是 GPT
Number Start (sector) End (sector) Size Code Name
1 2048 616447 300.0 MiB EF00 EFI System
2 616448 420046847 200.0 GiB FD00 Linux RAID
3 420046848 11700000000 5.3 TiB FD00 Linux RAID
4 11700000768 11721045134 10.0 GiB FD00 Linux RAID
1 : UEFI 用
2 : root 用
3 : /home 用
4 : swap 用
註: 用 Kubuntu 17.04 時, 己經不需要自己建 /dev/md1 的 node.
將新的硬碟規劃成 Raid 1 Device
這邊要注意的是,
1) 新的硬碟在系統內是被抓成 /dev/sdb, 如果看倌要抄的話, 記得要改名.
2) –metadata=0.90 , 表示 Raid 格式用 0.90, 新的 mdadm 支援 1.0, 1.1, 1.2, 查到的資料是 grub 目前不支援 1.0 以上, lilo 看起來也不支援, mdadm 預設支援 1.2 . 有人有提到用 1.2 沒有辦法 auto-detect raid device. 所以這邊一定要停在 0.90. (我是 grub 認不到, 所以有重來過 Orz)
(註: 現在應該可以用 1.2, 但是 boot 還是要用 0.90)
3) Missing : Raid 1 要二顆硬碟, 我這邊只用了一顆硬碟, 另一顆等到 Copy 完畢再做 Sync 即可. 這樣會比較快.
# modprobe raid1
# mdadm --create /dev/md1 -l 1 -n 2 --metadata=0.90 /dev/sdb1 missing
# mdadm --create /dev/md2 -l 1 -n 2 /dev/sdb2 missing
# mdadm --create /dev/md3 -l 1 -n 2 /dev/sdb3 missing
第一行要將 raid1 的 module load 進來, 不知道不執行可不可以, 我是都有執行.
Format Fisk , 這邊就隨你高興了, 不過系統碟建議用 ext3/ext4
# mkfs.ext3 /dev/md1
# mkfs.xfs -f /dev/md2
# mkswap /dev/md3
重建舊的 Raid 硬碟
為什麼只拿一顆硬碟就好, 那是因為舊硬碟是 Raid 1 呀, 所以重建也可以忽略掉另一顆, 這邊我每次都忘記怎麼做, 所以也是這次讓我寫這篇文章的原因.
# mdadm --assemble /dev/md0 /dev/sdc1 missing
# mdadm --assemble /dev/md4 /dev/sdc2 missing
# mdadm --run /dev/md0
# mdadm --run /dev/md4
指令很簡單, 才二行而己, 但是讓我搞很久 -_-!
mount 系統碟
這邊請依照你當時現場的狀況決定.
# mkdir -p /mnt/target
# mkdir -p /mnt/source
# mount /dev/md1 /mnt/target
# mount /dev/md4 /mnt/source
# mount /dev/md0 /mnt/source/boot
清除多餘空間
我的系統是 Gentoo, 在 Copy 之前, 可以先清除一些空間, 讓 Copy 更順暢
這邊的建議是
1) /tmp, /var/tmp : 有些舊系統不會清 /tmp, 和 /var/tmp, 在 copy 之前要清一下
2) 清除 Linux kernel object code
3) 清除 Portage, 這檔案很多又小, /usr/portage/distfiles 又很多 download file, 不必要, 清空
4) 清除 /usr/share/doc : 這個看個人, 我覺得可以清, 但是沒有清的項目.
assume root is /mnt/source
# rm -rf /tmp/*
# rm -rf /var/tmp/*
# cd /usr/src
# cd linux
# make mrproper
# cd /usr/portage
# rm -rf *
# cd /usr/share/doc
# rm -rf *
Copy System Data
# rsync -av /mnt/source/ /mnt/target/
先別休息呀, 還有別的活要幹, 別忘了 LiveCD 是 GUI 介面, Copy 的同時我們還有很多事情要做.
1) 修改 /etc/fstab
2) 安裝 Grub
3) 修改 /boot/grub/menu.lst (如果有需要的話)
# blkid /dev/md1
/dev/md1: UUID="11111111-2be8-4156-98d9-018e20da6dc1" SEC_TYPE="ext2" TYPE="ext3"
# blkid /dev/md2
/dev/md2: UUID="22222222-af0a-41de-a67e-72652a6e8521" TYPE="xfs"
# blkid /dev/md3
/dev/md3: UUID="33333333-e972-4d8f-9879-c58576ea0d03" TYPE="swap"
# vi /etc/fstab
記好 UUID, 準備修改 /etc/fstab, 以下是範例.
UUID=11111111-2be8-4156-98d9-018e20da6dc1 / ext3 noatime 0 0
UUID=22222222-af0a-41de-a67e-72652a6e8521 /home xfs defaults,noatime 0 0
UUID=33333333-e972-4d8f-9879-c58576ea0d03 none swap sw 0 0
安裝 Grub
當 Copy 的差不多的時候, 就可以準備安裝 Grub 了, 步驟是
1) 先 bind 系統上的 /proc /dev 到 目錄內
2) chroot 進去
3) 執行 grub
# cd /mnt/target
# mount --bind /proc proc
# mount --bind /dev dev
# cd ..
# chroot target
# grub
grub> root (hd1,0)
Filesystem type is ext2fs, partition type 0xfd
grub> root (hd1,1)
Filesystem type is xfs, partition type 0xfd
grub> setup (hd1)
如果是 GPT + BIOS 仍然可以用這個指令, 用 grub 應該是有點久了
$ grub-install /dev/sda
$ grub-install /dev/sdb
如果是搬家還要修一下 grub 的設定, 編輯 /etc/default/grub, 將 mdX 換成你要的開機 raid.
GRUB_CMDLINE_LINUX_DEFAULT=”root=/dev/mdX real_root=/dev/mdX rootfstype=ext4 “
別忘了 update 一下 grub 的設定
grub-mkconfig -o /boot/grub/grub.cfg
grub 判斷 device 不一定很準確, 需要一些經驗.
不過大致上來說,
sda = hd0, sdb = hd1, sdc = hd2 是沒有錯的.
我也有碰過開完機之後是
sda = hd0, sdd = hd2, sdc = hd1
這樣的.
至於 grub.conf (menu.lst) 就跳過了Copy 完就可以重開機了, 順利的話就和原來的系統差不多.
我自己是很順利, 沒有什麼問題.新的系統上, raid 會自己抓到, 在我的系統是在 md126, md127, 之前進系統改過的 Raid 就是 md0 和 md4.
直接再 mount 上去再 rsync 一下.
以我而言, 資料碟大概都是數百 G 上下, 所以 rsync 指令一下, 我就跑去睡覺了.
以上的步驟大概要 2~4 Hours , 依照狀況能力的不同, 不過大概在下午六點左右開始轉換是最好的.
將第二顆硬碟加入 Raid
所有資料都 Copy 完了以後, 確定不會再重開機, 因為 sync 時中斷就要重來, 所以這個步驟大概會耗掉非常久的時間, 以 2T 的硬碟來說, 會超過 14Hours. 如果中間有大量存取會更慢.
這邊要注意的是, 加入的硬碟和 LiveCD 重開抓到的硬碟不同, 所以要用 dmesg | grep sd 看一下, 還有用 cat /proc/mdstat 看一下目前己經加入 Raid 的是那一顆 HDD.
mdadm --manage --add /dev/md1 /dev/sdc1
mdadm --manage --add /dev/md2 /dev/sdc2
mdadm --manage --add /dev/md3 /dev/sdc3
下完指令之後就可以看到在跑 sync 了
# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdc2[2] sda2[0]
1899413056 blocks [2/1] [U_]
resync=DELAYED
md3 : active raid1 sdc3[2] sda3[0]
5269248 blocks [2/1] [U_]
resync=DELAYED
md1 : active raid1 sdc1[2] sda1[0]
48829440 blocks [2/1] [U_]
[==>..................] recovery = 12.4% (6068736/48829440) finish=6.6min speed=107126K/sec
unused devices:
大功告成… 親一個~~
每次這樣備份都要花一天, 有沒有簡單一點的方法呢?
不要說買 Raid Box 二個, 直接 Copy 過去, Raid Box 又貴又不一定穩定, 我之前買某一家的, 操一年就掛了, 維修的費用快可以買一台新. 所以我再也不想碰 Raid Box.
換掉一顆硬碟
2021/02/27
前二天 Power 掛掉,可能連帶影響到某顆 HDD 出問題,只能再花錢換掉,這次就沒有一次換二顆硬碟,就先換一顆就好
換的過程也不難,大致上就是
1) 裝新硬碟
2) 確定要換下的舊硬碟
3) 將舊硬碟從系統移除
4) 加上新硬碟
檢查目前的 Raid
# cat /proc/mdstat
Personalities : [raid1]
md125 : active raid1 sda3[2] sdc3[0]
5639845504 blocks super 1.2 [2/2] [UU]
bitmap: 0/43 pages [0KB], 65536KB chunk
md126 : active (auto-read-only) raid1 sda4[2] sdc4[0]
10513984 blocks super 1.2 [2/2] [UU]
md127 : active raid1 sda2[1] sdc2[0]
209715136 blocks [2/2] [UU]
bitmap: 2/2 pages [8KB], 65536KB chunk
檢查要換下來的硬碟
# smartctl -A /dev/sdc
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.10.18-gentoo-x86_64] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000b 090 090 016 Pre-fail Always - 3342351
2 Throughput_Performance 0x0005 138 138 054 Pre-fail Offline - 100
3 Spin_Up_Time 0x0007 156 156 024 Pre-fail Always - 412 (Average 433)
4 Start_Stop_Count 0x0012 100 100 000 Old_age Always - 53
5 Reallocated_Sector_Ct 0x0033 034 034 005 Pre-fail Always - 0
7 Seek_Error_Rate 0x000b 100 100 067 Pre-fail Always - 0
8 Seek_Time_Performance 0x0005 140 140 020 Pre-fail Offline - 15
9 Power_On_Hours 0x0012 096 096 000 Old_age Always - 29568
10 Spin_Retry_Count 0x0013 100 100 060 Pre-fail Always - 0
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 52
192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 1195
193 Load_Cycle_Count 0x0012 100 100 000 Old_age Always - 1195
194 Temperature_Celsius 0x0002 125 125 000 Old_age Always - 48 (Min/Max 24/65)
196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0
197 Current_Pending_Sector 0x0022 034 034 000 Old_age Always - 65535
198 Offline_Uncorrectable 0x0008 032 032 000 Old_age Offline - 15341
199 UDMA_CRC_Error_Count 0x000a 200 200 000 Old_age Always - 0
這邊可以看到
Current_Pending_Sector Offline_Uncorrectable 這兩個值異常高,雖然 Reallocated_Event_Count 目前是 0 ,但是還是預防性換硬碟好了
將壞掉的硬碟從 Raid 移除
mdadm --manage /dev/md125 --fail /dev/sdc3
mdadm --manage --remove /dev/md125 /dev/sdc3
mdadm --manage /dev/md126 --fail /dev/sdc4
mdadm --manage --remove /dev/md126 /dev/sdc4
mdadm --manage /dev/md127 --fail /dev/sdc2
mdadm --manage --remove /dev/md127 /dev/sdc2
再次檢查 mdstat 的狀態
# cat /proc/mdstat
Personalities : [raid1]
md125 : active raid1 sda3[2]
5639845504 blocks super 1.2 [2/1] [_U]
bitmap: 3/43 pages [12KB], 65536KB chunk
md126 : active (auto-read-only) raid1 sda4[2]
10513984 blocks super 1.2 [2/1] [_U]
md127 : active raid1 sda2[1]
209715136 blocks [2/1] [_U]
bitmap: 2/2 pages [8KB], 65536KB chunk
unused devices: <none>
複製 partition 到新硬碟
這一步驟前面也有,不過還是附上
# sfdisk -d /dev/sda > sda.layout
# sfdisk /dev/sdb < sda.layout
檢查 Partition 是不是確定複製過去
# fdisk /dev/sda
Welcome to fdisk (util-linux 2.36.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
命令 (m 以獲得說明):p
Disk /dev/sda: 5.46 TiB, 6001175126016 bytes, 11721045168 sectors
Disk model: HGST HDN726060AL
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: C82DA0A3-9657-4807-BBEA-79FA0EB48349
所用裝置 Start 結束 磁區 Size 類型
/dev/sda1 2048 616447 614400 300M EFI System
/dev/sda2 616448 420046847 419430400 200G Linux RAID
/dev/sda3 420046848 11700000000 11279953153 5.3T Linux RAID
/dev/sda4 11700000768 11721045134 21044367 10G Linux RAID
命令 (m 以獲得說明):q
ms1 ~ # fdisk /dev/sdb
Welcome to fdisk (util-linux 2.36.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
命令 (m 以獲得說明):p
Disk /dev/sdb: 5.46 TiB, 6001175126016 bytes, 11721045168 sectors
Disk model: TOSHIBA MG06ACA6
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: C82DA0A3-9657-4807-BBEA-79FA0EB48349
所用裝置 Start 結束 磁區 Size 類型
/dev/sdb1 2048 616447 614400 300M EFI System
/dev/sdb2 616448 420046847 419430400 200G Linux RAID
/dev/sdb3 420046848 11700000000 11279953153 5.3T Linux RAID
/dev/sdb4 11700000768 11721045134 21044367 10G Linux RAID
命令 (m 以獲得說明):q
將新硬碟加入 Raid 系統
mdadm --manage --add /dev/md125 /dev/sdb3
mdadm --manage --add /dev/md126 /dev/sdb4
mdadm --manage --add /dev/md127 /dev/sdb2
檢查 raid status
# cat /proc/mdstat
Personalities : [raid1]
md125 : active raid1 sdb3[3] sda3[2]
5639845504 blocks super 1.2 [2/1] [_U]
[>....................] recovery = 3.0% (174198208/5639845504) finish=459.3min speed=198286K/sec
bitmap: 2/43 pages [8KB], 65536KB chunk
md126 : active raid1 sdb4[3] sda4[2]
10513984 blocks super 1.2 [2/1] [_U]
resync=DELAYED
md127 : active raid1 sdb2[2] sda2[1]
209715136 blocks [2/1] [_U]
resync=DELAYED
bitmap: 2/2 pages [8KB], 65536KB chunk
unused devices: <none>
後記
雖然升級 Linux kernel 後 md 的位置都變了,本來從 md1x 變成 md12x,但是整個 Software Raid 1 的移轉算很順利,前後不到 10 分鐘就弄完了,主要還是確認輸入的資料正確性花比較久時間,加上換硬碟的時間大概 30 分鐘
只是買硬碟心比較痛而已
其他
遇到 inactivate md 怎麼辦
這問題很簡單,啟動就好了
$ cat /proc/mdstat md127 : inactive sda2[1](S) 209715136 blocks # mdadm --run /dev/md127 md127 : active (auto-read-only) raid1 sda2[1] 209715136 blocks [2/1] [_U] bitmap: 2/2 pages [8KB], 65536KB chunk $ mdadm --manage --add /dev/md127 /dev/sdb2 mdadm: re-added /dev/sdb2 $ cat /proc/mdstat md127 : active raid1 sdb2[0] sda2[1] 209715136 blocks [2/2] [UU] bitmap: 0/2 pages [0KB], 65536KB chunk
nomaka
網路好的話雲存儲不錯的
看了 文章受教了,有空自己也試試
richliu
沒有問題, 只是系統 pending commit 而己.