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

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

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

家屋内のネームサーバー

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

細かいことは知りませんが、現在 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日は前の情報を保持する指定なのでしょうか。

放置していたデスクトップPC

色々と時間の成約があって、手を掛けてやれなかったデスクトップが有ったんですが、何とか起動しようと試みて、大変な状況になっていたことを知りました。

放置していた理由

何で使わなかったかといえば、電源スイッチを押しても反応がなくて電源が入れられなかったことに問題があったのですが、何度もさらには何十回も挑戦すれば入ることもありました。
何としても立ち上げたいと考えた時には、別のPCから俗に言うマジックパケットを発行してネット越しに起動していました。
別に起動した機器からの立上げになり、本当に必要とした時だけの利用でした。

そんな状況では利用しようとの考えもしぼみがちで、当然のこと利用機会が遠ざかっていくことになりました。
起動しないのは電源スイッチの問題だとの認識があったので、時間が自由になっている現在、復旧させて利用しようと考えました。

再利用しようと思った理由

メモリ搭載が贅沢な 12GB

放置するのがもったいないのは、実はメモリを12GBと贅沢に搭載していて遅いプロセッサながら、内蔵ディスクもRAID構成でそこそこ動く代物でした。

電源ピンをショート

そして最初の対策が筐体を開けて、電源スイッチの繋がるピンをショートしたのですが、CPUの冷却ファンが回り始めて3秒程度で止まってしまいます。この時にはキーボードとマウスは接続しているもののモニタの接続をしていませんでした。

すぐに止まるのはこれが原因かと考えて、VGAコネクタやHDMIコネクタでモニタを接続してみたのですが、ここには関係ないようで変化は見られませんでした。

電源スイッチを仮設して操作

その後、電源スイッチのピンに単体でオンオフできるスイッチを取付けて操作できるように改善して試すも、同様に3秒程度で止まります。理由がわからないのでBIOSのメモリクリアも試しました。後々これが別の問題を起こしていたかもしれません。

あまり気にしたことがなかったのですが、電源スイッチってオンしっぱなしではなく、短期間にオンで、その後はオフを継続するものなのでしょうか、そんなシーケンスでスイッチを操作すると電源が入って立ち上がるようになりました。

と言ってもBIOS メモリクリアしたのが悪かったようで、日付は2002年頃の状態で色々な設定が飛んでしまったようで、内蔵メモリの不具合を示すランプも点灯したり、色々な問題対処も必要になりました。

無知というのは恐ろしいものです

考えれば、電源の強制停止には、電源スイッチを5秒間押しっぱなしにするのが定説ですので、電源スイッチは少しのオンで電源が入り少しのオンで電源が停止するのは当たり前ですよね、よくよく考えてみれば当然です。

そうこうしていると起動を示すバナーがモニター上に流れて、GRUBの起動するシステムを選択するメニューが表示されるところまでは進みました。しかし、どれを選択してもカーネルのパニックを表示してすぐに止まります。

BIOS クリアでディスクの順番が変化したらしい

起動の始めに [del] キーを連打して BIOS の設定画面を表示して、ディスクの認識する順番を入替えても、 grub rescue > と入力待ちになったり、多少の変化はあるもののどれも正常な起動までは行われませんでした。

諦めて、再インストールを決断

仕方無く、レスキュー用のメディアも検討したのですが、新しく OS をインストールしてみることにしました。候補に上げたのが、普段使い慣れている Ubuntu です。 USBブート用の USBメモリを持っていたのですが、そこから読み込んで立ち上げができなかったので、 Ubuntu 18.04 LTD 日本語 Remix をダウンロードして DVD メディアに焼きました。

四苦八苦の復旧作業

まずは、RAIDの復旧を試みる

ライブメディアとして起動した Ubuntu

以前稼働していた頃には、ソフトウェアRAIDの設定で集めたデータも格納されていて、Ububtu の OS も RAID1 で問題なく動作していました。気持ち的には復旧させたいとの願いも心の底にあって、まずは DVDメディアで起動して、モジュールのアップデート、そしてソフトRAIDのmdadmのインストールを行いました。
mdadmが入っただけではRAID設定のディスクを認識できないようで、各モジュールの最新への更新が完了した頃には、元からあった RAIDの構成が勝手に認識されていました。

ライブメディアから RAID への GRUB 設定は無理

インストール前に、システムが入るエリアのマウント位置の ‘/’ と ‘/boot’ を RAID1 に設定したのですが、最終的なブートで使用される GRUB のインストールで障害になりました。

RAID の中にパーティションを構成できるらしい

興味深いのは、ディスクへのインストーラが RAID定義したファイルをあたかも LVM のような1つのディスクのように認識していて、その中にパーティションを分割するように振る舞うことです。昔ソフトRAIDを使用していた頃の感覚からすると別世界のような感覚です。

たまたま GRUB のインストールには失敗したのですが、そこまでのシステムのインストール状況も気になって、 /dev/md0 として作成し、その中に /dev/md0p1 と /dev/md0p2 がそれぞれ ‘/boot’ と ‘/’ に対応していました。
誤って mount に /dev/md0 を指定したらマウント対象ではないようなエラーが吐き出され失敗しました。
そして、/dev/md0p1 と /dev/md0p2 の mount では、問題なくマウントできたようです。内容も思っていた内容で、確かにパーティション分割されているようです。

GRUB を修復する grub-rescue

ブートの GRUB を修復できるソフトがあるらしく、それは grub-rescue と呼ばれ公開されているようで、インストールをネット公開情報から試みましたが、日本語Remixの環境ではインストール自体ができませんでした。
そこで、単体でメディアから起動して動作する grub-rescue をネットから入手して試しましたが、結果的に自動での修復は無理でした。これは Ubuntu 17.10 だったかな? の中にインストールされている単体動作の専用ツールです。
自動修復は無理でしたが、でもこのツールは解析の履歴が事細かく記録されているようで、http://paste.ubuntu.com/p/…. に残されて後からゆっくりと確認できることです。

他にも、’/boot’ を外出しにして、’/’ を RAID エリアにしても、GRUB のインストールはできるのですが、やはり起動はできないようです。
何日にも及ぶほど時間を掛けたのですが、インストール先に RAIDエリアは利用できないとの結論になりました。
そう言えば、昔々公開サーバーに バッファローのネット共有ディスクを改造して、Debian をインストールして RAID にするのに、最初は普通に入れてから片側を半端な RAID に定義して、そっちに全てをコピーしてから、元のディスクを RAID に追加してリビルドさせて、最終的に RAID になったシステムが完成したような気がします。

デスクトップ用メディアでは少なくも RAID構成は無理らしい

最近のインストーラも RAID は想定外なので、正規のシステムが立ち上がる前に利用される一時的なシステムに、RAIDを認識できる部分が組み込まれていないのだろうと思います。

したがって最初は単純にインストールして、徐々にカスタマイズしないと RAID の組込みはできないということのようです。

単純にデスクトップをインストール

少なくもデスクトップ用で RAID は無理

仕切り直して、単純に Ubuntu 18.04 LTS 日本語Remix を入れるところから始めました。時間がかかったけど想定した位置に入れ込むことができました。

/dev/sda1 — ‘/boot’
/dev/sda3 — ‘/’

インストールで、画面枠からはみ出て選択ができない

これも簡単ではなく、苦労したのは既に作成されているパーティション分割に合わせてマウントポイントを指定するのですが、モニタに利用したテレビ画面から作業を選択するボタンが表示枠の範囲外になってしまい、スクロールもできず選択不能です。
タブキーとエンターキーを画面の想像で操作するのですが、何度も取り消されてしまい、振り出しに戻されての繰り返しで、先に進む方法に辿り着けません。

やっとインストールされた初期の状態で立ち上がりました。その後のパッチ類を全て適用して、やっとスタート台に立った状態です。

