AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 682822
Accepted
Rho Phi
Rho Phi
Asked: 2021-12-18 00:14:01 +0800 CST2021-12-18 00:14:01 +0800 CST 2021-12-18 00:14:01 +0800 CST

为什么 dd 给我的 SD 卡与其来源不同?

  • 772

我有一个 32 Gb SD 卡,上面有我的操作系统(Raspberry Pi OS Buster),我希望使用 standard 进行备份dd,使用sudo dd if=/dev/sdb of=/mnt/toshiba2tb/pi20211217.img bs=1M

源 SD 卡在lsblk --fs

db
├─sdb1      vfat   RECOVERY 796F-5014
├─sdb2
├─sdb5      ext4   SETTINGS 3b129a7c-44fe-4062-8819-2be9ec66edea
├─sdb6      vfat   boot     3830-AECC
└─sdb7      ext4   root     92847503-3b1f-4e22-9fa0-f6794b8fed0c

映像完成后,我将其复制dd到(全新的)新卡上sudo dd if=/mnt/toshiba2tb/pi20211217.img of=/dev/sdb bs=1M,并获得了一个不同的分区表,它甚至无法启动 RPi

sdb
├─sdb1      vfat   RECOVERY 796F-5014
└─sdb2

fdisk确认和报告和荒谬2T的划分......这是怎么回事?

$ sudo fdisk -l /dev/sdb
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Invalid flag 0xffff of EBR (for partition 5) will be corrected by w(rite).
Disk /dev/sdb: 29.7 GiB, 31914983424 bytes, 62333952 sectors
Disk model: LRWM04U
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000edc50

Device     Boot      Start        End    Sectors  Size Id Type
/dev/sdb1             8192    3781250    3773059  1.8G  e W95 FAT16 (LBA)
/dev/sdb2          3781251   60751871   56970621 27.2G  5 Extended
/dev/sdb5       4298748546 8593715840 4294967295    2T ff BBT

更多信息来自sudo /sbin/fdisk -l /mnt/toshiba2tb/pi20211217.img

$ sudo /sbin/fdisk -l /mnt/toshiba2tb/pi20211217.img
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Invalid flag 0xffff of EBR (for partition 5) will be corrected by w(rite).
Disk /mnt/toshiba2tb/pi20211217.img: 29 GiB, 31104958464 bytes, 60751872 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000edc50

Device                          Boot      Start        End    Sectors  Size Id Type
/mnt/toshiba2tb/pi20211217.img1            8192    3781250    3773059  1.8G  e W95 FAT16 (LBA)
/mnt/toshiba2tb/pi20211217.img2         3781251   60751871   56970621 27.2G  5 Extended
/mnt/toshiba2tb/pi20211217.img5      4298748546 8593715840 4294967295    2T ff BBT

我还尝试dd_rescue了一个新的图像文件,它似乎直到最后都没有错误。

$ sudo dd_rescue /dev/sdb /mnt/toshiba2tb/pi20211217.rescue.img
dd_rescue: (info) expect to copy 30375936kB from /dev/sdb
dd_rescue: (info): ipos:  30375936.0k, opos:  30375936.0k, xferd:  30375936.0k
                   errs:      0, errxfer:         0.0k, succxfer:  30375936.0k
             +curr.rate:    10374kB/s, avg.rate:    20375kB/s, avg.load: 21.2%
             >----------------------------------------.<  99%  ETA:  0:00:00
dd_rescue: (info): read /dev/sdb (30375936.0k): EOF
dd_rescue: (info): Summary for /dev/sdb -> /mnt/toshiba2tb/pi20211217.rescue.img:
dd_rescue: (info): ipos:  30375936.0k, opos:  30375936.0k, xferd:  30375936.0k
                   errs:      0, errxfer:         0.0k, succxfer:  30375936.0k
             +curr.rate:        0kB/s, avg.rate:    20312kB/s, avg.load: 21.1%
             >----------------------------------------.<  99%  ETA:  0:00:00

