Czy można zaktualizować, uaktualnić i zainstalować oprogramowanie przed flashowaniem obrazu?

28

Wydaje się głupie korzystanie z naszych ograniczonych cykli zapisu SD do aktualizacji oprogramowania dostarczonego na obrazach. Czy możemy zaktualizować oprogramowanie i zainstalować nowe oprogramowanie przed flashowaniem obrazu na kartę SD?

Alex Chamberlain
źródło

Odpowiedzi:

31

tak

Odpowiedź zawsze brzmi „tak”, prawda, tylko trochę czasu, aby dowiedzieć się, jak!

Trudna droga

Będę działał na VPS, dostarczonym przez Brightbox.com . Użyłem serwera Nano (2 procesory, 512 MB pamięci RAM, 20 GB miejsca na dysku) i obrazu serwera Ubuntu Precise 12.04 LTS. Powinien działać na ekwiwalentach EC2 lub Linode i oczywiście na domowej maszynie z Linuksem. Przetestowałem to teraz na mojej instalacji (x86) Arch, ale wiem, że nie działa na Ubuntu 10.04 LTS, ponieważ niektóre pakiety są zbyt stare.

Przygotowanie systemu - Debian / Ubuntu

Upewnij się, że twój system jest aktualny.

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

Zainstaluj trochę nowego oprogramowania

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

qemujest emulatorem ARM qemu-user-statici binfmt-supportpozwala nam uruchamiać pliki wykonywalne ARM bez emulacji jądra ARM. (Jakie to jest świetne!?!)

Przygotowanie systemu - Arch

Nie mogę znaleźć statycznie powiązanego qemurepozytorium Arch, więc będziemy musieli skompilować ze źródła.

  1. Pobierz najnowszą wersję ze strony http://git.savannah.gnu.org/cgit/qemu.git
  2. Rozpakuj i uruchom

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

  3. Kompilacja za pomocą makei instalacja za pomocą sudo make install.

  4. Uruchom następujące jako 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

Ostrzeżenie Nie należy uruchamiać dowolnych poleceń, które można znaleźć w trybie online, ponieważ rootzostały one pobrane spod qemu-binfmt-conf.shtypu procesora ARM. Wyodrębnij polecenia z tego pliku i uruchom je.

Pobierz i rozpakuj obraz

Wejdź na raspberrypi.org i pobierz żądany obraz. Rozpakuj go i zapisz .imgplik w przydatnym miejscu.

$ 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

Znajdź odpowiednią partycję

.imgBędzie zawierać 3 partycje, w tym partycji rozruchowej.

$ 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

Musimy znać przesunięcie partycji Linux, w tym przypadku są to 157696sektory i partycja rozruchowa, która znajduje się w 2048sektorach. Każdy sektor ma 512 bajtów, więc offset główny to 157696*512=80740352bajty, a offset rozruchowy to 2048*512=1048576.

Zamontuj obraz jako urządzenie zwrotne

Następnie musimy zamontować obraz jako system plików. Można to zrobić za pomocą urządzenia loopback. Używamy przesunięcia z poprzedniej sekcji, aby powiedzieć, mountktóre partycje należy zamontować i gdzie. Kolejność tych poleceń jest ważna.

$ 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

Przygotowanie systemu plików.

Jesteśmy prawie gotowi do chrootwejścia do naszego systemu plików i rozpoczęcia instalacji nowego oprogramowania. Najpierw musimy zainstalować emulator na naszym obrazie, ponieważ nie będzie on dostępny, gdy go użyjemy 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/

Wszystkie systemy hosta

Musimy również zapewnić dostęp do niektórych innych części systemu.

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

chroot

Skończyliśmy! chrootz dala...

$ sudo chroot /mnt

Jesteś teraz w swoim Raspberry Pi, ale usługi nie działają itp. Bądź ostrożny, jesteś rootem!

Zaktualizuj / zainstaluj oprogramowanie - Obraz Debian

Do aktualizacji oprogramowania używamy apt-get.

 # apt-get update
 # apt-get upgrade

Możesz także zainstalować oprogramowanie, apt-get installjak zwykle.

Zaktualizuj / zainstaluj oprogramowanie - Arch Image

Do aktualizacji oprogramowania używamy pacman.

 # pacman -Syu

Możesz także zainstalować oprogramowanie, pacman -Sjak zwykle.

UWAGA Możesz uruchomić pacmannatywnie, postępując zgodnie z instrukcjami w jaki sposób uruchomić mój natywny pacmanna zamontowanym obrazie? .

Wyjście

Możesz wyjść z chrootniego używając Ctrl+ Di odmontować system, uruchamiając sudo umount /mnt- będziesz musiał odmontować każdy punkt montowania osobno.

Powinieneś usunąć qemu-user-staticz /usr/binlub qemu-armz /usr/local/binRPi, wtedy obraz jest gotowy do flashowania.

Ostatnie słowa

