エントリー

カテゴリー「Nano Pi NEO」の検索結果は以下のとおりです。

NanoPi NEOサーバを復旧させる

優先すべきだが予定外の事態だったので後回しになってしまった

原因を探る

サーバからmicroSDカードを取り出してバックアップ機にセットしてコンソールで調査

IMG_20220116_132241.jpg

再起動しないのでネックは何かと思っていたら,microSDカードの異常というかRO(リードオンリー)ロックになっていた

コンソール出力ではrootファイルシステムのfsckで異常となり起動せずメンテナンスモードになっている

U-Boot SPL 2021.04-armbian (May 06 2021 - 17:50:40 +0000)
DRAM: 512 MiB
Trying to boot from MMC1



Starting kernel ...

Loading, please wait...
Starting version 241
Begin: Loading essential drivers ... done.
Begin: Running /scripts/init-premount ... done.
Begin: Mounting root file system ... Begin: Running /scripts/local-top ... done.
Begin: Running /scripts/local-premount ... Scanning for Btrfs filesystems
done.
Begin: Will now check root file system ... fsck from util-linux 2.33.1
[/sbin/fsck.ext4 (1) -- /dev/mmcblk0p1] fsck.ext4 -a -C0 /dev/mmcblk0p1
fsck.ext4: Read-only file system while trying to open /dev/mmcblk0p1
Disk write-protected; use the -n option to do a read-only
check of the device.
fsck exited with status code 8
done.
Warning: File system check failed but did not detect errors
mount: Read-only file system
Failed to mount /dev/mmcblk0p1 as root file system.
(initramfs)

手動でrootファイルシステムをチェックしたところROのため書込みできない事態となっている

(initramfs) fsck.ext4 -n /dev/mmcblk0p1
e2fsck 1.44.5 (15-Dec-2018)
Warning: skipping journal recovery because doing a read-only filesystem check.
/dev/mmcblk0p1: clean, 46517/2789280 files, 740918/7666688 blocks
(initramfs)

この現象は前にもあって原因はメディアが強制的に(ROにして)書込みできないよう処理していることで起こると思われ「メディア自体の異常」の要因もあるが,ほぼ間違いなく「メディアの書込み壽命」だと考える

実際は本当の壽命ということでフラッシュメモリ自体の書込みエラーで発生させているのではなく,書込み回数の上限を決めておいて超えたら記録内容を保護するためROにしているのだろうと考える

つまり,まだ読むことは可能ということである(実際に全部読める)

利用していたmicroSDは以下の「KLEVV NEO」という安価なメモリで,9月から4~5箇月とうことなので約150日間となる

IMG_20220116_133551.jpg

microSDには書込み回数があるのでいつかはエラーになると考えていたが32GBもあり僅かなログの書込みだけなのであまりにも短すぎる

MLCフラッシュは約1万回の書込みが可能であることが(かなり以前に)公表されている(今だともっと回数が増えてるかも)

論理的には書込み回数が1万回として32GBなら,32GB×10000=320000GB(320TB)の(ワンタイム)記録ができるということになる(実際は書込み単位があるので少なくなる)

これを150(日)で割ると,320000GB÷150=2133GBとなり毎日約2TBもの書込みがあったことになるが・・・

→ 連続でも書込みは最低10MB/s,最大は良くても100MB/s位として,100(MB)×3600(s)×24(H)=8640000(MB)=8640(GB)

かなり譲って1/100の,20GB/日としても(ほとんどがログになるので)考えられない書込み量である

このあたりの書込み量も予想試算して1年以上余裕で持つだろうと考えていたので想定外であった

