安定してた共有サーバーダウン

昨日たまたま sshで操作ついでに思い立ち、通常のセキュリティアップデートのつもりで久し振りのコマンド操作後にリブートしたら、安定して運用中の Raspberry Pi 1B の共有サーバーが死にました。

学習しないで同じ轍を踏むとは自分でも悲しいです。最新版の Raspbian は、要注意だという事を改めて再認識させられました。

他にも Raspberry Pi のサーバーが稼働していますが、少し前の Raspbian をセットアップしたサーバーなので、単純にセキュリティアップデートだけが行われたらしく、そのままに稼働しています。

以前のメモを頼りに復活させますが、最新のOSで作って良いのか悩みます。

頭を冷やして少し考えてから判断したいと思います。

ラズパイ1B で共有サーバーの構築 (5/)

  1. リモートメンテに必須の byobu / screen の設定
  2. いよいよ念願の共有サーバー samba の設定

キーボードもモニタも無いサーバーを操作するには、他のパソコンからのリモートメンテナンスが必須ですが、操作も並行して同時に別のコマンドを実行させたいことはよくあることです。素のままだと ssh 等を複数起動してセッションを張らないと出来ません。また長く掛かるコマンドの実行中にセッションが切れたり、クライアント側を停止するとサーバー側もエラーで停止します。

過去の記事でこれらについての対策方法として、仮想端末について触れているので、その部分を見直しながらコピーしておきます。

仮想端末と呼ばれるジャンルには、 byobu / tmux / screen と言ったソフトがあって、byobu は tmux や screen のラッパープログラムとして機能します。

何が便利かと言うと、 ssh 等で直接リモートログインした状態で、サーバー側のコマンドを利用して処理を行っている時に、何かの要因で通信路に障害が起きてセッションが切れると、実行中の処理も異常終了してしまいます。しかし、これらの仮想端末を利用して処理していると仮に通信路で障害が発生しても、再接続するだけで元の処理は継続して実行したままなので途中の経過表示も含めて元の続きを継続できます。

メリットを言い換えると、時間のかかる処理をリモートサーバー上で起動しておいて、操作するクライアント側では電源を落とす等の方法で接続を切ってしまい、時々接続して途中経過を確認したり、時間を置いてから最終結果の確認だけを行うことも可能になります。それと、複数の ssh 接続が必要なことも時としてありますが、例えば速度が遅く不安定なインターネットを経由した先のサーバー接続等を考えた場合には、直接の接続セッションは単一なのに、複数の仮想端末内で色々な処理を並行して実行できるのは安心感があります。

そんな訳で byobu を導入します。一般的に byobu は通常 tmux を伴って仕事をするのですが、私の場合は昔から screen を利用していた経緯があって、他に設置のサーバーでも byobu と screen の組合せで稼働しています。

$ ssh 192.168.11.21    .....クライアントからのssh接続要求

Linux rpi1-com2 4.9.59+ #1047 Sun Oct 29 11:47:10 GMT 2017 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Nov 20 20:26:12 2017 from 192.168.11.43
$ byobu      .....リモート接続されたラズパイで byobu を起動

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

Welcome to the light, powerful, text window manager, Byobu.
You can toggle the launch of Byobu at login with:
'byobu-disable' and 'byobu-enable'

For tips, tricks, and more information, see:
* http://bit.ly/byobu-help

$

 

 

 

 

 
              ...... F6 キーの押下で byobu 終了 ⇒ 起動前に戻る
[detached (from session 1)]

実際のデフォルトで起動した byobu の画面は次のイメージです。 byobu+tmux の形式です。

そして byobu の裏で screen が動作するように変更します。

$ byobu-select-backend
Select the byobu backend:
1. tmux
2. screen

Choose 1-2 [1]: 2

これで screen と連携した byobu の設定が完了しました。
byobu+screen のイメージは次の画面です。操作した感じでは問題なさそうです。

これらの仮想端末ソフトには、コマンド入力を受付けるシェル画面、例えば bashの画面が表示されていますが、そのまま文字を入力する以外に、外枠としての仮想端末自体を制御するためのコマンド文字が存在します。例えば、新しくシェル画面を追加したり、並行処理している複数のシェル画面を切り替えたりします。その制御用の文字を、エスケープ文字と呼びますが、これを各サーバーで色々だと誤操作等の支障が出るので変更して統一しておきます。

エスケープ文字の変更は、byobu が起動している画面で F9 キーを押下するとメニューのダイアログが起動します。 screen との相性が悪いらしく、表示が崩れますが変更は出来るようです。変更した結果のファイルを確認すると文字列が追加されていました。

$ vi .byobu/keybindings

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

ただし、このままでは sshでリモートログインしても自動的に byobu は起動しないし、 byobu を終了しても sshでログインした状態のままになります。

$ byobu-enable

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

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

これでクライアントからの ssh リモート接続でセッションが確立すると、自動的に byobu が起動して、過去に操作していたなら以前の状態の継続になります。リモートでの操作を終えるために F6 キーによる終了で、 ssh によるリモート接続も自動的に切断します。

byobu の操作は、新規に仮想端末を追加で開くには F2 キー、別画面に移動するには、左回り右回りで F3 / F4 キーで行います。

これで仮想端末 byobu の設定は完了です。



 

ラズパイ1B で共有サーバーの構築 (4/)

  1. bind9 DNSサーバーの設定
  2. postfix メール配送の設定

ここからは、インストールしたままで設定がまだの機能を順次設定していきます。

まずは DNS 機能の設定から、セットアップ中のラズパイ内に DNS 機能を設定し、家の中に置かれたローカル機器を名前からアクセスできるように試みます。これには既に稼働しているサーバーの設定をコピーして、誤りがないか確認しながら必要なら内容の見直しを行います。

# ls -l /etc/bind
合計 64
-rw-r--r-- 1 root bind  964 11月 13 23:53 2400:yyy:zz:df00::.rev
-rw-r--r-- 1 root root 3923  8月 28 16:36 bind.keys
-rw-r--r-- 1 root root  237  8月 28 16:36 db.0
-rw-r--r-- 1 root bind  787 11月 14 00:09 db.xx.168.192
-rw-r--r-- 1 root root  271  8月 28 16:36 db.127
-rw-r--r-- 1 root root  237  8月 28 16:36 db.255
-rw-r--r-- 1 root root  353  8月 28 16:36 db.empty
-rw-r--r-- 1 root root  270  8月 28 16:36 db.local
-rw-r--r-- 1 root root 3171  8月 28 16:36 db.root
-rw-r--r-- 1 root bind 2155 11月 14 00:02 db.sunao-mita.pgw.jp
-rw-r--r-- 1 root bind  463  8月 28 16:36 named.conf
-rw-r--r-- 1 root bind  490  8月 28 16:36 named.conf.default-zones
-rw-r--r-- 1 root bind  481 11月 13 23:29 named.conf.local
-rw-r--r-- 1 root bind 1074 11月 13 23:41 named.conf.options
-rw-r----- 1 bind bind   77 11月 13 21:55 rndc.key
-rw-r--r-- 1 root root 1317  8月 28 16:36 zones.rfc1918

ローカル機器を設定した IPアドレスの対応ファイル db.sunao-mita.pgw.jp と逆引き用のファイル 2400:yyy:zz:df00::.rev と db.xx.168.192 内容の概略を次に示します。内容は xyzn の文字で適当に置き換えているため実物とは異なります。こんなイメージとして載せています。

# cat /etc/bind/db.sunao-mita.pgw.jp
;;  sunao-mita.pgw.jp

