ファイルベースのディスクイメージのサイズを拡張できますか?


29

ddを使用して空のディスクイメージを作成し、mkfsを使用して実際のファイルシステムイメージにしました。私はそれをマウントして使用しています。必要なときに、このファイルベースのディスクイメージを拡大または縮小できるようにする必要があります。そのようにしてディスクイメージのサイズを増やすことは可能ですか?このファイルベースのディスクイメージに、仮想マシンドライブで見られるような動的なサイズ変更機能を持たせる方法はありますか。

回答:


26

まず、画像ファイルを作成する必要があります。

# dd if=/dev/zero of=./binary.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 10.3739 s, 101 MB/s

その後、あなたはそれの上にパーティションを作成する必要があります-あなたが好きなツールを使用することができ、fdiskpartedgparted、私が好むparted、そう:

# parted binary.img

最初にパーティションテーブルを作成し、次に1つの大きなパーティションを作成する必要があります。

(parted) mktable                                                          
New disk label type? msdos      

(parted) mkpartfs
WARNING: you are attempting to use parted to operate on (mkpartfs) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs.  We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
Partition type?  primary/extended? primary
File system type?  [ext2]? fat32
Start? 1
End? 1049M

見てみましょう:

(parted) print
Model:  (file)
Disk /media/binary.img: 1049MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1049MB  1048MB  primary  fat32        lba

よさそうだ、

あなたはそれを拡大したいので、最初にddを使用して画像にいくつかのゼロを追加します:

# dd if=/dev/zero bs=1M count=400 >> ./binary.img
400+0 records in
400+0 records out
419430400 bytes (419 MB) copied, 2.54333 s, 165 MB/s
root:/media# ls -al binary.img 
-rw-r--r-- 1 root root 1.4G Dec 26 06:47 binary.img

画像に400Mを追加しました:

# parted binary.img 
GNU Parted 2.3
Using /media/binary.img
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print                                                            
Model:  (file)
Disk /media/binary.img: 1468MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1049MB  1048MB  primary  fat32        lba

ご覧のとおり、画像のサイズは異なります(1468MB)。Partedは、画像の空き容量も表示できます。表示したい場合は、のprint free代わりに単に入力しますprint。次に、ファイルシステムに余分なスペースを追加する必要があります。

(parted) resize 1
WARNING: you are attempting to use parted to operate on (resize) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs.  We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
Start?  [1049kB]?
End?  [1049MB]? 1468M

それを確認してください:

(parted) print
Model:  (file)
Disk /media/binary.img: 1468MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1468MB  1467MB  primary  fat32        lba

かなりいい。縮小したい場合は、同様のことをしてください:

(parted) resize 1
WARNING: you are attempting to use parted to operate on (resize) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs.  We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
Start?  [1049kB]?
End?  [1468MB]? 500M

これで、パーティションが小さいかどうかを確認できます。

(parted) print
Model:  (file)
Disk /media/binary.img: 1468MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End    Size   Type     File system  Flags
 1      1049kB  500MB  499MB  primary  fat32        lba

はい、そうです。

データが入っているときにパーティションのサイズを変更しようとすると、データのサイズに注意する必要があります。サイズを大きくしすぎるとエラーが発生するためです。

Error: Unable to satisfy all constraints on the partition

ファイルシステムを縮小した後、ファイルの一部を切り捨てる必要もあります。しかし、これには注意が必要です。parted 500M(END)から値を取得できます。

# dd if=./binary.img of=./binary.img.new bs=1M count=500

ただし、これによりファイルの最後にスペースが残ります。理由はわかりませんが、イメージは機能します。

そして、そのようなイメージをマウントすることについて一つのことがあります-あなたは、mountコマンドに渡すオフセットを知る必要があります。たとえば、fdiskからオフセットを取得できます。

# fdisk -l binary.img

Disk binary.img: 1468 MB, 1468006400 bytes
4 heads, 32 sectors/track, 22400 cylinders, total 2867200 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: 0x000f0321

     Device Boot      Start         End      Blocks   Id  System
binary.img1            2048     2867198     1432575+   c  W95 FAT32 (LBA)

