限られたSD書き込みサイクルを使用して、イメージで出荷されるソフトウェアをアップグレードするのはばかげているようです。イメージをSDカードにフラッシュする前に、ソフトウェアをアップグレードして新しいソフトウェアをインストールできますか?
限られたSD書き込みサイクルを使用して、イメージで出荷されるソフトウェアをアップグレードするのはばかげているようです。イメージをSDカードにフラッシュする前に、ソフトウェアをアップグレードして新しいソフトウェアをインストールできますか?
回答:
答えは常に「はい」です。正しい方法を見つけるには少し時間がかかります。
Brightbox.comが提供するVPSでこれを実行します。Nano Server(2 CPU、512MB RAM、20GBディスク容量)とUbuntu Precise 12.04 LTSサーバーイメージを使用しました。EC2またはLinodeの同等物、そしてもちろん、ご使用のLinuxマシンで動作するはずです。(x86)Archインストールでテストしましたが、一部のパッケージが古すぎるため、Ubuntu 10.04 LTSでは機能しないことがわかっています。
独自のシステムが最新であることを確認してください。
$ 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の実行可能ファイルを実行することができます。(なんてかっこいい!?!)
qemu
Archリポジトリに静的にリンクされたものが見つからないため、ソースからコンパイルする必要があります。
解凍して実行
./configure --disable-kvm --target-list=arm-linux-user --static
を使用make
してビルドし、を使用してインストールしsudo make install
ます。
以下を実行します 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 cpuタイプの下から取得されました。このファイルからコマンドを抽出して実行してください。
移動し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=80740352
バイトで、ブートオフセットは2048*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
。これは、一度使用すると使用できなくなるためです。
$ sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/
$ 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
離れて...
$ sudo chroot /mnt
これでRaspberry Piにいますが、サービスは実行されていませんなど。注意してください、あなたはrootです!
ソフトウェアを更新するには、を使用しますapt-get
。
# apt-get update
# apt-get upgrade
apt-get install
通常どおりにソフトウェアをインストールすることもできます。
ソフトウェアを更新するには、を使用しますpacman
。
# pacman -Syu
pacman -S
通常どおりにソフトウェアをインストールすることもできます。
注マウントされたイメージに対してネイティブを実行するにはどうすればよいですか?
pacman
の手順に従ってネイティブで実行できますか?。pacman
+ をchroot
使用して終了し、実行してシステムをアンマウントできます。各マウントポイントを個別にアンマウントする必要があります。CtrlDsudo umount /mnt
RPi qemu-user-static
から、/usr/bin
またはRPi qemu-arm
から削除する必要/usr/local/bin
があります。これで、イメージをフラッシュする準備が整います。
これは少し長くて面倒ですが、一度やってみると、これがどのように機能するかについて多くを学ぶことができます!
最新の画像でこれを実行しようとすると、エラーが発生します
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
て離れる必要があります。
免責事項アレックスチェンバレンは、の主任開発者です
piimg
。そのため、私はpiimg
他の方法との関連での使用に偏っているかもしれません。
sudo kpartx -av rpi_pisces_mate_r1.img
、パーティションを表示することもできます。最大のものを使用してマウントしsudo mount /dev/mapper/loop0p3 /mnt/tmp
ます。
ここで、私がイメージファイルの最初の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
メインPCを介してPI向けのものだけをビルドする方法を探して指示に従いましたが、非常に簡単でした。chrootしたら、イメージをライブシステムのように扱い、すべてを使用することができます。ネイティブアプリ。piでは、クロスコンパイラをインストールする必要はありません:)
ただし、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マウントポイント(上記のチュートリアルでは/ mntであるイメージファイルのrootfsを含む2番目のパーティション)のパスに変更します。この方法を使用して、ループバックデバイスおよびchroot経由でマウントされた他のデバイスからimgファイルを完全にアンマウントします。
cat /proc/mounts |awk '{print $2}'|grep $CHROOTMOUNT |sort -r|xargs sudo umount
sudo umount $CHROOTMOUNT