$TTL    86400
@      IN      SOA    sunao-mita.pgw.jp.  root.sunao-mita.pgw.jp. (
        2017111301      ;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.xx.22
                IN      AAAA    2400:yyy:zz:df00:225:31ff:fe00:nn
dns2            IN      A       192.168.xx.21
dns             IN      A       192.168.xx.22
net-disk        IN      A       192.168.xx.23
gate            IN      A       192.168.xx.1
DebianPogo      IN      A       192.168.xx.22
DebianPogo      IN      AAAA    2400:yyy:zz:df00:225:31ff:fe00:nn
mail            IN      A       192.168.xx.22
mail            IN      AAAA    2400:yyy:zz:df00:225:31ff:fe00:nn
PogoV6          IN      AAAA    2400:yyy:zz:df00:225:31ff:fe00:nn
dns2            IN      AAAA    2400:yyy:zz:df00:ff57:63d2:5835:nn
dns             IN      AAAA    2400:yyy:zz:df00:225:31ff:fe00:nn
www             IN      A       192.168.xx.22
www             IN      AAAA    2400:yyy:zz:df00:225:31ff:fe00:nn
RadioV6         IN      AAAA    2400:yyy:zz:df00:ba27:ebff:feac:nn
rpi1-com2       IN      A       192.168.xx.21
rpi1-com2       IN      AAAA    2400:yyy:zz:df00:ff57:63d2:5835:nn

ls              IN      CNAME   net-disk
share           IN      CNAME   rpi1-com2

# cat /etc/bind/2400:yyy:zz:df00::.rev
$TTL 86400
@            IN      SOA sunao-mita.pgw.jp. root.sunao-mita.pgw.jp. (
                     2017111301 ; serial
                     3600       ; refresh 1hr
                     900        ; retry 15min
                     604800     ; expire 1w
                     86400      ; min 24hr
)
        IN      NS      dns.sunao-mita.pgw.jp.
        IN      NS      dns2.sunao-mita.pgw.jp.
n.n.d.9.0.0.e.f.f.f.1.3.5.2.2.0    IN   PTR   PogoV6.sunao-mita.pgw.jp.
n.n.d.9.0.0.e.f.f.f.1.3.5.2.2.0    IN   PTR   dns.sunao-mita.pgw.jp.
n.n.d.9.0.0.e.f.f.f.1.3.5.2.2.0    IN   PTR   sunao-mita.pgw.jp.
n.n.b.d.e.e.e.f.f.f.b.e.7.2.a.b    IN   PTR   raspv6.sunao-mita.pgw.jp.
n.n.8.2.5.3.8.5.2.d.3.6.7.5.f.f    IN   PTR   dns2.sunao-mita.pgw.jp.
n.n.8.2.c.a.e.f.f.f.b.e.7.2.a.b    IN   PTR   RadioV6.sunao-mita.pgw.jp.
n.n.3.2.6.a.d.3.8.f.f.0.0.6.6.b    IN   PTR   Rpi3-com1.sunao-mita.pgw.jp.
n.n.8.2.5.3.8.5.2.d.3.6.7.5.f.f    IN   PTR   rpi1-com2.sunao-mita.pgw.jp.


# cat /etc/bind/db.xx.168.192
$TTL 86400

xx.168.192.in-addr.arpa. IN SOA sunao-mita.pgw.jp. root.sunao-mita.pgw.jp. (
        2017111301       ;Serial
        7200    ;Refresh
        3600    ;Retry
        604800  ;Expire
        86400   ;Minimum TTL
)
        IN      NS      dns.sunao-mita.pgw.jp.
        IN      NS      dns2.sunao-mita.pgw.jp.

n0      IN      PTR     landisk.sunao-mita.pgw.jp.
2n      IN      PTR     net-disk.sunao-mita.pgw.jp.
1       IN      PTR     gate.sunao-mita.pgw.jp.
n1      IN      PTR     rpi1-com2.sunao-mita.pgw.jp.
nn      IN      PTR     radio.sunao-mita.pgw.jp.
2n      IN      PTR     DebianPogo.sunao-mita.pgw.jp.
2n      IN      PTR     sunao-mita.pgw.jp.
n4      IN      PTR     Rpi3-com1.sunao-mita.pgw.jp.

それらの設定を有効にするため、named.conf.local に設定を追加します。

# vi /etc/bind/named.conf.local
//
// Do any local configuration here
//

zone "sunao-mita.pgw.jp" {
type master;
file "/etc/bind/db.sunao-mita.pgw.jp";
};

zone "xx.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.xx.168.192";
};

zone "0.0.f.d.z.z.z.z.y.y.y.y.0.0.4.2.ip6.arpa." {
type master;
file "/etc/bind/2400:yyyy:zzzz:df00::.rev";
};

// Consider adding the 1918 zones here, if they are not used in your
// organization
include "/etc/bind/zones.rfc1918";

起動して無事に立上がれば、アドレスを引いて期待した結果が返るか確認します。

# service bind9 start

確認には、digコマンドで、自分自身のサーバー @localhost を指定して、外部のサーバー www.nifty.com や内部の sunao-mita.pgw.jp を引いてみたり、逆引きの ipv4 / ipv6 の IPアドレスから引いてみます。

# dig @localhost www.nifty.com  ...外部のサーバーを引いてみる

; <<>> DiG 9.10.3-P4-Raspbian <<>> @localhost www.nifty.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48086
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.nifty.com.                 IN      A

;; ANSWER SECTION:
www.nifty.com.          300     IN      A       121.94.174.14

;; AUTHORITY SECTION:
www.nifty.com.          299     IN      NS      cdns0.nifty.ad.jp.
www.nifty.com.          299     IN      NS      cdns1.nifty.ad.jp.

;; Query time: 1574 msec
;; SERVER: ::1#53(::1)
;; WHEN: Tue Nov 14 10:27:56 JST 2017
;; MSG SIZE  rcvd: 109

# dig @localhost sunao-mita.pgw.jp    ...内部のローカルサーバー

; <<>> DiG 9.10.3-P4-Raspbian <<>> @localhost sunao-mita.pgw.jp
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48474
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 6

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sunao-mita.pgw.jp.             IN      A

;; ANSWER SECTION:
sunao-mita.pgw.jp.      86400   IN      A       192.168.xx.22

;; AUTHORITY SECTION:
sunao-mita.pgw.jp.      86400   IN      NS      dns.sunao-mita.pgw.jp.
sunao-mita.pgw.jp.      86400   IN      NS      gate.sunao-mita.pgw.jp.
sunao-mita.pgw.jp.      86400   IN      NS      dns2.sunao-mita.pgw.jp.

;; ADDITIONAL SECTION:
dns.sunao-mita.pgw.jp.  86400   IN      A       192.168.xx.22
dns.sunao-mita.pgw.jp.  86400   IN      AAAA    2400:yyy:zz:df00:225:31ff:fe00:nn
dns2.sunao-mita.pgw.jp. 86400   IN      A       192.168.xx.21
dns2.sunao-mita.pgw.jp. 86400   IN      AAAA    2400:yyy:5140:df00:ff57:63d2:5835:2889
gate.sunao-mita.pgw.jp. 86400   IN      A       192.168.xx.1

;; Query time: 2 msec
;; SERVER: ::1#53(::1)
;; WHEN: Tue Nov 14 10:28:22 JST 2017
;; MSG SIZE  rcvd: 222

# dig @localhost -x 192.168.xx.21    ...内部サーバーの逆引き

; <<>> DiG 9.10.3-P4-Raspbian <<>> @localhost -x 192.168.11.21
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35385
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;21.xx.168.192.in-addr.arpa.    IN      PTR

;; ANSWER SECTION:
21.xx.168.192.in-addr.arpa. 86400 IN    PTR     rpi1-com2.sunao-mita.pgw.jp.

;; AUTHORITY SECTION:
xx.168.192.in-addr.arpa. 86400  IN      NS      dns.sunao-mita.pgw.jp.
xx.168.192.in-addr.arpa. 86400  IN      NS      dns2.sunao-mita.pgw.jp.

;; ADDITIONAL SECTION:
dns.sunao-mita.pgw.jp.  86400   IN      A       192.168.xx.22
dns.sunao-mita.pgw.jp.  86400   IN      AAAA    2400:yyy:zz:df00:225:31ff:fe00:nn
dns2.sunao-mita.pgw.jp. 86400   IN      A       192.168.xx.21
dns2.sunao-mita.pgw.jp. 86400   IN      AAAA    2400:yyy:zz:df00:ff57:63d2:5835:nn

