Restic: 除外ファイルを使用した $RECYCLE.BIN の除外は機能しません

作成日 2020年05月31日  ·  4コメント  ·  ソース: restic/restic

restic version出力

linux/amd64 で go1.10.4 を使用してコンパイルされたrestic 0.9.6 (v0.9.6-0-gb723ca3d)

正確にはどのようにresticを実行しましたか?

デュアルブートの Windows 10 と Ubuntu 18.04 の間で共有されている NTFS パーティションがあり、Ubuntu のrestic でバックアップしています。 ご存じのとおり、Windows 10 は、パーティションのルート ディレクトリにディレクトリ$RECYCLE.BINを作成し、ごみ箱に移動されるファイルを保持します。 共有パーティションをバックアップしたいのですが、 $RECYCLE.BINディレクトリはバックアップしません。

さらに下には、私が観察しているものを再現する方法についての詳細な説明があります。 簡単に言えば、バックアップ コマンドで--exclude="\$RECYCLE.BIN"を使用すると、ディレクトリが除外され、「$RECYCLE.BIN」(または、私が思いつく他のバリアント、以下を参照) が--exclude-fileます。ディレクトリを除外しないでください。

リポジトリの保存に使用したバックエンド/サーバー/サービスは?

ローカル リポジトリ (Ubuntu 18.04 の下) と SFTP 経由のリモート リポジトリ (Ubuntu 18.04 でもバックアップを実行) の両方で動作を観察します。

予想される行動

フォルダー$RECYCLE.BINは、除外ファイルに追加されるとバックアップから除外されます。

実際の動作

フォルダー$RECYCLE.BINは、除外ファイルに追加されていますが、バックアップに含まれています。

動作を再現する手順

一時テスト ディレクトリ内で、bash で次のコマンドを発行します。

# prepare the directory to be backed up
mkdir "data";
mkdir "data/\$RECYCLE.BIN";
touch "data/backup_this";
touch "data/\$RECYCLE.BIN"/ignore_this";

# init repo
mkdir "repo";
restic init --repo=repo/

# prepare exclude file
echo "\$RECYCLE.BIN" > exclude.file

restic --repo=repo/ backup --verbose --verbose data/発行すると、次のようになります。

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
start scan on [data/]
start backup on [data/]
scan finished in 0.257s: 2 files, 0 B
new       /data/$RECYCLE.BIN/ignore_this, saved in 0.004s (0 B added)
new       /data/backup_this, saved in 0.000s (0 B added)

Files:           2 new,     0 changed,     0 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      1 new
Added to the repo: 372 B

processed 2 files, 0 B in 0:00
snapshot 27c00c6b saved

予想通り。

restic --repo=repo/ backup --verbose --verbose --exclude="\$RECYCLE.BIN" data/利回りを発行する

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 27c00c6b
start scan on [data/]
start backup on [data/]
scan finished in 0.257s: 1 files, 0 B
unchanged /data/backup_this

Files:           0 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      1 new
Added to the repo: 372 B

processed 1 files, 0 B in 0:00
snapshot 61c27a16 saved

これも期待されます。

ただし、 restic --repo=repo/ backup --verbose --verbose --exclude-file=exclude.file data/発行します。ここで

 $ cat exclude.file 
$RECYCLE.BIN

結果

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 61c27a16
start scan on [data/]
start backup on [data/]
scan finished in 0.211s: 2 files, 0 B
unchanged /data/backup_this
new       /data/$RECYCLE.BIN/ignore_this, saved in 0.003s (0 B added)

Files:           1 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      0 new
Added to the repo: 0 B  

processed 2 files, 0 B in 0:00
snapshot 9a62470f saved

つまり、ディレクトリは除外ファイルに存在しますが、バックアップから除外されません。

除外ファイルのさまざまなバリエーション (ドル記号のエスケープ、引用符の追加、ファイルの最後への改行の追加) も試しましたが、ディレクトリを除外するための制限はありませんでした。

これを引き起こした原因は何かわかりますか?

厄介な文字 (ドル記号など) を含む除外ファイルからのファイル名を処理する場合、何らかのエラーが発生するに違いないと思います。

問題を解決する方法についてのアイデアはありますか?

残念ながら、私は go についてはわかりません (私は C++ しか流暢ではありません) が、奇妙な文字を含むファイル名を処理する場合、OS および/またはファイルシステムとの対話に何か問題があるに違いありません。

今日はresticは役に立ちましたか? ある意味幸せでしたか?

私は、ローカルとリモートの両方のバックアップにresticを広く使用しています。 これからも頑張ってね!
この問題を解決するために何かお役に立てることがあれば、お知らせください。

backup need feedback questioproblem

全てのコメント4件

--excludeについて$$RECYCLE.BINを使用します。

参照: https://restic.readthedocs.io/en/latest/040_backup.html#except -files

そうですね、ありがとう、ドキュメントのこの 1 つの段落を正確に見落としていたようです。

それはうまくいくようです:

 $ cat exclude.file 
$$RECYCLE.BIN

そしてrestic --repo=repo/ backup --verbose --verbose --exclude-file=exclude.file data/再度発行すると、

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 96bdd658
start scan on [data/]
start backup on [data/]
scan finished in 0.211s: 1 files, 0 B
unchanged /data/backup_this

Files:           0 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      0 new
Added to the repo: 0 B  

processed 1 files, 0 B in 0:00
snapshot 5c475b96 saved

予想通り。

ただし、10 年以上の Linux の経験の中で、 \$ではなく$$ $をエスケープする必要があることに遭遇したことはありませんが、ドキュメントに記載されているように、これは標準のようです。 os.ExpandEnv場合、これはresticに固有ではありません。

ただし、 restic --repo=repo/ backup --verbose --verbose --exclude="$$RECYCLE.BIN" data/

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 5c475b96
start scan on [data/]
start backup on [data/]
scan finished in 0.204s: 2 files, 0 B
new       /data/$RECYCLE.BIN/ignore_this, saved in 0.002s (0 B added)
unchanged /data/backup_this

Files:           1 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      0 new
Added to the repo: 0 B  

processed 2 files, 0 B in 0:00
snapshot ed44b219 saved

これは非常に一貫性がなく、直感に反するようです。

--exclude="$$RECYCLE.BIN"の二重引用符は、シェルが$$を現在の PID に展開することを意味します。 一重引用符で試してください: --exclude='$$RECYCLE.BIN'

(例えば、 echo "$$RECYCLE.BIN"echo '$$RECYCLE.BIN' )

@kontakm問題は解決したようです。 その場合は閉じてください。

このページは役に立ちましたか?
0 / 5 - 0 評価