web-dev-qa-db-ja.com

小さいSDカードの.imgを「サイズ変更」します。起動可能なSDカードイメージを縮小する方法

環境

Raspberry Pi用のLinuxベースのOSを搭載した16 GBのSDカードを持っています。スペースのほとんどは空です。

SD .imgを他の人と共有したいのですが、コマンドを使用すると

dd if=/dev/sdXX of=/home/user123/SD.img

16 GBのイメージが作成されます。大きすぎる。

質問

16 GBのSDカードイメージのサイズを4 GBに小さくするにはどうすればよいですか?

私はGPartedを試してみました。問題なく4GBのパーティションを作成しますが、SDカードの.img全体は16 GBのままで、12 GBの未割り当て領域があります。

GParted table

質問と回答を読みました buntuで複数のパーティションを複製する ですが、16GBのSDカードを4GBにサイズ変更できません。

より詳しい情報

~$ lsblk 
...

sdc      8:32   1  14,9G  0 disk 
├─sdc1   8:33   1   100M  0 part 
└─sdc2   8:34   1     4G  0 part 
~$ Sudo fdisk -l /dev/sdc
Disk /dev/sdc: 14,9 GiB, 15931539456 bytes, 31116288 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
Disklabel type: dos
Disk identifier: 0xf8a631ce

Device     Boot  Start     End Sectors  Size Id Type
/dev/sdc1  *      2048  206847  204800  100M  c W95 FAT32 (LBA)
/dev/sdc2       206848 8595455 8388608    4G 83 Linux

アドバイスは大歓迎です!

注意してくださいコメント でMelebiusによって観察されたように、使用する正しい単語は縮小です

SDカードは、容量を変更できないハードウェアであるため、サイズ変更できません。 SDカードイメージを縮小したいのは明らかです。

6
Leos313

この記事 は、私の問題を解決するソリューションを提供します。これは他の方法とよく似ていますが、計算方法と、数値とパーティションの意味を説明します。

重要な情報は、コマンドtruncateの使用でした。答えを失わないために、完全な解決策に従う。

PCでSDカードを複製するための準備手順は次のとおりです。

  1. lsblkを使用して、使用可能なデバイスと、それらのパーティションがマウントされているかどうかを確認します

  2. pCにコピーするデバイスのすべてのパーティションをアンマウントします。例えば:

    umount /dev/sdc1
    umount /dev/sdc2
    
  3. すべてのパーティションがアンマウントされたSDカード全体のコピーを作成します

    dd if=/dev/sdc of=/path/to/file/myimage.img
    

Linuxでの画像の縮小

問題のコンテキスト

myimage.imgがハードウェアサポートよりも大きい場合(小さい場合は問題ありませんが、同じ方法を使用すると、イメージをハードウェアサポートに適合させることができます)。

秘密は、標準のLinuxツールと機器を使用することです:GParted、fdiskおよびtruncate

