A
とB
の2台のマシンがあります。マシンA
はB
にSSH接続できます。 A
には十分な空き容量があります。 B
のデータは一種の危険な状況にあります。 B
のすべてのデータをA
に自動的にバックアップする方法を教えてください。それほど頻繁に行う必要はありませんが、ハンズフリーである必要があります。 A
が起動するたびに、十分な頻度があります。同期でこれができると聞きました。
ほとんどのLinuxディストリビューションでこれを毎日行うには、rsync
コマンド( @ guidoの回答 に従って)をスクリプトに入れ、/etc/cron.daily
ディレクトリ。 anacron
がインストールされている限り(デフォルトではない場合があります)、マシンの電源が入っていない場合、cron.daily
のジョブは次のマシンの起動時に追いつきます(マシンが切り替えられた場合は真夜中に実行されます) )。
スクリプトの場合は、次のようにします。
#!/bin/sh
rsync -a user@serverB:/source/folder/ /destination_folder
バックアップが低速な(ish)接続を経由する場合、または帯域幅を節約したい場合は、-z
(圧縮)オプションを追加できますが、私の経験では、最新のマシン/ネットワークのパフォーマンスに実際に悪影響を及ぼします。
各バックアップのログを保持したい場合は、次のようにします。
#!/bin/sh
rsync -av user@serverB:/source/folder/ /destination_folder \
>/var/log/backup_log 2>&1
これがcronジョブとして機能するには、serverBにログインするには、serverAのrootに passwordless ssh が設定されている必要があります。 。 /root/.ssh
ジョブはrootとして実行されるため、これはrootアカウント(つまり、cron.daily
のキー)である必要があります。
rdiff-backupを使用することをお勧めします。私は今、自分のデータ(2つのワークステーション、2つのサーバー、および他の誰かのサーバー上の1つのアカウント)の毎晩の自動増分バックアップを作成するために使用しています。
これには以前にrsyncを使用しましたが、より便利であり、仮想マシンのディスクイメージなどの大きなファイルの増分バックアップを作成できるため、rdiff-backupに切り替えました。 rdiff-backupは、以前のrsyncバックアップスクリプトとよく似ていますが、rightで実行されます。
スクリプトファイルを、バックアップが保存されているマシンの/ etc/cron.dailyに配置しました。これにより、毎日1回、早朝にrdiff-backupが開始され、リモートマシンからデータがフェッチされます。 。
これまでのすべての回答に加えて、SSHキーに依存し、そのキーを使用してログインしたときに実行できる操作に制限があるものを次に示します。
これについては、別のユーザーを作成したり、既存のユーザー名の1つを使用したりすることはそれほど重要ではありませんが、私なら別のユーザーを作成します。以下の例では、両方のサーバーにユーザー名bkpuser
を使用します。
bkpuser
にログインしたら、パスワードなしでSSH鍵を作成します。
sshd_config
でPubkeyAuthentication
を有効にします。
ユーザーbkpuser
を作成します。非常に複雑なパスワードを設定するか、そのユーザーのパスワードログインを無効にします(実行する正確な方法は、実行しているUNIXおよびディストリビューションによって異なります)。重要なのは、ユーザーはSSHキーでのみログインする必要があるということです。 bkpuser
に、バックアップするすべてのディレクトリとファイルへの読み取りアクセス権があることを確認してください。
Aで作成したキーの公開部分をBの~bkpuser/.ssh/authorized_keys
にコピーします。接続時にコマンドを自動的に実行するようにを編集します。このコマンドは、シェルスクリプトへのポインタであってはなりません。代わりに、シェルスクリプトをキーに直接挿入します。また、キーをサーバーAからのみ使用でき、他のサーバーからは使用できないように制限を含めます。以下の例では、サーバーAに10.1.2.3
というIPアドレスを与えています。バックアップしたいファイルはすべて/data
の下にあると想定しています。
from="10.1.2.3",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="cd /data;/usr/bin/tar -cf - *; /usr/bin/logger -t BACKUP -p daemon.info \"INFO: Backup-files on $Host fetched from ${SSH_CLIENT%% *} by $USER\";" ssh-dss AA.....
@reboot
エントリをサポートするcronタブの1つを使用している場合は、ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz
コマンドを使用して、そのようなエントリをbkpuser
s crontabに追加します。それらが許可されていない場合は、いつでも設定できます。それが私のデータである場合は、おそらく毎日実行します。
SSHを使用して毎日午前4時にサーバーBをサーバーAにバックアップするための完全なソリューションを次に示します。
サーバーBからサーバーAへの自動SSH接続を作成します
ssh-keygen -t dsa -b 1024
ssh-copy-id -i ~/.ssh/id_dsa.pub "-p ssh_port root@server_a"
サーバーBにバックアップスクリプトを作成します
nano/root/backup
# !/bin/sh
# Variables loading
Host="root@server_a"
PORT=22
DIR="/var/backups/server_b"
# Directories creating
ssh -p $PORT $Host <<EOF
mkdir -p $DIR/home
logout
EOF
# Files backing up
rsync -aze "ssh -p $PORT" --delete /home/user $Host:$DIR/home
chmod 744/root/backup
サーバーBのバックアップを自動化
crontab -e
0 4 * * * /root/backup > /dev/null
詳細については、ページ Linuxでパスワードを入力せずにSSHに接続する および DebianまたはUbuntu Linuxでサーバーをバックアップする を参照してください。
これにはrsyncを使用できます(少し逆の方法で):
serverA# rsync -avz user@serverB:/path-to-backup.tar.gz /var/backup
どこ:
-avz archive, compress and be verbose