在 LUKS 上的 LVM 上取消删除 ext4 中的 1 个文件

在 LUKS 上的 LVM 上取消删除 ext4 中的 1 个文件

概括

如果知道文件被删除之前的完全限定路径,如何(相对轻松且可靠地)从 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
    

我相信我记得如何使用以下命令从简单分区恢复文件扩展删除: 请参阅下面的过程。我想知道的是

  1. 相同或类似的过程是否适用于托管+加密分区?如果不相同,需要添加、修改或删除哪些内容?
  2. extundelete对于这个用例,是否有更可靠的工具(比)?如果是这样,这个用例的程序是什么?

简单划分过程

我上次的过程——对于“简单”的 ext4 分区——使用extundelete如下 (bash) 示例:

  1. 阅读info extundelete和(太微薄)扩展删除文档(向下滚动到标题= Documentation)。请注意,它可以处理此处所示以外的用例,例如恢复全部从分区中删除文件。
  2. 指定目标文件:

    1. 定义其完全限定路径TARGET_FQP,记住不是使用~

      # CHANGE FOR YOUR USECASE!
      TARGET_FQP="${HOME}/video/greatest_movie_ever.mp4"
      echo "TARGET_FQP='${TARGET_FQP}'"
      
    2. 定义其目录/文件夹(我们假设与目标文件位于同一(目标)分区上):

      TARGET_DIR="$(dirname "${TARGET_FQP}")"
      echo "TARGET_DIR='${TARGET_DIR}'"
      
    3. 定义其文件名(下面使用)

      TARGET_FN="$(basename "${TARGET_FQP}")"
      echo "TARGET_FN='${TARGET_FN}'"
      
  3. 从目标目录中识别目标分区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}'"
    
  4. 使用当前工作目录 (CWD) 打开您选择的 shell(在您选择的终端中),以便

    • CWD 位于目标以外的分区上。 (使用lsblkfdisk您选择的工具获取有关分区的信息。)
    • extundelete会将它找到的任何文件(如果有)恢复到 CWD 子目录 name= RECOVERED_FILES,所以我猜测,如果您已经有一个具有该名称的文件,您想要移动它。 (如果你知道如何覆盖它,请让我知道。IIRC,--restore-directory确实不是做这个。)
  5. 重新挂载目标分区为只读:

    mount --options remount,ro --source "${TARGET_PART}"
    
  6. 跑步extundelete

    date # because if this runs too long, you'll wanna give up
    extundelete --restore-file "${TARGET_FQP}" "${TARGET_PART}"
    
  7. 检查恢复后的文件:

    SAVED_RELPATH="./RECOVERED_FILES/${TARGET_FN}"
    echo '(hopefully) restored file @'
    ls -al "${SAVED_RELPATH}"
    
  8. 假设恢复的文件@SAVED_RELPATH是您想要的,您可以重新挂载TARGET_PART读/写并将其移动到那里,或者(我通常这样做)

    1. 将恢复的文件移动到外部备份
    2. 重新启动包含以下内容的 PCTARGET_PART
    3. 将恢复的文件从备份复制到TARGET_DIR

欢迎您的更正或改进。

相关内容