Update image-setup script to work on linux, plus first changes for Raspbian Buster.
This commit is contained in:
parent
7e17948ff3
commit
aeff8283b9
@ -1,27 +1,76 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
MOUNTED_BOOT_VOLUME="boot" # i.e. under which name is the SD card mounted under /Volumes on macOS
|
# exit on error; treat unset variables as errors; exit on errors in piped commands
|
||||||
BOOT_CMDLINE_TXT="/Volumes/$MOUNTED_BOOT_VOLUME/cmdline.txt"
|
set -euo pipefail
|
||||||
BOOT_CONFIG_TXT="/Volumes/$MOUNTED_BOOT_VOLUME/config.txt"
|
|
||||||
|
# Ensure we operate from consistent pwd for the rest of the script
|
||||||
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" # Figure out the ABSOLUTE PATH of this script without relying on the realpath command, which may not always be available
|
||||||
|
cd "$DIR"
|
||||||
|
|
||||||
|
if [ "$OSTYPE" == "linux-gnu" ]; then
|
||||||
|
MOUNTED_BOOT_VOLUME="/media/$(whoami)/boot" # i.e. under which name is the SD card mounted under /media in Linux (Ubuntu)
|
||||||
|
SD_DD_BS="1M"
|
||||||
|
SD_DD_PROGRESS="status=progress"
|
||||||
|
elif [ "$OSTYPE" == "darwin" ]; then
|
||||||
|
MOUNTED_BOOT_VOLUME="/Volumes/boot" # i.e. under which name is the SD card mounted under /Volumes on macOS
|
||||||
|
SD_DD_BS="1m"
|
||||||
|
SD_DD_PROGRESS=""
|
||||||
|
else
|
||||||
|
echo "Error: Unsupported platform $OSTYPE, sorry"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
BOOT_CMDLINE_TXT="$MOUNTED_BOOT_VOLUME/cmdline.txt"
|
||||||
|
BOOT_CONFIG_TXT="$MOUNTED_BOOT_VOLUME/config.txt"
|
||||||
SD_SIZE_REAL=2500 # this is in MB
|
SD_SIZE_REAL=2500 # this is in MB
|
||||||
SD_SIZE_SAFE=2800 # this is in MB
|
SD_SIZE_SAFE=2800 # this is in MB
|
||||||
SD_SIZE_ZERO=3200 # this is in MB
|
SD_SIZE_ZERO=3200 # this is in MB
|
||||||
PUBKEY="$(cat ~/.ssh/id_rsa.pub)"
|
SSH_PUBKEY="$(cat ~/.ssh/id_rsa.pub)"
|
||||||
|
SSH_CONNECT_TIMEOUT=30
|
||||||
KEYBOARD="us" # or e.g. "fi" for Finnish
|
KEYBOARD="us" # or e.g. "fi" for Finnish
|
||||||
TIMEZONE="Etc/UTC" # or e.g. "Europe/Helsinki"; see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
TIMEZONE="Etc/UTC" # or e.g. "Europe/Helsinki"; see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||||
|
|
||||||
|
function echo-bold {
|
||||||
|
echo -e "$(tput -Txterm-256color bold)$1$(tput -Txterm-256color sgr 0)" # https://unix.stackexchange.com/a/269085; the -T arg accounts for $ENV not being set
|
||||||
|
}
|
||||||
function working {
|
function working {
|
||||||
echo -e "\n✨ $1"
|
echo-bold "\n✨ $1"
|
||||||
}
|
}
|
||||||
function question {
|
function question {
|
||||||
echo -e "\n🛑 $1"
|
echo-bold "\n🛑 $1"
|
||||||
}
|
}
|
||||||
function ssh {
|
function ssh {
|
||||||
/usr/bin/ssh -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=5 "pi@$IP" "$1"
|
/usr/bin/ssh -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout="$SSH_CONNECT_TIMEOUT" "pi@$IP" "$1"
|
||||||
}
|
}
|
||||||
function scp {
|
function scp {
|
||||||
/usr/bin/scp -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$@" "pi@$IP:/home/pi"
|
/usr/bin/scp -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$@" "pi@$IP:/home/pi"
|
||||||
}
|
}
|
||||||
|
function figureOutSdCard {
|
||||||
|
if [ "$OSTYPE" == "linux-gnu" ]; then
|
||||||
|
lsblk --fs
|
||||||
|
DISK="/dev/$(lsblk -l | grep "$MOUNTED_BOOT_VOLUME" | sed 's/[0-9].*//')"
|
||||||
|
DISK_SAMPLE="/dev/sda"
|
||||||
|
elif [ "$OSTYPE" == "darwin" ]; then
|
||||||
|
diskutil list
|
||||||
|
DISK="$(diskutil list | grep /dev/ | grep external | grep physical | cut -d ' ' -f 1 | head -n 1)"
|
||||||
|
DISK_SAMPLE="/dev/disk2"
|
||||||
|
else
|
||||||
|
echo "Error: Unsupported platform $OSTYPE, sorry"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function unmountSdCard {
|
||||||
|
if [ "$OSTYPE" == "linux-gnu" ]; then
|
||||||
|
for part in $(lsblk --list "$DISK" | grep part | sed 's/ .*//'); do
|
||||||
|
udisksctl unmount -b "/dev/$part"
|
||||||
|
done
|
||||||
|
elif [ "$OSTYPE" == "darwin" ]; then
|
||||||
|
diskutil unmountDisk "$DISK"
|
||||||
|
else
|
||||||
|
echo "Error: Unsupported platform $OSTYPE, sorry"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
question "Enter version (e.g. \"1.2.3\") being built:"
|
question "Enter version (e.g. \"1.2.3\") being built:"
|
||||||
read TAG
|
read TAG
|
||||||
@ -44,19 +93,18 @@ question "Mount the SD card (press enter when ready)"
|
|||||||
read
|
read
|
||||||
|
|
||||||
working "Figuring out SD card device"
|
working "Figuring out SD card device"
|
||||||
diskutil list
|
figureOutSdCard
|
||||||
DISK="$(diskutil list | grep /dev/ | grep external | grep physical | cut -d ' ' -f 1 | head -n 1)"
|
|
||||||
|
|
||||||
question "Based on the above, SD card determined to be \"$DISK\" (should be e.g. \"/dev/disk2\"), press enter to continue"
|
question "Based on the above, SD card determined to be \"$DISK\" (should be e.g. \"$DISK_SAMPLE\"), press enter to continue"
|
||||||
read
|
read
|
||||||
|
|
||||||
working "Safely unmounting the card"
|
working "Safely unmounting the card"
|
||||||
diskutil unmountDisk "$DISK"
|
unmountSdCard
|
||||||
|
|
||||||
working "Writing the card full of zeros (for security and compressibility reasons)"
|
working "Writing the card full of zeros (for security and compressibility reasons)"
|
||||||
echo "This may take a long time"
|
echo "This may take a long time"
|
||||||
echo "You may be prompted for your password by sudo"
|
echo "You may be prompted for your password by sudo"
|
||||||
sudo dd bs=1m count="$SD_SIZE_ZERO" if=/dev/zero of="$DISK"
|
sudo dd bs="$SD_DD_BS" count="$SD_SIZE_ZERO" if=/dev/zero of="$DISK" "$SD_DD_PROGRESS"
|
||||||
|
|
||||||
question "Prepare baseline Raspbian:"
|
question "Prepare baseline Raspbian:"
|
||||||
echo "* Flash Raspbian Lite with Etcher"
|
echo "* Flash Raspbian Lite with Etcher"
|
||||||
@ -76,10 +124,10 @@ mv temp "$BOOT_CMDLINE_TXT"
|
|||||||
|
|
||||||
working "Enabling SSH for first boot"
|
working "Enabling SSH for first boot"
|
||||||
# https://www.raspberrypi.org/documentation/remote-access/ssh/
|
# https://www.raspberrypi.org/documentation/remote-access/ssh/
|
||||||
touch "/Volumes/$MOUNTED_BOOT_VOLUME/ssh"
|
touch "$MOUNTED_BOOT_VOLUME/ssh"
|
||||||
|
|
||||||
working "Safely unmounting the card"
|
working "Safely unmounting the card"
|
||||||
diskutil unmountDisk "$DISK"
|
unmountSdCard
|
||||||
|
|
||||||
question "Do initial Pi setup:"
|
question "Do initial Pi setup:"
|
||||||
echo "* Eject the card"
|
echo "* Eject the card"
|
||||||
@ -91,7 +139,7 @@ read IP
|
|||||||
|
|
||||||
working "Installing temporary SSH pubkey"
|
working "Installing temporary SSH pubkey"
|
||||||
echo -e "Password hint: \"raspberry\""
|
echo -e "Password hint: \"raspberry\""
|
||||||
ssh "mkdir .ssh && echo '$PUBKEY' > .ssh/authorized_keys"
|
ssh "mkdir .ssh && echo '$SSH_PUBKEY' > .ssh/authorized_keys"
|
||||||
|
|
||||||
working "Figuring out partition start"
|
working "Figuring out partition start"
|
||||||
ssh "echo -e 'p\nq\n' | sudo fdisk /dev/mmcblk0 | grep /dev/mmcblk0p2 | tr -s ' ' | cut -d ' ' -f 2" > temp
|
ssh "echo -e 'p\nq\n' | sudo fdisk /dev/mmcblk0 | grep /dev/mmcblk0p2 | tr -s ' ' | cut -d ' ' -f 2" > temp
|
||||||
@ -109,11 +157,14 @@ working "Setting hostname"
|
|||||||
ssh "sudo hostnamectl set-hostname chilipie-kiosk"
|
ssh "sudo hostnamectl set-hostname chilipie-kiosk"
|
||||||
ssh "sudo sed -i 's/raspberrypi/chilipie-kiosk/g' /etc/hosts"
|
ssh "sudo sed -i 's/raspberrypi/chilipie-kiosk/g' /etc/hosts"
|
||||||
|
|
||||||
|
# From now on, some ssh commands will exit non-0, which should be fine
|
||||||
|
set +e
|
||||||
|
|
||||||
working "Rebooting the Pi"
|
working "Rebooting the Pi"
|
||||||
ssh "sudo reboot"
|
ssh "sudo reboot"
|
||||||
|
|
||||||
echo "Waiting for host to come back up..."
|
echo "Waiting for host to come back up..."
|
||||||
until ssh "echo OK"
|
until SSH_CONNECT_TIMEOUT=5 ssh "echo OK"
|
||||||
do
|
do
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
@ -130,13 +181,11 @@ ExecStart=
|
|||||||
ExecStart=-/sbin/agetty --autologin $SUDO_USER --noclear %I \$TERM
|
ExecStart=-/sbin/agetty --autologin $SUDO_USER --noclear %I \$TERM
|
||||||
EOF
|
EOF
|
||||||
)"
|
)"
|
||||||
|
|
||||||
ssh "sudo systemctl set-default multi-user.target"
|
ssh "sudo systemctl set-default multi-user.target"
|
||||||
|
# Set auto-login for TTY's 1-3
|
||||||
ssh "sudo mkdir -p /etc/systemd/system/getty@tty1.service.d && sudo touch /etc/systemd/system/getty@tty1.service.d/autologin.conf && sudo echo '$AUTOLOG' | sudo tee /etc/systemd/system/getty@tty1.service.d/autologin.conf"
|
ssh "sudo mkdir -p /etc/systemd/system/getty@tty1.service.d && sudo touch /etc/systemd/system/getty@tty1.service.d/autologin.conf && sudo echo '$AUTOLOG' | sudo tee /etc/systemd/system/getty@tty1.service.d/autologin.conf"
|
||||||
ssh "sudo mkdir -p /etc/systemd/system/getty@tty2.service.d && sudo touch /etc/systemd/system/getty@tty2.service.d/autologin.conf && sudo echo '$AUTOLOG' | sudo tee /etc/systemd/system/getty@tty2.service.d/autologin.conf"
|
ssh "sudo mkdir -p /etc/systemd/system/getty@tty2.service.d && sudo touch /etc/systemd/system/getty@tty2.service.d/autologin.conf && sudo echo '$AUTOLOG' | sudo tee /etc/systemd/system/getty@tty2.service.d/autologin.conf"
|
||||||
ssh "sudo mkdir -p /etc/systemd/system/getty@tty3.service.d && sudo touch /etc/systemd/system/getty@tty3.service.d/autologin.conf && sudo echo '$AUTOLOG' | sudo tee /etc/systemd/system/getty@tty3.service.d/autologin.conf"
|
ssh "sudo mkdir -p /etc/systemd/system/getty@tty3.service.d && sudo touch /etc/systemd/system/getty@tty3.service.d/autologin.conf && sudo echo '$AUTOLOG' | sudo tee /etc/systemd/system/getty@tty3.service.d/autologin.conf"
|
||||||
|
|
||||||
# Set auto-login for TTY's 1-3
|
|
||||||
ssh "sudo ln -fs /etc/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty1.service"
|
ssh "sudo ln -fs /etc/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty1.service"
|
||||||
ssh "sudo ln -fs /etc/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty2.service"
|
ssh "sudo ln -fs /etc/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty2.service"
|
||||||
ssh "sudo ln -fs /etc/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty3.service"
|
ssh "sudo ln -fs /etc/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty3.service"
|
||||||
@ -157,7 +206,7 @@ ssh "sudo apt-get update && sudo apt-get install -y vim matchbox-window-manager
|
|||||||
|
|
||||||
working "Setting home directory default content"
|
working "Setting home directory default content"
|
||||||
ssh "rm -rfv /home/pi/*"
|
ssh "rm -rfv /home/pi/*"
|
||||||
scp $(find ../home -type file)
|
scp $(find ../home -type f)
|
||||||
|
|
||||||
working "Setting splash screen background"
|
working "Setting splash screen background"
|
||||||
ssh "sudo rm /usr/share/plymouth/themes/pix/splash.png && sudo ln -s /home/pi/background.png /usr/share/plymouth/themes/pix/splash.png"
|
ssh "sudo rm /usr/share/plymouth/themes/pix/splash.png && sudo ln -s /home/pi/background.png /usr/share/plymouth/themes/pix/splash.png"
|
||||||
@ -171,6 +220,10 @@ ssh "sudo reboot"
|
|||||||
question "Once the Pi has rebooted into Chromium:"
|
question "Once the Pi has rebooted into Chromium:"
|
||||||
echo "* Tell Chromium we don't want to sign in"
|
echo "* Tell Chromium we don't want to sign in"
|
||||||
echo "* Configure Chromium to start \"where you left off\""
|
echo "* Configure Chromium to start \"where you left off\""
|
||||||
|
echo " * F11 to exit full screen"
|
||||||
|
echo " * Alt + F, then S to go to Settings"
|
||||||
|
echo " * Type \"continue\" to filter the options"
|
||||||
|
echo " * Tab to select \"Continue where you left off\""
|
||||||
echo "* Navigate to \"file:///home/pi/first-boot.html\""
|
echo "* Navigate to \"file:///home/pi/first-boot.html\""
|
||||||
echo "(press enter when ready)"
|
echo "(press enter when ready)"
|
||||||
read
|
read
|
||||||
@ -193,12 +246,11 @@ ssh "(echo > .ssh/authorized_keys) && sudo systemctl disable ssh && sudo shutdow
|
|||||||
question "Eject the SD card from the Pi, and mount it back to this computer (press enter when ready)"
|
question "Eject the SD card from the Pi, and mount it back to this computer (press enter when ready)"
|
||||||
read
|
read
|
||||||
|
|
||||||
working "Figuring out SD card device"
|
|
||||||
# We do this again now just to be safe
|
# We do this again now just to be safe
|
||||||
diskutil list
|
working "Figuring out SD card device"
|
||||||
DISK="$(diskutil list | grep /dev/ | grep external | grep physical | cut -d ' ' -f 1 | head -n 1)"
|
figureOutSdCard
|
||||||
|
|
||||||
question "Based on the above, SD card determined to be \"$DISK\" (should be e.g. \"/dev/disk2\"), press enter to continue"
|
question "Based on the above, SD card determined to be \"$DISK\" (should be e.g. \"$DISK_SAMPLE\"), press enter to continue"
|
||||||
read
|
read
|
||||||
|
|
||||||
working "Making boot quieter (part 1)" # https://scribles.net/customizing-boot-up-screen-on-raspberry-pi/
|
working "Making boot quieter (part 1)" # https://scribles.net/customizing-boot-up-screen-on-raspberry-pi/
|
||||||
@ -216,13 +268,13 @@ cat "$BOOT_CMDLINE_TXT" \
|
|||||||
mv temp "$BOOT_CMDLINE_TXT"
|
mv temp "$BOOT_CMDLINE_TXT"
|
||||||
|
|
||||||
working "Safely unmounting the card"
|
working "Safely unmounting the card"
|
||||||
diskutil unmountDisk "$DISK"
|
unmountSdCard
|
||||||
|
|
||||||
working "Dumping the image from the card"
|
working "Dumping the image from the card"
|
||||||
cd ..
|
cd ..
|
||||||
echo "This may take a long time"
|
echo "This may take a long time"
|
||||||
echo "You may be prompted for your password by sudo"
|
echo "You may be prompted for your password by sudo"
|
||||||
sudo dd bs=1m count="$SD_SIZE_SAFE" if="$DISK" of="chilipie-kiosk-$TAG.img"
|
sudo dd bs="$SD_DD_BS" count="$SD_SIZE_SAFE" if="$DISK" of="chilipie-kiosk-$TAG.img" "$SD_DD_PROGRESS"
|
||||||
|
|
||||||
working "Compressing image"
|
working "Compressing image"
|
||||||
COPYFILE_DISABLE=1 tar -zcvf chilipie-kiosk-$TAG.img.tar.gz chilipie-kiosk-$TAG.img
|
COPYFILE_DISABLE=1 tar -zcvf chilipie-kiosk-$TAG.img.tar.gz chilipie-kiosk-$TAG.img
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user