-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreate_rpi4_fcos_sdcard.sh
125 lines (103 loc) · 3.62 KB
/
create_rpi4_fcos_sdcard.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/bin/bash
#
#
: ${IGNITION_FILE_DIR="configs/ign"}
: ${NM_ROOT="configs/nm"}
: ${FIRMWARE_VERSION=v1.33} # use latest one from https://github.com/pftf/RPi4/releases
: ${FIRMWARE_ZIPFILE=RPi4_UEFI_Firmware_${FIRMWARE_VERSION}.zip}
: ${FIRMWARE_URL=https://github.com/pftf/RPi4/releases/download/${FIRMWARE_VERSION}/${FIRMWARE_ZIPFILE}}
: ${COREOS_INSTALLER=${HOME}/bin/coreos-installer}
# DEVICE
# NODENAME
OPTSTRING="d:n:"
function main() {
parse_opts $*
local ERRORS=0
local DEVICE_PATH=/dev/${DEVICE}
[ ! -b ${DEVICE_PATH} ] &&
echo "ERROR: ${DEVICE_PATH} is not a block device" &&
ERRORS=$((${ERRORS} + 1))
local IGNITION_FILE=${IGNITION_FILE_DIR}/${NODENAME}.ign
[ ! -r ${IGNITION_FILE} ] &&
echo "ERROR: File Not Found: ${IGNITION_FILE}" &&
ERRORS=$((${ERRORS} + 1))
local NM_DIR=${NM_ROOT}/${NODENAME}
[ ! -d ${NM_DIR} ] &&
echo "ERROR: Network Directory not found ${NM_DIR}" &&
ERRORS=$((${ERRORS} + 1))
[ ${ERRORS} -gt 0 ] && echo "FATAL: invalid options" && exit 2
unmount_filesystems ${DEVICE_PATH}
install_coreos_to_usb ${DEVICE_PATH} ${IGNITION_FILE} ${NM_DIR}
sleep 2
local EFI_PARTITION=$(get_EFI_partition ${DEVICE_PATH})
overlay_UEFI_Firmware ${EFI_PARTITION}
}
function parse_opts() {
while getopts "${OPTSTRING}" OPT ; do
case "$OPT" in
d)
DEVICE=${OPTARG}
;;
n)
NODENAME=${OPTARG}
;;
*)
echo "Invalid Argument: ${OPT}"
exit 1
;;
esac
done
local ERRORS=0
[ -z "${DEVICE}" ] &&
echo "ERROR: Missing required argument -d <device>" &&
ERRORS=$((${ERRORS} + 1))
[ -z "${NODENAME}" ] &&
echo "ERROR: Missing required argument -n <nodename>" &&
ERRORS=$((${ERRORS} + 1))
[ "${ERRORS}" -gt 0 ] && echo "FATAL: there are ${ERRORS} missing arguments" && exit 1
}
function unmount_filesystems() {
local DEVICE=$1
local PARTITIONS=($(mount | grep "^${DEVICE}" | cut -d' ' -f3))
local PROCEED
for MOUNTPOINT in ${PARTITIONS[@]} ; do
! grep -q -e "^/run/media/${USER}" <((echo ${MOUNTPOINT})) &&
echo "FATAL: device not mounted in user space: ${MOUNTPOINT}" && exit 3
echo "INFO: unmounting $(mount | grep ${MOUNTPOINT} | cut -d' ' -f1) [${MOUNTPOINT}]"
read -p 'Proceed? [y/N]: ' PROCEED
[ "${PROCEED}x" != 'yx' ] && echo "FATAL: not unmounting ${MOUNTPOINT}" && exit 4
sudo umount ${MOUNTPOINT}
done
}
function install_coreos_to_usb() {
local DEVICE=$1
local CONFIG=$2
local NETDIR=$3
chmod 600 ${NETDIR}/*
sudo ${COREOS_INSTALLER} install \
--architecture aarch64 \
--ignition-file ${CONFIG} \
--copy-network \
--network-dir ${NETDIR} \
${DEVICE}
}
function get_EFI_partition() {
local DEVICE=$1
lsblk ${DEVICE} -J -oLABEL,PATH |
jq -r '.blockdevices[] | select(.label == "EFI-SYSTEM")'.path
}
function overlay_UEFI_Firmware() {
local EFI_PARTITION=$1
local TMPDIR=$(mktemp --directory /tmp/fcos-rpi-efi-XXXX)
sudo mount ${EFI_PARTITION} ${TMPDIR}
sudo curl -L -o /tmp/${FIRMWARE_ZIPFILE} ${FIRMWARE_URL}
sudo unzip /tmp/${FIRMWARE_ZIPFILE} -d ${TMPDIR}
sudo rm /tmp/${FIRMWARE_ZIPFILE}
sudo umount ${TMPDIR}
sudo rm -rf ${TMPDIR}
sync
}
# ------------------------------------------------------------------------------------------
# MAIN
# ------------------------------------------------------------------------------------------
main $*