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?
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?
Odpowiedzi:
Odpowiedź zawsze brzmi „tak”, prawda, tylko trochę czasu, aby dowiedzieć się, jak!
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.
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
qemu
jest emulatorem ARM qemu-user-static
i binfmt-support
pozwala nam uruchamiać pliki wykonywalne ARM bez emulacji jądra ARM. (Jakie to jest świetne!?!)
Nie mogę znaleźć statycznie powiązanego qemu
repozytorium Arch, więc będziemy musieli skompilować ze źródła.
Rozpakuj i uruchom
./configure --disable-kvm --target-list=arm-linux-user --static
Kompilacja za pomocą make
i instalacja za pomocą sudo make install
.
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ż
root
zostały one pobrane spodqemu-binfmt-conf.sh
typu procesora ARM. Wyodrębnij polecenia z tego pliku i uruchom je.
Wejdź na raspberrypi.org i pobierz żądany obraz. Rozpakuj go i zapisz .img
plik 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
.img
Bę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 157696
sektory i partycja rozruchowa, która znajduje się w 2048
sektorach. Każdy sektor ma 512 bajtów, więc offset główny to 157696*512=80740352
bajty, a offset rozruchowy to 2048*512=1048576
.
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ć, mount
któ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
Jesteśmy prawie gotowi do chroot
wejś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
.
$ sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/
$ sudo cp /usr/local/bin/qemu-arm /mnt/usr/local/bin/
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
Skończyliśmy! chroot
z dala...
$ sudo chroot /mnt
Jesteś teraz w swoim Raspberry Pi, ale usługi nie działają itp. Bądź ostrożny, jesteś rootem!
Do aktualizacji oprogramowania używamy apt-get
.
# apt-get update
# apt-get upgrade
Możesz także zainstalować oprogramowanie, apt-get install
jak zwykle.
Do aktualizacji oprogramowania używamy pacman
.
# pacman -Syu
Możesz także zainstalować oprogramowanie, pacman -S
jak zwykle.
UWAGA Możesz uruchomić
pacman
natywnie, postępując zgodnie z instrukcjami w jaki sposób uruchomić mój natywnypacman
na zamontowanym obrazie? .
Możesz wyjść z chroot
niego 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-static
z /usr/bin
lub qemu-arm
z /usr/local/bin
RPi, wtedy obraz jest gotowy do flashowania.
Jest to trochę długie i żmudne, ale zrób to raz, a dowiesz się, jak to wszystko działa!
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.preload
pliku
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ć qemu
i chroot
odejść.
ZASTRZEŻENIE I, Alex Chamberlain, jestem głównym programistą
piimg
. Jako taki, mogę być skłonny do stosowaniapiimg
w stosunku do innych metod.
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
.
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
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