GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

bup

bup – git packfileフォーマットに基づいた非常に効率的なバックアップシステム。迅速な増分保存とグローバル重複除外(仮想マシンイメージを含むファイ..

投稿日:

git packfileフォーマットに基づいた非常に効率的なバックアップシステム。迅速な増分保存とグローバル重複除外(仮想マシンイメージを含むファイル内およびファイル内)を提供します。 現在のリリースは0.29.1であり、開発ブランチはマスターです。 ディスカッションのためにメーリングリストに問題やパッチを投稿してください(下記READMEの最後を参照してください)。 https://bup.github.io/

bup:それは物事をバックアップする

bupは物事を後押しするプログラムです。 「バックアップ」の略です。 今回も、誰もオープンソースプログラム “bup”に名前を付けた人は誰もいないと信じられますか? 私でもない。

あまりにも控え目な名前にもかかわらず、bupはかなりクールです。 それがいかに涼しいかのアイデアを与えるために、私はあなたにこの詩を書いた:

                         Bup is teh awesome
                      What rhymes with awesome?
                        I guess maybe possum
                       But that's irrelevant.

うーん。 それが助けになりましたか? 結局のところ、散文はもっと役に立ちます。

理由のバカは素晴らしいです

bupには、他のバックアップソフトウェアに比べていくつかの利点があります。

  • これは、大規模なファイルをチャンクに分割するためのローリングチェックサムアルゴリズム(rsyncに似ています)を使用します。 これは、大規模な仮想マシン(VM)のディスクイメージ、データベース、XMLファイルを増分的にバックアップすることができ、複数のバージョンで大量のディスクスペースを使用することはありません。

  • これはgit(オープンソースのバージョン管理システム)のpackfile形式を使用しているので、bupのユーザインタフェースが気に入らなくても、保存されたデータにアクセスすることができます。

  • gitとは異なり、packfilesは直接 (別のガベージコレクション/再パック段階を持つ代わりに)書きますので、大量のデータでも高速です。 bupの改良されたインデックスフォーマットでは、git(数百万)よりもはるかに多くのファイル名を追跡し、はるかに多くのオブジェクト(数百または数千ギガバイト)を追跡できます。

  • お互いを知らない2つの異なるコンピュータからバックアップを作成した場合でも、どのバックアップがどのバックアップに基づいているかを知る必要なしに、増分バックアップ間でデータが「自動的に」共有されます。 あなたはちょうどbupに物事をバックアップするように指示し、必要な最小限のデータしか保存しません。

  • バックアップされているコンピュータ上に一時的なディスクスペースを大量に必要とせずに、リモートのbupサーバーに直接バックアップできます。 あなたのバックアップが途中で中断された場合は、中断したところで次の実行が選択されます。 また、bupサーバーを簡単にセットアップできます。sshにアクセスできるマシンにbupをインストールするだけです。

  • Bupは、ディスクに不良セクタが検出されていない場合でも、 “par2″冗長性を使用して破損したバックアップをリカバリできます。

  • バックアップがインクリメンタルであっても、フルバックアップのリストアを心配する必要はありません。 増分バックアップは完全バックアップのように動作します 、必要なディスク容量は少なくて済みます。

  • bupリポジトリをFUSEファイルシステムとしてマウントし、その方法でコンテンツにアクセスしたり、Sambaにエクスポートしたりすることもできます。

  • これはpythonで書かれています(いくつかのC言語で書かれています)ので、拡張と管理が容易です。

あなたがうんざりを避けたい理由

  • これは非常に初期のバージョンです。 したがって、おそらくあなたのためには機能しませんが、理由はわかりません。 また、おそらく重要な機能がいくつか欠落しています。

  • Python> = 2.6、Cコンパイラ、インストールされたgitバージョン> = 1.5.3.1が必要です。 また、fsckがいくつかのタイプの破損から回復するために必要な情報を生成できるようにするには、par2が必要です。

  • 現在のところ、Linux、FreeBSD、NetBSD、OS X> = 10.4、Solaris、またはWindows(Cygwin、おそらくWSL)でのみ動作します。 他のプラットフォームをサポートするためのパッチは大歓迎です。

  • 下の「愚かなこと」のアイテム。

リリースで導入された注目すべき変更

入門

ソースから

  • gitを使ってbupのソースコードをチェックしてください:

     git clone https://github.com/bup/bup
    
  • これにより、開発の手助けをしたい場合には完璧ですが、bupを使いたい場合は、次のような最新の安定版をチェックしてください:

     git checkout 0.29.1
    

    最新の安定リリースはhttps://github.com/bup/bup/releasesでご覧になれます

  • 必要なPythonライブラリ(開発ライブラリを含む)をインストールします。

    最近のDebian / Ubuntuのバージョンでは、これで十分です(rootで実行)。

         apt-get build-dep bup
    

    それ以外の場合は、これを試してください(古いシステムの場合はpython2.6-devに置き換えてください):

         apt-get install python2.7-dev python-fuse
         apt-get install python-pyxattr python-pylibacl
         apt-get install linux-libc-dev
         apt-get install acl attr
         apt-get install python-tornado # optional
    

    CentOS(少なくともCentOS 6用)では、これで十分であるはずです(rootとして実行)。

         yum groupinstall "Development Tools"
         yum install python python-devel
         yum install fuse-python pyxattr pylibacl
         yum install perl-Time-HiRes
    

    デフォルトのCentOSリポジトリに加えて、RPMForge(fuse-python用)とEPEL(pyxattrとpylibacl用)を追加する必要があります。

    Cygwin上で、python、make、rsync、およびgcc4をインストールします。

    竜巻パッケージのないシステムでオプションのbup Webサーバーを使用する場合は、次のようにします。

         pip install tornado
    
  • Pythonモジュールとシンボリックリンクを構築する:

     make
    
  • テストを実行します。

     make test
    

    テストは合格するはずです。 彼らがあなたに合格しない場合は、ここでやめてbup-list@googlegroups.comにメールを送ってください 現在の作業ディレクトリのパスにシンボリックリンクがある場合、テストは失敗する可能性があります。 “make test”の前にこれを実行すると、問題を回避できます。

     cd "$(pwd -P)"
    
  • あなたは “make install”でbupをインストールし、デフォルトの宛先をDESTDIRとPREFIXで上書きすることができます。

    ファイルは通常、 “$ DESTDIR / $ PREFIX”にインストールされます。ここで、DESTDIRはデフォルトでは空で、PREFIXは/ usr / localに設定されています。 したがって、/ opt / bupにbupをインストールしたい場合は、次のようにします。

     make install DESTDIR=/opt/bup PREFIX=''
    
  • bupが使用するPython実行可能ファイルは./configureによって選択されます。これは、PYTHONが環境内に設定されていない限り、妥当なバージョンを検索します。この場合、bupはそのパスを使用します。 configureの出力を調べるか、cmd / python-cmd.shを調べることでPython実行可能ファイルが選択されたかを知ることができます。また、./configureを再実行して選択を変更できます。

バイナリパッケージから

bupのバイナリパッケージは、次のOS用にビルドされていることが知られています。

bupの使用

  • bupコマンドのヘルプを表示する:

     bup help
     bup help init
     bup help index
     bup help save
     bup help restore
     ...
    
  • デフォルトのBUP_DIR(〜/ .bup)を初期化する:

     bup init
    
  • ローカルバックアップを作成します(-vまたは-vvは冗長性を高めます)。

     bup index /etc
     bup save -n local-etc /etc
    
  • ./destにローカルバックアップを復元する:

     bup restore -C ./dest local-etc/latest/etc
     ls -l dest/etc
    
  • バックアップに必要なディスク容量を確認してください。

     du -s ~/.bup
    
  • 別のバックアップを作成してください(最後のものとほとんど同じですが、このバックアップが増分であることを指定する必要はなく、自動的に領域を節約します)。

     bup index /etc
     bup save -n local-etc /etc
    
  • あなたの2番目のバックアップが(最初のものの上に)使用された余分なスペースを少し見てください:

     du -s ~/.bup
    
  • 以前のバックアップのリストを取得する:

     bup ls local-etc
    
  • 最初のバックアップをもう一度復元します。

     bup restore -C ./dest-2 local-etc/2013-11-23-11195/etc
    
  • / etc / profile、etc / environment、〜/ .profile、〜/ .bashrcを参照してください)、ssh経由でアクセス可能なリモートサーバにバックアップを作成してください。 SERVERNAMEをサーバーの実際のホスト名に置き換えてください。

     bup init -r SERVERNAME:path/to/remote-bup-dir
     bup index /etc
     bup save -r SERVERNAME:path/to/remote-bup-dir -n local-etc /etc
    
  • SERVERの〜/ .bupにリモートバックアップを作成する:

     bup index /etc
     bup save -r SERVER: -n local-etc /etc
    
  • 〜/ .bupに保存されているセーブがSERVER:

     bup ls -r SERVER:
    
  • ./destにリモートバックアップを復元する:

     bup restore -r SERVER: -C ./dest local-etc/latest/etc
     ls -l dest/etc
    
  • 死の光線からあなたのバックアップを守ってください(正常です、時には不良ディスクブロックの可能性が高いです)。 これは、既存のすべてのデータに対してパリティ情報(現在はpar2を介して)を書き込むので、bupはリポジトリの破損量から回復できます。

     bup fsck -g
    
  • index / save / restoreの代わりにsplit / joinを使用します。 tarを使ってローカルバックアップを作成してみてください:

     tar -cvf - /etc | bup split -n local-etc -vv
    
  • tarballを復元してみてください:

     bup join local-etc | tar -tf -
    
  • バックアップに必要なディスク容量を確認してください。

     du -s ~/.bup
    
  • 別のタールバックアップを作成する:

     tar -cvf - /etc | bup split -n local-etc -vv
    
  • 2番目のバックアップが最初のバックアップの上にどれほどの余分なスペースを使用したかを見てください。

    du -s〜/ .bup

  • 最初のtarバックアップをもう一度復元してください(〜1は “最近のものより古いもの”のgit表記です):

     bup join local-etc~1 | tar -tf -
    
  • 以前のスプリットベースのバックアップのリストを取得する:

     GIT_DIR=~/.bup git log local-etc
    
  • tarアーカイブをリモートサーバに保存します(重複排除を容易にするためにtar -zを使用しないでください)。

     tar -cvf - /etc | bup split -r SERVERNAME: -n local-etc -vv
    
  • アーカイブを復元する:

     bup join -r SERVERNAME: local-etc | tar -tf -
    

