概括
如果知道文件被删除之前的完全限定路径,如何(相对轻松且可靠地)从 LUKS 容器内的 LVM 卷内的 ext4 文件系统中{恢复、取消删除}文件? (如果我使用了不正确的术语,请提前道歉——请在必要时更正。)
细节
好消息是,自从我不小心删除了一个无法轻松恢复(例如,从备份)的文件以来,已经有很多年了。定义一些精确性术语:
- 调用我的文件{已删除,寻求恢复}
target file
- 调用目标文件以前所在的目录/文件夹
target dir
- 调用分区{目标文件以前所在的位置,我试图将目标文件恢复到该分区}
target partition
坏消息是,
- 上次,目标分区是“simple ext4”:即没有加密或其他管理。
LVM2_crypt-home
这次,目标分区是下表中name= 的分区lsblk
:NAME MAJ:MIN SIZE TYPE MOUNTPOINT sda 8:0 465.8G disk ├─sda1 8:1 16.6G part ├─sda2 8:2 97.7G part ├─sda3 8:3 500M part /boot ├─sda4 8:4 1K part └─sda5 8:5 351G part └─LVM2_crypt 254:0 351G crypt ├─LVM2_crypt-swap 254:1 3.9G lvm ├─LVM2_crypt-root 254:2 20G lvm / └─LVM2_crypt-home 254:3 327.1G lvm /home
我相信我记得如何使用以下命令从简单分区恢复文件扩展删除: 请参阅下面的过程。我想知道的是
- 相同或类似的过程是否适用于托管+加密分区?如果不相同,需要添加、修改或删除哪些内容?
extundelete
对于这个用例,是否有更可靠的工具(比)?如果是这样,这个用例的程序是什么?
简单划分过程
我上次的过程——对于“简单”的 ext4 分区——使用extundelete
如下 (bash) 示例:
- 阅读
info extundelete
和(太微薄)扩展删除文档(向下滚动到标题=Documentation
)。请注意,它可以处理此处所示以外的用例,例如恢复全部从分区中删除文件。 指定目标文件:
定义其完全限定路径
TARGET_FQP
,记住不是使用~
:# CHANGE FOR YOUR USECASE! TARGET_FQP="${HOME}/video/greatest_movie_ever.mp4" echo "TARGET_FQP='${TARGET_FQP}'"
定义其目录/文件夹(我们假设与目标文件位于同一(目标)分区上):
TARGET_DIR="$(dirname "${TARGET_FQP}")" echo "TARGET_DIR='${TARGET_DIR}'"
定义其文件名(下面使用)
TARGET_FN="$(basename "${TARGET_FQP}")" echo "TARGET_FN='${TARGET_FN}'"
从目标目录中识别目标分区
TARGET_PART
及其安装点:TARGET_MP
TARGET_PART="$(df --output=source "${TARGET_FQP}" | tail -1)" echo "TARGET_PART='${TARGET_PART}'" TARGET_MP="$(df --output=target "${TARGET_FQP}" | tail -1)" echo "TARGET_MP='${TARGET_MP}'"
使用当前工作目录 (CWD) 打开您选择的 shell(在您选择的终端中),以便
- CWD 位于目标以外的分区上。 (使用
lsblk
或fdisk
您选择的工具获取有关分区的信息。) extundelete
会将它找到的任何文件(如果有)恢复到 CWD 子目录 name=RECOVERED_FILES
,所以我猜测,如果您已经有一个具有该名称的文件,您想要移动它。 (如果你知道如何覆盖它,请让我知道。IIRC,--restore-directory
确实不是做这个。)
- CWD 位于目标以外的分区上。 (使用
重新挂载目标分区为只读:
mount --options remount,ro --source "${TARGET_PART}"
跑步
extundelete
:date # because if this runs too long, you'll wanna give up extundelete --restore-file "${TARGET_FQP}" "${TARGET_PART}"
检查恢复后的文件:
SAVED_RELPATH="./RECOVERED_FILES/${TARGET_FN}" echo '(hopefully) restored file @' ls -al "${SAVED_RELPATH}"
假设恢复的文件@
SAVED_RELPATH
是您想要的,您可以重新挂载TARGET_PART
读/写并将其移动到那里,或者(我通常这样做)- 将恢复的文件移动到外部备份
- 重新启动包含以下内容的 PC
TARGET_PART
- 将恢复的文件从备份复制到
TARGET_DIR
欢迎您的更正或改进。