Ubuntu 16.04でUnisonを使用して大きなディレクトリをバックアップする方法

_著者はhttps://vpn-nyc3.digitalocean.com/https/www.brightfunds.org/funds/foss-nonprofits[Free and Open Source Fund]を選択してhttps:// doの一環として寄付を受け取りました。 co / w4do-cta [DOnationsの書き込み]プログラム。

前書き

Unisonはオープンソースのファイル同期ツールです。 少数のファイルのみが追加または更新された大規模なデータコーパスのバックアップに非常に効率的です。 この状況は、たとえば、企業のhttps://www.samba.org/[Samba]ファイルサーバーまたは電子メールサーバーで発生します。

これらのサーバーの大部分のファイルは同じままですが、毎日少数のファイルが追加または変更されます。 Unisonは、数百万のファイルとテラバイトのデータがある場合でも、これらの新しいファイルを非常に迅速に検出してバックアップできます。 このような状況では、https://en.wikipedia.org/wiki/Rsync [+ rsync +]のような従来のツールは、同じバックアップ操作を実行するのにより長い時間がかかる可能性があります。

このチュートリアルでは、1組のサーバーにUnisonをインストールして構成し、それを使用してディレクトリをバックアップします。 また、安全な通信プロトコルとしてSSHを使用するようにUnisonを設定し、定期的にUnisonを実行するhttps://help.ubuntu.com/community/CronHowto[cronジョブ]を作成します。

前提条件

このガイドを始める前に、次のものが必要です。

このガイドでは2つのサーバーを使用します。

  • *プライマリ*サーバー:バックアップするデータをホストするサーバー。

  • * backup * server:バックアップされたデータをホストするサーバー。

手順1-追加の非ルートユーザーの作成

Ubuntu 16.04での初期サーバー設定チュートリアルでは、* sammyという非ルートsudoユーザーを作成する方法を説明しました。 * * primary および backup サーバーの両方。 この手順では、2人の新しいユーザーを作成します。1人は primary サーバーに、もう1人は backup サーバーに作成します。 これにより、ガイドの作業中の混乱を防ぐことができます。また、ガイドの最後でSSHセキュリティ構成が有効になっている場合は、代替の非ルートsudoユーザーが backup *サーバーで必要です。

2つのターミナルウィンドウで* sammy ユーザーとしてSSH経由で primary サーバーと backup *サーバーの両方にログインする必要があります。 次の2つのSSHコマンドは、これらのサーバーにログインします。

まず、* primary サーバーで、次のコマンドを使用して primary_user *という新しいユーザーを作成します。

sudo adduser primary_user

次に、 `+ sudo +`アクセス権を付与します。

sudo usermod -aG sudo primary_user

最後に、* primary_user *アカウントに変更します。

su - primary_user

次に、* backup サーバーで同じ手順に従いますが、 backup_user という新しいユーザーを作成します。 残りのガイドでは、これらのユーザーとして primary および backup *サーバーにログインしていることを確認してください。

両方のサーバーで必要なユーザーを作成したので、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接続にキーベースの認証を使用するため、* primary *サーバーでSSHキーペアを作成することです。 キーベース認証の利点は、パスワードを入力せずに安全な接続が可能なことです。 パスワードが発生するたびにパスワードを入力せずに実行する必要がある自動バックアップ手順を作成するため、これは重要です。

プライマリ*サーバーにそのキーペアを作成したら、公開キーを backup *サーバーにコピーしてから、UnisonがSSHを使用してサーバー間で通信できることをテストします。

SSHキーペアを作成するとき、通常は強力なパスワードを使用します。 ただし、Unisonは自動的に実行されるため、実行するたびにパスワードを手動で入力することはできません。 パスワードを入力せずに「+ ENTER +」キーを押します。 これにより、パスワードなしのSSHキーペアが生成されます。

  • primary サーバーの primary_user *ホームディレクトリから次のコマンドを実行して、SSHキーペアを生成します。

ssh-keygen -t rsa -b 4096 -f .ssh/

ここで使用されるオプションは次を意味します。

  • + -t rsa +:作成されるキーのタイプを設定します。 RSAキーは、最も互換性のあるタイプです。

  • + -b 4096 +:これはキーの長さを設定します。 キーが長いほど、安全性が高くなります。 RSAキーの現在の推奨キー長は、「+ 4096+」のキー長です。

  • + -f .ssh / +:これはキーの名前とキーが保存される場所を設定します。 この場合、選択した名前を使用して、キーをSSHデフォルトディレクトリの `+ .ssh`に保存します。

