撤消wipefs --all --force /dev/sda?/开发/ sda

Lin*_*eak 7 filesystems partition data-recovery gpt disk

操作系统:Debian的舷窗,uname -a

Linux backup-server 5.10.0-5-amd64 #1 SMP Debian 5.10.24-1 (2021-03-19) x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种撤消此wipefs命令的方法:

wipefs --all --force /dev/sda? /dev/sda
Run Code Online (Sandbox Code Playgroud)

而以前的结构是:

Linux backup-server 5.10.0-5-amd64 #1 SMP Debian 5.10.24-1 (2021-03-19) x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

以及该wipefs命令的输出(仍在我的终端上):

wipefs --all --force /dev/sda? /dev/sda
Run Code Online (Sandbox Code Playgroud)

我可能在https://sysbits.org/上找到了一篇文章,即:https : //sysbits.org/undoing-wipefs/

我将从那里引用擦除撤消部分,我想知道它是否合理并且我可以在我的服务器上安全地执行它,我还没有重新启动,从那时起试图从这个地狱中找出解决方法一个错字:

  1. 擦拭部分

    fdisk -l /dev/sda
    
    Disk /dev/sda: 223.57 GiB, 240057409536 bytes, 468862128 sectors
    Disk model: CT240BX200SSD1  
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
    Disklabel type: gpt
    Disk identifier: 8D5A08BF-0976-4CDB-AEA2-8A0EAD44575E
    
    Device       Start       End   Sectors   Size Type
    /dev/sda1     2048   1050623   1048576   512M EFI System
    /dev/sda2  1050624 468860927 467810304 223.1G Linux filesystem
    
    Run Code Online (Sandbox Code Playgroud)
  2. 撤销部分

    /dev/sda1: 8 bytes were erased at offset 0x00000052 (vfat): 46 41 54 33 32 20 20 20
    /dev/sda1: 1 byte was erased at offset 0x00000000 (vfat): eb
    /dev/sda1: 2 bytes were erased at offset 0x000001fe (vfat): 55 aa
    /dev/sda2: 2 bytes were erased at offset 0x00000438 (ext4): 53 ef
    /dev/sda: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
    /dev/sda: 8 bytes were erased at offset 0x37e4895e00 (gpt): 45 46 49 20 50 41 52 54
    /dev/sda: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa
    
    Run Code Online (Sandbox Code Playgroud)

可能的替代解决方案

刚才我testdisk在那个SSD盘上运行了,发现很多分区,但只有这两个和原来的匹配:

wipefs -a /dev/sda

/dev/sda: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 8 bytes were erased at offset 0x3b9e655e00 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa
Run Code Online (Sandbox Code Playgroud)

我可以/我应该点击Write(将分区结构写入磁盘)吗?如果没有,为什么不呢?

ilk*_*chu 14

你很幸运,wipefs实际上打印了它擦拭的部分。

这些,

wipefs -a /dev/sda
/dev/sda: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 8 bytes were erased at offset 0x3b9e655e00 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa

echo -en '\x45\x46\x49\x20\x50\x41\x52\x54' | dd of=/dev/sda bs=1 conv=notrunc seek=$((0x00000200))
echo -en '\x45\x46\x49\x20\x50\x41\x52\x54' | dd of=/dev/sda bs=1 conv=notrunc seek=$((0x3b9e655e00))
echo -en '\x55\xaa' | dd of=/dev/sda bs=1 conv=notrunc seek=$((0x000001fe))
Run Code Online (Sandbox Code Playgroud)

总的来说,对我来说看起来很明智。

但请注意,那里的偏移量与您的情况不同!您需要使用从wipefs.

根据偏移值(0x3b9e655e00 与 0x37e4895e00),它们的磁盘比您稍大(~256 GB vs ~240 GB)。使用它们的值意味着磁盘末尾的备份 GPT 将被破坏。这应该无关紧要,因为只要第一个副本完好无损,任何分区工具都应该能够重写它。

但是,如果情况正好相反,并且您使用的错误偏移量恰好在磁盘大小之内,您最终会覆盖驱动器的某些随机部分。不好。

此外,文件系统的幻数当然需要在正确的位置。


我用 VFAT 图像测试了擦除和撤消它,并在过于仔细地阅读您的版本之前将其写下:

printf "$(printf '\\x%s' 46 41 54 31 36 20 20 20)" |
  dd bs=1 conv=notrunc seek=$(printf "%d" 0x00000036) of=test.vfat
Run Code Online (Sandbox Code Playgroud)

那是针对单个wipefs输出行(对其他人重复):

test.vfat: 8 bytes were erased at offset 0x00000036 (vfat): 46 41 54 31 36 20 20 20
Run Code Online (Sandbox Code Playgroud)

开头的嵌套 printf 允许从 复制粘贴输出wipefs,而无需手动更改46 41 54 31...\x46\x41\x54\x31...

同样,您需要注意在正确的偏移量中输入正确的值!

进一步自动化可能不会太糟糕,但是由于涉及的风险,我不太热衷于公开发布这样的脚本而无需进行大量测试。

如果可以,请先复制磁盘内容,然后再弄乱它。


Lin*_*eak 7

在我的标题为Undoing 的问题中wipefs,我选择使用 重新创建分区testdisk,最好避免它,因为它花费了可测量的时间(不仅仅是点击Write),在我这样做之前,我必须小心检查了两个分区 -testdisk允许我阅读它们的结构,我继续阅读一些目录 - 看起来不错。


我没有想到的是底层文件系统,因为它现在当然没有启动。

我从一个实时的 Linux Mint 拍了一张 GParted 的照片:

未知文件系统 - GParted


我会重复,wipefs命令的完整输出是:

/dev/sda1: 8 bytes were erased at offset 0x00000052 (vfat): 46 41 54 33 32 20 20 20
/dev/sda1: 1 byte was erased at offset 0x00000000 (vfat): eb
/dev/sda1: 2 bytes were erased at offset 0x000001fe (vfat): 55 aa
/dev/sda2: 2 bytes were erased at offset 0x00000438 (ext4): 53 ef
/dev/sda: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 8 bytes were erased at offset 0x37e4895e00 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa
Run Code Online (Sandbox Code Playgroud)

为了撤消已删除的内容,我做了:

首先,我的 Ext4 分区:

echo -en '\x53\xef' | dd of=/dev/sda2 bs=1 conv=notrunc seek=$((0x00000438))
partprobe /dev/sda2
Run Code Online (Sandbox Code Playgroud)

现在,可挂载并且可以读取所有文件。

二、我的EFI分区:

echo -en '\x46\x41\x54\x33\x32\x20\x20\x20' | dd of=/dev/sda1 bs=1 conv=notrunc seek=$((0x00000052))
echo -en '\xeb' | dd of=/dev/sda1 bs=1 conv=notrunc seek=$((0x00000000))
echo -en '\x55\xaa' | dd of=/dev/sda1 bs=1 conv=notrunc seek=$((0x000001fe))
partprobe /dev/sda1
Run Code Online (Sandbox Code Playgroud)

我重新启动,现在 SSH 进入我的服务器没有任何问题。