Jest to trochę długie i żmudne, ale zrób to raz, a dowiesz się, jak to wszystko działa!

Uwaga na najnowsze zdjęcia

Podczas próby uruchomienia wykonaj to na najnowszych obrazach, pojawi się błąd

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

Aby naprawić ten błąd, po prostu skomentuj zawartość /etc/ld.so.preloadpliku

Łatwa droga - piimg

Rozpocząłem pracę nad narzędziem do robienia dużo z tego dla ciebie. Nazywa się piimg i można go znaleźć na stronie github.com/alexchamberlain/piimg .

Do tej pory można zamontować kartę SD, uruchamiając

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

i odmontuj je ponownie, uruchamiając

piimg umount /mnt

Musisz tylko zainstalować qemui chrootodejść.

ZASTRZEŻENIE I, Alex Chamberlain, jestem głównym programistą piimg. Jako taki, mogę być skłonny do stosowania piimgw stosunku do innych metod.

Referencje

  1. Uruchamianie ARM Linux na komputerze stacjonarnym: obcy sposób chroot

  2. Otrzymywanie „nielegalnych instrukcji” podczas próby chroot

Alex Chamberlain
źródło
Czy ktoś faktycznie to przetestował?
finnw
@finnw Myślę, że Jivings przetestował to teraz.
Alex Chamberlain,
1
Możesz także użyć sudo kpartx -av rpi_pisces_mate_r1.img, który pokaże partycje. Użyj największego i zamontuj go, np sudo mount /dev/mapper/loop0p3 /mnt/tmp.
elmicha
@AlexChamberlain: czy faktycznie działało to na serwerze Brightbox? Z powodzeniem przetestowałem to na moim domowym komputerze, ale kiedy wypróbowałem to na Brightbox, nie mogłem chrootować i chciałem, jeśli to dlatego, że próbowałem skutecznie uzyskać wirtualizację oprócz wirtualizacji. Oczywiście mogłem również zrobić coś złego, ale pomyślałem, że warto zapytać przed całkowitym poddaniem się! Dzięki za wspaniały tutorial.
DrAl
Czy można to zaktualizować, aby uwzględnić sposób chrootowania Noobs Distro? Tylko po to, by nauczyć się chrootować w takiej dystrybucji
Suhaib
0

Oto szybki skrypt, który przygotowałem podczas uruchamiania, montuje pierwszą partycję Linux pliku obrazu Użyj na własne ryzyko. Nie ma obsługi błędów / sprawdzania poprawności danych wejściowych

#!/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
Sztuka
źródło
Niestety, ponieważ wszystkie obrazy są oparte na architekturze ARM, nie można tak naprawdę wykonać na nich niczego bezpośrednio. Ich aktualizacja jest nieco trudniejsza ... Może to być możliwe, jeśli system hosta jest oparty na systemie apt.
Fred
-2

Postępowałem zgodnie z instrukcjami, szukając metody, aby po prostu zbudować rzeczy dla PI za pomocą mojego głównego komputera, okazuje się, że było to bardzo łatwe, gdy jesteś chrootowany, możesz potraktować obraz tak, jakby był to system na żywo i użyć wszystkich aplikacje natywne. na pi, więc nie trzeba instalować kompilatora krzyżowego :)

Mam jednak jedno pytanie, podczas konfiguracji chroot musimy zamontować niektóre partycje, aby chroot działał poprawnie:

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

Jak prawidłowo je odmontować? pozostawiając je zamontowane, co powstrzymuje cię przed odmontowaniem pliku .img, każda pomoc tutaj byłaby mile widziana. Wypróbowałem opcję -f, nie jestem pewien, czy zamontowano coś jeszcze.

odpowiadając na moje pytanie, https://bugzilla.redhat.com/show_bug.cgi?id=194342 druga metoda na końcu postu działała dla mnie z modyfikacją sudo.

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

Oczywiście zmień $ MOUNTPOINT na ścieżkę punktu montowania chroot (druga partycja zawierająca pliki rootfs w pliku obrazu, która jest / mnt w powyższym samouczku). Za pomocą tej metody całkowicie odmontujesz plik img z urządzeń sprzężenia zwrotnego i wszelkich innych urządzeń, które zostały zamontowane za pośrednictwem chroot.

cat /proc/mounts |awk '{print $2}'|grep $CHROOTMOUNT |sort -r|xargs sudo umount
sudo umount $CHROOTMOUNT
Reggie
źródło
Nie jestem pewien, czy to naprawdę odpowiada na pytanie. Nie opisujesz, jak chrootujesz się na obrazie, ani jak instalujesz w nim oprogramowanie. Również tutaj nie można zadawać nowych pytań.
Jivings
Używam tej samej metody, co oryginalna odpowiedź tak, którą OP udzielił na swoje pytanie. Ponieważ miałem problem z odmontowaniem obrazu, jest to naprawdę najlepsze miejsce na to pytanie i moją własną odpowiedź.
Reggie