不幸的是,获得的文件仍然显示出损坏的迹象

$ sudo /sbin/fdisk -l /mnt/toshiba2tb/pi20211217.rescue.img
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Invalid flag 0xffff of EBR (for partition 5) will be corrected by w(rite).
Disk /mnt/toshiba2tb/pi20211217.rescue.img: 29 GiB, 31104958464 bytes, 60751872 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000edc50

Device                                 Boot      Start        End    Sectors  Size Id Type
/mnt/toshiba2tb/pi20211217.rescue.img1            8192    3781250    3773059  1.8G  e W95 FAT16 (LBA)
/mnt/toshiba2tb/pi20211217.rescue.img2         3781251   60751871   56970621 27.2G  5 Extended
/mnt/toshiba2tb/pi20211217.rescue.img5      4298748546 8593715840 4294967295    2T ff BBT

只是为了检查一下,我确实刷新了此映像,它与所有其他映像具有相同的问题,即引导找不到“设置”分区并永远挂在那里...

假设它可能只是一个分区表问题,我已将原始 SD 的分区表转储到使用sfdisk -d /dev/sdb > pi.partitiontable. 它打印出一些明智的东西

$ cat  pi.partitiontable
label: dos
label-id: 0x000edc50
device: /dev/sdb
unit: sectors

/dev/sdb1 : start=        8192, size=     3773059, type=e
/dev/sdb2 : start=     3781251, size=    56970621, type=5
/dev/sdb5 : start=     3784704, size=       65534, type=83
/dev/sdb6 : start=     3850240, size=      147454, type=c
/dev/sdb7 : start=     3997696, size=    56754176, type=83

然后我将此分区表复制到新复制的 SD 卡 $ sudo sfdisk /dev/sdb < pi.partitiontable上

Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Invalid flag 0xffff of EBR (for partition 5) will be corrected by w(rite).
Checking that no-one is using this disk right now ... OK

Disk /dev/sdb: 29.7 GiB, 31914983424 bytes, 62333952 sectors
Disk model: LRWM04U
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000edc50

Old situation:

Device     Boot      Start        End    Sectors  Size Id Type
/dev/sdb1             8192    3781250    3773059  1.8G  e W95 FAT16 (LBA)
/dev/sdb2          3781251   60751871   56970621 27.2G  5 Extended
/dev/sdb5       4298748546 8593715840 4294967295    2T ff BBT

>>> Script header accepted.                                                                                                                                                                            >>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Created a new DOS disklabel with disk identifier 0x000edc50.
/dev/sdb1: Created a new partition 1 of type 'W95 FAT16 (LBA)' and of size 1.8 GiB.
Partition #1 contains a vfat signature.
/dev/sdb2: Created a new partition 2 of type 'Extended' and of size 27.2 GiB.
/dev/sdb3: Created a new partition 5 of type 'Linux' and of size 32 MiB.
/dev/sdb6: Sector 3850240 is already allocated.
Created a new partition 6 of type 'W95 FAT32 (LBA)' and of size 72 MiB.
/dev/sdb7: Sector 3997696 is already allocated.
Created a new partition 7 of type 'Linux' and of size 27.1 GiB.
/dev/sdb8: Done.

New situation:
Disklabel type: dos
Disk identifier: 0x000edc50

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sdb1          8192  3781250  3773059  1.8G  e W95 FAT16 (LBA)
/dev/sdb2       3781251 60751871 56970621 27.2G  5 Extended
/dev/sdb5       3784704  3850237    65534   32M 83 Linux
/dev/sdb6       3852286  3999739   147454   72M  c W95 FAT32 (LBA)
/dev/sdb7       4001788 60751871 56750084 27.1G 83 Linux

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

使用此卡,启动会抱怨设置分区已损坏,因此要求重新安装操作系统。这与之前的错误不同,可能是由于(我猜)我从旧卡中取出并复制到新卡上的分区表存在一些错位或轻微不兼容。我仍然想知道这种方法是否可行,也许需要对分区表进行一些调整......