;; Query time: 2 msec
;; SERVER: ::1#53(::1)
;; WHEN: Tue Nov 14 10:29:13 JST 2017
;; MSG SIZE  rcvd: 221

# dig @localhost -x 2400:yyy:zz:df00:ff57:63d2:5835:nn ...ipv6逆引き

; <<>> DiG 9.10.3-P4-Raspbian <<>> @localhost -x 2400:yyy:zz:df00:ff57:63d2:5835:nn
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57012
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;n.n.8.2.5.3.8.5.2.d.3.6.7.5.f.f.0.0.f.d.z.z.1.5.y.y.y.2.0.0.4.2.ip6.arpa. IN PTR

;; ANSWER SECTION:
n.n.8.2.5.3.8.5.2.d.3.6.7.5.f.f.0.0.f.d.z.z.1.5.y.y.y.2.0.0.4.2.ip6.arpa. 86400 IN PTR rpi1-com2.sunao-mita.pgw.jp.
n.n.8.2.5.3.8.5.2.d.3.6.7.5.f.f.0.0.f.d.z.z.1.5.y.y.y.2.0.0.4.2.ip6.arpa. 86400 IN PTR dns2.sunao-mita.pgw.jp.

;; AUTHORITY SECTION:
n.n.f.d.z.z.1.5.y.y.y.2.0.0.4.2.ip6.arpa. 86400 IN NS dns.sunao-mita.pgw.jp.
n.n.f.d.z.z.1.5.y.y.y.2.0.0.4.2.ip6.arpa. 86400 IN NS dns2.sunao-mita.pgw.jp.

;; ADDITIONAL SECTION:
dns.sunao-mita.pgw.jp.  86400   IN      A       192.168.xx.22
dns.sunao-mita.pgw.jp.  86400   IN      AAAA    2400:yyy:zz:df00:225:31ff:fe00:nn
dns2.sunao-mita.pgw.jp. 86400   IN      A       192.168.xx.21
dns2.sunao-mita.pgw.jp. 86400   IN      AAAA    2400:yyy:zz:df00:ff57:63d2:5835:nn

;; Query time: 2 msec
;; SERVER: ::1#53(::1)
;; WHEN: Tue Nov 14 10:29:53 JST 2017
;; MSG SIZE  rcvd: 281

# dig @localhost rpi1-com2.sunao-mita.pgw.jp  ...ローカルサーバー

; <<>> DiG 9.10.3-P4-Raspbian <<>> @localhost rpi1-com2.sunao-mita.pgw.jp
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16729
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 6

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;rpi1-com2.sunao-mita.pgw.jp.   IN      A

;; ANSWER SECTION:
rpi1-com2.sunao-mita.pgw.jp. 86400 IN   A       192.168.xx.21

;; AUTHORITY SECTION:
sunao-mita.pgw.jp.      86400   IN      NS      dns.sunao-mita.pgw.jp.
sunao-mita.pgw.jp.      86400   IN      NS      gate.sunao-mita.pgw.jp.
sunao-mita.pgw.jp.      86400   IN      NS      dns2.sunao-mita.pgw.jp.

;; ADDITIONAL SECTION:
dns.sunao-mita.pgw.jp.  86400   IN      A       192.168.xx.22
dns.sunao-mita.pgw.jp.  86400   IN      AAAA    2400:yyy:zz:df00:225:31ff:fe00:nn
dns2.sunao-mita.pgw.jp. 86400   IN      A       192.168.xx.21
dns2.sunao-mita.pgw.jp. 86400   IN      AAAA    2400:yyy:zz:df00:ff57:63d2:5835:nn
gate.sunao-mita.pgw.jp. 86400   IN      A       192.168.xx.1

;; Query time: 2 msec
;; SERVER: ::1#53(::1)
;; WHEN: Tue Nov 14 10:50:53 JST 2017
;; MSG SIZE  rcvd: 232

設定の記述方法に関しては全く自信がないので、まぐれというか引けてラッキーといった感じです。検索実行のサーバー指定に @localhost ですが、 ;; SERVER: ::1#53(::1)  となっていて ipv6アドレスになっているのですね。一応引けるということで次の設定に移ります。



次は色々なレポートをメール経由で上げてくれる postfix 必須のメール転送エージェント機能です。これも既に動作している設定をコピーして利用しようと思います。

とりあえず nifty にメール転送させるための認証ファイルと main.cf をコピーして内容の見直しが必要です。それと、動作検証には mailコマンドを利用するので mailutils のインストールも必要です。

ほとんど内容をコピーして設定したのですが、テストすると理由がわかりませんが、リレー先の nifty.com に送ったつもりのテストメールが添付されているエラーメールが私の @niftyへ転送されているようです。

From: MAILER-DAEMON@rpi1-com2.sunao-mita.pgw.jp (Mail Delivery System)
To: root@rpi1-com2
Subject: Undelivered Mail Returned to Sender
Date: Tue, 14 Nov 2017 16:17:17 +0900 (JST)

This is the mail system at host rpi1-com2.sunao-mita.pgw.jp.

I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.

For further assistance, please send mail to postmaster.

If you do so, please include this problem report. You can
delete your own text from the attached returned message.

The mail system

<sunao.mita@nifty.com> (expanded from <sunao@rpi1-com2>): host
smtp.nifty.com[210.131.2.36] said: 553 5.3.0 <root@rpi1-com2>...
Insufficient Address:rpi1-com2 (in reply to MAIL FROM command)

原因がわかりません。しばらくそのまま放置しておくことにします。
ログのレポートを毎日送付する logwatch をとりあえずインストールしておきます。

logwatch のレポートは、1日1回決まった時間に作成されてメールしてきます。こちらは、手動のメール機能の mailコマンドのようにエラーはなく、過去の動作と同じように正常に送られているようです。

From: root@rpi1-com2.sunao-mita.pgw.jp
To: root@rpi1-com2.sunao-mita.pgw.jp
Subject: Logwatch for rpi1-com2 (Linux)
Date: Sat, 18 Nov 2017 06:26:11 +0900 (JST)

################### Logwatch 7.4.3 (12/07/16) ####################
Processing Initiated: Sat Nov 18 06:26:10 2017
Date Range Processed: yesterday
( 2017-Nov-17 )
Period is day.
Detail Level of Output: 0
Type of Output/Format: mail / text
Logfiles for Host: rpi1-com2
##################################################################

問題が postfix 側の設定なのか、 mialutils.mail の設定なのかはわかりませんが、資料やマニュアルが最新バージョンに近付けば近付くほど英語のものしか無く、私の語学力では太刀打ちできません。 logwatch のレポートは送られているので大勢に影響はないので、しばらくそのままにして見守るしかありません。

追加で今すぐ確認できるのは、 cron で自動実行した場合に結果が転送されるのか、されないのかだろうと思います。単純なコマンドを sunaoユーザーで crontab -e コマンドで時間を指定して追加して実行させてみます。実行させるコマンドは、(pwd; ls -al;) としてみました。

次が受け取ったメールです。何の問題もなくコマンド実行の結果をメールで受け取ることが出来ました。 cron のレポートでも問題なさそうです

From: root@rpi1-com2.sunao-mita.pgw.jp (Cron Daemon)
To: sunao@rpi1-com2.sunao-mita.pgw.jp
Subject: Cron <sunao@rpi1-com2> (pwd;ls -al;)
Date: Sun, 19 Nov 2017 11:40:01 +0900 (JST)

/home/sunao
合計 40
drwxr-xr-x 3 sunao sunao 4096 11月 19 11:34 .
drwxr-xr-x 5 root root 4096 11月 11 10:47 ..
-rw------- 1 sunao sunao 1324 11月 15 23:10 .bash_history
-rw-r--r-- 1 sunao sunao 220 9月 7 23:59 .bash_logout
-rw-r--r-- 1 sunao sunao 3523 9月 7 23:59 .bashrc
-rw-r--r-- 1 sunao sunao 675 9月 7 23:59 .profile
-rw-r--r-- 1 sunao sunao 75 11月 19 11:32 .selected_editor
drwx------ 2 sunao sunao 4096 11月 10 21:40 .ssh
-rw------- 1 sunao sunao 2429 11月 19 11:34 .viminfo
-rw-r--r-- 1 sunao sunao 14 11月 12 21:49 .vimrc

