2021年5月8日土曜日

Lichee Pi Zeroで母艦PCとファイル同期させる

あまり手をつけていないが、少しずつやっている
母艦PCとのファイル同期に、開発中はsftpとかで良いんだろうが
例えば、何か作った後に、データを更新させたいといった時
sshはなんか心理的にやだった(何が

フォトフレームとした場合も、写真の更新取得先はdropboxやnextcloudなどクラウドストレージかもしれないし。何かしら同期させる手段が欲しい。

でも個別にサービスに対応させるのはしんどい。
davfs2を最初考えたけど、うまいことマウント出来ずに挫折した。
webdav以外にもつながりたいかもしれないし。
そんなことを悩んでいたら、rcloneというソフトに出会った。

rcloneはすごそう

  • Rclone syncs your files to cloud storage

すごいたくさん対応してるー!
https://rclone.org/#providers

Dropboxもあるし、Google Photos、Nextcloud、webdavなんかもある!
これを導入できれば、スッキリできるかもしれない。

お試し導入してみる

まずはどんなものかを味わうために、ビルド済みのやつを持ってきてみる。
https://rclone.org/downloads/
の[ARMv6 - 32 Bit][linux]というやつ

rclone-v1.54.0-linux-arm.zip

これを展開して、LicheePiに転送。

# ./rclone version
rclone v1.54.0
- os/arch: linux/arm
- go version: go1.15.7

さすが golang すんなり起動するのがすごいね。

対向サーバーは?

さてさて、対向となるサーバーはどうしようかと、あまり手間かけたくないし。
簡易的なwebサーバーで良いんだけど。
なんとなくwebdav使ってみたくて、あれこれ探していたら、wsgidavというソフトに出会った。

https://wsgidav.readthedocs.io/en/latest/index.html
https://qiita.com/Brad-55/items/5b596b76ef7dc1be9a39

インストールはとっても簡単

pip install --upgrade wsgidav

これでOK!
起動もとても簡単!

wsgidav --host=0.0.0.0 --port=8888 --root=/home/adeno/develop/wsgidav --auth=anonymous

これで、とりあえず、認証なしのwebdavサービスが出来上がる。すてき。


 

さて、やってみよう

これもとても簡単
https://rclone.org/webdav/

に従いやっていくだけ

# ./rclone ls chihiro:
1970/01/02 08:10:10 NOTICE: Time may be set wrong - time from "192.168.100.10:8888" is -448164h47m5.409855313s different from this computer
   476690 Screenshot from 2020-04-17 15-46-39.png
   540108 Screenshot from 2020-04-17 15-48-22.png
   272475 chihiro001.jpg
   376802 chihiro002.jpg
   441756 chihiro003.jpg
   297234 chihiro004.jpg
   160027 chihiro005.jpg
   224296 chihiro006.jpg
   276833 chihiro007.jpg
   296495 chihiro008.jpg

おっと、日時設定してなかった。

日時設定

とりあえず手動で

# date --set "2021-02-17 6:00:00"
Wed Feb 17 06:00:00 UTC 2021

あれ、UTCだ。

    BR2_TARGET_TZ_INFO=y
    BR2_TARGET_TZ_ZONELIST="default"
    BR2_TARGET_LOCALTIME="Asia/Tokyo" 

これで、再度ビルドして

# date --set "2021-02-20 19:38:00"
Sat Feb 20 19:38:00 JST 2021

これでOK

NTP導入

手動でうまく行くことがわかったので、今度は自動で調時させたい。

クライアント側

chronyというのを使ってみる。

    BR2_PACKAGE_CHRONY=y

サーバー側

特に何も考えずに、以下を参考に
https://tecadmin.net/setup-time-synchronisation-ntp-server-on-ubuntu-linuxmint/

$ sudo apt install ntp

/etc/ntp.confに追記

restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap

あとはリロード

sudo service ntp reload

ファイアウォールも忘れてはいけない
123/tcpを許可する

実行

# cat /etc/chrony.conf 
server 192.168.100.10
leapsecmode slew
makestep 1.0 3

# /etc/init.d/S49chrony restart
# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^? 192.168.100.10                3   6     1    30  -18678d[-18678d] +/-  134ms
# chronyc makestep
200 OK
<3分くらい後に>
# date
Mon Feb 22 06:18:51 JST 2021

makestep 1.0 3

により、サービス起動時に1.0秒以上のズレがあった場合には即時調時されるっぽい。

buildrootと連携(rcloneパッケージの作成)

今後も見据えてmenuconfigから選択できるようにしたい。
このあたりを参考に

https://buildroot.org/downloads/manual/manual.html#outside-br-custom
https://buildroot.org/downloads/manual/manual.html#adding-packages

パッケージの追加

構成を考える
br2-externalにて指定している外部ツリー

ex_licheepizerodock

の下にpackageディレクトリを作成してもろもろ置いていく。
今回は思考停止して「rclone」とした。

tabが重要なので、エディタのtab→スペース変換はoffにしないとハマる。

ex_licheepizerodock$ tree
.
├── Config.in
<>
├── external.desc
├── external.mk
├── package
│   └── rclone
│       ├── Config.in
│       └── rclone.mk

Config.inとexternal.mkの変更

Config.inの変更

source "$BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH/package/rclone/Config.in"

external.mkの変更

include $(sort $(wildcard $(BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH)/package/*/*.mk))

package内のConfig.inと.mkの作成

Config.inの作成

config BR2_PACKAGE_RCLONE
    bool "rclone sync"
    help
        Rclone syncs your files to cloud storage

rclone.mkの作成

超絶シンプル。zip展開して、バイナリをコピーするだけ。

################################################################################
#
# Rclone syncs.
#
################################################################################

RCLONE_SOURCE = rclone-current-linux-arm.zip
RCLONE_SITE = https://downloads.rclone.org
RCLONE_LICENSE = MIT
RCLONE_SOURCE_BASENAME = rclone
RCLONE_BIN_NAME = rclone

define RCLONE_EXTRACT_CMDS
	unzip -j $(DL_DIR)/$(RCLONE_SOURCE_BASENAME)/$(RCLONE_SOURCE) -d $(@D)
endef

define RCLONE_INSTALL_TARGET_CMDS
	@echo BR2_PACKAGE_RCLONE_INSTALL_TARGET_CMDS
	$(INSTALL) -D -m 0755 $(@D)/$(RCLONE_BIN_NAME) $(TARGET_DIR)/usr/bin
endef

$(eval $(generic-package))

これでOK!