Compare commits
93 Commits
2019-06-20
...
master
Author | SHA1 | Date |
---|---|---|
B.J. Dweck | dd43d98867 | |
B.J. Dweck | 171dc63701 | |
B.J. Dweck | 03890a3973 | |
B.J. Dweck | 9556d96872 | |
B.J. Dweck | 3615fdce98 | |
B.J. Dweck | fac7876b18 | |
B.J. Dweck | 8f3c43116e | |
B.J. Dweck | d58c7244ec | |
B.J. Dweck | d6babca3c7 | |
B.J. Dweck | 5d9bb8b017 | |
B.J. Dweck | 2df48bcb6c | |
B.J. Dweck | e315c692d9 | |
B.J. Dweck | 052631361a | |
B.J. Dweck | bc2505a534 | |
B.J. Dweck | ff9a6a2f5d | |
B.J. Dweck | 4f80f9a7e4 | |
B.J. Dweck | 0e722a9e71 | |
Serge Schneider | d6207a620a | |
Serge Schneider | 78c9e2cf02 | |
Serge Schneider | 930d86115d | |
Serge Schneider | 9a3a10bf10 | |
Serge Schneider | f663d4c6d1 | |
Serge Schneider | 825107f040 | |
Serge Schneider | b9bb59c237 | |
DragonEagle | 08fc0b9a82 | |
Leandro Lisboa Penz | 8ef3f47d7f | |
Tim Visée | 65f91b8349 | |
Luigi F. Cruz | 38d22e976a | |
Serge Schneider | 5f884374b6 | |
Serge Schneider | 6d71ac0bf9 | |
Serge Schneider | 6b72a64f02 | |
Serge Schneider | e577677b62 | |
Serge Schneider | 87f7a59cab | |
Serge Schneider | 306c7eba3b | |
Serge Schneider | b4ea63c045 | |
Serge Schneider | bdbd85892e | |
Serge Schneider | ca31aef1f7 | |
Serge Schneider | 0a6624b26d | |
Serge Schneider | 24bb01dec2 | |
Andrew Pattison | f8f3d6fe93 | |
Andrew Pattison | f9375cdcec | |
Sam Tygier | 9d334bee66 | |
Sam Tygier | 024840034e | |
Sam Tygier | 271177a0f7 | |
Christian Decker | 9d15c0f7d1 | |
RaspberryPiFan | 32353a162b | |
Christian Decker | 18c3cebe94 | |
RaspberryPiFan | 8bdbbfb099 | |
RaspberryPiFan | d7c1ae21ca | |
Leander | 5456c3801f | |
Leander | 5e19033387 | |
Leander | 7f143a185e | |
snoe925 | a449c75fac | |
Serge Schneider | 95ba042c83 | |
Rene Klootwijk | d30343f626 | |
Serge Schneider | 19c0188798 | |
Matthijs Kooijman | 336ff2107e | |
Serge Schneider | 8026d9dc8f | |
Serge Schneider | 80d486687e | |
Serge Schneider | 5780006ecd | |
Matthijs Kooijman | 99f702f0ff | |
Serge Schneider | 946f164006 | |
Serge Schneider | 6538d5babf | |
fpicalausa | 652780757b | |
Serge Schneider | d1ed4a2982 | |
Russ Kubes | 00c22ab57e | |
Serge Schneider | e8460beb3b | |
Serge Schneider | 77833ba929 | |
Serge Schneider | c49261d756 | |
Serge Schneider | a016561600 | |
Serge Schneider | c1ff2b1cac | |
Serge Schneider | 28f344144c | |
Joshua Bussdieker | d1f7a38905 | |
Christophe Hurpeau | 8110eb4891 | |
Kevin Stone | 18b945ffb2 | |
Hugo Hromic | 920e22bdc5 | |
Jens Hilligsøe | 5436273ec7 | |
132ikl | c0714e33d6 | |
Serge Schneider | 9c0a25d852 | |
Serge Schneider | 210b51c293 | |
Serge Schneider | 4c575d7e8f | |
Serge Schneider | 175dfb027f | |
Serge Schneider | 37482277d3 | |
Serge Schneider | 4118f8d524 | |
gscscnd | 1143530351 | |
gscscnd | fd21eff626 | |
Samuele Maci | ae4ec6445e | |
Xerxes Rånby | 57ef9b88e3 | |
Ondřej Caletka | 3db1168fbd | |
Russ Kubes | 4ca539cb45 | |
Ryan Walmsley | 3c559aeb56 | |
Hugo Hromic | cf50ff26d2 | |
Serge Schneider | a4be08e275 |
|
@ -1,12 +1,13 @@
|
|||
FROM debian:stretch
|
||||
FROM debian:buster
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
|
||||
RUN apt-get -y update && \
|
||||
apt-get -y install \
|
||||
apt-get -y install --no-install-recommends \
|
||||
git vim parted \
|
||||
quilt coreutils qemu-user-static debootstrap zerofree zip dosfstools \
|
||||
bsdtar libcap2-bin rsync grep udev xz-utils curl xxd file kmod\
|
||||
bsdtar libcap2-bin rsync grep udev xz-utils curl xxd file kmod bc\
|
||||
binfmt-support ca-certificates \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY . /pi-gen/
|
||||
|
|
|
@ -1,12 +1,21 @@
|
|||
# pi-gen
|
||||
# Burrow Pi Image
|
||||
|
||||
_Tool used to create the raspberrypi.org Raspbian images_
|
||||
This is a fork of the [pi-gen](https://github.com/RPi-Distro/pi-gen) project, the "tool used to create the raspberrypi.org Raspbian images". `pi-gen` serves as a decent base becuase it:
|
||||
|
||||
* Builds compact images that self-inflate on the device during the first boot
|
||||
* Provides a comfortable development workflow
|
||||
|
||||
I modified `pi-gen` with the following features:
|
||||
|
||||
* Rudefox Burrow installed
|
||||
* Auto-login
|
||||
* Read-only filesystem (as a security measure to prevent you from accidentally storing sensitive information on this low-security hardware)
|
||||
* Most user-space networking packages removed (kernel still included networking capabilities)
|
||||
|
||||
## Dependencies
|
||||
|
||||
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
|
||||
either Debian Buster or Ubuntu Xenial and is known to have issues building on
|
||||
earlier releases of these systems. On other Linux distributions it may be possible
|
||||
to use the Docker build described below.
|
||||
|
||||
|
@ -14,7 +23,7 @@ To install the required dependencies for pi-gen you should run:
|
|||
|
||||
```bash
|
||||
apt-get install coreutils quilt parted qemu-user-static debootstrap zerofree zip \
|
||||
dosfstools bsdtar libcap2-bin grep rsync xz-utils file git curl
|
||||
dosfstools bsdtar libcap2-bin grep rsync xz-utils file git curl bc
|
||||
```
|
||||
|
||||
The file `depends` contains a list of tools needed. The format of this
|
||||
|
@ -29,13 +38,26 @@ environment variables.
|
|||
|
||||
The following environment variables are supported:
|
||||
|
||||
* `IMG_NAME` **required** (Default: unset)
|
||||
* `IMG_NAME` (Default: `RudefoxBurrow`)
|
||||
|
||||
The name of the image to build with the current stage directories. Setting
|
||||
`IMG_NAME=Raspbian` is logical for an unmodified RPi-Distro/pi-gen build,
|
||||
but you should use something else for a customized version. Export files
|
||||
in stages may add suffixes to `IMG_NAME`.
|
||||
|
||||
* `RUDEFOX_REPO_USERNAME` (Default: `anonymous`)
|
||||
|
||||
If the value is set to `anonymous`, then Burrow is pulled from the publicly available Rudefox repository. Otherwise, the build attempts to login to the Rudefox private repository for access to SNAPSHOT builds using the provided `RUDEFOX_REPO_USERNAME` / `RUDEFOX_REPO_PASSWORD` credentials.
|
||||
|
||||
* `RUDEFOX_BURROW_VERSION` (Default: `latest`)
|
||||
|
||||
If the value is set to `latest`, then the latest version is pulled from the Rudefox repository and installed. Otherwise, the specified version is downloadedand installed.
|
||||
|
||||
* `RELEASE` (Default: buster)
|
||||
|
||||
The release version to build images against. Valid values are jessie, stretch
|
||||
buster, bullseye, and testing.
|
||||
|
||||
* `APT_PROXY` (Default: unset)
|
||||
|
||||
If you require the use of an apt proxy, set it here. This proxy setting
|
||||
|
@ -62,7 +84,7 @@ The following environment variables are supported:
|
|||
be built and cached. Note, `WORK_DIR` stores a complete copy of the target
|
||||
system for each build stage, amounting to tens of gigabytes in the case of
|
||||
Raspbian.
|
||||
|
||||
|
||||
**CAUTION**: If your working directory is on an NTFS partition you probably won't be able to build. Make sure this is a proper Linux filesystem.
|
||||
|
||||
* `DEPLOY_DIR` (Default: `"$BASE_DIR/deploy"`)
|
||||
|
@ -78,30 +100,72 @@ The following environment variables are supported:
|
|||
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" )
|
||||
* `LOCALE_DEFAULT` (Default: "en_CA.UTF-8" )
|
||||
|
||||
Default system locale.
|
||||
|
||||
* `TARGET_HOSTNAME` (Default: "burrow" )
|
||||
|
||||
Setting the hostname to the specified value.
|
||||
|
||||
* `KEYBOARD_MODEL` (Default: "Generic 101-key PC" )
|
||||
|
||||
Default keyboard model.
|
||||
|
||||
To get the current value from a running system, run `debconf-show
|
||||
keyboard-configuration` and look at the
|
||||
`keyboard-configuration/model` value.
|
||||
|
||||
* `KEYBOARD_KEYMAP` (Default: "us" )
|
||||
|
||||
Default keyboard keymap.
|
||||
|
||||
To get the current value from a running system, run `debconf-show
|
||||
keyboard-configuration` and look at the
|
||||
`keyboard-configuration/xkb-keymap` value.
|
||||
|
||||
* `KEYBOARD_LAYOUT` (Default: "English (UK)" )
|
||||
|
||||
Default keyboard layout.
|
||||
|
||||
To get the current value from a running system, run `debconf-show
|
||||
keyboard-configuration` and look at the
|
||||
`keyboard-configuration/variant` value.
|
||||
|
||||
* `TIMEZONE_DEFAULT` (Default: "Europe/London" )
|
||||
|
||||
Default keyboard layout.
|
||||
|
||||
To get the current value from a running system, look in
|
||||
`/etc/timezone`.
|
||||
|
||||
* `FIRST_USER_NAME` (Default: "rudefox" )
|
||||
|
||||
Username for the first user
|
||||
|
||||
* `FIRST_USER_PASS` (Default: "raspberry")
|
||||
* `FIRST_USER_PASS` (Default: "burrow")
|
||||
|
||||
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.
|
||||
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. If `WPA_ESSID` is set and `WPA_PASSWORD` is unset an unprotected wifi network will be configured. If set, `WPA_PASSWORD` must be between 8 and 63 characters.
|
||||
|
||||
* `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.
|
||||
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 Raspberry Pi.
|
||||
|
||||
* `STAGE_LIST` (Default: `stage*`)
|
||||
* `STAGE_LIST` (Default: `stage[0-2]`)
|
||||
|
||||
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. Note that quotes are needed around the list. An absolute or relative path can be given for stages outside the pi-gen directory.
|
||||
The default setting builds only the "lite" image for Rudefox Burrow, which is all you need.
|
||||
|
||||
A simple example for building Raspbian:
|
||||
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. Note that quotes are needed around the list. An absolute or relative path can be given for stages outside the pi-gen directory.
|
||||
|
||||
A simple example for building RaspbianBurrow:
|
||||
|
||||
```bash
|
||||
IMG_NAME='Raspbian'
|
||||
APT_PROXY=http://172.17.10.10:3142
|
||||
TIMEZONE_DEFAULT="America/Toronto"
|
||||
```
|
||||
|
||||
The config file can also be specified on the command line as an argument the `build.sh` or `build-docker.sh` scripts.
|
||||
|
@ -246,14 +310,13 @@ maintenance and allows for more easy customization.
|
|||
enhancements, etc. This is a base desktop system, with some development
|
||||
tools installed.
|
||||
|
||||
- **Stage 4** - Raspbian system meant to fit on a 4GB card. More development
|
||||
tools, an email client, learning tools like Scratch, specialized packages
|
||||
like sonic-pi, system documentation, office productivity, etc. This is the
|
||||
stage that installs all of the things that make Raspbian friendly to new
|
||||
users.
|
||||
- **Stage 4** - Normal Raspbian image. System meant to fit on a 4GB card. This is the
|
||||
stage that installs most things that make Raspbian friendly to new
|
||||
users like system documentation.
|
||||
|
||||
- **Stage 5** - The official Raspbian Desktop image. Right now only adds
|
||||
Mathematica.
|
||||
- **Stage 5** - The Raspbian Full image. More development
|
||||
tools, an email client, learning tools like Scratch, specialized packages
|
||||
like sonic-pi, office productivity, etc.
|
||||
|
||||
### Stage specification
|
||||
|
||||
|
@ -261,7 +324,7 @@ If you wish to build up to a specified stage (such as building up to stage 2
|
|||
for a lite system), place an empty file named `SKIP` in each of the `./stage`
|
||||
directories you wish not to include.
|
||||
|
||||
Then add an empty file named `SKIP_IMAGES` to `./stage4` (if building up to stage 2) or
|
||||
Then add an empty file named `SKIP_IMAGES` to `./stage4` and `./stage5` (if building up to stage 2) or
|
||||
to `./stage2` (if building a minimal system).
|
||||
|
||||
```bash
|
||||
|
@ -295,6 +358,9 @@ follows:
|
|||
|
||||
# Troubleshooting
|
||||
|
||||
## `64 Bit Systems`
|
||||
Please note there is currently an issue when compiling with a 64 Bit OS. See https://github.com/RPi-Distro/pi-gen/issues/271
|
||||
|
||||
## `binfmt_misc`
|
||||
|
||||
Linux is able execute binaries from other architectures, meaning that it should be
|
||||
|
|
|
@ -1,72 +1,89 @@
|
|||
#!/bin/bash -e
|
||||
#!/bin/bash -eu
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||
|
||||
BUILD_OPTS="$*"
|
||||
|
||||
DOCKER="docker"
|
||||
set +e
|
||||
if ! $DOCKER ps >/dev/null 2>&1; then
|
||||
|
||||
if ! ${DOCKER} ps >/dev/null 2>&1; then
|
||||
DOCKER="sudo docker"
|
||||
fi
|
||||
if ! $DOCKER ps >/dev/null; then
|
||||
if ! ${DOCKER} ps >/dev/null; then
|
||||
echo "error connecting to docker:"
|
||||
$DOCKER ps
|
||||
${DOCKER} ps
|
||||
exit 1
|
||||
fi
|
||||
set -e
|
||||
|
||||
if [ -f config ]; then
|
||||
# shellcheck disable=SC1091
|
||||
source config
|
||||
CONFIG_FILE=""
|
||||
if [ -f "${DIR}/config" ]; then
|
||||
CONFIG_FILE="${DIR}/config"
|
||||
fi
|
||||
|
||||
while getopts "c:" flag
|
||||
do
|
||||
case "$flag" in
|
||||
case "${flag}" in
|
||||
c)
|
||||
# shellcheck disable=SC1090
|
||||
source "$OPTARG"
|
||||
CONFIG_FILE="${OPTARG}"
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Ensure that the configuration file is an absolute path
|
||||
if test -x /usr/bin/realpath; then
|
||||
CONFIG_FILE=$(realpath -s "$CONFIG_FILE" || realpath "$CONFIG_FILE")
|
||||
fi
|
||||
|
||||
# Ensure that the confguration file is present
|
||||
if test -z "${CONFIG_FILE}"; then
|
||||
echo "Configuration file need to be present in '${DIR}/config' or path passed as parameter"
|
||||
exit 1
|
||||
else
|
||||
# shellcheck disable=SC1090
|
||||
source ${CONFIG_FILE}
|
||||
fi
|
||||
|
||||
CONTAINER_NAME=${CONTAINER_NAME:-pigen_work}
|
||||
CONTINUE=${CONTINUE:-0}
|
||||
PRESERVE_CONTAINER=${PRESERVE_CONTAINER:-0}
|
||||
|
||||
if [ -z "${IMG_NAME}" ]; then
|
||||
echo "IMG_NAME not set in 'config'" 1>&2
|
||||
echo 1>&2
|
||||
exit 1
|
||||
fi
|
||||
# Ensure the Git Hash is recorded before entering the docker container
|
||||
GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"}
|
||||
|
||||
CONTAINER_EXISTS=$($DOCKER ps -a --filter name="$CONTAINER_NAME" -q)
|
||||
CONTAINER_RUNNING=$($DOCKER ps --filter name="$CONTAINER_NAME" -q)
|
||||
if [ "$CONTAINER_RUNNING" != "" ]; then
|
||||
echo "The build is already running in container $CONTAINER_NAME. Aborting."
|
||||
CONTAINER_EXISTS=$(${DOCKER} ps -a --filter name="${CONTAINER_NAME}" -q)
|
||||
CONTAINER_RUNNING=$(${DOCKER} ps --filter name="${CONTAINER_NAME}" -q)
|
||||
if [ "${CONTAINER_RUNNING}" != "" ]; then
|
||||
echo "The build is already running in container ${CONTAINER_NAME}. Aborting."
|
||||
exit 1
|
||||
fi
|
||||
if [ "$CONTAINER_EXISTS" != "" ] && [ "$CONTINUE" != "1" ]; then
|
||||
echo "Container $CONTAINER_NAME already exists and you did not specify CONTINUE=1. Aborting."
|
||||
if [ "${CONTAINER_EXISTS}" != "" ] && [ "${CONTINUE}" != "1" ]; then
|
||||
echo "Container ${CONTAINER_NAME} already exists and you did not specify CONTINUE=1. Aborting."
|
||||
echo "You can delete the existing container like this:"
|
||||
echo " $DOCKER rm -v $CONTAINER_NAME"
|
||||
echo " ${DOCKER} rm -v ${CONTAINER_NAME}"
|
||||
exit 1
|
||||
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
|
||||
time $DOCKER run --rm --privileged \
|
||||
# Modify original build-options to allow config file to be mounted in the docker container
|
||||
BUILD_OPTS="$(echo "${BUILD_OPTS:-}" | sed -E 's@\-c\s?([^ ]+)@-c /config@')"
|
||||
|
||||
${DOCKER} build -t pi-gen "${DIR}"
|
||||
if [ "${CONTAINER_EXISTS}" != "" ]; then
|
||||
trap 'echo "got CTRL+C... please wait 5s" && ${DOCKER} stop -t 5 ${CONTAINER_NAME}_cont' SIGINT SIGTERM
|
||||
time ${DOCKER} run --rm --privileged \
|
||||
--volume "${CONFIG_FILE}":/config:ro \
|
||||
-e "GIT_HASH=${GIT_HASH}" \
|
||||
--volumes-from="${CONTAINER_NAME}" --name "${CONTAINER_NAME}_cont" \
|
||||
pi-gen \
|
||||
bash -e -o pipefail -c "dpkg-reconfigure qemu-user-static &&
|
||||
cd /pi-gen; ./build.sh ${BUILD_OPTS} ;
|
||||
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
|
||||
time $DOCKER run --name "${CONTAINER_NAME}" --privileged \
|
||||
trap 'echo "got CTRL+C... please wait 5s" && ${DOCKER} stop -t 5 ${CONTAINER_NAME}' SIGINT SIGTERM
|
||||
time ${DOCKER} run --name "${CONTAINER_NAME}" --privileged \
|
||||
--volume "${CONFIG_FILE}":/config:ro \
|
||||
-e "GIT_HASH=${GIT_HASH}" \
|
||||
pi-gen \
|
||||
bash -e -o pipefail -c "dpkg-reconfigure qemu-user-static &&
|
||||
cd /pi-gen; ./build.sh ${BUILD_OPTS} &&
|
||||
|
@ -74,12 +91,12 @@ else
|
|||
wait "$!"
|
||||
fi
|
||||
echo "copying results from deploy/"
|
||||
$DOCKER cp "${CONTAINER_NAME}":/pi-gen/deploy .
|
||||
${DOCKER} cp "${CONTAINER_NAME}":/pi-gen/deploy .
|
||||
ls -lah deploy
|
||||
|
||||
# cleanup
|
||||
if [ "$PRESERVE_CONTAINER" != "1" ]; then
|
||||
$DOCKER rm -v "$CONTAINER_NAME"
|
||||
if [ "${PRESERVE_CONTAINER}" != "1" ]; then
|
||||
${DOCKER} rm -v "${CONTAINER_NAME}"
|
||||
fi
|
||||
|
||||
echo "Done! Your image(s) should be in deploy/"
|
||||
|
|
43
build.sh
43
build.sh
|
@ -20,7 +20,7 @@ EOF
|
|||
PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${i}-packages-nr")"
|
||||
if [ -n "$PACKAGES" ]; then
|
||||
on_chroot << EOF
|
||||
apt-get install --no-install-recommends -y $PACKAGES
|
||||
apt-get -o APT::Acquire::Retries=3 install --no-install-recommends -y $PACKAGES
|
||||
EOF
|
||||
fi
|
||||
log "End ${SUB_STAGE_DIR}/${i}-packages-nr"
|
||||
|
@ -30,7 +30,7 @@ EOF
|
|||
PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${i}-packages")"
|
||||
if [ -n "$PACKAGES" ]; then
|
||||
on_chroot << EOF
|
||||
apt-get install -y $PACKAGES
|
||||
apt-get -o APT::Acquire::Retries=3 install -y $PACKAGES
|
||||
EOF
|
||||
fi
|
||||
log "End ${SUB_STAGE_DIR}/${i}-packages"
|
||||
|
@ -122,6 +122,8 @@ if [ "$(id -u)" != "0" ]; then
|
|||
exit 1
|
||||
fi
|
||||
|
||||
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
export BASE_DIR
|
||||
|
||||
if [ -f config ]; then
|
||||
# shellcheck disable=SC1091
|
||||
|
@ -144,31 +146,41 @@ 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
|
||||
fi
|
||||
export IMG_NAME="${IMG_NAME:-RasbianBurrow}"
|
||||
export RUDEFOX_REPO_USERNAME="${RUDEFOX_REPO_USERNAME:-anonymous}"
|
||||
export RUDEFOX_REPO_PASSWORD="${RUDEFOX_REPO_PASSWORD:-default}"
|
||||
export RUDEFOX_BURROW_VERSION="${RUDEFOX_BURROW_VERSION:-latest}"
|
||||
|
||||
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 TARGET_HOSTNAME=${TARGET_HOSTNAME:-burrow}
|
||||
|
||||
export FIRST_USER_NAME=${FIRST_USER_NAME:-rudefox}
|
||||
export FIRST_USER_PASS=${FIRST_USER_PASS:-burrow}
|
||||
export RELEASE=${RELEASE:-buster}
|
||||
export WPA_ESSID
|
||||
export WPA_PASSWORD
|
||||
export WPA_COUNTRY
|
||||
export ENABLE_SSH="${ENABLE_SSH:-0}"
|
||||
|
||||
export BASE_DIR
|
||||
export LOCALE_DEFAULT="${LOCALE_DEFAULT:-en_CA.UTF-8}"
|
||||
|
||||
export KEYBOARD_MODEL="${KEYBOARD_MODEL:-Generic 101-key PC}"
|
||||
export KEYBOARD_KEYMAP="${KEYBOARD_KEYMAP:-us}"
|
||||
export KEYBOARD_LAYOUT="${KEYBOARD_LAYOUT:-English (UK)}"
|
||||
|
||||
export TIMEZONE_DEFAULT="${TIMEZONE_DEFAULT:-Europe/London}"
|
||||
|
||||
export GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"}
|
||||
|
||||
export CLEAN
|
||||
export IMG_NAME
|
||||
|
@ -197,6 +209,8 @@ source "${SCRIPT_DIR}/common"
|
|||
# shellcheck source=scripts/dependencies_check
|
||||
source "${SCRIPT_DIR}/dependencies_check"
|
||||
|
||||
dependencies_check "${BASE_DIR}/depends"
|
||||
|
||||
#check username is valid
|
||||
if [[ ! "$FIRST_USER_NAME" =~ ^[a-z][-a-z0-9_]*$ ]]; then
|
||||
echo "Invalid FIRST_USER_NAME: $FIRST_USER_NAME"
|
||||
|
@ -208,12 +222,15 @@ if [[ -n "${APT_PROXY}" ]] && ! curl --silent "${APT_PROXY}" >/dev/null ; then
|
|||
exit 1
|
||||
fi
|
||||
|
||||
dependencies_check "${BASE_DIR}/depends"
|
||||
if [[ -n "${WPA_PASSWORD}" && ${#WPA_PASSWORD} -lt 8 || ${#WPA_PASSWORD} -gt 63 ]] ; then
|
||||
echo "WPA_PASSWORD" must be between 8 and 63 characters
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "${WORK_DIR}"
|
||||
log "Begin ${BASE_DIR}"
|
||||
|
||||
STAGE_LIST=${STAGE_LIST:-${BASE_DIR}/stage*}
|
||||
STAGE_LIST=${STAGE_LIST:-${BASE_DIR}/stage[0-2]}
|
||||
|
||||
for STAGE_DIR in $STAGE_LIST; do
|
||||
STAGE_DIR=$(realpath "${STAGE_DIR}")
|
||||
|
@ -237,7 +254,7 @@ for EXPORT_DIR in ${EXPORT_DIRS}; do
|
|||
fi
|
||||
done
|
||||
|
||||
if [ -x postrun.sh ]; then
|
||||
if [ -x ${BASE_DIR}/postrun.sh ]; then
|
||||
log "Begin postrun.sh"
|
||||
cd "${BASE_DIR}"
|
||||
./postrun.sh
|
||||
|
|
|
@ -4,8 +4,12 @@ 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
|
||||
if [ -x /etc/init.d/fake-hwclock ]; then
|
||||
/etc/init.d/fake-hwclock stop
|
||||
fi
|
||||
if hash hardlink 2>/dev/null; then
|
||||
hardlink -t /usr/share/doc
|
||||
fi
|
||||
EOF
|
||||
|
||||
if [ -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config" ]; then
|
||||
|
|
|
@ -10,32 +10,27 @@ rm -rf "${ROOTFS_DIR}"
|
|||
mkdir -p "${ROOTFS_DIR}"
|
||||
|
||||
BOOT_SIZE="$((256 * 1024 * 1024))"
|
||||
TOTAL_SIZE=$(du --apparent-size -s "${EXPORT_ROOTFS_DIR}" --exclude var/cache/apt/archives --block-size=1 | cut -f 1)
|
||||
ROOT_SIZE=$(du --apparent-size -s "${EXPORT_ROOTFS_DIR}" --exclude var/cache/apt/archives --exclude boot --block-size=1 | cut -f 1)
|
||||
|
||||
ROUND_SIZE="$((4 * 1024 * 1024))"
|
||||
ROUNDED_ROOT_SECTOR=$(((BOOT_SIZE + ROUND_SIZE) / ROUND_SIZE * ROUND_SIZE / 512 + 8192))
|
||||
IMG_SIZE=$(((BOOT_SIZE + TOTAL_SIZE + (800 * 1024 * 1024) + ROUND_SIZE - 1) / ROUND_SIZE * ROUND_SIZE))
|
||||
# All partition sizes and starts will be aligned to this size
|
||||
ALIGN="$((4 * 1024 * 1024))"
|
||||
# Add this much space to the calculated file size. This allows for
|
||||
# some overhead (since actual space usage is usually rounded up to the
|
||||
# filesystem block size) and gives some free space on the resulting
|
||||
# image.
|
||||
ROOT_MARGIN="$(echo "($ROOT_SIZE * 0.2 + 200 * 1024 * 1024) / 1" | bc)"
|
||||
|
||||
BOOT_PART_START=$((ALIGN))
|
||||
BOOT_PART_SIZE=$(((BOOT_SIZE + ALIGN - 1) / ALIGN * ALIGN))
|
||||
ROOT_PART_START=$((BOOT_PART_START + BOOT_PART_SIZE))
|
||||
ROOT_PART_SIZE=$(((ROOT_SIZE + ROOT_MARGIN + ALIGN - 1) / ALIGN * ALIGN))
|
||||
IMG_SIZE=$((BOOT_PART_START + BOOT_PART_SIZE + ROOT_PART_SIZE))
|
||||
|
||||
truncate -s "${IMG_SIZE}" "${IMG_FILE}"
|
||||
fdisk -H 255 -S 63 "${IMG_FILE}" <<EOF
|
||||
o
|
||||
n
|
||||
|
||||
|
||||
8192
|
||||
+$((BOOT_SIZE / 512))
|
||||
p
|
||||
t
|
||||
c
|
||||
n
|
||||
|
||||
|
||||
${ROUNDED_ROOT_SECTOR}
|
||||
|
||||
|
||||
p
|
||||
w
|
||||
EOF
|
||||
parted --script "${IMG_FILE}" mklabel msdos
|
||||
parted --script "${IMG_FILE}" unit B mkpart primary fat32 "${BOOT_PART_START}" "$((BOOT_PART_START + BOOT_PART_SIZE - 1))"
|
||||
parted --script "${IMG_FILE}" unit B mkpart primary ext4 "${ROOT_PART_START}" "$((ROOT_PART_START + ROOT_PART_SIZE - 1))"
|
||||
|
||||
PARTED_OUT=$(parted -sm "${IMG_FILE}" unit b print)
|
||||
BOOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^1:' | cut -d':' -f 2 | tr -d B)
|
||||
|
|
|
@ -36,6 +36,7 @@ sed "${NOOBS_DIR}/partitions.json" -i -e "s|ROOT_NOM|${ROOT_NOM}|"
|
|||
sed "${NOOBS_DIR}/os.json" -i -e "s|UNRELEASED|${IMG_DATE}|"
|
||||
sed "${NOOBS_DIR}/os.json" -i -e "s|NOOBS_NAME|${NOOBS_NAME}|"
|
||||
sed "${NOOBS_DIR}/os.json" -i -e "s|NOOBS_DESCRIPTION|${NOOBS_DESCRIPTION}|"
|
||||
sed "${NOOBS_DIR}/os.json" -i -e "s|RELEASE|${RELEASE}|"
|
||||
|
||||
sed "${NOOBS_DIR}/release_notes.txt" -i -e "s|UNRELEASED|${IMG_DATE}|"
|
||||
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.7 KiB |
|
@ -16,5 +16,5 @@
|
|||
],
|
||||
"url": "http://www.raspbian.org/",
|
||||
"username": "pi",
|
||||
"version": "buster"
|
||||
"version": "RELEASE"
|
||||
}
|
||||
|
|
|
@ -1,5 +1,180 @@
|
|||
UNRELEASED:
|
||||
*
|
||||
2020-08-20:
|
||||
* raspi-config - added selection of boot device order
|
||||
* raspi-config - added selection of boot EEPROM version
|
||||
* SD Card Copier - copy is now immediately aborted if drives are connected or disconnected while copying
|
||||
* Version 32.0.0.414 of Flash player included
|
||||
* User feedback survey removed from first run of Chromium
|
||||
* Recommended Software - now allows multiple install and reinstall operations without having to close between each one
|
||||
* Bug fix - misleading file browser from panel menu icon selection dialog - icons must now be in icon theme rather than arbitrary files
|
||||
* Bug fix - items in main menu not being translated
|
||||
* Bug fix - raspi-config not detecting audio devices in non-English locales
|
||||
* Bug fix - Bookshelf claiming no disk space in non-English locales
|
||||
* Bug fix - failed installation of both 32 and 64 bit versions of packages by Recommended Software on 64-bit images
|
||||
* Italian translations added (thanks to Emanuele Goldoni and the Italian translation team)
|
||||
* Raspberry Pi firmware ef72c17bcaaeb89093d87bcf71f3228e1b5e1fff
|
||||
* Linux kernel 5.4.51
|
||||
2020-05-27:
|
||||
* Added Bookshelf application
|
||||
* Added Raspberry Pi Diagnostics application
|
||||
* Added magnifier plugin to taskbar - needs magnifier application installed from Recommended Software to enable
|
||||
* Added Magnifier application to Recommended Software
|
||||
* Added marketing questionnaire as initial Chromium tab
|
||||
* Version 0.25 of Scratch 2 included - uses external application to access IMU on SenseHAT
|
||||
* Version 1.0.5 of Scratch 3 included - uses external application to access IMU on SenseHAT
|
||||
* Version 32.0.0.371 of Flash player included
|
||||
* Version 1.0.6 of Node-RED included
|
||||
* Version 6.7.1 of VNC Server included
|
||||
* Version 6.20.113 of VNC Client included
|
||||
* Internal audio outputs enabled as separate ALSA devices
|
||||
* MagPi preinstall removed and replaced with Beginner’s Guide
|
||||
* MagPi weblink removed from main menu
|
||||
* Chromium made default application for PDF files
|
||||
* Common icon loading code for lxpanel plugins used
|
||||
* Italian translations added
|
||||
* Initial move of mouse pointer to menu button disabled
|
||||
* Padding at left of menu button removed
|
||||
* Focus behaviour changed so that focus moves to desktop if no windows are opened - improves reliability of Orca screen reader
|
||||
* Bug fix - focus bug in volume plugin
|
||||
* Bug fix - keyboard repeat interval bug in Mouse & Keyboard Settings
|
||||
* Bug fix - battery detection bug in battery plugin
|
||||
* Bug fix - spurious active areas on taskbar when plugins are hidden
|
||||
* Bug fix - occasional crash in file manager on file selection
|
||||
* Disk ID is now regenerated on first boot
|
||||
* Updated udev rules
|
||||
- Remove unused argon rule
|
||||
- Add vcsm-cma to video group
|
||||
- Add pwm to gpio group
|
||||
* i2cprobe: More flexible I2C/SPI alias mapping
|
||||
* Raspberry Pi firmware 21e1fe3477ffb708a5736ed61a924fd650031136
|
||||
* Linux kernel 4.19.118
|
||||
2020-02-13:
|
||||
* Raspberry Pi Configuration - screen blanking setting disabled if Xscreensaver is installed
|
||||
* Bug fix - switch to turn off VNC server in Raspberry Pi Configuration has no effect
|
||||
* Bug fix - fix %20 characters in file names
|
||||
* Linux kernel 4.19.97
|
||||
* Raspberry Pi firmware 9a34efbf2fc6a27231607ce91a7cb6bf3bdbc0c5
|
||||
- gencmd: Fix measure_clock name for CLOCK_OUTPUT_108
|
||||
- mmal isp: Remote alignment requirements for RGB24 formats
|
||||
- Add missing flags for VC_IMAGE_PROP_YUVUV_4K_CHROMA_ALIGN
|
||||
- platform: Compromise on gpu overclock settings
|
||||
2020-02-05:
|
||||
* Version 3.2.6 of Thonny included - significant improvements in speed, particularly when debugging
|
||||
* Version 1.0.4 of Scratch 3 included - adds new "display stage" and "display sprite" blocks to SenseHAT extension, and loading of files from command line
|
||||
* Version 32.0.0.314 of Flash player included
|
||||
* Version 1.0.3 of NodeRED included
|
||||
* Version 6.6.0 of RealVNC Server and version 6.19.923 of RealVNC Viewer included - adds support for audio
|
||||
* Version 78.0.3904.108 of Chromium included
|
||||
* Mesa updated to 19.3.2 for OpenGL ES 3.1 conformance
|
||||
* Pixel doubling option added in Raspberry Pi Configuration on platforms using FKMS display driver
|
||||
* Orca screen reader added to Recommended Software
|
||||
* Code The Classics Python games added to Recommended Software
|
||||
* File manager - new "places" pane added at top of sidebar to show mounted drives in simplified view; "new folder" icon added to taskbar; expanders in directory browser now correctly show state of subfolders
|
||||
* Multiple monitor support improved - alignment of icons on second desktop corrected, Appearance Settings opens on correct tab when launched from context menu
|
||||
* Raspberry Pi Touchscreen correctly aligned with display
|
||||
* System clock synchronised before installing new packages in startup wizard and Recommended Software
|
||||
* Mixer dialogs added to taskbar volume plugin; separate Audio Preferences application removed
|
||||
* Raspberry Pi Configuration - separate tab added for display options; screen blanking control added
|
||||
* Volume taskbar plugin and raspi-config modified to support separate ALSA devices for internal audio outputs (analogue and HDMI 1 and 2)
|
||||
* Robustness improvements in volume, ejecter and battery taskbar plugins
|
||||
* Movement of mouse pointer to menu button on startup now controlled by point_at_menu parameter in Global section of lxpanel configuration file
|
||||
* Ctrl-Alt-Del and Ctrl-Alt-End shortcuts added to open shutdown options box
|
||||
* Ctrl-Shift-Esc shortcut added to open task manager
|
||||
* Enabled NEON routines in OpenSSL
|
||||
* Linux kernel 4.19.97
|
||||
* Raspberry Pi firmware 149cd7f0487e08e148efe604f8d4d359541cecf4
|
||||
2019-09-26:
|
||||
* rpi-eeprom included
|
||||
- This will automatically update the SPI EEPROM on the Raspberry Pi 4 to the latest stable version.
|
||||
See https://rpf.io/eeprom for more information.
|
||||
* New icon theme for file manager icons
|
||||
* Appearance Settings - option for identical desktop on both monitors
|
||||
* Appearance Settings - option to show different desktop icons on both monitors
|
||||
* Taskbar automatically moved to monitor 0 if monitor 1 not found at boot
|
||||
* Switching of audio output between two HDMI devices added to volume plugin
|
||||
* Switching of audio input devices added to volume plugin
|
||||
* .asoundrc (ALSA config file) now uses 'plug' values to support more devices
|
||||
* Audio Settings tool modified to integrate more closely with volume plugin to reduce duplicated code
|
||||
* Screen Configuration tool now shows separate menus for resolution and refresh rate
|
||||
* Primary and active monitor settings removed from Screen Configuration tool
|
||||
* Overscan support added for FKMS driver
|
||||
* New keyboard shortcuts added - Ctrl-Alt-End brings up shutdown menu; Ctrl-Alt-M moves taskbar between monitors
|
||||
* Latest changes to Bluez ALSA interface integrated to improve connection to Bluetooth audio devices
|
||||
* Mousepad used as simple text editor instead of leafpad
|
||||
* Version 3.2 of Thonny added
|
||||
* Version 74 of Chromium added
|
||||
* Version 3.0.8 of VLC added
|
||||
* Version 32.0.0.255 of Flash player added
|
||||
* Version 6.5.0 of RealVNC Server added
|
||||
* Version 6.19.715 of RealVNC Viewer added (full image only)
|
||||
* Version 12.0.1 of Mathematica added (full image only)
|
||||
* Version 0.20.8 of NodeRED added (full image only)
|
||||
* Version 3.1.0 of Sonic Pi added (full image only)
|
||||
* Scratch 3 added (full image only)
|
||||
* Bug fix - URL handling in Terminal
|
||||
* Bug fix - octal values in SSIDs in network plugin
|
||||
* Bug fix - remaining value in progress bar when transferring files
|
||||
* Bug fix - integration of xarchiver tool with file manager
|
||||
* Bug fix - start menu opening on incorrect monitor
|
||||
* Bug fix - minimised applications wrongly displayed on taskbar on second monitor
|
||||
* Bug fix - Bluetooth icon disappearing on x86 platforms when Bluetooth turned off
|
||||
* Bug fix - Screen Configuration tool not shown on x86 platforms and settings not being saved
|
||||
* Various translation updates
|
||||
* Various minor bug fixes
|
||||
* Epiphany/Web removed
|
||||
* ntfs-3g included
|
||||
* pciutils added
|
||||
* Linux kernel 4.19.75
|
||||
* Raspberry Pi firmware 01508e81ec1e918448227ca864616d56c430b46d
|
||||
2019-07-10:
|
||||
* Clearer options for switching of Pi 4 video output in Raspberry Pi Configuration
|
||||
* Option added to Appearance Settings to move taskbar to second monitor
|
||||
* Option added to Recommended Software to restrict package installs by architecture
|
||||
* New version of Adobe Flash player (32.0.0.223)
|
||||
* Selection of screen refresh rates added to Screen Configuration
|
||||
* Fix for missing text insertion cursor in LibreOffice on Pi 4
|
||||
* Fix for Wi-fi interruption when Wi-fi icon on taskbar is clicked
|
||||
* FIx for incorrect desktop background behind desktop login prompt
|
||||
* Fix for segmentation faults when launching obconf and lxapperarance
|
||||
* Fix for unclosed file pointer in Screen Configuration
|
||||
* Fix for Bluetooth plugin freeze when large numbers of devices detected
|
||||
* Fix for opening URLs not working in lxterminal
|
||||
* Fix for start menu opening on incorrect monitor when launched from keyboard
|
||||
* Fix for taskbar item not having [] removed when un-minimising on second monitor
|
||||
* Fix for Chromium video playback and WebGL performance on Pi 4
|
||||
* Remove 4kp60 option from Raspberry Pi Configuration
|
||||
* Rename hdmi_enable_4k to hdmi_enable_4kp60 in /boot/config.txt and raspi-config
|
||||
* Linux kernel 4.19.57
|
||||
* Raspberry Pi firmware 356f5c2880a3c7e8774025aa6fc934a617553e7b
|
||||
2019-06-20:
|
||||
* Based on Debian Buster
|
||||
* Support for Raspberry Pi 4 hardware
|
||||
* FKMS OpenGL desktop graphics driver and xcompmgr compositing window manager used when running on Raspberry Pi 4
|
||||
* Screen Configuration application added for use with FKMS driver
|
||||
* Raspberry Pi 4 video output options added to Raspberry Pi Configuration
|
||||
* Uses new PiXflat UI theme for GTK and Openbox
|
||||
* CPU activity gauge plugin no longer shown on taskbar by default
|
||||
* CPU temperature gauge plugin added (not shown by default)
|
||||
* USB ejecter and Bluetooth taskbar icons hidden when not appropriate
|
||||
* Version 74.0.3729.157 of Chromium web browser included
|
||||
* Version 32.0.0.207 of Flash player included
|
||||
* IDLE Python IDE removed
|
||||
* Wolfram Mathematica removed temporarily due to incompatibility with Buster
|
||||
* Display of package sizes removed from Recommended Software
|
||||
* Appearance Settings modified to support independent settings for two monitors
|
||||
* Oracle Java 7 and 8 replaced with OpenJDK 11
|
||||
* Miscellaneous small bug fixes
|
||||
* On-board 5GHz WiFi blocked by rfkill by default
|
||||
The block is removed when taking one of the following actions:
|
||||
- Selecting a locale in the first run wizard
|
||||
- Setting the WiFi country in the Raspberry Pi Configuration tool or the Network Settings applet
|
||||
- Setting the WiFi country in raspi-config
|
||||
- Providing a wpa_supplicant.conf file through the boot partition
|
||||
- Running 'rfkill unblock wifi'
|
||||
* Boot partition size set to 256M
|
||||
* Linux kernel 4.19.50
|
||||
* Raspberry Pi firmware 88ca9081f5e51cdedd16d5dbc85ed12a25123201
|
||||
2019-04-08:
|
||||
* Chromium browser updated to version 72
|
||||
* VLC media player updated to version 3.0.6
|
||||
|
|
|
@ -17,8 +17,9 @@ bootstrap(){
|
|||
BOOTSTRAP_ARGS+=(--components "main,contrib,non-free")
|
||||
BOOTSTRAP_ARGS+=(--keyring "${STAGE_DIR}/files/raspberrypi.gpg")
|
||||
BOOTSTRAP_ARGS+=("$@")
|
||||
printf -v BOOTSTRAP_STR '%q ' "${BOOTSTRAP_ARGS[@]}"
|
||||
|
||||
setarch linux32 capsh --drop=cap_setfcap -- "${BOOTSTRAP_CMD}" "${BOOTSTRAP_ARGS[@]}" || true
|
||||
setarch linux32 capsh --drop=cap_setfcap -- -c "'${BOOTSTRAP_CMD}' $BOOTSTRAP_STR" || true
|
||||
|
||||
if [ -d "$2/debootstrap" ]; then
|
||||
rmdir "$2/debootstrap"
|
||||
|
@ -94,9 +95,6 @@ on_chroot() {
|
|||
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}, ${PI_GEN_REPO}, ${GIT_HASH}, ${1}" > "${ROOTFS_DIR}/etc/rpi-issue"
|
||||
}
|
||||
export -f update_issue
|
||||
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
install -m 644 files/sources.list "${ROOTFS_DIR}/etc/apt/"
|
||||
install -m 644 files/raspi.list "${ROOTFS_DIR}/etc/apt/sources.list.d/"
|
||||
sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list"
|
||||
sed -i "s/RELEASE/${RELEASE}/g" "${ROOTFS_DIR}/etc/apt/sources.list.d/raspi.list"
|
||||
|
||||
if [ -n "$APT_PROXY" ]; then
|
||||
install -m 644 files/51cache "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache"
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
deb http://archive.raspberrypi.org/debian/ buster main
|
||||
deb http://archive.raspberrypi.org/debian/ RELEASE main
|
||||
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
|
||||
#deb-src http://archive.raspberrypi.org/debian/ buster main
|
||||
#deb-src http://archive.raspberrypi.org/debian/ RELEASE main
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
|
||||
deb http://raspbian.raspberrypi.org/raspbian/ RELEASE main contrib non-free rpi
|
||||
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
|
||||
#deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
|
||||
#deb-src http://raspbian.raspberrypi.org/raspbian/ RELEASE main contrib non-free rpi
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,5 +1,5 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
if [ ! -d "${ROOTFS_DIR}" ]; then
|
||||
bootstrap buster "${ROOTFS_DIR}" http://raspbian.raspberrypi.org/raspbian/
|
||||
bootstrap ${RELEASE} "${ROOTFS_DIR}" http://raspbian.raspberrypi.org/raspbian/
|
||||
fi
|
||||
|
|
|
@ -1 +1 @@
|
|||
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
|
||||
console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
|
||||
|
|
|
@ -47,8 +47,9 @@
|
|||
#dtparam=i2s=on
|
||||
#dtparam=spi=on
|
||||
|
||||
# Uncomment this to enable the lirc-rpi module
|
||||
#dtoverlay=lirc-rpi
|
||||
# Uncomment this to enable infrared communication.
|
||||
#dtoverlay=gpio-ir,gpio_pin=17
|
||||
#dtoverlay=gpio-ir-tx,gpio_pin=18
|
||||
|
||||
# Additional overlays and parameters are documented /boot/overlays/README
|
||||
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
Index: jessie-stage1/rootfs/etc/hosts
|
||||
===================================================================
|
||||
--- jessie-stage1.orig/rootfs/etc/hosts
|
||||
+++ jessie-stage1/rootfs/etc/hosts
|
||||
@@ -3,3 +3,4 @@
|
||||
ff02::1 ip6-allnodes
|
||||
ff02::2 ip6-allrouters
|
||||
|
||||
+127.0.1.1 raspberrypi
|
|
@ -1 +0,0 @@
|
|||
01-hosts.diff
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
install -m 644 files/ipv6.conf "${ROOTFS_DIR}/etc/modprobe.d/ipv6.conf"
|
||||
install -m 644 files/hostname "${ROOTFS_DIR}/etc/hostname"
|
||||
echo "${TARGET_HOSTNAME}" > "${ROOTFS_DIR}/etc/hostname"
|
||||
echo "127.0.1.1 ${TARGET_HOSTNAME}" >> "${ROOTFS_DIR}/etc/hosts"
|
||||
|
||||
ln -sf /dev/null "${ROOTFS_DIR}/etc/systemd/network/99-default.link"
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
raspberrypi
|
|
@ -1,4 +0,0 @@
|
|||
auto lo
|
||||
|
||||
iface lo inet loopback
|
||||
iface eth0 inet dhcp
|
|
@ -1,3 +0,0 @@
|
|||
# Don't load ipv6 by default
|
||||
alias net-pf-10 off
|
||||
#alias ipv6 off
|
|
@ -1,3 +1,6 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
mv "${ROOTFS_DIR}/etc/ld.so.preload" "${ROOTFS_DIR}/etc/ld.so.preload.disabled"
|
||||
if [ -f "${ROOTFS_DIR}/etc/ld.so.preload" ]; then
|
||||
mv "${ROOTFS_DIR}/etc/ld.so.preload" "${ROOTFS_DIR}/etc/ld.so.preload.disabled"
|
||||
fi
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,4 +1,4 @@
|
|||
ssh less fbset sudo psmisc strace ed ncdu crda
|
||||
less fbset sudo psmisc strace ed ncdu crda vim
|
||||
console-setup keyboard-configuration debconf-utils parted unzip
|
||||
build-essential manpages-dev python bash-completion gdb pkg-config
|
||||
python-rpi.gpio v4l-utils
|
||||
|
@ -6,22 +6,20 @@ avahi-daemon
|
|||
lua5.1
|
||||
luajit
|
||||
hardlink ca-certificates curl
|
||||
fake-hwclock nfs-common usbutils
|
||||
fake-hwclock usbutils
|
||||
libraspberrypi-dev libraspberrypi-doc libfreetype6-dev
|
||||
dosfstools
|
||||
dphys-swapfile
|
||||
raspberrypi-sys-mods
|
||||
pi-bluetooth
|
||||
apt-listchanges
|
||||
usb-modeswitch
|
||||
apt-transport-https
|
||||
libpam-chksshpwd
|
||||
rpi-update
|
||||
libmtp-runtime
|
||||
rsync
|
||||
htop
|
||||
man-db
|
||||
policykit-1
|
||||
ssh-import-id
|
||||
rng-tools
|
||||
ethtool
|
||||
vl805fw
|
||||
pciutils
|
||||
rpi-eeprom
|
||||
raspinfo
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
cifs-utils
|
|
@ -1,5 +1,5 @@
|
|||
--- a/rootfs/boot/cmdline.txt
|
||||
+++ b/rootfs/boot/cmdline.txt
|
||||
--- stage2.orig/rootfs/boot/cmdline.txt
|
||||
+++ stage2/rootfs/boot/cmdline.txt
|
||||
@@ -1 +1 @@
|
||||
-dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
|
||||
+dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh
|
||||
-console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
|
||||
+console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh
|
||||
|
|
|
@ -13,14 +13,7 @@ install -m 755 files/rc.local "${ROOTFS_DIR}/etc/"
|
|||
|
||||
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
|
||||
|
||||
if [ "${USE_QEMU}" = "1" ]; then
|
||||
|
@ -53,4 +46,3 @@ on_chroot << EOF
|
|||
usermod --pass='*' root
|
||||
EOF
|
||||
|
||||
rm -f "${ROOTFS_DIR}/etc/ssh/"ssh_host_*_key*
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
wpasupplicant wireless-tools firmware-atheros firmware-brcm80211 firmware-libertas firmware-misc-nonfree firmware-realtek
|
||||
raspberrypi-net-mods
|
||||
dhcpcd5
|
||||
net-tools
|
|
@ -1,22 +0,0 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
install -v -d "${ROOTFS_DIR}/etc/systemd/system/dhcpcd.service.d"
|
||||
install -v -m 644 files/wait.conf "${ROOTFS_DIR}/etc/systemd/system/dhcpcd.service.d/"
|
||||
|
||||
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
|
||||
|
||||
# Disable wifi on 5GHz models
|
||||
mkdir -p "${ROOTFS_DIR}/var/lib/systemd/rfkill/"
|
||||
echo 1 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-3f300000.mmc:wlan"
|
||||
echo 1 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-fe300000.mmc:wlan"
|
|
@ -1,3 +0,0 @@
|
|||
[Service]
|
||||
ExecStart=
|
||||
ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w
|
|
@ -1,2 +0,0 @@
|
|||
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
|
||||
update_config=1
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
echo "Europe/London" > "${ROOTFS_DIR}/etc/timezone"
|
||||
echo "${TIMEZONE_DEFAULT}" > "${ROOTFS_DIR}/etc/timezone"
|
||||
rm "${ROOTFS_DIR}/etc/localtime"
|
||||
|
||||
on_chroot << EOF
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
openjdk-8-jre-headless
|
|
@ -0,0 +1,36 @@
|
|||
#!/bin/bash
|
||||
|
||||
export RUDEFOX_REPO_BASE_URL="https://repo.rudefox.io"
|
||||
export RUDEFOX_REPO_RELEASES="maven-releases"
|
||||
export RUDEFOX_GROUP="io.rudefox"
|
||||
export RUDEFOX_BURROW_ID="burrow"
|
||||
export OUTFILE="burrow.tar"
|
||||
|
||||
|
||||
export WGET_OPTS="--https-only -O ${OUTFILE} -v"
|
||||
export WGET_URL="${RUDEFOX_REPO_BASE_URL}/service/rest/v1/search/assets/download?group=${RUDEFOX_GROUP}&name=${RUDEFOX_BURROW_ID}&maven.extension=tar"
|
||||
|
||||
|
||||
if [ $RUDEFOX_BURROW_VERSION != "latest" ]
|
||||
then
|
||||
export WGET_URL="${WGET_URL}&maven.baseVersion=${RUDEFOX_BURROW_VERSION}"
|
||||
else
|
||||
export WGET_URL="${WGET_URL}&sort=version"
|
||||
fi
|
||||
|
||||
|
||||
if [ $RUDEFOX_REPO_USERNAME != "anonymous" ]
|
||||
then
|
||||
export ENCODED_USERNAME=$(echo -n $RUDEFOX_REPO_USERNAME | base64 | sed 's/+/-/g; s/\//_/g; s/=/%3D/g';)
|
||||
export ENCODED_PASSWORD=$(echo -n $RUDEFOX_REPO_PASSWORD | base64 | sed 's/+/-/g; s/\//_/g; s/=/%3D/g';)
|
||||
export POST_DATA="username=${ENCODED_USERNAME}&password=${ENCODED_PASSWORD}"
|
||||
|
||||
wget --save-cookies cookies.txt --keep-session-cookies --post-data $POST_DATA "${RUDEFOX_REPO_BASE_URL}/service/rapture/session"
|
||||
|
||||
wget --load-cookies cookies.txt $WGET_OPTS $WGET_URL
|
||||
|
||||
rm cookies.txt
|
||||
else
|
||||
wget $WGET_OPTS "${WGET_URL}&repository=${RUDEFOX_REPO_RELEASES}"
|
||||
fi
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
mkdir -p "${ROOTFS_DIR}/opt/"
|
||||
rm -rf "${ROOTFS_DIR}/opt/rudefox-burrow"
|
||||
tar -C "${ROOTFS_DIR}/opt/" -xvf burrow.tar
|
||||
mv "${ROOTFS_DIR}/opt/burrow-"* "${ROOTFS_DIR}/opt/rudefox-burrow"
|
||||
|
||||
on_chroot <<EOF
|
||||
ln -fs /opt/rudefox-burrow/bin/burrow /usr/bin/burrow
|
||||
EOF
|
|
@ -0,0 +1,6 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
echo "" >> "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.bashrc"
|
||||
echo ". <(burrow generate-completion)" >> "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.bashrc"
|
||||
echo "alias seedgen='burrow mnemonic -i8b 256'" >> "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.bashrc"
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
echo "" >> "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.bashrc"
|
||||
echo "unset HISTFILE" >> "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.bashrc"
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
on_chroot << ENDCHROOT
|
||||
|
||||
systemctl set-default multi-user.target
|
||||
|
||||
ln -fs /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
|
||||
|
||||
cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << EOF
|
||||
[Service]
|
||||
ExecStart=
|
||||
ExecStart=-/sbin/agetty --autologin ${FIRST_USER_NAME} --noclear %I \\\$TERM
|
||||
EOF
|
||||
|
||||
ENDCHROOT
|
|
@ -0,0 +1 @@
|
|||
toilet figlet
|
|
@ -0,0 +1,8 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
rm -rf "${ROOTFS_DIR}/etc/motd"
|
||||
rm -rf "${ROOTFS_DIR}/etc/update-motd.d/"*
|
||||
install -m 755 files/* "${ROOTFS_DIR}/etc/update-motd.d/"
|
||||
|
||||
echo "" >> "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.bashrc"
|
||||
echo "PS1=\"\\\\[\e[31m\\\\]Burrow>\\\\[\e[m\\\\] \"" >> "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.bashrc"
|
|
@ -0,0 +1,9 @@
|
|||
#!/bin/bash
|
||||
|
||||
THIS_SCRIPT="header"
|
||||
MOTD_DISABLE=""
|
||||
|
||||
toilet -f standard -F metal Burrow
|
||||
|
||||
printf '\nWelcome to RudeFox Burrow!\n'
|
||||
printf '\n'
|
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
|
||||
echo ""
|
||||
echo "======================================================="
|
||||
echo "=== TYPE: "
|
||||
echo "=== seedgen "
|
||||
echo "=== "
|
||||
echo "=== to generate a new 24-word seed "
|
||||
echo "======================================================="
|
||||
echo ""
|
||||
echo ""
|
|
@ -0,0 +1,12 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
install -d "${ROOTFS_DIR}/etc/systemd/system/enable-overlayfs.target.wants"
|
||||
install -m 644 files/enable-overlayfs.service "${ROOTFS_DIR}/etc/systemd/system/"
|
||||
install -m 644 files/enable-overlayfs.target "${ROOTFS_DIR}/etc/systemd/system/"
|
||||
install -m 755 files/enable_overlayfs.sh "${ROOTFS_DIR}/usr/bin/"
|
||||
|
||||
on_chroot << EOF
|
||||
ln -sf /etc/systemd/system/enable-overlayfs.service /etc/systemd/system/enable-overlayfs.target.wants/enable-overlayfs.service
|
||||
systemctl daemon-reload
|
||||
systemctl set-default enable-overlayfs.target
|
||||
EOF
|
|
@ -0,0 +1,10 @@
|
|||
[Unit]
|
||||
Description=Enable Overlay Filesystem
|
||||
After=multi-user.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/enable_overlayfs.sh
|
||||
|
||||
[Install]
|
||||
WantedBy=enable-overlayfs.target
|
|
@ -0,0 +1,5 @@
|
|||
[Unit]
|
||||
Description=Enable Overlay Filesystem Target
|
||||
Requires=multi-user.target
|
||||
After=multi-user.target
|
||||
AllowIsolate=yes
|
|
@ -0,0 +1,5 @@
|
|||
#!/bin/bash
|
||||
|
||||
/usr/bin/raspi-config nonint do_overlayfs 0
|
||||
systemctl set-default multi-user.target
|
||||
reboot
|
|
@ -1,2 +1,2 @@
|
|||
NOOBS_NAME="Raspbian Lite"
|
||||
NOOBS_NAME="Raspberry Pi OS Lite (32-bit)"
|
||||
NOOBS_DESCRIPTION="A port of Debian with no desktop environment"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
xserver-xorg-video-fbdev xserver-xorg xinit xserver-xorg-video-fbturbo
|
||||
epiphany-browser
|
||||
mousepad
|
||||
lxde lxtask menu-xdg
|
||||
zenity xdg-utils
|
||||
gvfs-backends gvfs-fuse
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
python python3-pygame python-pygame python-tk
|
||||
python3 python3-tk python3-thonny
|
||||
python3 python3-tk thonny
|
||||
python3-pgzero
|
||||
python-serial python3-serial
|
||||
python-picamera python3-picamera
|
||||
|
@ -18,7 +18,6 @@ python-spidev python3-spidev
|
|||
python-twython python3-twython
|
||||
python-smbus python3-smbus
|
||||
python-flask python3-flask
|
||||
python-picraft python3-picraft
|
||||
pprompt
|
||||
piwiz
|
||||
rp-prefapps
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
#!/bin/sh -e
|
||||
|
||||
BOOKSHELF_URL="https://magpi.raspberrypi.org/bookshelf.xml"
|
||||
GUIDE_URL="$(curl -s "$BOOKSHELF_URL" | awk -F '[<>]' "/<TITLE>Raspberry Pi Beginner's Guide v3<\/TITLE>/ {f=1; next} f==1 && /PDF/ {print \$3; exit}")"
|
||||
OUTPUT="$(basename "$GUIDE_URL" | cut -f1 -d'?')"
|
||||
|
||||
if [ ! -f "files/$OUTPUT" ]; then
|
||||
rm files/*.pdf -f
|
||||
curl -s "$GUIDE_URL" -o "files/$OUTPUT"
|
||||
fi
|
||||
|
||||
file "files/$OUTPUT" | grep -q "PDF document"
|
||||
|
||||
install -v -o 1000 -g 1000 -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/Bookshelf"
|
||||
install -v -o 1000 -g 1000 -m 644 "files/$OUTPUT" "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/Bookshelf/"
|
|
@ -1,15 +0,0 @@
|
|||
#!/bin/sh -e
|
||||
|
||||
magpi_regex="MagPi[[:digit:]]*.pdf"
|
||||
magpi_loc="https://www.raspberrypi.org/magpi-issues"
|
||||
magpi_latest="$(curl "$magpi_loc/?C=M;O=D" -s | grep "$magpi_regex" -m 1 -o | head -n 1)"
|
||||
|
||||
if [ ! -f "files/$magpi_latest" ]; then
|
||||
find files/ -regextype grep -regex "files/$magpi_regex" -delete
|
||||
wget "$magpi_loc/$magpi_latest" -O "files/$magpi_latest"
|
||||
fi
|
||||
|
||||
file "files/$magpi_latest" | grep -q "PDF document"
|
||||
|
||||
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/"
|
|
@ -1,2 +1,2 @@
|
|||
NOOBS_NAME="Raspbian"
|
||||
NOOBS_NAME="Raspberry Pi OS (32-bit)"
|
||||
NOOBS_DESCRIPTION="A port of Debian with the Raspberry Pi Desktop"
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
mu-editor
|
||||
sonic-pi
|
||||
scratch nuscratch scratch2
|
||||
scratch nuscratch scratch2 scratch3
|
||||
smartsim
|
||||
|
||||
minecraft-pi python-minecraftpi
|
||||
minecraft-pi python-minecraftpi python-picraft python3-picraft
|
||||
python-sense-emu sense-emu-tools python-sense-emu-doc
|
||||
|
||||
wolfram-engine
|
||||
claws-mail
|
||||
greenfoot-unbundled bluej
|
||||
nodered
|
||||
realvnc-vnc-viewer
|
||||
|
||||
python-games
|
||||
code-the-classics
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
NOOBS_NAME="Raspbian Full"
|
||||
NOOBS_NAME="Raspberry Pi OS Full (32-bit)"
|
||||
NOOBS_DESCRIPTION="A port of Debian with desktop and recommended applications"
|
||||
|
|
Loading…
Reference in New Issue