Ubuntu18.04でユニゾンを使用して大規模なディレクトリをバックアップする方法
序章
Unison は、オープンソースのファイル同期ツールです。 少数のファイルのみが追加または更新された大量のデータをバックアップする場合に非常に効率的です。 この状況は、たとえば、企業のSambaファイルサーバーまたは電子メールサーバーで発生します。
これらのサーバー内のファイルの大部分は同じままですが、毎日少数が追加または変更されます。 Unisonは、数百万のファイルとテラバイトのデータがある場合でも、これらの新しいファイルを非常に迅速に検出してバックアップすることができます。 このような状況では、 rsync などの従来のツールは、同じバックアップ操作を実行するのに時間がかかる場合があります。
このチュートリアルでは、サーバーのペアにUnisonをインストールして構成し、それを使用してディレクトリをバックアップします。 また、SSHを安全な通信プロトコルとして使用するようにUnisonを構成し、cronジョブを作成して定期的にUnisonを実行します。
前提条件
このガイドを開始する前に、次のものが必要です。
- Ubuntu18.04ガイドを使用した初期サーバーセットアップを使用して構成された2つのUbuntu18.04サーバー。
- Cronを使用してVPSでタスクを自動化する方法ガイドを読んで、crontabエントリの作成に精通している必要があります。
このガイドでは、次の2つのサーバーを使用します。
- primary server:バックアップするデータをホストするサーバー。
- backup server:バックアップされたデータをホストするサーバー。
ステップ1—追加の非ルートユーザーの作成
Ubuntu 18.04 を使用した初期サーバー設定チュートリアルでは、プライマリとバックアップの両方でsammyという非ルートsudoユーザーを作成する手順を説明しました。サーバ。 このステップでは、2つの新しいユーザーを作成します。1つは primary サーバー上に、もう1つはbackupサーバー上に作成します。 これにより、ガイドを操作する際の混乱を防ぐことができます。ガイドの最後でSSHセキュリティ構成が有効になっている場合は、backupサーバーで代替の非rootsudoユーザーが必要です。
プライマリサーバーとバックアップサーバーの両方に、2つのターミナルウィンドウでSSH経由でsammyユーザーとしてログインする必要があります。 次の2つのSSHコマンドは、これらのサーバーにログインします。
- ssh sammy@primary_server_ip
- ssh sammy@backup_server_ip
まず、 primary サーバーで、次のコマンドを使用してprimary_userという新しいユーザーを作成します。
- sudo adduser primary_user
次にそれらを与える sudo
アクセス権:
- sudo usermod -aG sudo primary_user
最後に、アカウントをprimary_userに変更します。
- su - primary_user
次に、 backup サーバーで同じ手順を実行しますが、backup_userという名前の新しいユーザーを作成します。 ガイドの残りの部分では、プライマリサーバーとバックアップサーバーにこれらのユーザーとしてログインしていることを確認してください。
両方のサーバーに必要なユーザーを作成したので、Unisonソフトウェアのインストールに進むことができます。
ステップ2—両方のサーバーにUnisonをインストールする
このステップでは、両方のサーバーにUnisonパッケージをインストールします。
Ubuntuパッケージマネージャーを使用します apt
両方のサーバーにUnisonをインストールします。 使用する場合 apt
久しぶりに、次のコマンドを使用してローカルパッケージインデックスを更新する必要があります。
- sudo apt-get update
これにより、最新バージョンのUnisonを確実にインストールできます。 これは、インストールエラーを回避するのにも役立ちます。
次に、Unisonをインストールします。
- sudo apt-get install unison
これで、Unisonのインストールが完了しました。 次のステップでは、Unisonが2つのサーバー間で通信できるようにSSHを構成します。
ステップ3—SSHキーの作成とSSHの構成
SSH接続にキーベースの認証を使用するため、最初に行う必要があるのは、プライマリサーバー上にSSHキーペアを作成することです。 キーベースの認証の利点は、パスワードを入力しなくても安全な接続が可能になることです。 自動バックアップ手順を作成するため、これは重要です。この手順は、発生するたびにパスワードを入力せずに実行する必要があります。
プライマリサーバーでそのキーペアを取得したら、公開キーをバックアップサーバーにコピーし、UnisonがSSHを使用してサーバー間で通信できることをテストします。
確認することから始めます .ssh
ディレクトリが存在します:
- mkdir .ssh
primaryサーバーのprimary_userホームディレクトリから次のコマンドを実行して、SSHキーペアを生成します。
- ssh-keygen -t rsa -b 4096 -f .ssh/unison-primary
SSHキーペアを作成するときは、通常、強力なパスワードを使用します。 ただし、Unisonは自動的に実行されるため、実行するたびにパスワードを手動で入力することはできません。 ヒット ENTER
パスワードを入力せずにキーを押します。 これにより、パスワードなしのSSHキーペアが生成されます。
ここで使用されるオプションは、次のことを意味します。
-t rsa
:作成するキーの種類を設定します。 RSAキーは最も互換性のあるタイプです。-b 4096
:キーの長さを設定します。 キーが長いほど、安全性が高くなります。 キーの長さ4096
RSAキーの現在の推奨キー長です。-f .ssh/unison-primary
:キーの名前と保存場所を設定します。 この場合、キーをSSHのデフォルトディレクトリに保存します。.ssh
、お好みの名前を使用します。
上記のコマンドは、次の2つのファイルに公開SSHキーと秘密SSHキーを作成します。
.ssh/unison-primary
.ssh/unison-primary.pub
1つ目は秘密SSHキーで、2つ目は公開キーです。 公開鍵ファイルの内容をバックアップサーバーにコピーする必要があります。 コピー用の公開鍵ファイルの内容を表示する最も簡単な方法は、 cat
内容を端末に出力するコマンド:
- cat .ssh/unison-primary.pub
backup_userホームディレクトリのbackupサーバーで、 .ssh/authorized_keys
テキストエディタでファイル。 ここでは、 nano
:
- nano .ssh/authorized_keys
公開鍵をエディターに貼り付けてから、保存して終了します。
これで、SSH経由でプライマリサーバーからバックアップにログインすることにより、SSH構成が機能していることをテストできます。 backup サーバーのSSHサーバーのキーフィンガープリントを受け入れて保存する必要があるため、これは重要です。そうしないと、Unisonが機能しません。 primary サーバー上の端末で、primary_userのホームディレクトリから次のコマンドを実行します。
- ssh -i .ssh/unison-primary backup_user@backup_server_ip
The -i .ssh/unison-primary
オプションは、SSHに特定のキーまたはIDファイルを使用するように指示します。 ここでは、新しいを使用します unison-primary
作成したキー。
を押して指紋を受け入れる Y
その後 ENTER
、およびログインとログアウト。 サーバー間でSSHが機能することを確認し、backupサーバーのSSHフィンガープリントを保存する必要があります。 指紋は手動でのみ保存できるため、チュートリアルの後半でプロセスを自動化する前に保存する必要があります。
次に、primaryサーバーのprimary_userホームディレクトリから次のコマンドを実行して、Unisonが接続することを確認します。
- ssh -i .ssh/unison-primary backup_user@backup_server_ip unison -version
このコマンドでは、接続のテストに使用したものと同じSSHコマンドを使用し、さらに unison
最後にコマンド。 SSH接続の最後にコマンドが配置されると、SSHはログインし、コマンドを実行してから終了します。 The unison -version
コマンドは、バージョン番号を出力するようにUnisonに指示します。
すべてが機能している場合は、backupサーバー上のUnisonのバージョンを示す応答が表示されます。
Outputunison version 2.48.3
UnisonがSSHキーを使用してサーバー間で通信できることを確認したので、Unisonの構成に進む準備ができました。
ステップ4—ユニゾンの設定
この手順では、プライマリサーバーからバックアップサーバーへのディレクトリで単純な一方向バックアップを実行するようにUnisonを構成します。
Unisonを構成するには、最初にprimaryサーバー上のprimary_userのホームディレクトリの下に構成ディレクトリを作成する必要があります。
- mkdir .unison
次に、次の名前の新しいファイルを開く必要があります default.prf
のテキストエディタで .unison
ディレクトリ。 このファイルには、ユニゾン構成が含まれています。 次のコマンドでファイルを開きます。
- nano .unison/default.prf
次に、次のように入力します。
force = /home/primary_user/data
sshargs = -i /home/primary_user/.ssh/unison-primary
これらの行の意味は次のとおりです。
force
:これにより、変更がプライマリサーバーからバックアップサーバーにのみプッシュされるようになります。 The/home/primary_user/data
pathは、バックアップするデータを保持するディレクトリの場所です。sshargs
:このオプションは、生成したSSHキーを使用するようにUnisonに指示します。
バックアップするデータを保持するディレクトリがprimary_userホームディレクトリの下にない場合は、primary_userによって読み取りおよび書き込み可能であることを確認する必要があります。 Linuxの所有権とアクセス許可に慣れていない場合は、Linuxアクセス許可の概要ガイドで詳細を確認してください。
これでUnisonが構成され、ディレクトリをバックアップしてテストに進むことができます。
ステップ5—Unisonを使用してディレクトリをバックアップする
これで、Unisonが構成されたディレクトリをバックアップする準備が整いました。 あなたはバックアップします /home/primary_user/data
プライマリサーバー上のディレクトリ /home/backup_user/data/
バックアップサーバー上のディレクトリ。 バックアップするデータを含むディレクトリは、 .unison/default.prf
強制オプションの横。
Unisonが機能していることをテストするには、バックアップするためのデータが必要になります。 primary サーバーに空のファイルをいくつか作成し、Unisonがそれらをbackupサーバーに転送したかどうかを確認します。
まず、 primary_user ホームディレクトリから次のコマンドを実行して、バックアップするデータを保持するディレクトリを作成します。
- mkdir /home/primary_user/data
次に、 touch
5つの空のファイルを作成するコマンド:
- touch /home/primary_user/data/file{1..5}
コマンドの最後の部分、 file{1..5}
、Bashブレース拡張を使用して5つのファイルを作成します。 bashが与えられたとき {1..5}
、不足している番号を自動的に埋めます、 2
, 3
、 と 4
. この手法は、複数のファイルをすばやく列挙するのに役立ちます。
今、あなたは data
ディレクトリとバックアップするいくつかのテストファイルの場合、Unisonを実行してファイルをbackupサーバーにバックアップできます。 次のコマンドはこれを行います:
- unison -batch -auto /home/primary_user/data ssh://backup_user@backup_server_ip//home/backup_user/data
これらのオプションは次のことを行います。
batch
-質問せずに実行します。auto
-競合しないアクションを自動的に受け入れます。
Unisonをシンプルな一方向同期モードで使用しているため、競合を解決する必要はありません。 これは、これらのオプションを安全に設定できることを意味します。
競合は、ユニゾンの他の動作モードでのみ発生する可能性があり、双方向で同期します。 このような使用例は、誰かのラップトップとデスクトップ上のディレクトリを同期することです。 デスクトップ上のファイルを更新するとき、その変更をラップトップにプッシュしたい、またはその逆を望んでいます。 ユニゾン同期が発生する前に両端で同じファイルが変更された場合、競合が発生し、ユニゾンは保持するファイルと上書きするファイルを自動的に決定できません。
一方向プッシュモードでは、プライマリのデータは常に保持され、バックアップのデータは上書きされます。
このコマンドは、最初に実行されたときに長いメッセージを出力します。 メッセージは次のようになります。
OutputContacting server...
Connected [//primary_server_ip//home/primary_user/data -> //primary_server_ip//home/backup_user/data]
Looking for changes
Warning: No archive files were found for these roots, whose canonical names are:
/home/primary_user/data
//backup_server_ip//home/backup_user/data
This can happen either
because this is the first time you have synchronized these roots,
or because you have upgraded Unison to a new version with a different
archive format.
Update detection may take a while on this run if the replicas are
large.
Unison will assume that the 'last synchronized state' of both replicas
was completely empty. This means that any files that are different
will be reported as conflicts, and any files that exist only on one
replica will be judged as new and propagated to the other replica.
If the two replicas are identical, then no changes will be reported.
If you see this message repeatedly, it may be because one of your machines
is getting its address from DHCP, which is causing its host name to change
between synchronizations. See the documentation for the UNISONLOCALHOSTNAME
environment variable for advice on how to correct this.
Donations to the Unison project are gratefully accepted:
http://www.cis.upenn.edu/~bcpierce/unison
Waiting for changes from server
Reconciling changes
dir ----> /
Propagating updates
UNISON 2.48.3 started propagating changes at 16:30:43.70 on 03 Apr 2019
[BGN] Copying from /home/primary_user/data to //backup_server_ip//home/backup_user/data
[END] Copying
UNISON 2.48.3 finished propagating changes at 16:30:43.71 on 03 Apr 2019
Saving synchronizer state
Synchronization complete at 16:30:43 (1 item transferred, 0 skipped, 0 failed)
この情報は、これが最初の同期であることを警告しています。 また、同期の実行ごとにこのメッセージが表示された場合に問題を解決するためのヒントも提供します。 最後のセクションでは、この実行中にUnisonが同期したデータについて説明します。
その後の実行ごとに、出力される情報ははるかに少なくなります。 ファイルが更新されていない場合の出力は次のとおりです。
OutputContacting server...
Connected [//primary_server_ip//home/primary_user/data -> //backup_server_ip//home/backup_user/data]
Looking for changes
Waiting for changes from server
Reconciling changes
Nothing to do: replicas have not changed since last sync.
これは次の場合の出力です /data/file1
プライマリサーバーで変更されます:
OutputContacting server...
Connected [//primary_server_ip//home/primary_user/data -> //backup_server_ip//home/backup_user/data]
Looking for changes
Waiting for changes from server
Reconciling changes
changed ----> file1
Propagating updates
UNISON 2.48.3 started propagating changes at 16:38:37.11 on 03 Apr 2019
[BGN] Updating file file1 from /home/primary_user/data to //backup_server_ip//home/backup_user/data
[END] Updating file file1
UNISON 2.48.3 finished propagating changes at 16:38:37.16 on 03 Apr 2019
Saving synchronizer state
Synchronization complete at 16:38:37 (1 item transferred, 0 skipped, 0 failed)
各同期の実行後、backupサーバーは data
primaryサーバー上のディレクトリ。
警告:新しいファイルまたは変更 data
Unisonを実行すると、backupサーバー上のディレクトリが失われます。
これで、Unisonを実行してディレクトリをバックアップできるようになりました。 次のステップでは、 cron を使用してUnisonを実行することにより、バックアッププロセスを自動化します。
ステップ6—ユニゾンCronジョブの作成
このセクションでは、Unisonを実行してバックアップするcronジョブを作成します。 data
指定された頻度でbackupサーバーへのディレクトリ。
crontab は、cronプロセスによって読み取られるファイルです。 含まれているコマンドはcronプロセスにロードされ、指定された間隔で実行されます。
次のコマンドを実行すると、現在のユーザーのcrontabの内容を表示できます。
- crontab -l
The -l
オプションは、現在のユーザーのcrontabの内容を一覧表示します。 このユーザーのcrontabを以前に編集したことがない場合は、crontabファイルがまだ存在しないため、次のエラーメッセージが表示されます。
Outputno crontab for primary_user
次に、を実行します crontab
primaryサーバーでのコマンド -e
編集モードで開くためのフラグ:
- crontab -e
デフォルトのコマンドラインエディタが設定されていない場合は、コマンドを最初に実行するときにエディタを選択するように求められます。 選択したエディターを選択して、crontabを開きます。
crontabを開いたら、既存のテキストの下の最初の空の行に次のコマンドを追加します。
...
* */3 * * * /usr/bin/unison -log -logfile /var/log/unison.log -auto -batch -silent /home/primary_user/data ssh://backup_user@backup_server_ip//home/backup_user/data
使用するコマンドは、ステップ5 で手動バックアップに使用したコマンドとほぼ同じですが、いくつかの追加オプションがあります。 これらの追加オプションは次のとおりです。
-silent
:エラーを除くすべての出力を無効にします。 Unisonをcrontabから実行する場合は、読み取る人がいないため、通常の出力は必要ありません。-log
:ユニゾンにアクションをログに記録するように指示します。-logfile
:ユニゾンがアクションをログに記録する場所を指定します。 この例では、ユニゾンは3時間ごとに実行されます。 これは、要件をより適切に満たす任意の頻度に変更できます。
crontabを編集するときはいつでも、保存して終了する前に常に下部に空の行を配置する必要があります。そうしないと、cronがcrontabファイルを正しくロードしない場合があります。 これにより、コマンドが実行されない可能性があります。
これらの変更を行ったら、ファイルを保存して閉じます。
次に、Unisonがprimaryサーバーに書き込むログファイルを作成します。 次のコマンドでこのファイルを作成します。
- sudo touch /var/log/unison.log
次に、primary_userをファイルの所有者にします。
- sudo chown primary_user /var/log/unison.log
ユニゾンバックアップのステータスは、次のログファイルを読み取ることで確認できます。 /var/log/unison.log
. Unisonは、新しいファイルまたは更新されたファイルをバックアップした場合、またはエラーが発生した場合にのみ、何かをログに記録します。
Unisonは現在crontabから定期的にバックアップしています。 最後のオプションの手順は、SSH構成をより安全にすることです。
ステップ7(オプション)—SSHの保護
このガイドでは、パスワードを持たないSSHキーを作成して使用しました。 これは、SSH経由でbackupサーバーにログインするときにbackup_userが実行できることを制限することで対処できるセキュリティ上の懸念事項です。
これを行うには、SSH経由でログインしたときにbackup_userが単一のコマンドを実行できるようにSSHを構成します。 つまり、作成したSSHキーは、Unisonバックアップの実行にのみ使用できます。他には何も使用できません。 これにより、backup_userとしてbackupサーバーにSSHで接続できなくなります。 これは、ログインには複数の許可されたコマンドが必要なためです。
backupサーバーにbackup_user としてアクセスする必要がある場合は、最初に sammy ユーザーとしてログインしてから、backup_userに変更する必要があります。 ]使用 su - backup_user
.
backupサーバーでSSH構成ファイルを編集します。 /etc/ssh/sshd_config
:
- sudo nano /etc/ssh/sshd_config
次に、ファイルの最後に次の行を追加します。
Match User backup_user
ForceCommand unison -server
これらの構成オプションは、次のことを意味します。
Match User
:リストされたユーザーがログインすると、SSHは次のインデントされた構成オプションを適用します。ForceCommand
:これにより、一致したユーザーが次のコマンドに制限されます。 この場合、backup_userはunison -server
指図。
テキストエディタを保存して終了します。 次に、SSHサービスをリロードして、新しい構成を有効にします。
- sudo systemctl reload ssh.service
これをテストするには、primaryサーバーからSSH経由でbackup_userとしてbackupサーバーにログインします。
$ ssh -i .ssh/unison-primary backup_user@backcup_server_ip
の場合 /etc/ssh/sshd_config
設定が機能している場合は、次のように表示されます。
OutputUnison 2.48
SSHセッションは、セッションがで強制終了されるまでハングします。 CTRL + C
ユニゾンがコマンドを待っているからです。
これは、Unisonサーバーがログイン時に自動的に呼び出され、Unisonサーバーとの通信以外のアクセスが不可能であることを示しています。
これで、データを必要な頻度でバックアップする、機能する安全なUnisonバックアップシステムができました。
結論
このガイドでは、SSH経由でディレクトリをバックアップするようにUnisonファイル同期ソフトウェアをインストールして構成しました。 また、指定されたスケジュールでバックアップを自動的に実行するようにcronを構成し、SSHを保護して、パスワードなしのキーが悪用されないようにしました。
Unisonを使用する必要があるかどうかを判断するときは、次の点を考慮する必要があります。
- ファイルの数が少ない場合やデータの量が少ない場合は、ユニゾンが最適な選択ではない可能性があります。 この場合、rsyncがより適切な選択になります。 rsyncの使用について詳しくは、Rsyncを使用してVPSガイドでローカルディレクトリとリモートディレクトリを同期する方法を参照してください。
- 大量のデータのバックアップには長い時間がかかる可能性があり、パブリックネットワークインターフェイスを介した帯域幅の割り当てを使い果たす可能性があります。 プライマリサーバーとバックアップサーバーの両方がDigitalOceanドロップレットである場合、プライベートネットワークを使用すると、ユニゾンバックアップをはるかに迅速かつ安全に完了することができます。 無料のDigitalOceanプライベートネットワークの詳細については、プライベートネットワークの概要のドキュメントを参照してください。