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

#1 楼



答案永远是正确的,对,只是花点时间来弄清楚怎么做!

艰难的路

我将继续由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

我在Arch存储库中找不到静态链接的qemu,因此我们必须进行编译从源头下载。


从http://git.savannah.gnu.org/cgit/qemu.git
下载最新版本


解压缩并运行

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

使用make进行构建,并使用sudo make install进行安装。警告您不应运行在线找到的任意命令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,属于ARM cpu类型。请从该文件中提取命令并运行它们。


下载并解压缩图像

转到raspberrypi.org并下载所需的图像。将其解压缩并将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文件保存在有用的地方。 。

$ 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


我们需要知道Linux分区的偏移量(在本例中为root扇区)和引导分区(在qemu-binfmt-conf.sh扇区中)。每个扇区为512字节,因此根偏移为.img字节,引导偏移为.img。映像作为文件系统。这可以使用回送设备来完成。我们使用上一部分的偏移量来告诉157696要挂载的分区以及挂载的位置。这些命令的顺序很重要。

$ 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


准备文件系统。

我们已经准备好将2048插入文件系统并开始安装新软件。首先,我们必须将仿真器安装到我们的映像中,因为一旦使用157696*512=80740352,该仿真器将不可用。 > Arch Linux

$ 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


所有主机系统

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

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



我们完成了! 2048*512=1048576离开...

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


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

更新/安装软件-Debian Image

要更新软件,我们使用mount。照常使用chroot

更新/安装软件-Arch Image

要更新软件,请使用chroot

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


您也可以照常使用chroot安装软件。 ?。


退出

您可以使用Ctrl + D退出apt-get并通过运行apt-get install卸载系统-您将不得不分别卸载每个安装点..

您应该从RPi上的pacman上删除pacman -S或从pacman上删除pacman,然后就可以刷新图像了。

最后的话

这有点长且乏味,但是只需执行一次,您就会学到有关如何全部工作的负载!

有关最新图像的说明

当尝试对最新图像执行此操作时,您将获得一个错误

$ sudo chroot /mnt


要解决此错误,只需注释掉chroot文件的内容

简易方法-sudo umount /mnt


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

到目前为止,它可以通过运行

 # apt-get update
 # apt-get upgrade


,然后通过运行

 # pacman -Syu


再次卸下它们。只需安装qemu-user-static/usr/bin即可。


免责声明I,Alex Chamberlain是qemu-arm的首席开发人员。因此,与其他方法相比,我可能会偏爱使用/usr/local/bin


参考文献



运行ARM Linux在台式机上:国外chroot方式
尝试chroot时获取“非法指令”


评论


那么有人真的测试过吗?

– Finnw
2012年7月3日在7:25

@finnw我认为Jivings现在已经对此进行了测试。

–亚历山大·张伯伦
2012年7月9日在20:20

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

– elmicha
2012年7月14日在22:28

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

– DrAl
13年2月13日在10:11

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

– Suhaib
2014年3月3日在22:45

#2 楼

在滚动时,我整理了一个快速脚本
,该脚本安装了映像文件的第一个Linux分区
,后果自负。它没有错误处理/输入验证

#!/bin/bash

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

USAGE="q4312078q <image name> <mount point>"
IMAGE=
MOUNTPT=

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

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


评论


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

–弗雷德
14年4月14日在17:23

#3 楼

我写了一组脚本来帮助解决这个问题。希望有人能发现这些有用的东西:必需)。



增长:增长图像文件(以便您可以预安装更多东西)


Chroot:获取img中的root shell(玩得开心!)


准备:在图像上的chroot中运行安装脚本(提供示例)


#4 楼

我按照说明寻找一种方法,可以通过我的主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修改对我起作用。第二个分区包含映像文件上的rootfs,在上面的教程中为/ mnt。使用此方法,您可以从环回设备和通过chroot挂接的任何其他设备上完全卸载img文件。

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


评论


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

–活动
2012年7月27日上午10:27

我使用的方法与OP对他的问题的原始回答相同。由于我在卸载图像时遇到问题,因此,这实际上是该问题和我自己的最终答案的最佳选择。

–雷吉
2012年7月30日在16:09