さらいふ

Ubuntuで既存の外部HDDからRAIDを組む

投稿日 : 2023/12/30 8:04:00

タグ : #SBC#arm64#Ubuntu#Raspberry Pi

この記事ではUbuntuで過去に使っていたファイル用のHDDやSSDなどををRAID化する方法です。

今回はOpenMediaVault(OMV)を使ってNASを構築していたRaspberry PiのSDカードがぶっ壊れたのでその再構築をかねています。(NAS化編は次回)

0. Raspberry PiにUbuntuをインストールする

ここは本題と関係ないので関係ない方は飛ばしてください。
Raspberry Pi imagerを使ってother-general-purpose OS > Ubuntu > Ubuntu Serverを選択します。
この時WiFiの自動設定をoffにした方良いかもです。僕はそこでバグってネットにつながりませんでした。
有線でやりましょう。

1. 既存のHDDからRAIDを構成する

  1. HDD-Aを最初にマウントしデータを読み取れるようにする
  2. HDD-BのみでRAIDを組む
  3. HDD-AからRAIDにデータをコピーする
  4. RAIDにHDD-Aを追加する
  5. 終わるのを見届ける

1-1. HDDをマウントする

まず最初にHDD-Aをマウントしデータをコピーできるようにします。
対象のHDDをPCまたはSBCに挿します。
以下のコマンドで対象のHDDを探します。
これからHDD-Aはsda1というパスになりますが、各自対象のパスに置き換えてください。

$ sudo fdisk -l

Device     Start        End    Sectors  Size Type
/dev/sda1   2048 7814037134 7814035087  3.6T Linux filesystem

こんな感じで /dev/sdaというのが確認できたらOKです。

マウント用のディレクトリを作成し、マウントします。

$ sudo mkdir -p /drive/sda1

$ sudo mount /dev/sda1 /drive/sda1

1-2. RAIDを組む

次にHDD-Bを対象としてRAIDを組みます。
1-1と同じようにHDD-BをPCまたはSBCに挿します。

$ sudo fdisk -l

Device     Start        End    Sectors  Size Type
/dev/sdb1   2048 7814037134 7814035087  3.6T Linux filesystem

同じように場所がわかったら、パーティションがあるか確認しなければ作成します。
(今回は過去に一度OMVに刺してたので両方パーティションが存在していました。多分新規の場合はパーティションがないはずなので以下の手順に沿って作成してください。また、最後のRAIDのコマンドは作成されててもされてなくても実行してください。)

$ sudo parted -l

Model: XXXXXX
Disk /dev/sdb: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt #(←パーティションがなければここが何もないはず...)
Disk Flags: 

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  4001GB  4001GB  ext4

# パーティションが作成されていない場合
$ parted --script /dev/sdb1 "mklabel gpt"
$ parted --script /dev/sdb "mkpart primary 0% 100%"

# パーティションが作成されている場合もされていない場合もすること
$ parted --script /dev/sdb "set 1 raid on"

次にRAIDを組む際に必要なものをinstallします。

$ sudo apt install mdadm

そして、HDD-BのみでRAIDを組みます。(今回はRAID1で組みます)

$ sudo mdadm --create /dev/md0 --level=1 --raid-device=2 missing /dev/sdb1 

これでHDD-BだけでRAIDを組むことができました。
正常に組めたら、任意の形式でフォーマットして、マウントしておきます。

$ sudo mkfs.ext4 /dev/md0

mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 976721360 4k blocks and 244187136 inodes
Filesystem UUID: XXXX-XXX-XXX
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

$ sudo mkdir /dev/md0 /device/md0
$ sudo mount /dev/md0 /device/md0

正常にマウントできたか確認しておきます。

$ df
/dev/md0       3844420408        28 3649059724   1% /drive/md0

OKですね。

1-3. HDD-AからRAIDにデータをコピーする

すでにマウントされているHDD-Aから先ほどマウントしたRAID(md0)にデータをコピーします。
今回はrsyncを使って同期します。

$ sudo rsync -avr /drive/sda1/ /drive/md0

これで同期が始まります。終わるまでコーヒーでも飲んで待ちましょう。
進行状況やlsで軽くファイルがちゃんと転送されているか確認して次のステップへ移動してください。
最悪データが飛びます。

1-4. RAIDにHDD-Aを追加する

とりあえず、マウントしているHDD-Aをアンマウントします。

$ sudo umount  /dev/sda1

そして、RAIDに組み入れます。

$ parted --script /dev/sdb "set 1 raid on"
$ sudo mdadm /dev/md0 -a /dev/sda1

これでRAIDにHDD-Aを組み入れることができました。
組み入れ後RAIDの同期が始まるので、以下のコマンドで確認します。

$ cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid1 sda1[2] sdb1[1]
      3906885440 blocks super 1.2 [2/1] [_U]
      [>....................]  recovery =  0.2% (8716160/3906885440) finish=511.2min speed=127088K/sec
      bitmap: 30/30 pages [120KB], 65536KB chunk

このようにrecoveryのようになってる場合は同期中です。
待ちましょう。

2. 完成

上記の同期が終われば完了です。
お疲れ様でした。

さらだぼぉる

[非公式]滋賀県コロナまとめサイトをはじめとした滋賀情報ネットプロジェクトといった地域情報を発信する取り組みをしている。 2022年10月現在高校三年生で滋賀在住。 PythonやSvelteKitが最近のお気に入り。