WSL2 Ubuntu 作業メモ

とりあえず順不同で、メモしておく方が良さそうな内容を記述しておくことにします。

WSLに増設したSSDを割り当てる

Windowsが起動した時点で増設のストレージが割り当てられれば問題ないのですが、対策方法が不明なため現状は毎回個別設定を行います。

PS C:\Windows\System32> GET-CimInstance -query "SELECT * from Win32_DiskDrive"

DeviceID           Caption                  Partitions Size          Model
--------           -------                  ---------- ----          -----
\\.\PHYSICALDRIVE1 KINGSTON OM8PDP3256B-A01 3          512105932800  KINGSTON OM8PDP3256B-A01
\\.\PHYSICALDRIVE0 CT1000BX500SSD1          4          1000202273280 CT1000BX500SSD1

PS C:\Windows\System32> wsl --mount \\.\PHYSICALDRIVE0 --bare

上記内容の –mount で、WSL2 に増設した SSD を割り当てます。

自動的に割り振られるホスト名を変更

難しいホスト名を単純な “WSL01” に置き換えます。再起動後に適用されるようです。

PS C:\Windows\System32> Rename-Computer -NewName "WSL01"

仮想マシン(Ubuntu) の起動を一般ユーザーに

仮想マシンに入って、/etc/wsl.conf ファイルを作成してその中に次を記述するらしい。

# cat << EOF > /etc/wsl.conf
> [user]
> default=sunao
> EOF

Ubuntu側の漢字処理を組込む

以下の説明を参考にして、中で説明のコマンドを実行して再起動です。

https://astherier.com/blog/2021/07/windows11-wsl2-wslg-japanese/
$ wget https://astherier.com/static/blog/2021-07-11/japanize-wslg.sh
$ bash japanize-wslg.sh

$ rm japanize-wslg.sh

systemctl コマンドが使えない

WSL2 は、PID 1 に init が陣取っているようで、色々なシステムが動作できない状態になるらしいのです。ここでディズニーに出てくる genie の力を借りて systemd を PID 1 に入れ替えてしまうことをするらしいです。

sunao@WSL01:~$ localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: ホストが落ちています

以下の再確認でも同じメッセージです。

sunao@WSL01:~$ systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: ホストが落ちています

PID 1 が systemd でないためにエラーが起きているようです。次の情報を参考に作業してランプから genie にお越しいただこうと思います。

https://qiita.com/RyoSakon001/items/26b3d073b70dfe911d59

忘れないようにコマンド入力と出されるメッセージをメモとして残しておきます。

sunao@WSL01:~$ sudo apt install daemonize dbus gawk libc6 libstdc++6 policykit-1 systemd systemd-container
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
dbus はすでに最新バージョン (1.12.20-2ubuntu4) です。
dbus は手動でインストールしたと設定されました。
取得:3 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libnss-mymachines amd64 249.11-0ubuntu3.3 [146 kB]
547 kB を 2秒 で取得しました (279 kB/s)
以前に未選択のパッケージ daemonize を選択しています。
(データベースを読み込んでいます ... 現在 83017 個のファイルとディレクトリがインストールされています。)
.../daemonize_1.7.8-1_amd64.deb を展開する準備をしています ...
daemonize (1.7.8-1) を展開しています...
以前に未選択のパッケージ systemd-container を選択しています。
.../systemd-container_249.11-0ubuntu3.3_amd64.deb を展開する準備をしています ...
systemd-container (249.11-0ubuntu3.3) を展開しています...
以前に未選択のパッケージ libnss-mymachines:amd64 を選択しています。
.../libnss-mymachines_249.11-0ubuntu3.3_amd64.deb を展開する準備をしています ...
libnss-mymachines:amd64 (249.11-0ubuntu3.3) を展開しています...
systemd-container (249.11-0ubuntu3.3) を設定しています ...
Created symlink /etc/systemd/system/multi-user.target.wants/machines.target → /lib/systemd/system/machines.target.
daemonize (1.7.8-1) を設定しています ...
libnss-mymachines:amd64 (249.11-0ubuntu3.3) を設定しています ...
First installation detected...
Checking NSS setup...
libc-bin (2.35-0ubuntu3) のトリガを処理しています ...
man-db (2.10.2-1) のトリガを処理しています ...
dbus (1.12.20-2ubuntu4) のトリガを処理しています ...
Scanning processes...
Scanning processor microcode...
Scanning linux images...

Failed to retrieve available kernel versions.

The processor microcode seems to be up-to-date.

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.
sunao@WSL01:~$ wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
--2022-06-30 10:12:52--  https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb
packages.microsoft.com (packages.microsoft.com) をDNSに問いあわせています... 23.99.120.248
packages.microsoft.com (packages.microsoft.com)|23.99.120.248|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 3124 (3.1K) [application/octet-stream]
‘packages-microsoft-prod.deb’ に保存中

packages-microsoft-prod.de 100%[========================================>]   3.05K  --.-KB/s    in 0s

2022-06-30 10:12:52 (1.10 GB/s) - ‘packages-microsoft-prod.deb’ へ保存完了 [3124/3124]

