Việc rút gọn một partition để lại khoảng trống sau partition đó. Nếu đó là partition cuối cùng và trong một file ảnh img thì file ảnh đó có thể được cắt ngắn. Đây là một tình huống có thể cần khi tạo file ảnh sao lưu Raspbian.
# Script disktool, version 20191027 # Kiểm tra/Sao chép/Rút gọn đĩa # © 2019 LNT <lnt@ly-le.info> # #!/bin/bash function usage(){ cat >&2 <<EOF usage: $(basename $0) disk|image EOF exit 2 } function part_resize(){ # $1: block device or image file dsk="$1" [[ ! ( -e $dsk || -f $dsk ) ]] && usage # đọc thông tin partition cuối từ $dsk read sec_siz part_num start_sec part_typ fs_typ <<< $(sudo parted $dsk unit s print | sed '/^\s*$/d;' | sed '/Sector size/!{$!d;s/^\s*\([0-9]*\)\s*\([0-9]*\)s [^s]*s [^s]*s \(.*\)$/ \1 \2 \3/};s|^.* \([0-9]*\)B.*$|\1|'|tr -d '\n') [[ ! ( $start_sec && $sec_siz ) ]] && usage [[ $fs_typ =~ ext* ]] || usage loopback=$(sudo losetup -f --show -o $(( ${start_sec} * ${sec_siz} )) "$dsk") # kích thước partition cuối read cur_blk blk_siz <<< $(sudo tune2fs -l "$loopback" | sed '/Block \(count\|size\)/!d;s/.* \([0-9]*\)$/\1 /' | tr -d '\n') # kích thước có thể rút gọn min_blk=$(sudo resize2fs -PF "$loopback" | sed '/filesystem:/!d;s/.* \([0-9]*\)$/\1/') if [[ $cur_blk -eq $min_blk ]]; then echo "Không thể giảm kích thước $dsk!" sudo losetup -d $loopback exit 2 fi # rút gọn file system sudo e2fsck -f $loopback sudo resize2fs -p "$loopback" $min_blk sudo sync $loopback sudo losetup -d $loopback # vị trí khối cuối cùng end_sec=$(( $start_sec + $min_blk * $blk_siz / $sec_siz )) # rút gọn partition sudo parted -s -a minimal "$dsk" rm "$part_num" sudo parted -s -a optimal "$dsk" unit s mkpart $part_typ $start_sec $end_sec sudo sync $dsk new_siz=$(( ($end_sec + 1 ) * $sec_siz )) # cắt ngắn nếu là file image if [[ -f $dsk ]]; then sudo truncate -s $new_siz $dsk fi old_siz=$(( ($start_sec * $sec_siz + $cur_blk * $blk_siz + $sec_siz) * 1000 / 1048576 )) new_siz=$(( $new_siz * 1000 / 1048576 )) echo "Kích thước partition thay đổi từ ${old_siz::-3}.${old_siz: -3} MB thành ${new_siz::-3}.${new_siz: -3} MB" } [[ $# -ne 1 ]] || usage part_resize "$1"