それはすべてそこにある!

FreeBSDに関する注意

  • FreeBSDのデフォルトの ‘make’コマンドは、bupのMakefileが好きではありません。 コードをコンパイルし、テストを実行してbupをインストールするには、gmakeという名前のポートからGNU Makeをインストールし、上記のコマンドの代わりに実行可能ファイルを使用する必要があります。 (つまり、 ‘gmake test’はbupのテストスイートを実行します)

  • Pythonの開発ヘッダーは自動的に ‘python’ポートにインストールされるため、別々にインストールする必要はありません。

  • ‘bup fuse’コマンドを使用するには、 ‘sysutils’セクションの ‘fusefs-kmod’ポートからのヒューズカーネルモジュールと ‘devel’セクションの ‘py-fusefs’という名前のポートからのライブラリをインストールする必要があります。

  • ‘par2’コマンドは ‘par2cmdline’という名前のポートにあります。

  • ドキュメントをコンパイルするには、 ‘textproc’セクションの ‘hs-pandoc’という名前のポートにあるpandocが必要です。

NetBSD / pkgsrcについての注意

  • pkgsrc / sysutils / bupを参照してください。これは最新の安定したリリースであり、マニュアルページを含みます。 また、合理的な依存関係もあります(git、par2、py-fuse-bindings)。

  • 参照される “fuse-python”パッケージは見つけるのが難しく、sourceforge上のfuseプロジェクトによって配布されるpython言語バインド用の別個のtarballです。 これはpkgsrc / filesystems / py-fuse-bindingsとして利用でき、NetBSD 5では “bup fuse”が動作します。

  • “bup fuse”はすべてのディレクトリ/ファイルをiノード0として表示します。NetBSDのlibcのディレクトリトラバーサルコード( “fts”)はこれをサイクルとエラーとして解釈するので、 “ls -R”と “find”は機能しません。

  • ACLのサポートはありません。 いくつかの魅力的な人がこれを修正したら、t / compare-treesを調整してください。

