こういう経験、Linuxサーバーを触っている人なら一度は冷や汗をかいたことがあるはずです。Windowsのごみ箱と違い、Linuxのrmコマンドは「元に戻す」という仕組みを持っていない。実行した瞬間、ファイルは見えなくなります。
しかし「見えなくなった」と「データが消えた」は別の話です。正確には、ファイルシステムの管理情報(ディレクトリエントリとinode)が無効化されただけで、ディスク上のデータブロック自体は別のデータで上書きされるまで残っている可能性があります。
この記事では、Linuxで誤って削除したファイルを復元する方法を解説します。初動対応のポイント、testdisk・photorec コマンドによる実践的な復元手順、lsof を使った即時復元まで、RHEL 9.4 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認した内容を紹介します。
この記事のポイント
・削除直後はディスクへの書き込みを止めることが最優先——追記するほど復元率は下がる
・testdisk/photorec コマンドで ext4・XFS から削除ファイルを復元できる
・プロセスが開いていれば lsof + /proc/[pid]/fd で即時・確実に復元できる
・extundelete は長期メンテ停止のため実務では testdisk/photorec が主流
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜrmで削除したファイルは復元できる可能性があるのか?
復元作業の前に「なぜ復元できるのか」を理解しておくと、初動対応の判断基準が明確になります。1. ext4ファイルシステムでの削除の仕組み
Linuxのext4ファイルシステムでrmコマンドを実行すると、OSは以下の処理を行います。・ディレクトリエントリから当該ファイルのレコードを削除する
・inodeの参照カウント(nlinks)を0にして「未使用」とマークする
・inodeが指していたデータブロックを「空き領域」としてビットマップに登録する
ここで重要なのは「空き領域としてマークする」だけという点です。実際のデータブロックの中身は即座に消去されない。別のファイルがその領域に書き込まれるまで、データはディスク上に物理的に残っています。
だから「削除直後なら復元できる可能性がある」のです。逆に言えば、削除後にサーバーが大量のログを書き込んだり、新しいファイルを作成したりするほど、空き領域として登録されたブロックが別データで上書きされ、復元率は急速に下がります。
2. ファイルシステムの種類で復元難易度が変わる
| ファイルシステム | 主な復元ツール | 復元難易度 |
|---|---|---|
| ext4 | testdisk / photorec |
中(journalが早期上書きすることがある) |
| XFS | testdisk / photorec |
高(削除inodeを即時再利用する設計) |
| btrfs | btrfs restore / snapper |
低(スナップショットがあれば確実) |
| ZFS | zfs rollback |
低(スナップショットがあれば確実) |
復元作業の前に必ずやること(初動対応3ステップ)
復元できるかどうかは、削除直後の初動対応で大きく変わります。パニックにならず、順番どおりに対応してください。1. 対象ディスクへの書き込みを即座に止める
削除したファイルが存在していたディスクへの書き込みを最小化することが最優先です。・アプリケーションサーバーやDBサービスを一時停止する
・ログローテーションやcronジョブが実行されていないか確認する
・可能であればファイルシステムを読み取り専用(readonly)でリマウントする
システムのrootパーティション(/)は稼働中にreadonly化できませんが、データ専用の別パーティション(/var/data 等)であればリマウントが有効です。
# 例: /var/data パーティションを読み取り専用でリマウントする # ※ 稼働中サービスが書き込んでいる場合は事前に停止すること mount -o remount,ro /var/data # リマウント結果の確認(ro が付いていればOK) mount | grep /var/data # 出力例: /dev/sdb1 on /var/data type ext4 (ro,relatime)
2. ファイルシステムの種類とデバイスを確認する
復元ツールを選択するために、まず削除ファイルが存在していたディスクとファイルシステムを特定します。# ファイルシステムの種類とマウントポイントを確認 df -T /home # 出力例: # Filesystem Type 1K-blocks Used Available Use% Mounted on # /dev/sda3 ext4 102399996 4521024 92638588 5% /home # ブロックデバイス全体を確認(パーティション構成の把握) lsblk -f # NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS # sda # ├─sda1 ext4 1.0 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 476.9M 20% /boot # ├─sda2 swap 1 [SWAP] # └─sda3 ext4 1.0 yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy 88.3G 5% /home
3. バックアップ・スナップショットを最初に確認する
復元ツールを使う前に、まずバックアップが存在しないか確認してください。スナップショットやtarアーカイブがあれば、testdiskよりはるかに確実で速く復元できます。・LVMスナップショット(lvs コマンドで確認)
・rsyncによる定期バックアップ(/backup 等のバックアップ先を確認)
・tarアーカイブ(定期バックアップスクリプトの出力先を確認)
・クラウドVM(AWS EC2・Azure VM)のスナップショット
定期バックアップの仕組みについては「tar コマンドの実用例」も参考にしてください。
Linux無料マニュアルを受け取る >>
testdisk / photorec で削除ファイルを復元する方法
testdisk は、パーティション復旧ツールとして開発されたオープンソースのツールです。同梱されている photorec は、ファイルシグネチャ(ファイル先頭のマジックバイト)を利用して削除ファイルを復元します。ext4・XFS・FAT32 など主要なファイルシステムに対応しており、extundelete と違いメンテナンスが継続されているため、現在の実務で最も使いやすい選択肢です。1. testdisk / photorec のインストール
# RHEL 9 / Rocky Linux 9(EPELリポジトリが必要) dnf install epel-release -y dnf install testdisk -y # Ubuntu 24.04 LTS apt-get install testdisk -y # インストール確認(testdisk と photorec がセットでインストールされる) testdisk --version # TestDisk 7.2, Data Recovery Utility, ... photorec --version # PhotoRec 7.2, Data Recovery Utility, ...
2. 復元対象のディスクを特定する
testdiskを起動する前に、復元対象のデバイス名(/dev/sdX 等)を正確に把握します。# ブロックデバイス一覧でデバイス名を確認 lsblk # NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS # sda 8:0 0 50G 0 disk # ├─sda1 8:1 0 1G 0 part /boot # ├─sda2 8:2 0 4G 0 part [SWAP] # └─sda3 8:3 0 45G 0 part /home # 削除したファイルが /home にあった場合 → /dev/sda または /dev/sda3 を指定する
3. photorec で削除ファイルを復元する
photorec は対話的(ncurses UI)なツールです。以下の手順で操作します。【重要】復元先ディスクは必ず別のパーティション・別のディスクに指定すること。対象ディスクと同じ領域に書き込むと、復元したいデータを上書きするリスクがあります。これが photorec 使用時の最大の注意点です。
# photorec の起動(rootまたはsudoが必要) # ディスク全体を指定する場合 sudo photorec /dev/sda # 特定パーティションを直接指定する場合 sudo photorec /dev/sda3
・起動画面 → 対象ディスクを選択 → [Proceed]
・パーティションテーブル確認画面 → 対象パーティションを選択
・ファイルシステムの種類を選択(ext4/XFSの場合は「ext2/ext3/ext4」または「Other」)
・「Whole(パーティション全体)」を選択
・復元先ディレクトリを選択(別パーティション上のディレクトリを指定)
・[C](Current directory)で確定 → 復元開始
復元が完了すると、指定ディレクトリ配下に「recup_dir.1」「recup_dir.2」等のディレクトリが作られ、その中に復元ファイルが格納されます。ファイル名は元の名前ではなく連番になるため、内容で確認が必要です。
# 復元先ディレクトリの確認例 ls /mnt/backup/recup_dir.1/ # f0000001.conf f0000002.log f0000003.sh ... # ファイルの内容で目的のファイルを探す grep -rl "探したいキーワード" /mnt/backup/recup_dir.1/
4. testdisk のUndelete機能でファイルを復元する
photorec はファイルシグネチャ頼みのため、テキストファイル(.conf 等)は復元できないことがあります。ext4 パーティションで、かつ削除直後であれば testdisk の「Undelete」機能の方がファイル名ベースで復元できる可能性があります。# testdisk の起動 sudo testdisk /dev/sda # 操作順序: # 1. [Create] → ログファイルを作成(推奨) # 2. 対象ディスクを選択 # 3. パーティションテーブルの種類を選択(通常は[Intel]または[GPT]) # 4. [Analyse] → [Quick Search] # 5. 対象パーティションを選択して [P](ファイル一覧表示) # 6. 削除されたファイルは赤色で表示される # 7. 対象ファイルを選択して [C](コピー)→ 復元先を指定
# 検証: /home/testuser/test.conf を削除後にtestdiskで復元 rm /home/testuser/test.conf # testdisk でディレクトリ内の削除ファイルを確認 # [P]キーでディレクトリを開くと、削除済みファイルが赤文字で表示される: # drwxr-xr-x 0 0 4096 19-Jul-2026 11:20 . # drwxr-xr-x 0 0 4096 19-Jul-2026 11:18 .. # -rw-r--r-- 1000 1000 2048 19-Jul-2026 11:19 test.conf ← 赤文字で表示 # [C]キーでコピー先を /mnt/restore/ に指定して復元完了 # Copying /home/testuser/test.conf ... done
lsof を使った「プロセスが開いているファイル」の即時復元
これが使えるケースでは、最も確実な方法です。Linuxカーネルは、プロセスがファイルを開いている間は inode への参照を保持します。rmで削除してもプロセスがファイルディスクリプタを保持していれば、/proc/[pid]/fd 経由でファイルの内容にアクセスできます。1. lsof で削除済みだが開かれているファイルを探す
# 削除済みファイルを開いているプロセスを検索 lsof | grep deleted # 出力例: # nginx 12345 root 4r REG 8,3 1048576 123456 /var/log/nginx/access.log (deleted) # mysqld 23456 mysql 10r REG 8,3 524288 654321 /tmp/mysql_tmp_xyz (deleted) # 特定ファイルを検索したい場合 lsof | grep "important.conf (deleted)"
2. /proc/[pid]/fd からファイルを取り出す
# pid=12345、fdが4の場合の復元例(上記lsof出力より) ls -la /proc/12345/fd/4 # lr-x------ 1 root root 64 Jul 19 11:30 /proc/12345/fd/4 -> /var/log/nginx/access.log (deleted) # ファイルをコピーして復元(別のパスに保存) cp /proc/12345/fd/4 /tmp/access.log.restored # 復元確認 ls -la /tmp/access.log.restored # -rw-r--r-- 1 root root 1048576 Jul 19 11:31 /tmp/access.log.restored wc -l /tmp/access.log.restored # 15237 /tmp/access.log.restored
extundelete について(参考情報)
ext4専用の削除ファイル復元ツールとして extundelete がよく紹介されてきましたが、最後のリリースが2013年で長期間メンテナンスが停止しています。RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS の環境では正常動作しないケースが多く報告されており、現在の実務では推奨しません。ext4 環境であれば testdisk の Undelete 機能を、ファイルシグネチャで復元できる形式であれば photorec を使う方が確実です。「extundelete を使え」という情報を見かけた場合は、記事の年代を確認してください。
トラブルシュート——復元がうまくいかない場合
photorec で「No partition found」が表示された場合
パーティションテーブルが読み取れない状態です。以下を確認してください。・sudo なしで実行していないか(rootまたはsudoが必要)
・指定したデバイスが正しいか(/dev/sda と /dev/sda3 では動作が異なる)
・ディスク自体に物理障害がないか(dmesg でエラーを確認する)
# dmesg でディスクエラーを確認 dmesg | grep -E "error|I/O|failed|ata[0-9]" | tail -20 # ハードウェアエラーが出ている場合の例: # [12345.678901] blk_update_request: I/O error, dev sda, sector 1234567890 op 0x0:(READ) ... # → 物理障害の可能性あり。これ以上の書き込みは避けてデータ復旧業者に相談
復元したファイルの内容が壊れていた場合
削除から時間が経過してデータブロックが上書きされた可能性があります。・削除からの経過時間が長いほど上書きリスクは高い
・サーバーへのアクセスが多いほどファイルシステムへの書き込みが増え、復元率は低下する
・XFSパーティションでは inode 再利用が早いため、ext4 より復元率が低い
photorec が復元するファイルは「ファイルシグネチャ(先頭バイト)で判定したもの」なので、連続したデータブロックが確保できていない場合はファイルが断片化して破損します。
testdisk でファイルが赤文字表示されない場合
XFSパーティションでは testdisk のUndelete機能が使えません(XFSはinode再利用が早いため)。XFS環境では photorec または バックアップからの復元を検討してください。本記事のまとめ
Linuxでの誤削除は、初動対応の速さと適切なツール選択が復旧率を左右します。| 状況 | 推奨手順 |
|---|---|
| 削除直後、プロセスがファイルを開いていた | lsof | grep deleted → cp /proc/[pid]/fd/N |
| ext4パーティション、削除直後 | testdisk /dev/sdX → Undelete機能 |
| ext4・XFS問わず削除ファイルを広く拾いたい | photorec /dev/sdX → ファイルシグネチャ復元 |
| バックアップ・スナップショットがある | LVMスナップショット / rsync / tar バックアップから復元 |
| dmesgにI/Oエラーがある、ディスクが認識されない | 書き込みを止めてデータ復旧専門業者に相談 |
「削除してから気づく」では遅い——バックアップ設計を含むサーバー管理の「型」を今すぐ身につける
誤削除への対処は「復元ツールを知っている」ことより「バックアップが取れている」ことの方がはるかに重要です。Linux歴20年以上、3,100名以上への指導経験を持つ現役エンジニアが、サーバー構築・バックアップ設計・障害対応を体系的に教えます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:空き容量があるのにNo space left on deviceになる原因と対処|inode枯渇の調査手順
- 前のページへ:Linuxにログインできない時の調査手順|faillockによるアカウントロックの確認・解除とPAM設定の見方
- この記事の属するカテゴリ:Linuxトラブルシューティングへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます