É possível atualizar, atualizar e instalar o software antes de exibir uma imagem?


28

Parece tolice usar nossos ciclos limitados de gravação em SD para atualizar o software enviado nas imagens. Podemos atualizar o software e instalar um novo antes de enviar uma imagem para o cartão SD?

Respostas:


31

sim

A resposta é sempre sim, certo, leva apenas um tempo para descobrir como!

O jeito difícil

Eu executarei isso em um VPS, fornecido pela Brightbox.com . Usei um Nano Server (2 CPUs, 512 MB de RAM, 20 GB de espaço em disco) e uma imagem do servidor Ubuntu Precise 12.04 LTS. Ele deve funcionar com os equivalentes do EC2 ou do Linode e, é claro, na sua máquina Linux doméstica. Agora eu testei na minha instalação do Arch (x86), mas sei que não funciona no Ubuntu 10.04 LTS porque alguns dos pacotes são muito antigos.

Preparando seu sistema - Debian / Ubuntu

Verifique se seu próprio sistema está atualizado.

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

Instale um novo software

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

qemué um emulador de ARM qemu-user-statice binfmt-supportpermite executar executáveis ​​do ARM sem emular o kernel do ARM. (Quão legal é isso!?!)

Preparando seu sistema - Arch

Não consigo encontrar um link estaticamente qemunos repositórios do Arch, então teremos que compilar a partir do código-fonte.

  1. Faça o download da versão mais recente em http://git.savannah.gnu.org/cgit/qemu.git
  2. Descompacte e execute

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

  3. Crie usando makee instale usando sudo make install.

  4. Execute o seguinte como 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

Aviso Você não deve executar comandos arbitrários encontrados on-line, pois rootforam retirados do qemu-binfmt-conf.shtipo de CPU do ARM. Por favor, extraia os comandos deste arquivo e execute-os.

Baixe e descompacte a imagem

Vá para raspberrypi.org e faça o download da imagem desejada. Descompacte e salve o .imgarquivo em algum lugar útil.

$ 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

Encontre a partição correta

O .imgarquivo conterá 3 partições, incluindo a partição de inicialização.

$ 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

Precisamos conhecer o deslocamento da partição Linux, neste caso, são os 157696setores e a partição de inicialização, que está nos 2048setores. Cada setor tem 512 bytes, portanto, o deslocamento raiz é 157696*512=80740352bytes e o deslocamento de inicialização é 2048*512=1048576.

Montar a imagem como um dispositivo de loopback

Em seguida, precisamos montar a imagem como um sistema de arquivos. Isso pode ser feito usando um dispositivo de loopback. Usamos o deslocamento da seção anterior para dizer mountquais partições montar e onde. A ordem desses comandos é importante.

$ 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

Preparando o sistema de arquivos.

Estamos quase prontos para chrootentrar no nosso sistema de arquivos e começar a instalar um novo software. Primeiro, precisamos instalar o emulador em nossa imagem, pois ele não estará disponível quando usarmos 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/

Todos os sistemas host

Também precisamos fornecer acesso a outras partes do sistema.

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

chroot

Acabamos! chrootlonge...

$ sudo chroot /mnt

Agora você está no seu Raspberry Pi, mas os serviços não estão sendo executados etc. Tenha cuidado, você é root!

Atualizar / Instalar software - Imagem Debian

Para atualizar o software, usamos apt-get.

 # apt-get update
 # apt-get upgrade

Você também pode instalar o software usando apt-get installcomo de costume.

Atualizar / Instalar software - Arch Image

Para atualizar o software, usamos pacman.

 # pacman -Syu

Você também pode instalar o software usando pacman -Scomo de costume.

NOTA Você pode executar pacmannativamente seguindo as instruções em Como executo meu nativo pacmanem uma imagem montada? .

Saindo

Você pode sair do chrootusando Ctrl+ De desmontar o sistema executando sudo umount /mnt- você precisará desmontar cada ponto de montagem separadamente.

Você deve remover qemu-user-staticde /usr/binou qemu-armdo /usr/local/binRPi, para que a imagem esteja pronta para flash.

