どうすればいいですか: dd if=coolstuff.iso of=(ssh kev@mypi)

どうすればいいですか: dd if=coolstuff.iso of=(ssh kev@mypi)

ノートブックのカードリーダーが機能しません。 dd(または他のツール)を使用してイメージをネットワークディスクに書き込むことはできますか?

あるRaspberry Piディストリビューションを別のディストリビューションに置き換えようとしています。 SDカードの空き容量は6GBですが、2GBのみ使用されます。

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使用する方が良いでしょう。scprsync

答え2

RaspberryにSSHサーバーがあり、RaspberryのSDカードがに表示されていると仮定すると、/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クライアントの標準入力はから出力され、リモートデバイスの標準入力はddSSHddサーバーから来るため、SSHクライアントとサーバーのペアは暗号化されたデータ転送として機能し、標準出力を接続します。ddリモコンの標準入力のローカルですdd。 (これは実際にSSHがリモートログインを実行する方法です。標準入力はキーボードから出て、リモートプロセスは標準入力を受け取るUNIXシェルです。
  4. SSH に渡すオプションは、MACs接続がメッセージ整合性ダイジェストに RIPEMD160 アルゴリズムを使用するように強制します。これにより、送信エラーや意図的な変調を検出するために送信されたデータが保護されます。ディスクイメージを転送するために電波を使用することを考慮すると、これは重要です。 Raspberryがデフォルトで弱い暗号化を実行している場合は、暗号化を追加または強制o Ciphers=aes256-cbcすることができます。o Ciphers=aes256-ctr
  5. -l私はその構文を使用する傾向があるので、ログインに使用したユーザーを表示します。

答え3

次回の再起動時に新しいルートイメージを使用するように実行されているシステムを更新することは、ネットワーク経由で直接コピーするよりも少し複雑です。ルートイメージが開いていると仮定すると/dev/mmcblk0p5(上記の出力と説明に示すようにparted -l)、OPは問題なくイメージのルートパーティションをコピーできるはずです/dev/mmcblk0p3(もちろん、必要なデータがないと仮定してください)。このパーティションに保管してください。)以下の指示に従うことができます。ただし、推奨事項を確認し、コマンドを適切に変更してください。次のコマンドを盲目的にコピーすることは、システムをクリーンアップする良い方法です。

  1. 新しいイメージのルートパーティションがパーティション5であると仮定しますが、そうでない可能性があります。pi.img使用したイメージのパーティションテーブルを印刷できますparted pi.image print。わからない場合は、質問に出力を追加してください。

  2. 完全なディスクイメージ(独自のパーティションテーブルとブートパーティションも含む)ではなく、ルートパーティションのイメージのみをコピーしたいので、それをイメージの残りの部分から分離する必要があります。これを行う1つの方法(Linuxシステムでは)は、次の方法を使用することですkpartx

    sudo kpartx -av pi.img
    

    他のループデバイスを使用しない場合は使用されますが、loop0出力を確認し、それに応じて追加のコマンドを変更します。

  3. 次の手順を実行して、ターゲットパーティションがRaspberry Piにマウントされていないことを確認してください。

    sudo umount /dev/mmcblk0p3
    
  4. 次の手順では、SSHを介してデータを転送できる必要があります。そしてルートアクセス権があります。これを行うにはいくつかの方法がありますが、最も簡単な方法はルートログインを有効にすることです。これは一般的にはお勧めできませんが、新しいシステムイメージをアップロードしたいので問題ありません。 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/hostnameRaspberry Pi(mypiOPであるように見える)またはRaspberry PiのIPアドレスにある任意の項目です。を使用していない場合loop0でも、それに応じてこの設定を変更する必要があります。

  6. 次に、Raspberry Piのルートパーティションを変更します。私が知っている限り(テスト用のRaspberry Piはありません)/boot/cmdline.txt変更root=/dev/mmcblk0p5root=/dev/mmcblk0p3

  7. 次の手順を実行して、デバイスとコピーされたソースシステムのデバイスを削除できますloopmapper

    sudo kpartx -d pi.img
    
  8. 今Raspberry Piを再起動すると、新しい画像が利用可能になります!

答え4

USB ARMイメージを使用してPiを起動する場合は、ネットワークに接続するだけで十分なストレージ容量があります。私は専門家ではないので、ここにコメントを残します。エラーがある場合は、専門家に修正を依頼してください。

関連情報