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アドレス | 備考 | |
1 | node1 | 10.1.12.50 | Controller/Satellite兼用 |
2 | node2 | 10.1.12.51 | Satelliteノード |
3 | node3 | 10.1.12.52 | Satelliteノード |
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のボリュームのデータがアクセスできます。