sunao@WSL01:~$ sudo dpkg -i packages-microsoft-prod.deb
以前に未選択のパッケージ packages-microsoft-prod を選択しています。
(データベースを読み込んでいます ... 現在 83093 個のファイルとディレクトリがインストールされています。)
packages-microsoft-prod.deb を展開する準備をしています ...
packages-microsoft-prod (1.0-debian10.1) を展開しています...
packages-microsoft-prod (1.0-debian10.1) を設定しています ...
sunao@WSL01:~$ rm packages-microsoft-prod.deb
sunao@WSL01:~$ sudo apt update
取得:1 https://packages.microsoft.com/debian/10/prod buster InRelease [29.8 kB]
ヒット:2 http://archive.ubuntu.com/ubuntu jammy InRelease
取得:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
取得:4 https://packages.microsoft.com/debian/10/prod buster/main arm64 Packages [25.9 kB]
取得:5 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [109 kB]
取得:6 https://packages.microsoft.com/debian/10/prod buster/main armhf Packages [26.5 kB]
取得:7 https://packages.microsoft.com/debian/10/prod buster/main amd64 Packages [174 kB]
取得:8 https://packages.microsoft.com/debian/10/prod buster/main all Packages [4,034 B]
取得:9 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB]
取得:10 http://archive.ubuntu.com/ubuntu jammy/main Translation-ja [295 kB]
取得:11 http://security.ubuntu.com/ubuntu jammy-security/main amd64 c-n-f Metadata [3,156 B]
取得:12 http://archive.ubuntu.com/ubuntu jammy/universe Translation-ja [1,534 kB]
取得:13 http://archive.ubuntu.com/ubuntu jammy/multiverse Translation-ja [7,160 B]
取得:14 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 c-n-f Metadata [5,720 B]
2,425 kB を 2秒 で取得しました (973 kB/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
パッケージはすべて最新です。

指定された dotnet-runtime-5.0 が古いらしく依存関係でエラーが出ました。

sunao@WSL01:~$ sudo apt install dotnet-runtime-5.0
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 dotnet-runtime-deps-5.0 : 依存: libssl1.0.0 しかし、インストールすることができません または
                                   libssl1.0.2 しかし、インストールすることができません または
                                   libssl1.1 しかし、インストールすることができません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
sunao@WSL01:~$ sudo apt install dotnet-runtime
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
E: パッケージ dotnet-runtime が見つかりません
sunao@WSL01:~$ aptitude search dotnet-runtime
p   dotnet-runtime-2.1                            - Microsoft .NET Core Runtime - 2.1.30 Microsoft.NETCore.A
p   dotnet-runtime-2.2                            - Microsoft .NET Core Runtime - 2.2.8 Microsoft.NETCore.Ap
p   dotnet-runtime-3.0                            - Microsoft .NET Core Runtime - 3.0.3 Microsoft.NETCore.Ap
p   dotnet-runtime-3.1                            - Microsoft .NET Core Runtime - 3.1.26 Microsoft.NETCore.A
p   dotnet-runtime-5.0                            - Microsoft .NET Runtime - 5.0.17 Microsoft.NETCore.App 5.
p   dotnet-runtime-6.0                            - Microsoft.NETCore.App.Runtime 6.0.6
p   dotnet-runtime-deps-2.1                       - dotnet-runtime-deps-2.1 2.1.30
p   dotnet-runtime-deps-2.2                       - dotnet-runtime-deps-2.2 2.2.8

最新は、6.0 のようですので、最新版を継続してインストールを続けます。ログは aptitude で確認を挟んだ結果、記録された一部の行が消えています。

取得:3 https://packages.microsoft.com/debian/10/prod buster/main amd64 dotnet-runtime-deps-6.0 amd64 6.0.6-1 [2,806 B]
取得:4 https://packages.microsoft.com/debian/10/prod buster/main amd64 dotnet-runtime-6.0 amd64 6.0.6-1 [22.8 MB]
23.0 MB を 12秒 で取得しました (1,865 kB/s)
以前に未選択のパッケージ dotnet-host を選択しています。
(データベースを読み込んでいます ... 現在 83101 個のファイルとディレクトリがインストールされています。)
.../dotnet-host_6.0.6-1_amd64.deb を展開する準備をしています ...
dotnet-host (6.0.6-1) を展開しています...
以前に未選択のパッケージ dotnet-hostfxr-6.0 を選択しています。
.../dotnet-hostfxr-6.0_6.0.6-1_amd64.deb を展開する準備をしています ...
dotnet-hostfxr-6.0 (6.0.6-1) を展開しています...
以前に未選択のパッケージ dotnet-runtime-deps-6.0 を選択しています。
.../dotnet-runtime-deps-6.0_6.0.6-1_amd64.deb を展開する準備をしています ...
dotnet-runtime-deps-6.0 (6.0.6-1) を展開しています...
以前に未選択のパッケージ dotnet-runtime-6.0 を選択しています。
.../dotnet-runtime-6.0_6.0.6-1_amd64.deb を展開する準備をしています ...
dotnet-runtime-6.0 (6.0.6-1) を展開しています...
dotnet-host (6.0.6-1) を設定しています ...
dotnet-runtime-deps-6.0 (6.0.6-1) を設定しています ...
dotnet-hostfxr-6.0 (6.0.6-1) を設定しています ...
dotnet-runtime-6.0 (6.0.6-1) を設定しています ...
man-db (2.10.2-1) のトリガを処理しています ...
Scanning processes...
Scanning processor microcode...
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.
sunao@WSL01:~$ sudo apt install apt-transport-https
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  apt-transport-https
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
1,512 B のアーカイブを取得する必要があります。
この操作後に追加で 169 kB のディスク容量が消費されます。
取得:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 apt-transport-https all 2.4.5 [1,512 B]
1,512 B を 1秒 で取得しました (2,864 B/s)
以前に未選択のパッケージ apt-transport-https を選択しています。
(データベースを読み込んでいます ... 現在 83307 個のファイルとディレクトリがインストールされています。)
.../apt-transport-https_2.4.5_all.deb を展開する準備をしています ...
apt-transport-https (2.4.5) を展開しています...
apt-transport-https (2.4.5) を設定しています ...
Scanning processes...
Scanning processor microcode...
Scanning linux images...

Failed to retrieve available kernel versions.

The processor microcode seems to be up-to-date.

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.
sunao@WSL01:~$ sudo wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-
transdebian/apt/wsl-transdebian.gpg
--2022-06-30 10:19:17--  https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg
arkane-systems.github.io (arkane-systems.github.io) をDNSに問いあわせています... 185.199.109.153, 185.199.108.153, 185.199.111.153, ...
arkane-systems.github.io (arkane-systems.github.io)|185.199.109.153|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2280 (2.2K) [application/octet-stream]
‘/etc/apt/trusted.gpg.d/wsl-transdebian.gpg’ に保存中

/etc/apt/trusted.gpg.d/wsl 100%[========================================>]   2.23K  --.-KB/s    in 0s

2022-06-30 10:19:17 (30.7 MB/s) - ‘/etc/apt/trusted.gpg.d/wsl-transdebian.gpg’ へ保存完了 [2280/2280]

sunao@WSL01:~$ sudo chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg

root ユーザーに変更して作業を継続します。

sunao@WSL01:~$ sudo su -
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.10.102.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of 2022年  6月 30日 木曜日 10:20:27 JST

  System load:    0.0029296875      Processes:             28
  Usage of /home: 0.0% of 95.56GB   Users logged in:       0
  Memory usage:   3%                IPv4 address for eth0: 172.28.186.10
  Swap usage:     0%


0 updates can be applied immediately.



This message is shown once a day. To disable it please create the
/root/.hushlogin file.
root@WSL01:~# cat << EOF > /etc/apt/sources.list.d/wsl-transdebian.list
deb https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
EOF
root@WSL01:~#
ログアウト

追加したリポジトリから genie 関連のシステムを取り込みます。

sunao@WSL01:~$ sudo apt update
取得:1 https://arkane-systems.github.io/wsl-transdebian/apt jammy InRelease [3,215 B]
ヒット:2 https://packages.microsoft.com/debian/10/prod buster InRelease
取得:3 https://arkane-systems.github.io/wsl-transdebian/apt jammy/main Sources [1,609 B]
ヒット:4 http://archive.ubuntu.com/ubuntu jammy InRelease
取得:5 https://arkane-systems.github.io/wsl-transdebian/apt jammy/main amd64 Packages [2,115 B]
ヒット:6 http://security.ubuntu.com/ubuntu jammy-security InRelease
ヒット:7 http://archive.ubuntu.com/ubuntu jammy-updates InRelease
取得:8 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB]
107 kB を 1秒 で取得しました (83.5 kB/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
パッケージはすべて最新です。
sunao@WSL01:~$ sudo apt install systemd-genie
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  build-essential dpkg-dev fakeroot g++ g++-11 gcc gcc-11 libalgorithm-diff-perl libalgorithm-diff-xs-perl
  libalgorithm-merge-perl libasan6 libatomic1 libc-dev-bin libc-devtools libc6-dev libcc1-0 libcrypt-dev
  libexpat1-dev libfakeroot libgcc-11-dev libitm1 libjs-sphinxdoc liblsan0 libnsl-dev libpython3-dev
  libpython3.10-dev libstdc++-11-dev libtirpc-dev libtsan0 libubsan1 linux-libc-dev lto-disabled-list make
  manpages-dev python3-dev python3-pip python3-psutil python3-wheel python3.10-dev rpcsvc-proto zlib1g-dev
提案パッケージ:
  debian-keyring g++-multilib g++-11-multilib gcc-11-doc gcc-multilib autoconf automake libtool flex bison
  gdb gcc-doc gcc-11-multilib gcc-11-locales glibc-doc libstdc++-11-doc make-doc python-psutil-doc
以下のパッケージが新たにインストールされます:
  build-essential dpkg-dev fakeroot g++ g++-11 gcc gcc-11 libalgorithm-diff-perl libalgorithm-diff-xs-perl
  libalgorithm-merge-perl libasan6 libatomic1 libc-dev-bin libc-devtools libc6-dev libcc1-0 libcrypt-dev
  libexpat1-dev libfakeroot libgcc-11-dev libitm1 libjs-sphinxdoc liblsan0 libnsl-dev libpython3-dev
  libpython3.10-dev libstdc++-11-dev libtirpc-dev libtsan0 libubsan1 linux-libc-dev lto-disabled-list make
  manpages-dev python3-dev python3-pip python3-psutil python3-wheel python3.10-dev rpcsvc-proto
  systemd-genie zlib1g-dev
アップグレード: 0 個、新規インストール: 42 個、削除: 0 個、保留: 0 個。
57.5 MB のアーカイブを取得する必要があります。
この操作後に追加で 200 MB のディスク容量が消費されます。
続行しますか? [Y/n]
取得:1 https://arkane-systems.github.io/wsl-transdebian/apt jammy/main amd64 systemd-genie amd64 2.4 [53.8 kB]
取得:2 http://archive.ubuntu.com/ubuntu jammy/main amd64 libc-dev-bin amd64 2.35-0ubuntu3 [20.3 kB]
取得:3 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 linux-libc-dev amd64 5.15.0-40.43 [1,286 kB]
取得:4 http://archive.ubuntu.com/ubuntu jammy/main amd64 libcrypt-dev amd64 1:4.4.27-1 [112 kB]
取得:5 http://archive.ubuntu.com/ubuntu jammy/main amd64 rpcsvc-proto amd64 1.4.2-0ubuntu6 [68.5 kB]
取得:6 http://archive.ubuntu.com/ubuntu jammy/main amd64 libtirpc-dev amd64 1.3.2-2build1 [192 kB]
取得:7 http://archive.ubuntu.com/ubuntu jammy/main amd64 libnsl-dev amd64 1.3.0-2build2 [71.3 kB]
取得:8 http://archive.ubuntu.com/ubuntu jammy/main amd64 libc6-dev amd64 2.35-0ubuntu3 [2,099 kB]
取得:9 http://archive.ubuntu.com/ubuntu jammy/main amd64 libcc1-0 amd64 12-20220319-1ubuntu1 [47.2 kB]
取得:10 http://archive.ubuntu.com/ubuntu jammy/main amd64 libitm1 amd64 12-20220319-1ubuntu1 [30.2 kB]
取得:11 http://archive.ubuntu.com/ubuntu jammy/main amd64 libatomic1 amd64 12-20220319-1ubuntu1 [10.4 kB]
取得:12 http://archive.ubuntu.com/ubuntu jammy/main amd64 libasan6 amd64 11.2.0-19ubuntu1 [2,283 kB]
取得:13 http://archive.ubuntu.com/ubuntu jammy/main amd64 liblsan0 amd64 12-20220319-1ubuntu1 [1,069 kB]
取得:14 http://archive.ubuntu.com/ubuntu jammy/main amd64 libtsan0 amd64 11.2.0-19ubuntu1 [2,261 kB]
取得:15 http://archive.ubuntu.com/ubuntu jammy/main amd64 libubsan1 amd64 12-20220319-1ubuntu1 [976 kB]
取得:16 http://archive.ubuntu.com/ubuntu jammy/main amd64 libgcc-11-dev amd64 11.2.0-19ubuntu1 [2,526 kB]
取得:17 http://archive.ubuntu.com/ubuntu jammy/main amd64 gcc-11 amd64 11.2.0-19ubuntu1 [20.1 MB]
取得:18 http://archive.ubuntu.com/ubuntu jammy/main amd64 gcc amd64 4:11.2.0-1ubuntu1 [5,112 B]
取得:19 http://archive.ubuntu.com/ubuntu jammy/main amd64 libstdc++-11-dev amd64 11.2.0-19ubuntu1 [2,083 kB]
取得:20 http://archive.ubuntu.com/ubuntu jammy/main amd64 g++-11 amd64 11.2.0-19ubuntu1 [11.4 MB]
取得:21 http://archive.ubuntu.com/ubuntu jammy/main amd64 g++ amd64 4:11.2.0-1ubuntu1 [1,412 B]
libitm1:amd64 (12-20220319-1ubuntu1) を設定しています ...
libc-devtools (2.35-0ubuntu3) を設定しています ...
libalgorithm-merge-perl (0.08-3) を設定しています ...
libtsan0:amd64 (11.2.0-19ubuntu1) を設定しています ...
systemd-genie (2.4) を設定しています ...
dpkg-dev (1.21.1ubuntu2.1) を設定しています ...
libgcc-11-dev:amd64 (11.2.0-19ubuntu1) を設定しています ...
gcc-11 (11.2.0-19ubuntu1) を設定しています ...
libc6-dev:amd64 (2.35-0ubuntu3) を設定しています ...
gcc (4:11.2.0-1ubuntu1) を設定しています ...
libexpat1-dev:amd64 (2.4.7-1) を設定しています ...
libstdc++-11-dev:amd64 (11.2.0-19ubuntu1) を設定しています ...
zlib1g-dev:amd64 (1:1.2.11.dfsg-2ubuntu9) を設定しています ...
g++-11 (11.2.0-19ubuntu1) を設定しています ...
libpython3.10-dev:amd64 (3.10.4-3) を設定しています ...
python3.10-dev (3.10.4-3) を設定しています ...
g++ (4:11.2.0-1ubuntu1) を設定しています ...
update-alternatives: /usr/bin/c++ (c++) を提供するために自動モードで /usr/bin/g++ を使います
build-essential (12.9ubuntu3) を設定しています ...
libpython3-dev:amd64 (3.10.4-0ubuntu2) を設定しています ...
python3-dev (3.10.4-0ubuntu2) を設定しています ...
man-db (2.10.2-1) のトリガを処理しています ...
libc-bin (2.35-0ubuntu3) のトリガを処理しています ...
Scanning processes...
Scanning processor microcode...
Scanning linux images...

Failed to retrieve available kernel versions.

The processor microcode seems to be up-to-date.

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.
sunao@WSL01:~$ genie -l
genie: WARNING: systemd default target is default.target; targets other than multi-user.target may not work
genie: WARNING: if you wish to use a different target, this warning can be disabled in the config file
genie: WARNING: if you experience problems, please change the target to multi-user.target
Waiting for systemd....!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  ^C で強制停止を行いました。

Traceback (most recent call last):
  File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/usr/lib/genie/genie/__main__.py", line 581, in <module>
  File "/usr/lib/genie/genie/__main__.py", line 564, in entrypoint
  File "/usr/lib/genie/genie/__main__.py", line 351, in do_initialize
  File "/usr/lib/genie/genie/__main__.py", line 294, in inner_do_initialize
KeyboardInterrupt
Traceback (most recent call last):
  File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/usr/lib/genie/genie/__main__.py", line 581, in <module>
  File "/usr/lib/genie/genie/__main__.py", line 568, in entrypoint
  File "/usr/lib/genie/genie/__main__.py", line 384, in do_login
  File "/usr/lib/genie/genie/__main__.py", line 112, in pre_systemd_action_checks
  File "/usr/lib/python3.10/subprocess.py", line 503, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
  File "/usr/lib/python3.10/subprocess.py", line 1141, in communicate
    self.wait()
  File "/usr/lib/python3.10/subprocess.py", line 1204, in wait
    return self._wait(timeout=timeout)
  File "/usr/lib/python3.10/subprocess.py", line 1938, in _wait
    (pid, sts) = self._try_wait(0)
  File "/usr/lib/python3.10/subprocess.py", line 1896, in _try_wait
    (pid, sts) = os.waitpid(self.pid, wait_flags)
KeyboardInterrupt

PID 1 が systemd に置き換えられているのか気になるところです。 top コマンドで確認してみました。

sunao@WSL01:~$ genie -s
genie: WARNING: systemd is in degraded state, issues may occur!
sunao@WSL01-wsl:~$ top
top - 10:26:42 up  1:57,  1 user,  load average: 0.03, 0.12, 0.06
Tasks:  32 total,   1 running,  31 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15705.3 total,  13924.7 free,    593.7 used,   1186.9 buff/cache
MiB Swap:   4096.0 total,   4096.0 free,      0.0 used.  14828.2 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   1117 sunao     20   0   11388   3800   3208 R   0.3   0.0   0:00.01 top
      1 root      20   0  171676  13176   8592 S   0.0   0.1   0:00.71 systemd
     48 root      19  -1   39600  15708  14616 S   0.0   0.1   0:00.09 systemd-journal
     72 root      20   0   22944   6560   4456 S   0.0   0.0   0:00.09 systemd-udevd
     95 systemd+  20   0   16112   7984   6976 S   0.0   0.0   0:00.05 systemd-network
     96 message+  20   0    8852   5028   4148 S   0.0   0.0   0:00.10 dbus-daemon
     99 root      20   0   39580  21104  11820 S   0.0   0.1   0:00.08 networkd-dispat
    100 root      20   0  236444   9216   7036 S   0.0   0.1   0:00.03 polkitd
    101 syslog    20   0  222396   5312   4488 S   0.0   0.0   0:00.04 rsyslogd
    102 root      20   0 2279332  49004  17588 S   0.0   0.3   0:00.65 snapd
    106 root      20   0   15304   7308   6344 S   0.0   0.0   0:00.10 systemd-logind
    110 root      20   0  392764  13156  10816 S   0.0   0.1   0:00.05 udisksd
    151 root      20   0  316920  11872  10100 S   0.0   0.1   0:00.05 ModemManager
    246 systemd+  20   0   25256  12412   8384 S   0.0   0.1   0:00.06 systemd-resolve
    329 root      20   0    7936   1256   1116 S   0.0   0.0   0:00.00 cron
    341 root      20   0  116584  23532  14824 S   0.0   0.1   0:00.03 unattended-upgr
    353 root      20   0    7216   1096   1008 S   0.0   0.0   0:00.00 agetty
    355 root      20   0    7216   1072    984 S   0.0   0.0   0:00.00 agetty
   1039 root      20   0    2884    952    856 S   0.0   0.0   0:00.00 sh

systemd が PID 1 に収まっているようです。

genieの効果はいつまで続くのか?

永久的に genie の効果が持続しているようではないらしく、systemd が PID 1 に収まっているのは特定の期間だけのようで、どの時点にかはわかりませんが元の init に戻っています。


genie の環境が刻々と変化しているようで

今年 2022 年 GW前後の新しい動き、『WSL2+Ubuntu22.04に標準で入ったsystemdを試す』との情報に systemdを起動して PID 1 に収まっている記事がありましたが、現時点で確認すると PID 1 は元々の init が占めていて、別な場所に systemd が乗っています。

この systemd は wsl2 専用らしい

sunao@WSL01-wsl:~$ ls -l /usr/libexec/wsl-systemd
-rwxr-xr-x 1 root root 550  3月 18 00:08 /usr/libexec/wsl-systemd

sunao@WSL01-wsl:~$ /usr/libexec/nslogin
sunao@WSL01-wsl:~$

ランプの精の genie 君も成りを潜めていて PID 1 を奪い取ることをしていないようです。その説明の中で書かれている nslogin を起動してもメッセージはなくプロンプトが帰ります。

apache2を起動して結果を見ました

何かよくわかりませんが、apache2 を起動すると、特にエラーもなく起動されたようです。

sunao@WSL01-wsl:~$ sudo systemctl start apache2
sunao@WSL01-wsl:~$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-07-06 10:14:08 JST; 13s ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 816 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
   Main PID: 820 (apache2)
      Tasks: 4 (limit: 18840)
     Memory: 5.3M
     CGroup: /system.slice/apache2.service
             ├─820 /usr/sbin/apache2 -k start
             ├─821 /usr/sbin/apache2 -k start
             ├─822 /usr/sbin/apache2 -k start
             └─823 /usr/sbin/apache2 -k start

 7月 06 10:14:08 WSL01-wsl systemd[1]: Starting The Apache HTTP Server...
 7月 06 10:14:08 WSL01-wsl systemd[1]: Started The Apache HTTP Server.

コマンド top の結果を次に載せておきます。当初からの init が PID 1 を占めているようで、systemd は別の場所に乗っているです。

top - 11:22:05 up  2:02,  3 users,  load average: 0.00, 0.00, 0.00
Tasks:  70 total,   1 running,  69 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15705.3 total,  14445.1 free,    511.9 used,    748.2 buff/cache
MiB Swap:   4096.0 total,   4096.0 free,      0.0 used.  14932.6 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0    1776   1056   1020 S   0.0   0.0   0:00.02 init
     13 root      20   0    2116    356      0 S   0.0   0.0   0:00.00 init
     14 root      20   0    2124    356      0 S   0.0   0.0   0:00.19 init
     15 sunao     20   0    9748   5376   3628 S   0.0   0.0   0:00.02 bash
     34 sunao     20   0    8164   2148   1716 S   0.0   0.0   0:00.00 dbus-launch
     35 sunao     20   0    8292   2432   2052 S   0.0   0.0   0:00.00 dbus-daemon
     38 sunao     20   0  323148  38188  29196 S   0.0   0.2   0:00.13 fcitx
     45 sunao     20   0    8292   2928   2568 S   0.0   0.0   0:00.00 dbus-daemon
     49 sunao     39  19    6572    236      0 S   0.0   0.0   0:00.00 fcitx-dbus-watc
     50 sunao     20   0  187448  20192  13688 S   0.0   0.1   0:00.07 mozc_server
     82 root      20   0    2116    356      0 S   0.0   0.0   0:00.01 init
    107 root      20   0    6812    960    872 S   0.0   0.0   0:00.00 unshare
    108 root      20   0   18900  11340   7932 S   0.0   0.1   0:00.69 systemd
    155 root      19  -1   47796  15572  14464 S   0.0   0.1   0:00.16 systemd-journal
    189 root      20   0   23068   6672   4480 S   0.0   0.0   0:00.35 systemd-udevd
    191 root      20   0    4732   1684   1228 S   0.0   0.0   0:00.21 snapfuse
    192 root      20   0    4796   1804   1220 S   0.0   0.0   0:02.17 snapfuse
    217 systemd+  20   0   16112   8040   7028 S   0.0   0.0   0:00.16 systemd-network
    218 message+  20   0    9044   4892   4012 S   0.0   0.0   0:00.18 dbus-daemon
    221 root      20   0   39580  21088  11800 S   0.0   0.1   0:00.08 networkd-dispat
    222 root      20   0  236444  11000   6780 S   0.0   0.1   0:00.04 polkitd

使い方や動きがしっくりきていませんが、しばらく様子を見ながら付き合っていこうと考えています。

常用ノートPCが末期的に

遅くても今まで不便していなかったのですが…

何年前から利用しているのかは忘れてしまいましたが、元々 Windows 8.1 がセットアップされていた非力なノートPCを愛用していました。安価だったのでエプソンダイレクトで購入してずっと利用していました。世の中の情勢の変化もあり今は利用環境も変化しましたが、当初はGPS軌跡データの処理ができるので使い始めました。

その後、Windows 10 にアップグレードして、内蔵hddをSSDに換え、Linux Ubuntu を追加してのデュアルブート構成で、最近になってからは Windowsを立ち上げることなく Linux のみ使用していました。

遅いながらもゆったりと構えて不自由無く利用していたのですが、最近はディスクアクセスランプが点灯したままのフリーズが目立ち、動くのはマウスポインタだけで何分もフリーズが続き、忘れた頃に復帰していたりします。

元々非力で処理が遅いのに、さらに頻繁なフリーズが加わるようになってしまいました。このままの継続利用は無理なようで、何とかしなければと思いながら、色々な情報にアンテナを立て、何か別の機器をと思いながら物色していました。

一体で使い勝手が良いのでノートPCが理想的かと

新品のノートPCは、基本的に高価で、中古の場合は官公庁等の大量の置換で排出されたもので、世代も古くスペック的にも難があります。デスクトップPCも色々とあるようで、大きさ的にノートPCの代替が可能な製品は限られるようです。

近年はゲーム対象の小型機器も市場に出されているようで、安価ではないもののそこそこ魅力的な機種もあるようです。世の中も様変わりし、昔は対立ムード一色だったOS環境も目を見張る変化で、マイクロソフトが Linux に大きく歩み寄り、Windows 11 に wsl2 で Ubuntu を載せて同時に両方の OS を稼働させるのが可能で、かなり実用的になってきたようです。

悩んでいた時にAmazonのタイムセール

時々Amazonがタイムセールを行っているのは知っていて、特に気にも留めていなかったものの、何となく関係ないニュース記事を見ていて、IntelやAMDの最新のプロセッサの話題にも触れた中で、タイムセールが行われていて普段より安く購入できると記事の中で伝えていました。何となく見ていた記事に少し興味を持ち、IntelのCore i5 i7 とか、AMDのRyzen 9 何ていうのがニュース的に扱われていて、調べてみるとバリエーションもあるようで、Linux しか使わないならOS無しの選択もあり得るようだし、一応世の中標準のWindows は必要かとも考えて、プロセッサ数とメモリサイズを考えに含めて検討しました。

タイムセール対象品でないのが気になりました

実装メモリ32GB、PCIe SSD 512GB で、小型の筐体にAMD Ryzen 9 4900H 能書きによると8プロセッサらしい、筐体は開閉しやすい構造で、7mm厚の2.5インチベイが 2か所あり増設が容易らしい、1TB SSD の追加で wsl2 Ubuntu も動作可能か、Windows 10 が実装され、11 へのアップグレード対象品になっている。無い知識を絞り出して悩んで決断です。

MINISFORUMからリリースのミニPC「EliteMini HM90」能書きによるとディスプレイは、一般的なHDMI、自分では今まで意識していなかったインターフェースの DisplayPort / USB Type-C とあるようで、自分では使わないと思うけどフルで 3画面をサポートしているらしいです。

悩んで購入を決めた小型PC
衝動買い的に手配しました

夜中に注文を入れ、翌日配送と恐ろしいほど早い、普段は使わないけど最悪のメンテナンスではいつもお世話になりっぱなしの USB マウスとキーボードを挿し、テレビのHDMIをモニタとして繋いで電源投入です。久しぶりに目にする Windows 系の画面、何を操作したのか記憶は飛んでしまいましたが、指示されるままに Windows 11 までのアップグレードを一気に済ませました。

当然ですが初期不良もなく立ち上がりました

一応最低限の Windows 11 pro が起動する環境が手に入ると、粗くて見ずらいテレビ画面の前で昔の USBマウスとキーボードを使い身体をのめり込むようにしての作業は苦痛そのものです。モニタにしているのは、昔のシャープAQUOSと呼ばれたテレビですが、今年正月に購入した 50インチの 4K対応テレビの画面を見慣れてくると、大昔のテレビでは画面が粗すぎて文字の判読に苦労してしまいます。

2.5インチSSD 、 マウスとキーボードを検討

ネットの情報を参考に、Ubuntu をセットアップしてから、手持ちのHDDをUSBインターフェースのアダプタに組込み接続して、 Ubuntu から扱えるようにする操作をしてみました。Linux側からのマウントも初期化操作も問題なく動作するようなので、ケーブル取り回しの不安定性が気になる外付けドライブではなく、2.5インチ内蔵ベイに組込めるSSDの購入が最優先事項です。

色々と課題は山積のようですが、wsl2 で Ubuntu を実現する資源の確保は最低限の必須事項です。増設の内蔵 SSD とケーブル不要のマウスとキーボードが最低限の最優先資材のようですね。それとモニタも何とかしないと実用に耐えません。モニタについては、大きさと価格、機能、そして最近のインターフェースの方式についても調査して利用する場面での効果について検討の余地がありそうです。

良く理解できていないままWSL2をインストール

Windows 11 になってからは、WSL2 のインストールが簡単になって一行のコマンドで完結すると説明している情報がほとんどで、あまり意識しないまま実行してしまいました。後から色々な情報を確認すると Linux 側の一般ユーザー登録も一連の中に含まれているらしく、無意識にそこを飛ばしてしまっていたらしく root ユーザーでの # プロントのみが表示され、後からの一般ユーザー登録で苦労することとなりました。

まさかGUIインターフェースの組込みも一緒とは

正式リリース前に色々と作業している先駆者たちの情報があふれ、当初はグラフィックの表示は別に作られていて、WSLg と呼ばれていたようで、私もそれを組込みたくて色々と情報を収集したのですが取越し苦労の無駄をしていたようで、一連の WSL2 のインストール作業の中で完了していたようです。

内蔵ベイへ入れるSSD
レシーバーのドングルをUSBに挿すワイヤレス

キーボードもマウスも乾電池式で、キーボードが単四型1本、マウスが単三型1本と一貫性がありませんが、販売価格が安くて文句は言えません。ゆくゆくは手持ちの充電式電池で利用すると思います。

何とかWSL2 組込みを始めると気になるのはディスプレイ

ディスプレイも大きさや性能、価格、そしてインタフェースで色々な製品が販売されているのに改めて驚きました。ノートPCの代替品までは無理としても安く小型でドット密度の細かいものが良さそうに思い検討しました。

平べったくて 13.3インチと小さ目

購入してみて感じたことは、表示はものすごく小さいけど表示される情報量は多く、近くで見るのに不自由のない近視の私にはちょうど良いディスプレイのようです。さらに外部電源を接続していなくても PC と USB Type-C ケーブルで接続すれば、信号と電源が1本で完結できシンプルで申し分ありません。

apache2 が起動しない

現状の環境からの模索

プライベート写真をネット環境に公開しているWebサーバー用に、アップロードするデーター等を作成したり、動作の検証をするために別の機器を立上げ、そこにデーターを変換するアプリや検証のために apache http サーバーを設定して利用しています。

古くて遅いノートPC

別の機器としての作業は、現状は非力で処理の遅い古いノートPCでの作業です。基本的に写真をカメラで写し、居た場所をGPSロガーで収集して、ノートPCに移して加工しています。

動作の検証もノートPC内に立上げた Web サーバー apache で行っているため、全てがワンパッケージで完結しているので、まとまっていて操作性は良いのですが、非力でストレスになってます。

更に非効率なos切替

GPSロガーはアプリがWindows対応なのでそれに従い、写真に位置情報を追加したり公開用にサイズを縮小したりの加工は Linux のバッチ処理で加工しています。OSの切替は昔からあるオーソドックスなデュアルブートを利用しています。切替に時間が掛かりとても効率が悪いです。

データー加工とWebサーバー

新しいノートPCを購入するとか、速くて効率的な作業環境に移行できればストレスも減るのですが、何よりもまず資金が必要な事だし、今ある機器で分散できないものかと模索しています。

機器の分散を模索

データー変換や検証のWebサーバーを別に立て、リモート環境を作ろうかと模索していて、分散対象のサーバーに利用する予定の機器は、サーバーなのに20分で停止してしまったり、致命的な問題はapache が立上げできません。

サーバーとしての機能

サーバーが 20分で停止する問題は、別にまとめた Linux Ubuntu のバージョンアップの仕様が問題でしたが、その後の状況から解決できました。
(systemd の対策で停止を解決)

Webサーバーを設定

検証用Webサーバーとして実績のあるノートPCから apache のサイト情報等のコピーを行ったのに立上げでエラーになります。

$ sudo systemctl start apache2
Job for apache2.service failed because the control process exited with error code.
See "systemctl status apache2.service" and "journalctl -xe" for details.

ログ等を確認すると、https を設定するために使用している認証情報に問題があるらしく、今までに実績のあるファイルをコピーして手を抜こうと考えたのですが、定義されたキーが短過ぎるのが原因らしいです。

$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Sun 2021-03-14 13:35:13 JST; 11min ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 561706 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE)

 3月 14 13:35:13 big-book systemd[1]: Starting The Apache HTTP Server...
 3月 14 13:35:13 big-book apachectl[561721]: AH00558: apache2: Could not reliably determine the server's fully>
 3月 14 13:35:13 big-book apachectl[561706]: Action 'start' failed.
 3月 14 13:35:13 big-book apachectl[561706]: The Apache error log may have more information.
 3月 14 13:35:13 big-book systemd[1]: apache2.service: Control process exited, code=exited, status=1/FAILURE
 3月 14 13:35:13 big-book systemd[1]: apache2.service: Failed with result 'exit-code'.
 3月 14 13:35:13 big-book systemd[1]: Failed to start The Apache HTTP Server.