Cygwinに関する注意

  • ACLのサポートはありません。 もしある企業がこれを修正したら、t / compare-treesを調整してください。

  • t / test.shでは、2つのテストが無効になっています。 これらのテストでは、セーブが繰り返されると同じツリーが生成され、インデックスが介在してもSHA1は変更​​されないことが確認されます。 明らかに、Cygwinはアクセス時間に関していくつかの珍しい振る舞いをしています(これは恐らくさらなる調査が必要です)。 おそらく関連している: http : //cygwin.com/ml/cygwin/2007-06/msg00436.html

OS Xに関する注意事項

  • ACLのサポートはありません。 もしある企業がこれを修正したら、t / compare-treesを調整してください。

使い方

基本的なストレージ:

bupはそのデータをgit形式のリポジトリに格納します。 残念ながら、git自体は、実際にbupの使用例(膨大な数のファイル、膨大なサイズのファイル、ファイルのパーミッション/所有権を保持することが重要です)ではうまく動作しません。したがって、gitのコードをほとんど使用しません。 。 たとえば、bupにはpythonで書かれた独自のgit packfileライターがあります。

基本的には、 ‘bup split’はstdin(またはコマンドラインで指定されたファイル)のデータを読み込み、ローリングチェックサム(rsyncに似ています)を使ってチャンクに分割し、それらのチャンクを新しいgit packfileに保存します。 バックアップごとに少なくとも1つのgit packfileがあります。