mail コマンドの時には、単にサーバー名が省略で短縮されているので、エラーになっているような気もしますが、対策方法がわかりません。

ラズパイ1B で共有サーバーの構築 (3/)

  1. 過去の蓄積データを継続利用は無理らしい。心機一転パーティション分割見直し
  2. 作成に時間の掛かるデータを前準備で作成しておく
  3. 運用に必要な機能を確認しながら、順次インストールして設定する

今回の共有サーバーに利用する USBハードディスクは、過去に日経 Linux の懸賞で当たった小型のARMサーバー(GLOBALSCALE Guru server model: 003-GP0001)と組合せて利用していたものです。そのサーバーは USBポートを2つ持ち、製品に添付されていた USBメモリには、2つのパーティションが作成されていて、 /boot パーティションと、システムとなるルートパーティションでした。

その USBメモリを単純にコピーして、容量が大きなハードディスクに移行して運用していたのが、今回利用することになった USBハードディスクです。以前は他に立てた共有サーバーのデータを夜中に自動バックアップする仕様で利用していました。そのような訳で、データがそのまま利用できればベストでしたが残念ながらダメでした。

懸賞のARMサーバーは、色々と追加セットアップもして数年間は無事に運用できていたのですが、ある時に不安定なログを残しながら、気が付いた時には天国に召されてしまいました。振り返ってみると想像以上に加熱するサーバーでした。夏が来る度に持ちこたえるのだろうかと見守っていましたが、昨年の夏が過ぎて秋になって力尽きたようです。

原因は私の利用法に原因があったのかとも考えています。小さな筐体の中に電源も含有している構造で、常時バスパワーで 2.5インチ 1TB のハードディスクを稼働させていたことに問題があったのかと思います。筐体をまだ分解していませんが、最後は電源が切れたままピクリともしない状況になりました。中には電源系で焼き切れたパーツがあるのかもしれません。

OSも Debian ARM版の古い状態で稼働していたため、セキュリティアップデートや ipv6 が機能していなかったりと気になっていて、時間を見ながらメンテしようと考えた矢先でした。この手の組込み Linux 用の ARM機器は、最新のDebian が公開されているので、Pogoplug 同様に最新に置き換えることは可能です。

また、製品のコンセプトから外付けメディアにセットアップした OSを簡単にブートさせられるように考慮されているので、x86系命令セットの一般的なインテルや AMD のパソコンとは機械命令が異なる ARM プロセッサ(セットアップ中のラズパイもARMで、少しアレンジの Debian) ですが、何の支障もなく最新の Linux が組込めます。


そのような理由から再利用のハードディスクは既にパーティション分割されています。データ部分の内容を再確認するとデータ全域のバックアップはしていなかった運用のようなので、データ部分のパーティションを再割り振りして心機一転作り直すことにしました。

少し前からバックアップサーバーとして稼働させているラズパイ2のディスク構成を参考にして、再割り振りエリアを3つのパーティションに分けました。 /home 用に 100GB を取り、残りをデータ用に 370GB と 480GB に分けました。

データ部分のコピーは現在実行中ですが、元々非力な処理能力のラズパイが持つイーサーネットの転送速度は、100Mb/S ですから全転送には、時間単位というか日数単位が必要になるでしょう。

データの転送が終わりました。正確に時間の測定はしていませんが、合わせて 400GB のデータの転送に、丸1日半位掛かっていたようです。


これからは必要になると思われる機能のインストールに取り掛かります。

共有サーバーの samba メール転送機能の postfix と apache2 bind9 dnsutils ruby webalizer screen byobu ゆっくり考えないと思い付きませんが、過去の記録を見直しながら設定していきます。漏れていて気が付いたら追加でインストールしていく程度のゆるい対応で進めます。postfix は、インストール途中でどのような使い方をしたいのかのダイヤログボックスが開きますが、何も設定しないまま進め後で考えながら見直します。

$ sudo apt update
$ sudo apt install samba apache2 ruby postfix webalizer screen byobu bind9 dnsutils

ラズパイ1B で共有サーバーの構築 (2/)

  1. 秘密鍵、公開鍵ペアの扱いに関して
  2. エディタ vim インストールと、マウス操作が変わったことの対処
  3. piユーザーを既設サーバーと同じユーザー名に置き換える
  4. サーバーとしての利用なので、IPアドレスの固定化

ラズパイ1Bのこれからの作業は、sshによるリモートの作業になります。ホスト名を含めて raspi-config で設定しているので日本語化も行われています。

現在のバージョンを次に記録しておきます。

$ ssh pi@192.168.xx.yy
pi@192.168.xx.yy's password: 
Linux rpi1-com2 4.9.59+ #1047 Sun Oct 29 11:47:10 GMT 2017 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Nov  9 23:43:13 2017 from 192.168.xx.zz
pi@rpi1-com2:~ $ date
2017年 11月 10日 金曜日 15:02:59 JST
pi@rpi1-com2:~ $ uname -a
Linux rpi1-com2 4.9.59+ #1047 Sun Oct 29 11:47:10 GMT 2017 armv6l GNU/Linux
pi@rpi1-com2:~ $ 

鍵認証に関しては、ログイン先となるサーバーのログインユーザーの /home/<user> ディレクトリ内に .ssh デイレクトリを作成して、ログイン元となる操作側PCの秘密鍵と公開鍵ペア公開鍵authorized_keys ファイルにコピーします。実際の作業的には、普段 sshログインして作業している他のサーバー内に、既に作成されている実績のある authorized_keys ファイルをコピーして利用しています。.sshディレクトリと authorized_keys ファイルの実行権限はそれぞれ 700 と 600 に設定しておきます。

他のサーバーとの間で、cron / rsync 利用の自動転送によるバックアップを行わせるために、セキュリティ上問題だと一部で言われることですが、各サーバー間のrootユーザーでの作業を行わせるために、パスフレーズ無しでお互いに ssh ログインが出来る設定を行います。

他のサーバーの秘密鍵をコピーしても利用できますが、ラズパイ の root で操作して、鍵ペアを次のような操作で生成させます。

$ sudo su -
# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:t8RpcOYT6......42uv5updog root@rpi1-com2
The key's randomart image is:
+---[RSA 2048]----+
| . ...           |
|o .   . .        |

|   o + ..+o      |
+----[SHA256]-----+
# ls -al .ssh
合計 16
drwx------ 2 root root 4096 11月 10 20:25 .
drwx------ 3 root root 4096 11月 10 20:25 ..
-rw------- 1 root root 1675 11月 10 20:25 id_rsa         … 秘密鍵
-rw-r--r-- 1 root root  396 11月 10 20:25 id_rsa.pub     … 公開鍵

ここで生成された鍵ペアは、このラズパイ1Bの rootユーザーから、他のサーバーに sshでログインする場合に、相手サーバー側でログインするユーザー(機械的に自動接続するなら root) に、ここで生成されている公開鍵を .ssh/authorized_keys ファイルに追加でコピーします。

後は同様に、他のサーバーへのログインや、他のサーバーからのログインに対応するように、お互いの公開鍵をサーバー間で、 .ssh/authorized_keys ファイルにコピーしておきます。

セキュリティが甘くなるとの意見もありますが、他から sshログインして利用している実績のあるサーバーが既に存在して稼働しているなら、そのサーバー内にある .ssh/authorized_keys ファイルを丸ごとコピーして入れ込むのも手っ取り早いと思われます。

ある程度リモートログインに実績が出来て、問題が無いようならセキュリティ向上のため、鍵認証だけの設定にして、パスワード認証によるチャレンジを出来ないように変更しておきます。インターネット上に晒すと想像できないくらいの数のパスワードで、絶え間ないチャレンジをされることになります。