上記のコマンドは、次の2つのファイルに公開および秘密SSHキーを作成します。

  • + .ssh / unison-primary +

  • + .ssh / unison-primary.pub +

最初は秘密のSSHキーで、2番目は公開キーです。 公開鍵ファイルの内容を* backup *サーバーにコピーする必要があります。 コピーのために公開鍵ファイルの内容を表示する最も簡単な方法は、 `+ cat +`コマンドを使用して内容を端末に印刷することです:

cat .ssh/unison-primary.pub
  • backup_user ホームディレクトリの backup *サーバーで、テキストエディターで `+ .ssh / authorized_keys `ファイルを開きます。 ここでは、 ` nano +`を使用します。

nano .ssh/authorized_keys

公開キーをエディターに貼り付け、保存して終了します。

これで、SSH経由で* primary サーバーから backup にログインして、SSH構成が機能していることをテストできます。 * backup *サーバーのSSHサーバーのキーフィンガープリントを受け入れて保存する必要があるため、これは重要です。そうしないと、Unisonが機能しません。 * primary *サーバー上のターミナルで、 primary_user *のホームディレクトリから次のコマンドを実行します。

ssh -i .ssh/ @

`+ -i .ssh / `オプションは、特定のキーまたはIDファイルを使用するようSSHに指示します。 ここでは、作成した新しい ` unison-primary +`キーを使用します。

「+ Y 」を押してから「 ENTER +」を押して指紋を受け入れ、ログインおよびログアウトします。 サーバー間でSSHが機能することを確認し、* backup *サーバーのSSHフィンガープリントを保存する必要がありました。 指紋は手動でのみ保存できるため、チュートリアルの後半でプロセスを自動化する前に指紋を保存する必要があります。

次に、* primary サーバーの primary_user *ホームディレクトリから次のコマンドを実行して、Unisonが接続することを確認します。

ssh -i .ssh/unison-primary [email protected] unison -version

このコマンドでは、最後にUnisonコマンドを追加して、接続のテストに使用したのと同じSSHコマンドを使用しました。 コマンドがSSH接続の最後に配置されると、SSHはログインし、コマンドを実行してから終了します。 `+ unison -version +`コマンドは、バージョン番号を出力するようUnisonに指示します。

すべてが機能している場合、* backup *サーバー上のUnisonのバージョンを示す応答が表示されます。

Outputunison version 2.48.3

UnisonがSSHキーを使用してサーバー間で通信できることを確認したので、Unisonの構成に進む準備ができました。

ステップ4-Unisonの構成

この手順では、* primary サーバーから backup *サーバーへのディレクトリで単純な一方向バックアップを実行するようにUnisonを構成します。

Unisonを設定するには、まず、* primary サーバーの primary_user *のホームディレクトリの下に設定ディレクトリを作成する必要があります。

mkdir .unison

次に、 `+ .unison `ディレクトリのテキストエディターで、 ` default.prf +`という名前の新しいファイルを開く必要があります。 このファイルにはUnison設定が含まれています。 次のコマンドでファイルを開きます。

nano .unison/default.prf

次に、次を入力します。

default.prf

force = /home//data
sshargs = -i /home//.ssh/

これらの2行の意味は次のとおりです。

  • + force +:これにより、変更は* primary サーバーから backup サーバーに only *プッシュされます。 `+ / home // data +`パスは、バックアップするデータを保持するディレクトリの場所です。

  • + sshargs +:このオプションは、生成したSSHキーを使用するようUnisonに指示します。

バックアップするデータを保持するディレクトリが* primary_user ホームディレクトリの下にない場合は、 primary_user *による読み取りおよび書き込みが可能であることを確認する必要があります。 Linuxの所有権と権限に詳しくない場合は、https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-permissions [Linux権限の概要]ガイドをご覧ください。

Unisonが構成されたので、ディレクトリをバックアップしてテストに進むことができます。

手順5-Unisonを使用したディレクトリのバックアップ

Unisonが設定されたので、ディレクトリをバックアップする準備ができました。 * primary *サーバーの `+ / home // data `ディレクトリを* backup *サーバーの ` / home // data / `ディレクトリにバックアップします。 バックアップするデータを含むディレクトリは、「 force 」オプションの横にある「 .unison / default.prf +」に配置したディレクトリと同じでなければなりません。