前回も「KLEVV NEO」のmicroSDで発生しており,この時は書き込むことは起きていないのにROになってしまった(マイクロSDカードが壊れた

今回の件も含め,このメーカーのmicroSDはもう使用しないほうが賢明だろう(メディアは永久保証となっているけど交換しても使えない物はいらない)

最初の復旧手順

microSDへの書込みはできないが読むことはできるので別のmicroSDへデットコピーして復旧させる

新しいmicroSDは「Gigastone」にした

IMG_20220116_142334.jpg

ところが,コピーの段階で2つのmicroSDの(セクター)サイズが異なることが判明(これには驚いたが)

「KLEVV NEO」の方が「Gigastone」よりセクター数が多いのである

逆なら問題ないのだが,しかたないので無視してデットコピーした・・・けど・・・やはり途中で起動停止

(initramfs) fsck.ext4 /dev/mmcblk0p1
e2fsck 1.44.5 (15-Dec-2018)
The filesystem size (according to the superblock) is 7666688 blocks
The physical size of the device is 7632640 blocks
Either the superblock or the partition table is likely to be corrupt!
Abort<y>? yes
(initramfs)

34048 blocksも食い違っていてfsckは(ファイルシステムが破壊されていると判断して)動作しなかった

残念ながらデットコピーでの復旧は失敗に終わる

さて,どうやってNanoPi NEOサーバを復旧させるかだが,時間待ちもあったこともあり再構築とコピー復活の2つの手段を実施

システムの再構築(手段1)

前回のOSバージョンも置いていたが,新しいのがリリースされていたので新しい方で再構築する(要するに全部作り直し)

最新OSイメージ: Armbian_21.08.1_Nanopineo_bullseye_current_5.10.60.img

ネックは設定のバックアップで本当の最新の設定へ戻せるかである(なのでメディアから設定データを取り出し検証する必要がある → これが復活手順にもなる)

IMG_20220116_142320.jpg

設定は(NanoPi NEOのサーバ化(ソフトウェア))で記録されている通りで不足や注意事項を追加

・armbianの最初の起動(root/1234)時にsudo権限の管理者用のユーザ追加を行うが,このユーザのuidが1000になる

・既にセットアップされているパッケージがあった(問題になる事はない)

・NTPは前回の設定方法では動作しない(現在,未解決)

・bindについては記録の記事から変更がある(バックアップの利用で問題なし)

・dhcpが起動しない問題で以下のように(ターミナルではカラム落ちして)表示される(前回もあったが記録されていないので注意)

● isc-dhcp-server.service - LSB: DHCP server
Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
Active: failed (Result: exit-code) since Sun 2022-01-16 19:53:43 JST; 48s ago
Docs: man:systemd-sysv-generator(8)
Process: 8928 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=1/FAILURE)
Tasks: 12 (limit: 905)
Memory: 8.5M
CPU: 406ms
CGroup: /system.slice/isc-dhcp-server.service
tq7964 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf
tq8339 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf
mq8943 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf

1月 16 19:53:41 nanopineo dhcpd[8955]: exiting.
1月 16 19:53:43 nanopineo isc-dhcp-server[8928]: Starting ISC DHCPv6 server: dhcpd6check syslog for diagnostics. ...
1月 16 19:53:43 nanopineo isc-dhcp-server[8960]: failed!
1月 16 19:53:43 nanopineo isc-dhcp-server[8961]: failed!
1月 16 19:53:43 nanopineo systemd[1]: isc-dhcp-server.service: Control process exited, code=exited, status=1/FAILURE
1月 16 19:53:43 nanopineo systemd[1]: isc-dhcp-server.service: Failed with result 'exit-code'.
1月 16 19:53:43 nanopineo systemd[1]: isc-dhcp-server.service: Unit process 7964 (dhcpd) remains running after unit stopped.
1月 16 19:53:43 nanopineo systemd[1]: isc-dhcp-server.service: Unit process 8339 (dhcpd) remains running after unit stopped.
1月 16 19:53:43 nanopineo systemd[1]: isc-dhcp-server.service: Unit process 8943 (dhcpd) remains running after unit stopped.
1月 16 19:53:43 nanopineo systemd[1]: Failed to start LSB: DHCP server.

 これは「/etc/default/isc-dhcp-server」を修正する前にdhcp serverを起動すると「/var/run/dhcpd.pid」が残存してserverが再起動しないためで,正常にserverが起動しない場合にロックファイルを削除しないバグがあると思われる

パーティーションコピーで復旧(手段2)

resize2fsを使えばファイスシステムのサイズを変えられるので旧microSDからシステム部分だけ取り出してサイズを変更して新microSDへ書き込めば復旧できる

この場合,元のOSイメージでの復旧なので設定した情報は最新,さらに設定内容を参照したりバックアップすることができる

ただし別途microSDを操作するためのlinuxシステムが必要となる(エミュで遊ぶため構築していたUbuntuDesktopを利用した)

今回は1つのパーティションなので手間が掛からなかった

①Ubuntuで旧microSDを接続してデバイス名を確認(/dev/sdc)

※デバイス名の確認方法として,接続前に「fdisk -l」でデバイスリストを表示させて,接続後に再度リストに増えたデバイスが対象

パーティションを確認すると1つだけある

# fdisk -l /dev/sdc
ディスク /dev/sdc: 29.6 GiB, 31724666880 バイト, 61962240 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xc236f75e

デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
/dev/sdc1 8192 61341695 61333504 29.3G 83 Linux
#

