我该怎么做: dd if=coolstuff.iso of=(ssh kev@mypi )

我该怎么做: dd if=coolstuff.iso of=(ssh kev@mypi )

我的笔记本电脑上的读卡器无法工作。我可以使用 dd (或其他一些工具)将图像写入网络磁盘吗?

我正在尝试将一个树莓派发行版替换为另一个发行版。 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 客户端的标准输入来自dd,而远程的标准输入dd来自 SSH 服务器,这将导致 SSH 客户端-服务器对将充当加密的数据传输,桥接来自您的标准输出。本地dd到遥控器的标准输入dd。 (这实际上就是 SSH 进行远程登录的方式,标准输入来自键盘,接收标准输入的远程进程是 UNIX shell)。
  4. 我传递给 SSH 的选项MACs强制连接使用 RIPEMD160 算法作为消息完整性摘要。这样做可以保护传输的数据,以便检测到任何传输错误或故意篡改。考虑到您正在使用无线电波传输磁盘映像,这一点很重要。您可能想要添加o Ciphers=aes256-cbco Ciphers=aes256-ctr强制加密,以防 Raspberry 默认情况下执行较弱的加密。
  5. -l指示您用于登录的用户,只是因为我倾向于使用该语法。

答案3

更新正在运行的系统以便在下次重新启动时使用新的根映像比直接通过网络进行复制要复杂一些。假设根映像已打开/dev/mmcblk0p5(如上面的输出parted -l和注释所示),OP 应该能够将根分区从映像复制到而/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/hostnameRaspberry Pi 上的任何内容(似乎mypi是 OP)或 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,连接到网络,这样存储就足够了。我不是专业人士,只是在这里吐槽一下。如有错误,请专家指正。

相关内容