応答ファイルを利用したDb2 12.1.1導入＆構成@WSL2

Db2では、db2setupコマンド＋応答ファイルを利用することで、製品インストールからDB作成まで自動化することができます。
応答ファイルを用意しておけば対話式のやりとり無しで完了できるため、Ansible等との相性も良いと思われます。

※ 主題としてはdb2setupの利用手順の備忘録ですが、WSL2環境でのDb2導入時エラー対処手順を含みます

### db2setupで出来ること、今回やったこと
db2setupコマンド1つで以下のような作業がカバーされます。

 (1) Db2製品インストール
 (2) Db2インスタンスオーナーとなるOSユーザー作成
 (3) Db2インスタンス作成
 (4) Db2レジストリー変数の設定
 (5) Db2データベースマネージャー構成パラメータの設定
 (6) データベース作成

 
他にもpureScaleであれば複数インスタンスの定義、Db2クライアントであればノード、データベースのカタログ登録作業なども実施できて便利です。

さらに、現行環境の定義を応答ファイルに出力し、新しいDb2バージョンを動かす移行先サーバーでdb2setupの引数として渡して現行構成を移植できる仕組みもあります。便利！
[Db2 12.1マニュアル「応答ファイル生成プログラム」](https://www.ibm.com/docs/ja/db2/12.1?topic=file-response-generator)


#### 今回の作業対象
今回は、ごく最低限として以下の作業だけ、db2setupで実施しています。
 (1) Db2製品インストール
 (3) Db2インスタンス作成

逆に、(2)(6)を自動化しなかった理由は以下です。
 * (2) Db2インスタンスオーナーとなるOSユーザー作成
     * FENCEDユーザーは自分で作成する必要があるため
     * Linux useraddコマンドを1回たたくのも2回たたくのも手間として変わらない
 * (6) データベース作成
     * DB作成オプションを指定する方法がわからなかったため
     * コードセット、照合順序などのオプションは明示的に設定したい
     * (実は方法あるかもしれず、要確認)

#### 環境
 * WSL2
 * Ubuntu 22.04
 * Db2 for LUW 12.1.1.0

### 事前準備
以下の作業は、db2setupコマンド実行前に実施しておく必要があります。
すべて root ユーザで実行します。

##### 事前準備＜１＞Db2前提要件確認
db2prereqcheckコマンドを実行して、カーネルレベルなどのDb2の要件を満たす環境であるか、確認します。
```
$ ./db2prereqcheck -v 12.1.1.0

==========================================================================

Thu Feb 20 11:49:47 2025
DB2 インストールの前提条件を検査しています。バージョン「12.1.1.0」。オペレーティング・システム「Linux」

「カーネル・レベル 」の妥当性検査を実行しています...
   最小の必須オペレーティング・システム・カーネル・レベル: 「5.14.0」。
   実際のオペレーティング・システム・カーネル・レベル: 「5.15.167.4」。
   要件が一致しました。

「Linux ディストリビューション 」の妥当性検査を実行しています...
   最小必須「UBUNTU」バージョン: 「22.04」
   実際のバージョン: 「22.04」
   要件が一致しました。

「ksh symbolic link」の妥当性検査を実行しています...
   ERROR : 要件が一致しませんでした。

「Bin user」の妥当性検査を実行しています...
   要件が一致しました。

「libcurl.so.4 library」の妥当性検査を実行しています...
   要件が一致しました。

「C++ ライブラリー・バージョン 」の妥当性検査を実行しています...
   最小必須 C++ ライブラリー: 「libstdc++.so.6」
   標準 C++ ライブラリーは次のディレクトリーにあります: 「/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30」。
   実際の C++ ライブラリー: 「CXXABI_1.3.1」
   要件が一致しました。


「「libstdc++.so.6」の 32 ビット・バージョン 」の妥当性検査を実行しています...
   次のディレクトリーで 64 ビット「/lib/x86_64-linux-gnu/libstdc++.so.6」が見つかりました: 「/lib/x86_64-linux-gnu」。
DBT3514W db2prereqcheck ユーティリティは、"libstdc++.i686" パッケージによって提供される 32 ビット・ライブラリー・ファイル "libstdc++.so.6" を見つけられませんでした。

「libaio.so バージョン 」の妥当性検査を実行しています...
DBT3553I  db2prereqcheck ユーティリティーは正常に libaio.so.1 ファイルをロードしました。
   要件が一致しました。

「libnuma.so バージョン 」の妥当性検査を実行しています...
DBT3610I  db2prereqcheck ユーティリティーは正常に libnuma.so.1 ファイルをロードしました。
   要件が一致しました。

「/lib/i386-linux-gnu/libpam.so*」の妥当性検査を実行しています...
   DBT3514W db2prereqcheck ユーティリティは、"" パッケージによって提供される 32 ビット・ライブラリー・ファイル "/lib/i386-linux-gnu/libpam.so*" を見つけられませんでした。
   WARNING : 要件が一致しませんでした。
DB2 データベース「Server」 の要件と一致しませんでした。バージョン:「12.1.1.0」。
現行システムで満たされていない前提条件の要約:
   DBT3514W db2prereqcheck ユーティリティは、"" パッケージによって提供される 32 ビット・ライブラリー・ファイル "/lib/i386-linux-gnu/libpam.so*" を見つけられませんでした。


DBT3514W db2prereqcheck ユーティリティは、"libstdc++.i686" パッケージによって提供される 32 ビット・ライブラリー・ファイル "libstdc++.so.6" を見つけられませんでした。


DBT3618E db2prereqcheck ユーティリティーは、ksh が ksh、ksh93、mksh、または lksh にリンクされていないことを検出しました。 これは、Tivoli SA MP を使用する Db2 高可用性フィーチャーに必要です。


```

kshが足りないので導入
```
$ sudo apt -y install ksh ksh93
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libfreetype6
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  ksh93u+m
提案パッケージ:
  binfmt-support
以下のパッケージが新たにインストールされます:
  ksh ksh93u+m
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
901 kB のアーカイブを取得する必要があります。
この操作後に追加で 3,185 kB のディスク容量が消費されます。
取得:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 ksh93u+m amd64 1.0.0~beta.2-1 [894 kB]
取得:2 http://archive.ubuntu.com/ubuntu jammy/universe amd64 ksh all 20211217 [6,474 B]
901 kB を 3秒 で取得しました (293 kB/s)
以前に未選択のパッケージ ksh93u+m を選択しています。
(データベースを読み込んでいます ... 現在 35043 個のファイルとディレクトリがインストールされています。)
.../ksh93u+m_1.0.0~beta.2-1_amd64.deb を展開する準備をしています ...
ksh93u+m (1.0.0~beta.2-1) を展開しています...
以前に未選択のパッケージ ksh を選択しています。
.../archives/ksh_20211217_all.deb を展開する準備をしています ...
ksh (20211217) を展開しています...
ksh93u+m (1.0.0~beta.2-1) を設定しています ...
update-alternatives: /bin/ksh (ksh) を提供するために自動モードで /bin/ksh93 を使います
update-alternatives: /usr/bin/shcomp (shcomp) を提供するために自動モードで /usr/bin/shcomp93 を使います
ksh (20211217) を設定しています ...
man-db (2.10.2-1) のトリガを処理しています ...
Scanning processes...
Scanning processor microcode...
Scanning linux images...

Failed to retrieve available kernel versions.

Failed to check for processor microcode upgrades.

No services need to be restarted.

No containers need to be restarted.

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.

```

db2prereqcheck再実行 → 今度はクリアできました
```
$ ./db2prereqcheck -v 12.1.1.0

==========================================================================

Thu Feb 20 11:50:08 2025
DB2 インストールの前提条件を検査しています。バージョン「12.1.1.0」。オペレーティング・システム「Linux」

「カーネル・レベル 」の妥当性検査を実行しています...
   最小の必須オペレーティング・システム・カーネル・レベル: 「5.14.0」。
   実際のオペレーティング・システム・カーネル・レベル: 「5.15.167.4」。
   要件が一致しました。

「Linux ディストリビューション 」の妥当性検査を実行しています...
   最小必須「UBUNTU」バージョン: 「22.04」
   実際のバージョン: 「22.04」
   要件が一致しました。

「ksh symbolic link」の妥当性検査を実行しています...
   要件が一致しました。

「Bin user」の妥当性検査を実行しています...
   要件が一致しました。

「libcurl.so.4 library」の妥当性検査を実行しています...
   要件が一致しました。

「C++ ライブラリー・バージョン 」の妥当性検査を実行しています...
   最小必須 C++ ライブラリー: 「libstdc++.so.6」
   標準 C++ ライブラリーは次のディレクトリーにあります: 「/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30」。
   実際の C++ ライブラリー: 「CXXABI_1.3.1」
   要件が一致しました。


「「libstdc++.so.6」の 32 ビット・バージョン 」の妥当性検査を実行しています...
   次のディレクトリーで 64 ビット「/lib/x86_64-linux-gnu/libstdc++.so.6」が見つかりました: 「/lib/x86_64-linux-gnu」。
DBT3514W db2prereqcheck ユーティリティは、"libstdc++.i686" パッケージによって提供される 32 ビット・ライブラリー・ファイル "libstdc++.so.6" を見つけられませんでした。

「libaio.so バージョン 」の妥当性検査を実行しています...
DBT3553I  db2prereqcheck ユーティリティーは正常に libaio.so.1 ファイルをロードしました。
   要件が一致しました。

「libnuma.so バージョン 」の妥当性検査を実行しています...
DBT3610I  db2prereqcheck ユーティリティーは正常に libnuma.so.1 ファイルをロードしました。
   要件が一致しました。

「/lib/i386-linux-gnu/libpam.so*」の妥当性検査を実行しています...
   DBT3514W db2prereqcheck ユーティリティは、"" パッケージによって提供される 32 ビット・ライブラリー・ファイル "/lib/i386-linux-gnu/libpam.so*" を見つけられませんでした。
   WARNING : 要件が一致しませんでした。
DB2 データベース「Server」 の要件と一致しませんでした。バージョン:「12.1.1.0」。
現行システムで満たされていない前提条件の要約:
   DBT3514W db2prereqcheck ユーティリティは、"" パッケージによって提供される 32 ビット・ライブラリー・ファイル "/lib/i386-linux-gnu/libpam.so*" を見つけられませんでした。


DBT3514W db2prereqcheck ユーティリティは、"libstdc++.i686" パッケージによって提供される 32 ビット・ライブラリー・ファイル "libstdc++.so.6" を見つけられませんでした。

```


##### 事前準備＜2＞Db2用のOSグループ、ユーザー作成、パスワード構成
Db2が利用するOSグループ、OSユーザーを作成します。

OSグループ作成(Db2インスタンスオーナーが属するグループ)
```
groupadd -g 1001 db2iadm1
```

OSグループ作成(Db2 Fencedユーザーが属するグループ)
```
groupadd -g 1002 db2fadm1
```

OSユーザー作成(Db2インスタンスオーナー)
```
useradd -g 1001 -m my1211
```

OSユーザー作成(Db2 Fencedユーザー)
```
useradd -g 1002 -m db2ifenc1
```

各ユーザのパスワード設定
```
passwd <ユーザー名>
```

##### 事前準備＜3＞/etc/wsl.conf編集(WSL環境のみ)
環境に依存しそうではありますが、自分の環境ではこの作業を完了するまで、インストール時と起動後もエラーが出続けてしまいました。
※エラーが出た後で対応しても大丈夫でした

/etc/wsl.confファイルを編集します

```text:/etc/wsl.conf
[boot]
systemd=true
```

リブートします
```
wsl --shutdown
```


##### 事前準備＜4＞応答ファイル作成
Db2インストール・イメージを展開した先のディレクトリに応答ファイルのサンプルがあります。
コピーして、カスタマイズして利用します。

```
cp -p <インストール・イメージ展開先>/db2/linuxamd64/samples/db2server.rsp /work/mydb2server.rsp
```

事前準備＜2＞で作成したOSユーザ情報やポート番号など必要な情報を指定します

```text:編集後のサンプルファイル
PROD                      = DB2_SERVER_EDITION
FILE                      = /opt/ibm/db2/V12.1.1
LIC_AGREEMENT             = ACCEPT        ** ACCEPT or DECLINE
INSTALL_TYPE              = TYPICAL         ** TYPICAL, COMPACT, CUSTOM
LANG                     = JP              ** Japanese (ja_JP)
INSTANCE                  = DB2_INST        ** char(8)  no spaces
DB2_INST.NAME             = my1211       ** char(8)  no spaces, no upper case letters
DB2_INST.GROUP_NAME       = db2iadm1        ** char(30) no spaces
DB2_INST.PASSWORD         = xxxxxxx
DB2_INST.AUTOSTART        = YES             ** YES or NO
DB2_INST.START_DURING_INSTALL = YES         ** YES or NO. Default is YES.
DB2_INST.FCM_PORT_NUMBER = 20006           ** 1024 - 65535, the beginning port number.
DB2_INST.FENCED_USERNAME  = db2fenc1        ** char(8)  no spaces, no upper case letters
DB2_INST.FENCED_GROUP_NAME = db2iadm1       ** char(30)  no spaces
INSTALL_PCMK             = NO              ** YES or NO. Valid for root installation only.
```


##### 事前準備＜5＞応答ファイルの構文チェック
構文チェックを実行します。(db2setupコマンド -c オプション）
```
# ./db2setup -l ./install.log -r /work/mydb2server.rsp -c
DB2 データベース「Server」 の要件と一致しませんでした。バージョン:「12.1.1.0」。

現行システムで満たされていない前提条件の要約:

   DBT3514W db2prereqcheck ユーティリティは、"" パッケージによって提供される 32 ビット・ライブラリー・ファイル "/lib/i386-linux-gnu/libpam.so*" を見つけられませんでした。


DBT3514W db2prereqcheck ユーティリティは、"libstdc++.i686" パッケージによって提供される 32 ビット・ライブラリー・ファイル "libstdc++.so.6" を見つけられませんでした。


DBI1462I  指定された応答ファイルを db2setup コマンドが妥当性検査しています。 これには数分かかる可能性があります。

説明:

妥当性検査プロセスが進行中です。

ユーザーの処置:

アクションは不要です。


正常に実行が完了しました。

DBI1471I  db2setup
で応答ファイルが正常に妥当性検査されました。
ログ・ファイル: /work/images/server_dec_1211_noncsb/./install.log。
説明:  妥当性検査プロセスが正常に完了しました。
ユーザーの処置:
詳細については、ログ・ファイルを調べてください。
root@IBM-PF44EEMY:/work/images/server_dec_1211_noncsb# 
```

「正常に妥当性検査されました」のメッセージが出ているので、問題なく使えます。
※32bitライブラリ不足(新しいLinuxではもう提供されない)に起因するメッセージは無視して問題ありません

つづいて、実際に導入&構成を行います。


### db2setupコマンドによるDb2導入&構成
db2setupを実行します
```
root@IBM-PF44EEMY:/work/images/server_dec_1211_noncsb# ./db2setup -l ./install.log -r /work/mydb2server.rsp
DB2 データベース「Server」 の要件と一致しませんでした。バージョン:「12.1.1.0」。

現行システムで満たされていない前提条件の要約:

   DBT3514W db2prereqcheck ユーティリティは、"" パッケージによって提供される 32 ビット・ライブラリー・ファイル "/lib/i386-linux-gnu/libpam.so*" を見つけられませんでした。


DBT3514W db2prereqcheck ユーティリティは、"libstdc++.i686" パッケージによって提供される 32 ビット・ライブラリー・ファイル "libstdc++.so.6" を見つけられませんでした。


DBI1191I  提供された応答ファイルに従って、db2setup が DB2 をインストールおよび構成しています。 お待ちください。


System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: ホストが落ちています
正常に実行が完了しました。

詳しくは、「/work/images/server_dec_1211_noncsb/./install.log」にある
DB2 インストール・ログを参照してください。
```

「正常に実行が完了しました。」という出力行があることから導入&構成自体は出来ている様子ですが、一部エラーが出ています。
> System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: ホストが落ちています

※その他のメッセージは、32bitライブラリの欠如(もう存在しない)に起因するため無視して問題ありません

### 導入&構成できているか確認

Db2の導入&構成自体は、出来ていそうに見えます。
 * Db2インストール　→　完了（db2ls, db2levelコマンド出力より）
 * インスタンス作成 →　完了（db2ilistコマンド出力より）

```
# su - my1211
$ db2ls

インストール・パス    レベル  フィックスパック   特別なインストール番号   インストール日付      インストーラー UID
---------------------------------------------------------------------------------------------------------------------
/opt/ibm/db2/V12.1.1             12.1.1.0        0                            Thu Feb 20 19:03:36 2025 JST             0

$ db2level
DB21085I  このインスタンスまたはインストール
(該当する場合のインスタンス名: "my1211") は "64"
ビットおよび DB2 コード・リリース "SQL12011" をレベル ID
"02020110" で使用します。
情報トークンは、"DB2
v12.1.1.0"、"s2412161033"、"DYN2412161033AMD64"、およびフィックスパッ
ク "0" です。
製品は "/opt/ibm/db2/V12.1.1" にインストールされています。

```


```
# /opt/ibm/db2/V12.1.1/instance/db2ilist
my1211
```


しかしDb2の製品ログ、db2diag.logを見てみるとCriticalのエラーが大量に出ていて、とても健全には見えません。(→後で対処)
```
2025-02-20-19.24.50.637217+540 I63902E621            LEVEL: Event
PID     : 20493                TID : 140599990675008 PROC : db2sysc 0
INSTANCE: my1211               NODE : 000
APPHDL  : 0-7
HOSTNAME: IBM-PF44EEMY
EDUID   : 23                   EDUNAME: db2agent (instance) 0
FUNCTION: DB2 Common, Cryptography, cryptContextRealInit, probe:2742
DATA #1 : String, 37 bytes
CPU flags(string): 0xfffa32235f8bfbff
DATA #2 : String, 37 bytes
CPU flags(Uint64): 0xFFFA32235F8BFBFF
DATA #3 : String, 41 bytes
AES hardware acceleration detected: AESNI
DATA #4 : String, 48 bytes
Hardware random number generator detected: RdRnd

2025-02-20-19.29.49.469519+540 I64524E637            LEVEL: Error
PID     : 22419                TID : 139914050051584 PROC : db2
INSTANCE: my1211               NODE : 000
HOSTNAME: IBM-PF44EEMY
FUNCTION: DB2 UDB, oper system services, sqloOpenMLNQue, probe:1259
MESSAGE : ZRC=0x870F0042=-2029060030=SQLO_QUE_NOT_EXIST "Queue does not exist"
          DIA8558C A message queue did not exist.
DATA #1 : Codepath, 8 bytes
9
DATA #2 : String, 16 bytes
R1100022419A1005
DATA #3 : signed integer, 4 bytes
2
DATA #4 : Database Partition Number, PD_TYPE_NODE, 2 bytes
0
DATA #5 : unsigned integer, 2 bytes
0
DATA #6 : signed integer, 4 bytes
2
```

### db2setup実行時エラーへの対処
今回は[事前準備＜3＞](https://qiita.com/mi-kana/items/afa73231e1ef15788534#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%993etcwslconf%E7%B7%A8%E9%9B%86wsl%E7%92%B0%E5%A2%83%E3%81%AE%E3%81%BF)の必要性を認識せず導入したため、エラーが出ています。
db2setupコマンド標準出力にあるメッセージの通り、systemdのPIDは1ではありません。
> System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: ホストが落ちています
```
# ps auxwww | grep /sbin/init
root     20342  0.0  0.0   8556  2252 pts/1    S+   19:06   0:00 grep --color=auto /sbin/init
```

[事前準備＜3＞](https://qiita.com/mi-kana/items/afa73231e1ef15788534#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%993etcwslconf%E7%B7%A8%E9%9B%86wsl%E7%92%B0%E5%A2%83%E3%81%AE%E3%81%BF)で記載した手順で/etc/wsl.conf 編集とリブートを行ったところ解消されました。
次回Db2起動後も問題なく、db2diag.logのCriticalメッセージは出ていません。


設定後initがPID=1で起動されています
```
$ ps auxwww | grep -i init
root           1  0.6  0.1 167472 12908 ?        Ss   19:32   0:00 /sbin/init
root           2  0.0  0.0   2776  1924 ?        Sl   19:32   0:00 /init
root        1095  0.0  0.0   2776   208 ?        Ss   19:33   0:00 /init
root        1096  0.0  0.0   2776   208 ?        S    19:33   0:00 /init
my1211      2050  0.0  0.0   8556  2400 pts/2    S+   19:34   0:00 grep -i init
```

こちらの記事に感謝です：
https://qiita.com/rfukudome/items/323fbcd541a9e90e55c7


### (事後作業) データベース作成
手動でデータベースを作成しました。

```
$ db2 CREATE DATABASE MYDB USING CODESET UTF-8 TERRITORY JP
DB20000I  CREATE DATABASE コマンドが正常に完了しました。

```

途中でトラブルはあったものの問題なく使えそうでよかったです。