刷新映像之前可以更新,升级和安装软件吗?


28

使用我们有限的SD写入周期来升级映像中随附的软件似乎很愚蠢。我们可以在将映像刷新到SD卡之前升级软件并安装新软件吗?

Answers:


31

答案永远是肯定的,没错,只是需要一段时间才能弄清楚如何做!

艰难的道路

我将在Brightbox.com提供的VPS上运行它。我使用了Nano服务器(2个CPU,512MB RAM,20GB磁盘空间)和Ubuntu Precise 12.04 LTS服务器映像。它应该可以在EC2或Linode的同等产品上运行,当然也可以在家用Linux机器上运行。我现在已经在(x86)Arch安装上对其进行了测试,但是知道它在Ubuntu 10.04 LTS上不起作用,因为某些软件包太旧了。

准备系统-Debian / Ubuntu

确保您自己的系统是最新的。

$ sudo apt-get update
$ sudo apt-get upgrade

安装一些新软件

$ sudo apt-get install binfmt-support qemu qemu-user-static unzip

qemu是ARM仿真器,以及qemu-user-staticbinfmt-support允许我们不仿效ARM内核运行ARM可执行文件。(多么酷啊!?!)

准备系统-Arch

qemu在Arch资料库中找不到静态链接,因此我们将不得不从源代码进行编译。

  1. http://git.savannah.gnu.org/cgit/qemu.git下载最新版本
  2. 解压缩并运行

    ./configure --disable-kvm --target-list=arm-linux-user --static

  3. 使用构建make并使用安装sudo make install

  4. 运行以下内容 root

    echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-arm:' > /proc/sys/fs/binfmt_misc/register

    echo ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-armeb:' > /proc/sys/fs/binfmt_misc/register

警告您不应运行在网上找到的任意命令,因为root这些命令来自qemu-binfmt-conf.shARM cpu类型。请从该文件中提取命令并运行它们。

下载并解压缩图像

转到raspberrypi.org并下载所需的图像。解压缩并将.img文件保存在有用的位置。

$ sudo mkdir -p /images/debian-squeeze
$ sudo wget "http://files.velocix.com/c1410/images/debian/6/debian6-19-04-2012/debian6-19-04-2012.zip" -O "/images/debian-squeeze.zip"
$ sudo unzip "/images/debian-squeeze.zip" -d /images/debian-squeeze
$ sudo rm /images/debian-squeeze.zip

找到正确的分区

.img将包含3个分区,包括引导分区。

$ cd /images/debian-squeeze/debian6-19-04-2012/
$ fdisk -lu debian6-19-04-2012.img
Disk debian6-19-04-2012.img: 1949 MB, 1949999616 bytes
4 heads, 32 sectors/track, 29754 cylinders, total 3808593 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000ee283

                 Device Boot      Start         End      Blocks   Id  System
debian6-19-04-2012.img1            2048      155647       76800    c  W95 FAT32 (LBA)
debian6-19-04-2012.img2          157696     3414015     1628160   83  Linux
debian6-19-04-2012.img3         3416064     3807231      195584   82  Linux swap / Solaris

我们需要知道Linux分区(在本例中为157696扇区)和引导分区(在2048扇区中)的偏移量。每个扇区为512字节,因此根偏移为157696*512=80740352字节,引导偏移为2048*512=1048576

将映像挂载为回送设备

接下来,我们需要将映像挂载为文件系统。这可以使用回送设备来完成。我们使用上一部分的偏移量来判断mount要安装的分区以及安装在何处。这些命令的顺序很重要。

$ sudo mount -o loop,offset=80740352 "/images/debian-squeeze/debian6-19-04-2012/debian6-19-04-2012.img" /mnt
$ sudo mount -o loop,offset=1048576 "/images/debian-squeeze/debian6-19-04-2012/debian6-19-04-2012.img" /mnt/boot

准备文件系统。

我们几乎准备chroot进入文件系统并开始安装新软件。首先,我们必须将模拟器安装到映像中,因为一旦使用它将无法使用chroot

Debian / Ubuntu

$ sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/

Arch Linux

$ sudo cp /usr/local/bin/qemu-arm /mnt/usr/local/bin/

所有主机系统

我们还需要提供对系统某些其他部分的访问。

$ sudo mount --rbind /dev     /mnt/dev
$ sudo mount -t proc none     /mnt/proc
$ sudo mount -o bind /sys     /mnt/sys

chroot

我们完了!chroot远...

$ sudo chroot /mnt

您现在在Raspberry Pi中,但服务未运行等。请注意,您是root!

更新/安装软件-Debian映像

要更新软件,我们使用apt-get

 # apt-get update
 # apt-get upgrade

您也可以apt-get install照常使用来安装软件。

更新/安装软件-Arch Image

要更新软件,我们使用pacman

 # pacman -Syu

您也可以pacman -S照常使用来安装软件。

