我的笔记本电脑上的读卡器无法工作。我可以使用 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
,您最好使用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'
我解释:
dd
当未指定输出文件时输出到标准输出of
,当未指定输入文件时从标准输入读取if
。- 当您直接向 SSH 传递命令时,客户端会将其标准输入转发到服务器,然后服务器将该数据传递到发送到服务器的命令上指定的进程的标准输入。
- 因为本例中 SSH 客户端的标准输入来自
dd
,而远程的标准输入dd
来自 SSH 服务器,这将导致 SSH 客户端-服务器对将充当加密的数据传输,桥接来自您的标准输出。本地dd
到遥控器的标准输入dd
。 (这实际上就是 SSH 进行远程登录的方式,标准输入来自键盘,接收标准输入的远程进程是 UNIX shell)。 - 我传递给 SSH 的选项
MACs
强制连接使用 RIPEMD160 算法作为消息完整性摘要。这样做可以保护传输的数据,以便检测到任何传输错误或故意篡改。考虑到您正在使用无线电波传输磁盘映像,这一点很重要。您可能想要添加o Ciphers=aes256-cbc
或o Ciphers=aes256-ctr
强制加密,以防 Raspberry 默认情况下执行较弱的加密。 -l
指示您用于登录的用户,只是因为我倾向于使用该语法。
答案3
更新正在运行的系统以便在下次重新启动时使用新的根映像比直接通过网络进行复制要复杂一些。假设根映像已打开/dev/mmcblk0p5
(如上面的输出parted -l
和注释所示),OP 应该能够将根分区从映像复制到而/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)或 Raspberry Pi 的 IP 地址。如果您不使用loop0
.还请记住相应地更改此设置。接下来更改 Raspberry Pi 的根分区,据我所知(我没有 Raspberry Pi 进行测试),您必须更改
/boot/cmdline.txt
.您将更改表示root=/dev/mmcblk0p5
为 的部分root=/dev/mmcblk0p3
。您可以通过执行以下操作来删除从中复制的系统上的
loop
和设备:mapper
sudo kpartx -d pi.img
现在重新启动 Raspberry Pi,您应该可以使用新映像了!
答案4
如果您使用 USB ARM 映像启动 Pi,连接到网络,这样存储就足够了。我不是专业人士,只是在这里吐槽一下。如有错误,请专家指正。