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?
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:
A resposta é sempre sim, certo, leva apenas um tempo para descobrir como!
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.
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-static
e binfmt-support
permite executar executáveis do ARM sem emular o kernel do ARM. (Quão legal é isso!?!)
Não consigo encontrar um link estaticamente qemu
nos repositórios do Arch, então teremos que compilar a partir do código-fonte.
Descompacte e execute
./configure --disable-kvm --target-list=arm-linux-user --static
Crie usando make
e instale usando sudo make install
.
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
root
foram retirados doqemu-binfmt-conf.sh
tipo de CPU do ARM. Por favor, extraia os comandos deste arquivo e execute-os.
Vá para raspberrypi.org e faça o download da imagem desejada. Descompacte e salve o .img
arquivo 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
O .img
arquivo 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 157696
setores e a partição de inicialização, que está nos 2048
setores. Cada setor tem 512 bytes, portanto, o deslocamento raiz é 157696*512=80740352
bytes e o deslocamento de inicialização é 2048*512=1048576
.
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 mount
quais 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
Estamos quase prontos para chroot
entrar 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
.
$ sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/
$ sudo cp /usr/local/bin/qemu-arm /mnt/usr/local/bin/
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
Acabamos! chroot
longe...
$ 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!
Para atualizar o software, usamos apt-get
.
# apt-get update
# apt-get upgrade
Você também pode instalar o software usando apt-get install
como de costume.
Para atualizar o software, usamos pacman
.
# pacman -Syu
Você também pode instalar o software usando pacman -S
como de costume.
NOTA Você pode executar
pacman
nativamente seguindo as instruções em Como executo meu nativopacman
em uma imagem montada? .
Você pode sair do chroot
usando Ctrl+ De desmontar o sistema executando sudo umount /mnt
- você precisará desmontar cada ponto de montagem separadamente.
Você deve remover qemu-user-static
de /usr/bin
ou qemu-arm
do /usr/local/bin
RPi, para que a imagem esteja pronta para flash.
Isso é um pouco longo e tedioso, mas faça-o uma vez e você aprenderá muito sobre como tudo isso funciona!
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.preload
arquivo
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 qemu
e ir chroot
embora.
AVISO LEGAL Eu, Alex Chamberlain, sou o principal desenvolvedor do
piimg
. Como tal, posso estar inclinado para o uso depiimg
em relação a outros métodos.
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
.
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
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