Linux サーバーのシステムバックアップ、ファイルバックアップをローカルの Windows パソコンに行う

サーバー運用者としては適宜バックアップをとっておかないと怖くて仕方がない。

自動バックアップは cron で対応可能ですが、予算の制約があるとバックアップサーバーを用意できないということもあります。

本来であれば rsync を使って2サーバー間で全ファイルを同期させるところかもしれませんが、瞬間的な復旧までは要求されない小規模サーバーを対象に、Linux サーバーをローカルの Windows パソコンにバックアップする手順を示します。

実行環境 Ubuntu 16.04 LTS と Windows10

I. Ubuntuのシステムバックアップ(tar コマンド)

ローカルの Windows パソコンへのバックアップも rsync で十分対応可能ですが、Windows の場合は Mac OS X や Linux のパソコンとは異なり、多少複雑になります。さらに、Linux と Windows でファイルのパーミッションが異なるため、復旧時に所有者やパーミッションを再設定する必要が出てきます。

それなら Linux サーバーのシステムバックアップファイルを tar コマンドで同サーバー内に作成して、そのバックアップファイルをローカルの Windows パソコンに移動させればよいと考えられます。

まずは、Linux サーバー内に、tar コマンドでシステムバックアップファイルを作成します。

ルートディレクトリに移動したうえで

$ sudo tar cpzvf /path.../backup.tar.gz --exclude=/backup.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys /

このとき、除外ファイルとして、これから作成する圧縮ファイル backup.tar.gz を指定する必要があります。

他に、/proc, /lost+found, /mnt, /sys の各ディレクトリを除外します。

$ sudo tar cpjvf /path.../backup.tar.bz2 --exclude=/backup.tar.bz2 --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys /

でもかまいません。

II. cron によるバックアップの自動化

I.でシステムバックアップファイルを作成しましたが、これを cron で自動化しておきます。

デフォルトでは、/etc/crontab は以下のようになっていました。


$ sudo vim /etc/crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

/etc/cron.daily ディレクトリ下のシェルスクリプトは午前6時台に実行される設定です。

/etc/cron.daily/system_backup シェルスクリプトを以下のように作成します。


$ sudo vim /etc/cron.daily/system_backup

#!/bin/sh
tar cpzvf /path.../backup.tar.gz --exclude=/backup.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys /

これで、最低限サーバー上に毎日バックアップファイルが作成されます。

以下は応用で、サーバー上に毎日のバックアップを3日分、週ごと、月ごとのバックアップを各1回分保持しておくためのシェルスクリプトです。


$ sudo vim /etc/cron.daily/system_backup
$ sudo vim /etc/cron.weekly/system_backup
$ sudo vim /etc/cron.monthly/system_backup

#!/bin/sh
rm /path.../daily3_backup.tar.gz
mv /path.../daily2_backup.tar.gz /daily3_backup.tar.gz
mv /path.../daily1_backup.tar.gz /daily2_backup.tar.gz
tar cpzvf /path.../daily1_backup.tar.gz --exclude=/daily1_backup.tar.gz --exclude=/daily2_backup.tar.gz --exclude=/daily3_backup.tar.gz --exclude=/weekly_backup.tar.gz --exclude=/monthly_backup.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys /

#!/bin/sh
rm /path.../weekly_backup.tar.gz
tar cpzvf /path.../weekly_backup.tar.gz --exclude=/daily1_backup.tar.gz --exclude=/daily2_backup.tar.gz --exclude=/daily3_backup.tar.gz --exclude=/weekly_backup.tar.gz --exclude=/monthly_backup.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys /

#!/bin/sh
rm /monthly_backup.tar.gz
tar cpzvf /path.../monthly_backup.tar.gz --exclude=/daily1_backup.tar.gz --exclude=/daily2_backup.tar.gz --exclude=/daily3_backup.tar.gz --exclude=/weekly_backup.tar.gz --exclude=/monthly_backup.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys /

III. バックアップファイルからのシステム復旧

サーバーのデータが破損して、システム全体を復旧しなければならない場合、I.で作成したシステムバックアップファイルが役立ちます。

ルートディレクトリに移動して


$ sudo tar xpzvf /path.../backup.tar.gz

または


$ sudo tar xpjvf /path.../backup.tar.gz

で、圧縮ファイルを展開します。

どの段階からシステム復旧するかによりますが、既存のファイルはオーバーライトされますので、ご注意を。

圧縮ファイルでは、proc, lost+found, mnt, sys の4ディレクトリを省いていたので、それらを追加します。


$ sudo mkdir proc
$ sudo mkdir lost+found
$ sudo mkdir mnt
$ sudo mkdir sys

リブートしてください。

これで復旧できるはずですが、試したことはないのでご容赦を!

続きはこちら LinuxサーバーのバックアップをWindowsパソコンに(II)

IV. PSCP による Linux サーバーからローカルPCへのコピー

V. タスクスケジューラによる自動化