単純なインストール後に、RAIDソフトを追加

その後、ソフトRAID の mdadm、ソフト検索のため aptitude 、エディタとして vim、リモートログインに openssh-server をインストールしました。
元々のデータが収まっていた 500GB 程度の RAID1 の内容を確認すると ‘/home’ の内容のようなのを確認できたので、 /etc/fstab ファイルを修正して ‘/home’ にマウントされるように定義して、reboot で正しくマウントされて立ち上がるのを確認しました。

システムを RAID 構成にと考え、結局挫折

しばらく放置したPCを復旧させるって難題ですね。以前はルートのシステム部分もRAID1で構成されていたので、その状態に戻したくて四苦八苦して悪あがきをしたのですが、結果は惨敗でした。記憶では、RAID1を片肺にしてコピーしてから /etc/fstab や /boot/grub/grub.cfg を書き換えて片肺の RAID1 をシステムに無理やり組込んでいたように覚えてます。

最近の GRUB の設定方法が理解できていない

最近の作法としては、grub.cfg は update-grub のようなツールで生成されるもののようで、強制的に書き換えて機能するものなのかも理解していません。生成されている grub.cfg を見ると該当するディスクは基本的に UUID で指定されているようで、これをどのように引っ張ってきたのかも理解できていません。

何かの定義を変更すると立ち上げ対象のディスクが置き換えられるのかと思い、あちこち調べたのですが思い当たるものには到達できませんでした。強制的に grub.cfg を書き換えて仮に立ち上げてから RAID1 を正常に整備してから update-grub を実行して RAID1 にシステムを入れた状態で、正常に立上がるのかは検証できていません。

生成された grub.cfg を一時的にカスタマイズできるの??

強制的に grub.cfg を書き換えて立上がるものなのかもわかっていません。時間を作って試してみたいと思います。

復旧しようと考えた PC のマザーボードですが、新しいものではなく、かと言ってディスクに IDE インターフェースでマスターとスレーブの4台が組み込まれるほどの古さでもない微妙な物です。 プロセッサは、’AMD Athlon(tm) II X4 605e Processor’ で、 DD3 メモリが、12GB 搭載されているので再利用できれば程度の考えです。

ただ、IDE のコネクタも1つあり、当時はSATAインターフェースの CD-ROM がなくて、そのためのコネクタだったような気がします。
SATS1 / SATA2 / SATA3 / IDE / SATA5 / SATA6 と続きます。昔の IDE 接続だった頃のディスクの場合、セカンダリーのスレーブに CD-ROM を繋いでいた名残にも見えます。

昔のディスクは順番が接続で固定された

昔のシステムは単純で、ディスクの装着位置で順番が決まっていたので、UUID でディスクを特定する必要がなかったのでしょうね、今復旧している PC も立上がるタイミングや BIOS の定義で順番がコロコロと置き換わるようです。
さすがに動作しながら順番が異なることはなさそうな気もしますが、でも USB-HDD を挿入したタイミングで処理中だった物が、対象機器を見失ったような混乱で、障害で停止したのかと思う動きもあって気になりました。

あまりに古いPCなので、レストアを考えたい

とりあえず電源がオンオフできる筐体

筐体もパワースイッチが入らなくなるような状況で、整形されたプラスチック類も加水分解状態の物も目に付くような状況から検討することにしました。マザーボードは、サイズが少し大きめで ATX 、電源は昔ではちょっと大きめな高速なプロセッサに対応した容量の物でした。そのまま再利用できそうなので筐体だけ入れ替えようと探しました。

今のマザーボードが収まるのは ATX の筐体

筐体の価格も高価なものから低価格な庶民的なものまでピンキリのようで、フルの ATX なので小型のものは望めませんでしたが、Amazon で手頃な中国製を購入しました。ちょっと派手で、片側が透明なプラスチックのミドルタワー型です。製品名は、 ‘Thermaltake Versa H26 Black/w casefan’ とかで、送料サービスで 4,163円でした。

今のマザーボードの規格に合っている筐体

久し振りに自作用の筐体を入手しましたが、価格の割に良くできていてファンも 2個装着済で、コネクタをマザーボードに挿すだけでした。その前に使っていた古い筐体にもファンは取付けられていましたが、ディスク等に供給する電源コネクターに接続するようになっていて、結局使わないままでした。

最近の自作筐体って人に見せるためにあるの??

購入した筐体は派手な作りのようで、筐体正面のファンにはブルーのLEDが付けられていて、筐体自体も風通しが良くなるメッシュが随所に組み込まれていて、埃除去のフィルターも簡単に取り外しできる構造です。
筐体の片面が透明なプラスチックで中がスケスケなため、夜になるとギンギラギンでまばゆい状態です。派手過ぎてちょっと自分の好みではないけど、価格が安いですのでこれもオーケーでしょう。
配線も裏にまとめやすく作られていて、見える透明なプラスチック側は綺麗に見せられるように、裏からの配線が近くから表側に導き出せるよう随所に穴が作られています。

筐体前面の電源スイッチの並びには、マイクやスピーカー等のオーディオ系コネクタやUSB2.0✕2 や USB3.0✕2 のコネクタもあり、USB2.0✕2 とオーディオ系は、そのままマザーボード上のコネクタに挿入できましたが、USB3.0✕2 には挿入できる機能がありません。
使えないコネクタが前面にあるのもちょっと気になるため、乗りかかった船なので、増設用ボードの手配もしました。ただ、Amazon経由で台湾のメーカーらしく、船便でゆっくり届くと思われます。
しばらく後になっての取付けですが、安いのでこれもありかと思います。

見える筐体なので、綺麗に収めようと思ったら

廃棄した古い筐体の方には、2.5インチで 1TBのディスクが 2台あり、これが RAID1 の構成に利用されていましたが、何故か 3.5インチベイの片側に寄せた形でネジ止めされていました。組んだ時が昔なのですっかり記憶から抜けています。

他に 2.5インチのディスクを 2台づつ装着でき、外から簡単に挿入したり、抜き出したりできるケースがあるにも関わらず、使わずに単体で 3.5インチベイにネジ止めしていたので不思議に思っていたのですが、取り付けようとして理由がわかりました。
ディスクの厚さが 13mmあって、9.5mm厚に対応しているケースには入れられなかったようです。当時は 1TBクラスの 2.5インチディスクは厚くないと製造できなかったようです。

筐体の最下部に簡易トレイ

とりあえず新しく購入した筐体にも、電源の置かれた最下部の前側には、ペラペラのプラスチックのトレイに入れて SSD やディスクの設置が可能です。
最近は価格も下がり普及してきた SSD を入れるために考えられたと思われる場所です。
そこに厚さが 13mm の 2.5インチのシステムディスクを 2台とりあえず入れることにしました。

収まるのかは心配ですがマウンターを購入

穴位置のサイズが公表されて無く、写真から 13mm 厚の2.5インチのディスク2台を収納できるようにも見える 3.5インチ用のマウンターも購入しました。
本当に厚い2台装着できるのかは心配です。賭けですね、無駄な買い物になってしまうかもしれません。

リモートで利用するサーバーとしてカスタマイズ

デスクトップとしてインストールしていますが、リモートからの電源オンオフも含めて、リモート操作を想定したサーバーとしての利用なので、これからのカスタマイズも含めてまだまだ楽しめそうです。

Linux 立上げで自動バックアップ

以前 systemd の実習を兼ねて、立上げ時に1度だけ実行させるサービスを組込んでいますが、その備忘録の整理と一部の拡張が必要なために修正と補足を追加してまとめます。

バックアップ先の選択が必要になり修正

