Raspberry Pi (RasPi) を使ってリモートサーバ上にあるバックアップファイルを定期的に取得し、それを手元にある適当なハードディスクに自動的に保存していくことを考えます。
手順は (a) リモートサーバ から SCP を使ってローカルの RasPi にファイルを転送し、(b) それを RasPi にマウントした外付けHDDに保存するの2つです。
実行環境は下記のとおりです。
ハードウェア | OS version/フォーマット形式 | |
---|---|---|
Raspberry Pi | Zero W V1.1 | Raspbian GNU/Linux 10 (buster) |
サーバ | – | Ubuntu 18.04.2 LTS |
ハードディスク | I-O Data 1TB | NTFS |
キーボード操作を多用しますので、あらかじめVNCクライアントなどで外部操作できるように設定されることをお勧めします。こちらの記事などを参考にされてください。
(1) RasPiで公開鍵認証
RasPi からリモートサーバに接続するための鍵を作成します。初期状態の RasPi には鍵置き場の ~/.ssh ディレクトリがありませんので、まずはターミナルを開いてこれを作ります。
1 2 3 4 |
$ ls -la ~/.ssh $ mkdir ~/.ssh $ chmod 700 ~/.ssh $ cd ~/.ssh |
ssh-keygen で秘密鍵と公開鍵を作成します。パスワードは今回は不要なのでエンターキーを押して先に進みます。
1 2 3 4 |
$ ssh-keygen -t rsa -b 4096 Generating public/private rsa key pair. Enter file in which to save the key (/home/raspi/.ssh/id_rsa): Enter passphrase (empty for no passphrase): |
鍵が作成されていることを確認し、公開鍵の内容をコピペします。
1 2 3 4 |
$ ls id_rsa id_rsa.pub $ cat id_rsa.pub | xsel --clipboard --input |
Chromium ブラウザを開いて契約しているサーバのコンソールにアクセスし、この一時保存された文字列を公開鍵の入力欄に貼り付けます。
もしくはサーバの設定を一時的に変更して、パスワード認証を解禁し、ファイルを直接的にサーバに転送してしまいます。
1 |
$ scp -P 2222 id_rsa.pub foo@example.com:~/.ssh/authorized_keys |
※このコマンドを実行するとサーバにある authorized_keys ファイルが上書きされるので注意してください。
公開鍵の設定が終わったら、公開鍵暗号を使用して実際に RasPi からサーバにアクセスしてみます。
1 |
$ ssh -p 2222 foo@example.com |
無事にアクセスできれば、準備は完了です。
(2) ハードディスクのマウント設定
USB ケーブルによって接続されたハードディスクに RasPi のデータを保存するために、常に指定された場所にディスクをマウントするように設定を書き足します。
まずはハードディスクを USB ケーブルで接続してデバイス情報を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo fdisk -l ... Disk /dev/sda1: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors Disk model: HDPC-UT Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xa7aa12ba Device Boot Start End Sectors Size Id Type /dev/sda1 2 1953525167 1953525166 931.5G 7 HPFS/NTFS/exFAT |
Disk /dev/sda1 が該当デバイスだと分かったので、このデバイスの属性を表示します。
1 2 |
$ sudo blkid /dev/sda1 /dev/sda1: LABEL="BACKUP-DISK" UUID="3334818A5A078A71" TYPE="ntfs" PTTYPE="dos" PARTUUID="a7aa12ba-01" |
ハードディスクの固有番号(UUID)が得られますので、これを指定の場所(ここでは disk01)にマウントできるように設定ファイルに追記します。設定ファイルを書き換えて保存したら、設定を反映させるために RasPi を再起動します。
1 2 3 4 5 |
$ sudo vi /etc/fstab UUID="3334818A5A078A71" /mnt/disk01 ntfs-3g defaults,nofail 0 0 $ sudo mkdir /mnt/disk01 $ sudo reboot |
ハードディスクを接続したまま再起動を行うと、/mnt/disk01 にハードディスクがマウントされているはずです。
ここに定期的にファイルを保存するための dump というディレクトリを作成しておきます。
1 |
$ mkdir /mnt/disk01/dump/ |
(3) cron による定時実行
ここまでで RasPi からリモートサーバに接続し、バックアップファイルを取得し、外付けハードディスクに保存できるようになっています。
そこで実際にサーバからファイルを取得してハードディスクに保存してみます。
1 |
$ scp -P 2222 foo@example.com:/var/dump/* /mnt/disk01/dump |
これが実行できていれば、あとはこの作業を定期的に自動で繰り返せば良いわけです。その準備のために、まずは root ユーザにパスワードを設定してシスログデーモンの設定を行います。
ここでやらなくても良いのですが、初期状態の RasPi には root パスワードが設定されておらず、そろそろ不便に思えてきたので今やります。
1 2 |
$ sudo passwd root $ sudo vi /etc/rsyslog.conf |
/etc/rsyslog.conf を開くと #cron.* /var/log/cron.log という記述がありますので、文頭の # を削除してファイルを保存したのち rsyslog を再起動します。
1 |
$ sudo /etc/init.d/rsyslog restart |
この設定を行うことで cron のログが /var/log/cron.log に出力されるようになります。シスログの設定ができましたら、次は cron そのものの設定です。
1 2 3 4 5 6 7 8 9 10 11 |
$ sudo vi /etc/default/cron ... # For quick reference, the currently available log levels are: # 0 no logging (errors are logged regardless) # 1 log start of jobs # 2 log end of jobs # 4 log jobs with exit status != 0 # 8 log the process identifier of child process (in all logs) # #EXTRA_OPTS="" |
ここで重要となるのは EXTRA_OPTS=”” の設定です。-L の引数のあとに指定する数字で出力するログ内容を選択できます。何も出力しない場合は 0, 全てを出力する場合は 15 (0+1+2+4+8=15) といった具合に設定する数字によって出力内容が選択されます。
取りあえずは動作確認のために EXTRA_OPTS=”-L 15″ を設定してファイルを上書き保存します。そして設定を反映するために cron を再起動して、crontab に先ほどファイル保存に使用したコマンドを記載します。
1 2 3 4 5 |
$ sudo /etc/init.d/cron restart $ crontab -e # m h dom mon dow command 5 7-19 * * 1-6 scp -P 2222 foo@example.com:/var/dump/*.zip /mnt/disk01/dump/ |
これで RasPi をUSB充電器につないで常時稼働させておけば、定期的にリモートサーバからファイルを取得してローカルのハードディスクに保存し続けます。
Raspberry Pi Zero W は格安で購入できるので、中途半端な容量のハードディスクを再利用するのに良いかも知れません。