เป็นไปได้หรือไม่ที่จะอัปเดตอัพเกรดและติดตั้งซอฟต์แวร์ก่อนที่จะกระพริบรูปภาพ?


28

ดูเหมือนว่าโง่ที่จะใช้วงจรการเขียนแบบ SD ที่ จำกัด ของเราเพื่ออัปเกรดซอฟต์แวร์ที่จัดส่งในภาพ เราสามารถอัพเกรดซอฟต์แวร์และติดตั้งซอฟต์แวร์ใหม่ก่อนที่จะกระพริบรูปภาพเป็นการ์ด SD ได้หรือไม่?

คำตอบ:


31

ใช่

คำตอบคือใช่ถูกต้องใช้เวลาสักครู่เพื่อหาวิธี!

วิธีที่ยาก

ฉันจะทำงานนี้บน VPS ให้โดยBrightbox.com ฉันใช้เซิร์ฟเวอร์นาโน (CPU 2 ตัว, RAM 512MB, พื้นที่ดิสก์ 20GB) และอิมเมจเซิร์ฟเวอร์ Ubuntu Precise 12.04 LTS มันควรจะทำงานกับ EC2 หรือเทียบเท่าของ Linode และแน่นอนในเครื่อง Linux ที่บ้านของคุณ ตอนนี้ฉันได้ทำการทดสอบในการติดตั้ง Arch (x86) ของฉันแล้ว แต่รู้ว่ามันใช้งานไม่ได้กับ 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. สร้างใช้และติดตั้งโดยใช้makesudo 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=807403522048*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

เราทำเสร็จแล้ว! chrootออกไป ...

$ sudo chroot /mnt

ตอนนี้คุณอยู่ใน Raspberry Pi ของคุณแล้ว แต่บริการยังไม่เปิดทำงานระวังตัวด้วย!

อัปเดต / ติดตั้งซอฟต์แวร์ - ภาพ Debian

apt-getการอัปเดตซอฟต์แวร์ที่เราใช้

 # apt-get update
 # apt-get upgrade

คุณยังสามารถติดตั้งซอฟต์แวร์โดยใช้apt-get installตามปกติ

อัปเดต / ติดตั้งซอฟต์แวร์ - Arch Image

pacmanการอัปเดตซอฟต์แวร์ที่เราใช้

 # pacman -Syu

คุณยังสามารถติดตั้งซอฟต์แวร์โดยใช้pacman -Sตามปกติ

หมายเหตุคุณสามารถใช้งานpacmanได้ตามปกติโดยทำตามคำแนะนำในฉันจะเรียกใช้ Native ของฉันpacmanกับภาพที่ติดตั้งได้อย่างไร .

ออกจาก

คุณสามารถออกจากchrootโดยใช้Ctrl+ Dและยกเลิกการต่อเชื่อมระบบโดยเรียกใช้sudo umount /mnt- คุณจะต้องยกเลิกการต่อเชื่อมจุดเชื่อมต่อแต่ละจุดแยกกัน ..

คุณควรลบออกqemu-user-staticจาก/usr/binหรือqemu-armจาก/usr/local/binบน RPi จากนั้นภาพพร้อมที่จะแฟลช

คำพูดสุดท้าย

นี่เป็นเวลานานและน่าเบื่อ แต่ทำครั้งเดียวแล้วคุณจะได้เรียนรู้มากมายเกี่ยวกับวิธีการทำงานทั้งหมดนี้!

หมายเหตุเกี่ยวกับภาพล่าสุด

เมื่อพยายามเรียกใช้ทำตามภาพล่าสุดคุณจะได้รับข้อผิดพลาด

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ออกไป

การปฏิเสธความรับผิดฉัน, อเล็กซ์แชมเบอร์เลน am piimgนักพัฒนานำของ ดังนั้นฉันอาจจะลำเอียงต่อการใช้งานที่piimgเกี่ยวข้องกับวิธีการอื่น