②/dev/sdc1をコピーする

# dd if=/dev/sdc1 of=disk.img bs=1G

# ls -l
-rw-r--r-- 1 root root 31402754048 1月 16 17:45 disk.img
#

③fsckで修正

# e2fsck -f disk.img

④ファイルシステムをリサイズ(8GBとした)

# resize2fs disk.img 8G
resize2fs 1.44.1 (24-Mar-2018)
Resizing the filesystem on disk.img to 2097152 (4k) blocks.
The filesystem on disk.img is now 2097152 (4k) blocks long.
# ls -l
-rw-r--r-- 1 root root 8589934592 1月 16 20:00 disk.img
#

disk.imgはファイルシステムなのでmountして中身を参照することができる(必要ならファイルをバックアップする)

# mount disk.img /mnt
# ls -l /mnt
合計 80
lrwxrwxrwx 1 root root 7 5月 6 2021 bin -> usr/bin
drwxr-xr-x 4 root root 4096 9月 5 20:28 boot
drwxr-xr-x 2 root root 4096 5月 8 2021 dev
drwxr-xr-x 96 root root 4096 9月 27 17:53 etc
drwxr-xr-x 13 root root 4096 6月 26 2021 home
lrwxrwxrwx 1 root root 7 5月 6 2021 lib -> usr/lib
drwx------ 2 root root 16384 5月 8 2021 lost+found
drwxr-xr-x 2 root root 4096 5月 6 2021 media
drwxr-xr-x 2 root root 4096 5月 6 2021 mnt
drwxr-xr-x 2 root root 4096 5月 6 2021 opt
drwxr-xr-x 2 root root 4096 3月 20 2021 proc
drwx------ 5 root root 4096 9月 7 20:43 root
drwxr-xr-x 3 root root 4096 5月 8 2021 run
lrwxrwxrwx 1 root root 8 5月 6 2021 sbin -> usr/sbin
drwxrwxr-x 2 root root 4096 5月 8 2021 selinux
drwxr-xr-x 3 root root 4096 8月 29 15:27 srv
drwxr-xr-x 2 root root 4096 3月 20 2021 sys
drwxrwxrwt 2 root root 4096 5月 8 2021 tmp
drwxr-xr-x 10 root root 4096 5月 6 2021 usr
drwxr-xr-x 12 root root 4096 8月 28 19:53 var
#

⑤新microSDを起動できるようにする(IPLを書き込むとかBoot strapできるようにするという)

IPLのみ書き込む方法があるのだけど思い出せなかったので(DLして初期に書き込む)OSイメージを書き込む

何で書き込んでも良いが,Windows10で利用している「Win32DiskImager」を使った

WS_20220116_01.png

⑥Ubuntuで新microSDを接続してパーティションを操作する

パーティション1を削除して新規に8Gでパーティション1を作成(つまりパーティーションサイズを変更)

# fdisk /dev/sdc

fdisk (util-linux 2.31.1) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。


コマンド (m でヘルプ): p
ディスク /dev/sdc: 29.1 GiB, 31267487744 バイト, 61069312 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xc236f75e

デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
/dev/sdc1 8192 2744319 2736128 1.3G 83 Linux

コマンド (m でヘルプ): d
パーティション 1 を選択
パーティション 1 を削除しました。

コマンド (m でヘルプ): n
パーティションタイプ
p 基本パーティション (0 プライマリ, 0 拡張, 4 空き)
e 拡張領域 (論理パーティションが入ります)
選択 (既定値 p): p
最初のセクタ (2048-61069311, 既定値 2048): 2048
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (2048-61069311, 既定値 61069311): +8G

新しいパーティション 1 をタイプ Linux、サイズ 8 GiB で作成しました。

コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。

#

⑦リサイズしたファイルシステムを書き込む

# disk.img of=/dev/sdc1 bs=64M
128+0 レコード入力
128+0 レコード出力
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 549.08 s, 15.6 MB/s
#

⑧起動確認

U-Boot SPL 2021.04-armbian (May 06 2021 - 17:50:40 +0000)
DRAM: 512 MiB
Trying to boot from MMC1



Starting kernel ...

Loading, please wait...
Starting version 241
Begin: Loading essential drivers ... done.
Begin: Running /scripts/init-premount ... done.
Begin: Mounting root file system ... Begin: Running /scripts/local-top ... done.
Begin: Running /scripts/local-premount ... Scanning for Btrfs filesystems
done.
Begin: Will now check root file system ... fsck from util-linux 2.33.1
[/sbin/fsck.ext4 (1) -- /dev/mmcblk0p1] fsck.ext4 -a -C0 /dev/mmcblk0p1
/dev/mmcblk0p1: clean, 46546/762880 files, 611829/2097152 blocks
done.
done.
Begin: Running /scripts/local-bottom ... done.
Begin: Running /scripts/init-bottom ... done.

