方法自体は別の記事にあったものを参考にしただけですが、経緯まで書いておくと役に立つかもと思い書いておきます。
経緯
私はWebサーバやその他もろもろのオンラインツールを使うため、VPSを借りているのだが、それを1つ閉鎖することにした1。その際、バックアップとしてディレクトリのアーカイブを一括で取りたかったのだが、以下の条件があった。
- ファイルの権限などを保持したかったため、tarでアーカイブしたかった
- しかしそのサーバに空き容量が少なく、tarのアーカイブファイルを一時的に保存しておくのは不可能だった
- VPSなのでストレージの容量を上げることはできるにはできるのだが、もちろん費用がかかるので、そこまでして実現したくはなかった
実現方法
以上のことから、tarのアーカイブファイルを直接別のサーバ2に保存できる方法がないか調べていたら、以下のような記事が見つかった。
これらの記事で取っていた方法は以下のものであった。
- アーカイブしたい内容のあるサーバ側でtarをするのだが、その結果をファイルに直接書かず標準出力に出す(
tar -cvjf - ディレクトリ
)- tarコマンドにおいては、「f」オプションの直後には保存するファイル名を書くのだが、これを「-」とすると標準出力になる
- その出力をリダイレクトでsshに投げる
コマンドで書くとこんな具合(圧縮形式がbzip2の場合で書いています)。アーカイブを取りたい内容が含まれているサーバで
tar -cvjf - SOURCE_DIR | ssh -i KEY_FILE USER@TARGET_SERVER 'cat > /path/to/archive.tbz'
とする。SOURCE_DIRがアーカイブを取りたいディレクトリ、KEY_FILEが保存先のサーバのSSH接続の鍵ファイル、USERが保存先のサーバのユーザ名、TARGET_SERVERが保存先のサーバ、/path/to/archive.tbz が保存先のサーバにおけるアーカイブのファイル名である。
補足
私の環境での実際の実行においては、最初のtarコマンドにsudoを付け、管理者権限で実行していた。これは保存したいディレクトリにおいて、ファイルのオーナーが入り混じっているためであった。(例えば、ApacheやnginxなどのWebサーバソフトは、それ専用のアカウントで動くので、それらにより作られたファイルもまとめてアーカイブしたかった。)
-
経緯としては、VPSのOSの変更をしたかったのだが、そうすると移行が完了するまでサーバの機能が止まってしまうため、「新しいVPSを1つ借りる」→「移行が完了したら古いVPSを止める」という手順で移行したのであった。 ↩
-
なお、アーカイブファイルを保存した先は前記の移行先のVPSだったのだが、移行先のVPSへの環境移行自体は別途rsyncでファイルをコピーしていた。アーカイブファイルは自分のパソコンに保存するためである。
自分のパソコンに直接tarファイルを移行できれば一番よかったのだが、(自分のパソコンが外部からSSH接続できるのでない限り)「アーカイブを取りたいサーバ側でsudoする」という条件で自分のパソコンにアーカイブファイルを直接保存できる方法が見つけられなかった。 ↩