LINSTORのビルドとインストール方法(2024年)

LINSTORはオープンソースで開発されているので、LINBIT社の公開サイトからソースコードを入手して、パッケージをビルドして利用することができます。

この記事ではLINSTORをソースコードからビルドして、インストールする手順を紹介します。

1.ビルド環境の準備

ビルドは以下のようなスペックがあれば可能です。

  • CPU インテル系で64ビットCPUを推奨(x86、AMDでも可)
  • メモリー 4GBバイト以上を推奨
  • ストレージ 20Gバイト

DRBDやLINBITを動かすサーバーとは別に、ビルド環境用にサーバを確保されることを強く推奨します。また、ビルド環境と実際にDRBDやLINSTORをインストールするサーバーは同じCPUのアーキテクチャを選んでください。

ビルド環境はこちらの「DRBDのビルド方法(2024年版)」を参照して構築します。

2.LINSTORパッケージのビルド

ビルド環境の準備が出来たら、LINSTORのソースコードをLINBIT社のgithubからダウンロードしてビルドコマンドを実行します。パッケージはLINSTORサーバー、LINSTORクライアント、Pythonのライブラリーの3種類になります。
以下のコマンドを実行すると、RPMファイルが作成されて~/rpmbulid/RPMSディレクトリに保存されます。

git clone --recursive http://github.com/LINBIT/linstor-server.git 
cd linstor-server
make tarball
cp linstor-server-*.tar.gz ~/rpmbuild/SOURCES
rpmbuild -bb linstor.spec
cd ../
git clone --recursive http://github.com/LINBIT/linstor-client.git 
cd linstor-client
make rpm
cp dist/linstor-client-*noarch.rpm ~/rpmbuild/RPMS/noarch
cd ../
git clone --recursive http://github.com/LINBIT/linstor-api-py.git 
cd linstor-api-py
make rpm
cp dist/python-linstor-*noarch.rpm ~/rpmbuild/RPMS/noarch

2024年3月時点では次のようなパッケージが作成されました。

[root@node0 ~]# ls -l ~/rpmbuild/RPMS/noarch/
total 69116
-rw-r--r-- 1 root root   245016 Mar  3 18:11 linstor-client-1.21.1-1.noarch.rpm
-rw-r--r-- 1 root root 55561952 Mar  4 09:08 linstor-common-1.26.2-1.el9.noarch.rpm
-rw-r--r-- 1 root root 13943844 Mar  4 09:07 linstor-controller-1.26.2-1.el9.noarch.rpm
-rw-r--r-- 1 root root   860156 Mar  4 09:07 linstor-satellite-1.26.2-1.el9.noarch.rpm
-rw-r--r-- 1 root root   159076 Mar  4 09:28 python-linstor-1.21.1-1.noarch.rpm

3.LINSTORのインストール

LINSTORをインストールするには、ネットワークにつながった、最低3台のサーバーが必要になります。それぞれのサーバーはメモリーは最低4Gバイト必要で、ストレージとネットワークはSDSのシステムなので、ストレージは多く、ネットワークは速ければより良いパフォーマンスが得られます。

今回はテストのために、メモリー4Gバイト、ストレージは16GバイトのサーバーをVMwareの仮想環境内に準備しました。IPアドレスはこのように設定しました。

 ホスト名IPアドレス備考
1node110.1.12.50Controller/Satellite兼用
2node210.1.12.51Satelliteノード
3node310.1.12.52Satelliteノード

node1ではLINSTORのControllerというサーバープログラムが、node1~node3ではSatelliteというプログラムが動作します。ControllerはLINSTOR全体を管理するプログラムで、SatelliteはControllerの命令によりDRBDやLVM等のプログラムを設定するものになります。

Controllerの冗長化を考えると、Controllerは複数のノードにインストールする場合もありますが、今回はテストのため、node1のみにインストールします。

node1では次のようにDRBDとLINSTOR Controller、LINSTOR Satelliteをインストールします。

[root@node1 ~]# dnf -y kmod-drbd drbd-utils drrbd-selinux
[root@node1 ~]# dnf -y install linstor-controller linstor-satellite python-linstor linstor-client linstor-common

node2、node3ではDRBDとLINSTOR Satelliteをインストールします。

[root@node2 ~]# dnf -y kmod-drbd drbd-utils drrbd-selinux
[root@node2 ~]# dnf -y install linstor-satellite python-linstor linstor-client linstor-common

エラー無くインストール出来たら、次は設定に進みます。

4.LINSTORの設定

LINSTORは各ノードが持つストレージをLVMで管理して必要なサイズを切り出したり、スナップショットと取ったりします。(同様のことをZFSとLINSTORの組み合わせでも行えますが、ZFSについては今回は触れません。)
このためLINSTORを使う前に、各ノードでLVMのセットアップを行います。
まずストレージをLVMのPV及びVGで管理できるようにLVMの設定コマンドを実行します。
今回の環境では/dev/sdbが8Gバイトのストレージデバイスになっています。