Welcome to Armbian 21.08.1 Buster!



[ OK ] Started Authorization Manager.
[FAILED] Failed to start LSB: DHCP server.
See 'systemctl status isc-dhcp-server.service' for details.
[ OK ] Started LSB: RPi-Monitor daemon.
[ OK ] Reached target Multi-User System.
[ OK ] Reached target Graphical Interface.
Starting Update UTMP about System Runlevel Changes...
[ OK ] Started Update UTMP about System Runlevel Changes.

Armbian 21.08.1 Buster ttyS0

nanopi login:

(※)ネットワークに接続していないのでDHCPがエラーとなっている

復旧

結果,新しいOSバージョンで運用したかったので手段1で復旧させている

バックアップ用に手段2のmicroSDは保管

NanoPi NEOのサーバ化(ソフトウェア)

分散移行したいサーバのセットアップを実施して1W問題なく稼働した

WS20210904_001.png

更に追加もあるが,まずは移行を完了とする

セットアップ内容は以下に記録(色付きは追記分

NTP

先ずは,RTC(DS1307)を使えるようにする(こちらを参考)

# vi /boot/armbianEnv.txt

overlays=usbhost1 usbhost2 i2c0
                           ^^^^ ← 追加
# shutdown -r now

(再起動)

# apt install i2c-tools  #i2c-toolsをインストール

# i2cdetect -y 0
     0 1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

# lsmod | grep rtc
Noting

# modprobe -c | grep ds1307

# modprobe i2c:ds1307

# lsmod | grep rtc
Noting

# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device
# lsmod | grep rtc
rtc_ds1307 28672 0

# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

# ls -l /dev/rtc*
lrwxrwxrwx 1 root root 4 Aug 22 20:46 /dev/rtc -> rtc0
crw------- 1 root root 253, 0 Aug 22 20:46 /dev/rtc0
crw------- 1 root root 253, 1 Aug 22 20:58 /dev/rtc1
# hwclock -r -f /dev/rtc1    #確認

/etc/rc.local に以下を追加

/usr/sbin/modprobe i2c:ds1307
echo 'ds1307 0x68' > /sys/class/i2c-adapter/i2c-0/new_device
ln -f -s /dev/rtc1 /dev/rtc
/usr/sbin/hwclock -s

NTP の設定状況

# timedatectl status
Local time: Mon 2021-08-23 21:08:11 JST
Universal time: Mon 2021-08-23 12:08:11 UTC
RTC time: Mon 2021-08-23 12:08:24
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
NTP service: inactive
RTC in local TZ: no

NTPを有効化する

# timedatectl set-ntp true

/etc/systemd/timesyncd.confを編集

[Time]
NTP=ntp.nict.jp → https://jjy.nict.go.jp/tsp/PubNtp/index.html
FallbackNTP=ntp1.jst.mfeed.ad.jp ntp2.jst.mfeed.ad.jp ntp3.jst.mfeed.ad.jp

時刻同期デーモンの起動

# systemctl start systemd-timesyncd

時刻同期デーモン自動起動の設定

# systemctl enable systemd-timesyncd
# systemctl is-enabled systemd-timesyncd
RPi-Monitor

ラズパイ用のシステムモニターだが使えるようになっている

CUI

# armbianmonitor -m

GUI

# armbianmonitor -r
Installing RPi-Monitor. This can take up to 5 minutes. Be patient please

...

Now patching RPi-Monitor to deal correctly with H3

Now you're able to enjoy RPi-Monitor at http://192.168.xxx.xxx:8888

注)192.168.xxx.xxx:8888でないと参照できないようだ(IPアドレスが埋め込まれているかと)

常時起動するよう /etc/rc.local に以下を追加

/usr/bin/armbianmonitor -r > /dev/null 2>&1&

モニター表示例)CPU温度表示(2日間)

WS20210904_003.png

 

swap

実装メモリが512MBなので1GB程度のswapを設定する

ストレージがマイクロSDなのでswapパーティーションにする有効性もないためファイルにした

$ free
total used free shared buff/cache available
Mem: 503488 87696 10644 5468 405148 398600
Swap: 251740 0 251740

1GBのファイルを作成

$ sudo dd if=/dev/zero of=/var/swapfile bs=1024 count=1M
1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 69.2829 s, 15.5 MB/s

