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

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

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

私は、ラズベリーパイのディストリビューションを別のものに置き換えようとしています。SD カードには 6 GB の空き容量があり、2 GB しか使用していません。

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

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. ddof出力ファイルが指定されていない場合は標準出力に出力し、入力ファイルが指定されていない場合は標準入力から読み取りますif
  2. SSH にコマンドを直接渡すと、クライアントは標準入力をサーバーに転送し、サーバーはそのデータを、サーバーに送信されたコマンドで指定されたプロセスの標準入力に渡します。
  3. この場合、SSH クライアントの標準入力は から取得されdd、リモートの標準入力はddSSH サーバーから取得されるため、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/mmcblk0p5を に変更しますroot=/dev/mmcblk0p3

  7. 次のコマンドを実行すると、コピー元のシステム上のloopおよびデバイスを削除できます。mapper

    sudo kpartx -d pi.img
    
  8. Raspberry Pi を再起動すると、新しいイメージが使用されるはずです。

答え4

USB ARM イメージを使用して Pi を起動し、ネットに接続すると、ストレージは十分に制御されます。私はプロではないので、ここではただの思いつきです。専門家の皆さん、私が間違っている場合は訂正してください。

関連情報