特定のチャンクを新しいpackfileに書き込むかどうかを決定するとき、bupは、存在する他のすべてのpackfilesを最初にチェックして、それらがすでにそのチャンクを持っているかどうかを調べます。 そうした場合、チャンクはスキップされます。

gitパックは2つの部分に分かれています:パック自体( .pack)とインデックス( .idx)です。 インデックスはかなり小さく、パック内のすべてのオブジェクトのリストが含まれています。 したがって、リモートバックアップを生成する場合、リモートサーバからのパックファイルのコピーを持つ必要はありません。ローカルエンドはサーバのインデックスファイルのコピーをダウンロードし、オブジェクトを新しいパックを生成するときと比較します。サーバーに直接送信されます。

‘bup split’と ‘bup save’の “-n”オプションは、作成するバックアップの名前ですが、実際はgitブランチとして実装されています。 だからgitを使って特定のブランチをチェックアウトするようなかわいいことをすることができ、分割したファイルに対応するたくさんのチャンクファイルを受け取ることができます。

‘-n’の代わりに ‘-b’または ‘-t’または ‘-c’を使用すると、bup splitはblobのリスト、blobのリストを含むツリー、またはそのツリーを含むコミットを出力し、 stdoutに。 これを使って、それらの値で何かをする独自のスクリプトを構築することができます。

bupインデックス:

‘bup index’はファイルシステムを走査し、名前、属性、およびオプションで各ファイルとディレクトリのgit SHA1(blob id)を含むファイル(名前はデフォルトでは〜/ .bup / bupindex)を更新します。

‘bup save’は、基本的に ‘bup split’に相当するものをインデックス内のファイルごとに1回だけ実行し、すべての結果オブジェクトを含むgitツリーをアセンブルします。 とりわけ、 ‘git diff’は(本質的に大きなバイナリBLOBであるtarballを分割するのに比べて)ずっと便利です。 しかし、大量のファイルを小さなまとまりに分割するので、結果として得られるツリー構造は、git自身が格納していたものと正確には対応しません。 また、 ‘bup save’で使用されるツリー形式は、おそらく将来、ファイルの所有権、より複雑なファイルのアクセス許可などを格納するために変更されるでしょう。

ファイルが以前に ‘bup save’によって書き込まれた場合、そのgit blob / tree idがインデックスに格納されます。 これにより、 ‘bup save’はそのファイルを読み取って将来のインクリメンタルバックアップを作成することを避けることができます。つまり、多くのファイルが変更されていない限り、 非常に高速になる可能性があります。

今は馬鹿だが後で修正するもの