パーミッションを変更

$ sudo chmod 0600 /var/swapfile

mkswapでswapファイルシステムを作成

$ sudo mkswap /var/swapfile
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=a4c1207b-65f4-42f3-be63-ea8955257f30

swaponでswap有効化

$ sudo swapon /var/swapfile
$ free
total used free shared buff/cache available
Mem: 503488 88560 9084 5468 405844 397732
Swap: 1300312 0 1300312

/etc/fstabの編集(設定を追加)

$ cat /etc/fstab
UUID=295de8c4-f8a3-40d3-9116-f2318feeed87 / ext4 defaults,noatime,commit=600,errors=remount-ro 0 1
tmpfs /tmp tmpfs defaults,nosuid 0 0
$ echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab

※)エディタで編集の方が良い

$ cat /etc/fstab
UUID=295de8c4-f8a3-40d3-9116-f2318feeed87 / ext4 defaults,noatime,commit=600,errors=remount-ro 0 1
tmpfs /tmp tmpfs defaults,nosuid 0 0
/var/swapfile swap swap defaults 0 0
$
ネットワークインタフェース

現時点での最新のBuster(Armbian_21.05.1_Nanopineo2_buster_current_5.10.34.img を使用)ではMAC addressが可変になっており再起動ごとに変化する

なので,IP  addressは固定にする

# armbian-config
static で IP:192.168.xxx.xxx を設定

尚,MAC addressを固定にする安易な方法は,/etc/network/interfaces に以下を追加する

hwaddress ether aa:bb:cc:dd:ee:ff

(追記)

armbian-configで設定してもIPアドレスが固定にならないことがあった(カーネル更新で発生)

/etc/network/interfaces に追記(以下が記述可能)すれば良いようだ

auto eth0
allow-hotplug eth0
iface eth0 inet static
address <IPアドレス>
netmask 255.255.255.0
gateway <ゲートウェイアドレス>
dns-nameservers <DNSアドレス>

interfacesの編集でも不可の場合nmtuiで設定する方法もある

$ sudo nmtui
bind

本機をプライマリDNSとして稼働させる

WAN-IPアドレスはダイナミックなので内部のみ設定する(外部向けは定義できない)

bind9の導入

# apt install bind9 dnsutils ← dig コマンド用

設定ファイル(/etc/bind/named.conf)の編集

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local"; #編集(ファイル名は変更しても良い)
include "/etc/bind/named.conf.default-zones";

オプション設定ファイル(/etc/bind/named.conf.options)

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 {
    // 0.0.0.0;
    // };

    //========================================================================
    // 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
    //========================================================================
    //BINDの利用を許す範囲
    allow-query { localhost; localnets; };

    //スレーブDNSのアドレス(内向きDNSの場合は必要ない)
    allow-transfer { none; };

    //再帰検索を許可する範囲
    allow-recursion { localhost; localnets; };

    dnssec-validation auto;

    auth-nxdomain no; # conform to RFC1035

    //listen-on-v6 { none; };
    listen-on-v6 { any; };

    //名前解決できないときにモデムに聞きに行く場合は以下
    //forwarders { 192.168.xxx.1; };
    //名前解決できないときはgoogleのDNSを使う
    forwarders { 8.8.8.8; 8.8.4.4; };

    version "unknown";
};

# EDNS0 の無効化
# "error (unexpected RCODE REFUSED) ..." 出力の抑止
    server 0.0.0.0 {
    edns no;
};

# "DNS format error ... invalid response" 出力の抑止
    logging {
    category resolver { null; };
};

内部向けゾーンファイル(/etc/bind/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";

#正引きゾーン定義
zone "inoshita.jp" {
    type master;
    file "/etc/bind/inoshita.jp.lan";
    allow-update { none; };
};

#逆引きゾーン定義
zone "xxx.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/xxx.168.192.db";
    allow-update { none; };
};

正引きゾーン定義ファイル(/etc/bind/inoshita.jp.lan)

$TTL 86400
@       IN      SOA ns1.inoshita.jp. root.inoshita.jp. (
                2021082801    ; Serial
                     10800    ; Refresh
                      1800    ; Retry
                    604800    ; Expire
                     86400    ; Negative Cache TTL
)
        IN      NS     ns1.inoshita.jp.
        IN      MX 10 mail.inoshita.jp.
router  IN      A 192.168.xxx.1
nanopi  IN      A 193.168.xxx.xxx
Cubian  IN      A 192.168.xxx.xxx
ns1     IN A 192.168.xxx.xxx
mail IN A 192.168.xxx.xxx
home    IN CNAME nanopi
www     IN CNAME Cubian

