Có vẻ ngớ ngẩn khi sử dụng chu kỳ ghi SD giới hạn của chúng tôi để nâng cấp phần mềm được cung cấp trên hình ảnh. Chúng ta có thể nâng cấp phần mềm và cài đặt phần mềm mới trước khi flash hình ảnh vào thẻ SD không?
Có vẻ ngớ ngẩn khi sử dụng chu kỳ ghi SD giới hạn của chúng tôi để nâng cấp phần mềm được cung cấp trên hình ảnh. Chúng ta có thể nâng cấp phần mềm và cài đặt phần mềm mới trước khi flash hình ảnh vào thẻ SD không?
Câu trả lời:
Câu trả lời luôn luôn là có, đúng, chỉ mất một lúc để tìm ra cách!
Tôi sẽ chạy cái này trên VPS, được cung cấp bởi Brightbox.com . Tôi đã sử dụng Máy chủ Nano (2 CPU, RAM 512 MB, dung lượng ổ đĩa 20 GB) và hình ảnh máy chủ Ubuntu Precise 12.04 LTS. Nó nên hoạt động trên các tương đương của EC2 hoặc Linode, và tất nhiên, trên máy Linux tại nhà của bạn. Bây giờ tôi đã thử nghiệm nó trên bản cài đặt Arch (x86) của mình, nhưng biết rằng nó không hoạt động trên Ubuntu 10.04 LTS vì một số gói quá cũ.
Đảm bảo hệ thống của riêng bạn được cập nhật.
$ sudo apt-get update
$ sudo apt-get upgrade
Cài đặt một số phần mềm mới
$ sudo apt-get install binfmt-support qemu qemu-user-static unzip
qemu
là một trình giả lập ARM qemu-user-static
và binfmt-support
cho phép chúng tôi chạy các tệp thực thi ARM mà không cần mô phỏng nhân ARM. (Thật tuyệt làm sao!?!)
Tôi không thể tìm thấy một liên kết tĩnh qemu
trong kho Arch, vì vậy chúng tôi sẽ phải biên dịch từ nguồn.
Giải nén và chạy
./configure --disable-kvm --target-list=arm-linux-user --static
Xây dựng bằng cách sử dụng make
và cài đặt bằng cách sử dụng sudo make install
.
Chạy như sau 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
Cảnh báo Bạn không nên chạy các lệnh tùy ý mà bạn tìm thấy trực tuyến
root
- những lệnh này được lấy từqemu-binfmt-conf.sh
loại cpu ARM. Vui lòng trích xuất các lệnh từ tệp này và chạy chúng.
Tới raspberrypi.org và tải hình ảnh mà bạn muốn. Giải nén nó và lưu .img
tập tin ở đâu đó hữu ích.
$ 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
Các .img
sẽ chứa 3 phân vùng, bao gồm các phân vùng khởi động.
$ 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
Chúng ta cần biết phần bù của phân vùng Linux, trong trường hợp này là các 157696
sector và phân vùng khởi động, nằm ở các 2048
sector. Mỗi sector là 512 byte, do đó phần bù gốc là 157696*512=80740352
byte và phần bù khởi động là 2048*512=1048576
.
Tiếp theo, chúng ta cần gắn hình ảnh như một hệ thống tập tin. Điều này có thể được thực hiện bằng cách sử dụng một thiết bị loopback. Chúng tôi sử dụng phần bù từ phần trước để cho biết mount
phân vùng nào sẽ được gắn và vị trí. Thứ tự của các lệnh này là quan trọng.
$ 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
Chúng tôi gần như đã sẵn sàng để chroot
vào hệ thống tệp của chúng tôi và bắt đầu cài đặt phần mềm mới. Đầu tiên, chúng ta phải cài đặt trình giả lập vào hình ảnh của mình, vì nó sẽ không khả dụng khi chúng ta sử dụng chroot
.
$ sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/
$ sudo cp /usr/local/bin/qemu-arm /mnt/usr/local/bin/
Chúng tôi cũng cần cung cấp quyền truy cập vào một số phần khác của hệ thống.
$ sudo mount --rbind /dev /mnt/dev
$ sudo mount -t proc none /mnt/proc
$ sudo mount -o bind /sys /mnt/sys
Chúng ta xong rồi! chroot
xa...
$ sudo chroot /mnt
Bây giờ bạn đang ở trong Raspberry Pi, nhưng các dịch vụ không chạy, v.v. Hãy cẩn thận, bạn đã root!
Để cập nhật phần mềm, chúng tôi sử dụng apt-get
.
# apt-get update
# apt-get upgrade
Bạn cũng có thể cài đặt phần mềm bằng cách sử dụng apt-get install
như bình thường.
Để cập nhật phần mềm, chúng tôi sử dụng pacman
.
# pacman -Syu
Bạn cũng có thể cài đặt phần mềm bằng cách sử dụng pacman -S
như bình thường.
LƯU Ý Bạn có thể chạy
pacman
tự nhiên bằng cách làm theo các hướng dẫn về Làm cách nào để chạy bản địa của tôipacman
dựa trên hình ảnh được gắn? .
Bạn có thể thoát khỏi chroot
bằng cách sử dụng Ctrl+ Dvà ngắt kết nối hệ thống bằng cách chạy sudo umount /mnt
- bạn sẽ phải ngắt kết nối từng điểm gắn kết riêng biệt ..
Bạn nên xóa qemu-user-static
khỏi /usr/bin
hoặc qemu-arm
từ /usr/local/bin
trên RPi, sau đó hình ảnh đã sẵn sàng để được flash.
Điều này hơi dài và tẻ nhạt, nhưng hãy thực hiện một lần và bạn sẽ học được rất nhiều về cách thức hoạt động của tất cả!
Khi cố gắng chạy làm điều này trên các hình ảnh mới nhất, bạn sẽ gặp lỗi
qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Illegal instruction (core dumped)
Để khắc phục lỗi này, chỉ cần nhận xét nội dung của /etc/ld.so.preload
tệp
piimg
Tôi đã bắt đầu làm việc trên một tiện ích để làm rất nhiều thứ này cho bạn. Nó được gọi là piimg và có thể được tìm thấy tại github.com/alexchamberlain/piimg .
Cho đến nay, nó có thể gắn thẻ SD cho bạn bằng cách chạy
piimg mount /images/debian-squeeze/debian6-19-04-2012/debian6-19-04-2012.img /mnt
và ngắt kết nối chúng một lần nữa bằng cách chạy
piimg umount /mnt
Bạn chỉ cần cài đặt qemu
và chroot
đi.
TUYÊN BỐ TỪ CHỐI I, Alex Chamberlain, là nhà phát triển chính của
piimg
. Như vậy, tôi có thể thiên vị đối với việc sử dụngpiimg
liên quan đến các phương pháp khác.
sudo kpartx -av rpi_pisces_mate_r1.img
, sẽ hiển thị các phân vùng. Sử dụng cái lớn nhất và gắn kết nó, ví dụ sudo mount /dev/mapper/loop0p3 /mnt/tmp
.
Đây là một đoạn script nhanh mà tôi ghép lại khi tôi cuộn nó gắn phân vùng Linux đầu tiên của một tệp hình ảnh Sử dụng có nguy cơ của riêng bạn. Nó không có xử lý lỗi / xác nhận đầu vào
#!/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
Tôi đã làm theo các hướng dẫn tìm kiếm một phương pháp để xây dựng công cụ cho PI thông qua PC chính của mình, hóa ra nó rất dễ dàng, một khi bạn bị chê bạn có thể coi hình ảnh như thể nó là một hệ thống sống và sử dụng tất cả ứng dụng gốc. trên teh pi, vì vậy không cần phải cài đặt trình biên dịch chéo :)
Tôi có một câu hỏi mặc dù, trong quá trình thiết lập chroot, chúng ta phải gắn một số phân vùng để chroot hoạt động chính xác:
$ sudo mount --rbind /dev /mnt/dev
$ sudo mount -t proc none /mnt/proc
$ sudo mount -o bind /sys /mnt/sys
Làm thế nào để chúng ta tháo gỡ những điều này đúng? để chúng được gắn kết, khiến bạn không thể ngắt tập tin .img, bất kỳ trợ giúp nào ở đây sẽ được đánh giá cao. Tôi đã thử tùy chọn -f, không chắc có cái gì khác bên dưới được gắn kết không.
trả lời câu hỏi của riêng tôi, https://ormszilla.redhat.com/show_orms.cgi?id=194342 phương pháp thứ 2 ở cuối bài làm việc với tôi với một sửa đổi sudo.
cat /proc/mounts | awk '{print $2}' | grep "^$MOUNTPOINT" | sort -r | xargs sudo umount
Rõ ràng thay đổi $ MOUNTPOINT thành đường dẫn của điểm gắn kết chroot của bạn (phân vùng thứ 2 chứa rootfs trên tệp hình ảnh, đó là / mnt trong hướng dẫn ở trên). Sử dụng phương pháp này, bạn hoàn toàn ngắt kết nối tệp img khỏi các thiết bị loopback và bất kỳ thiết bị nào khác được gắn thông qua chroot.
cat /proc/mounts |awk '{print $2}'|grep $CHROOTMOUNT |sort -r|xargs sudo umount
sudo umount $CHROOTMOUNT