Skip to content

在 Linux 上安装操作系统映像

树莓派 Imager通常是大多数用户将图像写入 SD 卡的最简单选项,因此这是一个不错的起点。如果您正在 Linux 上寻找更高级的选项,则可以使用下面的标准命令行工具。

注意:使用 dd 工具可以覆盖计算机的任何分区。如果在以下说明中指定了错误的设备,则可以删除主 Linux 分区。请注意

发现 SD 卡挂载点并卸载它

  • 运行" lsblk -p"以查看当前已将哪些设备连接到您的计算机。

  • 如果计算机上有 SD 卡插槽,请插入卡。如果不是,请将卡插入 SD 卡读取器,然后将读取器连接到计算机。

  • 再次运行lsblk -p。出现的新设备是您的 SD 卡(通常也可以从列出的设备大小中分辨出来)。设备的命名将遵循下一段所述的格式。

  • " lsblk -p"命令结果的左列给出了 SD 卡的设备名称及其上任何分区的名称(通常只有一个,但是如果以前使用过该卡,则可能有多个)。它会以类似"/dev/mmcblk0"或"/dev/sdX"(分区名称分别为"/dev/mmcblk0p1"或"/dev/sdX1")的形式列出,其中" X"是小写字母指示设备(例如"/dev/sdb1")。右列显示分区的安装位置(如果尚未安装,将为空白)。

  • 如果已安装 SD 卡上的任何分区,请用umount卸载所有分区,例如umount/dev/sdX1(用 SD 卡的设备名称替换sdX1,并更改其他分区的编号) 。

将图像复制到 SD 卡

  • 在终端窗口中,使用以下命令将图像写入卡,并确保将输入文件if =参数替换为.img文件的路径,并在其中将/dev/sdX替换为输出文件of =参数具有正确的设备名称。 这非常重要,因为如果提供错误的设备名称,则会丢失硬盘驱动器上的所有数据。请确保设备名称是如上所述的整个 SD 卡的名称,而不仅仅是分区。例如:sdd,而不是sdds1sddp1; " mmcblk0",而不是" mmcblk0p1"。

    `` dd bs = 4M if = 2020-08-20-raspios-buster-armhf.img of =/dev/sdX conv = fsync ```

  • 请注意,设置为" 4M"的块大小在大多数情况下都会起作用。如果不是,请尝试使用" 1M",尽管这将花费更长的时间。

  • 另请注意,如果您不是以 root 用户身份登录,则需要在其前加上sudo

将压缩的图像复制到 SD 卡

在 Linux 中,可以将解压缩和 SD 复制过程组合为一个命令,这样可以避免在解压缩的映像大于 4GB 时可能发生的任何问题。在某些不支持大于 4GB 的文件(例如 FAT )的文件系统上,可能会发生这种情况,不过应注意,大多数 Linux 安装都不使用 FAT ,因此没有此限制。

以下命令解压缩 zip 文件(将 2020 -08-20-raspios-buster-armhf.zip替换为适当的 zip 文件名),并将输出直接通过管道传递到 dd 命令。如上一节所述,这继而将其复制到 SD 卡。

解压缩-p 2020-08-20-raspios-buster-armhf.zip | sudo  dd  of =/dev/sdX bs = 4M conv = fsync

检查图像复制进度

  • 默认情况下," dd"命令不提供有关其进度的任何信息,因此它似乎已冻结。完成写入卡可能需要五分钟以上的时间。如果您的读卡器有一个 LED ,则在写入过程中它可能会闪烁。

  • 要查看复制操作的进度,可以使用带有 status 选项的 dd 命令。 dd bs = 4M if = 2020-08-20-raspios-buster-armhf.img of =/dev/sdX status = progress conv = fsync

  • 如果您使用的是 dd 的旧版本,则状态选项可能不可用。您可能可以改为使用 dcfldd 命令,该命令将给出进度报告,显示已写入的数量。另一种方法是将 USR1 信号发送到 dd ,这将使其打印状态信息。通过使用 pgrep -l dd或 ps a |找出 dd 的 PID 。 grep dd`。然后使用 kill -USR1 PID将 USR1 信号发送到 dd 。

可选:检查图像是否正确写入了 SD 卡

  • 完成 dd 复制后,您可以通过将 dd 从 SD 卡复制回硬盘上的另一张图片,将新图片截断为原始尺寸,来检查已写入 SD 卡的内容,然后在这两个图像上运行diff(或md5sum)。

  • 如果 SD 卡比图片大得多,则您不想读回整个 SD 卡,因为它几乎是空的。因此,您需要检查通过 dd 命令写入卡的块数。在运行结束时,dd将显示如下编写的块数: xxx + 0条记录 inyyy + 0条记录 yyyyyyyyyy字节(yyy kB,yyy KiB)已复制,0.00144744 s,283 MB/s 我们需要数字" xxx",即块数。我们可以忽略yyy数字。

  • 再次使用 dd 将 SD 卡内容复制到硬盘上的映像中: `` dd bs = 4M if =/dev/sdX of = from-sd-card.img count = xxx ``` " if"是输入文件(即 SD 卡设备)," of"是要将 SD 卡内容复制到的输出文件(在此示例中称为" from-sd-card.img"), xxx是原始 dd 操作写入的块数。

  • 如果 SD 卡映像仍然大于原始映像,请使用以下命令将新映像截断为原始映像的大小(用原始映像名称替换输入文件reference参数): `` 截断-参考 2020 -08-20-raspios-buster-armhf.img from-sd-card.img ```

  • 比较两个图像:diff应该报告文件是相同的。 `` diff -s from-sd-card.img 2020-08-20-raspios-buster-armhf.img ```
  • 运行sync。这将确保刷新写入缓存,并且可以安全地卸载 SD 卡。

  • 从读卡器中取出 SD 卡。