Parece una tontería usar nuestros ciclos de escritura SD limitados para actualizar el software enviado en las imágenes. ¿Podemos actualizar el software e instalar un nuevo software antes de actualizar una imagen a la tarjeta SD?
Parece una tontería usar nuestros ciclos de escritura SD limitados para actualizar el software enviado en las imágenes. ¿Podemos actualizar el software e instalar un nuevo software antes de actualizar una imagen a la tarjeta SD?
Respuestas:
¡La respuesta siempre es sí, cierto, solo lleva un tiempo averiguar cómo!
Lo ejecutaré en un VPS, proporcionado por Brightbox.com . Utilicé un Nano Server (2 CPU, 512 MB de RAM, 20 GB de espacio en disco) y una imagen del servidor Ubuntu Precise 12.04 LTS. Debería funcionar en los equivalentes de EC2 o Linode y, por supuesto, en su máquina Linux doméstica. Ahora lo he probado en mi instalación (x86) Arch, pero sé que no funciona en Ubuntu 10.04 LTS porque algunos de los paquetes son demasiado antiguos.
Asegúrese de que su propio sistema esté actualizado.
$ sudo apt-get update
$ sudo apt-get upgrade
Instalar un nuevo software
$ sudo apt-get install binfmt-support qemu qemu-user-static unzip
qemu
es un emulador ARM qemu-user-static
y binfmt-support
nos permite ejecutar ejecutables ARM sin emular el núcleo ARM. (¡¿¡Cuan genial es eso!?!)
No puedo encontrar un enlace estático qemu
en los repositorios de Arch, por lo que tendremos que compilar desde la fuente.
Descomprimir y correr
./configure --disable-kvm --target-list=arm-linux-user --static
Construir usando make
e instalar usando sudo make install
.
Ejecute lo siguiente 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
Advertencia No debe ejecutar comandos arbitrarios que encuentre en línea como
root
: estos se tomaron deqemu-binfmt-conf.sh
debajo del tipo de CPU ARM. Extraiga los comandos de este archivo y ejecútelos.
Vaya a raspberrypi.org y descargue la imagen que desee. Descomprímalo y guarde el .img
archivo en algún 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
El .img
contendrá 3 particiones, incluida la partición de arranque.
$ 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
Necesitamos conocer el desplazamiento de la partición de Linux, en este caso son 157696
sectores, y la partición de arranque, que está en los 2048
sectores. Cada sector tiene 512 bytes, por lo que el desplazamiento raíz es 157696*512=80740352
bytes y el desplazamiento de arranque es 2048*512=1048576
.
A continuación, necesitamos montar la imagen como un sistema de archivos. Esto se puede hacer usando un dispositivo loopback. Usamos el desplazamiento de la sección anterior para decir mount
qué particiones montar y dónde. El orden de estos comandos es 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 casi listos para chroot
ingresar a nuestro sistema de archivos y comenzar a instalar un nuevo software. Primero, debemos instalar el emulador en nuestra imagen, ya que no estará disponible una vez que lo usemos chroot
.
$ sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/
$ sudo cp /usr/local/bin/qemu-arm /mnt/usr/local/bin/
También necesitamos proporcionar acceso a ciertas otras partes del sistema.
$ sudo mount --rbind /dev /mnt/dev
$ sudo mount -t proc none /mnt/proc
$ sudo mount -o bind /sys /mnt/sys
¡Hemos terminado! chroot
lejos...
$ sudo chroot /mnt
Ahora está en su Raspberry Pi, pero los servicios no se están ejecutando, etc. ¡Tenga cuidado, es root!
Para actualizar el software, utilizamos apt-get
.
# apt-get update
# apt-get upgrade
También puede instalar software utilizando apt-get install
como de costumbre.
Para actualizar el software, utilizamos pacman
.
# pacman -Syu
También puede instalar software utilizando pacman -S
como de costumbre.
NOTA Puede ejecutar de
pacman
forma nativa siguiendo las instrucciones en ¿Cómo ejecuto mi nativopacman
contra una imagen montada? .
Puede salir chroot
usando Ctrl+ Dy desmontar el sistema ejecutando sudo umount /mnt
: tendrá que desmontar cada punto de montaje por separado.
Debe eliminar qemu-user-static
desde /usr/bin
o qemu-arm
desde /usr/local/bin
el RPi, luego la imagen está lista para ser flasheada.
Esto es un poco largo y tedioso, ¡pero hazlo una vez y aprenderás mucho sobre cómo funciona todo esto!
Cuando intente ejecutar esto en las últimas imágenes, obtendrá un error
qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Illegal instruction (core dumped)
Para corregir este error, simplemente comente el contenido del /etc/ld.so.preload
archivo
piimg
Empecé a trabajar en una utilidad para hacer mucho de esto por ti. Se llama piimg y se puede encontrar en github.com/alexchamberlain/piimg .
Hasta ahora, puede montar la tarjeta SD por ti ejecutando
piimg mount /images/debian-squeeze/debian6-19-04-2012/debian6-19-04-2012.img /mnt
y desmontarlos nuevamente corriendo
piimg umount /mnt
Solo necesita instalarlo qemu
y chroot
alejarlo.
DESCARGO DE RESPONSABILIDAD I, Alex Chamberlain, soy el desarrollador principal de
piimg
. Como tal, puedo estar sesgado hacia el uso depiimg
otros métodos.
sudo kpartx -av rpi_pisces_mate_r1.img
, que mostrará las particiones. Use el más grande y móntelo, por ejemplo sudo mount /dev/mapper/loop0p3 /mnt/tmp
.
Aquí, una secuencia de comandos rápida que armé mientras rodaba monta la primera partición de Linux de un archivo de imagen. Use bajo su propio riesgo. No tiene manejo de errores / validación 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
Seguí las instrucciones en busca de un método para crear cosas para el PI a través de mi PC principal, resulta que fue muy fácil, una vez que estás desarmado puedes tratar la imagen como si fuera un sistema en vivo y usar todo el aplicaciones nativas en el pi, por lo que no es necesario instalar un compilador cruzado :)
Sin embargo, tengo una pregunta, durante la configuración del chroot, tenemos que montar algunas particiones para que el chroot funcione correctamente:
$ sudo mount --rbind /dev /mnt/dev
$ sudo mount -t proc none /mnt/proc
$ sudo mount -o bind /sys /mnt/sys
¿Cómo desmontamos estos correctamente? dejándolos montados, lo que evita que desmontes el archivo .img, cualquier ayuda aquí sería apreciada. Intenté la opción -f, no estoy seguro de si hay algo más subyacente que está montado.
respondiendo a mi propia pregunta, https://bugzilla.redhat.com/show_bug.cgi?id=194342 el segundo método al final de la publicación me funcionó con una modificación de sudo.
cat /proc/mounts | awk '{print $2}' | grep "^$MOUNTPOINT" | sort -r | xargs sudo umount
Obviamente cambie $ MOUNTPOINT a la ruta de su punto de montaje chroot (segunda partición que contiene los rootfs en el archivo de imagen, que es / mnt en el tutorial anterior). Con este método, desmonta completamente el archivo img de los dispositivos de bucle invertido y de cualquier otro dispositivo que se haya montado a través del chroot.
cat /proc/mounts |awk '{print $2}'|grep $CHROOTMOUNT |sort -r|xargs sudo umount
sudo umount $CHROOTMOUNT