各ノードで次のコマンドを実行します。(PVとVGの作成)

pvcreate /dev/sdb
vgcreate /dev/sdb drbdpool

次にLVを作成しますがLINSTOR側でスナップショットを使うために–thinオプションをつけてロジカルボリュームを作成します。

lvcreate --thin -l 100%FREE drbdpool/thin

LVMの設定が終わったら、LINSTORの設定を行います。linstor というコマンドを使いますが、これはnode1で実行します。※設定をすればnode2、node3でも実行が可能になります。今回の記事では割愛します。

今回の環境でnode1をコントローラーノード、node2、3をLINSTORの構成ノードにするコマンドは次になります。node1はCombinedなので構成ノードも兼ねます。

[root@node1 ~]# linstor node list 
+------------------------------------------------------+
| Node  | NodeType  | Addresses               | State  |
|======================================================|
| node1 | COMBINED  | 10.1.12.50:3366 (PLAIN) | Online |
| node2 | SATELLITE | 10.1.12.51:3366 (PLAIN) | Online |
| node3 | SATELLITE | 10.1.12.52:3366 (PLAIN) | Online |
+------------------------------------------------------+

次にLINSTOR内にストレージプールを定義します。LINSTORでは定義したストレージプールからストレージを切り出して利用します。
先ほどlvcreateで切り出したロジカルボリューム(LV)をLINSTOR内でpool0というストレージプールに割り当てるために以下のコマンドを実行します。(node1で実行)

linstor storage-pool create lvmthin node1 pool0 drbdpool/thin
linstor storage-pool create lvmthin node2 pool0 drbdpool/thin
linstor storage-pool create lvmthin node3 pool0 drbdpool/thin

ストレージプールの設定は「linstor storage-pool list」で確認ができます。

[root@node1 ~]# linstor storage-pool list 
+-------------------------------------------------||--------------------------+
| StoragePool | Node  | Driver   | PoolName      |||ots | State | SharedName  |
|=================================================||==========================|
| pool0       | node1 | LVM_THIN | drbdpool/thin |||    | Ok    | node1;pool0 |
| pool0       | node2 | LVM_THIN | drbdpool/thin |||    | Ok    | node2;pool0 |
| pool0       | node3 | LVM_THIN | drbdpool/thin |||    | Ok    | node3;pool0 |
+-------------------------------------------------||--------------------------+

定義したストレージプールからボリュームを切り出して、ユーザーが利用できるようにしましょう。
LINSTORには切り出すボリュームの切り出し元のプールや、冗長化する時にいくつのボリュームとミラーリングするか定義するリソースグループという概念があります。
例えば次のコマンドを実行すると、ボリュームはpool0から切り出して、2つのボリュームでミラーリングするリソースグループmy_rgを定義できます。

linstor resource-group create my_rg --place-count 2 --storage-pool pool0

my_rgは金型のようなものです。これを使って1Gのボリュームを切り出してみます。

linstor resource-group spawn-resources my_rg r0 1G

切り出されたボリュームを確認してみましょう。「linstor volume-definition list」コマンドをnode1で実行してみてください。

[root@node1 ~]# linstor volume-definition list
+---------------------------------------------------------------+
| ResourceName | VolumeNr | VolumeMinor | Size  | Gross | State |
|===============================================================|
| r0           | 0        | 1000        | 1 GiB |       | ok    |
+---------------------------------------------------------------+

VolumeMinorはDRBDのデバイス名の数字になります。この場合は/dev/drbd1000になります。

どのノードのストレージプールが使われているかも「linstor volume list」コマンドで確認できます。

[root@node1 ~]# linstor volume list
+------------------------------------------||---------------------------------||--
| Node  | Resource | StoragePool          |||| DeviceName    | Allocated | InU||
|==========================================||=================================||==
| node1 | r0       | pool0                |||| /dev/drbd1000 |   315 KiB | Unu||
| node2 | r0       | pool0                |||| /dev/drbd1000 |   315 KiB | Unu||
| node3 | r0       | DfltDisklessStorPool |||| /dev/drbd1000 |           | Unu||
+------------------------------------------||---------------------------------||--・・

この情報によると、/dev/drbd1000のデバイスはnode1~3でアクセスができて、node1とnode2に実際のデータが存在するようです。またnode1とnode2のボリュームはミラーリングされているので、/dev/drbd1000へ記録したデータはnode1とnode2に保存されます。node3は「DfltDisklessStorPool 」というストレージプールになっています。これはデバイスはあるがボリュームは無い状態となります。node3で/dev/drbd1000へアクセスするとネットワーク経由でnode1、node2のボリュームのデータがアクセスできます。