操作性が悪いので常用するエディタの機能性を上げるために、vim エディタのフルセットをインストールします。

$ sudo apt install vim

シンタックスのカラーリングを有効にしておきます。
26行1桁目のコメント を取り除きます。

$ sudo vi /etc/vim/vimrc
......  ......
" Vim5 and later versions support syntax highlighting. Uncommenting the next
" line enables syntax highlighting by default.
syntax on

" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
....  ....

ここまでの色々な編集作業で気になっていたのが、昔はエディタの vi で切り貼り編集をしている時に、マウス多用で普通に操作して楽に編集していたのですが、いつの頃からかマウスでの範囲選択やホイールボタンを押下しての貼付けを期待しているのに、 — ビジュアル — と下部に表示されて、期待していた操作が妨害されてしまいます。

vi の操作中に、仮想端末で表示されている文字列をコピーして貼り付ければ簡単に済む操作なのに、一文字づつ打鍵するわけにも行かず調べてみました。 既に vi エディタを操作中なら、コロン(:) の後にコマンド set mouse-=a を入力で無効に出来るらしいとのこと、この呪文の意味はわかりませんがとても助かりました。

vim エディタの通常利用で常にマウス操作のビジュアル移行を回避するには、操作するユーザーの ~/.vimrc を新規作成し、前述の呪文を記述して対応できるようです。

$ sudo vi ~/.vimrc
set mouse-=a
~
$ vi ~/.vimrc
set mouse-=a
~

Raspbian は、操作を全て pi ユーザーの UID : 1000 に統一して、構成されています。色々なディストリビューションが一般的に最初のユーザー登録で、UID : 1000 から登録されますので、例えば既に稼働しているサーバーは sunao ユーザーを UID : 1000 に登録して運用しています。

何が問題かというと、大量に管理しているデータを、各サーバー間で自動転送して、バックアップしながら管理している事を考えたとき、 rsync で単純にコピーすると各ファイルのオーナーは UID の番号で管理されているので、同じ UID なのにサーバーが変わるとファイルの所有者名が異なって扱われてしまう事になります。

ネット共有ディスク samba の扱いでも同様に、ファイル所有者 UID の扱いが問題として発生します。そこで、新規にサーバーを構築している初期の段階で、ユーザーファイルを vipwコマンドで編集を行い pi ユーザー名の箇所を sunao ユーザー名に変更します。

sunaoユーザーの追加に伴い、/home/sunao ディレクトリが必要になるので、/home/pi からコピーして創生しておきます。

変更が必要なコマンドは、vipw / vipw -s / vigr / vigr -s で修正しますが、必要に応じて適宜文字列置換で :pi から :sunao への変更も行います。その後適切に /home/pi 及び /home/sunao 以下のオーナーとグループの変更が必要です。

 sunao – uid:1000 / sunao – gid:1000
 pi – uid:1001 / pi – gid:1001

と変更してみました。


サーバーとして利用するので IPアドレスが変化すると色々と困ることが起こるので、固定アドレスに移行します。

昔は Debianの一般的な作法を参考にして、別な方法で設定していたような気がしますが、次のように定義を追加すると出来るようです。なお、DNSサーバーの指定は ipv4 / ipv6 のアドレスも含めて出来るみたいです。いつもお世話になっている Google検索のネット情報です。

$ sudo vi /etc/dhcpcd.conf
         ...最後尾に追加します
interface eth0
static ip_address=192.168.xx.yy/24
static routers=192.168.xx.1
static domain_name_servers=192.168.xx.22 2400::::225::fe00:9df0

そして再立ち上げ後に IPアドレスが変更されます。

仕切り直して、ラズパイ1Bで 共有サーバーの構築(1/)

  1. 現状の環境確認と作業方針の検討
  2. 最新 raspbian の最小構成を 4GB の SD へ導入
  3. USBハードディスクの組込みと最低限の設定作業と立上げ確認

ラズパイ3で運用していた ホーム内共有サーバーが停止してから長い時間が経ちました。有れば自然で無意識に利用できていた環境も、不便ながらも何とかなっているわけで、がむしゃらに復旧させる気もなく今日に至っています。

それには頭の中で何かが引っかかっているようなしっくりしない物を感じていて、それがずっと気になっているために積極的になれなかったことが大きいと思います。その前から利用していたサーバーは、何年もの長期に渡りずっと安定して利用していました。今でも立ち上げたままになっていて動作は今でも継続しています。

でも何でそのサーバーが一線から退いたかというと、古いDebian OS で稼働していて、セキュリティアップデートは対象外になっています。一時はWebの公開用サーバーとして稼働していて、利用している期間も長かったのですが、ipv6で動作させられない決定的な問題をはらんでいました。ただ、ハード構成がRAID1のミラーで、2.5インチハードディスクで構成されていて信頼性が高いのが利点でした。ゆくゆくは最新のDebian OS に置き換えられればとの願いがあります。

そこで代替として、公開用Webサーバーには、Pogoplug E02 アメリカ仕様のピンク色の機種に、Debian OS を入れて稼働させました。昔の写真を見ると 2011.06 頃に奮闘していたことが記録にあって懐かしいです。このサーバーは、当然ですが ipv6 でも動作しています。非力で遅いですが今でもセキュリティアップデートが継続して行えて現役で稼働しています。

それと並行して共有サーバーの代替としてセットアップされたのが、ラズパイ3 だったのですが、勝手にセルフアップデートして立ち上がらなくなってしまったわけです。その中でも軽微な何度かは修復できたのですが、最後のアッフ゜デートが行われた時は大幅に変更されたらしく、修正が手に負えず、初期からのセットアップに至ったわけです。

その後の最初からのセットアップでも dd コマンドに依るコピー問題に起因する障害が見付かり、あまりにも信頼出来ないと判断するに至りました。共有サーバーには不要なデスクトップ環境に起因して問題が発生しているような気がするので、今回は最小構成で作成されている Raspbian の最新版を利用し、以前稼働していてしばらくお蔵入りだった古く非力なラズパイ1 B を現役復帰させることにしました。

ラズパイも注目を浴びるようになってからの進化が著しく、古い昔の機種を見ると当初はこんな作りだったのかと驚きます。何せ microSD ではなく、フルサイズの SD カードが使われていて、USBポートも 2個しか無く、IOポートも 26ピンしかありません。単なる共有サーバーやバックアップサーバーの用途だけなら IOポートに何かを繋ぐ必要もなく特に問題ないでしょう。

セットアップは、4GB の SD に /boot パーティションと、システム本体が含まれる / パーティションの 2ファイルが含まれる単純なもので、NOOBS を利用しないで直接書き込みます。

ここからの操作は、 Linux がインストールされている作業用のパソコン上で操作しています。

Raspberry pi のサイトから raspbian の最小構成をダウンロードして、チェックサムを確認して解凍しました。

$ cat /home/sunao/download/2017-09-07-raspbian-stretch-lite.zip | shasum -a 256
bd2c04b94154c9804cc1f3069d15e984c927b750056dd86b9d86a0ad4be97f12  -
$ unzip /home/sunao/download/2017-09-07-raspbian-stretch-lite.zip
Archive:  /home/sunao/download/2017-09-07-raspbian-stretch-lite.zip
inflating: 2017-09-07-raspbian-stretch-lite.img

そのままメディアに dd しても構わないと思いますが、オプション conv=fsync を追加して一旦ファイルに書き出しました。

$ dd if=2017-09-07-raspbian-stretch-lite.img of=raspbian-chg-lite.img conv=fsync

$ sudo dd if=/home/sunao/raspbian-chg-lite.img of=/dev/mmcblk0 bs=1024
1811124+0 レコード入力
1811124+0 レコード出力
1854590976 bytes (1.9 GB, 1.7 GiB) copied, 834.275 s, 2.2 MB/s

それをメディア SD にそのまま dd コピーして、ラズパイ1 B に挿入しました。後は初期立上げ動作のためにキーボード、マウス、テレビモニタ用HDMIケーブルネットワーク用のUTPケーブル拡張USBハブの追加です。本来はマウスを利用することもないので不要ですが一応取付けました。USBハブも初期の立上げだけなら必要がないのですが、USBハードディスクを取付けて運用させることを考えているので、ラズパイ本体とハードディスクの電源供給用に利用します。