普段使いのノートPC がデュアルブートで、時々裏の Windows10 を利用することがあります。普段は Linux の Ubuntu が立上がったまま稼働し利用しています。
そこで Linux が立上がった時に、Windows システム側の ntfs ファイルシステムの作業領域として更新される一部を自動的にバックアップしようと考えて、すでに組み込んで運用しています。
今回は、UPS バッテリーが追加された NET共有サーバーとしてラズパイ1B+を立上げていますが、これを主となるマスターとして位置付けて、今までのサーバーをシステムバックアップ用のスレーブとして共存することにしました。
ラズパイも接続される HDD が内部バスで高速なら、戸惑いなく RAID2 のミラーで利用するのですが、さすがに USB2.0 のインターフェース HDD でミラーを組むのは無理があると思い、2台のラズパイをマスターとスレーブで利用して、マスターが故障した場合にはスレーブに接続を切り替えることにしました。
データの同期については、夜中から明方にかけて毎日コピーすることで同期させます。
そのため、決め打ちだったバックアップ先のサーバーアドレスを柔軟に切り替えられる必要に迫られました。

以前まとめた内容を修正しながらシンプルに整理

実際に Windows を利用していたかは問題外として、Linux が起動した後に1度だけ ntfs の一部とサーバーのバックアップエリアの同期を取ります。その時に、バックアップを実行したタイムスタンプをバックアップエリア内に残しておくこととします。
パッケージ名: NoteStartUpRun で、指定する場所に実際の実行モジュール等を配置します。
ユニットファイル名: note-startup-1st.service が、サービスの性格を定義する仕様書の位置付けです。このサービス名をキーにして、実行結果のログ確認や動作状況の確認ができます。
サービス(ユニットファイル)の登録は、 /etc/systemd/system/note-startup-1st.service です。
サービスとして実際に実行するモジュールは、パッケージ名で指定するディレクトリ /opt/NoteStartUpRun/bin に集めます。
まずサービスの仕様書となるユニットファイルの作成ですが、一般ユーザーのホームで作成して、systemd のシステム領域にコピーします。

$ vi note-startup-1st.service
[Unit]
Description = Note Private AutoRun
After=network-online.target remote-fs.target nss-lookup.target
ConditionPathExists=/opt/NoteStartUpRun/bin
[Service]
ExecStart=/opt/NoteStartUpRun/bin/note-stup-1st.sh
Restart=no
Type=simple
[Install]
WantedBy=multi-user.target

作成したサービスを systemd 領域にコピーして、所有者とアクセス権の変更をします。

$ sudo cp note-startup-1st.service /etc/systemd/system
$ sudo chown root:root /etc/systemd/system/note-startup-1st.service
$ sudo chmod 644 /etc/systemd/system/note-startup-1st.service

サービスから起動するモジュールをシェルスクリプトで作成します。
これは単純にバックアップするスクリプトに制御を移しているだけです。後から引数の追加・変更等のカスタマイズが容易になると思われます。今回は、バックアップ先サーバーのIPアドレスを与えています。

$ vi note-stup-1st.sh
#!/bin/sh
exec /opt/NoteStartUpRun/bin/sunao-note_Windows-Documents-bkup  "192.168.11.23"

パッケージをまとめるディレクトリを作成して、所有権とアクセス権の設定を行い、起動するスプリクトを配置します。

$ sudo mkdir -p /opt/NoteStartUpRun/bin
$ sudo chmod 755 /opt/NoteStartUpRun/bin
$ sudo cp note-stup-1st.sh /opt/NoteStartUpRun/bin
$ sudo chown root:root /opt/NoteStartUpRun/bin/note-stup-1st.sh
$ sudo chmod 755 /opt/NoteStartUpRun/bin/note-stup-1st.sh

実際にバックアップを実行するスクリプトを作成します。

$ vi sunao-note_Windows-Documents-bkup
#!/bin/bash
server='192.168.11.23' # バックアップ先サーバー
test -z "$1" || server="$1"
echo "-- bkup to $server"
bkup_D="$server:/home/bkup/sunao-sp/sunao-Win-Doc/" # バックアップ先位置
mntS='/mnt/ntfs'
bkup_S="$mntS/Users/sunao/Documents/" # バックアップ元のベース
sleep 300 # 安定するように 5分待つ
/bin/mount $mntS
echo "実行タイムスタンプ `date`" > $bkup_S/TimeStamp.txt
/usr/bin/rsync -av --delete $bkup_S $bkup_D
/bin/umount $mntS

バックアップを実行するスクリプトを配置して、所有権とアクセス権を設定します。

$ sudo cp sunao-note_Windows-Documents-bkup /opt/NoteStartUpRun/bin
$ sudo chown root:root /opt/NoteStartUpRun/bin/sunao-note_Windows-Documents-bkup
$ sudo chmod 755 /opt/NoteStartUpRun/bin/sunao-note_Windows-Documents-bkup 

処理の流れとしては、サービスとして定義している note-startup-1st.service により note-stup-1st.sh が起動されます。その中で単純にバックアップ実行スクリプトの sunao-note_Windows-Documents-bkup を起動しています。


ユニットファイルを systemd に登録

ここからは、systemd へのサービス(ユニットファイル)の登録と検証作業です。
ユニットファイル等を追加や変更した後には、必ず次のコマンド sudo systemctl daemon-reload を実行します。systemd への登録や登録内容の更新作業が必要になるようです。
そして一緒にステータスも確認しておきます。

$ sudo systemctl daemon-reload
$ sudo systemctl status note-startup-1st.service
● note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

ステータスで表示される Loaded: 行のカッコ内の1つ目と2つ目のセミコロンの間の disabled となっているのは、自動起動が無効になっているということのようで、自動起動できるように設定します。

自動起動が行われるように設定

$ sudo systemctl enable note-startup-1st.service
Created symlink from /etc/systemd/system/multi-user.target.wants/note-startup-1st.service to /etc/systemd/system/note-startup-1st.service.
$ sudo systemctl status note-startup-1st.service
● note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

ユニットファイルの定義内に、[ Install ] の WantedBy= で定義しているユニットにリンクが張られ、先ほどの /etc/systemd/system/note-startup-1st.service; の後の disabledenabled に変わっています。
これで再立ち上げで自動実行されるようになっているはずですが、その前にコマンドで起動して確認します。

systemd の手動起動の確認

ユニットファイル名を指定したコマンド sudo systemctl start note-startup-1st.service で起動できます。

$ sudo systemctl start note-startup-1st.service
$ sudo systemctl status note-startup-1st.service
● note-startup-1st.service - Note Private AutoRun
Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabl
Active: active (running) since Sat 2019-02-09 20:40:50 JST; 19s ago
Main PID: 15710 (sunao-note_Wind)
Tasks: 2 (limit: 3787)
CGroup: /system.slice/note-startup-1st.service
├─15710 /bin/bash /opt/NoteStartUpRun/bin/sunao-note_Windows-Documents-bkup 192.168
└─15711 sleep 300
2月 09 20:40:50 MITA-NY40S systemd[1]: Started Note Private AutoRun.
2月 09 20:40:50 MITA-NY40S note-stup-1st.sh[15710]: -- bkup to 192.168.11.23
lines 1-11/11 (END)

起動されて ‘– bkup to 192.168.11.23′ のメッセージまでが書きだされて、’Active: active (running) since ….’ と表示して実行中なのがわかり、’└─15711 sleep 300′ で止まっているのが確認できます。
待ち時間の5分が経過したので、再び確認してみます。