注意您可以pacman按照如何pacman对已装载的映像运行本机的说明进行本机运行

退出中

您可以chroot使用Ctrl+ 退出,D然后通过运行sudo umount /mnt来卸载系统-您将不得不分别卸载每个安装点。

您应该qemu-user-static从RPi上/usr/binqemu-arm/usr/local/binRPi上移除,然后即可刷新图像。

最后的话

这有点漫长而乏味,但是只需执行一次,您就会学到很多有关这一切的工作方式!

注意最新图片

尝试对最新图像执行此操作时,会出现错误

qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Illegal instruction (core dumped)

要解决此错误,只需注释掉/etc/ld.so.preload文件内容

简单的方法- piimg

我已经开始致力于为您做很多事情的实用程序。它称为piimg,可以在github.com/alexchamberlain/piimg中找到。

到目前为止,它可以通过运行以下命令为您安装SD卡

piimg mount /images/debian-squeeze/debian6-19-04-2012/debian6-19-04-2012.img /mnt

然后通过运行再次卸载它们

piimg umount /mnt

你只需要安装qemuchroot路程。

免责声明一:Alex Chamberlain是的主要开发人员piimg。因此,piimg相对于其他方法,我可能会偏向使用。

参考文献

  1. 在台式机上运行ARM Linux:国外chroot方法

  2. 尝试chroot时获取“非法指令”


那么有人真的测试过吗?
finnw

@finnw我认为Jivings现在已经对此进行了测试。
亚历克斯·张伯伦

1
您也可以使用sudo kpartx -av rpi_pisces_mate_r1.img,它将显示分区。使用最大的一个并安装它,例如sudo mount /dev/mapper/loop0p3 /mnt/tmp
elmicha

@AlexChamberlain:您实际上在Brightbox服务器上工作了吗?我已经在家用PC上成功进行了测试,但是当我在Brightbox上尝试时,我无法进行chroot,我想知道是否是因为尝试有效地使虚拟化成为虚拟化的基础。当然,我也可能做错了一些,但是我认为在完全放弃之前值得查询!感谢您的优秀教程。
DrAl

是否有可能对此进行更新以包括如何chroot Noobs Distro?只是为了学习如何chroot到这样一个发行版的缘故
Suhaib

0

在滚动时,我整理了一个快速脚本来装载映像文件的第一个Linux分区,使用风险自负。它没有错误处理/输入验证

#!/bin/bash

# This script is designed to mount
# the first Linux filesystem
# in the partition table of the
# image handed to it

USAGE="$0 <image name> <mount point>"
IMAGE=$1
MOUNTPT=$2

OFFSET=`fdisk -lu $IMAGE | grep -m 1 Linux$ | awk '{ print $2 *512 }'`

echo "Executing as $USER: mount -o loop,offset=$OFFSET $IMAGE $MOUNTPT"
mount -o loop,offset=$OFFSET $IMAGE $MOUNTPT

不幸的是,由于这些图像都是基于ARM的,因此您实际上无法直接对它们执行任何操作。更新它们有点棘手...如果您的主机系统是基于apt的,则可能有可能。
Fred

-2

我遵循了说明,寻找一种方法可以通过我的主PC为PI构建东西,事实证明这很容易,只要您更改了根目录,就可以将映像视为实时系统,并使用所有本机应用程序。在pi上,因此无需安装交叉编译器:)

我确实有一个问题,在chroot的安装过程中,我们必须安装一些分区以使chroot正常运行:

$ sudo mount --rbind /dev     /mnt/dev
$ sudo mount -t proc none     /mnt/proc
$ sudo mount -o bind /sys     /mnt/sys

我们如何正确卸载它们?让它们挂载,这将使您无法卸载.img文件,在此提供任何帮助。我尝试了-f选项,不确定是否安装了其他基础。

回答我自己的问题,https ://bugzilla.redhat.com/show_bug.cgi?id = 194342帖子末尾的第二种方法对我来说是一个sudo修改。

cat /proc/mounts | awk '{print $2}' | grep "^$MOUNTPOINT" | sort -r | xargs sudo umount

显然,将$ MOUNTPOINT更改为chroot安装点的路径(第二个分区,该分区在映像文件上包含rootfs,在上面的教程中为/ mnt)。使用此方法,您可以从环回设备和通过chroot挂载的任何其他设备上完全卸载img文件。

cat /proc/mounts |awk '{print $2}'|grep $CHROOTMOUNT |sort -r|xargs sudo umount
sudo umount $CHROOTMOUNT

我不确定这是否能真正回答问题。您没有描述如何在映像中生成根目录或如何在映像中安装软件。同样,这里也不是提出新问题的地方。
吉文斯

我使用的方法与OP对他的问题的原始回答相同。由于我在卸载图像时遇到问题,所以这实际上是该问题和我自己的最终答案的最佳选择。
雷吉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.