Apakah mungkin untuk memperbarui, meningkatkan, dan menginstal perangkat lunak sebelum mem-flash sebuah gambar?

28

Tampaknya konyol untuk menggunakan siklus tulis SD terbatas kami untuk memutakhirkan perangkat lunak yang dikirimkan pada gambar. Bisakah kita meningkatkan perangkat lunak dan menginstal perangkat lunak baru sebelum mem-flash sebuah gambar ke kartu SD?

Alex Chamberlain
sumber

Jawaban:

31

iya nih

Jawabannya selalu ya, benar, hanya perlu beberapa saat untuk mengetahui caranya!

Jalan yang Keras

Saya akan menjalankan ini pada VPS, yang disediakan oleh Brightbox.com . Saya menggunakan Nano Server (2 CPU, RAM 512MB, ruang disk 20GB) dan gambar server Precise 12,04 LTS Ubuntu. Ini harus bekerja pada EC2 atau setara Linode, dan tentu saja, pada mesin Linux di rumah Anda. Saya sekarang telah mengujinya pada instalasi Arch (x86) saya, tetapi saya tahu itu tidak berfungsi pada Ubuntu 10,04 LTS karena beberapa paket terlalu tua.

Mempersiapkan sistem Anda - Debian / Ubuntu

Pastikan sistem Anda sendiri terkini.

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

Instal beberapa perangkat lunak baru

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

qemuadalah emulator ARM, dan qemu-user-staticdan binfmt-supportmemungkinkan kita untuk menjalankan executable ARM tanpa meniru kernel ARM. (Betapa kerennya itu!?!)

Mempersiapkan sistem Anda - Lengkungan

Saya tidak dapat menemukan yang terhubung secara statis qemudi repositori Arch, jadi kita harus mengkompilasi dari sumber.

  1. Unduh rilis terbaru dari http://git.savannah.gnu.org/cgit/qemu.git
  2. Buka zip dan jalankan

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

  3. Bangun menggunakan makedan menginstal menggunakan sudo make install.

  4. Jalankan berikut ini sebagai 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

Peringatan Anda tidak boleh menjalankan perintah sewenang-wenang yang Anda temukan online root- ini diambil dari qemu-binfmt-conf.shjenis cpu ARM. Silakan ekstrak perintah dari file ini dan jalankan.

Unduh dan hapus zip gambar

Buka raspberrypi.org dan unduh gambar yang Anda inginkan. Buka .imgzip dan simpan file di tempat yang berguna.

$ 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

Temukan partisi yang benar

The .imgakan berisi 3 partisi, termasuk partisi boot.

$ 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

Kita perlu mengetahui offset dari partisi Linux, dalam hal ini adalah 157696sektor, dan partisi boot, yang ada di 2048sektor. Setiap sektor adalah 512 byte, jadi offset akar adalah 157696*512=80740352byte dan boot offset adalah 2048*512=1048576.

Pasang gambar sebagai perangkat loopback

Selanjutnya, kita perlu me-mount gambar sebagai sistem file. Ini dapat dilakukan dengan menggunakan perangkat loopback. Kami menggunakan offset dari bagian sebelumnya untuk memberi tahu mountpartisi mana yang akan dipasang dan di mana. Urutan perintah ini penting.

$ 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

Mempersiapkan sistem file.

Kami hampir siap untuk chrootmemasuki sistem file kami dan mulai menginstal perangkat lunak baru. Pertama, kita harus menginstal emulator ke dalam gambar kita, karena itu tidak akan tersedia setelah kita gunakan 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/

Semua sistem host

Kita juga perlu menyediakan akses ke bagian lain dari sistem.

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

chroot

Kita sudah selesai! chrootjauh...

$ sudo chroot /mnt

Anda sekarang berada di Raspberry Pi Anda, tetapi layanannya tidak berjalan dll. Hati-hati, Anda root!

Perbarui / Instal perangkat lunak - Debian Image

Untuk memperbarui perangkat lunak, kami menggunakan apt-get.

 # apt-get update
 # apt-get upgrade

Anda juga dapat menginstal perangkat lunak menggunakan apt-get installseperti biasa.

Perbarui / Instal perangkat lunak - Gambar Lengkungan

Untuk memperbarui perangkat lunak, kami menggunakan pacman.

 # pacman -Syu

Anda juga dapat menginstal perangkat lunak menggunakan pacman -Sseperti biasa.

CATATAN Anda dapat menjalankan pacmansecara asli dengan mengikuti instruksi pada Bagaimana cara menjalankan asli saya pacmanterhadap gambar yang dipasang? .

Keluar

Anda dapat keluar chrootdengan menggunakan Ctrl+ Ddan meng-unmount sistem dengan menjalankansudo umount /mnt - Anda harus meng-unmount setiap titik pemasangan secara terpisah ..

Anda harus menghapus qemu-user-staticdari /usr/binatau qemu-armdari/usr/local/bin pada RPi, maka gambar siap untuk di-flash.

Kata-kata terakhir

Ini agak panjang dan membosankan, tetapi lakukan sekali dan Anda akan belajar banyak tentang bagaimana ini semua bekerja!

Perhatikan pada gambar terbaru

Saat mencoba menjalankan lakukan ini pada gambar terbaru, Anda akan mendapatkan kesalahan

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

Untuk memperbaiki kesalahan ini, cukup komentari isi /etc/ld.so.preloadfile

Cara Mudah - piimg

Saya sudah mulai mengerjakan utilitas untuk melakukan banyak hal untuk Anda. Ini disebut piimg dan dapat ditemukan di github.com/alexchamberlain/piimg .

Sejauh ini, ia dapat memasang kartu SD untuk Anda dengan menjalankan

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

dan unmount mereka lagi dengan menjalankan

piimg umount /mnt

Anda hanya perlu menginstal qemudan chrootpergi.

PENOLAKAN Saya, Alex Chamberlain, adalah pengembang utama piimg. Karena itu, saya mungkin bias terhadap penggunaan piimgdalam kaitannya dengan metode lain.

Referensi

  1. Menjalankan ARM Linux di PC desktop Anda: Cara chroot asing

  2. Mendapatkan 'instruksi ilegal' ketika mencoba chroot

Alex Chamberlain
sumber
Jadi, adakah yang benar-benar menguji ini?
finnw
@finnw, saya pikir Jivings sekarang telah menguji ini.
Alex Chamberlain
1
Anda juga dapat menggunakan sudo kpartx -av rpi_pisces_mate_r1.img, yang akan menampilkan partisi. Gunakan yang terbesar dan pasang, mis sudo mount /dev/mapper/loop0p3 /mnt/tmp.
elmicha
@AlexChamberlain: apakah Anda benar-benar mengaktifkan ini di server Brightbox? Saya telah berhasil menguji ini di PC rumah saya tetapi ketika saya mencobanya di Brightbox saya tidak bisa chroot dan saya ingin jika itu karena mencoba secara efektif mendapatkan virtualisasi di atas virtualisasi. Tentu saja saya mungkin telah melakukan sesuatu yang salah juga, tetapi saya pikir itu layak untuk ditanyakan sebelum benar-benar menyerah! Terima kasih untuk tutorialnya.
DrAl
Apakah mungkin untuk memperbarui ini untuk memasukkan cara chroot Noobs Distro? Demi mempelajari cara chroot menjadi distro seperti itu
Suhaib
0

Di sini, skrip cepat yang saya kumpulkan saat saya menggulirkannya untuk memasang partisi Linux pertama dari sebuah file gambar. Gunakan dengan risiko Anda sendiri. Ini tidak memiliki kesalahan penanganan / validasi input

#!/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
Seni
sumber
Sayangnya karena semua gambar berbasis ARM, Anda tidak dapat benar-benar mengeksekusi apapun secara langsung. Mendapatkan mereka diperbarui adalah sedikit lebih rumit ... Mungkin dimungkinkan jika sistem host Anda berbasis apt.
Fred
-2

Saya mengikuti instruksi mencari metode untuk hanya membangun barang-barang untuk PI melalui PC utama saya, ternyata itu sangat mudah, setelah Anda chroot Anda dapat memperlakukan gambar seolah-olah itu adalah sistem hidup dan menggunakan semua aplikasi asli. pada teh pi, jadi tidak perlu menginstal kompiler silang :)

Saya punya satu pertanyaan, selama setup chroot, kita harus me-mount beberapa partisi agar chroot berfungsi dengan baik:

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

Bagaimana kita melepas ini dengan benar? meninggalkan mereka terpasang, yang menghentikan Anda dari unmount file .img, bantuan apa pun di sini akan dihargai. Saya mencoba opsi -f, tidak yakin apakah ada sesuatu yang mendasarinya yang sudah terpasang.

menjawab pertanyaan saya sendiri, https://bugzilla.redhat.com/show_bug.cgi?id=194342 metode ke-2 di akhir posting bekerja untuk saya dengan modifikasi sudo.

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

Jelas mengubah $ MOUNTPOINT ke jalur chroot mount point Anda (partisi ke-2 yang berisi rootfs pada file gambar, yang / mnt dalam tutorial di atas). Dengan menggunakan metode ini, Anda sepenuhnya meng-unmount file img dari perangkat loopback dan perangkat lain yang dipasang melalui chroot.

cat /proc/mounts |awk '{print $2}'|grep $CHROOTMOUNT |sort -r|xargs sudo umount
sudo umount $CHROOTMOUNT
Reggie
sumber
Saya tidak yakin ini benar-benar menjawab pertanyaan. Anda tidak menjelaskan bagaimana Anda chroot ke dalam gambar, atau bagaimana Anda menginstal perangkat lunak ke dalamnya. Juga ini bukan tempat untuk mengajukan pertanyaan baru.
Jivings
Saya menggunakan metode yang sama dengan jawaban ya asli yang dibuat OP untuk pertanyaannya. Karena saya mengalami masalah saat melepas gambar, ini benar-benar tempat terbaik untuk pertanyaan itu dan jawaban akhirnya saya sendiri.
Reggie