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/
我将从那里引用擦除和撤消部分,我想知道它是否合理并且我可以在我的服务器上安全地执行它,我还没有重新启动,从那时起试图从这个地狱中找出解决方法一个错字:
擦拭部分
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)
撤销部分
/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...
。
同样,您需要注意在正确的偏移量中输入正确的值!
进一步自动化可能不会太糟糕,但是由于涉及的风险,我不太热衷于公开发布这样的脚本而无需进行大量测试。
如果可以,请先复制磁盘内容,然后再弄乱它。
在我的标题为Undoing 的问题中wipefs
,我选择使用 重新创建分区testdisk
,最好避免它,因为它花费了可测量的时间(不仅仅是点击Write),在我这样做之前,我必须小心检查了两个分区 -testdisk
允许我阅读它们的结构,我继续阅读一些目录 - 看起来不错。
我没有想到的是底层文件系统,因为它现在当然没有启动。
我从一个实时的 Linux Mint 拍了一张 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 进入我的服务器没有任何问题。