summaryrefslogtreecommitdiff
path: root/skel/multistrap-hooks/completion_80_rootscript_disk.sh
blob: 169a08b2627a0e2ff9a6bc6630b6c29cdc7ceb3b (plain)
  1. #!/bin/sh
  2. #
  3. # completion_80_rootscript_disk.sh
  4. # Copyright 2016 Jonas Smedegaard <dr@jones.dk>
  5. # License: GNU Public License version 3 or newer
  6. #
  7. # multistrap completion hook adding root script to extend disk
  8. #
  9. # Enhances: multistrap
  10. set -eu
  11. fs="$1"
  12. # FIXME: do this automatically at initial boot (like Armbian?)
  13. cat <<'EOF' > "$fs/root/extend-partition"
  14. #!/bin/sh
  15. set -eu
  16. disk="${1:-/dev/mmcblk0}"
  17. part="${2:-/dev/mmcblk0p2}"
  18. # Use provided disk device, pick if exactly 1 disk device exists, or fail
  19. if [ -z "$disk" ]; then
  20.     diskcount=$(lsblk --noheadings --raw --nodeps --output TYPE \
  21.         | grep --line-regexp disk --count)
  22.     if [ 1 -eq "$diskcount" ]; then
  23.         disk=$(lsblk --noheadings --raw --nodeps --paths --output NAME)
  24.         echo "INFO: No disk provided - will use \"$disk\"."
  25.     else
  26.         echo "ERROR: Please specify disk device:"
  27.         lsblk --paths --nodeps --output NAME,MODEL,SERIAL,SIZE,TYPE
  28.         exit 1
  29.     fi
  30. fi
  31. # Use provided partition, pick last in supported format, or fail
  32. if [ -z "$part" ]; then
  33.     part=$(lsblk --raw --noheadings --paths --output NAME,FSTYPE "$disk" \
  34.         | grep -Po '^\S+(?= ext[234]\z)' | tail -n 1)
  35.     if [ -n "$part" ]; then
  36.         echo "INFO: No partition provided - will use \"$part\"."
  37.     else
  38.         echo "ERROR: Please specify prtition to extend:"
  39.         lsblk --paths --output NAME,SIZE,TYPE,PARTLABEL,FSTYPE "$disk"
  40.         exit 1
  41.     fi
  42. fi
  43. # Locate end of free space after partition in supported format, or fail
  44. partminor=$(lsblk --noheadings --raw --output MAJ:MIN "$part" | cut -d: -f2)
  45. partnewend=$(parted --script --machine -- "$disk" unit B print free \
  46.     | minor="$partminor" perl -F'[:;]' \
  47.         -e 'if ($seen) {' \
  48.             -e '$F[4] eq "free" && print $F[2];' \
  49.             -e 'exit};' \
  50.         -e 'if ($F[0] == $ENV{minor} and $F[4] =~ /^ext[234]$/) {' \
  51.             -e '$seen++};')
  52. if [ -z "$partnewend" ]; then
  53.     echo "ERROR: Failed to locate free space after partition \"$part\""
  54.     exit 1
  55. fi
  56. echo "INFO: Extending partition \"$part\" on disk \"$disk\"..."
  57. parted "$disk" resizepart 2 Yes "$partnewend"
  58. resize2fs "$part"
  59. echo 'INFO: Disk partition extended succesfully!'
  60. EOF
  61. chmod a+"$fs/root/extend-partition"