トラブルシューティング: Mac で保管庫が開けないとき(iCloud のプレースホルダーファイル)

1 つの .kdbx 保管庫を、iPhone の Kakuremi と Mac のデスクトップ KeePass アプリの両方で開いて使っていると、ある日 Mac 側のアプリがデータベースの読み取りエラーを報告する — それでもまったく同じ保管庫が Kakuremi では問題なく開ける、ということがあります。このようなケースのほとんどで、ファイルは破損していません。Mac が中身のないプレースホルダーを保持しているだけです。このガイドでは、その確認方法と数分で終わる解決手順を説明します。

1

エラーメッセージを正確に読む

デスクトップの KeePass アプリは、性質のまったく異なる 2 種類の失敗を区別しており、メッセージの文言からどちらに該当するかが分かります。たとえば KeePassXC では次のとおりです。

「データベースの読み取りエラーです。」("Failed to read database file.") — アプリがファイルのバイト列をまったく取得できなかった状態です。これが、このガイドで解決するプレースホルダーの問題です。このまま読み進めてください。

「データベースの読み取り中にエラー: 認証情報が正しくありません」("Error while reading the database: Invalid credentials were provided") / "HMAC mismatch" — ファイル自体は正常に読み取れています。マスターパスワード、キーファイル、またはハードウェアキーが間違っている状態です。これは別の問題なので、認証情報を確認し直してください。

ヒント: 同じ保管庫がどれか 1 台のデバイスでも開けるなら — たとえば iPhone の Kakuremi で — データはどこかに無事に残っています。慌てず、まだファイルのどのコピーも削除したり置き換えたりしないでください。
2

なぜ起きるのか: プレースホルダーファイル

macOS はディスク容量を確保するため、ほとんど開かれないローカルファイルをプレースホルダーに静かに置き換えることがあります(Apple はこれをMacストレージを最適化と呼びます。サードパーティの同期クライアントにも同様の「ファイルオンデマンド」機能があります)。Finder にはファイル名と本来のサイズが表示されたままですが、中身はクラウド上にしかありません。

通常はプレースホルダーを開くと自動的に再ダウンロードされます。しかし、この裏側で行われる再ダウンロードが実行されないことがあり、そうなるとファイルを直接読み取ろうとするすべてのアプリ — デスクトップの KeePass アプリを含めて — からは、読み取れない空のファイルに見えてしまいます。

iPhone には完全にダウンロード済みのコピーがそのまま残っているため影響を受けません — Mac では開けないのに Kakuremi では保管庫が開けるのは、まさにこのためです。

3

解決方法: ファイルを強制的にダウンロードする

Finder で .kdbx ファイルを右クリックし、今すぐダウンロード (Download Now) を選びます(iCloud に保存されているファイルには横に雲のアイコンが表示されます)。雲のアイコンが消えたら、デスクトップアプリで再試行してください。

Finder にこの項目が表示されない場合や、ターミナルを使いたい場合は次を実行します。

brctl download ~/Documents/path/to/vault.kdbx

数秒待ってから ls -lO vault.kdbx で確認します — 出力から dataless フラグが消えているはずです。これで保管庫は通常どおり開けるようになります。

注意: brctl が機能するのは iCloud Drive が管理するファイルです。フォルダがサードパーティの同期クライアントの管理下にある場合は、そのクライアント自身の「ダウンロード」/「オフラインで使用可能にする」操作を使ってください — どのサービスがファイルを管理しているかは次のステップで確認できます。
4

まだ失敗する?フォルダを管理しているサービスを調べる

フォルダ名は当てになりません。iCloud のデスクトップと書類の同期が有効な場合、~/Documents~/Desktop 配下のすべてが iCloud の管理下になります — 何年も前に使っていた別の同期ツールの名前が付いたフォルダも例外ではありません。

どのプロバイダが実際にファイルを管理しているかを確認するには、次を実行します。

fileproviderctl evaluate ~/Documents/path/to/vault.kdbx

出力に Ubiquitous… が含まれていれば iCloud です — ステップ 3 のとおり Finder または brctl を使ってください。代わりにサードパーティのプロバイダ名が表示された場合は、そのクライアントがインストールされ、起動していて、サインイン済みであることを確認します。同期クライアントがアンインストールされたままのプレースホルダーは、クライアントを復元する(またはそのサービスから直接ファイルを取得する)まで読み取れないままです。

5

再発を防ぐ

Finder で保管庫(またはそのフォルダ)を右クリックし、ダウンロードを保持 (Keep Downloaded) を選びます。macOS がこのファイルをプレースホルダーに置き換えなくなるため、デスクトップアプリは常に実体のあるデータを読み取れます。

あるいは、システム設定 → Apple ID → iCloud → Macストレージを最適化 をオフにします — その代わり、すべての iCloud ファイルの分だけディスク使用量が増えます。

保管庫ごとに使う同期サービスは 1 つにしてください。同じフォルダを 2 つのクライアントで同期すると、どちらがファイルを管理しているのか分かりにくくなるうえ、iCloud Drive のガイドで説明している、警告なく上書きされる競合を招きます。

注意: 同じプレースホルダー状態は iPhone にも存在します。.kdbx がそのデバイスでまだダウンロードされていない場合、Kakuremi はエラー KR-3005(ファイルを読み取れません)を報告します。解決方法も同じです — 「ファイル」アプリを開き、ファイルをタップしてダウンロードしてから再試行してください。そしていつもどおり、後勝ち(最後に保存したものが優先される)になるため、編集は一度に 1 台のデバイスで行ってください。