2048(開始)x 512(セクターサイズ)= 1048576なので、イメージをマウントするには次のコマンドを使用する必要があります。

# mount -o loop,offset=1048576 binary.img /mnt

1
「しかし、これはファイルの最後にいくらかのスペースを残します。理由はわかりませんが、イメージは機能します。」異なる測定単位を使用していることが原因だと思います。partedでは500MB(partedでは1MBは1000 * 1000バイト)なので、500000000バイトです。ddでは1Mx500 = 500Mをコピーします。ここで、Mは1024 * 1024バイトを表すため、524288000バイトをコピーします。違いは、ファイルの最後に残したスペースです。修正するには、softwarebakery.com / shrinking-images-on-linuxで説明されているように切り捨てを行うか、measの単位を変更します。別れるかddで
ste

今では使用することが無関係だpartedresize「エラー:resizeコマンドは、partedの3.0で削除されました」
Abdillah

15

はい、これは可能です-パーティションのように機能します。私は次のことを試しましたが、うまくいきました:

元のファイルを作成、マウント、チェック、アンマウント

dd if=/dev/zero of=test.file count=102400 
mkfs.ext3 test.file 
mount test.file /m4 -o loop
df
umount /m4

育てる

dd if=/dev/zero count=102400 >> test.file
mount test.file /m4 -o loop
df
resize2fs /dev/loop0
df

ファイルの縮小が同様に機能しない理由はありませんが、ファイルの縮小はファイルの拡大よりも常に困難です(もちろん、ブロックデバイスがマウントされていないときなどに行う必要があります)

qemu-nbdを使用してqcow2イメージをマウントする方法について説明しているこのリンクをご覧ください。


すばらしい、これはまさに私が必要としたレシピです。ただし、e2fsck -f test.fileサイズ変更する前に(イメージファイルで)実行する必要がありました。もう1つ:NTFSパーティションに保存されたドライブイメージに70Gを追加するにdd ... >> drive_imageは、約10分かかります。
トマスガンドール

Tomasz:seek=他の回答のdd パラメータを使用してください
Willem

6

スパースファイルは、ディスクイメージの動的な拡大/サイズ変更に適しています。

これにより、1024Mのスパースファイルが作成されます。

# dd if=/dev/zero of=sparse.img bs=1M count=0 seek=1024
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000565999 s, 0.0 kB/s

イメージはディスク容量を使用していません。

# du -m sparse.img
0   sparse.img

しかし、見かけのサイズは1024Mです。

# ls -l sparse.img
-rw-rw-r--. 1 root root 1073741824 Sep 22 14:22 sparse.img

# du -m --apparent-size sparse.img
1024    sparse.img

通常のディスクイメージとしてフォーマットしてマウントできます。

# parted sparse.img 
GNU Parted 2.1
Using /tmp/sparse.img
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mktable                                                          
New disk label type? msdos                                                
(parted) mkpartfs                                                         
WARNING: you are attempting to use parted to operate on (mkpartfs) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs.  We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
Partition type?  primary/extended? primary                                
File system type?  [ext2]? fat32                                          
Start? 1                                                                  
End? 1024M                                                                
(parted) print                                                            
Model:  (file)
Disk /tmp/sparse.img: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1024MB  1023MB  primary  fat32        lba

# du -m sparse.img 
2   sparse.img

次に、同じコマンドを使用してサイズを変更し、新しいサイズの画像でシークパラメーターを変更するだけで作成します。

dd if=/dev/zero of=sparse.img bs=1M count=0 seek=2048

ご覧のとおり、イメージは2048Mになり、partedまたはその他のツールを使用してパーティションを拡大できます。

# du -m --apparent-size sparse.img 
2048    sparse.img


# parted sparse.img 
GNU Parted 2.1
Using /tmp/sparse.img
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print free                                                       
Model:  (file)
Disk /tmp/sparse.img: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
        16.4kB  1049kB  1032kB           Free Space
 1      1049kB  1024MB  1023MB  primary  fat32        lba
        1024MB  2147MB  1123MB           Free Space

(parted)                               

# du -m sparse.img 
2   sparse.img

今すぐお楽しみください!


よくできました。スパースファイルは十分に活用されていないと思います。
TonyH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.