ストレージの信頼性・
そこで今回はLXDを用いて、任意の数のストレージが繋がれたインスタンスを作成し、RAIDの構築方法や動作確認手順を気軽に試せるようにしてみましょう。
RAIDはバックアップではない
Ubuntuかどうかに関係なく、この世にあるものはだいたい壊れます。壊れてほしくないときに限って壊れます。それはストレージであっても例外ではありません。たとえ名前に金とか鉄とか星とかついていても、壊れる時は壊れます。だからこそバックアップが重要なわけですが、サービスそのものの信頼性や可用性を維持するためには、
そこで出てくるのがRAID
RAIDには専用のコントローラーを使うハードウェアRAIDと、OS内のプログラムなどでRAID機能を実現するソフトウェアRAID、さらにソフトウェアRAIDのうちBIOSなどがハードウェアRAIDっぽく振る舞うFakeRAID/
Ubuntuの場合はLinux MD/mdadmを利用したソフトウェアRAID環境の構築をサポートしていますし、サーバー版のインストーラーであればインストール時点でRAID環境を構築できます[1]。しかしながらRAID環境を構築するには、RAIDの種類に応じた数のストレージデバイスが必要です。ノートPCはもちろん、最近のデスクトップPCも小型が進んできて、接続できるストレージの台数は限られています[2]。よって、物理的に複数のストレージを複数台用意して試すのはなかなか大変です[3]。
そこで登場するのがLXDを含む、仮想マシン環境です。LXDはもともとシステムコンテナの管理ツールでしたが、第609回
さらにLXDは、第571回の
これにより任意のストレージ数で、UbuntuのソフトウェアRAIDの動作確認環境を構築できます。バックエンドが単なるイメージファイルになってしまうものの、mdadmやUbuntuインストーラーなどのRAID関連のフロントエンドの操作方法を習熟できますし、各種ソフトウェアの動作確認、障害時の予行演習、バックアップ・
LXD環境の作り方については第521回の
ちなみにインターネットであれ書籍であれ、
LXDに専用のストレージプールを作成する
LXDは
このストレージプールは、LXDがサポートしているファイルシステム・
まずは次のように
$ lxc storage create raid btrfs size=400GB
$ lxc storage show raid
config:
size: 400GB
source: /var/snap/lxd/common/lxd/disks/raid.img
description: ""
name: raid
driver: btrfs
used_by: []
status: Created
locations:
- none
$ lxc storage info raid
info:
description: ""
driver: btrfs
name: raid
space used: 3.75MiB
total space: 372.53GiB
used by: {}
btrfs等のファイルシステムを指定した場合は、sourceにあるようにイメージファイルが作られます。また、source=オプションを使うことで、指定したブロックデバイスをストレージプールとして専有することも可能です。詳しい設定はLXDのドキュメントにある
RAID 1:2台から始められるミラーリングシステム
RAIDはその構成によって
さて、RAIDにおいてもっともシンプルな構成がmadadmのRAID 1は3台以上の構成も可能になっています。
同じ最小構成のRAIDとして
では、さっそくストレージ2台のインスタンスを作ってみましょう。まずは空のインスタンスを作ります。このときデフォルトプロファイルの設定によって1台のストレージが割り当てられます。
$ lxc init raid1 --empty --vm -c limits.cpu=2 -c limits.memory=8GiB --storage raid $ lxc config device set raid1 root size=40GiB
「--storage raid」setではなくoverrideを指定するのですが、今回はdefaultストレージプールではないのでsetを呼ぶ必要があるのがポイントです。overrideを使った場合はError: The profile device doesn't exist」
今回はUbuntuサーバーのインストーラーを使いたいので、Ubuntu 22.
$ lxc config device add raid1 iso disk boot.priority=1 \ source=$HOME/ダウンロード/ubuntu-22.04.1-live-server-amd64.iso
ここからが今回の重要な手順です。ここまではストレージが1台という構成でしたが、ストレージプールから新たにブロックデバイスを作成し、これを仮想マシンに割り当てます。まずはblockタイプのカスタムストレージボリュームを作成します。ストレージボリュームはストレージプールから、必要なサイズの領域を切り出したものです。ストレージボリュームにはインスタンスやそのベースイメージに使われるものなどがありますが、このうち
カスタムストレージボリューム自体は、複数のインスタンスに同時にアタッチし、データの共有などにも利用できます。さらに
$ lxc storage volume create raid raid1b --type=block size=40GiB
「raid」raid1b」raid1b」--type=block」
さらに作成したカスタムストレージボリュームを、インスタンスにアタッチしておきます。
$ lxc storage volume attach raid raid1b raid1
attach以降の引数の順番はストレージプールの名前raid)、ストレージボリュームの名前raid1b)、アタッチ対象のインスタンス名raid1)
$ lxc start raid1 --console=vga
Ubuntu 18.
キーボードやネットワーク設定等が完了したら、ストレージの設定です。ここは
UbuntuでRAIDの設定を行うには、いくつかわかりにくいポイントが存在します。まず、最初にESP
さて、正しくボリュームを追加できていたら、次の図の
どちらかの好きなほうのストレージにESPを作成します。
残りはRAID用に使ってしまいたいところですが、ESPを作らなかったほうもESP相当のパーティションを作っておくことをおすすめします。これは先ほどと同様にもうひとつのデバイス名にカーソルを合わせ、Enterキーを押し、今度は
こちらのデバイスはUbuntuからは使われませんし、自動的にはマウントもしません。しかしながら/boot/としてマウントされるパーティション)
さて、ようやくmdraidの設定に入ります。2台のストレージについて順番に
次に
名前は任意の値が設定可能です。ここは初期値の
「active」
RAIDが設定できたので、ストレージがひとつの
最近のGRUBはRAIDを認識できますので、/bootをRAIDの外に置く必要はありません。もちろん別にわけてもかまいません。あと、スワップパーティションをRAIDの外に作成しても良いでしょう。今回はRAIDの中の/swap.として構築しているため、スワップファイルへの書き込みもミラーリングされてしまいます。
あとは通常のUbuntuのインストール手順を実施しインストールが完了するまで待ちます。インストールが完了したら再起動しましょう。
そうすると、インストールイメージを削除するにはEnterキーを押すよう指示があるので、Enterを押します。LXDインスタンスが再起動しますので、今度は次のようなコマンドで接続します。
$ lxc console raid1 --type=vga
もちろんlxc list raid1」
RAID の動作確認
UbuntuにおけるRAID機能のフロントエンドはmdadmコマンドです。ただしその実態はLinuxカーネル側の各種実装が担っています[5]。よっていくつかの確認方法を紹介しましょう。
まず、RAIDの状態を確認する一番シンプルな方法は、/proc/」
$ cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sda2[1] sdb2[0]
40806400 blocks super 1.2 [2/2] [UU]
unused devices: <none>
「Personalities」
- RAIDデバイス
(アレイ) として 「 md0( /dev/)」が存在するmd0 md0はRAID 1であり、/dev/とsda2 /dev/から構成されているsdb2 - 約40Mブロックであり、メタデータのバージョンは1.
2 - 「
[UU]」なのでどちらも 「Used」 状態
mdadmの設定は/etc/に作成されています。これはインストール時に自動的に作られたものです。
$ cat /etc/mdadm/mdadm.conf ARRAY /dev/md0 metadata=1.2 name=ubuntu-server:0 UUID=65e6f327:8b228a65:000de3d1:5ae1da1c MAILADDR root
内容についてはman mdadm.を参照してください。
より詳細な表示を行いたいなら、mdadmコマンドを利用します。
$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sat Jan 28 16:17:05 2023
Raid Level : raid1
Array Size : 40806400 (38.92 GiB 41.79 GB)
Used Dev Size : 40806400 (38.92 GiB 41.79 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Sat Jan 28 17:09:22 2023
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : ubuntu-server:0
UUID : 65e6f327:8b228a65:000de3d1:5ae1da1c
Events : 375
Number Major Minor RaidDevice State
0 8 18 0 active sync /dev/sdb2
1 8 2 1 active sync /dev/sda2
これでRAID 1の環境は準備ができました。しかしながら、これだけだと
ボリュームの削除方法
最後にテスト用に作ったLXDのストレージボリュームのデタッチ方法やストレージプールの削除方法も紹介しておきましょう。まずLXDのインスタンスを終了しておきます。誰もボリュームないしプールを使わなくなったら、次のように削除可能です。
raid1インスタンスからraid1ストレージプールに所属する、カスタムストレージボリュームである「raid1b」をデタッチする $ lxc storage volume detach raid raid1b raid1 raidストレージプールにあるカスタムストレージボリューム「raid1b」を削除する $ lxc storage volume delete raid raid1b raidストレージプールを削除する $ lxc storage delete raid
デタッチは再アタッチすることで復活できます。しかしながら削除系のコマンドは、復旧方法が存在しないため注意してください。
今回はまず手始めとして、シンプルなRAID 1についてのみ説明しました。記事が長くなってきたましたので、もっと台数が必要なRAID環境の構築方法は次回に解説します。