.png)
Кардридер на моем ноутбуке не хочет работать. Можно ли использовать dd (или какой-либо другой инструмент) для записи образа на сетевой диск?
Я пытаюсь заменить один дистрибутив raspberry pi на другой. На SD-карте свободно 6 ГБ, а используется только 2 ГБ.
с SD-карты
$ sudo parted -l
Model: SD SU08G (sd/mmc)
Disk /dev/mmcblk0: 7948MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 95.4MB 94.4MB primary fat16 lba
2 95.4MB 1878MB 1783MB extended
5 96.5MB 1878MB 1782MB logical ext4
3 1878MB 7948MB 6070MB primary ext4
ИПожалуйста, прежде чем критиковать, почему я хочу это сделать, ответь на вопрос... а потом скажи мне, какой я глупый.
решение1
Вы можете подключиться через SSH:
dd if=something | ssh host dd of=something
Но у вас должна быть более веская причина для использования, dd
чем простая операция копирования файлов, где вам лучше использовать scp
, rsync
, и тому подобное.
решение2
Предположим, что у вас есть SSH-сервер на Raspberry и SD-карта на Raspberry отображается на /dev/sda
, вы можете сделать что-то вроде этого:
dd if=SDcardimage.img | ssh -o MACs=hmac-ripemd160 -l raspberry-pi-user <your Raspberry's IP address> 'dd of=/dev/sda'
Я объясняю:
dd
выводит данные на стандартный вывод, еслиof
выходной файл не указан, и читает данные со стандартного ввода, если входной файл не указанif
.- Когда вы напрямую передаете команду в SSH, ваш клиент пересылает свой стандартный ввод на сервер, а затем сервер передает эти данные на стандартный ввод процесса, указанного в команде, отправленной на сервер.
- Поскольку в этом случае стандартный ввод клиента SSH поступает из
dd
, а стандартный ввод удаленного устройстваdd
поступает с сервера SSH, это приведет к тому, что пара клиент-сервер SSH будет действовать как зашифрованный транспорт данных, соединяя стандартный вывод с вашего локального компьютераdd
со стандартным вводом удаленного устройстваdd
. (Фактически, именно так SSH выполняет удаленный вход в систему, при этом стандартный ввод поступает с вашей клавиатуры, а удаленный процесс, получающий стандартный ввод, является оболочкой UNIX). - Параметр
MACs
, который я передаю в SSH, заставляет соединение использовать алгоритм RIPEMD160 в качестве дайджеста целостности сообщения. Это защищает транспортируемые данные, так что любая ошибка передачи или преднамеренное вмешательство будут обнаружены. Это важно здесь, учитывая, что вы передаете образ диска с помощью радиоволн. Вы можете захотеть добавитьo Ciphers=aes256-cbc
илиo Ciphers=aes256-ctr
принудительно включить шифрование на тот случай, если Raspberry по умолчанию использует более слабое шифрование. -l
указывает пользователя, которого вы используете для входа, просто потому, что я склонен использовать этот синтаксис.
решение3
Обновление работающей системы так, чтобы новый образ root использовался при следующей перезагрузке, немного сложнее, чем простое копирование по сети. Предполагая, что образ root включен /dev/mmcblk0p5
(как указано в выводе parted -l
и комментариях выше), OP должен иметь возможность скопировать раздел root из образа в /dev/mmcblk0p3
без каких-либо проблем (конечно, при условии, что у вас нет никаких данных, которые вы хотите сохранить на этом разделе). Вы можете следовать инструкциям ниже.Однако обязательно выполните предлагаемые проверки и измените команды соответствующим образом. Слепое копирование команд ниже — это хороший способ засорить вашу систему.
Я предположу, что корневой раздел на новом образе — это раздел 5, однако это может быть не так. Вы можете распечатать таблицу разделов образа, вызванного
pi.img
с помощьюparted pi.image print
. Если вы не уверены, пожалуйста, добавьте вывод к вашему вопросу.Поскольку мы хотим скопировать только образ корневого раздела, а не весь образ диска (который также будет содержать собственную таблицу разделов и загрузочный раздел), вам необходимо отделить его от остальной части образа. Один из способов сделать это (в системе Linux) — использовать
kpartx
:sudo kpartx -av pi.img
Если другие устройства контура не используются, будет использоваться
loop0
, однако, пожалуйста, проверьте вывод и измените дальнейшие команды соответствующим образом.Убедитесь, что целевой раздел не смонтирован на Raspberry Pi, выполнив следующие действия:
sudo umount /dev/mmcblk0p3
Для следующего шага вам необходимо иметь возможность передавать данные через SSH.ииметь root-доступ. Есть несколько способов сделать это, но я думаю, что самый простой — просто включить root-вход. Обычно это не рекомендуется, но поскольку вы хотите загрузить новый образ системы, я не думаю, что это будет проблемой. На Raspberry Pi сделайте следующее:
sudo passwd root
Затем скопируйте изображение на Raspberry Pi (используяПредложение RAAK по целостности данных):
sudo dd if=/dev/mapper/loop0p5 | ssh -o MACs=hmac-ripemd160 root@host dd of=/dev/mmcblk0p3
host
может быть тем, что есть/etc/hostname
на Raspberry Pi (по-видимому,mypi
для OP) или IP-адресом Raspberry Pi. Также не забудьте изменить это соответствующим образом, если вы не используетеloop0
.Затем измените корневой раздел для Raspberry Pi, насколько я могу судить (у меня нет Raspberry Pi для тестирования), вам нужно изменить
/boot/cmdline.txt
. Вам нужно изменить часть, которая говоритroot=/dev/mmcblk0p5
наroot=/dev/mmcblk0p3
.Вы можете удалить устройства
loop
иmapper
в системе, из которой вы скопировали данные, выполнив следующие действия:sudo kpartx -d pi.img
Теперь перезагрузите Raspberry Pi, и вы сможете использовать новый образ!
решение4
Что если вы загрузите Pi с помощью образа USB ARM, подключитесь к сети и таким образом хранилище будет достаточно укрощено. Я не профи, просто плююсь здесь. Эксперты, пожалуйста, поправьте, если я не прав.