lines 1-13/13 (END)

error.log を開いてみると、:ee key too small と出ているので証明書の key が小さいのが原因と思われます。

$ less /var/log/apache2/error.log
[Sun Mar 14 13:35:13.253066 2021] [ssl:emerg] [pid 561721:tid 140387924089920] AH02562: Failed to configure certificate sunao-mita.pgw.jp:443:0 (with chain), check /etc/apache2/ssl/server.cert
[Sun Mar 14 13:35:13.253158 2021] [ssl:emerg] [pid 561721:tid 140387924089920] SSL Library Error: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small
AH00016: Configuration Failed
/var/log/apache2/error.log (END)

オレオレ証明書の作成

昔々、ネットの情報を参考にさせて頂きオレオレ証明書を作成したことがありました。それを流用して暫く使えていたのですが今回はエラーになってしまいました。証明書の条件も年月と共に厳しくなっているので少しずつ対応していかないといけません。

ネットを色々と調べ内容の重げなサイトを見付けました。ほぼ丸コピーで試してみようと思います。
https://one-it-thing.com/63/

まずは、オレオレ認証局かな

あまり意識したことがなかったけど OpenSSL のバージョンの確認あたりから進めていこうと思っています。

$ openssl version
OpenSSL 1.1.1f  31 Mar 2020

root ユーザーになって、作業用に /openssl のディレクトリを作成して、そこに移動してサンプルをコピーして、作業を進めることにします。

$ sudo su -
# mkdir /openssl
# cd /openssl
# cp /etc/ssl/openssl.cnf ./

作業用ディレクトリをカレントに定義、シリアルナンバーファイルを作成しておきます。

# vi openssl.cnf
〜途中省略〜
dir = ./ # Where everything is kept
〜途中省略〜


# touch ./index.txt
# echo 00 > ./serial

CA秘密鍵を作成します。途中でパスワードを2回打鍵して継続します。

# openssl genrsa -aes256 -out ./cakey.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
......................................................+++++
.................................................................+++++
e is 65537 (0x010001)
Enter pass phrase for ./cakey.pem: (パスワードを入力して備忘しておく)
Verifying - Enter pass phrase for ./cakey.pem:

CA証明書リクエストを作成

CA とは証明書認証局なのでしょうか、あまり理解できていませんが、ネット情報を参考に進めます。

# openssl req -new -key ./cakey.pem -config ./openssl.cnf -out cacert.csr
Enter pass phrase for ./cakey.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Gunma
Locality Name (eg, city) []:Fujioka
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mita
Organizational Unit Name (eg, section) []:Mita-sec
Common Name (e.g. server FQDN or YOUR name) []:192.168.11.5
Email Address []:sunao.mita@nifty.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

理解をしていませんが、X509 v3 拡張領域に入れるために、v3_ca.txt を作成するのだそうです。

# vi v3_ca.txt
basicConstraints = critical, CA:true
keyUsage = critical, cRLSign, keyCertSign
subjectKeyIdentifier=hash

CA証明書作成

ここでやっとCA証明書の作成になるようです。

# openssl ca -in cacert.csr -selfsign -keyfile ./cakey.pem -notext -config ./openssl.cnf 
-outdir . -days 3650 -extfile v3_ca.txt -out cacert.pem
Using configuration from ./openssl.cnf
Enter pass phrase for ./cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 0 (0x0)
        Validity
            Not Before: Mar 14 06:43:10 2021 GMT
            Not After : Mar 12 06:43:10 2031 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Gunma
            organizationName          = Mita
            organizationalUnitName    = Mita-sec
            commonName                = 192.168.11.5
            emailAddress              = sunao.mita@nifty.com
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE 
            X509v3 Key Usage: critical
                Certificate Sign, CRL Sign
            X509v3 Subject Key Identifier:
                CD:2A:04:41:9A:3D:D3:23:1E:BE:C6:FE:FD:E4:3C:8D:1D:9C:1A:79
Certificate is to be certified until Mar 12 06:43:10 2031 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

できあがった証明書をテキストで確認してみて、X509v3 の記述があることを確認するのだそうです。

# openssl x509 -in cacert.pem -text
〜省略〜
       X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Certificate Sign, CRL Sign
            X509v3 Subject Key Identifier: 
                CD:2A:04:41:9A:3D:D3:23:1E:BE:C6:FE:FD:E4:3C:8D:1D:9C:1A:79
〜省略〜

オレオレ サーバー証明書

サーバー秘密鍵の作成

# openssl genrsa -aes256 -out ./server.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
........................................................................................................................................................................................................................+++++
..........................+++++
e is 65537 (0x010001)
Enter pass phrase for ./server.key: (パスワードを入力して備忘しておく)
Verifying - Enter pass phrase for ./server.key:

サーバー証明書リクエスト作成

サーバー証明書リクエストの作成を行います。個人使用なので CA証明書と内容は同じで良いようです。

# openssl req -new -key ./server.key -config ./openssl.cnf -out server.csr
Enter pass phrase for ./server.key: (秘密鍵に設定したパスワード)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Gunma
Locality Name (eg, city) []:Fujioka
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mita
Organizational Unit Name (eg, section) []:Mita-sec
Common Name (e.g. server FQDN or YOUR name) []:sunao-mita.pgw.jp
Email Address []:sunao.mita@nifty.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

証明書のX509 v3拡張情報

# vi v3_server.txt
[SAN]
basicConstraints = CA:false
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
authorityKeyIdentifier=keyid,issuer

subjectAltName=@alt_names
basicConstraints=CA:FALSE
[alt_names]
DNS.1=192.168.11.2
IP.1=192.168.11.5
IP.2=127.0.0.1

サーバー証明書の作成

# openssl ca -in server.csr -config openssl.cnf -keyfile ./cakey.pem -outdir . -extfile v3_server.txt -extensions SAN -out server.crt -days 3650
Using configuration from openssl.cnf
Enter pass phrase for ./cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Mar 14 07:43:48 2021 GMT
            Not After : Mar 12 07:43:48 2031 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Gunma
            organizationName          = Mita
            organizationalUnitName    = Mita-sec
            commonName                = sunao-mita.pgw.jp
            emailAddress              = sunao.mita@nifty.com
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
            X509v3 Authority Key Identifier: 
                keyid:CD:2A:04:41:9A:3D:D3:23:1E:BE:C6:FE:FD:E4:3C:8D:1D:9C:1A:79

            X509v3 Subject Alternative Name: 
                DNS:192.168.11.2, IP Address:192.168.11.5, IP Address:127.0.0.1
            X509v3 Basic Constraints: 
                CA:FALSE
Certificate is to be certified until Mar 12 07:43:48 2031 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

確認のためにできたサーバー証明書をテキストダンプして確認します。

