LXDコンテナのUbuntu18.04に日本語ロケールを設定してSQLServerをインストールする
ローカル環境の SQL Server 2019 on Linux は、その後、特に問題なく利用できてます。
このままでも十分なのですが、パッケージの依存関係や諸々の理由から、開発環境とは分離したいと思うようになりました。
せっかく Ubuntu を使ってるので、試しに LXD コンテナを導入してみると、これがなかなか便利です。しかし、当然ですが、コンテナの初期ロケールは日本語ではありません。
SQL Server は Linux 版だけでなく Windows 版でも既定のロケールにより既定の照合順序が変化するため、地味に影響があります。データベース構築後にサーバ名、システムロケール、照合順序を変更するのはとても面倒です。
今後の事もあるので、事前に LXD コンテナのロケールを日本語に設定してから、SQL Server をインストールしてみました。
1. 環境
私の環境では Snap 版の LXD をインストールして、storage backend は btrfs を使用しています。
$ sudo apt install btrfs-progs
$ sudo snap install lxd
$ sudo lxd init
後述の内容は、LXD コンテナの作成からです。
2. コンテナの準備
Ubuntu18.04 のイメージを取得して ubuntu-mssql を作成・起動します。
$ sudo lxc launch ubuntu:18.04 ubuntu-mssql
コンテナの一覧から ubuntu-mssql の IP アドレスを確認します。
$ sudo lxc list
私の環境では、ubuntu-mssql の IP アドレスは 10.12.44.206 が割り当てられました。
ping コマンドでコンテナとの応答を確認します。
$ ping -c4 10.12.44.206
PING 10.12.44.206 (10.12.44.206) 56(84) バイトのデータ
64 バイト応答 送信元 10.12.44.206: icmp_seq=1 ttl=64 時間=0.043ミリ秒
64 バイト応答 送信元 10.12.44.206: icmp_seq=2 ttl=64 時間=0.052ミリ秒
64 バイト応答 送信元 10.12.44.206: icmp_seq=3 ttl=64 時間=0.052ミリ秒
64 バイト応答 送信元 10.12.44.206: icmp_seq=4 ttl=64 時間=0.052ミリ秒
--- 10.12.44.206 ping 統計 ---
送信パケット数 4, 受信パケット数 4, パケット損失 0%, 時間 3048ミリ秒
rtt 最小/平均/最大/mdev = 0.043/0.049/0.052/0.004ミリ秒
3. コンテナの事前調整
(1) コンテナ内のホスト名とファイヤーウォール確認
$ sudo lxc exec ubuntu-mssql hostnamectl status
Static hostname: ubuntu-mssql
Icon name: computer-container
Chassis: container
Machine ID: 5d1ad6a3712b4b37a15c981e93698f32
Boot ID: 90cef2384b7b461f87d87757f621e18a
Virtualization: lxc
Operating System: Ubuntu 18.04.4 LTS
Kernel: Linux 5.3.0-40-generic
Architecture: x86-64
$ sudo lxc exec ubuntu-mssql ufw status
Status: inactive
(2) タイムゾーン設定
初期状態では、Time zone は Etc/UTC です。これを Asia/Tokyo にします。
$ sudo lxc exec ubuntu-mssql timedatectl set-timezone Asia/Tokyo
タイムゾーン設定後、ローカルタイムも JST に変更されます。
$ sudo lxc exec ubuntu-mssql timedatectl status
Local time: Tue 2020-02-25 17:17:44 JST
Universal time: Tue 2020-02-25 08:17:44 UTC
RTC time: n/a
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: no
systemd-timesyncd.service active: yes
RTC in local TZ: no
(3) コンテナOSのアップデート確認
リポジトリを日本のミラーサーバにして最新状態にします。
$ sudo lxc exec ubuntu-mssql -- sed -i "s/archive.ubuntu.com/jp.archive.ubuntu.com/g" /etc/apt/sources.list
$ sudo lxc exec ubuntu-mssql apt update
$ sudo lxc exec ubuntu-mssql apt upgrade
(4) ロケール確認
$ sudo lxc exec ubuntu-mssql localectl status
$ sudo lxc exec ubuntu-mssql cat /etc/default/locale
$ sudo lxc exec ubuntu-mssql locale
$ sudo lxc exec ubuntu-mssql localectl list-locales
C.UTF-8
en_US.utf8
(5) 日本語ロケールの追加と確認
設定可能なロケールに日本語がないので追加します。
$ sudo lxc exec ubuntu-mssql apt install language-pack-ja
Reading package lists... Done
Building dependency tree
〜(ざっくり省略)〜
Setting up language-pack-ja (1:18.04+20190718) ...
Setting up language-pack-ja-base (1:18.04+20180712) ...
Generating locales (this might take a while)...
ja_JP.UTF-8... done
Generation complete.
ja_JP.UTF-8 が生成されました。改めて設定可能なロケールを確認します。
$ sudo lxc exec ubuntu-mssql localectl list-locales
C.UTF-8
en_US.utf8
ja_JP.utf8
ja_JP.utf8 が追加されていますが、Ubuntu では日本語ロケール追加時のログにある ja_JP.UTF-8 が設定されているので合わせます。
(6) 日本語ロケール設定
$ sudo lxc exec ubuntu-mssql localectl set-locale LANG=ja_JP.UTF-8
ここでロケールの設定値を確認します。
$ sudo lxc exec ubuntu-mssql localectl status
$ sudo lxc exec ubuntu-mssql cat /etc/default/locale
これらの設定値は、ja_JP.UTF-8 に変更されていますが、
$ sudo lxc exec ubuntu-mssql locale
こちらは C.UTF-8 のままです。これはコンテナを再起動しても変わりませんでした。
(7) コンテナの環境変数設定
色々試したところ、コンテナの config 設定が有効でした。
$ sudo lxc config set ubuntu-mssql environment.LANG=ja_JP.UTF-8
これでコンテナの環境変数が ja_JP.UTF-8 に設定されます。
$ sudo lxc exec ubuntu-mssql locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
ネットで調べると、environment.LC_ALL を設定する例が見つかります。
ホストの Ubuntu 19.10 日本語 Remix では LANGUAGE と LC_ALL が未設定だったので、コンテナ OS も合わせてみました。
(8) コンテナの再起動と設定値確認
念の為、再起動後もロケールが ja_JP.UTF-8 になってる事を確認します。
$ sudo lxc restart ubuntu-mssql
$ sudo lxc exec ubuntu-mssql localectl status
$ sudo lxc exec ubuntu-mssql cat /etc/default/locale
$ sudo lxc exec ubuntu-mssql locale
ようやく準備が整いました。
3. コンテナ OS に SQL Server をインストール
インストール作業はコンテナ OS 内で行います。
(1) コンテナ OS の Shell 実行
$ sudo lxc exec ubuntu-mssql bash
root@ubuntu-mssql:~# whoami
root
(2) SQL Server 2019 on Linux のインストール
インストール作業そのものは、以前に書いた記事と同様です。
root@ubuntu-mssql:~# wget -qO- https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
root@ubuntu-mssql:~# add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/16.04/mssql-server-2019.list)"
root@ubuntu-mssql:~# apt update
root@ubuntu-mssql:~# apt install -y mssql-server
root@ubuntu-mssql:~# /opt/mssql/bin/mssql-conf setup
以前と同様に Express を選択しました。
(3) コンテナ OS の SQL Server の状態確認
コンテナを抜けて、ホスト側から状態を確認します。
root@ubuntu-mssql:~# exit
$ sudo lxc exec ubuntu-mssql -- systemctl status mssql-server --no-pager -l
Active: active (running) であれば正常に動作しています。
4. 補足
(1) セットアップ後の SQL Server の言語設定確認
現在の設定を表示します。
$ sudo lxc exec ubuntu-mssql cat /var/opt/mssql/mssql.conf
[sqlagent]
enabled = false
[EULA]
accepteula = Y
[language]
lcid = 1041
ロケール ID が 1041 なので、無事に「日本語」設定になってます。
(2) セットアップ後の SQL Server の照合順序
現在の照合順序はJapanese_CI_AS
です。
ちなみに、初期状態のコンテナ OS のままインストールすると、照合順序はSQL_Latin1_General_CP1_CI_AS
になります。
(3) コンテナ OS の停止
今のところ、普通に停止しても大丈夫です。
$ sudo lxc stop ubuntu-mssql
心配なら、事前にコンテナ OS 内でsystemctl stop mssql-server
しておくのも手かもしれません。