dd sd-card
  • 3 3 个回答
  • 185 Views

3 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2021-12-18T04:22:55+08:002021-12-18T04:22:55+08:00

    图像上的fdisk -l输出表明您的图像不好;您可以使用任何读卡器将其写入任意数量的 SD 卡,但结果总是很糟糕。

    您需要重新读取图像,最好使用能够明确告诉您何时无法正确读取卡片的工具;例如

    ddrescue /dev/sdb /mnt/toshiba2tb/pi20211217.img
    
    • 1
  2. telcoM
    2021-12-18T02:26:37+08:002021-12-18T02:26:37+08:00

    上的扇区数sdb5为 4294967295 = 0xffffffff,分区类型 ID 也是 0xff。还有Invalid flag 0xffff of EBR (for partition 5) will be corrected by w(rite)错误信息。

    这看起来像是 SD 卡上的写入错误:不知何故,本应存在的实际数据字节已被全 1 字节替换。

    第二张卡的声称尺寸为:

    Disk /dev/sdb: 29.7 GiB, 31914983424 bytes, 62333952 sectors
    

    您可能需要使用Fight Flash Fraud 项目的 f3 工具来验证第二张卡的实际容量。

    如果您的卡是假的,则错误可能是由于扩展分区表位于卡的闪存芯片的实际容量之外,位于实际上未被任何闪存芯片覆盖的空地址空间中,因此实际上对存储没有用处任何数据。尝试读取此类地址空间通常只产生全一字节。写入此类地址空间的任何数据都会立即丢失。

    假存储卡通常声称拥有比实际更多的存储容量。卡最开始的存储工作正常,看起来卡可以用于临时测试。但是,一旦您尝试使用更多容量,该卡将开始产生错误,或者更阴险地忽略错误并返回无意义的数据。

    在您的情况下,块#3781251(即距卡开头约 1.9 GB)的扩展分区表已损坏的事实可能意味着假卡实际上具有不到 2 GiB 的实际存储容量,尽管它声称有 29.7 GiB。

    • 0
  3. sudodus
    2021-12-18T04:21:32+08:002021-12-18T04:21:32+08:00

    例如,具有指定标称尺寸的 SD 卡和 USB 随身碟

    32 GB = 10^9 * 32 / 2^30 GiB approx= 29.8 GiB
    

    在标称尺寸附近有各种尺寸。一些驱动器稍大一些,而一些驱动器则稍小一些(是的,尺寸过小,但还不算太小)。

    不幸的是,也存在欺诈,驱动器比标称尺寸小得多。

    • 克隆时的一个严重问题是您无法将具有使用整个驱动器的分区的驱动器克隆到稍小的驱动器。目标驱动器在字节级别上必须至少具有相同的大小,例如通过

      lsblk -b
      
    • 当驱动器具有完全相同的大小时,克隆很简单。

    • 如果有 MSDOS 分区表(有时称为 MBR),则克隆到更大的驱动器很简单。在这种情况下,您可以增加“最后一个”分区的大小以使用未分配的驱动器空间。

    • 克隆到更大的驱动器时,如果有 GUID 分区表 (GPT),则需要额外的操作。驱动器尾部应该有一个备份分区表,可以用gdisk. 这可以通过 shellscript 自动化gpt-fix。克隆图像文件时,此修复程序内置于mkusb中。在此修复后,您可以增加“最后一个”分区的大小以使用未分配的驱动器空间。

    因此,在放弃目标驱动器之前,请检查大小,如果可能,请获取不小于原始驱动器的目标驱动器。另一种方法是缩小原始驱动器上的最后一个分区,使其适合目标驱动器的大小。您可以gparted用于此目的。

    如果是 GPT,请修复备份分区表。

    • 0

相关问题

  • 从大文件末尾删除空字节

  • dd 命令写入 /dev/sdc 改变了磁盘的大小

  • 确定两个 iso 图像是否相等

  • Steam 库文件夹必须位于可执行文件系统上

  • 如何在 macOS High Sierra 上加速 dd?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve