SDカードに書き込む前に画像ファイルのサイズを変更する方法は?


13

異なるカーネル(CANサポート付き)とPython 3.3がインストールされた新しいRaspbianイメージを作成しようとしています。このすべてをRaspberry Piで行うのではなく、代わりにコンピューターで(これらの指示に従って)行うのは面白いと思いました。ただし、イメージをマウントして準備が整うと、すぐにディスク領域が不足しました。これは、SDカードに書き込まれた後、ユーザーがファイルシステムのサイズを変更することを期待して、画像のサイズが十分に大きいためだと思われます。

SDカードに書き込む前にイメージとファイルシステムのサイズを変更して、スペースを使い果たすことなくさらにカスタマイズできるようにすることは可能ですか?


この質問はおそらく役立つでしょう。
Jivings

1
@Jivings:これらの回答はすべて、SDカードに書き込まれたに画像のサイズを変更する方法を説明しています。その方法は知っています。SDカード書き込むに画像のサイズを変更する方法に興味があります。
DrAl

回答:


7

これは、生の画像ファイルのサイズを変更する方法です。ばかげて単純に聞こえますが、動作します。

オリジナルを拡大したいサイズの空の画像を作成します(この例では5GBを使用しています)。

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

これを元の画像に追加します。

cat /path/to/temp_image >> /path/to/rasperrypi.img

ディスクの最後にあるファイルシステムのサイズを変更します(通常、これはもっと大きくしたいものです):

resize2fs -f /path/to/rasperrypi.img

できた!ディスクは5GB大きくなりました!


完璧ですね。ありがとうございます。今夜、これをテストします。
DrAl

5
私はこれを試しましたが、resize2fsステージに到達すると(ファイルに1GBを追加した後)、「2012-12-16-wheezy-raspbian.img Couldnを開こうとすると、スーパーブロック内の悪いマジックナンバー」が表示されます。 t有効なファイルシステムのスーパーブロックを見つけます。」私が間違っていることに関する提案はありますか?
DrAl

パーティション(/ dev / sda2に相当)ではなく、イメージ全体(/ dev / sdaに相当)のサイズを変更しようとしているという事実に問題があるように思えます。しかし、間違っている可能性があり、成功せずに他のいくつかのことを試してみました(fdiskでパーティションのサイズを変更するなど、機能しているようですが、ファイルシステムのサイズを変更できません)。
-DrAl

3
さて、私は最後のビットに対する答えを少しグーグルで見つけました:イメージ内のパーティションを指すループデバイスを作成する必要がありました。これを行うには、2番目のパーティションの開始セクターfdisk -l file.img(122880)を取得し、それからを取得しましたlosetup --offset $((122880 * 512)) /dev/loop0 file.img。それからを使用resize2fs/dev/loop0て整理できましたlosetup -d /dev/loop0。これを含むように回答を更新する場合、承認済みの回答としてマークします。私を正しい方向に向けてくれてありがとう。
DrAl

1
@DrAlねえ、resize2fson を使用してソリューションを試しまし/dev/loop0たが、スーパーブロックサイズとパーティションサイズが一致しないというブート時のカーネルパニックが発生しましたThe filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocks。次のようなものに遭遇しましたか?
GuySoft

4

これは上記の答えと私のために働いた他の場所の答えの合成です-間違えた場合に備えてイメージをバックアップしてください:

まず、画像ファイルを大きくします(ここでは最後に1GBを追加しています):

truncate -s +1G ./image.img

次に、パーティションテーブルを確認できるように、イメージ全体をループデバイスとしてマップします

sudo losetup /dev/loop0 ./image.img

将来の参考のためにダンプしてみましょう:

sudo fdisk -l /dev/loop0

出力は次のようになります。

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 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: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

次に、最後のパーティションを削除し、同じ開始位置、同じ種類で異なる終了位置に再作成して、最後のパーティションを作り直します。そのため、loop0p2(パーティション2-Linuxパーティション)の「開始」列に注意してください-後で使用します-ここでは122880です。

sudo fdisk /dev/loop0

以下を入力してください-彼らは入力しても安全です-以下の私の説明を読むまで、永続的なことは何も起こりません:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. Enterキーを押してデフォルトを受け入れます
  9. p

ステップ1-現在のテーブルを印刷します。手順2-パーティション2を削除し、手順4-8-新しいエンドポイント(デフォルトはイメージの終わり)でパーティション2を再作成します。手順9-新しいテーブルを印刷します。

新しく印刷されたテーブルは、終了値とブロック値(サイズが変更された)を除いて、コミットする準備ができていることを除いて、元のテーブルと同一であると仮定します。

Enterキーwを押して変更をコミットし、Enterキーを押してq終了します。

そのループバックデバイスを削除できます。2番目のパーティション用に別のデバイスを作成します。上記でメモして使用した開始オフセットを覚えておいてください-再び使用します。

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

これにより、/dev/loop0パーティション2 を指すだけで新しいマッピングが作成されます。参照用に512は、最初に表示されるセクターサイズです。fdisk出力で。

パーティションのサイズを変更して、使用可能なスペースを埋めます。

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

完了-クリーンアップ:

sudo losetup -d /dev/loop0

おかげで...上記の指示は私にとってはうまくいきませんでしたが、これはうまくいきました。パーティションテーブルの作成時に警告が表示されました: `` `コマンド(ヘルプはm):wパーティションテーブルが変更されました。ioctl()を呼び出してパーティションテーブルを再読み込みします。パーティションテーブルの再読み込みに失敗しました。:無効な引数カーネルはまだ古いテーブルを使用しています。新しいテーブルは、次回の再起動時、またはpartprobe(8)またはkpartx(8)の実行後に使用されます。`` `私はそれを無視しただけで大丈夫だった。
StFS

優秀な!正解したのはあなただけです!ありがとう。
yushulx

3

Oracle VM VirtualBoxを実行している人にとっては非常に簡単です。

Windowsマシンでは、次のように処理されます。

input.imgここにあるのは、サイズを縮小するイメージでoutput.imgあり、最終イメージです。この例では、7000 MBのサイズに定義されています。

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

これが少し役立つことを願っています。


非常に巧妙なこのソリューションをありがとう。無料であり、Windowsで完全に動作するのは、私が見つけた唯一のものです。16GBカードでは、サイズがまったく同じではなく、画像のサイズを変更するのに必要な問題がいくつかありました。
ジョシュ

カーネルパニックエラーが発生しました。Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX

これは画像を切り捨てていることに注意してください-7000MBのマークを過ぎているとデータが失われます-コマンドは警告も文句も出しません。
マイクレッドローブ

2

これは、生の画像ファイルのサイズを変更する方法です。ばかげて単純に聞こえますが、動作します。

オリジナルを拡大したいサイズの空の画像を作成します(この例では5GBを使用しています)。

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

これを元の画像に追加します。

cat /path/to/temp_image >> /path/to/rpi.img

次に、パーティションとファイルシステムのサイズを変更します。まず、パーティションのオフセットを取得します。

fdisk -l /path/to/rpi.img

次のような表になります。

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

2番目のパーティションの開始オフセットに注意してください

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

最後に/ dev / loopをアンマウントします

losetup -d /dev/loop0

できた!ディスクは5GB大きくなりました!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.