Можно ли обновить, обновить и установить программное обеспечение перед прошивкой образа?

28

Кажется глупым использовать наши ограниченные циклы записи SD для обновления программного обеспечения, поставляемого на изображениях. Можем ли мы обновить программное обеспечение и установить новое программное обеспечение, прежде чем записывать образ на SD-карту?

Алекс Чемберлен
источник

Ответы:

31

да

Ответ всегда да, верно, просто нужно время, чтобы понять, как!

Трудный путь

Я буду запускать это на VPS, предоставленном Brightbox.com . Я использовал Nano Server (2 ЦП, 512 МБ ОЗУ, 20 ГБ дискового пространства) и образ сервера 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-staticи binfmt-supportпозволяет запускать ARM исполняемые файлы без эмуляции ядра ARM. (Как это круто!?!)

Подготовка вашей системы - Arch

Я не могу найти статически связанных qemuв репозиториях Arch, поэтому нам придется скомпилировать из исходного кода.

  1. Загрузите последнюю версию с http://git.savannah.gnu.org/cgit/qemu.git
  2. Распакуйте и запустите

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

  3. Сборка с использованием makeи установка с помощью sudo make install.

  4. Запустите следующее как 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

Внимание ! Не следует запускать произвольные команды, которые вы найдете в Интернете как root- они были взяты из- qemu-binfmt-conf.shпод типа ARM. Пожалуйста, извлеките команды из этого файла и запустите их.

Скачайте и распакуйте изображение

Перейдите на raspberrypi.org и загрузите нужное изображение. Распакуйте его и сохраните .imgфайл где-нибудь полезным.

$ 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

Найдите правильный раздел

.imgБудет содержать 3 разделов, включая загрузочный раздел.

$ 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

Нам нужно знать смещение раздела Linux, в данном случае это 157696сектора, а загрузочный раздел - в 2048секторах. Каждый сектор составляет 512 байт, поэтому смещение корня составляет 157696*512=80740352байты, а смещение загрузки - 2048*512=1048576.

Смонтировать образ как петлевое устройство

Далее нам нужно смонтировать образ как файловую систему. Это можно сделать с помощью петлевого устройства. Мы используем смещение из предыдущего раздела, чтобы указать, mountкакие разделы монтировать и где. Порядок этих команд важен.

$ 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

Подготовка файловой системы.

Мы почти готовы chrootвойти в нашу файловую систему и начать установку нового программного обеспечения. Во-первых, мы должны установить эмулятор в наш образ, так как он не будет доступен после использования 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/

Все хост-системы

Нам также необходимо предоставить доступ к некоторым другим частям системы.

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

корневой

Мы сделали! chrootпрочь...

$ sudo chroot /mnt

Теперь вы находитесь в вашем Raspberry Pi, но сервисы не работают и т.д. Будьте осторожны, вы root!

Обновление / установка программного обеспечения - Debian Image

Для обновления программного обеспечения мы используем apt-get.

 # apt-get update
 # apt-get upgrade

Вы также можете установить программное обеспечение, apt-get installкак обычно.

Обновление / установка программного обеспечения - Arch Image

Для обновления программного обеспечения мы используем pacman.

 # pacman -Syu

Вы также можете установить программное обеспечение, pacman -Sкак обычно.

ПРИМЕЧАНИЕ. Вы можете работать в pacmanисходном режиме, следуя инструкциям, приведенным в разделе Как запустить нативное pacmanприложение для смонтированного образа? ,

Выход

Вы можете выйти chrootс помощью Ctrl+ Dи размонтировать систему, запустив sudo umount /mnt- вам придется размонтировать каждую точку монтирования отдельно.

Вы должны удалить qemu-user-staticиз /usr/binили qemu-armиз /usr/local/binRPi, тогда изображение готово к перепрошивке.

Заключительные слова

Это немного долго и утомительно, но сделайте это один раз, и вы узнаете много о том, как все это работает!

Обратите внимание на последние изображения

При попытке выполнить это на последних изображениях вы получите ошибку

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

Чтобы исправить эту ошибку, просто закомментируйте содержимое /etc/ld.so.preloadфайла

Легкий путь - piimg

Я начал работать над утилитой, чтобы сделать многое для вас. Он называется piimg и его можно найти по адресу github.com/alexchamberlain/piimg .

Пока он может смонтировать SD-карту для вас, запустив

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

и снова размонтировать их, запустив

piimg umount /mnt

Вам просто нужно установить qemuи chrootпрочь.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ Я, Алекс Чемберлен, являюсь ведущим разработчиком piimg. Как таковой, я могу быть склонен к использованию по piimgотношению к другим методам.

Ссылки

  1. Запуск ARM Linux на вашем настольном ПК: внешний способ chroot

  2. Получение «недопустимой инструкции» при попытке выполнить chroot

Алекс Чемберлен
источник
Так кто-нибудь на самом деле проверял это?
Finnw
@finnw Я думаю, что Jivings уже проверил это.
Алекс Чемберлен
1
Вы также можете использовать sudo kpartx -av rpi_pisces_mate_r1.img, который покажет разделы. Используйте самый большой и установите его, например sudo mount /dev/mapper/loop0p3 /mnt/tmp.
Эльмича
@AlexChamberlain: вы действительно работали на сервере Brightbox? Я успешно проверил это на своем домашнем ПК, но когда я попробовал это на Brightbox, я не смог выполнить chroot, и я хотел, чтобы это было из-за попыток эффективно использовать виртуализацию поверх виртуализации. Конечно, я тоже мог сделать что-то не так, но я подумал, что стоит спросить, прежде чем полностью сдаться! Спасибо за отличный учебник.
DrAl
Можно ли обновить это, чтобы включить как chroot Noobs Distro? Просто для того, чтобы узнать, как
подключиться
0

Вот быстрый сценарий, который я собрал, когда катил его, монтирует первый раздел Linux файла образа. Использование на свой страх и риск. Нет обработки ошибок / проверки ввода

#!/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
Искусство
источник
К сожалению, поскольку все изображения основаны на ARM, вы фактически не можете ничего на них выполнить. Обновлять их немного сложнее ... Возможно, если ваша хост-система основана на подходе.
Фред
-2

Я следовал инструкциям, пытаясь найти способ просто собрать материал для PI через мой основной ПК, оказалось, что это было очень легко, после того, как вы получили chroot, вы можете обрабатывать изображение, как если бы оно было живой системой и использовать все родные приложения. на пи, так что нет необходимости устанавливать кросс-компилятор :)

У меня действительно есть один вопрос, хотя, во время настройки 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, 2-й метод в конце поста работал для меня с модификацией sudo.

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

Очевидно, измените $ MOUNTPOINT на путь вашей точки монтирования chroot (2-й раздел, содержащий rootfs в файле образа, который / mnt в вышеприведенном уроке). Используя этот метод, вы полностью размонтируете файл img из устройств loopback и любых других устройств, которые были подключены через chroot.

cat /proc/mounts |awk '{print $2}'|grep $CHROOTMOUNT |sort -r|xargs sudo umount
sudo umount $CHROOTMOUNT
Реджи
источник
Я не уверен, что это действительно отвечает на вопрос. Вы не описываете, как вы загружаете изображение, или как вы устанавливаете в него программное обеспечение. Также это не место, чтобы задавать новые вопросы.
Jivings
Я использую тот же метод, что и оригинальный ответ «да», который ОП сделал на свой вопрос. Поскольку у меня возникла проблема с размонтированием изображения, это действительно лучшее место для этого вопроса и моего собственного окончательного ответа.
Реджи