これらの問題やその他の問題のヘルプは大歓迎です。 お手伝いをしたい場合はメーリングリストに参加してください(下記参照)。

  • ‘bup save’と ‘bup restore’は未完成のメタデータをサポートしています。

    プラスの面では、実際にサポートを受けていますが、tar / rsync / otherのようにリモートでもなく新しいものでもありません。 しかし、あなたはどこかから始めなければなりません。そして、0.25の時点で、より一般的な使用の準備ができていると思います。 何か問題があれば教えてください。

    また、stripオプションやgraft-styleオプションが ‘bup save’に指定されている場合、ルートディレクトリにはメタデータは書き込まれません。 それは明らかに理想的ではありません。

  • bupはmmapについて過度に楽観的です。 今すぐバプは、それが好きなだけ大きなブロックをmmapすることができると仮定し、そのmmapは決して失敗しません。 うん、そうです…他に何もない場合、これは32ビットアーキテクチャでは失敗しました(さらに31ビットは悪化しています – あなたを見て、s390)。

    これを修正するには、通常のファイルIOを使用するFakeMmap [1]クラスを実装し、実際に呼び出すすべてのmmapメソッド[2]を処理するだけです。 そして、mmapが失敗したときにはいつでも、そのうちの1つに入れ替えます。

    これはおそらく最小のgetitemsetitem 、およびsetslice [3]で “[]”配列アクセスをサポートするために必要ないくつかのメソッドの実装を必要とします。

    [1] http://comments.gmane.org/gmane.comp.sysutils.backup.bup/613 [2] http://docs.python.org/2/library/mmap.html [3] http:/ / /docs.python.org/2/reference/datamodel.html#emulating-container-types

  • ‘bup index’はそれよりも遅いです。

    まだ高速です:600,000ファイルシステム上のすべてのファイル名を数秒で繰り返し処理できます。 しかし、インデックスファイル全体を1つのファイル名に書き換える必要があります。これはかなり厄介です。 新しいファイルを2番目の “余分なインデックス”ファイルなどに残すだけです。

  • bupは本当に効率的な増分バックアップのためにinotifyを使用できます。

    システムで「連続」バックアップを実行させることもできます。ファイルが変更されたときは、直ちにそのファイルのイメージをサーバーに送信します。 連続バックアッププロセスのCPUとI / Oの優先度は非常に低いので、実行中であることがわからなくても済みます。

  • bupは、古いバックアップをプルーニングするための実験的なサポートしか持っていません。

    bup rmで古いセーブとブランチを削除し、 bup gcで他のバックアップで不要になったデータが占有する領域を再利用できるはずですが、これらのコマンドは実験的なものであり、細心の注意を払って処理する必要があります。 詳細は、マニュアルページを参照してください。

    新しいコマンドのテストを手助けしたい場合を除き、可能な回避策の1つは、新しいBUP_DIRを時折開始することです。つまり、bup-2013、bup-2014 …

  • Linux、FreeBSD、NetBSD、OS X、Windows + Cygwin以外でテストされたことはありません。

    しかし、それは本質的に非ポータブルにするものは何もありません。だから、それは誰かが何らかの努力をしていることの大部分です。 (「ネイティブ」Windowsポートの場合、最も厄介なことは、デフォルトのWindowsインストールでsshが存在しないことです)。

  • bupにはより良い文書が必要です。

    Linux Weekly News( https://lwn.net/Articles/380983/ )のbupに関する最近の記事によると、「例は少し短く、ユーザーガイドはいいだろう」 ドキュメンテーションは、外部からの誰かがそれを寄稿しない限り、決して偉大ではない種類のものです(開発者は理解しにくい部分を覚えていないので)。

  • bupは “比較的速く”、 “かなり良い”圧縮を持っています。

    …同じLWNの記事によると。 明らかにどちらも十分に良いものではありません。 私たちは畏敬の念を抱くスピードとクレイジーな良い圧縮を持つべきです。 それに取り組まなければならない。 Cでより多くの部品を書くことはスピードに役立つかもしれません。

  • bupにはGUIがありません。

    実際、それは愚かではありませんが、あなたはそれを限界と考えるかもしれません。 可能なオプションについては、 関連プロジェクトのリストを参照してください。

その他のドキュメント

bupには大量のマニュアルページがあります。 開始するには ‘bup help’を使用するか、そのコマンドの詳細を取得するには、bupサブコマンド(split、join、index、saveなど)に ‘bup help SUBCOMMAND’を使用してください。

さらなる技術的な詳細については、./DESIGNを参照してください。

あなたはどのように助けることができる

bupは進行中の作業であり、まだ改善できる方法はたくさんあります。 パッチ、アイデア、またはバグレポートを投稿したい場合は、bupメーリングリストに参加してください。

メーリングリストのアーカイブはこちらからご覧いただけます:

http://groups.google.com/group/bup-list

あなたはメッセージを送信して購読することができます:

bup-list+subscribe@googlegroups.com

追加情報、つまりパッチの提出方法(ヒント – プルリクエストなし)、ブランチの取り扱い方法など./HACKINGを参照してください。

楽しむ、

エイヴリー







-bup

執筆者: