WIP; SD card can be fully prepared on any linux PC (cmdline.txt change, resize second partition)

This commit is contained in:
2020-12-23 23:39:51 +01:00
parent 0a92b49cc7
commit 8d96d7e38a

View File

@@ -33,6 +33,7 @@ SDDEV=
SDBOOT=
SDBOOTPUUID=
SDROOT=
SDROOTDEV=
SDROOTPUUID=
HDDEV=
HDROOT=
@@ -72,15 +73,17 @@ step_2() {
step setup
fi
if [ ! -f "$downImgName" ] ; then
echoerr " [E] No raspios image found"
return 1
endReturn -o 1 "No raspios image found"
fi
if [ $(id -u) -ne 0 ] ; then
endReturn -o 1 "No root"
fi
read_sd_dev "$2"
# check if device was confirmed
if [ $? -ne 0 ] ; then
echoerr " [E] SD card device not found"
return 1
endReturn -o 1 "SD card device not found"
fi
# write image
@@ -146,43 +149,112 @@ step_4_info() {
if [ ! -z $3 ] ; then
hd="HD: \"$3\""
fi
echo "TODO Prepare $sd to boot from $hd"
echo "Prepare $sd to boot from $hd"
}
step_4_alias() { ALIAS="hdboot"; }
step_4() {
#TODO
echoerr " [E] Not ready yet...TODO"
#return 1
read_sd_dev "$2"
endReturn -o $? "SD detection error $?"
read_hd_dev "$3"
endReturn -o $? "HD detection error"
echo " [I] SD: $SDDEV"
echo " $SDBOOT [$SDBOOTPUUID]"
echo " $SDROOT [$SDROOTPUUID]"
read_hd_dev "$3"
endReturn -o $? "HD detection error"
echo " [I] HD: $HDDEV"
echo " $HDROOT [$HDROOTPUUID]"
echo " $HDSWAP [$HDSWAPPUUID]"
echo
echo " [I] modify PARTUUID of $SDBOOT/cmdline.txt"
if [ -z $HDROOTPUUID ] ; then
echo " root=PARTUUID=******00-01"
# Point boot command line to SSD
echo -n " [I] modify PARTUUID of $SDBOOT/cmdline.txt"
if [ ! -z $HDROOTPUUID ] ; then
exe sed -i -E "s/root=PARTUUID=[a-f0-9-]+/root=PARTUUID=${HDROOTPUUID}/" "$SDBOOT/cmdline.txt"
if [ $? -eq 0 ] ; then
echo " ... Ok"
else
echo -e "\n Failed! Replace PARTUUID manually"
fi
else
echo " root=PARTUUID=$HDROOTPUUID"
echo " Replace \"root=PARTUUID=******00-01\" manually"
fi
echo " remove \"init=/usr/lib/raspi-config/init_resize.sh\""
# Disable initial resizing of the second partition
echo -n " [I] remove \"init=/usr/lib/raspi-config/init_resize.sh\""
exe sed -i -E "s/[ ]*init=.*\/init_resize\.sh//" "$SDBOOT/cmdline.txt"
if [ $? -eq 0 ] ; then
echo " ... Ok"
else
echo -e "\n Failed! Remove init=... manually"
fi
# Save modifications for HD boot
exe cp -ar "$SDBOOT"/cmdline.txt "$SDBOOT"/cmdline.txt.hd
echo
# Resize second partition of SD to max. possible size
echo " [I] Resize root partion of SD: ${SDROOT} "
step resizesd "$SDDEV"
if [ $? -ne 0 ] ; then
echoerr " [W] Something seems to have failed during resize"
else
# Disable init script to resize SD
echo -n " [I] remove \"init=\" part from $SDBOOT/cmdline.txt.sd"
exe sed -i -E "s/[ ]*init=.*\/init_resize\.sh//" "$SDBOOT/cmdline.txt.sd"
if [ $? -eq 0 ] ; then
echo " ... Ok"
else
echo -e "\n Failed! Remove init=... manually"
fi
fi
}
step_5_info() {
local sd="[SD CARD DEVICE]"
local hd="[HD DEVICE]"
if [ ! -z $2 ] ; then
sd="SD: \"$2\""
fi
if [ ! -z $3 ] ; then
hd="HD: \"$3\""
fi
echo "Prepare HD for boot $sd $hd (TODO)"
}
step_5() {
#TODO
echoerr " [E] Not ready yet...TODO"
#return 1
read_sd_dev "$2"
endReturn -o $? "SD detection error $?"
read_hd_dev "$3"
endReturn -o $? "HD detection error"
echo " [I] SD: $SDDEV"
echo " $SDBOOT [$SDBOOTPUUID]"
echo " $SDROOT [$SDROOTPUUID]"
echo " [I] HD: $HDDEV"
echo " $HDROOT [$HDROOTPUUID]"
echo " $HDSWAP [$HDSWAPPUUID]"
echo
# TODO how to partition HD
echo " [I] $HDDEV is expected to be partitioned with root and swap"
echo " TODO create a step for partitioning script support?!"
echo
# Initial rsync of system to HD
echo " [I] Clone SD root to HD root:"
echo " rsync -avxHAX --numeric-ids --info=stats2 $SDROOT/ $HDROOT/"
echo
# Modify fstab on HD for root and swap on HD
echo " [I] modify $HDROOT/etc/fstab"
echo " PARTUUID=$SDBOOTPUUID /boot vfat ro,defaults 0 2"
echo " PARTUUID=$SDROOTPUUID /backup ext4 ro,defaults,noatime 0 2"
echo " PARTUUID=$HDROOTPUUID / ext4 defaults,noatime 0 1"
echo " PARTUUID=$HDSWAPPUUID none swap sw 0 0"
echo
# etc
echo " [I] modify $HDROOT/etc/dhcpcd.conf for static IPs"
}
@@ -207,22 +279,33 @@ step_20() {
}
rpiSwapFile="/var/swap"
step_22_info() { echo "Resize second SD card partition [MOUNTPOINT]"; }
step_22_info() { echo "Resize second SD card partition [SD CARD DEVICE]"; }
step_22_alias() { ALIAS="resizesd"; }
step_22() {
local mountP="$resizeMount"
if [ ! -z $2 ] && [ "$2" != "" ] && [ "$2" != "/" ] ; then
mountP=$2
shift
read_sd_dev "$1"
if [ -z $SDDEV ] || [ "$SDDEV" = "" ] || [ "$SDROOT" == "/" ] ; then
echoerr " [E] No SD found"
return 1
fi
exe umount -q "$mountP"
exe parted -s "$resizeDevice" "resizepart $resizePartNo -1" quit
exe resize2fs "$resizePart"
exe mount "$mountP"
echo " [I] Device to be resized: $SDROOTDEV"
exe umount -q "$SDROOT"
exe parted -s "$SDDEV" "resizepart $SDROOTPARTNO -1" quit
saveReturn $?
exe e2fsck -f "$SDROOTDEV"
saveReturn $?
exe resize2fs "$SDROOTDEV"
saveReturn $?
if [ -z $SDROOT ] ; then
read -p "Please provide a mountpoint: " SDROOT
exe mkdir -p "$SDROOT"
fi
exe mount "$SDROOTDEV" "$SDROOT"
saveReturn $?
getReturn
return $?
}
resizeMount="/backup"
resizeDevice="/dev/mmcblk0"
resizePartNo=2
resizePart="${resizeDevice}p${resizePartNo}"
step_24_info() {
echo "Turn off power LED [OPTION]"
@@ -253,11 +336,14 @@ step_26_alias() { ALIAS="netrestart"; }
step_26() {
exep "sudo ip link set eth0 down && sudo ip link set eth0 up"
}
read_sd_dev() {
local partExt=""
if [ ! -z "$1" ] ; then
SDBOOT=
SDROOT=
SDROOTDEV=
SDROOTPUUID=
SDBOOTPUUID=
SDDEV="$1"
@@ -265,6 +351,7 @@ read_sd_dev() {
SDDEV=
SDBOOT=
SDROOT=
SDROOTDEV=
SDBOOTPUUID=
SDROOTPUUID=
echo " [I] Available devices:"
@@ -285,21 +372,24 @@ read_sd_dev() {
fi
if [ -z $SDBOOT ] ; then
SDBOOT=$(findmnt -no TARGET "${SDDEV}${partExt}1")
SDBOOT=$(findmnt -no TARGET "${SDDEV}${partExt}${SDBOOTPARTNO}")
fi
if [ -z $SDBOOTPUUID ] ; then
IFS=\" read -r _ vPARTUUID _ < <(blkid "${SDDEV}${partExt}1" -s PARTUUID)
IFS=\" read -r _ vPARTUUID _ < <(blkid "${SDDEV}${partExt}${SDBOOTPARTNO}" -s PARTUUID)
SDBOOTPUUID=$vPARTUUID
fi
SDROOTDEV=${SDDEV}${partExt}${SDROOTPARTNO}
if [ -z $SDROOT ] ; then
SDROOT=$(findmnt -no TARGET "${SDDEV}${partExt}2")
SDROOT=$(findmnt -no TARGET "${SDROOTDEV}")
fi
if [ -z $SDROOTPUUID ] ; then
SDROOTPUUID=$(findmnt -no PARTUUID "${SDDEV}${partExt}2")
SDROOTPUUID=$(findmnt -no PARTUUID "${SDROOTDEV}")
fi
return 0
}
SDBOOTPARTNO=1
SDROOTPARTNO=2
read_hd_dev() {
if [ ! -z "$1" ] ; then