逆引きゾーン定義ファイル(/etc/bind/xxx.168.192.db)

$TTL 86400
@ IN SOA ns1.inoshita.jp. root.inoshita.jp. (
2009110101 ; Serial
10800 ; Refresh
3600 ; Retry
604800 ; Expire
86400 ; Negative Cache TTL
)
IN NS ns1.inoshita.jp.
IN A 255.255.255.0
1 IN PTR router.inoshita.jp.
XXX IN PTR home.inoshita.jp.
XXX IN PTR nanopi.inoshita.jp.
XXX IN PTR ns1.inoshita.jp.
XXX IN PTR www.inoshita.jp.
XXX IN PTR mail.inoshita.jp.

/etc/resolv.conf を編集(起動時に更新されることに注意

nameserver 192.168.xxx.xxx ← 自身のIPにする

サーバ制御

# systemctl restart bind9
# systemctl status bind9.service

# service bind9 restart(旧)
DHCP

DHCPは isc-dhcp-server を導入する

# apt install isc-dhcp-server

/etc/dhcp/dhcpd.confを編集

#
# Sample configuration file for ISC dhcpd for Debian
#
#

# 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;

# option definitions common to all supported networks...
option domain-name "inoshita.jp";
option domain-name-servers 192.168.xxx.xxx, 192.168.xxx.xxx;

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

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

...
#ネットワークアドレスとサブネットマスク指定
subnet 192.168.xxx.0 netmask 255.255.255.0 {
    #デフォルトゲートウェイ指定
    option routers 192.168.xxx.1;
    #サブネットマスク指定
    option subnet-mask 255.255.255.0;
    #貸し出すIPアドレスの範囲指定
    range dynamic-bootp 192.168.xxx.xxx 192.168.xxx.xxx;
}

#固定IP
host WG1200HS {
    hardware ethernet aa:bb:cc:dd:ee:ff;
    fixed-address 192.168.xxx.xxx;
}

/etc/default/isc-dhcp-serverを編集

# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
#DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
DHCPDv4_PID=/var/run/dhcpd.pid
#DHCPDv6_PID=/var/run/dhcpd6.pid

# Additional options to start dhcpd with.
# Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

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

サーバ制御

# systemctl start isc-dhcp-server
# systemctl status isc-dhcp-server.service
# systemctl enable isc-dhcp-server
ddclient

ddclientはMyDNS未対応なので,今回から以下のシェルスクリプト(mydns.sh)に変更

#!/bin/sh
#
MYDNS_USER='userid'
MYDNS_PASSWORD='password'
#
/usr/bin/wget -O - http://${MYDNS_USER}:${MYDNS_PASSWORD}@ipv4.mydns.jp/login.html
/usr/bin/wget -O - http://${MYDNS_USER}:${MYDNS_PASSWORD}@ipv6.mydns.jp/login.html

exit 0

mydns.shをcron(rooth権限)で実行させる(以下は毎日4時に実行)

# crontab -l

0 4 * * * /usr/local/sbin/mydns.sh > /dev/null 2>&1

注)登録する際は crontab -e

nfs-client

ファイル共有化のため設定

nfsクライアントの導入

# apt install nfs-client

手動でnfsマウント(常時マウントなら/etc/fstabへ追加)

# mount -t nfs Cubian.inoshita.jp:/srv/share /srv/share

マウントを auto 化するためにautofsを導入

# apt install autofs

/etc/auto.masterへ追加

# vi /etc/auto.master

/- /etc/auto.nfs ← 追加行(ファイル名は変更可)

/etc/auto.nfsへマウントディレクトリを記載

# vi /etc/auto.nfs

/srv/share -fstype=nfs,rw Cubian.inoshita.jp:/srv/share

サーバ制御

# systemctl restart autofs
残件

残り,NTPのサーバ化(現在はNTPクライアント),Mailサーバ,UPS対応の設定を予定

NanoPi NEOのサーバ化(その2)

NanoPi NEOのサーバ化は,ひとまず運用可能レベルで完成したが,以下の改良(機能追加)を行うことにした

電源スイッチ

NanoPi NEOにはリセットスイッチが無いため,ハードリセットするためには電源をOFF/ONする必要がある

そのためUPSを組み込んだ場合,ハードリセットするにはUPS電源をOFFしないとならない

何らかの異常が発生した時に無いと蓋を開ける手間が掛かることになるだけだが電源スイッチを追加することにした

miniups_回路図_u.png

