Для проекту з робототехніки я зібрав ціль make, яка використовує dd
(власне dcfldd
) для написання зображення Raspbian Jessie на SD-карту. Таким чином, я можу бути впевнений, що моє середовище відтворюється з нуля в будь-який час, коли я цього хочу.
Ціль зробити просто
flash:
sudo dcfldd bs=4M if=$(IMGPATH) of=$(SDX)
sync
де $(SDX)
є / dev / sdc, і мається на увазі сценарій, який монтує зображення в / mnt / img, вносить деякі модифікації, дзвінки sync
та відключає його.
Процес, здається, працює нормально, за винятком того, що мені завжди потрібно викликати ціль make два рази - перший раз, якщо я належним чином витягнув весь зчитувач карт, а потім знову вставити його, один із двох розділів із зображення не вдасться встановити, і, якщо я спробую завантажувати з нього Raspberry Pi, у мене виникає паніка ядра.
Після спроби флеш-карти (із вказівкою Зробити ціль або вручну в терміналі), викидання за допомогою параметра контекстного меню запуску Ubuntu "Витягнути батьківський диск", видалення та повторне вставлення зчитувача, завантажувальний розділ відкриється в Nautilus, але я отримую наступне діалогове вікно і жодного основного розділу.
Останні сто або близько лінії dmesg знаходяться тут . Напевно, відповідні є
[100640.545190] FAT-fs (sdb1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
і
[101082.691558] EXT4-fs (sdb2): bad geometry: block count 3894272 exceeds size of device (964096 blocks)
Як перший підказує, я роблю 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>
Якщо я це роблю
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
я отримав
/tmp/from-sd-card.img /home/tsbertalan/workspace/gunnar/2016-05-27-raspbian-jessie.img differ: char 4194342, line 1
і якщо я це роблю
cmp -b --verbose /tmp/from-sd-card.img /home/tsbertalan/workspace/gunnar/2016-05-27-raspbian-jessie.img
я отримав
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
Це 4194342
здається незмінним.
Я можу відтворити проблему лише в тому випадку, якщо я вставив належним чином прошиті карти в RPI, завантажте її та закрийте. Після цього потрібні дві спроби належним чином спалахнути карту. Зараз я сильно підозрюю, що автоматичний розмір, який Raspbian виконує під час першого завантаження, може бути частиною цієї проблеми. Якщо це питання буде краще підходити для сайту stackxchange Raspberry Pi, його можна буде перенести туди.
Що тут відбувається? Чи є ще якийсь спосіб, як я повинен написати це зображення, щоб воно працювало з першої спроби? Я не хочу записувати свої обмежені цикли запису на SD-карту.
Я маю лише один зчитувач карт, щоб протестувати це, але я спробував як з 16 ГБ Samsung EVO micro SDHC, так і з 8 ГБ SanDisk Ultra micro SDHC та 32 ГБ SanDisk Ultra micro SDHC, з однаковими результатами на всіх.
sudo parted --script $(SDX) mkpart primary ext4 5G
перед тим, як запустити спалах. Неефективний. Я пограю з цим більше пізніше, якщо матиму час; я зараз думаю, що мені доведеться задовольнятися спалахом двічі кожного разу.
make
)? Чи використовуєте ви GPT з карткою? "якщо я належним чином витягнув весь зчитувач карт, а потім повторно вставити його, один із двох розділів із зображення не вдасться встановити". Не вдалося встановити яким чином? Ви пробували з іншим читачем карт? чи інша карта? Ви спробували прочитати назад із картки та порівняти їх із початковим зображенням (на зразок cmp
)? Якщо так, чи завжди різниця є в одному байті?