ここからはシステムメディアを挿入して、周辺機器を接続したラズパイの立上げです。

電源投入すると、モニタに文字列が流れるように表示されて、しばらくするとログインプロンプトで入力待ちになります。初期ユーザーが pi で、パスワードが raspberry になっているのでそのままログインします。

最新の状態にするために aptコマンドを使います。更新対象のモジュールは少なかったのですが、ラズパイのラインナップ毎に対応させたデバイスドライバ等のDTBファイルが多数あるらしく、それを移動するのか削除しているのか不明ですが、その操作で大きな時間を使っているようでした。

そして、raspi-config を立上げて、タイムゾーンロケーションキーボードの設定等の目に付く項目の設定を一通り行い、リモート操作のために ssh を有効にする変更を加えてから再起動しました。

何と期待していた再起動が出来ずに、電源の赤いLEDの点灯だけになってしまいました。

早速SDを作業用のノートパソコンに移して確認すると、IOエラーが出ているようで、その後システムの再書込も行えない状況でした。容量の小さなSDメディアを無理やり利用しているので、オーバーフローしたのかとも思いましたが、うぅ〜ん〜よくわかりません。

$ sudo fdisk -l /dev/mmcblk0
fdisk: /dev/mmcblk0 を open できません: 入力/出力エラーです
$ sudo dd if=raspbian-chg-lite.img of=/dev/mmcblk0 conv=fsync bs=1024
dd: '/dev/mmcblk0' の書き込みエラー: 入力/出力エラーです
1+0 レコード入力
0+0 レコード出力
0 bytes copied, 0.0197685 s, 0.0 kB/s

メディアの不良とか原因は色々と考えられますが、フルサイズSDと言っても、microSDにアダプタを使っているだけなので、接触している接点が沢山あって接触不良も一原因としては考えられます。抜き差しして触っていると正常にマウントされることもあり、Raspbian システムの再書込も無事に出来ました。メディアは、Kingston 4GB microSD ですが、気になるので別のアダプタに変更してフルサイズSDにしてみました。

$ sudo dd if=/home/sunao/raspbian-chg-lite.img of=/dev/mmcblk0 bs=1024
1811124+0 レコード入力
1811124+0 レコード出力
1854590976 bytes (1.9 GB, 1.7 GiB) copied, 1043.24 s, 1.8 MB/s

初期立上げ状態のシステムメディアが欲しいので、再びラズパイの操作です。

SDメディアをラズパイに挿入して、単純な立上げとシャットダウンだけを実行して直後のメディアを取り出します。

これからはメディアを作業用のパソコンに戻しての作業です。

一応保険として初期立上げ後のシステムメディアをバックアップしておきます。1度立上げると自動的に初期化作業としてメディア一杯にパーティションが拡張されるようです。

$ sudo dd if=/dev/mmcblk0 of=/home/sunao/raspbian-chg-lite-run.img bs=1024
3776512+0 レコード入力
3776512+0 レコード出力
3867148288 bytes (3.9 GB, 3.6 GiB) copied, 367.543 s, 10.5 MB/s

セットアップする作業は障害で中断しても同じことの繰り返しになりますが、最終的にはルートファイルシステムが USBハードディスクになるわけで、あまり信用していないSDメディアなので早めに移行することを考えました。SD内のルートファイルシステム mmcblk0p2 をハードディスク(作業時は /dev/sdb2) にコピーして、それからゆっくり考えながらセットアップを始めることにします。

まずは、ルートファイルシステムのコピーと、立上げ後にルートとしてマウントされるように、 /etc/fstab を書き換えます。

$ sudo su -
# mount /dev/sdb2 /mnt/sdb2
# mount /dev/mmcblk0p2 /mnt/work
# rsync -a /mnt/work/ /mnt/sdb2/
# vi /mnt/sdb2/etc/fstab
proc /proc proc defaults 0 0
PARTUUID=3c158d9c-01 /boot vfat defaults 0 2
/dev/sda2 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
~  
# umount /mnt/work

USBハードディスクから読み込ませるには、もうひとつの書き換えが必要で、SDメディアのブート情報 cmdline.txt を書き換えます。

# mount /dev/mmcblk0p1 /mnt/work
# ls /mnt/work
COPYING.linux           bcm2708-rpi-b.dtb    bootcode.bin  fixup_db.dat  overlays
LICENCE.broadcom        bcm2708-rpi-cm.dtb   cmdline.txt   fixup_x.dat   start.elf
LICENSE.oracle          bcm2709-rpi-2-b.dtb  config.txt    issue.txt     start_cd.elf
bcm2708-rpi-0-w.dtb     bcm2710-rpi-3-b.dtb  fixup.dat     kernel.img    start_db.elf
bcm2708-rpi-b-plus.dtb  bcm2710-rpi-cm3.dtb  fixup_cd.dat  kernel7.img   start_x.elf

# vi /mnt/work/cmdline.txt

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

# umount /mnt/work

実は一度 SDメディアと USBハードディスクをラズパイに取付けて、起動させたらモニタに二行の表示が行われただけで進行が停止してしまいました。

原因は単純ミスでした。作業しているノートパソコンでは、2つ目のハードディスクになるので、該当パーティションが /dev/sdb2 として割り振られますが、ラズパイに装着した時の割り振りは、最初のハードディスクになるので当然ですが、 /dev/sda2 になります。頭が居眠りしているちょっと恥ずかしい笑っちゃうようなミスでした。

ここからは、いよいよラズパイでの本格的な作業になります。

ラズパイの電源投入で無事に立上げ出来ましたので、先にも書いている sudo apt update / sudo apt upgrade で、最新版への更新と sudo raspi-config による各種環境設定の変更を行いました。この中でsshの有効化を行っています。そしてロケールの変更により直接のコンソール作業では文字化けになりますが、sshによるリモート作業では文字化けもありえないので、こちらで作業を続けたいと思います。

$ sudo apt update
   .... 更新対象のモジュールがリストされます

$ sudo apt -y upgrade
   .... リストされた対象が順次更新されます

(再)ラズパイ3のセットアップ 〜完全な挫折です

セットアップ途中での挫折で、最初からの仕切り直しになりました。

勝手にシステムのアップデートが行われて動作不能になるラズパイ3ですが、再起のため最新の Raspbian OSを入れるところからのセットアップの途中で、Sambaの設定でも変な動きをして共有が正常に動作させられなかったり、WebサーバーのApache2が変な動きをしたり、リモートでのメンテナンスでは必須のsshの設定でも、意図して設定しているはずの動きとは異なるような認証動作が行われていました。

究極の問題は、apt コマンドで、最新のモジュールに入れ替えたり、新しいプログラムをインストールできない問題に直面してしまい、色々と調べたり回避策を模索していて時間が取れなくなって仕方なくしばらく中断していました。

changelog を読んでいます... 完了
パッケージからテンプレートを展開しています: 100%
パッケージを事前設定しています ...
dpkg: unrecoverable fatal error, aborting:
パッケージ 'vim-runtime' のファイル一覧ファイルに最後の改行がありません
E: Sub-process /usr/bin/dpkg returned an error code (2)

 

やっと触れる時間ができたので、google検索をしてみると、同様の内容と思われる記事が多数アップされています。⇒日本語で対策を教えてくれているサイト

今回は、単純に昔からの方法での dd コマンドでイメージコピーしただけなのですが、初めて見たようなオプション “conv=fsync” を追加してコピーしないと意図しない結果になるようです。最近公開されている Raspbian OS についてらしいです。

今のままの不安定な状態から個別にリカバリーしても気が遠くなる作業が続いて、収束の見通しが建てられないようなので、仕方ないので最新の OS ダウンロードからやり直すことにします。

今回はセットアップ途中での挫折です。仕切り直しですね、完全な玉砕です。

