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の未割り当て領域があります。
質問と回答を読みました 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カードイメージを縮小したいのは明らかです。
この記事 は、私の問題を解決するソリューションを提供します。これは他の方法とよく似ていますが、計算方法と、数値とパーティションの意味を説明します。
重要な情報は、コマンドtruncate
の使用でした。答えを失わないために、完全な解決策に従う。
PCでSDカードを複製するための準備手順は次のとおりです。
lsblk
を使用して、使用可能なデバイスと、それらのパーティションがマウントされているかどうかを確認します
pCにコピーするデバイスのすべてのパーティションをアンマウントします。例えば:
umount /dev/sdc1
umount /dev/sdc2
すべてのパーティションがアンマウントされたSDカード全体のコピーを作成します
dd if=/dev/sdc of=/path/to/file/myimage.img
問題のコンテキスト:
myimage.img
がハードウェアサポートよりも大きい場合(小さい場合は問題ありませんが、同じ方法を使用すると、イメージをハードウェアサポートに適合させることができます)。
秘密は、標準のLinuxツールと機器を使用することです:GParted、fdisk
およびtruncate
。
要件:
.img
(この例ではmyimage.img
)ループバックデバイスを作成しています:
GPartedは、パーティションテーブルとファイルシステムの管理に通常使用されるアプリケーションです。画像を縮小するために、GPartedが回答の最初の部分に沿って使用されます。
GPartedは、画像のような単純なファイルではなく、デバイス上で動作します。これが、最初にイメージ用のデバイスを作成する必要がある理由です。 Linuxのループバック機能を使用してこれを行います。
ループバックを有効にしてみましょう:
Sudo modprobe loop
新しい(無料の)ループバックデバイスをリクエストしてみましょう。
Sudo losetup -f
このコマンドは、空いているループバックデバイスへのパスを返します。
/dev/loop0
画像のデバイスを作成しましょう:
Sudo losetup /dev/loop0 myimage.img
デバイス/dev/loop0
はmyimage.img
を表します。イメージにあるパーティションにアクセスしたいので、カーネルにもそれらをロードするように要求する必要があります:
Sudo partprobe /dev/loop0
これにより、/dev/loop0p1
の最初のパーティションを表すデバイスmyimage.img
が得られます。このデバイスは直接必要ではありませんが、GPartedでは必要です。
GPartedを使用してパーティションのサイズを変更します:
GPartedを使用して新しいデバイスをロードしましょう:
Sudo gparted /dev/loop0
GPartedアプリケーションが開くと、次のようなウィンドウが表示されます。
ここで、いくつかのことに注意してください。
このパーティションのコンテンツのサイズに合うようにサイズを変更しますが、それ以上ではありません。
パーティションを選択し、[サイズ変更/移動]をクリックします。次のようなウィンドウがポップアップします。
右のバーをできるだけ左にドラッグします。
GPartedには、ファイルシステム関連のデータを配置するために数MBの追加容量が必要になる場合があることに注意してください。そのためには、[新しいサイズ]ボックスの上矢印を数回押します。たとえば、FAT32を機能させるために10回(= 10MiB)押しました。 NTFSの場合、まったく必要がない場合があります。
最後にResize/Moveを押します。 GPartedウィンドウに戻ります。今回は次のようになります。
ディスクの一部が割り当てられていないことに注意してください。ディスクのこの部分はパーティションで使用されないため、後でこの部分をイメージから削ることができます。 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つのことに注意してください。
End
の下に表示)1 * 512
のセクターとして表示)残りの例では、これらの数値を使用します。多くの場合、ブロックサイズ(512)は同じですが、終了ブロック(9181183)は異なります。数字は、パーティションがファイルの9181183 * 512バイトで終了することを意味します。そのバイトの後に未割り当て部分が続きます。イメージには、最初の9181183 * 512バイトのみが役立ちます。
次に、イメージファイルを、パーティションを含めるだけのサイズに縮小します。このため、truncate
コマンドを使用します(ugglaに感謝します!)。 truncateコマンドでは、ファイルのサイズをバイト単位で指定する必要があります。最後のブロックは9181183で、ブロック番号は0から始まります。つまり、(9181183 + 1)* 512バイトが必要です。これは重要です。それ以外の場合、パーティションはイメージに適合しません。そこで、計算で切り捨てを使用します。
truncate --size=$[(9181183+1)*512] myimage.img
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バイトに相当します。 bs
とcount
の積は、これ以上である必要があります。
これは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