Compare commits
34
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e910bf55ac | ||
|
|
ee11b802b5 | ||
|
|
3e9b176fab | ||
|
|
30a1528ae1 | ||
|
|
fb23b8ba92 | ||
|
|
91bc38d510 | ||
|
|
67241b9626 | ||
|
|
b7812278a8 | ||
|
|
564f8ef1b8 | ||
|
|
7068086c94 | ||
|
|
9d38bfac23 | ||
|
|
82bcfa427a | ||
|
|
a8eb03a5e4 | ||
|
|
c147df99bc | ||
|
|
9e6af47045 | ||
|
|
3b90b7ffed | ||
|
|
3961bff8a4 | ||
|
|
61a994c88c | ||
|
|
d945d422d4 | ||
|
|
c72f0b47ff | ||
|
|
9714a11204 | ||
|
|
d88f536536 | ||
|
|
21aeca1b0c | ||
|
|
640027d5df | ||
|
|
3b1d05144f | ||
|
|
189b8f0400 | ||
|
|
d7ef46b06a | ||
|
|
d7ca8e8f14 | ||
|
|
08405eb792 | ||
|
|
7fbfdda31e | ||
|
|
cc6605695d | ||
|
|
f4dc2dcce6 | ||
|
|
d07096ebb5 | ||
|
|
d1b747747c |
+2
-2
@@ -5,8 +5,8 @@ ENV DEBIAN_FRONTEND noninteractive
|
||||
RUN apt-get -y update && \
|
||||
apt-get -y install \
|
||||
git vim parted \
|
||||
quilt realpath qemu-user-static debootstrap zerofree pxz zip dosfstools \
|
||||
bsdtar libcap2-bin rsync grep udev xz-utils curl xxd file \
|
||||
quilt coreutils qemu-user-static debootstrap zerofree zip dosfstools \
|
||||
bsdtar libcap2-bin rsync grep udev xz-utils curl xxd file kmod\
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY . /pi-gen/
|
||||
|
||||
@@ -7,12 +7,13 @@ _Tool used to create the raspberrypi.org Raspbian images_
|
||||
|
||||
pi-gen runs on Debian based operating systems. Currently it is only supported on
|
||||
either Debian Stretch or Ubuntu Xenial and is known to have issues building on
|
||||
earlier releases of these systems.
|
||||
earlier releases of these systems. On other Linux distributions it may be possible
|
||||
to use the Docker build described below.
|
||||
|
||||
To install the required dependencies for pi-gen you should run:
|
||||
|
||||
```bash
|
||||
apt-get install quilt parted realpath qemu-user-static debootstrap zerofree pxz zip \
|
||||
apt-get install coreutils quilt parted qemu-user-static debootstrap zerofree zip \
|
||||
dosfstools bsdtar libcap2-bin grep rsync xz-utils file git curl
|
||||
```
|
||||
|
||||
@@ -68,11 +69,34 @@ The following environment variables are supported:
|
||||
|
||||
Output directory for target system images and NOOBS bundles.
|
||||
|
||||
* `DEPLOY_ZIP` (Default: `1`)
|
||||
|
||||
Setting to `0` will deploy the actual image (`.img`) instead of a zipped image (`.zip`).
|
||||
|
||||
* `USE_QEMU` (Default: `"0"`)
|
||||
|
||||
Setting to '1' enables the QEMU mode - creating an image that can be mounted via QEMU for an emulated
|
||||
environment. These images include "-qemu" in the image file name.
|
||||
|
||||
* `FIRST_USER_NAME` (Default: "pi" )
|
||||
|
||||
Username for the first user
|
||||
|
||||
* `FIRST_USER_PASS` (Default: "raspberry")
|
||||
|
||||
Password for the first user
|
||||
|
||||
* `WPA_ESSID`, `WPA_PASSWORD` and `WPA_COUNTRY` (Default: unset)
|
||||
|
||||
If these are set, they are use to configure `wpa_supplicant.conf`, so that the raspberry pi can automatically connect to a wifi network on first boot.
|
||||
|
||||
* `ENABLE_SSH` (Default: `0`)
|
||||
|
||||
Setting to `1` will enable ssh server for remote log in. Note that if you are using a common password such as the defaults there is a high risk of attackers taking over you RaspberryPi.
|
||||
|
||||
* `STAGE_LIST` (Default: `stage*`)
|
||||
|
||||
If set, then instead of working through the numeric stages in order, this list will be followed. For example setting to `stage0 stage1 mystage stage2` will run the contents of `mystage` before stage2. An absolute or relative path can be given for stages outside the pi-gen directory.
|
||||
|
||||
A simple example for building Raspbian:
|
||||
|
||||
@@ -80,6 +104,13 @@ A simple example for building Raspbian:
|
||||
IMG_NAME='Raspbian'
|
||||
```
|
||||
|
||||
The config file can also be specified on the command line as an argument the `build.sh` or `build-docker.sh` scripts.
|
||||
|
||||
```
|
||||
./build.sh -c myconfig
|
||||
```
|
||||
|
||||
This is parsed after `config` so can be used to override values set there.
|
||||
|
||||
## How the build process works
|
||||
|
||||
@@ -128,6 +159,13 @@ It is recommended to examine build.sh for finer details.
|
||||
|
||||
## Docker Build
|
||||
|
||||
Docker can be used to perform the build inside a container. This partially isolates
|
||||
the build from the host system, and allows using the script on non-debian based
|
||||
systems (e.g. Fedora Linux). The isolate is not complete due to the need to use
|
||||
some kernel level services for arm emulation (binfmt) and loop devices (losetup).
|
||||
|
||||
To build:
|
||||
|
||||
```bash
|
||||
vi config # Edit your config file. See above.
|
||||
./build-docker.sh
|
||||
@@ -143,6 +181,12 @@ continue:
|
||||
CONTINUE=1 ./build-docker.sh
|
||||
```
|
||||
|
||||
To examine the container after a failure you can enter a shell within it using:
|
||||
|
||||
```bash
|
||||
sudo docker run -it --privileged --volumes-from=pigen_work pi-gen /bin/bash
|
||||
```
|
||||
|
||||
After successful build, the build container is by default removed. This may be undesired when making incremental changes to a customized build. To prevent the build script from remove the container add
|
||||
|
||||
```bash
|
||||
|
||||
+24
-26
@@ -1,9 +1,10 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
BUILD_OPTS="$*"
|
||||
|
||||
DOCKER="docker"
|
||||
set +e
|
||||
$DOCKER ps >/dev/null 2>&1
|
||||
if [ $? != 0 ]; then
|
||||
if ! $DOCKER ps >/dev/null 2>&1; then
|
||||
DOCKER="sudo docker"
|
||||
fi
|
||||
if ! $DOCKER ps >/dev/null; then
|
||||
@@ -13,30 +14,30 @@ if ! $DOCKER ps >/dev/null; then
|
||||
fi
|
||||
set -e
|
||||
|
||||
config_file=()
|
||||
if [ -f config ]; then
|
||||
config_file=("--env-file" "$(pwd)/config")
|
||||
source config
|
||||
fi
|
||||
|
||||
while getopts "c:" flag
|
||||
do
|
||||
case "$flag" in
|
||||
c)
|
||||
# shellcheck disable=SC1090
|
||||
source "$OPTARG"
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
CONTAINER_NAME=${CONTAINER_NAME:-pigen_work}
|
||||
CONTINUE=${CONTINUE:-0}
|
||||
PRESERVE_CONTAINER=${PRESERVE_CONTAINER:-0}
|
||||
|
||||
if [ "$*" != "" ] || [ -z "${IMG_NAME}" ]; then
|
||||
if [ -z "${IMG_NAME}" ]; then
|
||||
echo "IMG_NAME not set in 'config'" 1>&2
|
||||
echo 1>&2
|
||||
fi
|
||||
cat >&2 <<EOF
|
||||
Usage:
|
||||
build-docker.sh [options]
|
||||
Optional environment arguments: ( =<default> )
|
||||
CONTAINER_NAME=pigen_work set a name for the build container
|
||||
CONTINUE=1 continue from a previously started container
|
||||
PRESERVE_CONTAINER=1 keep build container even on successful build
|
||||
EOF
|
||||
exit 1
|
||||
if [ -z "${IMG_NAME}" ]; then
|
||||
echo "IMG_NAME not set in 'config'" 1>&2
|
||||
echo 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CONTAINER_EXISTS=$($DOCKER ps -a --filter name="$CONTAINER_NAME" -q)
|
||||
@@ -54,23 +55,20 @@ fi
|
||||
|
||||
$DOCKER build -t pi-gen .
|
||||
if [ "$CONTAINER_EXISTS" != "" ]; then
|
||||
trap "echo 'got CTRL+C... please wait 5s'; $DOCKER stop -t 5 ${CONTAINER_NAME}_cont" SIGINT SIGTERM
|
||||
trap 'echo "got CTRL+C... please wait 5s"; $DOCKER stop -t 5 ${CONTAINER_NAME}_cont' SIGINT SIGTERM
|
||||
time $DOCKER run --rm --privileged \
|
||||
--volumes-from="${CONTAINER_NAME}" --name "${CONTAINER_NAME}_cont" \
|
||||
-e IMG_NAME="${IMG_NAME}"\
|
||||
pi-gen \
|
||||
bash -e -o pipefail -c "dpkg-reconfigure qemu-user-static &&
|
||||
cd /pi-gen; ./build.sh;
|
||||
cd /pi-gen; ./build.sh ${BUILD_OPTS} ;
|
||||
rsync -av work/*/build.log deploy/" &
|
||||
wait "$!"
|
||||
else
|
||||
trap "echo 'got CTRL+C... please wait 5s'; $DOCKER stop -t 5 ${CONTAINER_NAME}" SIGINT SIGTERM
|
||||
trap 'echo "got CTRL+C... please wait 5s"; $DOCKER stop -t 5 ${CONTAINER_NAME}' SIGINT SIGTERM
|
||||
time $DOCKER run --name "${CONTAINER_NAME}" --privileged \
|
||||
-e IMG_NAME="${IMG_NAME}"\
|
||||
"${config_file[@]}" \
|
||||
pi-gen \
|
||||
bash -e -o pipefail -c "dpkg-reconfigure qemu-user-static &&
|
||||
cd /pi-gen; ./build.sh &&
|
||||
cd /pi-gen; ./build.sh ${BUILD_OPTS} &&
|
||||
rsync -av work/*/build.log deploy/" &
|
||||
wait "$!"
|
||||
fi
|
||||
@@ -80,7 +78,7 @@ ls -lah deploy
|
||||
|
||||
# cleanup
|
||||
if [ "$PRESERVE_CONTAINER" != "1" ]; then
|
||||
$DOCKER rm -v $CONTAINER_NAME
|
||||
$DOCKER rm -v "$CONTAINER_NAME"
|
||||
fi
|
||||
|
||||
echo "Done! Your image(s) should be in deploy/"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash -e
|
||||
# shellcheck disable=SC2119,SC1091
|
||||
# shellcheck disable=SC2119
|
||||
run_sub_stage()
|
||||
{
|
||||
log "Begin ${SUB_STAGE_DIR}"
|
||||
@@ -102,7 +102,7 @@ run_stage(){
|
||||
./prerun.sh
|
||||
log "End ${STAGE_DIR}/prerun.sh"
|
||||
fi
|
||||
for SUB_STAGE_DIR in ${STAGE_DIR}/*; do
|
||||
for SUB_STAGE_DIR in "${STAGE_DIR}"/*; do
|
||||
if [ -d "${SUB_STAGE_DIR}" ] &&
|
||||
[ ! -f "${SUB_STAGE_DIR}/SKIP" ]; then
|
||||
run_sub_stage
|
||||
@@ -124,9 +124,26 @@ fi
|
||||
|
||||
|
||||
if [ -f config ]; then
|
||||
# shellcheck disable=SC1091
|
||||
source config
|
||||
fi
|
||||
|
||||
while getopts "c:" flag
|
||||
do
|
||||
case "$flag" in
|
||||
c)
|
||||
EXTRA_CONFIG="$OPTARG"
|
||||
# shellcheck disable=SC1090
|
||||
source "$EXTRA_CONFIG"
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
export PI_GEN=${PI_GEN:-pi-gen}
|
||||
export PI_GEN_REPO=${PI_GEN_REPO:-https://github.com/RPi-Distro/pi-gen}
|
||||
|
||||
if [ -z "${IMG_NAME}" ]; then
|
||||
echo "IMG_NAME not set" 1>&2
|
||||
exit 1
|
||||
@@ -134,13 +151,23 @@ fi
|
||||
|
||||
export USE_QEMU="${USE_QEMU:-0}"
|
||||
export IMG_DATE="${IMG_DATE:-"$(date +%Y-%m-%d)"}"
|
||||
export IMG_FILENAME="${IMG_FILENAME:-"${IMG_DATE}-${IMG_NAME}"}"
|
||||
export ZIP_FILENAME="${ZIP_FILENAME:-"image_${IMG_DATE}-${IMG_NAME}"}"
|
||||
|
||||
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
export SCRIPT_DIR="${BASE_DIR}/scripts"
|
||||
export WORK_DIR="${WORK_DIR:-"${BASE_DIR}/work/${IMG_DATE}-${IMG_NAME}"}"
|
||||
export DEPLOY_DIR=${DEPLOY_DIR:-"${BASE_DIR}/deploy"}
|
||||
export DEPLOY_ZIP="${DEPLOY_ZIP:-1}"
|
||||
export LOG_FILE="${WORK_DIR}/build.log"
|
||||
|
||||
export FIRST_USER_NAME=${FIRST_USER_NAME:-pi}
|
||||
export FIRST_USER_PASS=${FIRST_USER_PASS:-raspberry}
|
||||
export WPA_ESSID
|
||||
export WPA_PASSWORD
|
||||
export WPA_COUNTRY
|
||||
export ENABLE_SSH="${ENABLE_SSH:-0}"
|
||||
|
||||
export BASE_DIR
|
||||
|
||||
export CLEAN
|
||||
@@ -170,13 +197,26 @@ source "${SCRIPT_DIR}/common"
|
||||
# shellcheck source=scripts/dependencies_check
|
||||
source "${SCRIPT_DIR}/dependencies_check"
|
||||
|
||||
#check username is valid
|
||||
if [[ ! "$FIRST_USER_NAME" =~ ^[a-z][-a-z0-9_]*$ ]]; then
|
||||
echo "Invalid FIRST_USER_NAME: $FIRST_USER_NAME"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "${APT_PROXY}" ]] && ! curl --silent ${APT_PROXY} >/dev/null ; then
|
||||
echo "Could not reach APT_PROXY server:" ${APT_PROXY}
|
||||
exit 1
|
||||
fi
|
||||
|
||||
dependencies_check "${BASE_DIR}/depends"
|
||||
|
||||
mkdir -p "${WORK_DIR}"
|
||||
log "Begin ${BASE_DIR}"
|
||||
|
||||
for STAGE_DIR in "${BASE_DIR}/stage"*; do
|
||||
STAGE_LIST=${STAGE_LIST:-${BASE_DIR}/stage*}
|
||||
|
||||
for STAGE_DIR in $STAGE_LIST; do
|
||||
STAGE_DIR=$(realpath "${STAGE_DIR}")
|
||||
run_stage
|
||||
done
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
quilt
|
||||
parted
|
||||
realpath
|
||||
realpath:coreutils
|
||||
qemu-arm-static:qemu-user-static
|
||||
debootstrap
|
||||
zerofree
|
||||
pxz zip
|
||||
zip
|
||||
mkdosfs:dosfstools
|
||||
capsh:libcap2-bin
|
||||
bsdtar
|
||||
@@ -15,3 +15,4 @@ curl
|
||||
xxd
|
||||
file
|
||||
git
|
||||
lsmod:kmod
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img"
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img"
|
||||
|
||||
IMGID="$(dd if="${IMG_FILE}" skip=440 bs=1 count=4 2>/dev/null | xxd -e | cut -f 2 -d' ')"
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img"
|
||||
INFO_FILE="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.info"
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img"
|
||||
INFO_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.info"
|
||||
|
||||
on_chroot << EOF
|
||||
/etc/init.d/fake-hwclock stop
|
||||
hardlink -t /usr/share/doc
|
||||
EOF
|
||||
|
||||
if [ -d "${ROOTFS_DIR}/home/pi/.config" ]; then
|
||||
chmod 700 "${ROOTFS_DIR}/home/pi/.config"
|
||||
if [ -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config" ]; then
|
||||
chmod 700 "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config"
|
||||
fi
|
||||
|
||||
rm -f "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache"
|
||||
@@ -68,17 +68,22 @@ cp "$ROOTFS_DIR/etc/rpi-issue" "$INFO_FILE"
|
||||
ROOT_DEV="$(mount | grep "${ROOTFS_DIR} " | cut -f1 -d' ')"
|
||||
|
||||
unmount "${ROOTFS_DIR}"
|
||||
zerofree -v "${ROOT_DEV}"
|
||||
zerofree "${ROOT_DEV}"
|
||||
|
||||
unmount_image "${IMG_FILE}"
|
||||
|
||||
mkdir -p "${DEPLOY_DIR}"
|
||||
|
||||
rm -f "${DEPLOY_DIR}/image_${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.zip"
|
||||
rm -f "${DEPLOY_DIR}/${ZIP_FILENAME}${IMG_SUFFIX}.zip"
|
||||
rm -f "${DEPLOY_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img"
|
||||
|
||||
pushd "${STAGE_WORK_DIR}" > /dev/null
|
||||
zip "${DEPLOY_DIR}/image_${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.zip" \
|
||||
"$(basename "${IMG_FILE}")"
|
||||
popd > /dev/null
|
||||
if [ "${DEPLOY_ZIP}" == "1" ]; then
|
||||
pushd "${STAGE_WORK_DIR}" > /dev/null
|
||||
zip "${DEPLOY_DIR}/${ZIP_FILENAME}${IMG_SUFFIX}.zip" \
|
||||
"$(basename "${IMG_FILE}")"
|
||||
popd > /dev/null
|
||||
else
|
||||
cp "$IMG_FILE" "$DEPLOY_DIR"
|
||||
fi
|
||||
|
||||
cp "$INFO_FILE" "$DEPLOY_DIR"
|
||||
|
||||
+8
-11
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img"
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img"
|
||||
|
||||
unmount_image "${IMG_FILE}"
|
||||
|
||||
@@ -37,16 +37,12 @@ p
|
||||
w
|
||||
EOF
|
||||
|
||||
PARTED_OUT=$(parted -s "${IMG_FILE}" unit b print)
|
||||
BOOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^ 1'| xargs echo -n \
|
||||
| cut -d" " -f 2 | tr -d B)
|
||||
BOOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^ 1'| xargs echo -n \
|
||||
| cut -d" " -f 4 | tr -d B)
|
||||
PARTED_OUT=$(parted -sm "${IMG_FILE}" unit b print)
|
||||
BOOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^1:' | cut -d':' -f 2 | tr -d B)
|
||||
BOOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^1:' | cut -d':' -f 4 | tr -d B)
|
||||
|
||||
ROOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^ 2'| xargs echo -n \
|
||||
| cut -d" " -f 2 | tr -d B)
|
||||
ROOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^ 2'| xargs echo -n \
|
||||
| cut -d" " -f 4 | tr -d B)
|
||||
ROOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^2:' | cut -d':' -f 2 | tr -d B)
|
||||
ROOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^2:' | cut -d':' -f 4 | tr -d B)
|
||||
|
||||
BOOT_DEV=$(losetup --show -f -o "${BOOT_OFFSET}" --sizelimit "${BOOT_LENGTH}" "${IMG_FILE}")
|
||||
ROOT_DEV=$(losetup --show -f -o "${ROOT_OFFSET}" --sizelimit "${ROOT_LENGTH}" "${IMG_FILE}")
|
||||
@@ -66,4 +62,5 @@ mount -v "$ROOT_DEV" "${ROOTFS_DIR}" -t ext4
|
||||
mkdir -p "${ROOTFS_DIR}/boot"
|
||||
mount -v "$BOOT_DEV" "${ROOTFS_DIR}/boot" -t vfat
|
||||
|
||||
rsync -aHAXx --exclude var/cache/apt/archives "${EXPORT_ROOTFS_DIR}/" "${ROOTFS_DIR}/"
|
||||
rsync -aHAXx --exclude /var/cache/apt/archives --exclude /boot "${EXPORT_ROOTFS_DIR}/" "${ROOTFS_DIR}/"
|
||||
rsync -rtx "${EXPORT_ROOTFS_DIR}/boot/" "${ROOTFS_DIR}/boot/"
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
#!/bin/sh
|
||||
#supports_backup in PINN
|
||||
|
||||
set -ex
|
||||
|
||||
# shellcheck disable=SC2154
|
||||
if [ -z "$part1" ] || [ -z "$part2" ]; then
|
||||
printf "Error: missing environment variable part1 or part2\n" 1>&2
|
||||
exit 1
|
||||
@@ -13,23 +15,26 @@ mount "$part1" /tmp/1
|
||||
mount "$part2" /tmp/2
|
||||
|
||||
sed /tmp/1/cmdline.txt -i -e "s|root=[^ ]*|root=${part2}|"
|
||||
sed /tmp/2/etc/fstab -i -e "s|^.* / |${part2} / |"
|
||||
sed /tmp/2/etc/fstab -i -e "s|^.* /boot |${part1} /boot |"
|
||||
sed /tmp/2/etc/fstab -i -e "s|^[^#].* / |${part2} / |"
|
||||
sed /tmp/2/etc/fstab -i -e "s|^[^#].* /boot |${part1} /boot |"
|
||||
|
||||
if [ -f /mnt/ssh ]; then
|
||||
cp /mnt/ssh /tmp/1/
|
||||
fi
|
||||
# shellcheck disable=SC2154
|
||||
if [ -z "$restore" ]; then
|
||||
if [ -f /mnt/ssh ]; then
|
||||
cp /mnt/ssh /tmp/1/
|
||||
fi
|
||||
|
||||
if [ -f /mnt/ssh.txt ]; then
|
||||
cp /mnt/ssh.txt /tmp/1/
|
||||
fi
|
||||
if [ -f /mnt/ssh.txt ]; then
|
||||
cp /mnt/ssh.txt /tmp/1/
|
||||
fi
|
||||
|
||||
if [ -f /settings/wpa_supplicant.conf ]; then
|
||||
cp /settings/wpa_supplicant.conf /tmp/1/
|
||||
fi
|
||||
if [ -f /settings/wpa_supplicant.conf ]; then
|
||||
cp /settings/wpa_supplicant.conf /tmp/1/
|
||||
fi
|
||||
|
||||
if ! grep -q resize /proc/cmdline; then
|
||||
sed -i 's| init=/usr/lib/raspi-config/init_resize.sh||;s| quiet||2g' /tmp/1/cmdline.txt
|
||||
if ! grep -q resize /proc/cmdline; then
|
||||
sed -i 's| init=/usr/lib/raspi-config/init_resize.sh||;s| quiet||2g' /tmp/1/cmdline.txt
|
||||
fi
|
||||
fi
|
||||
|
||||
umount /tmp/1
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
UNRELEASED:
|
||||
*
|
||||
* Chromium browser updated to version 72
|
||||
* VLC media player updated to version 3.0.6
|
||||
* RealVNC Server updated to version 6.4.0
|
||||
* Flash player updated to version 32.0.0.156
|
||||
* Performance improvements to SDL library
|
||||
* Performance improvements to pixman library
|
||||
* Option to set display underscan added to startup wizard
|
||||
* Mounted external drives now displayed on desktop by default
|
||||
* Network plugin modified for improved compatibility with wpa_passphrase
|
||||
* SD Card Copier tweaks to reduce copy failures
|
||||
* Various minor bug fixes and appearance tweaks
|
||||
* Added ethtool
|
||||
* Added rng-tools
|
||||
* Add PINN restore support
|
||||
* Linux kernel 4.14.98
|
||||
* Raspberry Pi firmware f8939644f7bd3065068787f1f92b3f3c79cf3de9
|
||||
2018-11-13:
|
||||
* Two versions of image created - "base" image has no optional software packages included; "full" image has all optional packages
|
||||
- Removed from "base" image - LibreOffice, Thonny, Scratch, Scratch 2, Sonic Pi, Minecraft, Python Games, SmartSim, SenseHAT Emulator
|
||||
|
||||
+10
-14
@@ -1,24 +1,20 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img"
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img"
|
||||
NOOBS_DIR="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}"
|
||||
unmount_image "${IMG_FILE}"
|
||||
|
||||
mkdir -p "${STAGE_WORK_DIR}"
|
||||
cp "${WORK_DIR}/export-image/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img" "${STAGE_WORK_DIR}/"
|
||||
cp "${WORK_DIR}/export-image/${IMG_FILENAME}${IMG_SUFFIX}.img" "${STAGE_WORK_DIR}/"
|
||||
|
||||
rm -rf "${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}"
|
||||
rm -rf "${NOOBS_DIR}"
|
||||
|
||||
PARTED_OUT=$(parted -s "${IMG_FILE}" unit b print)
|
||||
BOOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^ 1'| xargs echo -n \
|
||||
| cut -d" " -f 2 | tr -d B)
|
||||
BOOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^ 1'| xargs echo -n \
|
||||
| cut -d" " -f 4 | tr -d B)
|
||||
PARTED_OUT=$(parted -sm "${IMG_FILE}" unit b print)
|
||||
BOOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^1:' | cut -d':' -f 2 | tr -d B)
|
||||
BOOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^1:' | cut -d':' -f 4 | tr -d B)
|
||||
|
||||
ROOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^ 2'| xargs echo -n \
|
||||
| cut -d" " -f 2 | tr -d B)
|
||||
ROOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^ 2'| xargs echo -n \
|
||||
| cut -d" " -f 4 | tr -d B)
|
||||
ROOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^2:' | cut -d':' -f 2 | tr -d B)
|
||||
ROOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^2:' | cut -d':' -f 4 | tr -d B)
|
||||
|
||||
BOOT_DEV=$(losetup --show -f -o "${BOOT_OFFSET}" --sizelimit "${BOOT_LENGTH}" "${IMG_FILE}")
|
||||
ROOT_DEV=$(losetup --show -f -o "${ROOT_OFFSET}" --sizelimit "${ROOT_LENGTH}" "${IMG_FILE}")
|
||||
@@ -33,8 +29,8 @@ mount "$BOOT_DEV" "${STAGE_WORK_DIR}/rootfs/boot"
|
||||
|
||||
ln -sv "/lib/systemd/system/apply_noobs_os_config.service" "$ROOTFS_DIR/etc/systemd/system/multi-user.target.wants/apply_noobs_os_config.service"
|
||||
|
||||
bsdtar --numeric-owner --format gnutar --use-compress-program pxz -C "${STAGE_WORK_DIR}/rootfs/boot" -cpf "${NOOBS_DIR}/boot.tar.xz" .
|
||||
bsdtar --numeric-owner --format gnutar -C "${STAGE_WORK_DIR}/rootfs/boot" -cpf - . | xz -T0 > "${NOOBS_DIR}/boot.tar.xz"
|
||||
umount "${STAGE_WORK_DIR}/rootfs/boot"
|
||||
bsdtar --numeric-owner --format gnutar --use-compress-program pxz -C "${STAGE_WORK_DIR}/rootfs" --one-file-system -cpf "${NOOBS_DIR}/root.tar.xz" .
|
||||
bsdtar --numeric-owner --format gnutar -C "${STAGE_WORK_DIR}/rootfs" --one-file-system -cpf - . | xz -T0 > "${NOOBS_DIR}/root.tar.xz"
|
||||
|
||||
unmount_image "${IMG_FILE}"
|
||||
|
||||
+13
-12
@@ -4,21 +4,22 @@ log (){
|
||||
export -f log
|
||||
|
||||
bootstrap(){
|
||||
local ARCH
|
||||
ARCH=$(dpkg --print-architecture)
|
||||
local BOOTSTRAP_CMD=debootstrap
|
||||
local BOOTSTRAP_ARGS=()
|
||||
|
||||
export http_proxy=${APT_PROXY}
|
||||
|
||||
if [ "$ARCH" != "armhf" ]; then
|
||||
local BOOTSTRAP_CMD=qemu-debootstrap
|
||||
else
|
||||
local BOOTSTRAP_CMD=debootstrap
|
||||
if [ "$(dpkg --print-architecture)" != "armhf" ]; then
|
||||
BOOTSTRAP_CMD=qemu-debootstrap
|
||||
fi
|
||||
|
||||
capsh --drop=cap_setfcap -- "${BOOTSTRAP_CMD}" --components=main,contrib,non-free \
|
||||
--arch armhf \
|
||||
--keyring "${STAGE_DIR}/files/raspberrypi.gpg" \
|
||||
"$1" "$2" "$3" || true
|
||||
BOOTSTRAP_ARGS+=(--arch armhf)
|
||||
BOOTSTRAP_ARGS+=(--components "main,contrib,non-free")
|
||||
BOOTSTRAP_ARGS+=(--keyring "${STAGE_DIR}/files/raspberrypi.gpg")
|
||||
BOOTSTRAP_ARGS+=("$@")
|
||||
|
||||
capsh --drop=cap_setfcap -- "${BOOTSTRAP_CMD}" "${BOOTSTRAP_ARGS[@]}" || true
|
||||
|
||||
if [ -d "$2/debootstrap" ]; then
|
||||
rmdir "$2/debootstrap"
|
||||
fi
|
||||
@@ -56,7 +57,7 @@ unmount_image(){
|
||||
sync
|
||||
sleep 1
|
||||
local LOOP_DEVICES
|
||||
LOOP_DEVICES=$(losetup -j "${1}" | cut -f1 -d':')
|
||||
LOOP_DEVICES=$(losetup --list | grep "$(basename "${1}")" | cut -f1 -d' ')
|
||||
for LOOP_DEV in ${LOOP_DEVICES}; do
|
||||
if [ -n "${LOOP_DEV}" ]; then
|
||||
local MOUNTED_DIR
|
||||
@@ -95,7 +96,7 @@ export -f on_chroot
|
||||
update_issue() {
|
||||
local GIT_HASH
|
||||
GIT_HASH=$(git rev-parse HEAD)
|
||||
echo -e "Raspberry Pi reference ${IMG_DATE}\nGenerated using pi-gen, https://github.com/RPi-Distro/pi-gen, ${GIT_HASH}, ${1}" > "${ROOTFS_DIR}/etc/rpi-issue"
|
||||
echo -e "Raspberry Pi reference ${IMG_DATE}\nGenerated using ${PI_GEN}, ${PI_GEN_REPO}, ${GIT_HASH}, ${1}" > "${ROOTFS_DIR}/etc/rpi-issue"
|
||||
}
|
||||
export -f update_issue
|
||||
|
||||
|
||||
@@ -27,4 +27,12 @@ dependencies_check()
|
||||
echo "$missing"
|
||||
false
|
||||
fi
|
||||
|
||||
|
||||
if ! grep -q "/proc/sys/fs/binfmt_misc" /proc/mounts; then
|
||||
echo "Module binfmt_misc not loaded in host"
|
||||
echo "Please run:"
|
||||
echo " sudo modprobe binfmt_misc"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -5,10 +5,10 @@ install -m 644 files/noclear.conf "${ROOTFS_DIR}/etc/systemd/system/[email protected]
|
||||
install -v -m 644 files/fstab "${ROOTFS_DIR}/etc/fstab"
|
||||
|
||||
on_chroot << EOF
|
||||
if ! id -u pi >/dev/null 2>&1; then
|
||||
adduser --disabled-password --gecos "" pi
|
||||
if ! id -u ${FIRST_USER_NAME} >/dev/null 2>&1; then
|
||||
adduser --disabled-password --gecos "" ${FIRST_USER_NAME}
|
||||
fi
|
||||
echo "pi:raspberry" | chpasswd
|
||||
echo "${FIRST_USER_NAME}:${FIRST_USER_PASS}" | chpasswd
|
||||
echo "root:root" | chpasswd
|
||||
EOF
|
||||
|
||||
|
||||
@@ -23,3 +23,5 @@ htop
|
||||
man-db
|
||||
policykit-1
|
||||
ssh-import-id
|
||||
rng-tools
|
||||
ethtool
|
||||
|
||||
@@ -15,7 +15,11 @@ on_chroot << EOF
|
||||
systemctl disable hwclock.sh
|
||||
systemctl disable nfs-common
|
||||
systemctl disable rpcbind
|
||||
systemctl disable ssh
|
||||
if [ "${ENABLE_SSH}" == "1" ]; then
|
||||
systemctl enable ssh
|
||||
else
|
||||
systemctl disable ssh
|
||||
fi
|
||||
systemctl enable regenerate_ssh_host_keys
|
||||
EOF
|
||||
|
||||
@@ -32,12 +36,12 @@ systemctl enable resize2fs_once
|
||||
EOF
|
||||
fi
|
||||
|
||||
on_chroot << \EOF
|
||||
on_chroot <<EOF
|
||||
for GRP in input spi i2c gpio; do
|
||||
groupadd -f -r "$GRP"
|
||||
groupadd -f -r "\$GRP"
|
||||
done
|
||||
for GRP in adm dialout cdrom audio users sudo video games plugdev input gpio spi i2c netdev; do
|
||||
adduser pi $GRP
|
||||
adduser $FIRST_USER_NAME \$GRP
|
||||
done
|
||||
EOF
|
||||
|
||||
|
||||
@@ -6,3 +6,12 @@ install -v -m 644 files/wait.conf "${ROOTFS_DIR}/etc/systemd/system/dhcpcd.serv
|
||||
install -v -d "${ROOTFS_DIR}/etc/wpa_supplicant"
|
||||
install -v -m 600 files/wpa_supplicant.conf "${ROOTFS_DIR}/etc/wpa_supplicant/"
|
||||
|
||||
if [ -v WPA_COUNTRY ]; then
|
||||
echo "country=${WPA_COUNTRY}" >> "${ROOTFS_DIR}/etc/wpa_supplicant/wpa_supplicant.conf"
|
||||
fi
|
||||
|
||||
if [ -v WPA_ESSID ] && [ -v WPA_PASSWORD ]; then
|
||||
on_chroot <<EOF
|
||||
wpa_passphrase "${WPA_ESSID}" "${WPA_PASSWORD}" >> "/etc/wpa_supplicant/wpa_supplicant.conf"
|
||||
EOF
|
||||
fi
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
#Alacarte fixes
|
||||
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/pi/.local"
|
||||
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/pi/.local/share"
|
||||
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/pi/.local/share/applications"
|
||||
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/pi/.local/share/desktop-directories"
|
||||
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.local"
|
||||
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.local/share"
|
||||
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.local/share/applications"
|
||||
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.local/share/desktop-directories"
|
||||
|
||||
@@ -11,6 +11,5 @@ fi
|
||||
|
||||
file "files/$magpi_latest" | grep -q "PDF document"
|
||||
|
||||
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/pi/MagPi"
|
||||
install -v -o 1000 -g 1000 -m 644 "files/$magpi_latest" "${ROOTFS_DIR}/home/pi/MagPi/"
|
||||
|
||||
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/MagPi"
|
||||
install -v -o 1000 -g 1000 -m 644 "files/$magpi_latest" "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/MagPi/"
|
||||
|
||||
Reference in New Issue
Block a user