(再)ラズパイ3 のセットアップ(2-4)

  1.  vimエディタの環境整備を行います
  2. リモートログイン関連の整備を行います
  3. 元々の piユーザーの pid : gid / 1000:1000 を sunao に完全入れ替え

vimエディタのフルセットをインストールします。

$ sudo apt install vim

シンタックスカラーリングを有効にしておきます。
26行1桁目のコメント を取り除きます。

$ sudo vi /etc/vim/vimrc
......  ......
" Vim5 and later versions support syntax highlighting. Uncommenting the next
" line enables syntax highlighting by default.
syntax on

" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
....  ....

次にリモートログイン関連の整備を行います。

常用しているノートパソコンからの ssh リモートログインのために公開鍵を設定します。

方法は、リモートで操作されるサーバーであるラズパイ3 の sunaoユーザー (piからsunaoに書き換えてます) の .ssh/authorized_keyの中に、リモートで操作する側(常用しているノートパソコン)の常用ユーザー (sunao)の公開鍵を追加します。

$ cat .ssh/id_rsa.pub   ……常用しているノートパソコン側
ssh-rsa AAAAB3NzaC1......AABAQDGfuahG9gbZlZk.........UfIO4hqf7uQJif/c1FPGwQYkGT7VAiksrtyBTOSEe/iWLfeVwjlS..........AkyAVJZKp0p/g+zO............9yF5+b6K9KP+mEXC.......w7HDsaif user@note-PC

追加する方法には色々な方法が考えられますが、文字列をコピーして viエディタで単純に追加編集する方法を示します。

$ vi .ssh/authorized_key    ……操作される側のラズパイ3 
......    ......
ssh-rsa AAAAB3NzaC1......AABAQDGfuahG9gbZlZk.........UfIO4hqf7uQJif/c1FPGwQYkGT7VAiksrtyBTOSEe/iWLfeVwjlS..........AkyAVJZKp0p/g+zO............9yF5+b6K9KP+mEXC.......w7HDsaif user@note-PC
....  ..   .....

そして次に動作検証を行います。

公開鍵が追加できたなら、公開鍵と秘密鍵で認証が行われることを確認します。

$ ssh sunao@192.168.xx.xx
sunao@Rpi3-com1:~ $

sshでの公開鍵認証ができたなら、ネット上からのアタックでパスワード認証での不正ログインを防ぐために、パスワード認証を禁止します。

$ sudo vi /etc/ssh/sshd_config
....  ..  .....

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

実際には登録していないユーザー名を指定して認証させるような操作で、公開鍵と秘密鍵のペアでなければ接続できないことを確認します。

公開鍵が登録されていないと言った意味のエラーが返ります。(publickey)

$ ssh webadm@192.168.xx.xx
 Permission denied (publickey)

ユーザー名の変更を中途半端にしておくと、動きが少しおかしいような気がするので、ホームディレクトリやグループ名も含めて完全に入れ替えて、新たに piユーザーを追加しました。

パスワードファイルやグループファイルの修正に利用するコマンドは、vipw vigr を使います。

(再)ラズパイ3 のセットアップ(2-3)

  1. 以前から稼働しているサーバーと同じユーザー名 =UID で操作を統一したい
  2. Raspbian を microSD から元々の USBハードディスクに移行する
  3. できるだけ過去の蓄積データを継続で利用したい

モニタの 3.5インチLCDディスプレイがセットアップできているので、最低限のパッケージの導入から進めようと考えています。

なんてったって最大の問題は、勝手にアップデートされてしまい、壊れてしまうことです。一般的な Linux ってインタフェースが変更になるような大きなパッケージ更新については、意識してアップグレードしない限り実行されないと思ってました。色々なディストリビューションとの長い歴史の中での経験則ですが、Raspberry pi の Raspbian に関しては経験が活きない異端児なのかもしれませんね。

デスクトップとしてセットアップして、サーバーとして使うことが想定外の使い方なのでしょうね。うぅ〜ん困ったものです。何を行えば勝手な更新が止められるのか不明です。

壊れても短時間で復旧させられるように、情報を整理してまとめておいて、機械的な流れで復旧作業できる環境を作っておく必要がありそうです。


Raspbian は、操作を全て pi ユーザーの UID : 1000 に統一して、構成されています。色々なディストリビューションが一般的に最初のユーザー登録で、UID : 1000 から登録されますので、例えば既に稼働しているサーバーは sunao ユーザーを UID : 1000 に登録して運用しています。

何が問題かというと、大量に管理しているデータを、各サーバー間で自動転送して、バックアップしながら管理している事を考えたとき、 rsync で単純にコピーすると各ファイルのオーナーは UID の番号で管理されているので、同じ UID なのにサーバーが変わるとファイルの所有者名が異なって扱われてしまう事になります。

ネット共有ディスク samba の扱いでも同様に、ファイル所有者 UID の扱いが問題として発生します。そこで、再セットアップ中のラズパイ3 で、ユーザーファイルを vipwコマンドで編集を行い pi ユーザー名の箇所を sunao ユーザー名に変更してみました。ただし、グループファイルは、pi グループが色々な箇所で定義されているようなので、不具合が出る可能性が高く、そのままの状態です。
 sunao – uid:1000 / pi – gid:1000
 pi – uid:1001 / pi – gid:1000
と変更してみました。


次に microSD から USBディスクに移行する作業は、実機のラズパイ3 上では出来ないので、Linux が稼働しているノートパソコンで作業しています。 microSD をラズパイ3 から取り出して、USBディスクと一緒にノートパソコンに装着し、一応コピー元とコピー先のファイルに関しては、fsckコマンドでエラーがない、あるいはエラーの修復を行った後に、両方のファイルをマウントして作業しています。

microSD (8GB) に作られている Raspbianシステムを、外付けの USBディスクに移しますが、移行先は、既に利用していた USBディスクなので、パーティション構成や今まで使っていたデータ自体も入ったままになっています。移行するのは新しく再セットアップした microSD のパーティション2 から 外付け USBディスクのパーティション2 へコピーが終われば完了です。

オプションに –delete を追加した rsyncコマンドでコピーします。既に作業に使用するマウントポイントは作成されていたものとしています。

ノートパソコンに装着すると自動マウントされてしまうので、適切にアンマウントして、次のように作業します。

# mount /dev/mmcblk0p2 /mnt/work   ……microSDのパーティション2
# mount /dev/sdc2 /mnt/bkup     ……USBディスクのパーティション2
# rsync -av --delete /mnt/work/ /mnt/bkup/  ……システムのコピー
# umount /mnt/work
# umount /mnt/bkup

# mount /dev/mmcblk0p1 /mnt/work   ……USBディスクから読むための修正
# cd /mnt/work
# ls        ……bootディレクトリの確認
# vi cmdline.txt  ……次で項目で説明しているのと同じ修正を行います
# cd
# umount /mnt/work

さらに修正が必要なのは、microSD からコピーされた USBハードディスク上に記述されているパーティションのマウント情報ですが、正常に立上げが行われた時には、 /etc/fstab に対応するファイルになります。

今回の場合は、USBディスクのパーティション2 の etc ディレクトリに置かれているので、自分自身のパーティションが、ルートファイルシステム( / )としてマウントできるように、指定の記述方法は、 /dev/sda2 でも  blkid でリストされた UUID= でも PARTUUID= でも、ディスクのパーティションが識別できればマウントされるので、そのように修正します。

# mount /dev/sdc2 /mnt/work
# vi /mnt/work/etc/fstab
proc                         /proc    proc    defaults   0   0
PARTUUID=bcacf1da-01         /boot    vfat    defaults   0   2
UUID=86782691-13d8-429a-a015-3e010d6e7248  / ext4    defaults   0   1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

# umount /mnt/work 

作業していた microSD と USB外付けディスクをノートパソコンから外して、ラズパイ3 に装着して電源を入れると、USBディスクからの立上げが行われます。