# openssl x509 -in server.crt -text
〜省略〜
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
            X509v3 Authority Key Identifier: 
                keyid:CD:2A:04:41:9A:3D:D3:23:1E:BE:C6:FE:FD:E4:3C:8D:1D:9C:1A:79

            X509v3 Subject Alternative Name: 
                DNS:192.168.11.2, IP Address:192.168.11.5, IP Address:127.0.0.1
            X509v3 Basic Constraints: 
                CA:FALSE
〜省略〜

パスなしサーバー秘密鍵の生成

# openssl rsa -in ./server.key -out nopass_server.key
Enter pass phrase for ./server.key:
writing RSA key

作業ディレクトリ内にできた成果

作業ディレクトリ内には不要な作業ファイルも含め、色々なファイルが残っていますが、必要なものは次の4点のようです。

  1. CA秘密鍵:cakey.pem …サーバ証明書を作るためで、不使用
  2. CA証明書:cacert.pem …サーバーを利用する端末のブラウザで使用
  3. サーバ秘密鍵:nopass_server.key …サーバーの apache に指定
  4. サーバ証明書:server.crt …サーバーの apache に指定

サーバー sslの設定に

定義されている場所が複数あり、その1箇所を次に示します。同様に sites-available 内のssl に関連するファイルを確認する必要があります。

# vi /etc/apache2/sites-available/default-ssl.conf
〜省略〜
                SSLCertificateFile    /openssl/server.crt
                SSLCertificateKeyFile /openssl/nopass_server.key
〜省略〜

コンフィグファイルの確認

$ apache2ctl configtest
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

apache2 の起動と確認

Syntax OK となっていても、実際に start でエラーが出て起動しない場合が多いので原因をじっくり潰します。

$ sudo systemctl start apache2
$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-03-14 21:52:25 JST; 28s ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 877445 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
   Main PID: 877471 (apache2)
      Tasks: 57 (limit: 4413)
     Memory: 8.2M
     CGroup: /system.slice/apache2.service
             ├─877471 /usr/sbin/apache2 -k start
             ├─877472 /usr/sbin/apache2 -k start
             ├─877473 /usr/sbin/apache2 -k start
             ├─877474 /usr/sbin/apache2 -k start
             └─877475 /usr/sbin/apache2 -k start

 3月 14 21:52:25 big-book systemd[1]: Starting The Apache HTTP Server...
 3月 14 21:52:25 big-book apachectl[877454]: AH00558: apache2: Could not reliably determine the server's fully>
 3月 14 21:52:25 big-book systemd[1]: Started The Apache HTTP Server.
lines 2-18/18 (END)

何とか最後に起動できました。

Ubuntuのサーバーが止まる

新LTSが公開され半年経過でバージョンアップ

Linux の Ubuntuを大柄なノートPCにセットアップして、サーバーとして利用していましたが、18.04 LTS から20.04 LTS にバージョンアップしたら動作中に止まるらしく、リモート接続していても NFS でリモートディスクとして利用していても固まってしまいます。

画面の蓋開閉が原因かと設定直すも効果なし

ディスクトップを開いて作業していれば問題はなく、画面を閉じると停止してしまいます。そのため、画面を閉じてもサスペンドやファイバネーションが起動されない設定を行いました。それでも20分で停止します。

ネットの記事を頼りに色々と試すしかない

ネット検索すると同様の条件で苦労しているらしい人達の情報に行き当たります。アメリカとどこかの国で、何かの会議で可決されたエコの対象として自動的に停止するようにしなければならなくなったとか、の改悪らしいことが書かれていました。

1時間や半日とか処理に掛かるのは一般的なものですが、勝手に止まってそれを復旧するために時間が取られ、止まらないように付きっ切りで監視しているのがエコとは思えない、ギャグのような本末転倒な行為ですけど、その様な改悪がバージョンアップで起きてしまっていることに驚きです。

システムを自動停止させる設定を外部から操作できない

バージョンアップ前の 18.04 LTS では、システムの処理が停止しないように設定するための画面操作があって、そこで問題無く思うように設定できたのですが、20.04 LTS にバージョンアップしたらその様な設定項目が見付けられませんでした。ネット情報によると変更できないように設定アプリを取り除いたらしい事が書かれていました。

使い物にならないバグだと思ったら…

サーバーが勝手に停止してしまうバグだと思ったら、それが仕様だったとは驚き、その仕様を作成した人達の脳味噌のシステムパグだったと言うことですよね、更に驚きでした。

有効な対策の紹介記事に辿り着く

対策を日本語で紹介してくれる場所に辿り着きました。リンクの埋め込みには失敗しましたが、次にURLを示します。結果は良好で停止すること無く稼働していることが確認できました。

https://www-it–swarm-jp-net.cdn.ampproject.org/v/s/www.it-swarm.jp.net/ja/suspend/ubuntu-2004は、関連する電源設定が無効になっていても、アイドル状態になると一時停止します/997985878/amp/?amp_gsa=1&amp_js_v=a6&usqp=mq331AQHKAFQArABIA%3D%3D

実施した対策内容

その書かれていた systemd の対策を実施しました。結果として問題ないようです。

$ sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
Created symlink /etc/systemd/system/sleep.target → /dev/null.
Created symlink /etc/systemd/system/suspend.target → /dev/null.
Created symlink /etc/systemd/system/hibernate.target → /dev/null.
Created symlink /etc/systemd/system/hybrid-sleep.target → /dev/null.

DHCPサーバーの構築

今更、何でこんな事を…と思う作業

ホームゲートウェイと呼ばれている各家庭の入口に置かれたルーターの性能が悪すぎて、悲しいことに内蔵しているDHCPサーバーをそのまま利用できない状況です。

仕方なく、別にサーバーを立てて、そこに個別のDHCPサーバーを作らなければならない状況です。天下のNECさん、まともな製品を作ってくださいよね。仕様通りの機能が無くてもレンタル料金を搾取するって詐欺ですね。

我が家のネット環境の変革

最初のネット常時接続

プライベートな写真やこのブログの公開は、以前から長い期間を継続して行っています。それは家に置かれた電化代の少ない小さなサーバーで、Webサーバーを構築して実行しています。

そのための家庭内のネットワーク環境は、契約した常時接続のネットワーク環境で行われていますが、当初は FTTH(光回線)とADSLが混在している時代の環境でした。

(0) その頃にADSLを申し込みましたが、NTTの庁舎からの距離が長く途中で中継されているためメタル線で接続されていないことが判明してアウトでした。(1) そして暫くして普及し始めたフレッツ光で常時接続される環境が提供されたのが最初でした。その頃のレンタルは沖電気工業製のルーターでした。

その後の変革

暫くフレッツ光で 初期のWebサーバーを公開していましたが、世界的に見てもグローバルIPアドレスが不足していて、グローバルアドレスの割り振りに問題があるため世界的に IPv6の試行が始まりました。

我が家のサーバーも技術が無いのに対応に迫られました。しかしNTTのフレッツ光は何故かIPv6の利用を、その頃のオプションとして有料での提供でした。世界的に移行しなければならないIPv6環境への試行が有料オプションだなんてありえないと感じました。

経緯は忘れましたが、KDDIに移行

契約料が安かったからかも知れませんが、(2) 少ししてKDDIの光回線に移行しました。IPv6は無料のまま利用でき、ネットワーク環境も良好でした。今ではこのまま継続していれば良かったのかと後悔しています。

家族のスマホ購入で光回線も切替

時代の流れで妻や子供達のスマホを購入する事になりました。当時の電話としての安さからWillcomのPHSを使用していた流れで、Yモバイルのスマホになり、(3) その親会社のソフトバンクに光回線を切替えると料金が割り引かれて安くなると説明されて切替えました。実際には、色々な条件で割引の規制が行われていて、安くなっていませんでした。

はっきり言ってソフトバンクはNTTに任せっきりなのか技術力がないと感じました。設置されたホームゲートウェイは最悪で、ローカルアドレスを割振るDHCPサーバー機能にネームサーバーを指定できなくて、更に内部にあると思われるネームサーバーが機能をいつの間にか停止してしまうようで、名前の解決ができなくてネットの検索ができない事が多発しました。

Wifiの接続を使用させないようにして、従量制の回線の稼働率を上げながら知らない間に金儲けするような悪意を感じて、不信感が募りました。当時社長の孫さんの意向でしょうか。

そのためWifi接続では、インターネットに接続できない…とほとんどの期間に表示していて、外部回線を使用すれば利用できるのですが、分かっていても使わないためスマホからは何の通信もできない日々が続きました。半日経ったり数時間経つと繋がることもあり、スマホ利用を急ぐ時はホームゲートウェイの電源を再投入し初期化して利用していました。

高価な常時接続の光回線なのに、大昔のパソコン通信のような利用に際してのお膳立てが必要な環境になってしまい苦労しました。その頃、実はWebで公開していた昔のサーバー内にDHCP機能があったのですが、老朽化で物理的に故障して使えなくなり、新しく立ち上げたPogoPlugのWebサーバーにDHCP機能が組み込めなかったりとストレスの溜まる期間でした。

そしてブラスト光の電話セールスで切替

ソフトバンクの前に調子良く利用できていたKDDIに戻したい気持ちがありましたが、ブラスト光の売り込みがあり、特に安くなく使い物にならないソフトバンク以外なら何でも良かったのが本音です。(4) ブラスト光はオプションをカスタマイズすると契約料金も安く快適で、ホームゲートウェイは中国製ファーウェイのHG8045Qで、色々な細かな設定もでき実に使いやすく安定していました。

問題は、ならず者国家の北朝鮮と大差のない習近平ひきいる中国共産党の傘下にある企業が制作しているルーターなので、バックドアや何が仕掛けられているのか分からない恐怖を感じながら利用していることです。

特に安くなるわけでもないけど光回線契約をKDDIに戻すことに

電話のセールスで、北海道や九州の複数の au光の代理店が売り込んできたので、安くなるわけではないものの気になるファーウェイのルーターを外す意味で、(5) au光に乗り換えを承諾しました。

ただ後々確認して分かったことは、レンタルになるホームゲートウェイがNEC製だと知りました。ソフトバンクで痛い目にあっている出来の悪かったNEC製なので、あれから年月は経っているのでまさかとは思いますが不吉な予感を感じました。

レンタルルーター説明書を確認、やはり使えねえ〜

機種名からネットで説明書を探し、機能を真っ先に確認しましたが、やはりDHCPサーバーにDNSを設定する箇所が見当たらなくて、不吉な予感はあたっていました。

説明書によると、DHCPで割振る開始アドレスの位置を設定できるらしく、固定で割り当てされているサーバーのアドレスの変更までは必要がないと胸をなでおろしました。

ところが送られてきたルーターを設定し始めて分かったことは、設定項目を入れる箇所があっても何を入れても受付けずに全てエラーを返して機能しないことが分かりました。天下のNECさん作りが悪すぎだよ、これって製品としてテストして出荷している市販品ですか。

DHCPで振られるアドレスが、サーバーの固定アドレスと競合

①工事費は、詐欺に有ったと思い諦めて切替の契約を破棄して戻すか、②旧型でも中古品でもまともに使えるルーターに交換させるか、あるいは③自分でDHCPサーバーを立ち上げて処理させるか、3択の選択に悩む大きな問題に直面しました。

最新のRaspberry pi に期待して画策

③の実現性を1週間位で見極めることにしました。以前、Raspberry pi にDHCPサーバーを組み込もうと考えて挫折したことがありました。それはインストールしてもエラーが起こり、対策方法をネットの検索では見付けられずに諦めた経緯があります。でもそれから Debian のバージョンも上がり、Raspberry pi の利用者も大きく増えていることを考えると、今ならできそうな気がします。

腹を決めDHCPサーバーを立ち上げることに

まずはワーキングとして動作させていた最新の Raspberry pi に組み込み動作検証から始めました。ネットの情報を確認するとシステムの立ち上げで自動的に起動しないことが頻繁に起こるようで、サーバーが起動してから10秒位待たせてスクリプトで起動したり、皆さん苦労して動作させているのが現状のようでした。

systemd の振舞に則った対策をしているサイト

DHCPサーバーが停止しても自動的に再起動させるための systemd に則った手順を定義して対策しているサイトを見つけることができました。ほぼ丸写しで立ち上げできる目処が立ち、レンタルルーター内の IPv4 のDHCPサーバー機能を停止して、自前のDHCPサーバーを利用する目処が立ちました。

今後のためにDHCPサーバーの記録を残す

もしもの事も考えて、検証したワーキングサーバーの組み込みは自動で立ち上げしないようにしておき dhcp_disable、公開しているWebサーバーの Raspberry pi 内にDHCPサーバー機能を組込むことにしました。

ISC-dhcp-server インストール

DHCPサーバーをインストールします。isc-dhcp-server は、純粋の systemd としての構成になっていないようなので、前述の親切なネット情報を参考にして組込み、起動しなかったり何かの状況で停止しても再起動させる手順の追加が必要になります。

$ sudo apt install isc-dhcp-server
以前に未選択のパッケージ libisccfg-export163 を選択しています。 (データベースを読み込んでいます ... 現在 174552 個のファイルとディレクトリがインストールされています。) .../libisccfg-export163_1%3a9.11.5.P4+dfsg-5.1+deb10u3_armhf.deb を展開する準備をしています ... libisccfg-export163 (1:9.11.5.P4+dfsg-5.1+deb10u3) を展開しています... 以前に未選択のパッケージ libirs-export161 を選択しています。 .../libirs-export161_1%3a9.11.5.P4+dfsg-5.1+deb10u3_armhf.deb を展開する準備をしています ... libirs-export161 (1:9.11.5.P4+dfsg-5.1+deb10u3) を展開しています... 以前に未選択のパッケージ isc-dhcp-server を選択しています。 .../isc-dhcp-server_4.4.1-2_armhf.deb を展開する準備をしています ... isc-dhcp-server (4.4.1-2) を展開しています... 以前に未選択のパッケージ selinux-utils を選択しています。 .../selinux-utils_2.8-1+b1_armhf.deb を展開する準備をしています ... selinux-utils (2.8-1+b1) を展開しています... 以前に未選択のパッケージ policycoreutils を選択しています。 .../policycoreutils_2.8-1_armhf.deb を展開する準備をしています ... policycoreutils (2.8-1) を展開しています... selinux-utils (2.8-1+b1) を設定しています ... policycoreutils (2.8-1) を設定しています ... selinux-autorelabel-mark.service is a disabled or a static unit, not starting it. libisccfg-export163 (1:9.11.5.P4+dfsg-5.1+deb10u3) を設定しています ... libirs-export161 (1:9.11.5.P4+dfsg-5.1+deb10u3) を設定しています ... isc-dhcp-server (4.4.1-2) を設定しています ... Generating /etc/default/isc-dhcp-server... Job for isc-dhcp-server.service failed because the control process exited with error code. See "systemctl status isc-dhcp-server.service" and "journalctl -xe" for details. invoke-rc.d: initscript isc-dhcp-server, action "start" failed. isc-dhcp-server.service - LSB: DHCP server Loaded: loaded (/etc/init.d/isc-dhcp-server; generated) Active: failed (Result: exit-code) since Mon 2021-03-01 10:58:51 JST; 52ms ago Docs: man:systemd-sysv-generator(8) Process: 623 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=1/FAILURE) 3月 01 10:58:49 web-server dhcpd[644]: bugs on either our web page at www.isc.org or in the README file 3月 01 10:58:49 web-server dhcpd[644]: before submitting a bug. These pages explain the proper 3月 01 10:58:49 web-server dhcpd[644]: process and the information we find helpful for debugging. 3月 01 10:58:49 web-server dhcpd[644]: 3月 01 10:58:49 web-server dhcpd[644]: exiting. 3月 01 10:58:51 web-server isc-dhcp-server[623]: Starting ISC DHCPv4 server: dhcpdcheck syslog for diagnostics. ... failed! 3月 01 10:58:51 web-server isc-dhcp-server[623]: failed! 3月 01 10:58:51 web-server systemd[1]: isc-dhcp-server.service: Control process exited, code=exited, status=1/FAILURE 3月 01 10:58:51 web-server systemd[1]: isc-dhcp-server.service: Failed with result 'exit-code'. 3月 01 10:58:51 web-server systemd[1]: Failed to start LSB: DHCP server. man-db (2.8.5-2) のトリガを処理しています ... libc-bin (2.28-10+rpi1) のトリガを処理しています ... systemd (241-7~deb10u6+rpi1) のトリガを処理しています ...

