イメージをフラッシュする前にソフトウェアを更新、アップグレード、インストールすることは可能ですか?


28

限られたSD書き込みサイクルを使用して、イメージで出荷されるソフトウェアをアップグレードするのはばかげているようです。イメージをSDカードにフラッシュする前に、ソフトウェアをアップグレードして新しいソフトウェアをインストールできますか?

回答:


31

はい

答えは常に「はい」です。正しい方法を見つけるには少し時間がかかります。

ハードウェイ

Brightbox.comが提供するVPSでこれを実行します。Nano Server(2 CPU、512MB RAM、20GBディスク容量)とUbuntu Precise 12.04 LTSサーバーイメージを使用しました。EC2またはLinodeの同等物、そしてもちろん、ご使用のLinuxマシンで動作するはずです。(x86)Archインストールでテストしましたが、一部のパッケージが古すぎるため、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

qemuARMエミュレータであり、qemu-user-staticそしてbinfmt-support私たちはARMカーネルをエミュレートすることなく、ARMの実行可能ファイルを実行することができます。(なんてかっこいい!?!)

システムの準備-Arch

qemuArchリポジトリに静的にリンクされたものが見つからないため、ソースからコンパイルする必要があります。

  1. http://git.savannah.gnu.org/cgit/qemu.gitから最新リリースをダウンロードします
  2. 解凍して実行

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

  3. を使用makeしてビルドし、を使用してインストールしsudo 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.shARM 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。これは、一度使用すると使用できなくなるためです。

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にいますが、サービスは実行されていませんなど。注意してください、あなたはrootです!

ソフトウェアの更新/インストール-Debianイメージ

ソフトウェアを更新するには、を使用しますapt-get

 # apt-get update
 # apt-get upgrade

apt-get install通常どおりにソフトウェアをインストールすることもできます。

ソフトウェアの更新/インストール-Arch Image

ソフトウェアを更新するには、を使用します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

あなただけをインストールqemuchrootて離れる必要があります。

免責事項アレックスチェンバレンは、の主任開発者ですpiimg。そのため、私はpiimg他の方法との関連での使用に偏っているかもしれません。

参照資料

  1. デスクトップPCでARM Linuxを実行する:外部のchroot方法

  2. chrootしようとしたときに「違法な指示」を取得する


誰も実際にこれをテストしましたか?
finnw

@finnw Jivingsはこれをテストしたと思います。
アレックスチェンバレン

1
を使用してsudo kpartx -av rpi_pisces_mate_r1.img、パーティションを表示することもできます。最大のものを使用してマウントしsudo mount /dev/mapper/loop0p3 /mnt/tmpます。
-elmicha

@AlexChamberlain:これを実際にBrightboxサーバーで動作させましたか?私は自宅のPCでこれを正常にテストしましたが、Brightboxで試してみたところchrootできず、仮想化の上に仮想化を効果的に取得しようとしたためかどうかを望みました。もちろん私も何か間違ったことをしたかもしれませんが、完全にgivingめる前に照会する価値があると思いました!素晴らしいチュートリアルをありがとう。
DrAl

これを更新して、Noobs Distroをchrootする方法を含めることは可能ですか?ちょうどそのようなディストリビューションにchrootする方法を学習のために
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ベースであるため、実際に画像を直接実行することはできません。それらを更新するのは少し面倒です...ホストシステムが適切に基づいている場合でも可能かもしれません。
フレッド

-2

メイン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

これが本当に質問に答えるかどうかはわかりません。イメージにchrootする方法、またはイメージにソフトウェアをインストールする方法については説明しません。また、これは新しい質問をする場所でもありません。
Jivings

私は、OPが彼の質問に対して行った元の「はい」の回答と同じ方法を使用しています。イメージのアンマウントに問題があったので、これは本当にその質問と私自身の最終的な答えに最適な場所です。
レジー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.