как мне это сделать: dd if=coolstuff.iso of=(ssh kev@mypi )

как мне это сделать: dd if=coolstuff.iso of=(ssh kev@mypi )

Кардридер на моем ноутбуке не хочет работать. Можно ли использовать 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'

Я объясняю:

  1. ddвыводит данные на стандартный вывод, если ofвыходной файл не указан, и читает данные со стандартного ввода, если входной файл не указан if.
  2. Когда вы напрямую передаете команду в SSH, ваш клиент пересылает свой стандартный ввод на сервер, а затем сервер передает эти данные на стандартный ввод процесса, указанного в команде, отправленной на сервер.
  3. Поскольку в этом случае стандартный ввод клиента SSH поступает из dd, а стандартный ввод удаленного устройства ddпоступает с сервера SSH, это приведет к тому, что пара клиент-сервер SSH будет действовать как зашифрованный транспорт данных, соединяя стандартный вывод с вашего локального компьютера ddсо стандартным вводом удаленного устройства dd. (Фактически, именно так SSH выполняет удаленный вход в систему, при этом стандартный ввод поступает с вашей клавиатуры, а удаленный процесс, получающий стандартный ввод, является оболочкой UNIX).
  4. Параметр MACs, который я передаю в SSH, заставляет соединение использовать алгоритм RIPEMD160 в качестве дайджеста целостности сообщения. Это защищает транспортируемые данные, так что любая ошибка передачи или преднамеренное вмешательство будут обнаружены. Это важно здесь, учитывая, что вы передаете образ диска с помощью радиоволн. Вы можете захотеть добавить o Ciphers=aes256-cbcили o Ciphers=aes256-ctrпринудительно включить шифрование на тот случай, если Raspberry по умолчанию использует более слабое шифрование.
  5. -lуказывает пользователя, которого вы используете для входа, просто потому, что я склонен использовать этот синтаксис.

решение3

Обновление работающей системы так, чтобы новый образ root использовался при следующей перезагрузке, немного сложнее, чем простое копирование по сети. Предполагая, что образ root включен /dev/mmcblk0p5(как указано в выводе parted -lи комментариях выше), OP должен иметь возможность скопировать раздел root из образа в /dev/mmcblk0p3без каких-либо проблем (конечно, при условии, что у вас нет никаких данных, которые вы хотите сохранить на этом разделе). Вы можете следовать инструкциям ниже.Однако обязательно выполните предлагаемые проверки и измените команды соответствующим образом. Слепое копирование команд ниже — это хороший способ засорить вашу систему.

  1. Я предположу, что корневой раздел на новом образе — это раздел 5, однако это может быть не так. Вы можете распечатать таблицу разделов образа, вызванного pi.imgс помощью parted pi.image print. Если вы не уверены, пожалуйста, добавьте вывод к вашему вопросу.

  2. Поскольку мы хотим скопировать только образ корневого раздела, а не весь образ диска (который также будет содержать собственную таблицу разделов и загрузочный раздел), вам необходимо отделить его от остальной части образа. Один из способов сделать это (в системе Linux) — использовать kpartx:

    sudo kpartx -av pi.img
    

    Если другие устройства контура не используются, будет использоваться loop0, однако, пожалуйста, проверьте вывод и измените дальнейшие команды соответствующим образом.

  3. Убедитесь, что целевой раздел не смонтирован на Raspberry Pi, выполнив следующие действия:

    sudo umount /dev/mmcblk0p3
    
  4. Для следующего шага вам необходимо иметь возможность передавать данные через SSH.ииметь root-доступ. Есть несколько способов сделать это, но я думаю, что самый простой — просто включить root-вход. Обычно это не рекомендуется, но поскольку вы хотите загрузить новый образ системы, я не думаю, что это будет проблемой. На Raspberry Pi сделайте следующее:

    sudo passwd root
    
  5. Затем скопируйте изображение на 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.

  6. Затем измените корневой раздел для Raspberry Pi, насколько я могу судить (у меня нет Raspberry Pi для тестирования), вам нужно изменить /boot/cmdline.txt. Вам нужно изменить часть, которая говорит root=/dev/mmcblk0p5на root=/dev/mmcblk0p3.

  7. Вы можете удалить устройства loopи mapperв системе, из которой вы скопировали данные, выполнив следующие действия:

    sudo kpartx -d pi.img
    
  8. Теперь перезагрузите Raspberry Pi, и вы сможете использовать новый образ!

решение4

Что если вы загрузите Pi с помощью образа USB ARM, подключитесь к сети и таким образом хранилище будет достаточно укрощено. Я не профи, просто плююсь здесь. Эксперты, пожалуйста, поправьте, если я не прав.

Связанный контент