Unisonが動作していることをテストするには、バックアップするためのデータが必要になります。 * primary サーバーで空のファイルを作成し、Unisonが backup *サーバーに転送したかどうかを確認します。

まず、* primary user *ホームディレクトリから次のコマンドを実行して、バックアップするデータを保持するディレクトリを作成します。

mkdir data/

次に、 `+ touch +`コマンドを使用して、5つの空のファイルを作成します。

touch data/file{1..5}

コマンドの最後の部分である + file {1..5} +`は、Bashブレース拡張を使用して5つのファイルを作成します。 bashに `+ {1..5} +`が与えられると、不足している数字の `+ 2 ++ 3 +、および `+ 4 +`が自動的に埋められます。 この手法は、複数のファイルをすばやく列挙するのに役立ちます。

`+ data +`ディレクトリとバックアップするテストファイルが用意できたので、Unisonを実行してファイルを* backup *サーバーにバックアップできます。 次のコマンドでこれを行います。

unison -batch -auto /home//data ssh://@//home//data

これらのオプションの意味は次のとおりです。

  • + batch +:質問せずに実行します。

  • + auto +:競合しないアクションを自動的に受け入れます。

Unisonを単純な一方向同期モードで使用しているため、競合を解決する必要はありません。 これは、これらのオプションを安全に設定できることを意味します。

競合は、ユニゾンの他の操作モードでのみ発生し、両方向で同期します。 このような使用例は、誰かのラップトップとデスクトップ上のディレクトリを同期することです。 デスクトップ上のファイルを更新するとき、彼らはその変更をラップトップにプッシュすることを望みます。 Unison同期が発生する前に同じファイルが両端で変更され、Unisonが保持するファイルと上書きするファイルを自動的に決定できない場合、競合が発生します。

一方向プッシュモードでは、* primary *のデータは常に保持され、バックアップのデータは上書きされます。

このコマンドは、最初の実行時に長いメッセージを出力します。 メッセージは次のようになります。

