Rút gọn partition cuối

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"

 


 

Comments Off on Rút gọn partition cuối

Filed under Software

Comments are closed.