Compare commits

..
Author SHA1 Message Date
Serge Schneider e910bf55ac Update release notes 2019-04-02 18:58:30 +01:00
Serge Schneider ee11b802b5 stage2: ethtool 2019-04-01 13:05:30 +01:00
XECDesign 3e9b176fab stage2: install rng-tools
https://github.com/raspberrypi/linux/issues/2799
2019-03-29 19:45:31 +00:00
Andrew Scheller 30a1528ae1 Switch to using parted's machine parseable output (#270) 2019-03-18 14:49:18 +00:00
Serge Schneider fb23b8ba92 Replace pxz with xz -T0 2019-03-11 11:49:04 +00:00
XECDesign 91bc38d510 Update Dockerfile 2019-03-11 11:14:04 +00:00
Serge Schneider 67241b9626 Handle cases where binfmt_misc is built into the kernel
Fixes #264
2019-03-06 16:25:42 +00:00
samtygier b7812278a8 Warn early if proxy not reachable (#262)
Avoids a later failure with a less informative message. See #248
2019-02-18 23:41:41 +00:00
Hugo Hromic 564f8ef1b8 Silence shellcheck warnings (#255)
* Made more specific shellcheck disables
* Fixed variable quoting (SC2086,SC2064)
* Use `$*` expansion instead of `$@` when not using arrays (SC2124)
* Use cleaner `$()` syntax instead of back quotes (SC2006)
* Improved comparator (SC2166)
* Minor improvements in coding style

Tested clean output using: `find -name "*.sh" | xargs -n1 shellcheck -x`.
2019-02-18 12:54:15 +00:00
Sam Tygier 7068086c94 Make sure unmount_image finds stale loop devices
Fixes #257 #104 #193

Instead of searching by full path, which is prone to fail, read full list and grep on filename.
2019-02-18 12:01:00 +00:00
Sam Tygier 9d38bfac23 README.md: Add more info on Docker 2019-02-18 09:45:10 +00:00
Sam Tygier 82bcfa427a Use different rsync options for boot and root
When copying files to boot, options that are not supported on fat32 can cause errors. For example owner, group and xattrs.
2019-02-18 09:45:10 +00:00
Sam Tygier a8eb03a5e4 Check binfmt_misc module is loaded
Give a friendly error message early.
2019-02-18 09:45:10 +00:00
Sam Tygier c147df99bc Ensure extra config file is passed to docker
Fixes #253

Rather than use --env-file, which gets overwritten by the regular config file, pass the any arguments to build-docker.sh through to build.sh.
2019-02-18 09:30:23 +00:00
Hugo Hromic 9e6af47045 Improve update_issue() function in common script
* Allow to customise pi-gen script name and repository in the generated issue file
* Preserve compatibility with existing function calls
2019-02-18 09:21:10 +00:00
Hugo Hromic 3b90b7ffed Improve bootstrap() function in common script
* Tidy up and simplify function code
* Allow to pass extra arguments to debootstrap, e.g. `--variant minbase`
* Preserve compatibility with existing function calls
2019-02-18 09:21:10 +00:00
Louis Matthijssen 3961bff8a4 Decrease zerofree verbosity
Fixes #251
2019-01-30 20:49:45 +00:00
Louis Matthijssen 61a994c88c Add a DEPLOY_ZIP setting 2019-01-30 19:05:22 +00:00
XECDesign d945d422d4 Update 00-run.sh
Fix typo
2019-01-23 15:32:08 +00:00
Sam Tygier c72f0b47ff Quote wpa wifi variables
Allows essid and passwords with special characters.
2019-01-22 17:44:28 +10:00
Sam Tygier 9714a11204 Add username validation
Check that the username is valid before doing any work. Use the default regex from debian's adduser.conf. Will also avoid risk of special characters causing issues.
2019-01-22 17:44:28 +10:00
Błażej Sowa d88f536536 IMG_SUFFIX evaluation in export image (fix #241) 2019-01-22 17:33:18 +10:00
Hereath 21aeca1b0c fixeb package realpath (via coreutils) 2019-01-21 19:42:08 +10:00
gudata 640027d5df build script is build.sh
build script is build.sh
2019-01-21 19:29:17 +10:00
Mike Roberts 3b1d05144f Fixed another hard reference to the 'pi' user name 2019-01-15 21:16:02 +10:00
rkubes 189b8f0400 Fixed a hard reference to the 'pi' user name 2019-01-15 12:16:42 +10:00
Sam Tygier d7ef46b06a Allow custom stages
STAGE_LIST can be specified in the config file to run additional build stages.
2019-01-07 12:49:45 +10:00
Błażej Sowa d7ca8e8f14 Allow custom deploy zip filename 2018-12-21 04:11:13 +00:00
Błażej Sowa 08405eb792 Allow custom image filename 2018-12-21 04:11:13 +00:00
Sam Tygier 7fbfdda31e Add commandline argument for config file
A config file can be specified when running build, e.g.:

  ./build.sh myconfig
2018-12-21 04:09:47 +00:00
Sam Tygier cc6605695d Allow enabling ssh server from config
Add ENABLE_SSH option
2018-12-21 04:09:47 +00:00
Sam Tygier f4dc2dcce6 Allow setting up wifi from config
Add WPA_ESSID, WPA_PASSWORD and WPA_COUNTRY options to config.
2018-12-21 04:09:47 +00:00
Sam Tygier d07096ebb5 Allow setting user name and password from config
Add FIRST_USER_NAME and FIRST_USER_PASS variables that can be set
in the config (or enviroment). Defaults to the standard pi and
raspberry.
2018-12-21 04:09:47 +00:00
Serge Schneider d1b747747c Add PINN restore support 2018-12-11 15:12:40 +00:00
19 changed files with 235 additions and 111 deletions
+2 -2
View File
@@ -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/
+46 -2
View File
@@ -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
+20 -22
View File
@@ -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,29 +14,29 @@ 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
fi
@@ -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/"
+43 -3
View File
@@ -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
+3 -2
View File
@@ -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 -1
View File
@@ -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' ')"
+12 -7
View File
@@ -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"
if [ "${DEPLOY_ZIP}" == "1" ]; then
pushd "${STAGE_WORK_DIR}" > /dev/null
zip "${DEPLOY_DIR}/image_${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.zip" \
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
View File
@@ -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,9 +15,11 @@ 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 |"
# shellcheck disable=SC2154
if [ -z "$restore" ]; then
if [ -f /mnt/ssh ]; then
cp /mnt/ssh /tmp/1/
fi
@@ -31,6 +35,7 @@ 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
fi
fi
umount /tmp/1
umount /tmp/2
@@ -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
View File
@@ -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
View File
@@ -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
+8
View File
@@ -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
}
+3 -3
View File
@@ -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
+2
View File
@@ -23,3 +23,5 @@ htop
man-db
policykit-1
ssh-import-id
rng-tools
ethtool
+7 -3
View File
@@ -15,7 +15,11 @@ on_chroot << EOF
systemctl disable hwclock.sh
systemctl disable nfs-common
systemctl disable rpcbind
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
+9
View File
@@ -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
+4 -4
View File
@@ -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"
+2 -3
View File
@@ -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/"