インストールしてもそのままでは稼働しません。いくつかの呪文のような修正を施して動作させる必要があります。割振るアドレス範囲等の情報をIPv4 / IPv6に対応して定義しますが、今回はIPv4のみ作成します。アドレスの要求を受付けるインターフェイス eth0 の定義、それとインストール時に出されていた上記メッセージに書かれている debug に関する修正で、no を yes に書き換える必要があります。

起動のタイミングや何らかの問題で停止しても再起動させるように、新規に次のような定義ファイルを作成します。内容は参考にしたサイトの丸写しで問題無く動作するようです。systemd では、ユニットファイルと呼ぶ定義ファイルを /etc/systemd/system/ の下に配置するようで、丸コピーした次の例では isc-dhcp-server.service.d としてディレクトリを配置して、更にその下に定義ファイル 10-additional.conf を作成していました。

試していませんが、例えば 直接 /etc/systemd/system/ ディレクトリの下に isc-dhcp-server.service と名付けて以下内容のユニットファイルを配置しても良さそうです。

$ cat /etc/systemd/system/isc-dhcp-server.service.d/10-additional.conf

[Unit] SourcePath=/etc/init.d/isc-dhcp-server [Service] Type=forking PIDFile=/var/run/dhcpd.pid RemainAfterExit=no Restart=on-failure RestartSec=15s

要求にアドレスを割振る範囲やDNSの設定

稼働させるための定義ファイルを作成します。割振るアドレスは、192.168.11.31 〜 192.168.11.200 の範囲としています。

定義した内容の注目箇所のみに省略した内容で、次に示します。

$ sudo vi /etc/dhcp/dhcpd.conf

# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#

# option definitions common to all supported networks...
option domain-name "sunao-mita.pgw.jp";
#option domain-name-servers ns1.example.org, ns2.example.org;

default-lease-time 600;
max-lease-time 7200;

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;

# network, the authoritative directive should be uncommented.
authoritative;

subnet 192.168.11.0 netmask 255.255.255.0 {
 range 192.168.11.31 192.168.11.200;
 option routers 192.168.11.1;
 option domain-name-servers 192.168.11.2, 192.168.11.20;
 option broadcast-address 192.168.11.255;
 ignore declines;
}

アドレス要求に答えるインターフェイスの設定

DHCPサーバーへのアドレス要求を受け付けるインターフェイスを定義します。なお、IPv6に関しては、レンタルのホームゲートウェイに任せます。そのためIPv4の機能のみ自前で稼働させます。定義内容は、最後にある空欄に eth0 を追加しているだけです。

$ cat /etc/default/isc-dhcp-server

〜〜省略
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="eth0"
INTERFACESv6=""

ついでにDHCP関連の簡易コマンドを作成

稼働状況を確認したり、定義を変更して再起動したり、停止したり、サーバーを再起動で自動的に起動したり、サーバーの再起動で自動起動させないようにしたりすることも多く発生すると思われますが、/usr/local/bin 内にコマンドを作成しておきます。

  • dhcp_status …稼働状況の確認や簡易ログ
  • dhcp_start …手動で開始
  • dhcp_stop …手動で停止
  • dhcp_restart …定義変更等で再起動
  • dhcp_enable …サーバーの電源投入で自動起動させる
  • dhcp_disable …サーバーの電源投入で起動させない
  • dhcpリース …割振り状況のリストを表示
  • dhcpジャーナル …蓄積されたジャーナル、statusの簡易ログが蓄積?

定義を次のようにしています。rootになって、cd /usr/local/bin に移動して、dhcp_status を最初に作成して、それにリンクを定義しています。

$ sudo su -
# cd /usr/local/bin
# vi dhcp_status

#!/bin/sh
# status start stop enable disable restart 
rc=`echo $0 | sed -e "s/^.*_\(.*\)$/\1/"`

sudo systemctl $rc isc-dhcp-server.service

各コマンドに対するリンクを張ります。

# chmod +x dhcp_status
# ln -s ./dhcp_status dhcp_start # ln -s ./dhcp_status dhcp_stop # ln -s ./dhcp_status dhcp_restart # ln -s ./dhcp_status dhcp_enable # ln -s ./dhcp_status dhcp_disable

ついでにアドレスを割振ったリース状況の確認コマンドも作成しておきます。理由は、直ぐに忘れる少し長いステートメントのコマンドをリースとかdhcpとかの簡単な文字列から見付けて利用するためです。それとジャーナルの確認コマンドも追加です。

# vi dhcpリース
#!/bin/sh
less /var/lib/dhcp/dhcpd.lease 
# chmod +x dhcpリース

# vi dhcpジャーナル
#!/bin/sh
journalctl -u isc-dhcp-server.service
# chmod +x dhcpジャーナル

安全のためか稼働には修正の必要がある

dhcpサーバーを導入して、debug を修正する必要があるらしいので、no ⇒ yes に書き換えます。

$ cat /etc/dhcp/debug
#
# The purpose of this script is just to show the variables that are
# available to all the scripts in this directory. All these scripts are
# called from dhclient-script, which exports all the variables shown
# before. If you want to debug a problem with your DHCP setup you can
# enable this script and take a look at /tmp/dhclient-script.debug.

# To enable this script set the following variable to "yes"
RUN="yes"

if [ "$RUN" = "yes" ]; then 〜〜以下省略

準備ができたので起動して確認

$ sudo systemctl daemon-reload
$ dhcp_restart

稼働しているのかエラーで停止しているのか確認

作成した簡易コマンド dhcp_status を起動すると状況が表示されますが、画面から溢れている部分は矢印キーで移動して、最後に q で終了します。

$ dhcp_status
Warning: The unit file, source configuration file or drop-ins of isc-dhcp-server.service changed on disk. Run '
 isc-dhcp-server.service - LSB: DHCP server
   Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
  Drop-In: /etc/systemd/system/isc-dhcp-server.service.d
           └─10-additional.conf
   Active: active (running) since Wed 2021-03-03 09:58:22 JST; 13h ago
     Docs: man:systemd-sysv-generator(8)
  Process: 28579 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=0/SUCCESS)
 Main PID: 28592 (dhcpd)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/isc-dhcp-server.service
           └─28592 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf eth0

 3月 03 23:06:51 web-server dhcpd[28592]: DHCPACK on 192.168.11.31 to b0:4e:26:84:7b:34 (Archer_C1200) via eth0
 3月 03 23:07:12 web-server dhcpd[28592]: reuse_lease: lease age 61 (secs) under 25% threshold, reply with unal
 3月 03 23:07:12 web-server dhcpd[28592]: DHCPREQUEST for 192.168.11.31 from b0:4e:26:84:7b:34 (Archer_C1200) v
 3月 03 23:07:12 web-server dhcpd[28592]: DHCPACK on 192.168.11.31 to b0:4e:26:84:7b:34 (Archer_C1200) via eth0
lines 1-17

割当てられたIPアドレスのリース状況

割振られたIPアドレスやリースの確認は、作成した簡易コマンド dhcpリース を利用して、矢印キーで移動して確認します。操作は、コマンド less の操作になります。最後に q で終了します。