อ้างอิง

  1. การรัน ARM Linux บนเดสก์ท็อปพีซีของคุณ: วิธีแปลกปลอม

  2. รับ 'คำสั่งที่ผิดกฎหมาย' เมื่อพยายาม chroot


มีใครทดสอบสิ่งนี้จริงเหรอ?
finnw

@finnw ฉันคิดว่า Jivings ได้ทำการทดสอบแล้ว
Alex Chamberlain

1
นอกจากนี้คุณยังสามารถใช้sudo kpartx -av rpi_pisces_mate_r1.imgซึ่งจะแสดงพาร์ทิชัน sudo mount /dev/mapper/loop0p3 /mnt/tmpใช้หนึ่งที่ใหญ่ที่สุดและติดมันเช่น
elmicha

@AlexChamberlain: คุณใช้งาน Brightbox server ได้จริงหรือเปล่า ฉันทดสอบสิ่งนี้บนพีซีที่บ้านของฉันสำเร็จแล้ว แต่เมื่อฉันลองใช้ Brightbox ฉันไม่สามารถ chroot ได้และฉันต้องการถ้านั่นเป็นเพราะการพยายามทำให้ virtualisation อยู่บน virtualisation อย่างมีประสิทธิภาพ แน่นอนฉันอาจทำสิ่งผิดปกติเช่นกัน แต่ฉันคิดว่ามันคุ้มค่าที่จะสอบถามก่อนที่จะยอมแพ้อย่างสมบูรณ์! ขอบคุณสำหรับการสอนที่ยอดเยี่ยม
DrAl

เป็นไปได้ไหมที่จะอัพเดทสิ่งนี้เพื่อรวมวิธีการ chroot Noobs Distro? เพียงเพื่อการเรียนรู้วิธีการ chroot เป็น distro ดังกล่าว
Suhaib

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 ทั้งหมดคุณไม่สามารถดำเนินการใด ๆ กับภาพเหล่านั้นได้โดยตรง การทำให้พวกเขาได้รับการอัปเดตเป็นเรื่องหลอกลวงเล็กน้อย ... อาจเป็นไปได้หากระบบโฮสต์ของคุณใช้งานได้ดี
Fred

-2

ฉันทำตามคำแนะนำที่กำลังมองหาวิธีการเพียงแค่สร้างสิ่งต่าง ๆ สำหรับ PI ผ่านทางพีซีหลักของฉันมันกลับกลายเป็นว่าง่ายมากเมื่อคุณ chrooted คุณสามารถปฏิบัติต่อภาพราวกับว่ามันเป็นระบบจริงและใช้ทั้งหมดของ แอพเนทีฟ บน teh pi ดังนั้นไม่จำเป็นต้องติดตั้ง cross compiler :)

ฉันมีคำถามหนึ่งข้อในระหว่างการตั้งค่า 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 ของคุณ (พาร์ติชั่นที่สองมี rootfs ในไฟล์ภาพซึ่งเป็น / mnt ในบทช่วยสอนด้านบน) การใช้วิธีการนี้คุณเลิกเมานท์ไฟล์ img จากอุปกรณ์ลูปแบ็คและอุปกรณ์อื่น ๆ ที่ติดตั้งผ่าน chroot

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

ฉันไม่แน่ใจว่านี่เป็นคำตอบที่แท้จริง คุณไม่ได้อธิบายว่าคุณกำลัง chrooting ภาพหรือวิธีการติดตั้งซอฟต์แวร์ลงในภาพ นอกจากนี้ที่นี่ไม่ใช่ที่สำหรับถามคำถามใหม่
Jivings

ฉันใช้วิธีการเดียวกันกับคำตอบเดิมที่ใช่ที่ OP ทำกับคำถามของเขา เนื่องจากฉันมีปัญหาในการยกเลิกการต่อเชื่อมรูปภาพนี่เป็นสถานที่ที่ดีที่สุดสำหรับคำถามนั้นและคำตอบสุดท้ายของฉัน
Reggie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.