ラズパイ3 が正常に立上がると、LCD のドライバとかコマンドが入っているディレクトリ(~/LCD-show)に移動して、色々な操作が出来ますが、この中に置かれている cmdline.txt のルートファイルシステム (Raspbian OS自身) の読み込み先が、 microSD カードの /dev/mmcblk0p2 のままになっているので、現在は構成が外付けの USBディスクからの立上げに変更になったので、 /dev/sda2 に変更しておかないとこれをコピーされて再起動できなくなってしまうので注意します。

$ cd LCD-show/
$ vi cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 console=ttyAMA0,115200 root=/dev/sda2 rootfstype=ext4 elevator=deadline rootwait fbcon=map:10 fbcon=font:ProFont6x11 logo.nologo
 次の作業は、USBディスクに作られている過去からの複数のデータが、立上げプロセスで自動マウントされていますので、マウントポイントを作ってからマウント情報の /etc/fstab を適切に編集して、システムの立上げでマウントできるようにします。

(再)ラズパイ3 のセットアップ(2-2)

  1. 最新 raspbian の microSD への導入
  2. 最低限の設定と確認作業
  3. 秘密鍵、公開鍵ペアの扱いに関して
  4. 3.5インチLCDディスプレイのドライバ導入

新規にセットアップを始めたラズパイ3ですが、ゆっくり時間を掛けて対応できていないので、作業がなかなかはかどりません。

セットアップしたラズパイシステムは、最新と思われるバージョンで、8GB の microSD に /boot パーティションと、システム本体が含まれる / パーティションの 2ファイルが含まれる単純なもので、NOOBS を利用しないで直接書き込みました。

$ uname -a
Linux Rpi3-com1 4.9.41-v7+ #1023 SMP Tue Aug 8 16:00:15 BST 2017 armv7l GNU/Linux

昔のバージョンでは手作業で色々な箇所を変更しましたが、最新では、デスクトップのメニューから リファレンス → 設定 で、ホスト名、ロケールの設定、それと日本語化が完了した状態です。ここでパスワードの変更も行っているので、パスワード認証による sshリモート作業も一応出来るようになっています。

そして、数日間稼働させていても問題が無いことが確認できたので、鍵認証に移行させて、必要な byobu/screen の追加とメールの設定を行います。

ファイルは書き換わっていると思いますが、一応ホスト名のファイルを確認してみました。

$ cat /etc/hostname
Rpi3-com1

こちらのファイルも最後の行が設定されていないと、エラーメッセージが出るようです。

$ cat /etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters 

127.0.1.1       Rpi3-com1

鍵認証に関しては、ログイン先となるサーバーのログインユーザーの /home/<user> ディレクトリ内に .ssh デイレクトリを作成して、ログイン元となる操作側PCの秘密鍵と公開鍵ペア公開鍵authorized_keys ファイルにコピーします。実際の作業的には、普段 sshログインして作業している他のサーバー内に、既に作成されている実績のある authorized_keys ファイルをコピーして利用しています。.sshディレクトリと authorized_keys ファイルの実行権限はそれぞれ 700 と 600 に設定しておきます。

他のサーバーとの間で、cron / rsync 利用の自動転送によるバックアップを行わせるために、セキュリティ上問題だと一部で言われることですが、各サーバー間のrootユーザーでの作業を行わせるために、パスフレーズ無しでお互いに ssh ログインが出来る設定を行います。

他のサーバーの秘密鍵をコピーしても利用できそうですが、セットアップ中のラズパイ3 の root で操作して、鍵ペアを次のような操作で生成させます。

# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:eGFZ6pD........JdP3VHgJw root@Rpi3-com1
The key's randomart image is:
+---[RSA 2048]----+
| .oo+.. oo.. o.. |
|  .++..o +o E   .|
...
             . o  |
|             .   |
+----[SHA256]-----+
# ls -al .ssh
合計 16
drwx------ 2 root root 4096  8月 23 10:14 .
drwx------ 5 root root 4096  8月 23 10:14 ..
-rw------- 1 root root 1679  8月 23 10:14 id_rsa         … 秘密鍵
-rw-r--r-- 1 root root  396  8月 23 10:14 id_rsa.pub     … 公開鍵

後は同様に、他のサーバーへのログインや、他のサーバーからのログインに対応するように、お互いの公開鍵をサーバー間で、 authorized_keys ファイルにコピーしておきます。

ある程度リモートログインに実績が出来て、問題が無いようならセキュリティ向上のため、鍵認証だけの認証にするため、パスワード認証を制限する設定に変更しておきます。


このラズパイ3 には、1年ほど前にアマゾンから購入した 3.5インチ LCD が装着されているので、最新のドライバをセットアップしておきます。購入した LCD は、『Kuman 3.5インチ ディスプレイ タッチパネル Raspberry Pi 3B 2B/B+/A+ /A/B/Zero に適用 320*480 解析度 保護ケース ヒート ¥ 3,200』 となっていた製品で、検索すると英語のページですが、ドライバのダウンロードが出来るページがあります。中国か台湾かはわかりませんが、製品本体はWaveshareという会社の製品らしく、操作性も含めて事細かく解説されています。

LCDモニタのページ 提供されている3.5インチLCDモニタのドライバと使い方

説明されたページの一部に、ドライバのダウンロードとセットアップ方法が、次のように記載されています。バージョンの違いなのか差異がわかりませんが、2種類掲示されています。

Method 1. Driver installation

Description: The drivers are not available for NOOBS or any system installed by NOOBS.

If the touch screen doesn’t work properly, please install the driver: LCD-show-170703.tar.gz, but not LCD-show-161112.tar.gz.

1. Configure your Pi:

sudo raspi-config

Set as:

  • Select Expand Filesystem.
  • Boot Option -> Desktop Autologin (may differ depending on Raspbian revision)

2. Copy the driver (choose the driver according to your OS) into your OS then Run the following commands:

tar xvf LCD-show-*.tar.gz
cd LCD-show/

Install the driver and it toggles the mode to LCD display: Note: Net work connection is required while installing driver to your Pi, or else the touch won’t work properly.

chmod +x LCD35-show
./LCD35-show

Note: this LCD won’t work after apt-get upgrade, in such cases, please edit the config.txt file in the SD card and remove this statement: dtoverlay=ads7846

3. After system rebooting, the RPi LCD is ready to use.

 

URLを右ボタンでコピーして、wget で両方をダウンロードしてみました。どちらを使うのか迷うところです。

$ wget http://www.waveshare.com/w/upload/4/4b/LCD-show-161112.tar.gz
$ wget http://www.waveshare.com/w/upload/0/00/LCD-show-170703.tar.gz
$ ls -al
-rw-r--r--  1 pi   pi   50692 12月 17  2016 LCD-show-161112.tar.gz
-rw-r--r--  1 pi   pi   53084  7月  4 16:21 LCD-show-170703.tar.gz

サイズ的には、それほど差が無いように思えますが、最新についてはインストール時にネットワークに接続されている必要があるように、追記があるのが少し気になります。

今回は最新を展開してインストールしてみます。

$ tar xvf LCD-show-170703.tar.gz
$ cd LCD-show/
$ chmod +x LCD35-show
$ ./LCD35-show

理由は不明ですが、xserver-xorg-input-evdev が新規にインストールされました。

 

勝手にリブートが行われ、画面としては小さな 3.5インチLCDをモニタとして起動されます。

説明に書かれている画面の回転を 270度回転させると、本体を縦長に縦た形状になり、USBコネクタや、有線LANのコネクタが上向きに出る構成で表示されます。

 

設定を変更する度にリブートされます。立上げ時のバナーについても問題なく LCD から表示されるようです。

タッチスクリーンについても問題なく反応しているようで、メニューからシャットダウンのダイアログを開くこともできています。

展開したモジュールのディレクトリで、./LCD35-show コマンドを実行すると設定ファイルが上書きされてリブート後に表示が LCD に切り替わります。

$ ./LCD35-show

LCDモニタの表示は 90度づつ向きを変えられるようです。ラズパイの USBポートと有線LANポートのある面を上にしての表示は、次のコマンドで縦長の配置になります。

$ cd LCD-show/
$ ./LCD35-show 270

ただ小さすぎて実際の運用には適していないと思われます。