要件

  • Linux PC
  • 縮小する.img(この例ではmyimage.img

ループバックデバイスを作成しています

GPartedは、パーティションテーブルとファイルシステムの管理に通常使用されるアプリケーションです。画像を縮小するために、GPartedが回答の最初の部分に沿って使用されます。

GPartedは、画像のような単純なファイルではなく、デバイス上で動作します。これが、最初にイメージ用のデバイスを作成する必要がある理由です。 Linuxのループバック機能を使用してこれを行います。

ループバックを有効にしてみましょう:

Sudo modprobe loop

新しい(無料の)ループバックデバイスをリクエストしてみましょう。

Sudo losetup -f

このコマンドは、空いているループバックデバイスへのパスを返します。

/dev/loop0

画像のデバイスを作成しましょう:

Sudo losetup /dev/loop0 myimage.img

デバイス/dev/loop0myimage.imgを表します。イメージにあるパーティションにアクセスしたいので、カーネルにもそれらをロードするように要求する必要があります:

Sudo partprobe /dev/loop0

これにより、/dev/loop0p1の最初のパーティションを表すデバイスmyimage.imgが得られます。このデバイスは直接必要ではありませんが、GPartedでは必要です。

GPartedを使用してパーティションのサイズを変更します

GPartedを使用して新しいデバイスをロードしましょう:

Sudo gparted /dev/loop0

GPartedアプリケーションが開くと、次のようなウィンドウが表示されます。

screenshot

ここで、いくつかのことに注意してください。

  • パーティションが1つあります。
  • パーティションは、ディスク/デバイス/イメージ全体を割り当てます。
  • 仕切りは部分的に満たされています。

このパーティションのコンテンツのサイズに合うようにサイズを変更しますが、それ以上ではありません。

パーティションを選択し、[サイズ変更/移動]をクリックします。次のようなウィンドウがポップアップします。

screenshot of dialog

右のバーをできるだけ左にドラッグします。

GPartedには、ファイルシステム関連のデータを配置するために数MBの追加容量が必要になる場合があることに注意してください。そのためには、[新しいサイズ]ボックスの上矢印を数回押します。たとえば、FAT32を機能させるために10回(= 10MiB)押しました。 NTFSの場合、まったく必要がない場合があります。

最後にResize/Moveを押します。 GPartedウィンドウに戻ります。今回は次のようになります。

unallocated space on right

ディスクの一部が割り当てられていないことに注意してください。ディスクのこの部分はパーティションで使用されないため、後でこの部分をイメージから削ることができます。 GPartedはディスク用のツールであるため、イメージは縮小せず、パーティションのみを縮小します。イメージの縮小は自分で行う必要があります。

押す Apply GPartedで。これでファイルが移動し、最終的にパーティションが縮小されるため、1〜2分かかる場合がありますが、ほとんどの場合、短時間で終了します。その後、GPartedを閉じます。

これでループバックデバイスは不要になるため、アンロードします。

Sudo losetup -d /dev/loop0

画像のシェービング

画像の先頭にすべての重要なデータが揃ったので、未割り当ての部分を削り取りましょう。最初に、パーティションの終了位置と未割り当て部分の開始位置を知る必要があります。これはfdiskを使用して行います。

fdisk -l myimage.img

ここでは、次のような出力が表示されます。

Disk myimage.img: 6144 MB, 6144000000 bytes, 12000000 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: 0x000ea37d

      Device Boot      Start         End      Blocks   Id  System
myimage.img1            2048     9181183     4589568    b  W95 FAT32

出力で2つのことに注意してください。

  • パーティションはブロック9181183で終わります(Endの下に表示)
  • ブロックサイズは512バイトです(1 * 512のセクターとして表示)

残りの例では、これらの数値を使用します。多くの場合、ブロックサイズ(512)は同じですが、終了ブロック(9181183)は異なります。数字は、パーティションがファイルの9181183 * 512バイトで終了することを意味します。そのバイトの後に未割り当て部分が続きます。イメージには、最初の9181183 * 512バイトのみが役立ちます。

次に、イメージファイルを、パーティションを含めるだけのサイズに縮小します。このため、truncateコマンドを使用します(ugglaに感謝します!)。 truncateコマンドでは、ファイルのサイズをバイト単位で指定する必要があります。最後のブロックは9181183で、ブロック番号は0から始まります。つまり、(9181183 + 1)* 512バイトが必要です。これは重要です。それ以外の場合、パーティションはイメージに適合しません。そこで、計算で切り捨てを使用します。

truncate --size=$[(9181183+1)*512] myimage.img
3
Leos313

bs-コマンドのオプションcountおよびddを使用して、出力ファイルのサイズを制限できます。

例:

dd if=sdx of=SD.img bs=1G count=4

結果は、4 GiBのサイズの出力ファイルになります。

man ddを詳しく調べてください。

すべてのパーティションが完全にカバーされるように、コピーする必要があるバイト数を知る必要があるので、Sudo fdisk -l /dev/sdxで、どのセクターが最後に必要かを調べてください。

パーティションは、ディスクの先頭にある必要があります(提供した画像のように)。

Msdos-partition-tableを使用したディスクは、この方法で簡単に複製できますが、ディスクがGPTを使用し、異なるサイズのディスクに複製する場合は、保護MBRを変更して、非常に存在するGPTバックアップを変更する必要があります。ディスクの終わりを再作成する必要があります。これはgdiskで実行できます。


fdisk- outputから、最後のパーティションの最後のセクターがセクター8595455であることがわかります。つまり、少なくとも8595455 + 1セクター(最初のセクターは0)をコピーする必要があります。 512バイトのセクターサイズでは、これは4,400,873,472バイトに相当します。 bscountの積は、これ以上である必要があります。

これは4GB USBスティックにはまだ大きすぎるかもしれませんが、sdc2のサイズを減らすことができます。その中には未使用のスペースがたくさんあります。

あなたが提供した現在の例では、

 dd if=/dev/sdc of=SD.img bs=10M count=420

パーティションテーブル、sdc1およびsdc2について説明します。計算:

10*1024*1024*420 = 4,404,019,200 > 4,400,873,472
2
mook765

resize2fs を使用してサイズを変更することもできます。

Sudo resize2fs -fp SD.img 4G

また、ファイル自体のサイズを変更します!

0
user1040155