$ sudo systemctl status note-startup-1st.service
● note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabl
   Active: inactive (dead) since Sat 2019-02-09 20:45:57 JST; 24min ago
  Process: 15710 ExecStart=/opt/NoteStartUpRun/bin/note-stup-1st.sh (code=exited, status=0/SUC
 Main PID: 15710 (code=exited, status=0/SUCCESS)
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Version 2017.3.23 integrated FUSE 28
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Mounted /dev/sda4 (Read-Write, label "Windows", NT
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,g
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Mount options: rw,noexec,nosuid,nodev,user,allow_o
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Global ownership and permissions enforced, configu
 2月 09 20:45:55 MITA-NY40S note-stup-1st.sh[15710]: sending incremental file list
 2月 09 20:45:56 MITA-NY40S note-stup-1st.sh[15710]: TimeStamp.txt
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: sent 4,207 bytes  received 61 bytes  948.
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: total size is 37,355,511  speedup is 8,75
 2月 09 20:45:57 MITA-NY40S ntfs-3g[15727]: Unmounting /dev/sda4 (Windows)
lines 1-16/16 (END)

コマンドによる起動では問題なく実行されて、正常終了しているようです。
ログに書き出されている内容から、最初の status では sleep 300 で停止しているので、その時点までの echo メッセージが確認でき、次の status では、その後の ntfs ファイルのマウントや rsync コマンドによる転送や ntfs ファイルのアンマウントが記録されています。
もし更新ファイルのバックアップで、更新されていれば、ここにファイル名がリストされていると思います。
この処理は、起動されてバックアップ動作が終わると、毎回終了するので ‘Active: inactive (dead)’ と表示して、その後に終了した日時が記録されています。

一般ユーザーでジャーナルを確認

次にプログラムの出力ログを確認できる journalctl コマンドがあるので確認してみます。

$ journalctl -u note-startup-1st.service
 2月 09 20:40:50 MITA-NY40S systemd[1]: Started Note Private AutoRun.
 2月 09 20:40:50 MITA-NY40S note-stup-1st.sh[15710]: -- bkup to 192.168.11.23
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Version 2017.3.23 integrated FUSE 28
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Mounted /dev/sda4 (Read-Write, label "Windows", NT
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,g
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Mount options: rw,noexec,nosuid,nodev,user,allow_o
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Global ownership and permissions enforced, configu
 2月 09 20:45:55 MITA-NY40S note-stup-1st.sh[15710]: sending incremental file list
 2月 09 20:45:56 MITA-NY40S note-stup-1st.sh[15710]: TimeStamp.txt
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: sent 4,207 bytes  received 61 bytes  948.
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: total size is 37,355,511  speedup is 8,75
 2月 09 20:45:57 MITA-NY40S ntfs-3g[15727]: Unmounting /dev/sda4 (Windows)
lines 285-306/306 (END)

ジャーナルの表示では、status で分割されていたログ内容が続けて表示され、 20:40 で処理が始まり、時間が飛んで 20:45 から ntfs のマウントが始まっているので、5分待っているのが確認できます。

システム再起動による自動起動の確認

いよいよ待望の Linux の立上げによる自動起動の確認になります。ノートPCを再起動してジャーナルを確認します。

$ journalctl -u note-startup-1st.service
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: sent 4,207 bytes  received 61 bytes  948.44 bytes/s
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: total size is 37,355,511  speedup is 8,752.46
 2月 09 20:45:57 MITA-NY40S ntfs-3g[15727]: Unmounting /dev/sda4 (Windows)
-- Reboot --
 2月 09 22:00:30 MITA-NY40S systemd[1]: Started Note Private AutoRun.
 2月 09 22:00:30 MITA-NY40S note-stup-1st.sh[1281]: -- bkup to 192.168.11.23
 2月 09 22:05:31 MITA-NY40S ntfs-3g[3854]: Version 2017.3.23 integrated FUSE 28
 2月 09 22:05:31 MITA-NY40S ntfs-3g[3854]: Mounted /dev/sda4 (Read-Write, label "Windows", NTFS 3.1)
 2月 09 22:05:31 MITA-NY40S ntfs-3g[3854]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,gid=1000,use
 2月 09 22:05:31 MITA-NY40S ntfs-3g[3854]: Mount options: rw,noexec,nosuid,nodev,user,allow_other,nonemp
 2月 09 22:05:31 MITA-NY40S ntfs-3g[3854]: Global ownership and permissions enforced, configuration type
 2月 09 22:05:34 MITA-NY40S note-stup-1st.sh[1281]: sending incremental file list
 2月 09 22:05:35 MITA-NY40S note-stup-1st.sh[1281]: TimeStamp.txt
 2月 09 22:05:35 MITA-NY40S note-stup-1st.sh[1281]: sent 4,207 bytes  received 61 bytes  948.44 bytes/se
 2月 09 22:05:35 MITA-NY40S note-stup-1st.sh[1281]: total size is 37,355,511  speedup is 8,752.46
 2月 09 22:05:35 MITA-NY40S ntfs-3g[3854]: Unmounting /dev/sda4 (Windows)
lines 295-319/319 (END)

‘– Reboot –‘ の記録以降が新しく追加されたログですので、問題なく起動されて正常終了しているようです。


実際の立上げによるバックアップの注意点

順調にバックアップ動作が機能したわけではなく、色々な試行錯誤の結果として問題の解決ができています。
立上げ直後は、ネットワークの安定に問題があるらしくエラーになっていました。対策としては起動されてから 5分の待ち時間の追加で問題が解決しました。
次は ‘sleep 300’ の待ち時間が追加される前に出ていたエラーのジャーナル内容です。

$ journalctl -u note-startup-1st.service

-- Logs begin at 火 2018-01-09 16:24:34 JST, end at 火 2018-01-09 16:27:17 JST. --
 1月 09 16:25:12 MITA-NY40S systemd[1]: Started Note Private AutoRun.
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Version 2015.3.14AR.1 integrated FUSE 28
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Mounted /dev/sda4 (Read-Write, label "Windows", NTFS 3.1)
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,gid=1000,user
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Mount options: rw,noexec,nosuid,nodev,user,allow_other,nonempty,relatime,default_permissi
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Global ownership and permissions enforced, configuration type 7
 1月 09 16:25:16 MITA-NY40S note-stup-1st.sh[1039]: ssh: connect to host 192.168.11.21 port 22: Network is unreachable
 1月 09 16:25:16 MITA-NY40S note-stup-1st.sh[1039]: rsync: connection unexpectedly closed (0 bytes received so far) [sender]
 1月 09 16:25:16 MITA-NY40S note-stup-1st.sh[1039]: rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.1]
 1月 09 16:25:16 MITA-NY40S ntfs-3g[1071]: Unmounting /dev/sda4 (Windows)

それ以外のエラーとして、バックアップ先のサーバーを変更したらエラーになりました。
理由は root ユーザーで接続し転送していますが、 root から root での ssh での接続実績がなく、確認キー待ちになってエラーしていたようです。事前にサーバーへの接続確認をしておく必要があるようです。

-- Reboot --
 2月 07 23:09:20 MITA-NY40S systemd[1]: Started Note Private AutoRun.
 2月 07 23:09:20 MITA-NY40S note-stup-1st.sh[1330]: -- bkup to 192.168.11.23
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Version 2017.3.23 integrated FUSE 28
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Mounted /dev/sda4 (Read-Write, label "Windows", NTFS 3.1)
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,gid=1000,use
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Mount options: rw,noexec,nosuid,nodev,user,allow_other,nonemp
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Global ownership and permissions enforced, configuration type
 2月 07 23:14:21 MITA-NY40S note-stup-1st.sh[1330]: Host key verification failed.
 2月 07 23:14:21 MITA-NY40S note-stup-1st.sh[1330]: rsync: connection unexpectedly closed (0 bytes recei
 2月 07 23:14:21 MITA-NY40S note-stup-1st.sh[1330]: rsync error: error in rsync protocol data stream (co
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Unmounting /dev/sda4 (Windows)

ラズパイUPSのメール

ラズパイ1B+のネット共有サーバー化で、UPSバッテリーの減少や充電の経過をメール送信させて、スマホで確認したい、との対策の続きです。

メール機能は、今迄のサーバー設定の流れからpostfixでの設定になりますが、以前の実績のあるサーバーの設定と比較しながら今回も設定しました。一応動作したように感じたのですが、送られてくるはずのログが届きませんでした。

postfixのバージョンも上がっていて、項目が少し増えているようです。丹念に見直すと一部がコメントのままになっている項目とか別に誤りとか、数件気になる場所が見つかりました。

そこを直して立ち上げ直すと、期待しているような送信が行なわれているような印象です。届かなかったログも時間を置いて再送信されたようで、数時間後に届きました。

メモとして、コメントを除いた有効行をリストしておきます。

$ cat /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 = rpi1-disk.sunao-mita.pgw.jp
mydomain = sunao-mita.pgw.jp
myorigin = $myhostname
inet_interfaces = all
mydestination = rpi1-disk, DebianPogo, DebianPogo.$mydomain, $myhostname, localhost, $mydomain
local_recipient_maps = unix:passwd.byname $alias_maps
unknown_local_recipient_reject_code = 550
mynetworks_style = host
mynetworks = 127.0.0.0/8, 192.168.11.0/24, [::ffff:127.0.0.0]/104 [::1]/128, [240d:1a:34d:7f00::0]/64
relayhost = [smtp.nifty.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/nifty.auth
smtp_sasl_security_options = noanonymous
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/bin/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
inet_protocols = ipv4, ipv6
message_size_limit = 10485760
mailbox_size_limit = 1073741824
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
mua_client_restrictions = permit_sasl_authenticated,reject
mua_helo_restrictions = permit_sasl_authenticated,reject
mua_sender_restrictions = permit_sasl_authenticated,reject

mailコマンドでメールするのに、以前は問題なく送信できていたのに、最近のバージョンではサーバー名が短縮されて送信されるようで、リレー先の@niftyでエラーになってしまいます。

どこかの定義で変更できるのかと思い調べたのですが、私には見つけられませんでした。対策としては、-r オプションで、リターンアドレスをフルアドレスで明示して指定することで回避できました。

メールで経過を送信できる目処が立ったので、どのように作るかですが、作成したups-readでバッテリーの容量が取得できるので、単純なシェルスクリプトで容量の変化を検知してメールを作成させることにしました。

バッテリーの減少検知では、50%を切ったら10%減少毎にメールをスマホに送信します。充電では、50%を越えたら15%充電毎にメールをスマホに送信します。

起動方法は、cronにより適当なインターバルで、毎回起動し過去と比較判定して該当すればメールを作成して終了します。

起動された前回の容量とメールを作成した時の容量をファイルに記録しておいて比較する方法です。経過をモニタしながらのデバッグで分かったことは、ups-readから渡される容量が、有り得ない数値を頻繁に表示します。

0 〜 100の範囲を超えて、120 程度は想定内と認識しますが、217 とか 193 などといった異常な数値が頻繁に出てきます。観察すると異常な数値に混じって正常な数値も有るようです。

異常な数値を排除した 0 〜 120 の範囲に入る数値は 、安定していて変化の少ない数値で推移しています。期待するバッテリーの容量と判断しても良さそうです。

対策としては、120 を超える異常な数値の時には前回の数値と置換えて無視することにしました。

$ cat bin/ups-check-mail.sh
#!/bin/bash
T='## UPS Battery Capacity ##'
Msg='UPS Battery Capacity '
DW='*Down* : '
UP='*Up* : '
Rt='sunao@rpi1-disk.sunao-mita.pgw.jp'
To='sunao*****@yahoo.**.jp'    # スマホのメールアドレス
FC='UPS-Check/UPSCap.txt'      # 前回の容量メモ
FM='UPS-Check/UPSCap-msg.txt'  # メール生成時の容量メモ
C=`ups-read`
test -f $FC || echo 100 > $FC  # メモファイルが無い場合
test -f $FM || echo 100 > $FM  # メモファイルが無い場合
UPSCap=`cat $FC`
UPSmsg=`cat $FM`
test $C -gt 120 && C=$UPSCap  # 120% を越えていれば異常と判断し、前回値に補正
if [ $C -lt $UPSCap ]; then  ### 放電 ; 前回との減少変化を検知
  if [ $C -lt 50 ] && [ $((C+9)) -lt $UPSmsg ]; then  # < 50% ; 10% 減少毎にメール作成
    echo $C > $FM
    Tl=`echo "$T" | sed -r "s/( ##)$/ *DOWN* ( $C% )\1/"`  # 減少メールのタイトル作成
    # echo "タイトル: $Tl"  # debug 確認用
    echo -e "`date`\n$Msg$DW$C %" | mail -s "$Tl" -r "$Rt" "$To"    # メールの転送
  fi
else
  if [ $C -gt $UPSCap ]; then  ### 充電 ; 前回との増加変化を検知
    if [ $C -gt 50 ] && [ $((C-14)) -gt $UPSmsg ]; then  # 50% < ; 15% 増加毎にメール作成
      echo $C > $FM
      Tl=`echo "$T" | sed -r "s/( ##)$/ *UP* ( $C% )\1/"`  # 増加メールのタイトル作成
      # echo "タイトル: $Tl"  # debug 確認用
      echo -e "`date`\n$Msg$UP$C %" | mail -s "$Tl" -r "$Rt" "$To"    # メールの転送
    fi
  fi
fi
echo $C > $FC  # 今の容量を記録

AC100V電源を止めても、2時間近くはバッテリーで動作していますが、しばらく待っているとスマホにメールが送られてきます。

備忘録として、単体での起動なら例えば /home/sunao/bin/ の下にスクリプトを置いて起動できますが、cron からの起動ではスクリプトが見付けられずにエラーとなります。cron では、最低限のPATH設定となっているからです。

crontab -e で、起動時間や起動スクリプトを編集する定義の中で、さらに先の行に、PATH= 定義を記述して実行モジュールを読み込むディレクトリをリストしておくとパスが省略されていても起動できるようです。

$ crontab -e
# m h  dom mon dow   command
PATH=/home/sunao/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
##### UPS バッテリーの変化でメール作成 ######
*/5 * * * * ups-check-mail.sh > /dev/null

スマホには、8 〜 9 分間隔で 10%減のメールが届きます。逆に充電時は、11 〜 12 分間隔で 15%増のメールが届きます。気休めですがメールが送られると少し安心できます。

まだ手を加えたい箇所はあるもののネット共有サーバーとして利用できそうな状況になってきました。

Linux 立上げ時の自動起動

最近も日常に追われすぎていて、何をやっても中途半端に中断してしまい、続きがいつになるか分からない日々が続いています。

今回の作業背景

PCを利用していて痛い目に何度も遭っている経験から、今最重要課題と捉えているのが、作業結果を意識しないでできるバックアップ環境を作ることだと考えています。私は普段使いの Linux (Ubuntu) をセットアップしているノートPCを日常で利用しているのですが、その中で作業した内容はある程度無意識で定期的に共有サーバーにバックアップしています。
そのバックアップ方法は、単純な方法で cron を利用して rsync コマンドで、定期間隔の非同期でネットワークサーバーに転送する方法で実現しています。転送されたサーバーからは更に1日1回の頻度て他のサーバーにもコピーしています。
常にバックアップしているのに、では何が問題なのか、実は普段利用することも少ない Windows系 OSもデュアルブートできる環境で、Linux で実現できていない一部のアプリを利用することも時にはあります。その中で作業した内容については適切なバックアップができないでいます。意識してコピーする方法なら今でも面倒な作業として出来るのですが、無意識でバックアップして欲しいのが本音です。
そこで壁に当たりました。自動的に Windows パーティションをバックアップするには、

  • Windows を操作しているタイミングでの自動バックアップ
  • Linux で操作しているタイミングでの自動バックアップ

普段の利用は、Linux なので、負荷増になる無用なバックアッププロセスが常時稼働するのは避けたいので、Windows から Linux に切り替えるタイミングでの実行が理想だろうと考えて、過去の定番な方法 SysV init 立上げプロセスでの rc.local を模索したのですが、システム立上げ時に実行することが出来ないようです。機能しないのかタイミングでエラーしているのかは不明です。
最近の Linux システムは、立上げ時の方法が従来の SysV init から systemd に変わっているようで、私のノートPCも変わっているような気がします。そこで試行錯誤してみることにしました。
参考にしたサイトは、作り方を事細かく説明してくれています。


ここからが作業の試行錯誤の本題

実行したことをすぐに忘れる自分のための備忘録です。
Linux 起動時に、一度だけ Windows パーティションの一部を共有サーバーにバックアップする。Linux 立上げ前に Windows を利用していたかは問題外として、バックアップを実行したタイムスタンプをバックアップエリア内に残しておくこととします。
実際の組込み前に、参考にしたサイトの手順を自分の学習と動作確認のために実行してみることから始めます。他の情報の説明によると systemd に登録するサービスの指示書をユニットファイルと呼んでいるようです。
パッケージ名: NoteStartUpRun で、ユニットファイル名: note-startup-1st.service としてみました。何かちょっとネーミングがおかしいかなとも思いますが、私の頭の中では最初に実行する処理なので -1st を付けてみました。まぁただの名前なのでここから始めます。
サービス(ユニットファイル)の登録は、 /etc/systemd/system/note-startup-1st.service になるようで、この中には登録するサービスの情報を決められた書式で記述するようです。
そして実際に動作させるプログラムは、パッケージ名で管理するディレクトリに記述するようですが、 /opt/NoteStartUpRun/bin となっていて、一般的な実行形式のコマンドを入れる bin に集めているようです。そこで疑問ですが、パッケージディレクトリには、bin 以外に本来は何が置かれているのでしょう…深く考えないで進めます。

systemd の動作を確認する雛形作り

参考サイトがカレントで作成して、それを該当するディレクトリにコピーして、所有者を root に変更したり、アクセス権の変更をしているので、私もその方法を踏襲します。

$ vi note-startup-1st.service
[Unit]
Description = Note Private AutoRun
After=network-online.target remote-fs.target nss-lookup.target
ConditionPathExists=/opt/NoteStartUpRun/bin
[Service]
ExecStart=/opt/NoteStartUpRun/bin/note-stup-1st.sh
Restart=no
Type=simple
[Install]
WantedBy=multi-user.target

$ sudo cp note-startup-1st.service /etc/systemd/system
$ sudo chown root:root /etc/systemd/system/note-startup-1st.service
$ sudo chmod 644 /etc/systemd/system/note-startup-1st.service
$ vi note-stup-1st.sh
#!/bin/sh
exec /usr/bin/env python /opt/NoteStartUpRun/bin/Python-Sample.py

$ sudo mkdir -p /opt/NoteStartUpRun/bin
$ sudo chmod 755 /opt/NoteStartUpRun/bin
$ sudo cp note-stup-1st.sh /opt/NoteStartUpRun/bin
$ sudo chown root:root /opt/NoteStartUpRun/bin/note-stup-1st.sh
$ sudo chmod 755 /opt/NoteStartUpRun/bin/note-stup-1st.sh

実際に動作するサンプルプログラム

最終的に起動されるサンプルプログラムは、bash や ruby または python でも構わないのでしょうけど、参考サイトにある例をそのまま丸コピーしてきました。検証作業の説明も丁寧に行われているので、見比べるのにも最適なので利用させて頂いています。例では python で組まれた1秒毎にメッセージを書き出す無限ループの処理で、Python-Sample.py として、次の記述です。

$ vi Python-Sample.py
#!/usr/bin/env python
import sys
from time import sleep
if __name__ == '__main__':
  while True:
    print "Hello world %s" % (sys.argv)
    sys.stdout.flush()
    sleep(1)

$ sudo cp Python-Sample.py /opt/NoteStartUpRun/bin
$ sudo chown root:root /opt/NoteStartUpRun/bin/Python-Sample.py
$ sudo chmod 755 /opt/NoteStartUpRun/bin/Python-Sample.py 

サービスとして定義している note-startup-1st.service により note-stup-1st.sh が起動されます。その中で単純にサンプルプログラムの Python-Sample.py を起動しています。

作成したユニットファイルやサンプルプログラムの確認

作成したユニットファイルやパッケージ内のプログラムの所有者とアクセス権の確認をしておきます。

$ ls -l /opt/NoteStartUpRun
合計 4
drwxr-xr-x 2 root root 4096  1月  9 15:01 bin
$ ls -l /opt/NoteStartUpRun/bin
合計 8
-rwxr-xr-x 1 root root 175  1月  9 15:01 Python-Sample.py
-rwxr-xr-x 1 root root  77  1月  9 14:54 note-stup-1st.sh
$ ls -l /etc/systemd/system/note-startup-1st.service
-rw-r--r-- 1 root root 276  1月  9 14:41 /etc/systemd/system/note-startup-1st.service

茶色の部分の root ユーザーと 755 及び 644 が確認できました。

サンプルプログラムの単体動作検証

無限ループでメッセージを書き出すサンプルプログラムを単体で起動して、 [Ctrl+C] で強制停止して動作の確認をしておきます。

$ sudo /opt/NoteStartUpRun/bin/Python-Sample.py
Hello world ['/opt/NoteStartUpRun/bin/Python-Sample.py']
Hello world ['/opt/NoteStartUpRun/bin/Python-Sample.py']
Hello world ['/opt/NoteStartUpRun/bin/Python-Sample.py']
Hello world ['/opt/NoteStartUpRun/bin/Python-Sample.py']
Hello world ['/opt/NoteStartUpRun/bin/Python-Sample.py']
^CTraceback (most recent call last):
  File "/opt/NoteStartUpRun/bin/Python-Sample.py", line 8, in
    sleep(1)
KeyboardInterrupt

単体では問題なくメッセージが書き出されるようです。


ユニットファイルを systemd に登録

ここからは、systemd へのサービス(ユニットファイル)の登録と検証作業になるようです。ユニットファイル等を追加や変更した後には、必ず次のコマンド sudo systemctl daemon-reload を実行します。
そして一緒にステータスも確認しておきます。

$ sudo systemctl daemon-reload
$ sudo systemctl status note-startup-1st.service
● note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

ステータスで表示される Loaded: 行のカッコ内の1つ目と2つ目のセミコロンの間の disabled となっているのは、自動起動が無効になっているということのようで、自動起動できるように設定します。

自動起動が行われるように設定

$ sudo systemctl enable note-startup-1st.service
Created symlink from /etc/systemd/system/multi-user.target.wants/note-startup-1st.service to /etc/systemd/system/note-startup-1st.service.
$ sudo systemctl status note-startup-1st.service
● note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

ユニットファイルの定義内に、[ Install ] の WantedBy= で定義しているユニットにリンクが張られ、先ほどの /etc/systemd/system/note-startup-1st.service; の後の disabledenabled に変わっています。
これで再立ち上げで自動実行されるようになっているはずですが、その前にコマンドで起動して確認したり、停止させる操作をして動作を確認します。

systemd の手動起動と停止の確認

ユニットファイル名を指定したコマンド sudo systemctl start note-startup-1st.service で起動できます。

$ sudo systemctl start note-startup-1st.service
$ sudo systemctl status note-startup-1st.service
note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabled)
   Active: active (running) since 火 2018-01-09 15:13:41 JST; 12s ago
 Main PID: 7997 (python)
   CGroup: /system.slice/note-startup-1st.service
           └─7997 python /opt/NoteStartUpRun/bin/Python-Sample.py
 1月 09 15:13:44 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:13:45 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:13:46 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:13:47 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S

起動されて1秒毎にメッセージが書きだされているのが確認できます。
次は、sudo systemctl stop note-startup-1st.service コマンドで停止して結果をステータスで確認してみます。

$ sudo systemctl stop note-startup-1st.service
$ sudo systemctl status note-startup-1st.service
note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 火 2018-01-09 15:14:44 JST; 4min 47s ago
  Process: 7997 ExecStart=/opt/NoteStartUpRun/bin/note-stup-1st.sh (code=killed, signal=TERM)
 Main PID: 7997 (code=killed, signal=TERM)
 1月 09 15:14:37 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:14:38 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:14:39 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:14:40 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:14:41 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:14:42 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:14:43 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:14:44 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:14:44 MITA-NY40S systemd[1]: Stopping Note Private AutoRun...
 1月 09 15:14:44 MITA-NY40S systemd[1]: Stopped Note Private AutoRun.

Active: の行が Active: inactive (dead) になり、プログラムは停止していることが確認できます。

一般ユーザーでジャーナルを確認

次にプログラムの出力ログを確認できる journalctl コマンドがあるとの説明なので試してみます。

$ journalctl -u note-startup-1st.service
-- Logs begin at 月 2018-01-08 19:44:01 JST, end at 火 2018-01-09 15:21:01 JST. --
 1月 09 15:13:41 MITA-NY40S systemd[1]: Started Note Private AutoRun.
 1月 09 15:13:42 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:13:43 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:13:44 MITA-NY40S note-stup-1st.sh[7997]: Hello world ['/opt/NoteStartUpRun/bin/Python-S

システム再起動による自動起動の確認

いよいよ待望の Linux の立上げによる自動起動の確認になります。ノートPCを再起動してステータスを確認します。

$ sudo systemctl status note-startup-1st.service
note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabled)
   Active: active (running) since 火 2018-01-09 15:45:33 JST; 3min 15s ago
 Main PID: 1079 (python)
   CGroup: /system.slice/note-startup-1st.service
           └─1079 python /opt/NoteStartUpRun/bin/Python-Sample.py
 1月 09 15:48:38 MITA-NY40S note-stup-1st.sh[1079]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:48:39 MITA-NY40S note-stup-1st.sh[1079]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:48:40 MITA-NY40S note-stup-1st.sh[1079]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:48:41 MITA-NY40S note-stup-1st.sh[1079]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:48:42 MITA-NY40S note-stup-1st.sh[1079]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:48:43 MITA-NY40S note-stup-1st.sh[1079]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:48:44 MITA-NY40S note-stup-1st.sh[1079]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:48:45 MITA-NY40S note-stup-1st.sh[1079]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:48:46 MITA-NY40S note-stup-1st.sh[1079]: Hello world ['/opt/NoteStartUpRun/bin/Python-S
 1月 09 15:48:47 MITA-NY40S note-stup-1st.sh[1079]: Hello world ['/opt/NoteStartUpRun/bin/Python-S

問題なく起動されているようです。

その他の動作確認ツールを学習

今は直接必要がないのですが、参考サイトの説明では、実行時の 標準入力・標準出力・エラー出力 が、どこに繋がっているのか確認できるとのことですので今後のためにも試してみます。
上記出力からプロセスIDは、 1079 (PID: 1079) です。

$ sudo ls -l /proc/1079/fd
合計 0
lr-x------ 1 root root 64  1月  9 15:45 0 -> /dev/null
lrwx------ 1 root root 64  1月  9 15:45 1 -> socket:[21758]
lrwx------ 1 root root 64  1月  9 15:45 2 -> socket:[21758]

標準入力は、ダミーデバイスの /dev/null に割り当てられ、標準出力とエラー出力は共に UNIXドメインソケットに接続されているようです。参考サイトのコマンドもそのまま試してみます。

$ sudo ss -x -p|grep 21758
u_str  ESTAB      0      0       * 21758                 * 20776                 users:(("python",pid=1079,fd=2),("python",pid=1079,fd=1))
u_str  ESTAB      0      0      /run/systemd/journal/stdout 20776                 * 21758                 users:(("systemd-journal",pid=212,fd=38),("systemd",pid=1,fd=74))

知識がないので私には細かいことはわかりませんが、 systemd-journal が以前利用されていた syslogd を置き換えたログシステムとの説明があります。

systemd に関する説明資料

systemd に関しての説明がネット上の RedHat のサイトにありましたのでリンクをしておきます。


本題のシステム起動時のバックアップ

やっと自分で行いたい目的であるシステム立上げ時の自動バックアップ、の一歩手前まで辿りつけました。昔操作していた Windows システムも含めて自分で考えたサービスを追加して自動実行した経験はないので、何か少しワクワクした気持ちになります。

バックアッププログラムの雛形

パイソンのサンプルプログラムを置き換える実際のバックアッププログラムは、シェルスクリプトで記述した単純なもので、 Windows パーティションを一時マウントし、その一部のデータをリモートサーバーの特定のパスに rsync コマンドでコピーするものです。変更があった部分だけがコピーされるのですが、実行時のタイムスタンプを残すように少しだけ細工を追加しています。

$ cat /opt/NoteStartUpRun/bin/sunao-note_Windows-Documents-bkup
#!/bin/bash
server='192.168.x.21'                    # バックアップ先サーバー
bkup_D="$server:/home/bkup/sunao-Win-Doc/"   # バックアップ先 リモートサーバー
mntS='/mnt/ntfs'
bkup_S="$mntS/Users/sunao/Documents/"      # バックアップ元のベース
/bin/mount $mntS
echo "実行タイムスタンプ  `date`" > $bkup_S/TimeStamp.txt
/usr/bin/rsync -av --delete $bkup_S $bkup_D
/bin/umount $mntS

パイソンのサンプルと同じディレクトリにコピーされ、所有者とアクセス権の設定も確認して、単体動作では問題なくバックアップできています。

サンプルからバックアッププログラムへ置き換えと検証

次にユニットファイルを修正して、サンプルからバックアッププログラムに置き換えて、コマンドで実行してステータスを確認してみます。

$ sudo vi /opt/NoteStartUpRun/bin/note-stup-1st.sh
#!/bin/sh
exec /opt/NoteStartUpRun/bin/sunao-note_Windows-Documents-bkup

$ sudo systemctl daemon-reload
$ sudo systemctl start note-startup-1st.service
$ sudo systemctl status note-startup-1st.service
● note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 火 2018-01-09 16:13:53 JST; 26s ago
  Process: 3440 ExecStart=/opt/NoteStartUpRun/bin/note-stup-1st.sh (code=exited, status=0/SUCCESS)
 Main PID: 3440 (code=exited, status=0/SUCCESS)
 1月 09 16:13:51 MITA-NY40S ntfs-3g[3457]: Version 2015.3.14AR.1 integrated FUSE 28
 1月 09 16:13:51 MITA-NY40S ntfs-3g[3457]: Mounted /dev/sda4 (Read-Write, label "Windows", NTFS 3.
 1月 09 16:13:51 MITA-NY40S ntfs-3g[3457]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,gid=10
 1月 09 16:13:51 MITA-NY40S ntfs-3g[3457]: Mount options: rw,noexec,nosuid,nodev,user,allow_other,
 1月 09 16:13:51 MITA-NY40S ntfs-3g[3457]: Global ownership and permissions enforced, configuratio
 1月 09 16:13:53 MITA-NY40S note-stup-1st.sh[3440]: sending incremental file list
 1月 09 16:13:53 MITA-NY40S note-stup-1st.sh[3440]: TimeStamp.txt
 1月 09 16:13:53 MITA-NY40S note-stup-1st.sh[3440]: sent 3,991 bytes  received 61 bytes  1,620.80
 1月 09 16:13:53 MITA-NY40S note-stup-1st.sh[3440]: total size is 24,092,416  speedup is 5,945.81
 1月 09 16:13:53 MITA-NY40S ntfs-3g[3457]: Unmounting /dev/sda4 (Windows)
lines 1-16/16 (END)

コマンドによる起動では問題なく実行されて、正常終了しています。

実際の立上げによるバックアップの検証作業

本番でのシステム立上げによる実行の動作確認です。
ノートPC再起動後の journalctl コマンドによる結果が次のようになっています。

$ journalctl -u note-startup-1st.service

-- Logs begin at 火 2018-01-09 16:24:34 JST, end at 火 2018-01-09 16:27:17 JST. --
 1月 09 16:25:12 MITA-NY40S systemd[1]: Started Note Private AutoRun.
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Version 2015.3.14AR.1 integrated FUSE 28
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Mounted /dev/sda4 (Read-Write, label "Windows", NTFS 3.1)
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,gid=1000,user
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Mount options: rw,noexec,nosuid,nodev,user,allow_other,nonempty,relatime,default_permissi
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Global ownership and permissions enforced, configuration type 7
 1月 09 16:25:16 MITA-NY40S note-stup-1st.sh[1039]: ssh: connect to host 192.168.x.21 port 22: Network is unreachable
 1月 09 16:25:16 MITA-NY40S note-stup-1st.sh[1039]: rsync: connection unexpectedly closed (0 bytes received so far) [sender]
 1月 09 16:25:16 MITA-NY40S note-stup-1st.sh[1039]: rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.1]
 1月 09 16:25:16 MITA-NY40S ntfs-3g[1071]: Unmounting /dev/sda4 (Windows)

結果は残念ながらエラーしていてバックアップされない状況です。ユニットファイルの定義の中で、立上げプロセスの実行条件の After= で定義している箇所を色々と変更してみましたが効果がありませんでした。
最初は認証の sshd 等のプロセスが立上がっていないのが原因ではないかとか色々と試行錯誤しましたが、解決には至りませんでした。ネットワーク環境が立上がってから少し安定する時間が必要なのかもしれません。

systemd の依存関係を確認するツール

Systemdのサービスの依存関係を調べる方法 というサイトがありました。ここではグラフ形式にプロットして、ブラウザの Firefox で見る方法が説明されていてとても参考になりました。

最終的にバックアップできるように修正

最終的な修正は、立上げで特に早い段階でバックアップする必要もないので、ユニットファイルの After= に、立上げが一番遅いと思われる multi-user.target を指定して、バックアッププログラムが起動されてから実際のバックアップ動作が開始する前に 5分待つように sleep 300 を追加しました。

$ cat /etc/systemd/system/note-startup-1st.service

[Unit]
Description = Note Private AutoRun
After=network-online.target multi-user.target
ConditionPathExists=/opt/NoteStartUpRun/bin
[Service]
ExecStart=/opt/NoteStartUpRun/bin/note-stup-1st.sh
Restart=no
Type=simple
[Install]
WantedBy=multi-user.target

$ cat /opt/NoteStartUpRun/bin/sunao-note_Windows-Documents-bkup
#!/bin/bash
server='192.168.x.21'                    # バックアップ先サーバー
bkup_D="$server:/home/bkup/sunao-Win-Doc/"  # バックアップ先位置
mntS='/mnt/ntfs'
bkup_S="$mntS/Users/sunao/Documents/"       # バックアップ元のベース
sleep 300           # 安定するように 5分待つ
/bin/mount $mntS
echo "実行タイムスタンプ  `date`" > $bkup_S/TimeStamp.txt
/usr/bin/rsync -av --delete $bkup_S $bkup_D
/bin/umount $mntS

待ち時間を追加する前は毎回エラーしていました。実際には、 sleep 180 の3分でもバックアップ動作は正常に行われていたのですが、余裕を持たせて sleep 300 にしています。

systemd ツールの利用結果

systemd の立上げ時間は、次のコマンドで表示され、 plot を付加して実行するとグラフ形式で svg ファィルを作成できるようで、ブラウザの Firefox で表示した最後の一部のみをここでは取り出しています。

$ systemd-analyze
Startup finished in 3.340s (firmware) + 7.713s (loader) + 6.703s (kernel) + 47.235s (userspace) = 1min 4.992s
$ systemd-analyze plot > startup.svg
$ firefox startup.svg


上記画像の右下角に、下から5番目に multi-user.target が表示され、その下に今回作成したバックアップ処理の note-startup-1st.service の表示がありますので、立上げプロセスの最終で起動されているのが確認できます。
なお立上げプロセスは、systemd-analyze コマンドの実行により、総計で約1分5秒程掛かっていることがわかります。その大半の 47秒を userspace が占めていることがわかります。

完成した立上げでのバックアップ

特に書き換えるデータがなく、実行時のタイムスタンプファイルのみがコピーされているだけの正常なバックアッププロセスを、最後にステータスとジャーナル表示の両方で載せておきます。

$ sudo systemctl status note-startup-1st.service
● note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabl
   Active: inactive (dead) since 木 2018-01-11 19:50:00 JST; 11min ago
  Process: 1198 ExecStart=/opt/NoteStartUpRun/bin/note-stup-1st.sh (code=exited, status=0/SUCC
 Main PID: 1198 (code=exited, status=0/SUCCESS)
 1月 11 19:49:58 MITA-NY40S ntfs-3g[2846]: Version 2015.3.14AR.1 integrated FUSE 28
 1月 11 19:49:58 MITA-NY40S ntfs-3g[2846]: Mounted /dev/sda4 (Read-Write, label "Windows", NTF
 1月 11 19:49:58 MITA-NY40S ntfs-3g[2846]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,gi
 1月 11 19:49:58 MITA-NY40S ntfs-3g[2846]: Mount options: rw,noexec,nosuid,nodev,user,allow_ot
 1月 11 19:49:58 MITA-NY40S ntfs-3g[2846]: Global ownership and permissions enforced, configur
 1月 11 19:50:00 MITA-NY40S note-stup-1st.sh[1198]: sending incremental file list
 1月 11 19:50:00 MITA-NY40S note-stup-1st.sh[1198]: TimeStamp.txt
 1月 11 19:50:00 MITA-NY40S note-stup-1st.sh[1198]: sent 3,991 bytes  received 61 bytes  1,620
 1月 11 19:50:00 MITA-NY40S note-stup-1st.sh[1198]: total size is 24,092,416  speedup is 5,945
 1月 11 19:50:00 MITA-NY40S ntfs-3g[2846]: Unmounting /dev/sda4 (Windows)
lines 1-16/16 (END)
$ journalctl -u note-startup-1st.service
-- Logs begin at 木 2018-01-11 19:44:14 JST, end at 木 2018-01-11 19:50:53 JST. --
 1月 11 19:44:57 MITA-NY40S systemd[1]: Started Note Private AutoRun.
 1月 11 19:49:58 MITA-NY40S ntfs-3g[2846]: Version 2015.3.14AR.1 integrated FUSE 28
 1月 11 19:49:58 MITA-NY40S ntfs-3g[2846]: Mounted /dev/sda4 (Read-Write, label "Windows", NTF
 1月 11 19:49:58 MITA-NY40S ntfs-3g[2846]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,gi
 1月 11 19:49:58 MITA-NY40S ntfs-3g[2846]: Mount options: rw,noexec,nosuid,nodev,user,allow_ot
 1月 11 19:49:58 MITA-NY40S ntfs-3g[2846]: Global ownership and permissions enforced, configur
 1月 11 19:50:00 MITA-NY40S note-stup-1st.sh[1198]: sending incremental file list
 1月 11 19:50:00 MITA-NY40S note-stup-1st.sh[1198]: TimeStamp.txt
 1月 11 19:50:00 MITA-NY40S note-stup-1st.sh[1198]: sent 3,991 bytes  received 61 bytes  1,620
 1月 11 19:50:00 MITA-NY40S note-stup-1st.sh[1198]: total size is 24,092,416  speedup is 5,945
 1月 11 19:50:00 MITA-NY40S ntfs-3g[2846]: Unmounting /dev/sda4 (Windows)
lines 1-12/12 (END)