(注)無電圧時スイッチを切りにしたかったのでNチャネルFETを使ったせいでGndを共通にできなくなり嵌る

DCDCの入力に電源スイッチを設けDCDCの出力に緑LEDを消灯したことで判断できるようにする(主電源は赤LED)

IMG_20210822_172431.jpgIMG_20210822_172358.jpgIMG_20210822_172508.jpg

スイッチは3Dプリンタで作製した台座を付けてホットボンドで取付け

IMG_20210823_173809.jpg

小型スイッチなのでケースは簡単な加工で済ませた

主電源信号

長時間の停電対応ができるように停電を判断するための信号線を追加(PG11へ入力)

RTC(リアルタイムクロック)

NanoPi NEOにはRTCが無いのでソフトリセットでも日時が初期化される

日時はサーバ起動時にネット取得され更に一定期間で更新する機能もあるので常時接続運用では問題にはならないのだけどRTCモジュールを使ってみたいので追加した(専用ケースにはDS1307が付いている)

使用したのはDS1307が載っているTinyRTCモジュールで,そのまま使うには問題があるので手を加えた

TinyRTCモジュール仕様

  • リアルタイムクロックDS1307搭載,I2C接続
  • EEPROM:AT24C32(32Kb)搭載
  • 発振器動作中のバッテリバックアップモードの消費電流は500nA以下の低消費電力
  • モジュールにEEPROMを搭載しているので,日付時刻と共にセンサーなどの数値を保存することが可能
  • コンパクトなデザイン:27mm * 28mm * 8.4mm

TinyRTCモジュールは5VでNanoPi NEOは3.3V

I2Cのレベル変換もあるがTinyRTCモジュール上のプルアップ抵抗を取り除き外部で3.3Vをプルアップする

バッテリーバックアップが充電池

バックアップ電池が充電池使用(LIR2032)なので4.5V程印加されている

充電回路を無効化し同サイズのCR2032を使用する

回路図を見つけたのでTinyRTCモジュールを改造した

DS1307_circuit_u.png

  赤:プルアップ抵抗を取り除く

黄・緑:バッテリーの充電回路で取り除く(R6とD1だけでも可)

  緑:短絡(取り除いた後)

IMG_20210822_122509_u.jpg

(処理後)

IMG_20210822_162906_u.jpg

後で嵌らないように動作確認する

IMG_20210822_173755.jpg

Arduino IDEで,ファイル>スケッチ例>Wire>i2c_scannerを実行

WS_20210820_001.png

接続は問題なし(0x68がRTCで,0x50はメモリ)

確認のためのスケッチ

#include <Wire.h>
#define RTC_address 0x68
const char *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

uint8_t REG_table[7];

void setup() {
Wire.begin();
Serial.begin(9600);

//初期日時を書き込む(データ形式は二進化十進)
Wire.beginTransmission(RTC_address);
Wire.write(0x00); //Register 先頭アドレス
Wire.write(0x00); //second
Wire.write(0x34); //minute
Wire.write(0x19); //hour
Wire.write(0x04); //week
Wire.write(0x22); //day
Wire.write(0x08); //month
Wire.write(0x21); //year
Wire.endTransmission();
}

void loop() {
Wire.beginTransmission(RTC_address);
Wire.write(0x00);//Register 先頭アドレス
Wire.endTransmission();

  //RTCデータの読み込み
Wire.requestFrom(RTC_address,7);
for(int i = 0; i < 7; i++) {
REG_table[i] = Wire.read();
}

  //RTCデータ表示
Serial.print("20");
Serial.print(REG_table[6],HEX); //year
Serial.print("/");
Serial.print(REG_table[5],HEX); //month
Serial.print("/");
Serial.print(REG_table[4],HEX); //day
Serial.print("(");
Serial.print(week[REG_table[3]]);//week
Serial.print(") ");
Serial.print(REG_table[2],HEX); //hour
Serial.print(":");
Serial.print(REG_table[1],HEX); //minute
Serial.print(":");
Serial.print(REG_table[0],HEX); //second
Serial.println();
delay(1000);
}

結果

WS_20210820_002.png

正常に動作したので,バッテリーを付け正しい日時を登録しておく

バッテリー

改良によって18650ではケースのスペースが不足したのでコンパクトなリポバッテリーに変更

IMG_20210821_205919.jpg

1100mAhのリポで連続1.5A可能,過充電,過放電の安全回路も付いているので安全性も上がる

付属のコネクタはPHを小型にしたもので「Micro JST 1.25」と呼ぶらしい

基板用のコネクタが見つからなかったのでケーブル付きコネクタを購入

