depends: coreutils-truncate
losetup
parted
resize2fs
lsblk
coreutils-df
qemu-img
openwrt_img=<openwrt.img>
truncate -s <target size> $openwrt_img
losetup --show -Pf $openwrt_img # ==stdout==> /dev/loop0
parted /dev/loop0 "print"
parted /dev/loop0 "resizepart <lastPartitionNum> -1"
partprobe; lsblk
resize2fs /dev/loop0p<lastpartnum> # Extend ExtFS
losetup -d /dev/loop0
gzip -k $openwrt_img
qemu-img convert -f raw -O qcow2 $openwrt_img ${openwrt_img%.*}.qcow2
openwrt_21.02_img_空间扩容_分区扩容_改分区表大小
openwrt 镜像直接扩容的方案(安装前)
linux下无损扩容分区方法
How to mount a disk image from the command line?
Auto expand last partition to use all unallocated space, using parted in batch mode
How to pad a file to a desired size?
在 Linux 下掛載 SD 卡映像檔
Linux: sudo=$(which sudo)
OpenWRT: sudo=''
$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2
$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there
$ ${sudo} losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop1 0 0 0 0 /full/path/to/my.img
$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0
los() (
img="$1"
dev="$(${sudo} losetup --show -f -P "$img")"
echo "$dev"
for part in "$dev"?*; do
if [ "$part" = "${dev}p*" ]; then
part="${dev}"
fi
dst="/mnt/$(basename "$part")"
echo "$dst"
${sudo} mkdir -p "$dst"
${sudo} mount "$part" "$dst"
done
)
losd() (
dev="/dev/loop$1"
for part in "$dev"?*; do
if [ "$part" = "${dev}p*" ]; then
part="${dev}"
fi
dst="/mnt/$(basename "$part")"
${sudo} umount "$dst"
done
${sudo} losetup -d "$dev"
)