標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

マイクラデータ・バックアップスクリプト( UNCパス→一時的なネットワークドライブ化対応)

イクラデータ(%APPDATA%/.minecraft 以下)は Google ドライブにバックアップしてきたが、そのサイズが巨大になってきて、使用容量が 90% を越え、これ以上は困難になってきた。

仕方がないので、古いノートPC に差した USB3 ハードディスクにバックアップをとるようにした。 が、データのチェック(restic check...)時にどうしてもエラーになってしまう。

UNCパス形式ではなく、ネットワークドライブにすると解消できるだろうか。

そこで pushd コマンドを使って「もし、バックアップ先パスが UNC パスだったら、自動的かつ一時的にネットワークドライブにする」よう修正してみた。

@setlocal
@set PROMPT=$D$S$T$G$S

@rem to convert UNC-Path to network-drive
pushd "%RESTIC_REPOSITORY%"
for /F %%I in ('cd') do set "RESTIC_REPOSITORY=%%I"

cd /D "%APPDATA%"
restic.exe backup ^
    --exclude ".minecraft/backups/*" ^
    --exclude ".minecraft/mods/*" ^
    .minecraft || exit /b 1
timeout 300
restic.exe check  --read-data || exit /b 1
restic.exe forget --keep-last 3 --prune
popd
@endlocal

pushd の機能は /? オプションで確認できる。

$ pushd /?
POPD コマンドで使用するために現在のディレクトリを保存し、
指定したディレクトリに変更します。

PUSHD [パス | ..]

  パス        現在のディレクトリとして設定するディレクトリを指定します。

コマンド拡張機能を有効にすると、PUSHD コマンドは、通常のドライブ文字
とパスだけでなくネットワーク パスも受け付けるようになります。
ネットワーク パスを指定した場合は、PUSHD は指定されたネットワーク
リソースを指し示す一時的なドライブ文字を作成し、新しく定義されたドライブ
文字を使って現在のドライブとディレクトリを変更します。一時的な
ドライブ文字は、Z: から前へ順に、最初に見つかった未使用のドライブ文字が
割り当てられます。

net use コマンドを使わなかったのは、バックアップ先がローカルディスクでも機能するようにしたかったためだ。

しかし、これでもなお、エラーが出る。

2024/12/23 月 10:29:29.09> restic.exe check  --read-data   || exit /b 1
using temporary cache in C:\Users\hymkor\AppData\Local\Temp\restic-check-cache-3040023258
create exclusive lock for repository
repository 4b90f469 opened (version 2, compression level auto)
created new cache in C:\Users\hymkor\AppData\Local\Temp\restic-check-cache-3040023258
load indexes
[0:01] 100.00%  4 / 4 index files loaded
check all packs
check snapshots, trees and blobs
[0:02] 100.00%  4 / 4 snapshots
read all data
Load(<data/3700bfe26b>, 16865032, 0) returned error, retrying after 568.188448ms: open \\?\Z:\restic-minecraft\data\37\3700bfe26b174502c744777f5bf703871cd6a13ab1f1a45d6de2cad4d281eea2: The semaphore timeout period has expired.
Load(<data/3700bfe26b>, 16865032, 0) returned error, retrying after 2.99526185s: open \\?\Z:\restic-minecraft\data\37\3700bfe26b174502c744777f5bf703871cd6a13ab1f1a45d6de2cad4d281eea2: The semaphore timeout period has expired.

うーむ。そもそもrestic check--read-data オプションを付けてフルチェックまでするのが誤りなのだろうか(うーむ、前もこんなことやってたなぁ。FTPで)

追記 @ 2024-12-23

その後の試行錯誤:

  • リモートマシン上で、USB2 ディスクに対して chkdsk /F /R
    → フリーエリアで破損クラスターはあったが、ユーザファイル上での破損はなし
  • リモートマシン上で、restic check --read-data を実行
    → 数分で終了。エラーなし

うーむ、やはり、ネットワーク層に10GB超のデータをとおすと、不安定になるか… Windows のファイル共有に限らず、FreeBSD の FTPD でも同様であったから、32bit時代に作られたものの宿命かもしれない。

不安定にならなかったのは、OneDrive とか Google Drive とかクラウドストレージくらいだなぁ ( 近年、作られたもんだからな )