Palavras Finais

Isso é um pouco longo e tedioso, mas faça-o uma vez e você aprenderá muito sobre como tudo isso funciona!

Nota sobre as imagens mais recentes

Ao tentar executar isso nas imagens mais recentes, você receberá um erro

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

Para corrigir esse erro, basta comentar o conteúdo do /etc/ld.so.preloadarquivo

O caminho fácil - piimg

Comecei a trabalhar em um utilitário para fazer muito disso por você. É chamado piimg e pode ser encontrado em github.com/alexchamberlain/piimg .

Até agora, ele pode montar o cartão SD para você executando

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

e desmonte-os novamente executando

piimg umount /mnt

Você só precisa instalar qemue ir chrootembora.

AVISO LEGAL Eu, Alex Chamberlain, sou o principal desenvolvedor do piimg. Como tal, posso estar inclinado para o uso de piimgem relação a outros métodos.

Referências

  1. Executando o ARM Linux no seu PC desktop: a maneira chroot estrangeira

  2. Obtendo 'instruções ilegais' ao tentar chroot


Então, alguém realmente testou isso?
finnw

@inninn Acho que Jivings já testou isso.
Alex128

1
You can also use sudo kpartx -av rpi_pisces_mate_r1.img, which will show the partitions. Use the biggest one and mount it, e.g. sudo mount /dev/mapper/loop0p3 /mnt/tmp.
elmicha

@AlexChamberlain: você realmente conseguiu isso funcionando no servidor Brightbox? Eu testei com sucesso isso no meu PC em casa, mas quando tentei no Brightbox, não consegui executar o chroot e queria se isso fosse por causa da tentativa de obter efetivamente a virtualização em cima da virtualização. É claro que eu poderia ter feito algo errado também, mas achei que valeria a pena consultar antes de desistir completamente! Obrigado por um excelente tutorial.
DrAl

É possível atualizar isso para incluir como chroot Noobs Distro? Apenas por uma questão de aprender a chroot em tal distro
Suhaib

0

Aqui, um script rápido que montei enquanto o rodava monta a primeira partição Linux de um arquivo de imagem. Use por sua conta e risco. Não possui manipulação de erro / validação de entrada

#!/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

Infelizmente, como as imagens são todas baseadas em ARM, não é possível executar nada diretamente nelas. Atualizá-los é um pouco mais complicado ... Talvez seja possível se o seu sistema host estiver baseado em apt.
Fred

-2

Eu segui as instruções procurando por um método para criar apenas coisas para o PI através do meu PC principal. Acontece que foi muito fácil, uma vez que você esteja chrootado, poderá tratar a imagem como se fosse um sistema ativo e usar todos os recursos. aplicativos nativos. no pi, então não há necessidade de instalar um compilador cruzado :)

Eu tenho uma pergunta, porém, durante a configuração do chroot, precisamos montar algumas partições para que o chroot funcione corretamente:

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

Como os desmontamos corretamente? deixando-os montados, o que impede você de desmontar o arquivo .img, qualquer ajuda aqui será apreciada. Eu tentei a opção -f, não tenho certeza se há algo mais subjacente que está montado.

respondendo minha própria pergunta, https://bugzilla.redhat.com/show_bug.cgi?id=194342 o segundo método no final do post funcionou para mim com uma modificação do sudo.

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

Obviamente, mude $ MOUNTPOINT para o caminho do seu ponto de montagem chroot (segunda partição que contém os rootfs no arquivo de imagem, que é / mnt no tutorial acima). Usando esse método, você desmonta completamente o arquivo img dos dispositivos de auto-retorno e de quaisquer outros dispositivos que foram montados através do chroot.

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

Não tenho certeza se isso realmente responde à pergunta. Você não descreve como está inserindo a imagem na imagem ou como instala o software nela. Além disso, este não é o lugar para fazer novas perguntas.
Jivings

Estou usando o mesmo método que a resposta sim original que o OP fez em sua pergunta. Como tive um problema ao desmontar a imagem, esse é realmente o melhor lugar para essa pergunta e minha própria resposta final.
Reggie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.