$ dhcpリース
  set vendor-class-identifier = "MSFT 5.0";
  client-hostname "Archer_C1200";
}
lease 192.168.11.32 {
  starts 3 2021/03/03 14:06:22;
  ends 3 2021/03/03 14:16:22;
  cltt 3 2021/03/03 14:06:22;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet dc:a6:32:8d:18:2c;
  uid "\001\334\2462\215\030,";
  set vendor-class-identifier = "dhcpcd-8.1.2:Linux-5.10.11-v7l+:armv7l:BCM2711";
  client-hostname "working";
}
lease 192.168.11.54 {
  starts 3 2021/03/03 14:06:37;
:

DHCPの稼働で蓄積されたジャーナルの確認

ジャーナルの確認には、作成した簡易コマンドで dhcpジャーナル を使用します。操作は less の操作と同じです。最後は q で終了します。

$ dhcpジャーナル
-- Logs begin at Mon 2021-03-01 20:50:19 JST, end at Thu 2021-03-04 00:52:41 JST. --
 3月 01 20:50:34 web-server dhcpd[1270]: reuse_lease: lease age 81 (secs) under 25% threshold, reply with unalt
 3月 01 20:50:34 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.31 from b0:4e:26:84:7b:34 (Archer_C1200) vi
 3月 01 20:50:34 web-server dhcpd[1270]: DHCPACK on 192.168.11.31 to b0:4e:26:84:7b:34 (Archer_C1200) via eth0
 3月 01 20:50:37 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.32 from dc:a6:32:8d:18:2c (working) via eth
 3月 01 20:50:37 web-server dhcpd[1270]: DHCPACK on 192.168.11.32 to dc:a6:32:8d:18:2c (working) via eth0
 3月 01 20:50:54 web-server dhcpd[1270]: reuse_lease: lease age 101 (secs) under 25% threshold, reply with unal
 3月 01 20:50:54 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.31 from b0:4e:26:84:7b:34 (Archer_C1200) vi
 3月 01 20:50:54 web-server dhcpd[1270]: DHCPACK on 192.168.11.31 to b0:4e:26:84:7b:34 (Archer_C1200) via eth0
 3月 01 20:51:01 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.52 from dc:a6:32:4a:d7:39 (web-server) via 
 3月 01 20:51:01 web-server dhcpd[1270]: DHCPACK on 192.168.11.52 to dc:a6:32:4a:d7:39 (web-server) via eth0
 3月 01 20:51:04 web-server dhcpd[1270]: reuse_lease: lease age 3 (secs) under 25% threshold, reply with unalte
 3月 01 20:51:04 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.52 from dc:a6:32:4a:d7:39 (web-server) via 
 3月 01 20:51:04 web-server dhcpd[1270]: DHCPACK on 192.168.11.52 to dc:a6:32:4a:d7:39 (web-server) via eth0
 3月 01 20:51:12 web-server dhcpd[1270]: reuse_lease: lease age 11 (secs) under 25% threshold, reply with unalt
 3月 01 20:51:12 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.52 from dc:a6:32:4a:d7:39 (web-server) via 
 3月 01 20:51:12 web-server dhcpd[1270]: DHCPACK on 192.168.11.52 to dc:a6:32:4a:d7:39 (web-server) via eth0
lines 1-17

ネット環境を日常の状況により操作

DHCPサーバーを一時的に停止する場合 dhcp_stop や、
停止から起動する場合 dhcp_start
定義情報を書き換えて再起動するには dhcp_restart
更にはサーバーの停止再起動でDHCPサーバーを自動起動させたくない時 dhcp_disable、サーバーの再立ち上げで自動起動させたい場合 dhcp_enable
等を簡易コマンドで操作します。

常時稼働の検証サーバー構築

非力なノートパソコンで色々な検証は無理

ちょっとした検証や学習用として、ミスって止めても問題の起こらないサーバーとして、最新のラズベリーパイ Raspberry pi 4 B+ 4GB を購入して構築を始めました。

なおここから記述している作業は基本的に、Linux の Ubuntu が稼働しているパソコン上での作業が中心です。一部でターゲットとして構築している Raspberry pi 本体での作業の場合もあります。

構築を始めたサーバーの利用目的

最大の目的は、プライベート写真を公開している現在のウェブシステムでは、単純に写真を撮影日を元にしてディレクトリに入れて、単純なインデックスを付けているだけなので、特定な条件により選び出すような使い方ができません。

公開システムの構築を思い立った頃に、データベースの知識不足とセキュリティを考慮したシステムを作る自信が無かったこともあって、そのまま大幅な改修もできないまま現在に至っています。

当時気にしていたのはSQLインジェクション

当時はSQLインジェクションなんて呼ばれている攻撃で、データベースシステムが改ざんされる話があちこちで騒がれていたし、データベース未使用でも色々な攻撃でダウンさせられる事件も頻繁に起きていたので、可能な限り最低限の運用に重点を置いていました。

最低限なシステムが功を奏したのか、ヤドカリのように何世代にも渡って殻 (サーバー) を乗換えながらネットに公開していましたが、まだ改ざんされた経験はありません。ちょっと心配になるくらい切れ目なく攻撃の記録がログに残されています。

真の目的は、何の事はないSQL言語の学習用

今のプライベート公開写真のシステムは、データベースを利用しないで、サーバー側で動作する Ruby言語のスクリプトと、端末側で動作する JavaScript の記述を組合せて構築していますが、サーバー側での Ruby スクリプトからデータベースを利用して効率的な検索ができるようになれば、見たい写真の選択が容易になって理想だろうと考えてます。

今回のシステム構築の備忘録

項目リスト

  1. Raspberry pi 4 B+ 、電源アダプタ、ケース類を 購入
  2. Raspbian 最新版のダウンロード と microSD 32GB Class10 への書込み
  3. USBキーボード、マウス、 micro HDMI へモニタを接続してシステム起動
  4. 表示に従って、キーボード種別や言語を指定、その他の問いに答えて初期設定
  5. リブート、初期設定システムの確認と最新アップデートの適用
  6. 初期起動は、microSD で、実システムには、2.5インチ USB ハードディスクへ
  7. vi コマンドで編集するため、vimの設定
  8. 初期設定済み pi ユーザーを sunao ユーザーに置き換え
  9. 基本はリモート作業で利用するため、RSA秘密鍵の生成と SSHの設定
  10. リモート操作で基本の仮想端末 byobu / screen の設定
  11. サーバー内からメールを転送することができる設定
  12. Logwatch と Cron の動作確認

検討内容や作業内容

1.Raspberry pi の機材購入

後の事を考えて最新版で最大メモリ搭載を選択

今回は、サーバーとして利用する予定なので、Wi-Fiや4GBのメモリも全く必要がないのですが、後々不要となって再利用を考えた場合、パソコンとしてセットアップしてみたり、別のOSを入れてみたりと考えると、現時点の最新最上で導入していても良いかなと思い、それに沿った Raspberry pi と ケース、micro HDMIケーブル、電源を一緒に購入しました。

手持ちのものは有るもので間に合わせ

行く行くは入出力を直接持たない単体のサーバーとして稼働の予定なので、初期のセットアップでの間に合せで使用する microSD や キーボード、マウスは使い古しの余っているもので代用させます。

実行時にシステムディスクとして常設する予定の USBハードディスクは、過去に公開ウェブサーバーで使用していたものをパーティションを再定義しての流用を考え購入しません。

2.OSのダウンロードとmicroSDへのセットアップ

OSは最新版のRaspbian

システムは、一般的な Raspbian の最新版のデスクトップを含むフルサイズのものを公式サイトから普通にダウンロードしました。 sha256sum コマンドでエラーのないことを確認してから解凍し、–.img ファイルを作成しました。

$ cd download-dir
$ ls
2020-02-13-raspbian-buster-full.zip

$ sha256sum 2020-02-13-raspbian-buster-full.zip
  〜〜しばらく時間がかかりハッシュチェック完了〜〜
c9c382b659bd96b859ccb9e2ac0c2292a91a37c286ab464f2f380d451077663d  2020-02-13-raspbian-buster-full.zip
$ unzip *.zip
$ ls
2020-02-13-raspbian-buster-full.img  2020-02-13-raspbian-buster-full.zip

手持ちの 32GB microSD Class10 のものに、単純に dd コマンドで書込みました。

$ sudo dd if=2020-02-13-raspbian-buster-full.img of=/dev/mmcblk0 bs=4096
   〜〜しばらく時間がかかり書込み完了〜〜

3.初期設定に必要な機材の接続と電源投入

前述でシステムを書き込んだ microSD を Raspberry pi 本体に挿入し、USBマウス、USBキーボードを接続します。

モニター表示のためにテレビを用意して、HDMIケーブルを接続します。ケーブルの反対側の micro HDMI コネクタを、2つ有る micro HDMI ポートの Raspberry pi 本体電源供給用 Type-C 寄りの HDMIポートに接続します。

必要なものを接続したら電源ON

最後に電源供給用の USB Type-C のポートに 5V電源アダプタを接続して電源ONします。しばらくするとテレビのモニタには、並んだラズベリーマークを表示して動作を始めます。

作成したシステム用の microSD は、固定サイズの 2パーティション構成で作成されて残りのエリアが空きのままなので、システムパーティション(第2パーティション ext4)に残り全てのエリアを取り込むために少し経つと勝手にリブートします。

その度に進化していて初期化手順が異なります

初期のラズベリーパイから何度も初期設定していますが、毎回改良され進化しているので、都度操作手順も設定項目も変わっていて、操作手順を詳細に記録してもあまり意味がないようです。

4.言語やタイムゾーンの初期設定を行います

操作している Raspberry pi 4 B+ 本体を今後はラズパイと省略して呼ぶことにします。ラズパイも初期化する度に初期化の手順や動きが異なりますので、モニターに表示された問に対して返答しながら必要な項目を設定していきます。

日本語の言語選択や Japan / Tokyo 等のタイムゾーン、キーボードの種類の設定も、ただ選択するだけで設定できてしまいます。以前は苦労しながらフォントやキーボード等をカスタマイズしたのが嘘のように簡単です。

インターネットに接続するために、Wi-Fiに接続しますが、これも聞かれるままに接続ポイントとパスワードを指定するだけです。複数の接続ポイントが存在していて、複数を設定するならモニター右上の無線の扇マークのクリックから設定できます。

5.初期設定システムの確認と最新アップデート

リブートして立上がると指定した日本語のデスクトップ画面になっていて、システム時間も日本の時間になっています。画面からターミナルを起動して date コマンドを入力すると一般的な日本の時間が表示されます。

$ date
2020年  3月 29日 日曜日 17:43:47 JST

最新へアップデートを行っておきます。

$ sudo apt update
  〜〜リストされ時間が掛かります〜〜
$ sudo apt -y upgrade
  〜〜少しずつリストされ時間が掛かります〜〜

6.システムパーティションを USBハードディスクへ

現時点のシステムディスクは microSD

現時点で、システムパーティションが microSD 32GB Class10 の第2パーティションになっています。

ラズパイ 3 ならば、USBディスクにシステムを入れて直接起動もできるとネットに情報が上げられています。しかし、ラズパイ 4 ではまだ対応できていないとの情報があって、色々調べましたが現時点ではそれが真実のようです。

microSDで初期起動して、USB-HDDで稼働させます

今までの家屋内で稼働しているラズパイと同様に、起動には microSD の第1パーティションを使い、実際に稼働するOSをUSBハードディスクのパーティションに作成する方法を利用することにします。

再利用なのでパーティションを見直します

まずシステムパーティションやデータの格納パーティションになる USBハードディスクの設定です。前に他で利用していたものの再利用ですので、パーティションの削除から行います。

$ sudo fdisk /dev/sdb

結果として次のような構成に設定しました。今回利用するのは 1TB 2.5インチ USB3.0 のハードディスクです。

作業を後からまとめるつもりで作業していたわけではなかったので、作業中の情報を残していませんでした。そのため次のリストは、後からラズパイの実機立上げ後にリストしたものなので /dev/sda となっています。パソコンで作業している時は、外付けなので /dev/sdb として作業しました。

Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: Rikiki USB 3.0  
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xa51bb4e8

Device     Boot      Start        End    Sectors   Size Id Type
/dev/sda1  *          2048    4196351    4194304     2G  b W95 FAT32
/dev/sda2          4196352   46139391   41943040    20G 83 Linux
/dev/sda3         46139392   67110911   20971520    10G 82 Linux swap / Solaris
/dev/sda4         67110912 1953525167 1886414256 899.5G  5 Extended
/dev/sda5         67112960  234885119  167772160    80G 83 Linux
/dev/sda6        234887168 1178605567  943718400   450G 83 Linux
/dev/sda7       1178607616 1953525167  774917552 369.5G 83 Linux

次にパーティションにラベルを付けて、以下のように初期化しました。

$ sudo mkfs.ext4 -L rootfs /dev/sdb2    …これがシステムパーティションになる
$ sudo mkswap -L swap /dev/sdb3
$ sudo mkfs.ext4 -L home /dev/sdb5
$ sudo mkfs.ext4 -L share-data /dev/sdb6
$ sudo mkfs.ext4 -L data /dev/sdb7

UUID 等を確認するため blkid コマンドでリストして確認しておきます。以下のリストは控えるのを忘れたため、後から実機上で確認したものなので形式が少し異なっているかもしれません。

$ sudo blkid
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="9969-E3D2" TYPE="vfat" PARTUUID="97709164-01"
/dev/sdb2: LABEL="rootfs" UUID="b1be8a91-ebb8-48f9-a617-9ec4d400fe55" TYPE="ext4" PARTUUID="a51bb4e8-02"
/dev/sdb3: LABEL="swap" UUID="223a9d6f-29bf-4e03-8c89-2d2d96334d5b" TYPE="swap" PARTUUID="a51bb4e8-03"
/dev/sdb5: LABEL="home" UUID="b92fd514-5428-4707-a74b-003754b08bca" TYPE="ext4" PARTUUID="a51bb4e8-05"
/dev/sdb6: LABEL="share-data" UUID="220b06fa-d717-4243-8427-879b0621357f" TYPE="ext4" PARTUUID="a51bb4e8-06"
/dev/sdb7: LABEL="data" UUID="7e720f4d-acb1-4cc1-b85a-1da166507375" TYPE="ext4" PARTUUID="a51bb4e8-07"
/dev/mmcblk0: PTUUID="97709164" PTTYPE="dos"
/dev/sdb1: PARTUUID="a51bb4e8-01"

システムパーティションをハードディスクに移動し確認

次にシステムパーティション(P2)をUSBハードでテスクにコピーして、一部設定を変更してシステムが起動することを確認します。

  〜〜microSDの挿入で自動マウントしたのをアンマウント
$ sudo umount /dev/mmcblk0p1
$ sudo umount /dev/mmcblk0p2

  〜〜作業用マウントポイントの確認
$ ls /mnt
  〜〜システムパーティションの転送元と転送先のマウント
$ sudo mount /dev/mmcblk0p2 /mnt/work
$ sudo mount /dev/sdb2 /mnt/sdb2
  〜〜そのままコピー
$ sudo rsync -a /mnt/work/ /mnt/sdb2/

  〜〜次にシステムマウント用の /etc/fstab を編集
$ sudo vi /mnt/sdb2/etc/fstab
  ---------次が編集後の最終結果-----
proc            /proc           proc    defaults          0       0
PARTUUID=97709164-01  /boot           vfat    defaults          0       2
PARTUUID=a51bb4e8-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

  〜〜システム用パーティションをアンマウントし
       起動用パーティションをマウント
$ sudo umount /mnt/work
$ sudo mount /dev/mmcblk0p1 /mnt/work
  〜〜起動用のコマンドライン定義を変更
$ sudo ls /mnt/work
$ sudo vi /mnt/work/cmdline.txt
  ---------次に USBハードディスクのパーティションをシステムに変更
console=serial0,115200 console=tty1 root=PARTUUID=a51bb4e8-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

  〜〜作業したマウントを開放する
$ sudo umount /mnt/work
$ sudo umount /mnt/sdb2

この状態で修正した、microSD と USBハードディスクをラズパイに挿入して、起動できるか確認します。

利用価値のない microSD を起動に活用

この構成で起動できることが確認できましたので、起動に利用する microSD を入替えたいと思います。

入替える理由は、自分の手持ちの中に容量も少なく速度も遅く、ほとんど利用価値のない microSD 4GB Class4 があり、このシステムでは 1度起動されれば稼働中はほとんどが USBハードディスクでの動作になるため、大きな問題が無いと考えてこちらに置き換えます。

まず正常に起動した 32GB の microSD を作業用パソコンに挿入します。そしてdd コマンドで、microSD 全域を1ファイルとして作業用パソコン内に一時ファイルとしてコピーします。そして取り出してから置換える 4GB の microSD を作業用パソコンに挿入してコピーします。

  〜〜元になる 32GB の microSD を作業用パソコンに挿入
  〜〜microSD 全域をファイル名 mmcblk0 としコピー
$ sudo dd if=/dev/mmcblk0 of=mmcblk0 bs=4096
  〜〜置換える 4GB の microSD に交換して
  〜〜ファイル名 mmcblk0 を microSD にフルコピーする
$ sudo dd if=mmcblk0 of=/dev/mmcblk0 bs=4096

実際には、パラメータの bs= の数値を大きくしてコピーするブロックサイズを大きくした方が作業が早くなると思われます。そして、物理的なサイズが違うため、エリアが足らないとエラーになりますが、起動に必要な第1パーティション部分は全く問題なくコピーされています。

7.普段使いのエディタ vim の整備

リモートで操作してコマンドで整備したり利用したりするために、普段常用しているエディタ vim のフルセットを導入して設定を変更しておくことにします。

マウスのクリックで勝手にビジュアルモードになってしまう

マウスを使用して操作することが多いのですが、マウスのクリックで使用することのないビジュアルモードに勝手に移行してしまう問題があります。これを回避する設定が有るようなのでその設定を行います。

vim の定義ファイルが、各ユーザーのホームディレクトリに置かれているので、そのファイル .vimrc に、呪文のような1行を追加しておきます。

$ cat .vimrc
set mouse-=a

コマンドの履歴を確認できる環境へ

ついでに標準のシェル bash の設定にもカスタマイズを加えておきます。通常のシェルとして起動される bash は、ユーザーのホームディレクトリに .bashrc として設定ファイルを持っています。

色々な設定の雛形がコメントとして記述されているので有効にして、再起動するだけで利用できるものもあります。

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignorespace

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=100000
HISTFILESIZE=100000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

   〜〜所々省略してます
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'

# some more ls aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
   〜〜所々省略してます
export HISTTIMEFORMAT='%F %T '
export PROMPT_COMMAND='history -a; history -c; history -r' # 履歴のリアルタイム反映

色々な設定値を試してみながら、都度カットアンドトライしてみて馴染むものを残せば良いのだと思います。

8.規定値の pi ユーザーを sunao に置き換え

今まで利用しているユーザー名 sunao を複数の既存システムと統一して作業するのに、デフォルトの pi ユーザーのままでは色々と支障が出てきます。そのため uid:1000 を pi から sunao に入替えて、pi は 1001 として残しておきます。

関係するファイルは、rootユーザーで変更してしまいます。実行するコマンドは次のコマンドです。

  • vipw / vipw -s
  • vigr / vigr -s
  • visudo
# vipw
    〜〜前後省略 該当部分のみ〜〜
sunao:x:1000:1000:,,,:/home/sunao:/bin/bash
pi:x:1001:1001:,,,:/home/pi:/bin/bash
    〜〜

:pi から :sunao に置換する場合は、viエディタ内でのコマンド操作で、 :%s/:pi/:sunao/g のように行うと一括で置換されます。

9.リモート認証の鍵生成

ssh を利用してリモート作業を行うのに、パスワード入力の認証は煩わしいのと、外部からパスワードを繰り返しチャレンジされるセキュリティの問題を回避するために、秘密鍵と公開鍵を生成してお互いに接続する環境を整えます。

接続する側をクライアント、接続される側をサーバーと呼び、考え方としてはクライアント側のユーザーが、ssh-keygen コマンドを実行するとデフォルトでは、ユーザーのホームディレクトリに .ssh サブディレクトリが作成されて、その中に秘密鍵と公開鍵のペアが生成されて置かれます。

鍵の生成例

ユーザー名: test で rsa 鍵を生成して、生成された .ssh ディレクトリのリストを表示しています。 id_rsa が秘密鍵で、id_rsa.pub が公開鍵になります。公開鍵の内容イメージも例示しておきます。

test@working:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa): 
Created directory '/home/test/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/test/.ssh/id_rsa.
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:WgJ+bZ4WB2zKR8DqhtCeinpQlLgyTtfdCac/OnGnQFw test@working
The key's randomart image is:
+---[RSA 2048]----+
| . . ..          |
|. o   .+ E       |
| +  o.o @ .      |
|=.oo.+ X +       |
|+=.+. * S .      |
|..+ o. X B .     |
|.o .  . O +      |
|o .    + .       |
|o.      .        |
+----[SHA256]-----+


test@working:~$ ls -al .ssh
合計 16
drwx------ 2 test test 4096  4月 13 15:47 .
drwxr-xr-x 3 test test 4096  4月 13 15:47 ..
-rw------- 1 test test 1823  4月 13 15:47 id_rsa
-rw-r--r-- 1 test test  394  4月 13 15:47 id_rsa.pub


test@working:~$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8TsyIMEyb6OSY3V6uqX+kzlcuHowJImBIseyoJcRgSIcJvGtECVxVg9UjN41elMsF213ycDSjOpwnvDbFERfRqdxdyZaqehPO1+sRamgzTl6lzjSwFJIThwkcOM4ybNYHzqiNqKAxnOPgA5/HzJTBQINvmESkW8J4NbIrkjG6QsL2HOffC2ssnunFdvgeFPLSlxUi4mmdeuavX/F0dIa4IfTojirS6l8K9bKNQQ7j8HgaXBfZmIHpG/6iOnl+NvK/dQ53RGG0TVdrfEwxNzhdMVZ5mSPOpwuIs5gnYb3Of4sW6fc2boGr5lMSNx/7NrXzE6YDj1kpKvD1H7dPEfBP test@working

鍵認証でリモートログインするには

鍵を生成したクライアントのユーザーが、リモートで接続するサーバー側ユーザーのホームディレクトリの .ssh に置かれた authorized_keys ファイルに生成した公開鍵の情報を追加で丸コピーします。もしファイルがなければ新規に作成します。