OutputContacting server...
Connected [////home//data -> ////home//data]
Looking for changes
Warning: No archive files were found for these roots, whose canonical names are:
       /home//data
       ////home//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//data to ////home//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 [////home//data -> ////home//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 [////home//data -> ////home//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//data to ////home//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 サーバーは primary *サーバー上の `+ data +`ディレクトリの正確なコピーを保持します。

これで、Unisonを実行してディレクトリをバックアップできるようになりました。 次の手順では、_cron_を使用してUnisonを実行することにより、バックアッププロセスを自動化します。

ステップ6-Unison Cronジョブの作成

このセクションでは、Unisonを実行するhttps://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-on-a-vps[cron]ジョブを作成します。 `+ data +`ディレクトリを指定された頻度で* backup *サーバーにバックアップします。

crontabは、cronプロセスによって読み取られるファイルです。 含まれるコマンドはcronプロセスにロードされ、指定された間隔で実行されます。

次のコマンドを実行して、現在のユーザーのcrontabの内容を表示できます。

crontab -l

`+ -l +`オプションは、現在のユーザーのcrontabの内容をリストします。 crontabを以前に編集したことがない場合は、次の情報が表示されます。

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

次に、* primary *サーバーで `+ -e `フラグを指定して ` crontab +`コマンドを実行し、編集モードで開きます。

crontab -e

デフォルトのコマンドラインエディターが設定されていない場合、コマンドを初めて実行するときにエディターを選択するよう求められます。 任意のエディターを選択して、crontabを開きます。

crontabを開いたら、既存のテキストの下の最初の空行に次のコマンドを追加します。

...
/usr/bin/unison -log -logfile /var/log/unison.log -auto -batch -silent /home//data ssh://@//home//data

使用するコマンドは、上記の手動バックアップで使用したコマンドとほぼ同じですが、いくつかの追加オプションがあります。 これらの追加オプションは次のとおりです。

  • + -silent +:エラーを除くすべての出力を無効にします。 Unisonをcrontabから実行する場合、読み取る人がいないため、通常の出力は必要ありません。

  • + -log +:Unisonにアクションをログに記録するよう指示します。

  • + -logfile +:Unisonがアクションを記録する場所を指定します。

この例では、Unisonは3時間ごとに実行されます。 これは、要件に合った任意の周波数に変更できます。

crontabを編集するときはいつでも、保存して終了する前に常に一番下に空行を置く必要があります。そうしないと、cronがcrontabファイルを正しくロードできません。 これにより、コマンドが実行されない可能性があります。

これらの変更を行ったら、ファイルを保存して閉じます。

次に、Unisonが* primary *サーバーに書き込むログファイルを作成します。 次のコマンドは、このファイルを作成します。

sudo touch /var/log/unison.log

次に、* primary_user *をファイルの所有者にします。

sudo chown  /var/log/unison.log

`+ / var / log / unison.log +`にあるログファイルを読み取ることで、Unisonバックアップのステータスを確認できます。 Unisonは、新規または更新されたファイルをバックアップした場合、またはエラーが発生した場合にのみログを記録します。

現在、Unisonはcrontabから定期的にバックアップしています。 最後のオプションの手順は、SSH構成をより安全にすることです。

ステップ7(オプション)-SSHの保護

このガイドでは、パスワードのないSSHキーを作成して使用しました。 これは、* backup_user がSSHを介して backup *サーバーにログインするときにできることを制限することで対処できるセキュリティ上の問題です。

これを行うには、SSHを介してログインしたときに* backup_user が1つのコマンドのみを実行できるようにSSHを構成します。 つまり、作成したSSHキーは、Unisonバックアップの実行にのみ使用でき、それ以外のことはできません。 これは、 backup_user として backup *サーバーにSSHで接続できないという結果になります。 これは、ログインには許可された単一のコマンド以上のものが必要だからです。

  • backup サーバーに backup_user としてアクセスする必要がある場合は、最初に sammy ユーザーとしてログインし、次に `+ su-backup_user +`を使用して backup_user *に変更する必要があります。

`+ / etc / ssh / sshd_config +`にある* backup *サーバーのSSH設定ファイルを編集します。

sudo nano /etc/ssh/sshd_config

次に、ファイルの最後に次の行を追加します。

/ etc / ssh / sshd_config

Match User
 ForceCommand unison -server

これらの構成オプションは次のことを行います。

  • + Match User +:リストされたユーザーがログインすると、SSHは次のインデントされた設定オプションを適用します。

  • + ForceCommand +:これは、一致したユーザーを次のコマンドに制限します。 この場合、* backup_user *は `+ unison -server +`コマンドのみを実行できます。

テキストエディターを保存して終了します。 次に、SSHサービスをリロードして、新しい構成を有効にします。

sudo systemctl reload ssh.service

これをテストするには、* primary サーバーから backup_user としてSSH経由で backup *サーバーにログインしてみます。

ssh -i .ssh/unison-primary [email protected]

`+ / etc / ssh / sshd_config +`設定が機能している場合、以下が表示されます:

OutputUnison 2.48

Unisonはコマンドを待機しているため、 `+ CTRL `と ` C +`でセッションが強制終了されるまでSSHセッションはハングします。

これは、ログイン時にUnisonサーバーが自動的に呼び出され、Unisonサーバーとの通信以外では他のアクセスができないことを示しています。

これで、データを必要な頻度でバックアップする、機能する安全なUnisonバックアップシステムが完成しました。

結論

このガイドでは、SSH経由でディレクトリをバックアップするようにUnisonファイル同期ソフトウェアをインストールおよび構成しました。 また、パスワードなしのキーが悪用されないように、指定されたスケジュールでバックアップを自動的に実行し、SSHを保護するようにcronを構成しました。

Unisonを使用する必要があるかどうかを判断する際には、考慮すべきことがいくつかあります。

  • ファイル数が少ない場合やデータ量が少ない場合は、Unisonが最良の選択ではない場合があります。 この場合、 `+ rsync +`がより適切な選択です。 rsyncの使用の詳細については、https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps [How Rsyncを使用してVPSのローカルディレクトリとリモートディレクトリを同期するには]ガイド。

  • 大量のデータのバックアップには時間がかかり、パブリックネットワークインターフェイスで帯域幅の割り当てを使い果たす可能性があります。 * primary サーバーと backup *サーバーの両方がDigitalOcean Dropletsである場合、プライベートネットワークを使用すると、Unisonバックアップをより迅速かつ安全に完了することができます。 無料のDigitalOceanプライベートネットワークの詳細については、https://www.digitalocean.com/docs/networking/private-networking/overview/ [Private Network Overview]ドキュメントをご覧ください。

前の投稿:Ubuntu 18.04でApacheを使用してドメインのMTA-STSおよびTLSレポートを構成する方法
次の投稿:Scikit-learnを使用してPythonで機械学習分類子を構築する方法