nmhw-auto-part: improved script.

Script now automatically aborts, when an error occours.

Signed-off-by: Lucien Mueller <lucien.mueller@netmodule.com>
This commit is contained in:
Lucien Mueller 2018-11-16 16:41:59 +01:00
parent 45e0d28fdf
commit 212421128a
1 changed files with 65 additions and 40 deletions

View File

@ -7,17 +7,18 @@
# $3 = 'data' or 'overlay' type of partition to append # $3 = 'data' or 'overlay' type of partition to append
# $4 = size of the appended partition in MB (set to 0 to fill) # $4 = size of the appended partition in MB (set to 0 to fill)
red="\e[31m"
green="\e[32m" green="\e[32m"
underlined="\e[4m"
normal="\e[0m" normal="\e[0m"
bold="\e[1m" bold="\e[1m"
device_available(){ device_available(){
local device=$1 local device=$1
if [ -e $device ] ; then if [ -e $device ] ; then
local partdevice_first=$(ls $device*[1-9] | tail -n 1) local partdevice_first
local partn_first=${partdevice_first: -1} partdevice_first=$(ls $device*[1-9] | tail -n 1)
local partn_first
partn_first=${partdevice_first: -1}
if (( $partn_first > 1 )) ; then if (( $partn_first > 1 )) ; then
echo "Error: Device $device has already too many partitions." echo "Error: Device $device has already too many partitions."
echo "Please use this script only once." echo "Please use this script only once."
@ -35,7 +36,8 @@ rootsize_ok(){
local devicename=$1 local devicename=$1
local partname=$2 local partname=$2
local newsize=$3 local newsize=$3
local size=$(( $(cat /sys/block/$devicename/$partname/size) * $(cat /sys/block/$devicename/queue/hw_sector_size) / 1024 / 1024 )) local size
size=$(( $(cat /sys/block/$devicename/$partname/size) * $(cat /sys/block/$devicename/queue/hw_sector_size) / 1024 / 1024 ))
if [ $newsize -eq 0 ] ; then if [ $newsize -eq 0 ] ; then
return 0 return 0
@ -79,29 +81,32 @@ expand_partition(){
fi fi
# Get the partiton device e.g. /dev/mmcblk1p2 # Get the partiton device e.g. /dev/mmcblk1p2
local partdevice=$(ls $device*[$partn] | tail -n 1) local partdevice
partdevice=$(ls $device*[$partn] | tail -n 1)
# get the name e.g. mmcblk1 # get the name e.g. mmcblk1
local devicename=$(echo $device | cut -d '/' -f 3) local devicename
devicename=$(echo $device | cut -d '/' -f 3)
# get the name of the otaroot partition e.g. mmcblk1p2 # get the name of the otaroot partition e.g. mmcblk1p2
local partname=$(echo $partdevice | cut -d '/' -f 3) local partname
partname=$(echo $partdevice | cut -d '/' -f 3)
# first sector # first sector
local start=$(cat /sys/block/$devicename/$partname/start) local start
start=$(cat /sys/block/$devicename/$partname/start)
# last sector # last sector
local end=$(($start+$(cat /sys/block/$devicename/$partname/size))) local end
end=$(($start+$(cat /sys/block/$devicename/$partname/size)))
# calculate new last sector # calculate new last sector
local newend=$(($start + $newsize * 1024 * 1024 / $(cat /sys/block/$devicename/queue/hw_sector_size))) local newend
newend=$(($start + $newsize * 1024 * 1024 / $(cat /sys/block/$devicename/queue/hw_sector_size)))
# calculate current size
local currentsize=$(( $(cat /sys/block/$devicename/$partname/size) / 1024 / 1024 * $(cat /sys/block/$devicename/queue/hw_sector_size) ))
echo -e "d\n$partn\nn\np\n$partn\n$start\n$newend\nw\n" | fdisk $device > /dev/null 2>&1 echo -e "d\n$partn\nn\np\n$partn\n$start\n$newend\nw\n" | fdisk $device > /dev/null 2>&1
partprobe $device > /dev/null 2>&1 partprobe $device >> /var/log/nmhw-auto-part.log 2>&1 || true
resize2fs $partdevice > /dev/null 2>&1 resize2fs $partdevice >> /var/log/nmhw-auto-part.log 2>&1
} }
@ -114,31 +119,40 @@ append_partition(){
local size=$2 local size=$2
# Get the previous partiton device e.g. /dev/mmcblk1p2 # Get the previous partiton device e.g. /dev/mmcblk1p2
local partdevice_prev=$(ls $device*[1-9] | tail -n 1) local partdevice_prev
local partn_prev=${partdevice_prev: -1} partdevice_prev=$(ls $device*[1-9] | tail -n 1)
local partn_prev
partn_prev=${partdevice_prev: -1}
if [ $partn_prev -eq 4 ] ; then if [ $partn_prev -eq 4 ] ; then
echo "Error:You can only have a maximum of 4 partitions." echo "Error:You can only have a maximum of 4 partitions."
return 1 return 1
fi fi
local partn=$(($partn_prev + 1)) local partn
partn=$(($partn_prev + 1))
# get the name e.g. mmcblk1 # get the name e.g. mmcblk1
local devicename=$(echo $device | cut -d '/' -f 3) local devicename
devicename=$(echo $device | cut -d '/' -f 3)
# get the name of the previous partition e.g. mmcblk1p2 # get the name of the previous partition e.g. mmcblk1p2
local partname_prev=$(echo $partdevice_prev | cut -d '/' -f 3) local partname_prev
partname_prev=$(echo $partdevice_prev | cut -d '/' -f 3)
# first sector # first sector
local start_prev=$(cat /sys/block/$devicename/$partname_prev/start) local start_prev
start_prev=$(cat /sys/block/$devicename/$partname_prev/start)
# last sector of previous partition # last sector of previous partition
local end_prev=$(($start_prev+$(cat /sys/block/$devicename/$partname_prev/size))) local end_prev
end_prev=$(($start_prev+$(cat /sys/block/$devicename/$partname_prev/size)))
local start=$(($end_prev + 1)) local start
start=$(($end_prev + 1))
local end_device=$(($(cat /sys/block/$devicename/size)-8)) local end_device
end_device=$(($(cat /sys/block/$devicename/size)-8))
if [ $size -eq 0 ] ; then if [ $size -eq 0 ] ; then
local end=$end_device local end=$end_device
@ -150,11 +164,12 @@ append_partition(){
fi fi
echo -e "n\np\n$partn\n$start\n$end\nw\n" | fdisk $device > /dev/null 2>&1 echo -e "n\np\n$partn\n$start\n$end\nw\n" | fdisk $device > /dev/null 2>&1
partprobe $device > /dev/null 2>&1 partprobe $device >> /var/log/nmhw-auto-part.log 2>&1 || true
# Get the partiton device e.g. /dev/mmcblk1p2 # Get the partiton device e.g. /dev/mmcblk1p2
local partdevice=$(ls $device*[$partn] | tail -n 1) local partdevice
mkfs.ext4 $partdevice > /dev/null 2>&1 partdevice=$(ls $device*[$partn] | tail -n 1)
mkfs.ext4 $partdevice >> /var/log/nmhw-auto-part.log 2>&1
createdPartition=$partdevice createdPartition=$partdevice
} }
@ -166,15 +181,15 @@ interactive_mode(){
printf "|$bold It's advised, that you use the recommended values in the$green [square brackets]$normal.\n" printf "|$bold It's advised, that you use the recommended values in the$green [square brackets]$normal.\n"
printf "|$bold Press enter to automatically apply the recommended values.$normal\n" printf "|$bold Press enter to automatically apply the recommended values.$normal\n"
false d=0
while ! [ $? -eq 0 ]; do while [ $d -eq 0 ]; do
printf "Input device to expand $bold$green[/dev/mmcblk1]$normal:\n" printf "Input device to expand $bold$green[/dev/mmcblk1]$normal:\n"
read device read device
if [ -z ${device} ] ; then if [ -z ${device} ] ; then
device="/dev/mmcblk1" device="/dev/mmcblk1"
printf "Using $device\n" printf "Using $device\n"
fi fi
device_available $device device_available $device && d=1
done done
# number of the otaroot partiton # number of the otaroot partiton
@ -189,26 +204,26 @@ interactive_mode(){
# get the name of the otaroot partition e.g. mmcblk1p2 # get the name of the otaroot partition e.g. mmcblk1p2
otarootpartname=$(echo $otarootpart | cut -d '/' -f 3) otarootpartname=$(echo $otarootpart | cut -d '/' -f 3)
false d=0
while ! [ $? -eq 0 ]; do while [ $d -eq 0 ]; do
printf "Input size of the otaroot in MB $bold$green[1024]$normal:\n" printf "Input size of the otaroot in MB $bold$green[1024]$normal:\n"
read newrootsize read newrootsize
if [ -z ${newrootsize} ] ; then if [ -z ${newrootsize} ] ; then
newrootsize="1024" newrootsize="1024"
printf "Using $newrootsize\n" printf "Using $newrootsize\n"
fi fi
rootsize_ok $devicename $otarootpartname $newrootsize rootsize_ok $devicename $otarootpartname $newrootsize && d=1
done done
false d=0
while ! [ $? -eq 0 ] ; do while [ $d -eq 0 ] ; do
printf "Input type of partition to append ('data' or 'overlay') $bold$green[overlay]$normal:\n" printf "Input type of partition to append ('data' or 'overlay') $bold$green[overlay]$normal:\n"
read ptype read ptype
if [ -z ${ptype} ] ; then if [ -z ${ptype} ] ; then
ptype="overlay" ptype="overlay"
printf "Using $ptype\n" printf "Using $ptype\n"
fi fi
type_available $ptype type_available $ptype && d=1
done done
printf "Size of the appended partition in MB (set to 0 to fill) $bold$green[0]$normal:\n" printf "Size of the appended partition in MB (set to 0 to fill) $bold$green[0]$normal:\n"
@ -260,24 +275,26 @@ execute(){
append_partition $device $datasize append_partition $device $datasize
datapart=$createdPartition datapart=$createdPartition
mkdir -p /data
mount $datapart /mnt mount $datapart /mnt
echo "$datapart /mnt auto defaults,sync 0 0" >> /etc/fstab echo "$datapart /mnt auto defaults,sync 0 0" >> /etc/fstab
case "$ptype" in case "$ptype" in
"data") "data")
mkdir /mnt/data mkdir -p /mnt/data
;; ;;
"overlay") "overlay")
mkdir -p /mnt/.work mkdir -p /mnt/.work
mkdir -p /mnt/overlay mkdir -p /mnt/overlay
systemctl enable mount-overlay.service > /dev/null 2>&1 systemctl enable mount-overlay.service >> /var/log/nmhw-auto-part.log 2>&1
systemctl start mount-overlay.service systemctl start mount-overlay.service
;; ;;
*) *)
echo "Error: $ptype is not an option." echo "Error: $ptype is not an option."
;; ;;
esac esac
echo "Partitioning successful."
echo "Partitioning successful." >> /var/log/nmhw-auto-part.log
} }
usage(){ usage(){
@ -298,6 +315,14 @@ description(){
-h help\n" -h help\n"
} }
# exit when any commands fails
set -e
echo "Script started $(date)." >> /var/log/nmhw-auto-part.log
echo "Script run with parameters 1: $1 2: $2 3: $3 4: $4 5: $5" >> /var/log/nmhw-auto-part.log
echo "" >> /var/log/nmhw-auto-part.log
echo "" >> /var/log/nmhw-auto-part.log
if (( $# == 1 )) ; then if (( $# == 1 )) ; then
case $1 in case $1 in
"-i") "-i")