authorized_keys ファイル内にコピーされている公開鍵とペアになる秘密鍵を持つユーザーが鍵認証でリモートログインできるようになります。セキュリティ上の課題はありますが、秘密鍵を流用コピーして接続することが可能です。

生成する鍵には、パスワードやパスフレーズを含めてセキュリティを向上させることは可能ですが、常時稼働する特定のサーバー同士で特定のファイルやディレクトリ等を rsync コマンド等を利用して自動でバックアップコピーさせるような使い方では、お互いの root ユーザーがパスフレーズ無しで認証できれば人手介入の必要がありません。

鍵認証できればパスワード認証禁止へ

鍵認証でのリモートログインの確認ができれば、セキュリティの脅威になるパスワード認証をできないように変更します。パスワードやパスフレーズを省略して生成した鍵認証でのログインはパスワードを求められることもなくストレス無く作業が進められます。

$ sudo vi /etc/ssh/sshd_config
    〜〜該当する部分の近くのみ表示
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
#PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
    〜〜

10.リモートで操作するために byobu 設定

リモート接続の環境では意図しない色々な状況で接続が切れます。でも byobu を導入して作業していれば、仮に接続が切れてもサーバー側では処理が継続したままで、再び接続すれば以前の状態に復帰したり、切断した後も実行していた結果を後から確認することも可能になります。

趣味や趣向的な好みの問題でしょうか、byobu と screen の組合せが好きで、仮想端末の byobu をコントロールするキー割り当て (エスケープ文字と呼びます) を Ctrl (コントロール) +B キーにするのが好みでそれに置き換えます。

簡単な操作でリモート接続

byobu は、使い慣れると手放せない機能で、リモートの仮想端末から ssh 接続すると、以前に切断した時の画面に戻って操作の継続が可能になります。再び ssh 接続を終了して切断するのも、単に [F6]キーを押下するだけです。

設定の手順

まず ssh でリモート側から、サーバーの ipアドレス (と必要ならユーザー名) を指定してリモートからログインします。ログインは自動的に行われるため、そのままログインしたサーバー側ユーザーの打鍵待ちとなるプロンプトが表示されます。

最初に byobu [Enter] と打鍵して byobu を起動します。標準では tmux と連携しているので、 byobu+tmux の画面が表示されます。次のように選択して byobu+screen に変更します。

$ byobu-select-backend 

Select the byobu backend:
  1. tmux
  2. screen

Choose 1-2 [1]: 2

エスケープ文字と呼ぶ仮想端末 byobu を制御するためのコマンド文字を変更します。画面は崩れますが、[F9]キーの押下で次のメニューが表示され、そこで Change escape sequence を選択するとエスケープ文字の変更ができます。ここでは A から B に変更しました。 ⇒ Escape key: ctrl-B_

┌────────────────────┤  Byobu Configuration Menu │                                                                      │                                                        
│                                                                      │                      
│     Help -- Quick Start Guide                                        │                      
│     Toggle status notifications                                      │                      
│     Change escape sequence                                           │                      
│     Byobu currently launches at login (toggle off)                   │                      
│                                                                      │                      
└──────────────────────                                                                       

最終的に変更された定義ファイルは、次の内容です。

$ cat .byobu/keybindings
source $BYOBU_PREFIX/share/byobu/keybindings/common
bindkey "^B"
escape "^Bb"
register x "^B"

このままでは、ssh でリモートログインしても自動的に byobu は起動しないので、自動起動と自動終了を有効にする変更を行います。

$ byobu-enable

The Byobu window manager will be launched automatically at each text login.

To disable this behavior later, just run:
  byobu-disable

これで byobu の設定が完了しました。

11.メール転送できる環境を整備

設定用の雛形からコピーして、設定ファイル main.cf を作成します。以前の情報でアナウンスされていた雛形の置き場所以外に、最新のパッケージには .proto の文字列を付加した雛形が同包されているようです。

雛形をコピーして項目の設定

$ sudo cp /etc/postfix/main.cf.proto /etc/postfix/main.cf   # … 雛形をコピー
$ sudo vi /etc/postfix/main.cf
    〜〜コメントも挿入されていて長いので有効行のみ

compatibility_level = 2 command_directory = /usr/sbin daemon_directory = /usr/lib/postfix/sbin data_directory = /var/lib/postfix mail_owner = postfix
myhostname = working.sunao-mita.pgw.jp
mydomain = sunao-mita.pgw.jp
myorigin = $myhostname
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain local_recipient_maps = unix:passwd.byname $alias_maps
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8, [::ffff:127.0.0.0]/104, [::1]/128, 192.168.11.0/24, [240d:1a:34d:7f00::0]/64
relayhost = [smtp.nifty.com]:587
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP $mail_name (Raspbian)

debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
#html_directory =

#manpage_directory =
#sample_directory =
#readme_directory =
inet_protocols = ipv4, ipv6

# 最終行へ追記:送受信メールサイズを10Mに制限
message_size_limit
= 10485760

# メールボックスサイズを1Gに制限
mailbox_size_limit
= 1073741824

# SMTP-Auth 設定

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/nifty.auth
smtp_sasl_security_options = noanonymous

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination, permit_sasl_authenticated,reject

コピーした時点で最初から有効となっている行と、更新や挿入した行を抽出しています。追加や更新した行は、該当行の文字列を太くして表現しています。

@Nifty でリレーするための認証組込み

@Nifty に作成したメールをリレーしますが、送信する時点で、ユーザー名とパスワードによる認証を必要とします。次のような nifty.auth ファイルを作成して変換すると nifty.auth.db ファイルが生成されます。

$ sudo vi /etc/postfix/nifty.auth
[smtp.nifty.com]:587 --userid--:--password--

sudo postmap /etc/postfix/nifty.auth


$ ls -al /etc/postfix/
合計 176
drwxr-xr-x   5 root root  4096  4月 15 17:06 .
drwxr-xr-x 121 root root 12288  4月 13 16:12 ..
-rw-r--r--   1 root root    60  3月 22 09:42 dynamicmaps.cf
drwxr-xr-x   2 root root  4096  1月 15 23:05 dynamicmaps.cf.d
-rw-r--r--   1 root root 28057  4月 15 16:06 main.cf
-rw-r--r--   1 root root 27122  3月 22 09:42 main.cf.proto
lrwxrwxrwx   1 root root    31  3月 22 09:42 makedefs.out -> /usr/share/postfix/makedefs.out
-rw-r--r--   1 root root  6208  3月 22 09:42 master.cf
-rw-r--r--   1 root root  6208  3月 22 09:42 master.cf.proto
-rw-r--r--   1 root root    41  4月 15 17:06 nifty.auth
-rw-r--r--   1 root root 12288  4月 15 17:06 nifty.auth.db
-rwxr-xr-x   1 root root 29872  1月 15 23:05 post-install
-rw-r--r--   1 root root 10268  1月 15 23:05 postfix-files
drwxr-xr-x   2 root root  4096  1月 15 23:05 postfix-files.d
-rwxr-xr-x   1 root root 11532  1月 15 23:05 postfix-script
drwxr-xr-x   2 root root  4096  1月 15 23:05 sasl

同じ内容のファイルを変換しても、実行結果は同じ内容になるので、すでに動作している認証ファイルを今回はそのままコピーしてきます。ただし、 –userid– の部分と –password– の部分を @Nifty に接続してメールを読み込むための適正なユーザー名とパスワードに置き換えて、手順のコマンドの実行で認証用 db の nifty.auth.db が生成できます。

色々なユーザー宛に作成されたメールも root に集約

続いて各所で発生した通知等が発生した場合に、転送されてきて @Nifty へ集約されて確認ができるように、 aliases ファイルを定義して有効に設定します。

$ sudo vi /etc/aliases

# See man 5 aliases for format
postmaster:    root

# /etc/aliases
mailer-daemon: postmaster
munin: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
csgboxuser: root
webadm: root

pi: sunao
root: sunao
sunao: sunao.mita@nifty.com


$ sudo newaliases
$ sudo systemctl start postfix.service

メール送信テストでエラーとなってしまった

メール送信のテストをしてもログを確認するとエラーが出ているようで、@Nifty には送られていないようです。構築しようとしているラズパイと同じバージョンの公開サーバーでは問題なく送信できているので、/etc/postfix ディレクトリ内のファイルを見比べたり、main.cf と master.cf を同様に修正してみましたが同様のエラーが継続しています。

実績の有るシステムと構成を比較してみる

エラーの内容には、SASL と表示されているため @Nifty の認証時点のエラーのようです。ネットの検索情報から sasl2-bin をインストールしていますが、それ以外にも必要なモジュールが不足しているような気がします。

   〜〜構築中の sasl のインストールリスト〜〜
$ sudo apt list --installed | grep sasl

libgsasl7/stable,now 1.8.0-8+b1 armhf [インストール済み、自動]
libsasl2-2/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]
libsasl2-modules-db/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]
sasl2-bin/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]

   〜〜公開しているサーバーのインストールリスト〜〜
$ sudo apt list --installed | grep sasl

libauthen-sasl-perl/stable,now 2.1600-1 all [インストール済み]
libgsasl7/stable,now 1.8.0-8+b1 armhf [インストール済み、自動]
libsasl2-2/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]
libsasl2-modules-db/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]
libsasl2-modules/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]
sasl2-bin/stable,now 2.1.27+dfsg-1+deb10u1 armhf [インストール済み]

比べると相違が有るのは明らかですが、これがエラーの原因だったようです。違いのどちらが原因か、両方必要だったのかは検証していません。

バージョンにより多少パッケージに相違あり

数年前からラズパイのサーバーを家で何台稼働させていますが、Raspbian のバージョンに相違があってパッケージ構成も少し変更されているようです。最新のラズパイに置き換えた公開サーバーと今回設定中のラズパイでは、バージョン 10 ですが、以前のサーバーではバージョン 9 のようです。

なお、master.cf に関しては、雛形の master.cf.proto の内容に戻しても影響なく @Nifty では認証できていました。今回はメールの転送を組込むだけでハマってしまいました。3日以上悩んでやっとの解決でした。

12.システムログを監視する Logwatch の組込み

メール転送機能を動作させられたので、ログを監視してメールでレポートを送信できる機能の組込みを行います。この機能は毎日明方頃に実行されて、前日の色々な処理の履歴から抽出した情報をレポートとして通知してきます。

いつも見ているわけではありませんが、異常に気が付いた時に過去のレポートを見直したりできるので有効な機能だと思っています。

$ sudo apt install logwatch
他のサーバー類と同様に監視メールが届き完了

Logwatch によるメールが、@Nifty の私宛に届いていたので、やっと基本的な機能の組込みが完了しました。これでやっと出発点に辿り着きました。これからが検証用のサーバーとしての設定の始まりです。思っていたより長く時間が掛かりました。

インストール済みのリスト

Debian / Raspbian でインストールされているパッケージをリストするコマンドの備忘録

APT コマンド

sudo apt list –installed

$ sudo apt list --installed | grep ssh

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libssh-gcrypt-4/oldstable,now 0.7.3-2+deb9u2 armhf [インストール済み、自動]
libssh2-1/oldstable,now 1.7.0-1+deb9u1 armhf [インストール済み、自動]
openssh-client/oldstable,now 1:7.4p1-10+deb9u7 armhf [インストール済み、自動]
openssh-server/oldstable,now 1:7.4p1-10+deb9u7 armhf [インストール済み、自動]
openssh-sftp-server/oldstable,now 1:7.4p1-10+deb9u7 armhf [インストール済み、自動]
ssh/oldstable,now 1:7.4p1-10+deb9u7 all [インストール済み]

DPKG コマンド

dpkg –get-selections

$ dpkg --get-selections | grep ssh
libssh-gcrypt-4:armhf                           install
libssh2-1:armhf                                 install
openssh-client                                  install
openssh-server                                  install
openssh-sftp-server                             install
ssh                                             install

dpkg-query コマンド

dpkg-query -l

$ sudo dpkg-query -l | grep ssh
ii  libssh-gcrypt-4:armhf                 0.7.3-2+deb9u2                    armhf        tiny C SSH library (gcrypt flavor)
ii  libssh2-1:armhf                       1.7.0-1+deb9u1                    armhf        SSH2 client-side library
ii  openssh-client                        1:7.4p1-10+deb9u7                 armhf        secure shell (SSH) client, for secure access to remote machines
ii  openssh-server                        1:7.4p1-10+deb9u7                 armhf        secure shell (SSH) server, for secure access from remote machines
ii  openssh-sftp-server                   1:7.4p1-10+deb9u7                 armhf        secure shell (SSH) sftp server module, for SFTP access from remote machines
ii  ssh                                   1:7.4p1-10+deb9u7                 all          secure shell client and server (metapackage)

家屋内のネームサーバー

ローカルのネームサーバー

細かいことは知りませんが、現在 IPv4で機能するネームサーバーを家の中に立てています。家屋内のプライベートアドレスを割り振る DHCPサーバーに、ローカルのネームサーバーのアドレスを渡して、IPv4 / IPv6 アドレス共に名前解決をしています。

日本国内では、IPv4/IPv6が混在しているらしい

ゆくゆくはネット環境が、IPv6の世界に完全移行して不要になるのだろうと思っています。趣味で北海道とか出歩くこともあって、旅先からリモートで家に置かれた公開サーバーを操作することも時々あるのですが、場所によっては IPv4 だったり IPv6だったりしています。

IPv4 なら家に置かれたホームゲートウェイで、入口のグローバルアドレスから家屋内に置かれたプライベートアドレスの公開サーバーにアドレス変換して接続しますが、IPv6 のアドレスは家屋内の機器にも一律に割り振られていて、外部に置かれた DDNS で名前から直接アドレスが引かれると、そのままダイレクトに機器に接続されるイメージなので家屋内にローカルのネームサーバーは不要のようです。

たぶん当面はローカルのネームサーバーが必要かと

いずれにしてもローカルで、IPv4 を併用している機器が家屋内に現存している限り、ローカルのネームサーバーが必要なのだろうと思っています。

公開Webサーバーをローカルネームサーバー仕立てます

そこで、ハード的には余裕のあるオーバースペックのラズパイで、このブログが利用している公開サーバーをローカルのネームサーバーの1つとして機能追加しようと考えたのですが、過去の立上げから長い年月が過ぎているので作業内容も曖昧です。次があるのかは分かりませんが、トラブった時の参考資料としても有効かと思いまとめることにしました。

ネームサーバーのBIND9 をインストール

次のファイルリストが、ネームサーバーの BIND9 をインストールした時の初期状態のファイル群です。以前にカスタマイズした時は、 db.root のファイルがあったようですが、同様のファイルが別の場所に移されたようです。 → /usr/share/dns/root.hints

root@web-server:~# ls -l /etc/bind
合計 48
-rw-r--r-- 1 root root 2761  6月 21  2019 bind.keys
-rw-r--r-- 1 root root  237  6月 21  2019 db.0
-rw-r--r-- 1 root root  271  6月 21  2019 db.127
-rw-r--r-- 1 root root  237  6月 21  2019 db.255
-rw-r--r-- 1 root root  353  6月 21  2019 db.empty
-rw-r--r-- 1 root root  270  6月 21  2019 db.local
-rw-r--r-- 1 root bind  463  6月 21  2019 named.conf
-rw-r--r-- 1 root bind  498  6月 21  2019 named.conf.default-zones
-rw-r--r-- 1 root bind  165  6月 21  2019 named.conf.local
-rw-r--r-- 1 root bind  846  6月 21  2019 named.conf.options
-rw-r----- 1 bind bind   77  1月  1 12:10 rndc.key
-rw-r--r-- 1 root root 1317  6月 21  2019 zones.rfc1918

