最近,我的外部硬盘驱动器机箱出现故障(硬盘驱动器本身在另一个机箱中通电)。然而,结果是,它的 EXT4 文件系统似乎已损坏。
该驱动器具有单个分区并使用 GPT 分区表(带有标签ears)。
fdisk -l /dev/sdb 显示:
Device Boot Start End Blocks Id System
/dev/sdb1 1 1953525167 976762583+ ee GPT
Run Code Online (Sandbox Code Playgroud)
testdisk 显示分区完好无损:
1 P MS Data 2049 1953524952 1953522904 [ears]
Run Code Online (Sandbox Code Playgroud)
...但分区无法挂载:
$ sudo mount /dev/sdb1 a
mount: you must specify the filesystem type
$ sudo mount -t ext4 /dev/sdb1 a
mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
Run Code Online (Sandbox Code Playgroud)
fsck 报告无效的超级块:
$ sudo fsck.ext4 /dev/sdb1
e2fsck 1.42 (29-Nov-2011)
fsck.ext4: Superblock invalid, trying backup blocks... …Run Code Online (Sandbox Code Playgroud) 我有一个用 BTRFS 格式化的外部驱动器似乎拒绝安装:
$ sudo mount -vs -t btrfs -o ro,recovery,errors=continue /dev/sdb2 /media/user/dir
mount: /dev/sdb2: can't read superblock
Run Code Online (Sandbox Code Playgroud)
但是,当 BTRFS 认为所有超级块都可以时:
$ sudo btrfs rescue super-recover -v /dev/sdb2
All Devices:
Device: id = 1, name = /dev/sdb2
Before Recovering:
[All good supers]:
device name = /dev/sdb2
superblock bytenr = 65536
device name = /dev/sdb2
superblock bytenr = 67108864
device name = /dev/sdb2
superblock bytenr = 274877906944
[All bad supers]:
All supers are valid, no need to recover
Run Code Online (Sandbox Code Playgroud)
如果我尝试指定sb=$((67108864/4))( …
最近我不小心将 EXT4 分区格式化为 FAT。我陷入了恐慌。在我希望破灭的黑暗森林中长途跋涉后,我可以恢复我的隔板,看起来没问题。在sudo mke2fs -n /dev/sdx介绍了一些超级块后,我拿起一个就跑sudo e2fsck -b a_block_number /dev/sdxy,宾果游戏!我所有的文件和目录都放在了 lost+found 文件夹中。
问题是所有备份超级块都是相同的,还是有可能一个比另一个更新得更多?
第二个问题是,将 EXT4 分区重新格式化为 EXT4 会覆盖备份超级块吗?(在我们之间,在尝试 mke2fs 和 e2fsck 之前,我再次将 FAT 分区重新格式化为 EXT4)
我知道我可以使用以下命令列出文件系统超级块的位置。
首先获取当前目录的设备句柄。
$ df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/fedora_greeneggs-home 402G 146G 236G 39% /home
Run Code Online (Sandbox Code Playgroud)
然后使用此命令列出 handle 的超级块/dev/mapper/fedora_greeneggs-home。
$ sudo dumpe2fs /dev/mapper/fedora_greeneggs-home | grep -i superblock
dumpe2fs 1.42.7 (21-Jan-2013)
Primary superblock at 0, Group descriptors at 1-26
Backup superblock at 32768, Group descriptors at 32769-32794
Backup superblock at 98304, Group descriptors at 98305-98330
Backup superblock at 163840, Group descriptors at 163841-163866
Backup superblock at 229376, Group descriptors at 229377-229402
Backup superblock at 294912, …Run Code Online (Sandbox Code Playgroud) 当我以正常模式或运行级别 1 启动我的机器时,它会引发以下错误并且我无法启动机器:
checking filesystems
/dev/MyGroup/LogVol00: UNEXPECTED INCONSISTENCY; RUN fsck MANNUALLY
(i.e., without -a or -p options)
\*** An error occured during the file system check
\*** Dropping you to a shell; the system will reboot
\*** when you leave the shell
Give root password for maintenance (or type Control-D to continue):
Run Code Online (Sandbox Code Playgroud)
我输入密码并运行fsckand e2fsck,但两者都给出了相同的错误格式,如下所示:
(Repair filesystem) 1 # fsck
fsck 1.39 (29-May-2006)
Run Code Online (Sandbox Code Playgroud)
或者
(Repair filesystem) 1 # e2fsck -y /dev/MyGroup/LogVol00
e2fsck 1.39 (29-May-2006)
/dev/MyGroup/LogVol001: clean, 141289/1402144 files, …Run Code Online (Sandbox Code Playgroud) Red Hat Linux 5 上的问题。
由于一些误传,我们环境中的两个 LUN 从 1.2 TB 扩大到 1.7 TB。
现在,重新启动后,mdadm 找不到再次构建阵列的超级块。
通用格式 — 称为 0.90 版 — 有一个 4K 长的超级块,写入一个 64K 对齐的块,该块从设备末尾开始至少 64K 且小于 128K(即获取超级块的地址)设备大小降低到 64K 的倍数,然后减去 64K)。
我找到了一些旧文档:
# mdadm -D /dev/md0
/dev/md0:
Version : 0.90
Creation Time : Tue Jul 10 17:45:00 2012
Raid Level : raid1
Array Size : 1289748416 (1230.00 GiB 1320.70 GB)
Used Dev Size : 1289748416 (1230.00 GiB 1320.70 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor …Run Code Online (Sandbox Code Playgroud) 我已经/dev/sdb1并且/dev/sdc2之前使用 将其设置为 RAID-1 mdadm,但后来我重新安装并丢失了旧配置。出于白痴,我跑了
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
Run Code Online (Sandbox Code Playgroud)
试图重新配置 RAID。在我让驱动器同步后(哎呀?),现在/dev/md0、/dev/sdb1、 或/dev/sdc2都不会挂载。对于/dev/md0,它抱怨超级块中有一个坏的幻数。对于/dev/sd{b,c}1,它会抱怨缺少 inode。
简而言之,问题是这样的:我是否只是对我的所有数据进行了 bork,还是仍然可以恢复阵列?
以下是dumpe2fs这些分区的输出:
brent@codpiece:~$ sudo dumpe2fs /dev/md0
dumpe2fs 1.42 (29-Nov-2011)
dumpe2fs: Bad magic number in super-block while trying to open /dev/md0
Couldn't find valid filesystem superblock.
brent@codpiece:~$ sudo dumpe2fs /dev/sdb1
dumpe2fs 1.42 (29-Nov-2011)
Filesystem volume name: <none>
Last mounted on: /var/media
Filesystem UUID: 1462d79f-8a10-4590-8d63-3fcc105b601d
Filesystem magic number: …Run Code Online (Sandbox Code Playgroud) 我在安装 Mint Debian 版时,与经典版不同,当我没有指定格式化时,安装会自动格式化我的主分区。
所以以前的格式和现在一样是 ext4。我相信数据仍然存在,因为它是一种快速格式。
我现在已在实时 USB 上启动计算机以防止在其上写入。跑 testDisk。有没有办法恢复到以前的超级块,这样我就可以恢复我的数据?
我在加载 Ubuntu 17.04 时遇到问题。这是我启动 Windows 后第二次发生这种情况。我第一次重新安装了 Ubuntu。我不擅长这个问题,所以我希望获得诊断和解决此问题的完整步骤列表。

作为一种解决方法 e2fsck -b <Magic number> <device>已被使用。
这是输出fdisk -l,对我来说似乎很好:
Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
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: F3EBBDD3-ABDB-4AD4-BBFB-9F97E38D2A2B
Device Start End Sectors Size Type
/dev/sda1 2048 2050047 2048000 1000M Windows recovery environment
/dev/sda2 2050048 2582527 532480 260M EFI System
/dev/sda3 2582528 …Run Code Online (Sandbox Code Playgroud) 具有 2 500 GB 硬盘的 BTRFS RAID1 阵列,无错误。这是根文件系统,因此每个驱动器上有 3 个分区:1 = /boot (ext4)、2 = / (btrfs)、3 (swap)
/boot 是 ext4,因为如果 /boot 是 btrfs 文件系统(安装了新内核,但 grub 配置未更新),则升级内核并不总是有效。
现在,该镜像已移至较小的驱动器,新驱动器为 120 GB,因此必须调整 btrfs 文件系统的大小。例如,可以使用 GParted 来调整两个 btrfs 分区的大小。调整大小后,可以将带有分区信息的 MBR 从旧的 500 GB 驱动器复制到新的 120 GB 驱动器 ( dd if=/dev/sda of=/dev/sdb bs=512 count=1),以及 btrfs 分区 ( dd if=/dev/sda2 of=/dev/sdb2)。(忽略交换分区,必须将其移动到 120 GB 以内。)
尽管系统启动并且新的 120 GB 驱动器没有问题,但会记录一条错误消息 (dmesg):
BTRFS:无法获取 bytenr 274877906944 的超级缓冲区头
并且擦洗发现“超级”错误(但没有数据错误):
“错误详细信息:超级=1”
此错误是否存在数据损坏的风险?
如何解决这个问题?
由于 274877906944 是 256 GB,旧的 btrfs 分区 …
我在尝试执行 mount -a 时收到了一个事件。我收到以下错误。那么如何解决这个问题呢?
挂载:/dev/vgname/lvname:无法读取超级块
我在互联网上找到了大量关于此错误的帖子:
wrong fs type, bad option, bad superblock on /dev/xxx,missing codepage or helper program, or other error
但我从未发现过在启动时“有时”出现错误的情况。
每当我启动我的 Linux 机器时,我有时会收到提到的错误,有时它工作正常。这大约是 50/50 的机会,但我还没有以任何方式看到任何模式。
如果出现错误,我只需重新启动并重试;这半年来我一直在做这个事情。3 靴子通常是最大的n。很多时候我必须启动才能到达桌面。
如果我尝试在紧急 shell 中安装驱动器,则不会弹出任何错误,并且我可以毫无问题地向驱动器写入/读取。
我想知道这是否是一个可修复的问题,或者我是否应该寄回 NVME 驱动器(它仍然有保修)。
Kernel: 6.2.8-alderlake-xanmod1-1 (Xanmod + GCC optimizations)
OS: ArchLinux
Drive: Kingston KC3000 PCIe 4.0, 1TB, bought separately from the laptop
Laptop: Rog Zephyrus m16
Run Code Online (Sandbox Code Playgroud)
编辑:我有两个带有 Windows/Linux 双启动的驱动器。Linux 尝试引导 /dev/nvme1n1p1,但我刚刚发现从紧急 shell 中我只能挂载 /dev/nvme0n1p1,这实际上是应该引导的 linux 根目录。每当我启动到桌面时, fdisk -l 都会显示 linux 驱动器被正确标记为 nvme1n1p1,因此我认为系统只有在 linux 驱动器被分配为“nvme1”并且 Windows 驱动器被分配时才能启动被分配为“nvme0”。我已使用 EFISTUB 手动指定内核命令行,如下所示:
root=/dev/nvme1n1p1 resume=/dev/nvme1n1p2 rw quiet …