Resize a flash drive image
Get a loop device:
Question: can I use the loop device that mount -o loop
assigned when I mounted the image? Answer: you will need to unmount first, so you might need a new loop device. GParted can open a loop device before unmounting, but cannot resize a mounted partition. After unmounting, use losetup
with an available loop device.
# get a loop device number
sudo losetup -f
# in this case: /dev/loop15
# attach the disk image to the loop device
sudo losetup /dev/loop15 test-disk.img
Use GParted with the device:
sudo gparted /dev/loop15
Right-click on the partition and select Resize/Move, and enter a new size.
Right-click and select Information. According to GParted (for this example), there is 980.47 MiB Unallocated currently.
After completing resize, unload the loop device:
sudo losetup -d /dev/loop15
Use fdisk to get number of sectors and unit (or block) size:
fdisk -l test-disk.img
Disk /dev/loop15: 29.28 GiB, 31436800000 bytes, 61400000 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: 0x00000000
61400000*512 bytes to GiB = 29.2778015 gibibytes
61400000*512 bytes to MiB = 29 980.4688 mebibytes
So we need to truncate up to 980 MiB (in this case, from GParted info) from the end of the file.
60000000*512 bytes to MiB = 29 296.875 mebibytes, which should work well in this case.
Now we use truncate to shorten the file:
truncate --size=$[(60000000+1)*512] test-disk.img
Now, might want to check/repair with GParted:
sudo losetup /dev/loop15 test-disk.img
sudo gparted /dev/loop15