dd 在第一次尝试时总是无法写入一个分区;第二次成功

tsb*_*lan 7 linux sd-card dd raspberry-pi

对于机器人项目,我组装了一个 make 目标,它使用dd(实际上dcfldd)将 Raspbian Jessie 图像写入 SD 卡。这样,我可以放心,我的环境可以随时从头开始重现。

制作目标只是

flash:
    sudo dcfldd bs=4M if=$(IMGPATH) of=$(SDX)
    sync
Run Code Online (Sandbox Code Playgroud)

$(SDX)/dev/sdc在哪里,并且意味着前面有一个脚本,该脚本将映像挂载到 /mnt/img,进行一些修改、调用sync,然后卸载它。

这个过程似乎工作正常,除了我总是需要调用 make 目标两次——第一次,如果我正确弹出整个读卡器然后重新插入,图像中的两个分区之一无法安装,而且,如果我尝试从中启动 Raspberry Pi,我会遇到内核恐慌。

在尝试闪存卡(使用 Make 目标或在终端中手动),使用 Ubuntu 的“弹出父驱动器”启动器上下文菜单选项弹出,移除并重新插入读卡器后,引导分区在 Nautilus 中打开,但我得到了下面的对话框,没有主分区。

安装错误

dmesg 的最后一百行左右在这里。可能相关的是

[100640.545190] FAT-fs (sdb1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
Run Code Online (Sandbox Code Playgroud)

[101082.691558] EXT4-fs (sdb2): bad geometry: block count 3894272 exceeds size of device (964096 blocks)
Run Code Online (Sandbox Code Playgroud)

正如第一个建议的那样,我做了sudo fsck /dev/sdb,并得到以下内容。

fsck from util-linux 2.20.1
e2fsck 1.42.9 (4-Feb-2014)
fsck.ext2: No medium found while trying to open /dev/sdb

The superblock could not be read or does not describe a valid ext2/ext3/ext4
filesystem.  If the device is valid and it really contains an ext2/ext3/ext4
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>
or
    e2fsck -b 32768 <device>
Run Code Online (Sandbox Code Playgroud)

如果我做

sudo dcfldd bs=4M if=/dev/sdb of=/tmp/from-sd-card.img count=1024
cmp /tmp/from-sd-card.img /home/tsbertalan/workspace/gunnar/2016-05-27-raspbian-jessie.img
Run Code Online (Sandbox Code Playgroud)

我得到

/tmp/from-sd-card.img /home/tsbertalan/workspace/gunnar/2016-05-27-raspbian-jessie.img differ: char 4194342, line 1
Run Code Online (Sandbox Code Playgroud)

如果我这样做

cmp -b --verbose /tmp/from-sd-card.img /home/tsbertalan/workspace/gunnar/2016-05-27-raspbian-jessie.img
Run Code Online (Sandbox Code Playgroud)

我得到

4194342   1 ^A     0 ^@
70255618  72 :    257 M-/
70255619  35 ^]     3 ^C
70255622 375 M-}  266 M-6
70255623 166 v     16 ^N
70255625  34 ^\   114 L
70255626 345 M-e  274 M-<
70255627   4 ^D     0 ^@
70255629  77 ?     14 ^L
70255630 371 M-y  176 ~
70255631 144 d      1 ^A
70255633 326 M-V  200 M-^@
70255634 256 M-.  252 M-*
70255635  32 ^Z     1 ^A
70255661 373 M-{  114 L
70255662 123 S    124 T
70255665 105 E    120 P
70255666 132 Z    124 T
70255669  24 ^T     2 ^B
70255754   0 ^@   155 m
70255823 352 M-j  353 M-k
70255993 125 U    201 M-^A
70255994 323 M-S  343 M-c
70255995 257 M-/   71 9
1815085083  72 :      0 ^@
1815085084 103 C    132 Z
Run Code Online (Sandbox Code Playgroud)

4194342似乎是一致的。

如果我将正确闪存的卡插入 RPI,启动它然后关闭它,我只能重现该问题。在此之后,需要两次尝试才能正确刷卡。 我现在强烈怀疑Raspbian 在第一次启动时执行自动调整大小 可能是这个问题的一部分。如果这个问题更适合 Raspberry Pi stackexchange 站点,它可以移到那里。

这里发生了什么?有没有其他方法我应该写这个图像,以便它在第一次尝试时起作用?我不想不必要地烧毁我有限的 SD 卡写入周期。

我只有一个读卡器来测试这个,但我已经尝试过 16GB 三星 EVO micro SDHC、8GB SanDisk Ultra micro SDHC 和 32GB SanDisk Ultra micro SDHC,结果都一样。

Ale*_*lex 0

[101082.691558] EXT4-fs (sdb2):几何结构错误:块计数 3894272 超出设备大小(964096 块)

文件系统标头已损坏。一定要与自动调整大小工具的维护者一起打开一个错误。