Skip to content

Instantly share code, notes, and snippets.

@muink
Last active December 8, 2023 06:39
Show Gist options
  • Save muink/918f0d66e1bc0e77477b29fced217912 to your computer and use it in GitHub Desktop.
Save muink/918f0d66e1bc0e77477b29fced217912 to your computer and use it in GitHub Desktop.
Extend hard disk image

Extend hard disk image

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"
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment