Linux, 工作, 生活, 家人

Linux, Gentoo, Ubuntu

Linux Software Raid 系統轉移

現在硬碟價格愈來低, 但是穩定性也一直是為人所詬病的.
所以我目前系統大概是這樣做的

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

回覆留言對象 取消回覆