このサイトについてで書いているように、このブログはConoHaのVPS上で動作しています。
んで、当然定期的にフルでバックアップを取りたいのですが、ConoHa側が用意しているイメージ保存は探し回る限りダウンロードすることができず、保存から90日を経過すると自動で削除されてしまう仕様になっています。
これではあまりバックアップの意味がないので、(本来サーバが起動中にddでバックアップ取るべきじゃないけれど)ネットワーク越しでddとsshを使いバックアップを取るようにしました。その記録です。

目次

注意事項

この記事に記載されている内容を実行し、発生したいかなる問題について当サイト管理者は一切責任を負いません。自己責任でお願いします。

環境

ローカル

  • Linux Mint 19.2 Tina
    cat /etc/*-release
  • Coreutils(dd): 8.28
    apt version coreutils
  • OpenSSH: 7.6
    ssh -V
  • gzip: 1.6
    gzip -V

リモート

  • CentOS 7.6.1810
    cat /etc/*-release
  • Coreutils(dd): 8.22
    yum info coreutils
  • OpenSSH: 7.4
    ssh -V
  • gzip: 1.5
    gzip -V

アップデートサボり過ぎだな…今度気が向いたときに一通りアップデートしなければ。

コマンド

ssh -p <ポート> -i <認証鍵パス> <ユーザー名>@<VPSのIP> sudo dd if=<バックアップを取るデバイスファイルパス> status=progress | gzip - | dd of=<保存先パス> 2>&1 | tee <ログファイルパス>

実行する前に、<と>で囲まれているところを埋める必要があります。それぞれの意味や例は以下。

  • <ポート>: SSHのポートです。変えているならば設定してください。
  • <認証鍵パス>: 公開鍵認証方式での秘密鍵のパスを指定してください。公開鍵認証方式で接続しないなら設定する必要はありません。
  • <ユーザー名>: SSHのログインユーザー名です。rootとか。(公開サーバでrootログインはダメだぞ!)
  • <VPSのIP>: 対象VPS(リモート)のIPアドレスを設定してください。
  • <バックアップを取るデバイスファイルパス>: バックアップを取る対象VPS(リモート)のデバイスファイルパスを設定してください。例えば/dev/sda1とか。
  • <保存先パス>: ローカルで保存する先を指定してください。拡張子は.gz<サーバ名>.img.gzとかがいいと思います。
  • <ログファイルパス>: ログを取るならば設定してください。ログがいらないなら2>&1 | tee以降不要です。

詳しい解説

まず、このコマンドを実行してリモートとローカルで実行されるコマンドがそれぞれどれなのかをはっきりしなければ頭がこんがらがるでしょう(私はこんがらがるのでいつも一旦分解します)。整理します。

sudo dd if=<バックアップを取るデバイスファイルパス> status=progress
ssh -p <ポート> -i <認証鍵パス> <ユーザー名>@<VPSのIP>

gzip -
dd of=<保存先パス> 2>&1
tee <ログファイルパス>

パイプを改行してしまっていますが、上がリモート、下がローカルです。

まず、sshでリモートサーバに接続します。その後、ddコマンドをリモートで実行させます。
ddはofを設定しないとstdout(標準出力)に吐き出されるので、それをローカルのパイプでキャッチします。
なお、ddにstatus=progressを設定すると画像のように進捗状況が出力できます。SIGUSR1シグナルを送る(pkill -USR1 dd)のが割と多く出てきますが、Cureutilsのバージョンがそれなりであればstatus=progressが使えるはずです。

その後、ローカルでgzip圧縮し、圧縮データを標準出力に吐き出します。ネットワークが貧弱ならリモートで圧縮してから受信してもいいと思いますが、試してませんしパイプをリモートで実行させる方法をよく理解してません。
で、パイプをまた使いddコマンドでファイル出力します。ifを設定しないと標準入力(stdin)を使用するので標準出力からgzipでの圧縮データを受け取り、ofでファイルに出しています。

圧縮については気になるならばbzip2とかでもいいのかもしれませんが、圧縮に時間がかかって結果的に全体処理が遅くなってもどうかと思うのでgzipを選択しています。gzipでも50GBのディスクイメージを35GBくらいには圧縮できるので、十分かなと。
時間としてはネットワークやローカルのスペックにもよりますが、1時間は基本掛かると思います…。その間にサーバ側で変なことが起こらないことを願いましょう。
本来、バックアップを取る時にバックアップを取られる側のサーバ(リモート)が動作しているというのは絶対に好ましくない状態ではありますが、VPSの場合リモートがオンラインでないと当然どうしようもないので、止められるものはなるべく止めてからバックアップを取る…くらいはしておきましょう。

以上です。

Categories: 備忘録