db.root の移行は、named.conf.default-zones の中の頭の部分に記載されています。

複数サーバーを立て、マスターとスレーブに仕立てます

このラズパイサーバーをマスターにして、他に稼働するネームサーバーをスレーブとしてデータを受取りながら稼働するサーバーに仕立てる予定です。

bind.keys  …そのまま
db.0     …そのまま
db.127   …そのまま
db.255   …そのまま
db.empty …そのまま
db.local …そのまま
named.conf …そのまま
named.conf.default-zones …そのまま
named.conf.local   …変更する (自分で定義したいゾーンをここで指定する)
named.conf.options …変更する (全体的な動作を定義するらしい)
rndc.key      …そのまま
zones.rfc1918 …そのまま
ゾーンの定義はファイルを追加、ファィルとの対応を記述

自分で定義するゾーンファイルを作成して、このディレクトリに追加すると共に、このファイルが配布の元になるマスターか、配布されたコピーのスレーブなのか、更にはどこから配布を受取るのかや、どこに配布するのかも含めて、 named.conf.local ファイルに記述します。

サーバーの全体的な振舞を定義

また、ローカルのネットワークの流れや解決できない情報を上位のサーバーに渡す先についてのサーバー全体の動作に関する情報などは、 named.conf.options ファイルに記述するようです。

named.conf.options には、次のブルーの部分の追加と修正を行いました。どこからの情報かは不明ですが、いままで同様の設定で稼働しているので、深く考えずにそのまま移行します。

// LAN内のIPアドレスグループをLOCALと定義
acl "LOCAL" {
  192.168.11.0/24;
  240d:1a:34d:7f00::/64;
  localhost;
  localnets;
};

// ネームサーバー共通設定
options {
	directory "/var/cache/bind";

	// If there is a firewall between you and nameservers you want
	// to talk to, you may need to fix the firewall to allow multiple
	// ports to talk.  See http://www.kb.cert.org/vuls/id/800113

	// If your ISP provided one or more IP addresses for stable 
	// nameservers, you probably want to use them as forwarders.  
	// Uncomment the following block, and insert the addresses replacing 
	// the all-0's placeholder.

	forwarders { 8.8.8.8; 8.8.4.4;};

        allow-query { LOCAL; };
        allow-query-cache { LOCAL; };

	allow-transfer  { none; };

	masterfile-format text;

	//========================================================================
	// If BIND logs error messages about the root key being expired,
	// you will need to update your keys.  See https://www.isc.org/bind-keys
	//========================================================================
	dnssec-validation auto;

	auth-nxdomain no;    # conform to RFC1035
	listen-on-v6 { any; };
};

192.168.11.0/24 が、IPv4 のローカルネットアドレスで、 240d:1a:〜::/64 が IPv6 のローカルネットアドレスです。

管理するゾーンの名前とアドレスの対応表を作ります

そして、自分で定義したゾーンファイルは、後で識別しやすいように 〜.zone をファイルの最後に付加しておくことにします。

sunao-mita.pgw.jp.zone      …名前からアドレスに変換する定義
11.168.192.rev.zone         …IPv4のアドレスから名前に変換する逆引きファイル
240d:1a:34d:7f00::.rev.zone …IPv6のアドレスから名前に変換する逆引きファイル
MyMemories.localdomain.zone …試験的に変換させるオマケのファイル

管理するゾーン定義の関連付け

初期の named.conf.local ファイルは、次のようになっているので対応するゾーンの定義と対応するファイル、マスターとして転送する場合は送り先のアドレス、スレーブとして受取るならマスターになるサーバーのアドレス等を記述します。

//
// Do any local configuration here
//
  // この部分にゾーン情報を追加します
// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";  // コメントから有効に変更
定義の関連付け例

単純に単独で機能させるだけのサーバーなら、正引き逆引きの各ゾーン毎に定義して、次のような内容を追加します。この場合は、/etc/bind ディレクトリ下に sunao-mita.pgw.jp.zone と命名したファイルが置かれています。

シンプルな記述例、単独でファイル管理
zone "sunao-mita.pgw.jp" {
        type master;
        file "/etc/bind/sunao-mita.pgw.jp.zone";
};
マスターファイルを管理し、スレーブに転送

なお、複数のネームサーバーを稼働させていて、マスターのサーバーのデータを更新したら、スレーブ側のサーバーに自動転送させるには、各ゾーン毎に次のような記述を追加します。

zone "sunao-mita.pgw.jp" {
        type master;   // 転送先のスレーブサーバーを列記
        allow-transfer { 192.168.11.23; 192.168.11.20; 192.168.11.21; };
        notify yes;
        also-notify { 192.168.11.23; 192.168.11.20; 192.168.11.21; };
        file "/etc/bind/sunao-mita.pgw.jp.zone";
};

示したゾーンの定義は、マスターとして管理しスレーブ3台に配送する定義です。スレーブ側では、受取ったデータを自分で管理するマスターのデータと混乱しないように、slaves のディレクトリを作成してその中に受取るようにします。

スレーブで、マスターから受取るディレクトリを分ける
zone "sunao-mita.pgw.jp" {
        type slave;
        masters {
                192.168.11.2;  // マスターのデータを管理するサーバー
        };
        file "/etc/bind/slaves/sunao-mita.pgw.jp.zone";
};

マスターデータは、各ゾーン毎に定義するため、複数サーバーで、各ゾーン毎にマスターデータを管理するサーバーを決めて稼働することができます。

少し実行させてみて、スレーブ側のサーバーにマスターで更新した最新のシリアルナンバーのデータが配布されたようで、置かれているのを確認できたので、これで完了でしょう。

編集したマスターデータと配布されたコピー

スレーブにコピーされたデータは、マスター側の更新したデータを直接コピーしたものではなく、適度に編集されて配布されるようです。

参考までにマスター側の原本とスレーブ側のコピーの中身を表示しておきます。素人の記述内容に問題が多くて違いが大きいのかは分かりませんが…

;;  sunao-mita.pgw.jp

$TTL    86400
@      IN      SOA    sunao-mita.pgw.jp.  root.sunao-mita.pgw.jp. (
        2020010202      ;Serial
        3600            ;Refresh
        900             ;Retry
        604800          ;Expire
        86400           ;Minimum TTL
)
                IN      NS      dns.sunao-mita.pgw.jp.
                IN      NS      dns2.sunao-mita.pgw.jp.
                IN      NS      gate.sunao-mita.pgw.jp.
                IN      MX      10 mail.sunao-mita.pgw.jp.

                IN      A       192.168.11.2
                IN      AAAA    240d:1a:34d:7f00:a284:cc24:64bd:daae
dns2            IN      A       192.168.11.20
dns             IN      A       192.168.11.2
ubuntu-sv       IN      A       192.168.11.199
rpi1-disk       IN      A       192.168.11.23
rpi1-disk       IN      AAAA    240d:1a:34d:7f00:11cf:af0d:3b62:8501
ubuntu-dtp      IN      A       192.168.11.100
gate            IN      A       192.168.11.1
virt            IN      A       192.168.11.105
Radio           IN      A       192.168.11.20
DebianPogo      IN      A       192.168.11.22
DebianPogo      IN      AAAA    240d:1a:34d:7f00:225:31ff:fe00:9df0
mail            IN      A       192.168.11.2
mail            IN      AAAA    240d:1a:34d:7f00:a284:cc24:64bd:daae
PogoV6          IN      AAAA    240d:1a:34d:7f00:225:31ff:fe00:9df0
dns2            IN      AAAA    240d:1a:34d:7f00:ba27:ebff:feac:28a8
dns             IN      AAAA    240d:1a:34d:7f00:a284:cc24:64bd:daae
www             IN      A       192.168.11.2
www             IN      AAAA    240d:1a:34d:7f00:a284:cc24:64bd:daae
RadioV6         IN      AAAA    240d:1a:34d:7f00:ba27:ebff:feac:28a8
rpi1-com2       IN      A       192.168.11.21
rpi1-com2       IN      AAAA    240d:1a:34d:7f00:ba27:ebff:fe0c:5ef3
note            IN      A       192.168.11.51
note            IN      AAAA    240d:1a:34d:7f00:3906:1714:acef:3e46
web-server      IN      A       192.168.11.2
web-server      IN      AAAA    240d:1a:34d:7f00:a284:cc24:64bd:daae



collection      IN      CNAME   virt
share           IN      CNAME   rpi1-disk

なお、動きが把握できていませんが、記述ミスに気が付き修正してマスター側で bind9 を restart すると、内容が直ぐに反映しましたが、その後も配布されているにも関わらずスレーブ側のデータ内容は古いシリアルの物を受取っているままでした。

$ORIGIN .
$TTL 86400      ; 1 day
sunao-mita.pgw.jp       IN SOA  sunao-mita.pgw.jp. root.sunao-mita.pgw.jp. (
                                2020010202 ; serial
                                3600       ; refresh (1 hour)
                                900        ; retry (15 minutes)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      dns.sunao-mita.pgw.jp.
                        NS      dns2.sunao-mita.pgw.jp.
                        NS      gate.sunao-mita.pgw.jp.
                        A       192.168.11.2
                        MX      10 mail.sunao-mita.pgw.jp.
                        AAAA    240d:1a:34d:7f00:a284:cc24:64bd:daae
$ORIGIN sunao-mita.pgw.jp.
collection              CNAME   virt
DebianPogo              A       192.168.11.22
                        AAAA    240d:1a:34d:7f00:225:31ff:fe00:9df0
dns                     A       192.168.11.2
                        AAAA    240d:1a:34d:7f00:a284:cc24:64bd:daae
dns2                    A       192.168.11.20
                        AAAA    240d:1a:34d:7f00:ba27:ebff:feac:28a8
gate                    A       192.168.11.1
mail                    A       192.168.11.2
                        AAAA    240d:1a:34d:7f00:a284:cc24:64bd:daae
note                    A       192.168.11.51
                        AAAA    240d:1a:34d:7f00:3906:1714:acef:3e46
PogoV6                  AAAA    240d:1a:34d:7f00:225:31ff:fe00:9df0
Radio                   A       192.168.11.20
RadioV6                 AAAA    240d:1a:34d:7f00:ba27:ebff:feac:28a8
rpi1-com2               A       192.168.11.21
                        AAAA    240d:1a:34d:7f00:ba27:ebff:fe0c:5ef3
rpi1-disk               A       192.168.11.23
                        AAAA    240d:1a:34d:7f00:11cf:af0d:3b62:8501
share                   CNAME   rpi1-disk
ubuntu-dtp              A       192.168.11.100
ubuntu-sv               A       192.168.11.199
virt                    A       192.168.11.105
web-server              A       192.168.11.2
                        AAAA    240d:1a:34d:7f00:a284:cc24:64bd:daae
www                     A       192.168.11.2
                        AAAA    240d:1a:34d:7f00:a284:cc24:64bd:daae
マスターの更新を直ちにスレーブに反映させるには

修正を直ちに反映させるためには、何かのアクションが必要のようです。ネットで調べてみると reload のキーワードが見付かりました。他にも強制的に配布するコマンドもあるようです。

# service bind9 reload

実行してみるとスレーブ側のデータも最新のシリアルに更新されたようです。 定義の中に、$TTL 86400 ; 1day の記述がありますが、更新されても1日は前の情報を保持する指定なのでしょうか。

やっと念願の公開サーバー交換

宿題事項だったサーバーの交換

2020年元旦になって、数年前から懸念していた公開サーバーを入れ換えることができました。交換したサーバーは、現在の状況で最新版のラズパイで、Raspberry pi 4 B+ / 4GBメモリ で一応最強モデルです。

長く放置できそうな OS

利用する OS は、色々悩みましたが使い慣れているラズパイではデフォルトとなる Raspbian の最新版に落ち着きました。このハードなら色々な OS の選択肢もあるようですが、今までの公開サーバー(PogoPlug E02) のように数年で交換を悩まなそうな見通しを考慮し、日常的で簡単な保守だけで長く安定的に公開させられればとの考えもあっての選択です。

多少のオーバースペックは安心材料

処理速度やメモリ量から考えるとハード的には、完全にオーバースペックのように思います。しかし、ラズパイって昔発売の低スペックのモデルも最新の処理能力の高いモデルも入手する金額に大きな差がないようなので、処理が遅すぎて後で悔やむよりも少し奮発しておけば気が楽になります。

悲願だった交換が完了

換える前のサーバーが非力で、OS の Debian も少し古くなったバージョンで、組込みLinuxを代表するようなシステムだったので、日常的な保守では簡単にバージョンアップができないシステムでした。そのため、このブログ WordPress が稼働する PHP もバージョン5 までしか対応できなくて、セキュリティレベルが低いと警告されていました。

いずれにしても、見た目には同じような動作のままで入替えができたようなので安心しています。使ってみた感じでは、反応がかなり早くなっているので、このブログでも写真の公開でもストレス無く反応しているように感じました。

気持ちだけ焦ってしまう

公開サーバーの更新

遅いし、PHPがバージョンアップ不能

ウェブ用のサーバーを更新しようと思い立ったのは、いつだったのだろうと考えてしまうくらい長い月日が流れてしまいました。

問題は色々あって進まない

自分の能力不足だったり、最適と思える価格と能力を持つ機材が思い当たらなかったり、時間が無かったりと、タラタラと言い訳が出てしまいそうで情けないです。

ラズパイの最新版登場

一応ラズパイも、メモリー搭載が大きくなって処理能力が格段に改善された最新モデルも発売になったので、これを利用して置き換えようと思い立ちました。

簡単な試行では機敏な反応、期待できそう

まずはサーバーとしての基本を設定しなければなりません。素の状態で動作させ始めると確かに速そうな感触です。置き換えられれば反応の悪さが改善しそうな予感です。

Apache稼働でレスポンス良さそう

今動いているこのブログの機能の移行が最大の問題点なのですが、Apacheを稼働させ、写真の公開データをコピーして稼働出来る事を確認しました。単純な作りなので移行も簡単です。

さて、大問題のこのブログですが、WordPressで構成され、PHP上のアプリとして機能して、Mysqlと呼ばれるデータベースを使用しています。

Mysqlが無くなってしまいました

最新のラズパイのOSからはMysqlが削除されて、代替としてMariadbに変わったようです。Mysqlが、Oracleに吸収されたような話を聞いた記憶がありますが、中立性のオープンソースデータベースでしょうか。

操作上の違いがあるのか、ないのかも不明で、ブログの素人の移行作業には更にハードルが上がったとしか思えません。参ったものです。

まずはメールやシステムログのレポート

その前に色々な機能を追加して、サーバーとして稼働させられる様な状況を作る必要があります。

稼働したシステムログを監視して、メールで毎日通知する機能だとか、メールを発信できる機能が必須です。

他のラズパイサーバーが、Postfixでニフティにメールをリレーしているので、それをコピーして稼働させることにしましたが、バージョンも上がっているようで、予想外の四苦八苦です。

システムログのサマリーがメールで届くのか?

明日の朝以降に、Logwatchのメールが届けば、次のステップとしてブログの移行について試行錯誤のテストに移行しようかと考えてます。