KeePassXCが「データベースファイルの読み取りに失敗」— 犯人はクラウド同期だった
KeePassXCが「データベースファイルの読み取りに失敗」— 犯人はクラウド同期だった
KeePassXC が突然データベースを開けなくなった。エラーは
「データベースの読み込み中にエラーが発生しました。データベースファイルの読み取りに失敗しました。」
一見すると「ファイルが壊れた?」と青ざめる場面だが、真因はまったく別のところにあった。記録として残しておく。
結論から
ファイルは壊れていない。 クラウド同期(Google Drive / iCloud Drive 等)が
ファイルの実体をローカルに落としておらず、KeePassXC の読み取りがハングしていただけ。
対象を「オフラインで使用可能」にして実体をローカルに固定したら、あっさり開いた。
なぜそう言い切れたか
切り分けの決め手は2つ。
① 別マシンでは開けた。 同じ .kdbx を Windows では何の問題もなく開けた。
データベースそのものが壊れているなら、どの環境でも開けないはず。整合性は無傷と確定する。
② ローカルファイルの read がタイムアウトした。
xxd database.kdbx | head -1
# → Operation timed out
数百KBのローカルファイルの先頭を覗くだけの操作が、タイムアウトする。これは異常だ。
ファイルがローカルにあるなら一瞬で終わる。タイムアウトする=
**「サイズは見えているのに、中身(実体)がローカルに無い」**状態を意味する。
ls -l がサイズを表示してくれるのは、メタデータだけ持っているから。
実体はクラウド上にあり、アクセスされた瞬間にオンデマンドで取りに行く設計(File Stream / プレースホルダ)。
このオンデマンド取得が何らかの理由で詰まると、読み取りはハングし、
アプリ側は「ファイルの読み取りに失敗」とだけ報告する。
おまけのヒントとして、ls のパーミッション末尾に付く @(拡張属性)も、
そのファイルがクラウド管理下にあるサインのひとつだった。
直し方
- クラウドのアプリ(Google Drive 等)を起動し、対象ファイル/フォルダを
「オフラインで使用可能」 に切り替える。実体が常時ローカルに保持される。- iCloud Drive なら Finder で右クリック →「今すぐダウンロード」、
またはbrctl download "database.kdbx"。
- iCloud Drive なら Finder で右クリック →「今すぐダウンロード」、
- 確認は再び
xxd。一瞬で返り、先頭が KeePass のシグネチャ
03d9 a29a 67fb 4bb5で始まれば実体が揃った証拠。
教訓 — 持ち帰れる原則
ローカルにあるはずのファイルの
readがタイムアウトしたら、
まずクラウドのプレースホルダ未取得を疑う。
ファイルサイズ(メタデータ)と中身(実体)の有無は別物。
そしてセキュリティ運用としてもうひとつ。パスワードDBをクラウド同期フォルダに置きっぱなしにしない。
同期コンフリクトでファイルの世代が増殖し、「どれが正本か分からない」状態は事故の温床になる。
正本はローカルに固定し、KeePassXC 自身のバックアップ機能を有効化、
クラウドはあくまでバックアップの置き場に格下げする——これが堅い。
補足:KDBX ファイルの先頭8バイトは 03 D9 A2 9A 67 FB 4B B5。
ここが欠ける/空なら、それは本当のヘッダ破損なのでバックアップ復旧ルートへ。