刹那(せつな)の瞬き

Willkömmen! Ich heiße Setsuna. Haben Sie etwas Zeit für mich?

LXDコンテナのUbuntuに日本語ロケールを設定してSQLServerをインストールする

ローカル環境の SQL Server 2019 on Linux は、その後、特に問題なく利用できてます。
このままでも十分なのですが、パッケージの依存関係や諸々の理由から、開発環境とは分離したいと思うようになりました。

せっかく Ubuntu を使ってるので、試しに LXD コンテナを導入してみると、これがなかなか便利です。しかし、当然ですが、コンテナの初期ロケールは日本語ではありません。

SQL ServerLinux 版だけでなく Windows 版でも既定のロケールにより既定の照合順序が変化するため、地味に影響があります。データベース構築後にサーバ名、システムロケール、照合順序を変更するのはとても面倒です。

今後の事もあるので、事前に LXD コンテナのロケールを日本語に設定してから、SQL Server をインストールしてみました。

1. 環境

  • ホストOS Ubuntu Desktop 19.10 日本語 Remix (Linux Kernel 5.3.0-40-generic)
  • LXD 3.21
  • コンテナOS Ubuntu 18.04

私の環境では 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

現在のシステムロケールの設定値は C.UTF-8 です。

$ 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) 日本語ロケール設定

システムロケールを ja_JP.UTF-8 に設定します。

$ 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しておくのも手かもしれません。