背景レンタルサーバ上のwordpressのファイルや、ローカルにあるファイル共有サーバ内のファイルを定期的に自動でバックアップしたいと思ったことがある人は多いと思います。私も常々そう思っていましたが、まあまだデータが消えるようなことは起きないだろうと根拠なく考え、結局やらずじまいでした。最近大事なデータが危うく無くなる事態に遭遇し、やはりバックアップは大事だと実感しました。そこで指定したファイルのバックアップを指定時刻に自動で作成する環境をようやく構築したので、その手順をメモしておきます。server、レンタルサーバなど)のファイルをバックアップサーバに接続された外付けHDDに毎日午前3時に保存させるようにします。具体的には、バックアップサーバがrsyncというLinuxコマンドによってバックアップを作成します。rsyncによるバックアップ作成を定期的に実行するために、Linuxのcronという仕組みを利用します。環境の構築とは言っていますが、単純にrsyncを実行するシェルスクリプトをcronで定期実行するだけです。rsyncについてrsyncはscpと似ています。私自身rsyncとscpの違いについてよくわかっていませんでしたが、大事な違いとしては、rsyncは差分転送できるという点です。scpは差分転送はできないです。rsyncとscpの違いについては以下のサイトに詳しく書いてあり、大変参考になりました。ありがとうございました。Pocketscpとrsyncの所作の違い。以下の環境で構築しました。今回の方法ではリモートサーバ(今回はレンタルサーバ)はssh接続が可能であることを前提としています。1.0TB(こちらにレビュー書いてます。)以降では、ローカルのファイル共有サーバの共有フォルダのファイル、レンタルサーバのファイル、それぞれのバックアップをバックアップサーバに接続された外付けHDDに作成する環境構築の手順についてメモします。して以下が必要になります。外付けHDDをバックアップサーバにマウント共有フォルダをバックアップサーバにマウントまずこれらの事前準備についてメモします。Desktopのユーザ名)に自動でマウントされていたので、すでにマウントされている場合は以下の外付けHDDのマウントについては不要になります。外付けHDD、共有フォルダのマウント用ディレクトリを作成これは以下のコマンドでOKです。以下では外付けHDDのマウント先として「/media/external」、共有フォルダのマウント先として「/mnt/smbfs」というディレクトリを作成しています。/mnt/smbfsちなみに、マウントポイントとして「/media」、「/mnt」のどちらを使うかは、厳密なルールはないようです。個人的な使い分けとしては、USB、外付けHDDなどのリムーバルディスクは「/media」にマウントし、「/mnt」は共有フォルダとか用にしてました。一応以下のURLに「/media」、「/mnt」の目的が載っているので興味のある方は参照ください。Standardファイル共有サーバのフォルダをバックアップサーバにマウントファイル共有サーバの共有フォルダをマウントするために、「cifs-utils」をインストールする必要があります。cifs-utils「cifs-utils」をインストールしたら、あとは以下のコマンドで共有フォルダをマウントすることができます。(上記で作成したマウント先ディレクトリのパス)共有フォルダのユーザ名:user共有フォルダのユーザ名に対するパスワード:pass以下のコマンドによってWindowsの共有フォルダをマウントすることができます。Serverの起動時に自動でマウントするようにします。そのためには、「/etc/fstab」を編集して起動時にマウントしたい共有フォルダの情報を追記します。/etc/fstab追記内容は以下のとおりです。最後の1行が追記した部分でそれ以外は私の環境でのデフォルトで記述されていた内容です。0追記した部分は、以下のように共有フォルダのパス、マウント先、ユーザ名、パスワードです。0なお、最後にある2つの0は、それぞれdump(バックアップ)オプション、fsck(ファイルシステムのチェック)オプションを意味しており、0で無効、1ならば有効です。fstabの書式とオプションについては以下のサイトが参考になりました。すぱいだー日記fstabに追記し終えたら、試しに以下のmountコマンドでマウントし直してみます。「-a」はfstabに記載されたファイルシステムすべてをマウントするためのオプションです。-a実行結果に何も表示されなければ正常にマウントされたはずです。試しにマウントディレクトリに移動して中身を確認してみるといいです。エラーが出る場合は、以下のサイトを参考にWindows7のレジストリの値を変更することで直る場合があるようです。レジストリをいじることになるので慎重に自己責任でお願いします。mount.cifs)Windowsの共有フォルダをLinuxでマウントして使用する方法rsyncを使ったシェルスクリプト事前準備ができたら次にrsyncコマンドを含むシェルスクリプトを作成します。今回作成したシェルスクリプトを以下に載せます。以下のシェルスクリプトの使用は自己責任でお願い致します。シェルスクリプトの中に全角スペースが入ると動作しないので気をつけてください。ログファイルの存在チェック。「-n」は、Non-zeroであるかどうかを確認するためのもの。Non-zeroならばTRUEとなる。rsyncのコマンド用のオプションを指定。rsyncのコマンド用のオプションを指定。バックアップディレクトリが1つもないので、--link-destオプションは使用しない。$TMPLOGなお、上記のシェルスクリプトでは、rsyncでできない部分のうち、以下の点をその他のLinuxコマンドで実現しています。作成してから指定日数以上経過したバックアップは削除し、指定した日数分のバックアップだけを残す。バックアップ作成の結果をログとして残し、さらに指定したメールルアドレスにログ内容を送信する以下に上記のシェルスクリプトの簡単な説明をメモします。7,10行目ここではそれぞれバックアップを作成する元のディレクトリとバックアップ作成先のディレクトリを指定しています。バックアップ作成元は上記で作成した共有フォルダのマウントディレクトリ、バックアップ作成先には同じく上記で作成した外付けHDDのマウントディレクトリを指定しています。25、28行目この行では、3つのコマンドをパイプでつなげて$DESTDIRにある最新のバックアップフォルダの名前を取得してそれを変数LASTBACKUPに保存しています。-1」よって抽出してリストしたもののうち一番上にあるもの、すなわちタイムスタンプが最新のディレクトリ名を取得しています。28行目は逆に$DESTDIRにある最古のバックアップフォルダの名前を取得してそれを変数OLDESTBACKUPに保存しています。-tr」のrがタイムスタンプの古い順での表示を指示するオプションです。31行目ここでは、「20140101backup」といったようにシェルスクリプト実行日の年月日に文字列「backup」が結合された文字列を変数NEWBACKUPに保存しています。このNEWBACKUPが新しく作成バックアップディレクトリの名前になります。「`date+%Y%m%d`」で日付の表示形式を指定しており、これらをバッククオートで囲むことでコマンドとして認識し実行させています。条件式の中の「-n」はNon-zeroであるかどうかを判定するためのものです。これでLASTBACKUPに格納された名前と同じ名前を持つディレクトリが存在するかを判定しています。41行目mailコマンドを使って$TMPLOGの内容をメールで送信しています。$MAILADD上記の記述によって、catコマンドで$TMPLOGの内容を表示、そしてその表示結果をパイプでmailコマンドに渡しています。このようにすることで、$TMPLOGの内容を本文とするメールを送信できます。$HOSTNAME”」は件名です。「-s」が件名を指定するオプションです。$HOSTNAMEはubuntuのホスト名を表す環境変数です。最後にある$MAILADDが送信先のメールアドレスになります。mailコマンドを使ってメールをgmailに送信するための手順をこちらにまとめたので、必要な方は参照下さい。50,58行目rsyncのオプションを指定しています。「-av」のうちのaオプションは、元ファイルのパーミッションやグループなどを保持したままコピーするためのもので、オプションとして「-rlptgoD」を付加したのと同じ意味です。vオプションは、コピーしたファイル名を表示するためのものです。-link-dest」をオプションとして付加し、続けて差分を取る対象となるディレクトリ、すなわちLASTBACKUPを指定しています。-link-dest」を付加せずにオプションとして「-av」だけ指定します。ここでのLASTBACKUPの存在可否によるオプション指定によって、rsyncコマンドが最終的に以下のように分かれます。$TMPLOG」を指定することでrsyncによってコピーされるファイル名などのログが、$TMPLOGに追記されていきます。$TMPLOGで指定したログファイルのサイズがかなり大きくなります。このシェルスクリプトでは、最終的に$TMPLOGの内容をメール送信しその後削除してしまいますが(92、93行目)、もしログを削除せず残す場合は、ログローテーションの仕組みを取り入る必要があります。$TMPLOG」に変更してログを残すようにすればいいかと思います。「–link-dest」オプションを使って外付けHDDに差分バックアップを作成する場合、差分バックアップの作成先となる外付けHDDのフォーマットがext3などである必要があります。詳しくはこのページの最後にメモしました。変数codeに格納される「$?」は特殊変数というもので、この特殊変数が呼ばれた直前に評価された判定結果を参照できるそうです。ここでは、rsyncコマンドの評価結果が変数codeに格納されます。その値が0(正常終了)でなかった場合の処理がエラー対策処理として次の行に記述しています。特殊変数などシェルスクリプトに関して参考にしたサイトを以下にメモしておきます。webzoit.net72行目rsyncの実行結果が正常終了でなかった場合の処理です。この場合はLOGの内容とcodeの内容をメールで$MAILADDに送信しています。「mail」コマンドによるメールの送信については、こちらにまとめましたので必要な方は参考にして頂ければと思います。82行目25、28行目と同じ要領で$DESTDIRにあるバックアップフォルダの数を取得しています。-l」が行数を数えるコマンドで、これによって文字列「backup」を含むフォルダ数を取得しています。後はMAXNUM以上あった場合に一番古いバックアップフォルダを削除しています。あとは作成したシェルスクリプトには用途に合わせて適切な実行権限を与えておきます。今回は以下のようにしました。上記で実行権限を与えたシェルスクリプトをcronに登録して指定した時刻に自動実行させます。cronについては、以下のサイトにわかりやすく解説してあるので省略します。ありがとうございました。DQNEO起業日記rsyncを含むシェルスクリプトがcronに設定した時間に自動で実行できれば、これでバックアップを自動作成する環境の構築の完了です。リモートサーバのバックアップを作成するリモートサーバのバックアップを作成する場合もファイル共有サーバの場合とほぼ同じです。シェルスクリプトにいくつか追加する情報と修正する部分があるのでその部分のみをメモします。リモートサーバにssh接続するための情報を追記リモートサーバにssh接続するために必要なユーザ名、パスワード、ホスト名をシェルスクリプトの「#!/bin/bash」の下あたりに追記します。公開鍵認証をして接続する場合は、鍵の指定もします(KEY=/home/ubuntu/.ssh/hogehoge.keyの部分が該当)。ssh接続する場合のポート番号はリモートサーバ、レンタルサーバによって異なるので、適宜変更してください。#ホスト名PORT=22KEY=/home/ubuntu/.ssh/hogehoge.keyexpectコマンドでパスワード入力を自動化してssh接続まずexpectコマンドを使用するために以下でインストールしておきます。expect上記のシェルスクリプトでは、rsyncコマンドの実行部分が以下のようになっていました。2>&1これを以下のように置き換えます。以下はパスフレーズありの公開鍵認証でssh接続する場合です。"上記で行っているのは、expectコマンドを使用したssh接続に必要なパスワード入力の自動化です。(yes/no)?」のようにコマンドを実行した時に予期される質問をexpectの後に記述し、質問に対する答えをsendのあとに記述しておくことで自動入力します。これによって、yes/noの入力やパスワード入力を自動化することができます。詳しくは以下のサイトが参考になりました。ありがとうございました。lifeまた、rsyncコマンドの部分は「-e」オプションによって、ssh接続で必要な設定を行っています。$DESTDIR/$NEWBACKUP「-i」オプションで鍵ファイルを指定し、「-p」オプションでポート番号を指定しています。sshのオプションについては以下のサイトで確認できます。OpenSSH日本語マニュアルページちなみに、パスフレーズありの公開鍵ではなくパスワード認証でのssh接続を自動化したい場合は、以下のようにします。$PORT」のみを記述しています。当然ながらexpectの後に続く質問内容や、sendの後に続く答えが正確でなければ、expectコマンドは動作しないです。今回はすぐにできたexpectコマンドを使ってしまいましたが、expectコマンドは日本語入力ができないなどの問題点もあるようです。よって、ssh接続の他の方法としてsshpassコマンドを使う方法なども考えたほうがいいかもしれません。ここらへんについては以下が勉強になりました。ありがとうございました。出るrysncのログを確認すると大量にこのエラーが出ていました。-link-dest」オプションを使用してハードリンクを作成しようとしていたことが原因のようです。FATなどWindowsのフォーマットのHDDだとハードリンクを作成できずにこのエラーが出るようです。よって、このエラーを出さずに差分でバックアップを作成したい場合は、HDDのフォーマットをext3などにする必要があります。(英語)まとめLinuxのコマンドやシェルスクリプトは奥が深く勉強不足だと改めて感じました。なんとか調べながら自分が望む動作をさせるようにすることができましたが、色々な観点から見て無駄や間違っている部分、不十分な点があるのだと思います。何かおかしい点や改善点があったらぜひとも教えて頂ければと思います。後で読むサービスのPocketにかなり近く、機能豊富なオープンソースのWallabagをUbuntuにインストールしたのでその手順をまとめます。クラウドストレージは便利な反面、見知らぬ人が自分のファイルを閲覧できてしまったり公開状態になってしまっていたりというバグが発生し得ます。WireGuardはOpenVPNよりもシンプルで高速、より安全なVPNとして開発が進められており、OpenVPNに代わるVPNとして期待されています。コメントをキャンセルメールアドレスが公開されることはありません。virtualiment。