全体構成

IMG_20210822_202429.jpg

IMG_20210822_202845.jpg

消費電力

改良が終わりハードウェアは完成したのでバッテリーを空にして充電を含む消費電量を計測したところ0.89Aだったので約5V1Aで5W

IMG_20210823_181318.jpg

充電が終わりアイドル状態では0.17Aであった

IMG_20210825_174853.jpg

尚,充電中はMAX.0.89Aで徐々に減っていく

もう1つ改良(2021.8.26追加)

ソフトウェアの調整をしながらテスト運用していたところCPUのヒートシンクが結構熱くなっていることに気付いた

CPU温度が42℃(外気30℃)位なので大したことはないが,ケースに熱を逃がして冷却することにした

そこでケースに接触できるサイズのサーマルパッド(30x30x3)を準備して装着

IMG_20210826_190927.jpgIMG_20210826_193345.jpg

CPU温度46℃時,サーマルパッドは37.2℃に上昇

IMG_20210826_193908.jpg

ケースに放熱し経過をみると

IMG_20210826_194040.jpg

34.6℃(外気27.6℃)

32.6℃(外気26.7℃)

35.9℃(外気28.9℃)

と,十分効果あり

IMG_20210828_140422.jpg

固定設置してソフトウェアの調整,正式運用準備を進める

・・・

後に赤LEDは眩しいことに気付く・・・修理等のタイミングがあればオレンジ色にでも交換するかな

NanoPi NEOのサーバ化

Cubieboardのサーバ機能の一部(NTP/DPCH/DNS/Mail)を移行させるため(ようやくとなるが)NanoPiサーバを作製する

(特にDHCPは別にしておかないとサーバメンテとかで何かと不便なことがあるのでさっさと分けておけばよかったと思う)

ケース

少しは見栄えを良くしたかったのでタカチの金属ケース(100x30x70)を使用する

IMG_20210814_191413.jpg

消費電力

OctoPrint用の回路と似た5VのUPSを組み込んだ回路となり,先にNeoPiの消費電力を確認しておく

実働,通常で0.14~0.26A,CPUストレスを与えたところ0.35~0.42A

IMG_20210820_205638.jpg

最大でも0.42程度で,ネットでの情報も0.5A以下なのを確認

回路図

 

miniups_回路図_v1.png

DCDCが効率90%なのでDCDC入力1Aでも出力に余裕はある

電源は5Vでリポ充電分があるため1.5Aは必要か(完成後に確認予定)

基板

ユニバーサル基板を使い,NanoPi本体,リポ充電モジュール,DCDCモジュールとUPS回路を載せる

サイズはCタイプ(秋月呼称)で十分だろう

基板はNanoPi本体を載せるために,ルーターにダイヤモンドカッターで加工(簡単)

IMG_20210814_151447.jpgIMG_20210814_152749.jpgIMG_20210814_153228.jpg

これにNanoPiはピンソケット,モジュールはケースに合わせエポキシ樹脂で固定

IMG_20210814_210205.jpg

リポの選定

バッテリーはサイズ的にもOctoPrintの時に使った200mAのリポにしようと考えていて出力電圧を調整して確認を行った

IMG_20210815_101154.jpg

ところが0.5Aを出力できないようなので,サイズ的にぎりぎりとなるが18650に変更

IMG_20210815_113030.jpg

その他の部品を基板に載せて基板はひとまず完成

IMG_20210815_144327.jpgIMG_20210815_144347.jpg

ケース加工と組込

バックパネルを外部インタフェースに合わせてケースを加工

IMG_20210815_153404.jpg

ドリル+鑢掛け加工なんで,あまり綺麗には加工できない・・・が,十分

IMG_20210815_162638.jpg

フロントパネルにLEDを付けるが,LEDが飛び出さないようにするためLEDマウント用の台座を3Dプリンタで作った

IMG_20210815_173146.jpgIMG_20210815_173706.jpg

LEDを付けた台座を穴を空けたフロントにホットボンドで取り付ける

IMG_20210815_173942.jpgIMG_20210815_174025.jpg

ケースに基板を付けて完成

IMG_20210815_192909.jpg

IMG_20210815_193559.jpg

IMG_20210815_193618.jpg

 

IMG_20210815_193827.jpg

問題点

ソフトウェアの設定を行おうとしたところ,運用可能な最低レベルで完成はしたが少々問題があることが判明したため改良する

ページ移動

  • ページ
  • 1
  • 2

ユーティリティ

検索

エントリー検索フォーム
キーワード

過去ログ

Feed