¿Es posible actualizar, actualizar e instalar software antes de actualizar una imagen?

28

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?

Alex Chamberlain
fuente

Respuestas:

31

¡La respuesta siempre es sí, cierto, solo lleva un tiempo averiguar cómo!

El camino difícil

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.

Preparando su sistema - Debian / Ubuntu

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

qemues un emulador ARM qemu-user-staticy binfmt-supportnos permite ejecutar ejecutables ARM sin emular el núcleo ARM. (¡¿¡Cuan genial es eso!?!)

Preparando su sistema - Arch

No puedo encontrar un enlace estático qemuen los repositorios de Arch, por lo que tendremos que compilar desde la fuente.

  1. Descargue la última versión de http://git.savannah.gnu.org/cgit/qemu.git
  2. Descomprimir y correr

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

  3. Construir usando makee instalar usando sudo make install.

  4. 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 de qemu-binfmt-conf.shdebajo del tipo de CPU ARM. Extraiga los comandos de este archivo y ejecútelos.

Descarga y descomprime la imagen

Vaya a raspberrypi.org y descargue la imagen que desee. Descomprímalo y guarde el .imgarchivo 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

Encuentra la partición correcta

El .imgcontendrá 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 157696sectores, y la partición de arranque, que está en los 2048sectores. Cada sector tiene 512 bytes, por lo que el desplazamiento raíz es 157696*512=80740352bytes y el desplazamiento de arranque es 2048*512=1048576.

Monte la imagen como un dispositivo de bucle invertido

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 mountqué 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

Preparando el sistema de archivos.

Estamos casi listos para chrootingresar 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.

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 los sistemas host

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

chroot

¡Hemos terminado! chrootlejos...

$ sudo chroot /mnt

Ahora está en su Raspberry Pi, pero los servicios no se están ejecutando, etc. ¡Tenga cuidado, es root!

Actualizar / instalar software - Imagen de Debian

Para actualizar el software, utilizamos apt-get.

 # apt-get update
 # apt-get upgrade

También puede instalar software utilizando apt-get installcomo de costumbre.

Actualizar / instalar software - Arch Image

Para actualizar el software, utilizamos pacman.

 # pacman -Syu

También puede instalar software utilizando pacman -Scomo de costumbre.

NOTA Puede ejecutar de pacmanforma nativa siguiendo las instrucciones en ¿Cómo ejecuto mi nativo pacmancontra una imagen montada? .

Salir

Puede salir chrootusando Ctrl+ Dy desmontar el sistema ejecutando sudo umount /mnt: tendrá que desmontar cada punto de montaje por separado.

Debe eliminar qemu-user-staticdesde /usr/bino qemu-armdesde /usr/local/binel RPi, luego la imagen está lista para ser flasheada.

Ultimas palabras

Esto es un poco largo y tedioso, ¡pero hazlo una vez y aprenderás mucho sobre cómo funciona todo esto!

Nota sobre las últimas imágenes

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.preloadarchivo

La manera fácil - 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 qemuy chrootalejarlo.

DESCARGO DE RESPONSABILIDAD I, Alex Chamberlain, soy el desarrollador principal de piimg. Como tal, puedo estar sesgado hacia el uso de piimgotros métodos.

Referencias

  1. Ejecutar ARM Linux en su PC de escritorio: la forma chroot extranjera

  2. Obteniendo 'instrucción ilegal' cuando intentas hacer chroot

Alex Chamberlain
fuente
Entonces, ¿alguien realmente ha probado esto?
finnw
@finnw Creo que Jivings ahora ha probado esto.
Alex Chamberlain
1
También puede usar 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.
elmicha
@ AlexChamberlain: ¿realmente funcionó esto en el servidor de Brightbox? Lo probé con éxito en la PC de mi casa, pero cuando lo probé en Brightbox no pude hacer un chroot y quería hacerlo, porque era por tratar de lograr la virtualización de manera efectiva. Por supuesto, podría haber hecho algo mal también, ¡pero pensé que valía la pena consultarlo antes de rendirme por completo! Gracias por un excelente tutorial.
DrAl
¿Es posible actualizar esto para incluir cómo chroot Noobs Distro? Solo por el simple hecho de aprender a trabajar en una distribución de este tipo
Suhaib el
0

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
Art
fuente
Desafortunadamente, como todas las imágenes están basadas en ARM, no puedes ejecutar nada directamente en ellas. Actualizarlos es un poco complicado ... Sin embargo, podría ser posible si su sistema host es apto.
Fred
-2

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
Reggie
fuente
No estoy seguro de que esto realmente responda la pregunta. No describe cómo está haciendo chrooting en la imagen o cómo instala software en ella. Además, este no es el lugar para hacer nuevas preguntas.
Jivings
Estoy usando el mismo método que la respuesta de sí original que el OP hizo a su pregunta. Como tuve un problema para desmontar la imagen, este es realmente el mejor lugar para esa pregunta y mi propia respuesta eventual.
Reggie