GL-iNet GL-AR750S を自宅に導入して数ヶ月、設定も出来上がり、安定期に入りました。せっかくここまで仕上げた設定を失いたくないので、 cron で定期的に OpenWRT 設定の バックアップ を行えるよう、バッチを組んでみたいと思います。
OpenWRTのGUI、LuCIでは System からバックアップを生成、ダウンロード出来る機能が用意されています。ダウンロードしたファイルを開いてみると、これはシステムの/etc以下の一部を tar.gz で固めたもので、基本的な設定はここを網羅しておけば良いことが分かりました。
さらにCLIベースのバックアップについては、OpenWRT公式で詳しく解説されています。
バックアップしたい箇所を増やしたければ、 /etc/sysupgrade.conf に追記すれば良いそうなので、早速以下を追加します。
1 2 |
/mnt/sda1/vnstat/ # vnstat DB /root/ # 各種バッチ格納場所 |
追加後、 sysupgrade -l でバックアップ対象パスを確認しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
root@GL-AR750S_A7:~# sysupgrade -l /etc/collectd.conf /etc/config/ddns /etc/config/dhcp /etc/config/dnscrypt-proxy /etc/config/dropbear /etc/config/etherwake /etc/config/firewall /etc/config/fstab /etc/config/gl_s2s /etc/config/glconfig /etc/config/glcrond /etc/config/glfw /etc/config/glmodem /etc/config/luci /etc/config/luci_statistics /etc/config/mwan3 /etc/config/network /etc/config/nodogsplash /etc/config/openvpn /etc/config/openvpn_recipes /etc/config/ovpnclients /etc/config/pptpd /etc/config/rpcd /etc/config/samba /etc/config/stubby /etc/config/system /etc/config/system1 /etc/config/tertf /etc/config/tor /etc/config/ubootenv /etc/config/ucitrack /etc/config/uhttpd /etc/config/vnstat /etc/config/vpn_service /etc/config/wireguard /etc/config/wireguard_server /etc/config/wireless /etc/crontabs/root /etc/dropbear/authorized_keys /etc/dropbear/dropbear_rsa_host_key /etc/firewall.user /etc/group /etc/hosts /etc/inittab /etc/lighttpd/lighttpd.conf /etc/luci-uploads/.placeholder /etc/luci-uploads/cbid.openvpn.tap_server.ca /etc/luci-uploads/cbid.openvpn.tap_server.cert /etc/luci-uploads/cbid.openvpn.tap_server.dh /etc/luci-uploads/cbid.openvpn.tap_server.key /etc/openvpn/cert/ca.crt /etc/openvpn/cert/ca.key /etc/openvpn/cert/ca.srl /etc/openvpn/cert/client.crt /etc/openvpn/cert/client.csr /etc/openvpn/cert/client.key /etc/openvpn/cert/dh1024.pem /etc/openvpn/cert/server.crt /etc/openvpn/cert/server.csr /etc/openvpn/cert/server.key /etc/openvpn/ovpn/client.ovpn /etc/openvpn/ovpn/server.ovpn /etc/openvpn/update-resolv-conf /etc/opkg/keys/1035ac73cc4e59e3 /etc/opkg/keys/5151f69420c3f508 /etc/opkg/keys/72a57f2191b211e0 /etc/opkg/keys/792d9d9b39f180dc /etc/opkg/keys/9ef4694208102c43 /etc/opkg/keys/9f9024096bd6e280 /etc/opkg/keys/b26f36ae0f4106d /etc/opkg/keys/b5043e70f9a75cde /etc/opkg/keys/c10b9afab19ee428 /etc/opkg/keys/dace9d4df16896bf /etc/opkg/keys/dd6de0d06bbd3d85 /etc/passwd /etc/ppp/chap-secrets /etc/ppp/options.pptpd /etc/profile /etc/rc.local /etc/samba/smb.conf.template /etc/samba/smbpasswd /etc/shadow /etc/shells /etc/sysctl.conf /etc/sysupgrade.conf /etc/tertf/tertfinfo_bak /etc/tor/torrc /etc/vnstat.conf /mnt/sda1/vnstat/db/.br-lan /mnt/sda1/vnstat/db/.eth0.2 /mnt/sda1/vnstat/db/.tap2 /mnt/sda1/vnstat/db/.wlan0 /mnt/sda1/vnstat/db/.wlan1 /mnt/sda1/vnstat/db/br-lan /mnt/sda1/vnstat/db/eth0.2 /mnt/sda1/vnstat/db/tap2 /mnt/sda1/vnstat/db/wlan0 /mnt/sda1/vnstat/db/wlan1 /root/.rnd /root/Adafruit_Python_BME280/Adafruit_BME280.py /root/Adafruit_Python_BME280/Adafruit_BME280_Example.py /root/Adafruit_Python_BME280/Adafruit_BME280_Example_Curses.py /root/Adafruit_Python_BME280/LICENSE /root/Adafruit_Python_BME280/README.md /root/Adafruit_Python_BME280/setup.py /root/Adafruit_Python_GPIO/Adafruit_GPIO/FT232H.py /root/Adafruit_Python_GPIO/Adafruit_GPIO/GPIO.py /root/Adafruit_Python_GPIO/Adafruit_GPIO/I2C.py /root/Adafruit_Python_GPIO/Adafruit_GPIO/MCP230xx.py /root/Adafruit_Python_GPIO/Adafruit_GPIO/PCA95xx.py /root/Adafruit_Python_GPIO/Adafruit_GPIO/PCF8574.py /root/Adafruit_Python_GPIO/Adafruit_GPIO/PWM.py /root/Adafruit_Python_GPIO/Adafruit_GPIO/Platform.py /root/Adafruit_Python_GPIO/Adafruit_GPIO/SPI.py /root/Adafruit_Python_GPIO/Adafruit_GPIO/__init__.py /root/Adafruit_Python_GPIO/LICENSE /root/Adafruit_Python_GPIO/README.md /root/Adafruit_Python_GPIO/ez_setup.py /root/Adafruit_Python_GPIO/setup.py /root/Adafruit_Python_GPIO/tests/MockGPIO.py /root/Adafruit_Python_GPIO/tests/__init__.py /root/Adafruit_Python_GPIO/tests/test_GPIO.py /root/Adafruit_Python_GPIO/tests/test_I2C.py /root/Adafruit_Python_GPIO/tests/test_PWM.py /root/Adafruit_Python_GPIO/tests/test_Platform.py /root/Adafruit_Python_GPIO/tests/test_SPI.py /root/gli_usbpow.sh /root/privkey /root/pubkey /root/sensors_upload.py /root/vnstat_email_glinet.py |
バックアップ先は以前、追加したSDカードストレージに作った bakcup フォルダとし、早速バックアップ実行してみます。
1 2 3 4 5 6 |
root@GL-AR750S_A7:# sysupgrade -b /mnt/sda1/backup/${HOSTNAME}/${HOSTNAME}_$(date +%F).tar.gz Saving config files... root@GL-AR750S_A7:# ls -la /mnt/sda1/backup/GL-AR750S_A7 drwxr-xr-x 2 root root 4096 Jun 13 15:57 . drwxr-xr-x 3 root root 4096 Jun 13 15:17 .. -rw-r--r-- 1 root root 73817 Jun 13 15:57 GL-AR750S_A7_2020-06-13.tar.gz |
これを cron に追加しておけばOK。毎日設定をいじるものでもないので、週一のバックアップで十分でしょう。
1 2 3 |
root@GL-AR750S_A7# crontab -e 57 06 * * * python /root/vnstat_email_glinet.py >/dev/null 2>&1 43 03 * * 3 sysupgrade -b /mnt/sda1/backup/${HOSTNAME}/${HOSTNAME}_$(date +%F).tar.gz >/dev/null 2>&1 |
実は自宅にはもう一台、GL-AR750Sが別の部屋にAPとして稼働しています。こちらもほぼ設定は同じで、SDカードもマウントしています。せっかくなので、この2つのデバイスのSDカードストレージにある backup フォルダを rsync+ssh で同期させ、互いのバックアップファイルを持ち合うようにしてみます。
OpenWRT機器へのssh公開鍵接続の方法は、これもOpenWRT公式に詳しく述べられています。
ただ今回は、 ssh クライアント側もOpenWRTなので、 ssh-keygen をOpenWRT上で実行して鍵を生成する必要があります。 opkg でインストールしましょう(デフォルトの ssh クライアントは openssh-client ではないので、 keygen だけではなく、クライアントも入れます。一応、インストール後再起動推奨)。
1 2 3 |
opkg install openssh-keygen opkg install openssh-client opkg install rsync |
鍵ペアさえ出来てしまえば、あとは上述のOpenWRT公式の通り、互いの公開鍵を互いの dropbear の authorized_keys に登録するだけです。 rsync を動かす前に ssh で互いにパスワードプロンプト無しでもログイン出来ることを確認しておきます。問題無ければ、 rsync を以下の通り実行します。
1 2 |
# [RTR] GL-AR750S_A7 --> GL-AR750S_E4 [AP] root@GL-AR750S_A7:~# rsync -avzz --delete -e ssh /mnt/sda1/backup/GL-AR750S_A7/ root@@GL-AR750S_E4:/mnt/sda1/backup/GL-AR750S_A7 |
未だに元・先パスの末尾のスラッシュを理解していないのでよく間違えるのですが、元がスラッシュ、先はスラッシュ無し。逆にAP側からAPのバックアップファイルを同期してみます。
1 2 |
# [RTR] GL-AR750S_A7 <-- GL-AR750S_E4 [AP] root@GL-AR750S_E4:~# rsync -avzz --delete -e ssh /mnt/sda1/backup/GL-AR750S_E4/ root@GL-AR750S_A7:/mnt/sda1/backup/GL-AR750S_E4 |
ちなみに、 rsync のオプションをいつも通りに -avz としていたところ、次のようなメッセージを目にしたので、 -avzz としました。
1 2 |
This rsync lacks old-style --compress due to its external zlib. Try -zz. Continuing without compression. |
ひとまずこの部分を先ほど、 cron に登録したバックアップタスクに連結追加して、しばらく運用しようと思います。