ストレージの信頼性・
そこで今回は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環境の構築方法は次回に解説します。