@@ -1,50 +0,0 @@ | |||||
on: | |||||
release: | |||||
types: [ created ] | |||||
name: Build & Deploy Image | |||||
jobs: | |||||
build: | |||||
name: Build & Release Image | |||||
runs-on: ARM64 | |||||
timeout-minutes: 2880 | |||||
env: | |||||
working-directory: ./ | |||||
steps: | |||||
- name: Checkout code | |||||
uses: actions/checkout@v2 | |||||
- name: Clean docker | |||||
id: clean_docker | |||||
working-directory: ${{ env.working-directory }} | |||||
run: | | |||||
docker system prune -af | |||||
docker system prune --volumes -f | |||||
docker image prune -af | |||||
docker container stop $(docker container ls -aq) || true | |||||
docker container rm $(docker container ls -aq) || true | |||||
- name: Build project | |||||
id: builder | |||||
working-directory: ${{ env.working-directory }} | |||||
run: | | |||||
bash build-docker.sh | |||||
echo ::set-output name=filename::$(ls deploy/*.img.xz | xargs -n 1 basename) | |||||
- name: Fix Permissions | |||||
id: fix_perm_filename | |||||
run: | | |||||
chmod a+rw ${{ env.working-directory }}/deploy/${{ steps.builder.outputs.filename }} | |||||
echo ${{ env.working-directory }}/deploy/${{ steps.builder.outputs.filename }} | |||||
- name: Upload Release Asset | |||||
id: upload-release-asset | |||||
uses: actions/upload-release-asset@v1 | |||||
env: | |||||
GITHUB_TOKEN: ${{ secrets.LONG_TOKEN }} | |||||
with: | |||||
upload_url: ${{ github.event.release.upload_url }} | |||||
asset_path: ${{ env.working-directory }}/deploy/${{ steps.builder.outputs.filename }} | |||||
asset_name: ${{ steps.builder.outputs.filename }} | |||||
asset_content_type: application/x-tar | |||||
- name: Delete Image | |||||
id: delete_image | |||||
run: | | |||||
rm ${{ env.working-directory }}/deploy/${{ steps.builder.outputs.filename }} |
@@ -1,42 +0,0 @@ | |||||
on: ['pull_request'] | |||||
name: Build & Validate Image | |||||
jobs: | |||||
build: | |||||
name: Build & Validate Image | |||||
runs-on: ARM64 | |||||
timeout-minutes: 2880 | |||||
env: | |||||
working-directory: ./ | |||||
steps: | |||||
- name: Checkout code | |||||
uses: actions/checkout@v2 | |||||
- name: Clean docker | |||||
id: clean_docker | |||||
working-directory: ${{ env.working-directory }} | |||||
run: | | |||||
docker system prune -af | |||||
docker system prune --volumes -f | |||||
docker image prune -af | |||||
docker container stop $(docker container ls -aq) || true | |||||
docker container rm $(docker container ls -aq) || true | |||||
- name: Build project | |||||
id: builder | |||||
working-directory: ${{ env.working-directory }} | |||||
run: | | |||||
bash build-docker.sh | |||||
echo ::set-output name=filename::$(ls deploy/*.img.xz | xargs -n 1 basename) | |||||
- name: Fix Permissions | |||||
id: fix_perm_filename | |||||
run: | | |||||
chmod a+rw ${{ env.working-directory }}/deploy/${{ steps.builder.outputs.filename }} | |||||
echo ${{ env.working-directory }}/deploy/${{ steps.builder.outputs.filename }} | |||||
- uses: actions/upload-artifact@v1 | |||||
with: | |||||
name: ${{ steps.builder.outputs.filename }} | |||||
path: ${{ env.working-directory }}/deploy/${{ steps.builder.outputs.filename }} | |||||
- name: Delete Image | |||||
id: delete_image | |||||
run: | | |||||
rm ${{ env.working-directory }}/deploy/${{ steps.builder.outputs.filename }} |
@@ -1,4 +1,4 @@ | |||||
ARG BASE_IMAGE=debian:buster | |||||
ARG BASE_IMAGE=debian:bullseye | |||||
FROM ${BASE_IMAGE} | FROM ${BASE_IMAGE} | ||||
ENV DEBIAN_FRONTEND noninteractive | ENV DEBIAN_FRONTEND noninteractive | ||||
@@ -8,7 +8,7 @@ RUN apt-get -y update && \ | |||||
git vim parted \ | git vim parted \ | ||||
quilt coreutils qemu-user-static debootstrap zerofree zip dosfstools \ | quilt coreutils qemu-user-static debootstrap zerofree zip dosfstools \ | ||||
libarchive-tools libcap2-bin rsync grep udev xz-utils curl xxd file kmod bc\ | libarchive-tools libcap2-bin rsync grep udev xz-utils curl xxd file kmod bc\ | ||||
binfmt-support ca-certificates qemu-utils kpartx util-linux fdisk \ | |||||
binfmt-support ca-certificates qemu-utils kpartx fdisk gpg pigz\ | |||||
&& rm -rf /var/lib/apt/lists/* | && rm -rf /var/lib/apt/lists/* | ||||
COPY . /pi-gen/ | COPY . /pi-gen/ | ||||
@@ -25,7 +25,6 @@ List of pre-installed software: | |||||
- [hamlib](https://hamlib.github.io/) | - [hamlib](https://hamlib.github.io/) | ||||
- [VaporTrail](https://github.com/inguardians/VaporTrail) | - [VaporTrail](https://github.com/inguardians/VaporTrail) | ||||
- [Universal Radio Hacker](https://github.com/jopohl/urh) | - [Universal Radio Hacker](https://github.com/jopohl/urh) | ||||
- [FoxTelem](https://github.com/ac2cz/FoxTelem) | |||||
- [Quisk](http://james.ahlstrom.name/quisk/) | - [Quisk](http://james.ahlstrom.name/quisk/) | ||||
- [0xCoto/VIRGO](https://github.com/0xCoto/VIRGO) | - [0xCoto/VIRGO](https://github.com/0xCoto/VIRGO) | ||||
- [0xCoto/CygnusRFI](https://github.com/0xCoto/CygnusRFI) | - [0xCoto/CygnusRFI](https://github.com/0xCoto/CygnusRFI) | ||||
@@ -101,6 +100,17 @@ The remote desktop can be accessed using any VNC client. The credentials are the | |||||
#### Running Programs | #### Running Programs | ||||
Not all programs listed above will be listed on the desktop. Most of them require to be launched from the terminal. Please, refer to the documentation of the program that you would like to use for launch instructions. The `README.md` files can also be accessed offline inside the `/home/pi/PiSDR` directory. | Not all programs listed above will be listed on the desktop. Most of them require to be launched from the terminal. Please, refer to the documentation of the program that you would like to use for launch instructions. The `README.md` files can also be accessed offline inside the `/home/pi/PiSDR` directory. | ||||
## Advanced | |||||
You can also choose to compile PiSDR on your own. However, be aware that this process can take several hours, depending on your hardware. It's important to note that standard x86 machines, such as those with Intel and AMD CPUs, will typically take much longer. This is because they have to emulate an ARM64 processor to compile everything. In contrast, machines with native ARM64 processors, like Apple Silicon and Ampere, will be significantly faster as they don't require emulation. | |||||
This project uses docker to compile the images. | |||||
#### macOS (Colima) | |||||
```bash | |||||
$ colima start --cpu 8 --cpu-type cortex-a72 --memory 14 --arch aarch64 | |||||
``` | |||||
## About the project | ## About the project | ||||
PiSDR Project was created and maintained since 2019 by [Luigi F. Cruz](https://luigi.ltd). | PiSDR Project was created and maintained since 2019 by [Luigi F. Cruz](https://luigi.ltd). | ||||
@@ -1,13 +1,20 @@ | |||||
#!/bin/bash -eu | |||||
#!/usr/bin/env bash | |||||
# Note: Avoid usage of arrays as MacOS users have an older version of bash (v3.x) which does not supports arrays | |||||
set -eu | |||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" | |||||
DIR="$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd)" | |||||
BUILD_OPTS="$*" | BUILD_OPTS="$*" | ||||
DOCKER="docker" | |||||
# Allow user to override docker command | |||||
DOCKER=${DOCKER:-docker} | |||||
if ! ${DOCKER} ps >/dev/null 2>&1; then | |||||
DOCKER="sudo docker" | |||||
# Ensure that default docker command is not set up in rootless mode | |||||
if \ | |||||
! ${DOCKER} ps >/dev/null 2>&1 || \ | |||||
${DOCKER} info 2>/dev/null | grep -q rootless \ | |||||
; then | |||||
DOCKER="sudo ${DOCKER}" | |||||
fi | fi | ||||
if ! ${DOCKER} ps >/dev/null; then | if ! ${DOCKER} ps >/dev/null; then | ||||
echo "error connecting to docker:" | echo "error connecting to docker:" | ||||
@@ -48,7 +55,7 @@ fi | |||||
CONTAINER_NAME=${CONTAINER_NAME:-pigen_work} | CONTAINER_NAME=${CONTAINER_NAME:-pigen_work} | ||||
CONTINUE=${CONTINUE:-0} | CONTINUE=${CONTINUE:-0} | ||||
PRESERVE_CONTAINER=${PRESERVE_CONTAINER:-0} | PRESERVE_CONTAINER=${PRESERVE_CONTAINER:-0} | ||||
PIGEN_DOCKER_OPTS=${PIGEN_DOCKER_OPTS:-""} | |||||
PIGEN_DOCKER_OPTS=${PIGEN_DOCKER_OPTS:-""} | |||||
if [ -z "${IMG_NAME}" ]; then | if [ -z "${IMG_NAME}" ]; then | ||||
echo "IMG_NAME not set in 'config'" 1>&2 | echo "IMG_NAME not set in 'config'" 1>&2 | ||||
@@ -75,42 +82,83 @@ fi | |||||
# Modify original build-options to allow config file to be mounted in the docker container | # 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@')" | BUILD_OPTS="$(echo "${BUILD_OPTS:-}" | sed -E 's@\-c\s?([^ ]+)@-c /config@')" | ||||
BASE_IMAGE=debian:buster | |||||
${DOCKER} build --build-arg BASE_IMAGE=${BASE_IMAGE} -t pi-gen "${DIR}" | |||||
${DOCKER} build --build-arg BASE_IMAGE=debian:bullseye -t pi-gen "${DIR}" | |||||
if [ "${CONTAINER_EXISTS}" != "" ]; then | 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 \ | |||||
--cap-add=ALL \ | |||||
-v /dev:/dev \ | |||||
-v /lib/modules:/lib/modules \ | |||||
${PIGEN_DOCKER_OPTS} \ | |||||
--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} && | |||||
rsync -av work/*/build.log deploy/" & | |||||
wait "$!" | |||||
DOCKER_CMDLINE_NAME="${CONTAINER_NAME}_cont" | |||||
DOCKER_CMDLINE_PRE="--rm" | |||||
DOCKER_CMDLINE_POST="--volumes-from=\"${CONTAINER_NAME}\"" | |||||
else | else | ||||
trap 'echo "got CTRL+C... please wait 5s" && ${DOCKER} stop -t 5 ${CONTAINER_NAME}' SIGINT SIGTERM | |||||
time ${DOCKER} run --name "${CONTAINER_NAME}" --privileged \ | |||||
--cap-add=ALL \ | |||||
-v /dev:/dev \ | |||||
-v /lib/modules:/lib/modules \ | |||||
${PIGEN_DOCKER_OPTS} \ | |||||
--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} && | |||||
rsync -av work/*/build.log deploy/" & | |||||
wait "$!" | |||||
DOCKER_CMDLINE_NAME="${CONTAINER_NAME}" | |||||
DOCKER_CMDLINE_PRE="" | |||||
DOCKER_CMDLINE_POST="" | |||||
fi | fi | ||||
# Check if binfmt_misc is required | |||||
binfmt_misc_required=1 | |||||
case $(uname -m) in | |||||
aarch64) | |||||
binfmt_misc_required=0 | |||||
;; | |||||
arm*) | |||||
binfmt_misc_required=0 | |||||
;; | |||||
esac | |||||
# Check if qemu-aarch64-static and /proc/sys/fs/binfmt_misc are present | |||||
if [[ "${binfmt_misc_required}" == "1" ]]; then | |||||
if ! qemu_arm=$(which qemu-aarch64-static) ; then | |||||
echo "qemu-aarch64-static not found (please install qemu-user-static)" | |||||
exit 1 | |||||
fi | |||||
if [ ! -f /proc/sys/fs/binfmt_misc/register ]; then | |||||
echo "binfmt_misc required but not mounted, trying to mount it..." | |||||
if ! mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc ; then | |||||
echo "mounting binfmt_misc failed" | |||||
exit 1 | |||||
fi | |||||
echo "binfmt_misc mounted" | |||||
fi | |||||
if ! grep -q "^interpreter ${qemu_arm}" /proc/sys/fs/binfmt_misc/qemu-aarch64* ; then | |||||
# Register qemu-aarch64 for binfmt_misc | |||||
reg="echo ':qemu-aarch64-rpi:M::"\ | |||||
"\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00:"\ | |||||
"\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:"\ | |||||
"${qemu_arm}:F' > /proc/sys/fs/binfmt_misc/register" | |||||
echo "Registering qemu-aarch64 for binfmt_misc..." | |||||
sudo bash -c "${reg}" 2>/dev/null || true | |||||
fi | |||||
fi | |||||
trap 'echo "got CTRL+C... please wait 5s" && ${DOCKER} stop -t 5 ${DOCKER_CMDLINE_NAME}' SIGINT SIGTERM | |||||
time ${DOCKER} run \ | |||||
$DOCKER_CMDLINE_PRE \ | |||||
--name "${DOCKER_CMDLINE_NAME}" \ | |||||
--privileged \ | |||||
--cap-add=ALL \ | |||||
-v /dev:/dev \ | |||||
-v /lib/modules:/lib/modules \ | |||||
${PIGEN_DOCKER_OPTS} \ | |||||
--volume "${CONFIG_FILE}":/config:ro \ | |||||
-e "GIT_HASH=${GIT_HASH}" \ | |||||
$DOCKER_CMDLINE_POST \ | |||||
pi-gen \ | |||||
bash -e -o pipefail -c " | |||||
dpkg-reconfigure qemu-user-static && | |||||
# binfmt_misc is sometimes not mounted with debian bullseye image | |||||
(mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc || true) && | |||||
cd /pi-gen; ./build.sh ${BUILD_OPTS} && | |||||
rsync -av work/*/build.log deploy/ | |||||
" & | |||||
wait "$!" | |||||
# Ensure that deploy/ is always owned by calling user | |||||
echo "copying results from deploy/" | echo "copying results from deploy/" | ||||
${DOCKER} cp "${CONTAINER_NAME}":/pi-gen/deploy . | |||||
${DOCKER} cp "${CONTAINER_NAME}":/pi-gen/deploy - | tar -xf - | |||||
echo "copying log from container ${CONTAINER_NAME} to depoy/" | |||||
${DOCKER} logs --timestamps "${CONTAINER_NAME}" &>deploy/build-docker.log | |||||
ls -lah deploy | ls -lah deploy | ||||
# cleanup | # cleanup | ||||
@@ -14,20 +14,14 @@ $(cat "${i}-debconf") | |||||
SELEOF | SELEOF | ||||
EOF | EOF | ||||
log "End ${SUB_STAGE_DIR}/${i}-debconf" | |||||
log "End ${SUB_STAGE_DIR}/${i}-debconf" | |||||
fi | fi | ||||
if [ -f "${i}-packages-nr" ]; then | if [ -f "${i}-packages-nr" ]; then | ||||
log "Begin ${SUB_STAGE_DIR}/${i}-packages-nr" | log "Begin ${SUB_STAGE_DIR}/${i}-packages-nr" | ||||
PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${i}-packages-nr")" | PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${i}-packages-nr")" | ||||
if [ -n "$PACKAGES" ]; then | if [ -n "$PACKAGES" ]; then | ||||
on_chroot << EOF | on_chroot << EOF | ||||
n=0 | |||||
until [ "$n" -ge 5 ] | |||||
do | |||||
apt-get --ignore-missing --fix-missing install --no-install-recommends -y $PACKAGES && break | |||||
n=$((n+1)) | |||||
sleep 15 | |||||
done | |||||
apt-get -o Acquire::Retries=3 install --no-install-recommends -y $PACKAGES | |||||
EOF | EOF | ||||
if [ "${USE_QCOW2}" = "1" ]; then | if [ "${USE_QCOW2}" = "1" ]; then | ||||
on_chroot << EOF | on_chroot << EOF | ||||
@@ -42,13 +36,7 @@ EOF | |||||
PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${i}-packages")" | PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${i}-packages")" | ||||
if [ -n "$PACKAGES" ]; then | if [ -n "$PACKAGES" ]; then | ||||
on_chroot << EOF | on_chroot << EOF | ||||
n=0 | |||||
until [ "$n" -ge 5 ] | |||||
do | |||||
apt-get --ignore-missing --fix-missing install -y $PACKAGES && break | |||||
n=$((n+1)) | |||||
sleep 15 | |||||
done | |||||
apt-get -o Acquire::Retries=3 install -y $PACKAGES | |||||
EOF | EOF | ||||
if [ "${USE_QCOW2}" = "1" ]; then | if [ "${USE_QCOW2}" = "1" ]; then | ||||
on_chroot << EOF | on_chroot << EOF | ||||
@@ -145,7 +133,7 @@ run_stage(){ | |||||
done | done | ||||
fi | fi | ||||
if [ "${USE_QCOW2}" = "1" ]; then | |||||
if [ "${USE_QCOW2}" = "1" ]; then | |||||
unload_qimage | unload_qimage | ||||
else | else | ||||
# make sure we are not umounting during export-image stage | # make sure we are not umounting during export-image stage | ||||
@@ -167,6 +155,14 @@ if [ "$(id -u)" != "0" ]; then | |||||
fi | fi | ||||
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | ||||
if [[ $BASE_DIR = *" "* ]]; then | |||||
echo "There is a space in the base path of pi-gen" | |||||
echo "This is not a valid setup supported by debootstrap." | |||||
echo "Please remove the spaces, or move pi-gen directory to a base path without spaces" 1>&2 | |||||
exit 1 | |||||
fi | |||||
export BASE_DIR | export BASE_DIR | ||||
if [ -f config ]; then | if [ -f config ]; then | ||||
@@ -207,21 +203,30 @@ fi | |||||
export USE_QEMU="${USE_QEMU:-0}" | export USE_QEMU="${USE_QEMU:-0}" | ||||
export IMG_DATE="${IMG_DATE:-"$(date +%Y-%m-%d)"}" | export IMG_DATE="${IMG_DATE:-"$(date +%Y-%m-%d)"}" | ||||
export IMG_FILENAME="${IMG_FILENAME:-"${IMG_DATE}-${IMG_NAME}"}" | export IMG_FILENAME="${IMG_FILENAME:-"${IMG_DATE}-${IMG_NAME}"}" | ||||
export ZIP_FILENAME="${ZIP_FILENAME:-"${IMG_DATE}-${IMG_NAME}"}" | |||||
export ARCHIVE_FILENAME="${ARCHIVE_FILENAME:-"image_${IMG_DATE}-${IMG_NAME}"}" | |||||
export SCRIPT_DIR="${BASE_DIR}/scripts" | export SCRIPT_DIR="${BASE_DIR}/scripts" | ||||
export WORK_DIR="${WORK_DIR:-"${BASE_DIR}/work/${IMG_DATE}-${IMG_NAME}"}" | |||||
export WORK_DIR="${WORK_DIR:-"${BASE_DIR}/work/${IMG_NAME}"}" | |||||
export DEPLOY_DIR=${DEPLOY_DIR:-"${BASE_DIR}/deploy"} | export DEPLOY_DIR=${DEPLOY_DIR:-"${BASE_DIR}/deploy"} | ||||
export DEPLOY_ZIP="${DEPLOY_ZIP:-1}" | |||||
# DEPLOY_ZIP was deprecated in favor of DEPLOY_COMPRESSION | |||||
# This preserve the old behavior with DEPLOY_ZIP=0 where no archive was created | |||||
if [ -z "${DEPLOY_COMPRESSION}" ] && [ "${DEPLOY_ZIP:-1}" = "0" ]; then | |||||
echo "DEPLOY_ZIP has been deprecated in favor of DEPLOY_COMPRESSION" | |||||
echo "Similar behavior to DEPLOY_ZIP=0 can be obtained with DEPLOY_COMPRESSION=none" | |||||
echo "Please update your config file" | |||||
DEPLOY_COMPRESSION=none | |||||
fi | |||||
export DEPLOY_COMPRESSION=${DEPLOY_COMPRESSION:-zip} | |||||
export COMPRESSION_LEVEL=${COMPRESSION_LEVEL:-6} | |||||
export LOG_FILE="${WORK_DIR}/build.log" | export LOG_FILE="${WORK_DIR}/build.log" | ||||
export TARGET_HOSTNAME=${TARGET_HOSTNAME:-raspberrypi} | export TARGET_HOSTNAME=${TARGET_HOSTNAME:-raspberrypi} | ||||
export FIRST_USER_NAME=${FIRST_USER_NAME:-pi} | export FIRST_USER_NAME=${FIRST_USER_NAME:-pi} | ||||
export FIRST_USER_PASS=${FIRST_USER_PASS:-raspberry} | |||||
export RELEASE=${RELEASE:-bullseye} | |||||
export WPA_ESSID | |||||
export WPA_PASSWORD | |||||
export FIRST_USER_PASS | |||||
export DISABLE_FIRST_BOOT_USER_RENAME=${DISABLE_FIRST_BOOT_USER_RENAME:-0} | |||||
export RELEASE=${RELEASE:-bookworm} # Don't forget to update stage0/prerun.sh | |||||
export WPA_COUNTRY | export WPA_COUNTRY | ||||
export ENABLE_SSH="${ENABLE_SSH:-0}" | export ENABLE_SSH="${ENABLE_SSH:-0}" | ||||
export PUBKEY_ONLY_SSH="${PUBKEY_ONLY_SSH:-0}" | export PUBKEY_ONLY_SSH="${PUBKEY_ONLY_SSH:-0}" | ||||
@@ -276,6 +281,10 @@ fi | |||||
export NO_PRERUN_QCOW2="${NO_PRERUN_QCOW2:-1}" | export NO_PRERUN_QCOW2="${NO_PRERUN_QCOW2:-1}" | ||||
if [ "$SETFCAP" != "1" ]; then | |||||
export CAPSH_ARG="--drop=cap_setfcap" | |||||
fi | |||||
dependencies_check "${BASE_DIR}/depends" | dependencies_check "${BASE_DIR}/depends" | ||||
#check username is valid | #check username is valid | ||||
@@ -284,6 +293,17 @@ if [[ ! "$FIRST_USER_NAME" =~ ^[a-z][-a-z0-9_]*$ ]]; then | |||||
exit 1 | exit 1 | ||||
fi | fi | ||||
if [[ "$DISABLE_FIRST_BOOT_USER_RENAME" == "1" ]] && [ -z "${FIRST_USER_PASS}" ]; then | |||||
echo "To disable user rename on first boot, FIRST_USER_PASS needs to be set" | |||||
echo "Not setting FIRST_USER_PASS makes your system vulnerable and open to cyberattacks" | |||||
exit 1 | |||||
fi | |||||
if [[ "$DISABLE_FIRST_BOOT_USER_RENAME" == "1" ]]; then | |||||
echo "User rename on the first boot is disabled" | |||||
echo "Be advised of the security risks linked to shipping a device with default username/password set." | |||||
fi | |||||
if [[ -n "${APT_PROXY}" ]] && ! curl --silent "${APT_PROXY}" >/dev/null ; then | if [[ -n "${APT_PROXY}" ]] && ! curl --silent "${APT_PROXY}" >/dev/null ; then | ||||
echo "Could not reach APT_PROXY server: ${APT_PROXY}" | echo "Could not reach APT_PROXY server: ${APT_PROXY}" | ||||
exit 1 | exit 1 | ||||
@@ -381,7 +401,7 @@ for EXPORT_DIR in ${EXPORT_DIRS}; do | |||||
else | else | ||||
run_stage | run_stage | ||||
fi | |||||
fi | |||||
if [ "${USE_QEMU}" != "1" ]; then | if [ "${USE_QEMU}" != "1" ]; then | ||||
if [ -e "${EXPORT_DIR}/EXPORT_NOOBS" ]; then | if [ -e "${EXPORT_DIR}/EXPORT_NOOBS" ]; then | ||||
# shellcheck source=/dev/null | # shellcheck source=/dev/null | ||||
@@ -2,3 +2,5 @@ IMG_NAME='PiSDR' | |||||
ENABLE_SSH=1 | ENABLE_SSH=1 | ||||
TARGET_HOSTNAME='pisdr' | TARGET_HOSTNAME='pisdr' | ||||
FIRST_USER_PASS='raspberry' | FIRST_USER_PASS='raspberry' | ||||
DEPLOY_COMPRESSION='xz' | |||||
COMPRESSION_LEVEL=9 |
@@ -19,3 +19,5 @@ lsmod:kmod | |||||
bc | bc | ||||
qemu-nbd:qemu-utils | qemu-nbd:qemu-utils | ||||
kpartx | kpartx | ||||
gpg | |||||
pigz |
@@ -0,0 +1 @@ | |||||
userconf-pi |
@@ -0,0 +1,9 @@ | |||||
#!/bin/bash -e | |||||
if [[ "${DISABLE_FIRST_BOOT_USER_RENAME}" == "0" ]]; then | |||||
on_chroot <<- EOF | |||||
SUDO_USER="${FIRST_USER_NAME}" rename-user -f -s | |||||
EOF | |||||
else | |||||
rm -f "${ROOTFS_DIR}/etc/xdg/autostart/piwiz.desktop" | |||||
fi |
@@ -4,6 +4,6 @@ rm -f "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache" | |||||
find "${ROOTFS_DIR}/var/lib/apt/lists/" -type f -delete | find "${ROOTFS_DIR}/var/lib/apt/lists/" -type f -delete | ||||
on_chroot << EOF | on_chroot << EOF | ||||
apt-get update | apt-get update | ||||
apt-get -y dist-upgrade | |||||
apt-get -y dist-upgrade --auto-remove --purge | |||||
apt-get clean | apt-get clean | ||||
EOF | EOF |
@@ -12,7 +12,6 @@ if [ "${NO_PRERUN_QCOW2}" = "0" ]; then | |||||
sed -i "s/BOOTDEV/PARTUUID=${BOOT_PARTUUID}/" "${ROOTFS_DIR}/etc/fstab" | sed -i "s/BOOTDEV/PARTUUID=${BOOT_PARTUUID}/" "${ROOTFS_DIR}/etc/fstab" | ||||
sed -i "s/ROOTDEV/PARTUUID=${ROOT_PARTUUID}/" "${ROOTFS_DIR}/etc/fstab" | sed -i "s/ROOTDEV/PARTUUID=${ROOT_PARTUUID}/" "${ROOTFS_DIR}/etc/fstab" | ||||
sed -i "s/ROOTDEV/PARTUUID=${ROOT_PARTUUID}/" "${ROOTFS_DIR}/boot/cmdline.txt" | |||||
sed -i "s/ROOTDEV/PARTUUID=${ROOT_PARTUUID}/" "${ROOTFS_DIR}/boot/firmware/cmdline.txt" | |||||
fi | fi | ||||
@@ -3,7 +3,10 @@ | |||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img" | IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img" | ||||
INFO_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.info" | INFO_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.info" | ||||
sed -i 's/^update_initramfs=.*/update_initramfs=all/' "${ROOTFS_DIR}/etc/initramfs-tools/update-initramfs.conf" | |||||
on_chroot << EOF | on_chroot << EOF | ||||
update-initramfs -u | |||||
if [ -x /etc/init.d/fake-hwclock ]; then | if [ -x /etc/init.d/fake-hwclock ]; then | ||||
/etc/init.d/fake-hwclock stop | /etc/init.d/fake-hwclock stop | ||||
fi | fi | ||||
@@ -18,6 +21,12 @@ fi | |||||
rm -f "${ROOTFS_DIR}/usr/bin/qemu-arm-static" | rm -f "${ROOTFS_DIR}/usr/bin/qemu-arm-static" | ||||
if [ "${USE_QEMU}" != "1" ]; then | |||||
if [ -e "${ROOTFS_DIR}/etc/ld.so.preload.disabled" ]; then | |||||
mv "${ROOTFS_DIR}/etc/ld.so.preload.disabled" "${ROOTFS_DIR}/etc/ld.so.preload" | |||||
fi | |||||
fi | |||||
rm -f "${ROOTFS_DIR}/etc/network/interfaces.dpkg-old" | rm -f "${ROOTFS_DIR}/etc/network/interfaces.dpkg-old" | ||||
rm -f "${ROOTFS_DIR}/etc/apt/sources.list~" | rm -f "${ROOTFS_DIR}/etc/apt/sources.list~" | ||||
@@ -47,7 +56,7 @@ rm -f "${ROOTFS_DIR}/root/.vnc/private.key" | |||||
rm -f "${ROOTFS_DIR}/etc/vnc/updateid" | rm -f "${ROOTFS_DIR}/etc/vnc/updateid" | ||||
update_issue "$(basename "${EXPORT_DIR}")" | update_issue "$(basename "${EXPORT_DIR}")" | ||||
install -m 644 "${ROOTFS_DIR}/etc/rpi-issue" "${ROOTFS_DIR}/boot/issue.txt" | |||||
install -m 644 "${ROOTFS_DIR}/etc/rpi-issue" "${ROOTFS_DIR}/boot/firmware/issue.txt" | |||||
cp "$ROOTFS_DIR/etc/rpi-issue" "$INFO_FILE" | cp "$ROOTFS_DIR/etc/rpi-issue" "$INFO_FILE" | ||||
@@ -72,9 +81,8 @@ cp "$ROOTFS_DIR/etc/rpi-issue" "$INFO_FILE" | |||||
mkdir -p "${DEPLOY_DIR}" | mkdir -p "${DEPLOY_DIR}" | ||||
rm -f "${DEPLOY_DIR}/${ZIP_FILENAME}${IMG_SUFFIX}.zip" | |||||
rm -f "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.*" | |||||
rm -f "${DEPLOY_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img" | rm -f "${DEPLOY_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img" | ||||
rm -f "${DEPLOY_DIR}/${ZIP_FILENAME}${IMG_SUFFIX}.img.xz" | |||||
mv "$INFO_FILE" "$DEPLOY_DIR/" | mv "$INFO_FILE" "$DEPLOY_DIR/" | ||||
@@ -90,11 +98,22 @@ else | |||||
make_bootable_image "${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.qcow2" "$IMG_FILE" | make_bootable_image "${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.qcow2" "$IMG_FILE" | ||||
fi | fi | ||||
if [ "${DEPLOY_ZIP}" == "1" ]; then | |||||
case "${DEPLOY_COMPRESSION}" in | |||||
zip) | |||||
pushd "${STAGE_WORK_DIR}" > /dev/null | pushd "${STAGE_WORK_DIR}" > /dev/null | ||||
xz -T16 -c "$(basename "${IMG_FILE}")" > "${DEPLOY_DIR}/${ZIP_FILENAME}${IMG_SUFFIX}.img.xz" | |||||
zip -"${COMPRESSION_LEVEL}" \ | |||||
"${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.zip" "$(basename "${IMG_FILE}")" | |||||
popd > /dev/null | popd > /dev/null | ||||
rm -f "${DEPLOY_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img" | |||||
else | |||||
mv "$IMG_FILE" "$DEPLOY_DIR/" | |||||
fi | |||||
;; | |||||
gz) | |||||
pigz --force -"${COMPRESSION_LEVEL}" "$IMG_FILE" --stdout > \ | |||||
"${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.img.gz" | |||||
;; | |||||
xz) | |||||
xz --compress --force --threads 0 --memlimit-compress=50% -"${COMPRESSION_LEVEL}" \ | |||||
--stdout "$IMG_FILE" > "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.img.xz" | |||||
;; | |||||
none | *) | |||||
cp "$IMG_FILE" "$DEPLOY_DIR/" | |||||
;; | |||||
esac |
@@ -10,8 +10,8 @@ if [ "${NO_PRERUN_QCOW2}" = "0" ]; then | |||||
rm -rf "${ROOTFS_DIR}" | rm -rf "${ROOTFS_DIR}" | ||||
mkdir -p "${ROOTFS_DIR}" | mkdir -p "${ROOTFS_DIR}" | ||||
BOOT_SIZE="$((256 * 1024 * 1024))" | |||||
ROOT_SIZE=$(du --apparent-size -s "${EXPORT_ROOTFS_DIR}" --exclude var/cache/apt/archives --exclude boot --block-size=1 | cut -f 1) | |||||
BOOT_SIZE="$((512 * 1024 * 1024))" | |||||
ROOT_SIZE=$(du --apparent-size -s "${EXPORT_ROOTFS_DIR}" --exclude var/cache/apt/archives --exclude boot/firmware --block-size=1 | cut -f 1) | |||||
# All partition sizes and starts will be aligned to this size | # All partition sizes and starts will be aligned to this size | ||||
ALIGN="$((4 * 1024 * 1024))" | ALIGN="$((4 * 1024 * 1024))" | ||||
@@ -33,55 +33,35 @@ if [ "${NO_PRERUN_QCOW2}" = "0" ]; then | |||||
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 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 --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) | |||||
BOOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^1:' | 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) | |||||
echo "Mounting BOOT_DEV..." | |||||
cnt=0 | |||||
until BOOT_DEV=$(losetup --show -f -o "${BOOT_OFFSET}" --sizelimit "${BOOT_LENGTH}" "${IMG_FILE}"); do | |||||
if [ $cnt -lt 5 ]; then | |||||
cnt=$((cnt + 1)) | |||||
echo "Error in losetup for BOOT_DEV. Retrying..." | |||||
sleep 5 | |||||
else | |||||
echo "ERROR: losetup for BOOT_DEV failed; exiting" | |||||
exit 1 | |||||
fi | |||||
done | |||||
echo "Mounting ROOT_DEV..." | |||||
echo "Creating loop device..." | |||||
cnt=0 | cnt=0 | ||||
until ROOT_DEV=$(losetup --show -f -o "${ROOT_OFFSET}" --sizelimit "${ROOT_LENGTH}" "${IMG_FILE}"); do | |||||
until ensure_next_loopdev && LOOP_DEV="$(losetup --show --find --partscan "$IMG_FILE")"; do | |||||
if [ $cnt -lt 5 ]; then | if [ $cnt -lt 5 ]; then | ||||
cnt=$((cnt + 1)) | cnt=$((cnt + 1)) | ||||
echo "Error in losetup for ROOT_DEV. Retrying..." | |||||
echo "Error in losetup. Retrying..." | |||||
sleep 5 | sleep 5 | ||||
else | else | ||||
echo "ERROR: losetup for ROOT_DEV failed; exiting" | |||||
echo "ERROR: losetup failed; exiting" | |||||
exit 1 | exit 1 | ||||
fi | fi | ||||
done | done | ||||
echo "/boot: offset $BOOT_OFFSET, length $BOOT_LENGTH" | |||||
echo "/: offset $ROOT_OFFSET, length $ROOT_LENGTH" | |||||
BOOT_DEV="${LOOP_DEV}p1" | |||||
ROOT_DEV="${LOOP_DEV}p2" | |||||
ROOT_FEATURES="^huge_file" | ROOT_FEATURES="^huge_file" | ||||
for FEATURE in metadata_csum 64bit; do | |||||
for FEATURE in 64bit; do | |||||
if grep -q "$FEATURE" /etc/mke2fs.conf; then | if grep -q "$FEATURE" /etc/mke2fs.conf; then | ||||
ROOT_FEATURES="^$FEATURE,$ROOT_FEATURES" | ROOT_FEATURES="^$FEATURE,$ROOT_FEATURES" | ||||
fi | fi | ||||
done | done | ||||
mkdosfs -n boot -F 32 -v "$BOOT_DEV" > /dev/null | |||||
mkdosfs -n bootfs -F 32 -s 4 -v "$BOOT_DEV" > /dev/null | |||||
mkfs.ext4 -L rootfs -O "$ROOT_FEATURES" "$ROOT_DEV" > /dev/null | mkfs.ext4 -L rootfs -O "$ROOT_FEATURES" "$ROOT_DEV" > /dev/null | ||||
mount -v "$ROOT_DEV" "${ROOTFS_DIR}" -t ext4 | mount -v "$ROOT_DEV" "${ROOTFS_DIR}" -t ext4 | ||||
mkdir -p "${ROOTFS_DIR}/boot" | |||||
mount -v "$BOOT_DEV" "${ROOTFS_DIR}/boot" -t vfat | |||||
mkdir -p "${ROOTFS_DIR}/boot/firmware" | |||||
mount -v "$BOOT_DEV" "${ROOTFS_DIR}/boot/firmware" -t vfat | |||||
rsync -aHAXx --exclude /var/cache/apt/archives --exclude /boot "${EXPORT_ROOTFS_DIR}/" "${ROOTFS_DIR}/" | |||||
rsync -rtx "${EXPORT_ROOTFS_DIR}/boot/" "${ROOTFS_DIR}/boot/" | |||||
rsync -aHAXx --exclude /var/cache/apt/archives --exclude /boot/firmware "${EXPORT_ROOTFS_DIR}/" "${ROOTFS_DIR}/" | |||||
rsync -rtx "${EXPORT_ROOTFS_DIR}/boot/firmware/" "${ROOTFS_DIR}/boot/firmware/" | |||||
fi | fi |
@@ -7,21 +7,18 @@ bootstrap(){ | |||||
local BOOTSTRAP_CMD=debootstrap | local BOOTSTRAP_CMD=debootstrap | ||||
local BOOTSTRAP_ARGS=() | local BOOTSTRAP_ARGS=() | ||||
#export http_proxy=${APT_PROXY} | |||||
if [ "$(dpkg --print-architecture)" != "armhf" ] && [ "$(dpkg --print-architecture)" != "aarch64" ]; then | |||||
BOOTSTRAP_CMD=qemu-debootstrap | |||||
fi | |||||
export http_proxy=${APT_PROXY} | |||||
BOOTSTRAP_ARGS+=(--arch arm64) | BOOTSTRAP_ARGS+=(--arch arm64) | ||||
BOOTSTRAP_ARGS+=(--include gnupg) | BOOTSTRAP_ARGS+=(--include gnupg) | ||||
BOOTSTRAP_ARGS+=(--components "main,contrib,non-free") | BOOTSTRAP_ARGS+=(--components "main,contrib,non-free") | ||||
#BOOTSTRAP_ARGS+=(--keyring "${STAGE_DIR}/files/raspberrypi.gpg") | #BOOTSTRAP_ARGS+=(--keyring "${STAGE_DIR}/files/raspberrypi.gpg") | ||||
BOOTSTRAP_ARGS+=(--exclude=info) | BOOTSTRAP_ARGS+=(--exclude=info) | ||||
BOOTSTRAP_ARGS+=(--include=ca-certificates) | |||||
BOOTSTRAP_ARGS+=("$@") | BOOTSTRAP_ARGS+=("$@") | ||||
printf -v BOOTSTRAP_STR '%q ' "${BOOTSTRAP_ARGS[@]}" | printf -v BOOTSTRAP_STR '%q ' "${BOOTSTRAP_ARGS[@]}" | ||||
capsh --drop=cap_setfcap -- -c "'${BOOTSTRAP_CMD}' $BOOTSTRAP_STR" || true | |||||
capsh $CAPSH_ARG -- -c "'${BOOTSTRAP_CMD}' $BOOTSTRAP_STR" || true | |||||
if [ -d "$2/debootstrap" ] && ! rmdir "$2/debootstrap"; then | if [ -d "$2/debootstrap" ] && ! rmdir "$2/debootstrap"; then | ||||
cp "$2/debootstrap/debootstrap.log" "${STAGE_WORK_DIR}" | cp "$2/debootstrap/debootstrap.log" "${STAGE_WORK_DIR}" | ||||
@@ -61,19 +58,15 @@ export -f unmount | |||||
unmount_image(){ | unmount_image(){ | ||||
sync | sync | ||||
sleep 1 | sleep 1 | ||||
local LOOP_DEVICES | |||||
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 | |||||
MOUNTED_DIR=$(mount | grep "$(basename "${LOOP_DEV}")" | head -n 1 | cut -f 3 -d ' ') | |||||
if [ -n "${MOUNTED_DIR}" ] && [ "${MOUNTED_DIR}" != "/" ]; then | |||||
unmount "$(dirname "${MOUNTED_DIR}")" | |||||
LOOP_DEVICE=$(losetup --list | grep "$1" | cut -f1 -d' ') | |||||
if [ -n "$LOOP_DEVICE" ]; then | |||||
for part in "$LOOP_DEVICE"p*; do | |||||
if DIR=$(findmnt -n -o target -S "$part"); then | |||||
unmount "$DIR" | |||||
fi | fi | ||||
sleep 1 | |||||
losetup -d "${LOOP_DEV}" | |||||
fi | |||||
done | |||||
done | |||||
losetup -d "$LOOP_DEVICE" | |||||
fi | |||||
} | } | ||||
export -f unmount_image | export -f unmount_image | ||||
@@ -94,7 +87,15 @@ on_chroot() { | |||||
mount --bind /sys "${ROOTFS_DIR}/sys" | mount --bind /sys "${ROOTFS_DIR}/sys" | ||||
fi | fi | ||||
capsh --drop=cap_setfcap "--chroot=${ROOTFS_DIR}/" -- -e "$@" | |||||
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/run)"; then | |||||
mount -t tmpfs tmpfs "${ROOTFS_DIR}/run" | |||||
fi | |||||
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/tmp)"; then | |||||
mount -t tmpfs tmpfs "${ROOTFS_DIR}/tmp" | |||||
fi | |||||
capsh $CAPSH_ARG "--chroot=${ROOTFS_DIR}/" -- -e "$@" | |||||
} | } | ||||
export -f on_chroot | export -f on_chroot | ||||
@@ -102,3 +103,11 @@ update_issue() { | |||||
echo -e "Raspberry Pi reference ${IMG_DATE}\nGenerated using ${PI_GEN}, ${PI_GEN_REPO}, ${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 | export -f update_issue | ||||
ensure_next_loopdev() { | |||||
local loopdev | |||||
loopdev="$(losetup -f)" | |||||
loopmaj="$(echo "$loopdev" | sed -E 's/.*[^0-9]*?([0-9]+)$/\1/')" | |||||
[[ -b "$loopdev" ]] || mknod "$loopdev" b 7 "$loopmaj" | |||||
} | |||||
export -f ensure_next_loopdev |
@@ -109,8 +109,8 @@ load_qimage() { | |||||
EOF | EOF | ||||
sync | sync | ||||
kpartx -as $NBD_DEV | kpartx -as $NBD_DEV | ||||
mkdosfs -n boot -F 32 -v $MAP_BOOT_DEV | |||||
mkfs.ext4 -L rootfs -O "^huge_file,^metadata_csum,^64bit" $MAP_ROOT_DEV | |||||
mkdosfs -n boot -F 32 -s 4 -v $MAP_BOOT_DEV | |||||
mkfs.ext4 -L rootfs -O "^huge_file,^64bit" $MAP_ROOT_DEV | |||||
sync | sync | ||||
else | else | ||||
if [ ! -f "${WORK_DIR}/image-${PREV_STAGE}.qcow2" ]; then | if [ ! -f "${WORK_DIR}/image-${PREV_STAGE}.qcow2" ]; then | ||||
@@ -12,7 +12,8 @@ else | |||||
rm -f "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache" | rm -f "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache" | ||||
fi | fi | ||||
on_chroot apt-key add - < files/raspberrypi.gpg.key | |||||
cat files/raspberrypi.gpg.key | gpg --dearmor > "${STAGE_WORK_DIR}/raspberrypi-archive-stable.gpg" | |||||
install -m 644 "${STAGE_WORK_DIR}/raspberrypi-archive-stable.gpg" "${ROOTFS_DIR}/etc/apt/trusted.gpg.d/" | |||||
on_chroot << EOF | on_chroot << EOF | ||||
dpkg --add-architecture armhf | dpkg --add-architecture armhf | ||||
apt-get update | apt-get update | ||||
@@ -0,0 +1 @@ | |||||
raspberrypi-archive-keyring |
@@ -1,3 +1,3 @@ | |||||
deb http://archive.raspberrypi.org/debian/ RELEASE main | |||||
deb http://archive.raspberrypi.com/debian/ RELEASE main | |||||
# Uncomment line below then 'apt-get update' to enable 'apt-get source' | # Uncomment line below then 'apt-get update' to enable 'apt-get source' | ||||
#deb-src http://archive.raspberrypi.org/debian/ RELEASE main | |||||
#deb-src http://archive.raspberrypi.com/debian/ RELEASE main |
@@ -1,7 +1,7 @@ | |||||
deb http://deb.debian.org/debian RELEASE main contrib non-free | |||||
deb http://security.debian.org/debian-security RELEASE-security main contrib non-free | |||||
deb http://deb.debian.org/debian RELEASE-updates main contrib non-free | |||||
deb http://deb.debian.org/debian RELEASE main contrib non-free non-free-firmware | |||||
deb http://deb.debian.org/debian-security/ RELEASE-security main contrib non-free non-free-firmware | |||||
deb http://deb.debian.org/debian RELEASE-updates main contrib non-free non-free-firmware | |||||
# Uncomment deb-src lines below then 'apt-get update' to enable 'apt-get source' | # Uncomment deb-src lines below then 'apt-get update' to enable 'apt-get source' | ||||
#deb-src http://deb.debian.org/debian RELEASE main contrib non-free | |||||
#deb-src http://security.debian.org/debian-security RELEASE-security main contrib non-free | |||||
#deb-src http://deb.debian.org/debian RELEASE-updates main contrib non-free | |||||
#deb-src http://deb.debian.org/debian RELEASE main contrib non-free non-free-firmware | |||||
#deb-src http://deb.debian.org/debian-security/ RELEASE-security main contrib non-free non-free-firmware | |||||
#deb-src http://deb.debian.org/debian RELEASE-updates main contrib non-free non-free-firmware |
@@ -1,3 +1,6 @@ | |||||
raspberrypi-bootloader | |||||
raspberrypi-kernel | |||||
raspi-config | |||||
initramfs-tools | |||||
raspi-firmware | |||||
linux-image-rpi-v8 | |||||
linux-image-rpi-2712 | |||||
linux-headers-rpi-v8 | |||||
linux-headers-rpi-2712 |
@@ -0,0 +1,3 @@ | |||||
#!/bin/bash -e | |||||
sed -i 's/^update_initramfs=.*/update_initramfs=no/' "${ROOTFS_DIR}/etc/initramfs-tools/update-initramfs.conf" |
@@ -1,5 +1,10 @@ | |||||
#!/bin/bash -e | #!/bin/bash -e | ||||
if [ "$RELEASE" != "bookworm" ]; then | |||||
echo "WARNING: RELEASE does not match the intended option for this branch." | |||||
echo " Please check the relevant README.md section." | |||||
fi | |||||
if [ ! -d "${ROOTFS_DIR}" ] || [ "${USE_QCOW2}" = "1" ]; then | if [ ! -d "${ROOTFS_DIR}" ] || [ "${USE_QCOW2}" = "1" ]; then | ||||
bootstrap ${RELEASE} "${ROOTFS_DIR}" http://deb.debian.org/debian/ | bootstrap ${RELEASE} "${ROOTFS_DIR}" http://deb.debian.org/debian/ | ||||
fi | fi |
@@ -1,4 +1,17 @@ | |||||
#!/bin/bash -e | #!/bin/bash -e | ||||
install -m 644 files/cmdline.txt "${ROOTFS_DIR}/boot/" | |||||
install -m 644 files/config.txt "${ROOTFS_DIR}/boot/" | |||||
mkdir -p "${ROOTFS_DIR}/boot/firmware" | |||||
if ! [ -L "${ROOTFS_DIR}/boot/overlays" ]; then | |||||
ln -s firmware/overlays "${ROOTFS_DIR}/boot/overlays" | |||||
fi | |||||
install -m 644 files/cmdline.txt "${ROOTFS_DIR}/boot/firmware/" | |||||
if ! [ -L "${ROOTFS_DIR}/boot/cmdline.txt" ]; then | |||||
ln -s firmware/cmdline.txt "${ROOTFS_DIR}/boot/cmdline.txt" | |||||
fi | |||||
install -m 644 files/config.txt "${ROOTFS_DIR}/boot/firmware/" | |||||
if ! [ -L "${ROOTFS_DIR}/boot/config.txt" ]; then | |||||
ln -s firmware/config.txt "${ROOTFS_DIR}/boot/config.txt" | |||||
fi |
@@ -1,73 +1,44 @@ | |||||
# For more options and information see | # For more options and information see | ||||
# http://rpf.io/configtxt | |||||
# http://rptl.io/configtxt | |||||
# Some settings may impact device functionality. See link above for details | # Some settings may impact device functionality. See link above for details | ||||
# uncomment if you get no picture on HDMI for a default "safe" mode | |||||
#hdmi_safe=1 | |||||
# uncomment the following to adjust overscan. Use positive numbers if console | |||||
# goes off screen, and negative if there is too much border | |||||
#overscan_left=16 | |||||
#overscan_right=16 | |||||
#overscan_top=16 | |||||
#overscan_bottom=16 | |||||
# uncomment to force a console size. By default it will be display's size minus | |||||
# overscan. | |||||
#framebuffer_width=1920 | |||||
#framebuffer_height=1080 | |||||
# uncomment if hdmi display is not detected and composite is being output | |||||
#hdmi_force_hotplug=1 | |||||
# uncomment to force a specific HDMI mode (this will force VGA) | |||||
#hdmi_group=1 | |||||
#hdmi_mode=1 | |||||
# uncomment to force a HDMI mode rather than DVI. This can make audio work in | |||||
# DMT (computer monitor) modes | |||||
#hdmi_drive=2 | |||||
# uncomment to increase signal to HDMI, if you have interference, blanking, or | |||||
# no display | |||||
#config_hdmi_boost=4 | |||||
# uncomment for composite PAL | |||||
#sdtv_mode=2 | |||||
#uncomment to overclock the arm. 700 MHz is the default. | |||||
#arm_freq=800 | |||||
# Uncomment some or all of these to enable the optional hardware interfaces | # Uncomment some or all of these to enable the optional hardware interfaces | ||||
#dtparam=i2c_arm=on | #dtparam=i2c_arm=on | ||||
#dtparam=i2s=on | #dtparam=i2s=on | ||||
#dtparam=spi=on | #dtparam=spi=on | ||||
# 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 | |||||
# Enable audio (loads snd_bcm2835) | # Enable audio (loads snd_bcm2835) | ||||
dtparam=audio=on | dtparam=audio=on | ||||
# Additional overlays and parameters are documented | |||||
# /boot/firmware/overlays/README | |||||
# Automatically load overlays for detected cameras | # Automatically load overlays for detected cameras | ||||
camera_auto_detect=1 | camera_auto_detect=1 | ||||
# Automatically load overlays for detected DSI displays | # Automatically load overlays for detected DSI displays | ||||
display_auto_detect=1 | display_auto_detect=1 | ||||
# Automatically load initramfs files, if found | |||||
auto_initramfs=1 | |||||
# Enable DRM VC4 V3D driver | # Enable DRM VC4 V3D driver | ||||
dtoverlay=vc4-kms-v3d | dtoverlay=vc4-kms-v3d | ||||
max_framebuffers=2 | max_framebuffers=2 | ||||
# Don't have the firmware create an initial video= setting in cmdline.txt. | |||||
# Use the kernel's default instead. | |||||
disable_fw_kms_setup=1 | |||||
# Run in 64-bit mode | # Run in 64-bit mode | ||||
arm_64bit=1 | arm_64bit=1 | ||||
# Disable compensation for displays with overscan | # Disable compensation for displays with overscan | ||||
disable_overscan=1 | disable_overscan=1 | ||||
# Run as fast as firmware / board allows | |||||
arm_boost=1 | |||||
[cm4] | [cm4] | ||||
# Enable host mode on the 2711 built-in XHCI USB controller. | # Enable host mode on the 2711 built-in XHCI USB controller. | ||||
# This line should be removed if the legacy DWC2 controller is required | # This line should be removed if the legacy DWC2 controller is required | ||||
@@ -76,8 +47,3 @@ otg_mode=1 | |||||
[all] | [all] | ||||
[pi4] | |||||
# Run as fast as firmware / board allows | |||||
arm_boost=1 | |||||
[all] |
@@ -0,0 +1 @@ | |||||
raspi-config |
@@ -8,7 +8,10 @@ on_chroot << EOF | |||||
if ! id -u ${FIRST_USER_NAME} >/dev/null 2>&1; then | if ! id -u ${FIRST_USER_NAME} >/dev/null 2>&1; then | ||||
adduser --disabled-password --gecos "" ${FIRST_USER_NAME} | adduser --disabled-password --gecos "" ${FIRST_USER_NAME} | ||||
fi | fi | ||||
echo "${FIRST_USER_NAME}:${FIRST_USER_PASS}" | chpasswd | |||||
if [ -n "${FIRST_USER_PASS}" ]; then | |||||
echo "${FIRST_USER_NAME}:${FIRST_USER_PASS}" | chpasswd | |||||
fi | |||||
echo "root:root" | chpasswd | echo "root:root" | chpasswd | ||||
EOF | EOF | ||||
@@ -1,3 +1,3 @@ | |||||
proc /proc proc defaults 0 0 | proc /proc proc defaults 0 0 | ||||
BOOTDEV /boot vfat defaults 0 2 | |||||
BOOTDEV /boot/firmware vfat defaults 0 2 | |||||
ROOTDEV / ext4 defaults,noatime 0 1 | ROOTDEV / ext4 defaults,noatime 0 1 |
@@ -1 +1,2 @@ | |||||
libraspberrypi-bin libraspberrypi0 | libraspberrypi-bin libraspberrypi0 | ||||
systemd-timesyncd |
@@ -1 +0,0 @@ | |||||
raspi-copies-and-fills |
@@ -1,6 +0,0 @@ | |||||
#!/bin/bash -e | |||||
if [ -f "${ROOTFS_DIR}/etc/ld.so.preload" ]; then | |||||
mv "${ROOTFS_DIR}/etc/ld.so.preload" "${ROOTFS_DIR}/etc/ld.so.preload.disabled" | |||||
fi | |||||
@@ -1,13 +1,17 @@ | |||||
ssh less fbset sudo psmisc strace ed ncdu crda | |||||
console-setup keyboard-configuration debconf-utils parted unzip | |||||
ssh less fbset sudo psmisc strace ed ncdu | |||||
console-setup keyboard-configuration debconf-utils parted | |||||
build-essential manpages-dev bash-completion gdb pkg-config | build-essential manpages-dev bash-completion gdb pkg-config | ||||
python-is-python3 | python-is-python3 | ||||
python3-rpi.gpio v4l-utils | |||||
v4l-utils | |||||
python3-libgpiod | |||||
python3-gpiozero | python3-gpiozero | ||||
pigpio python3-pigpio raspi-gpio python3-rpi.gpio | |||||
python3-spidev | |||||
python3-smbus2 | |||||
avahi-daemon | avahi-daemon | ||||
lua5.1 | lua5.1 | ||||
luajit | luajit | ||||
hardlink ca-certificates curl | |||||
ca-certificates curl | |||||
fake-hwclock nfs-common usbutils | fake-hwclock nfs-common usbutils | ||||
libraspberrypi-dev libraspberrypi-doc libfreetype6-dev | libraspberrypi-dev libraspberrypi-doc libfreetype6-dev | ||||
dosfstools | dosfstools | ||||
@@ -24,9 +28,12 @@ htop | |||||
man-db | man-db | ||||
policykit-1 | policykit-1 | ||||
ssh-import-id | ssh-import-id | ||||
rng-tools | |||||
ethtool | ethtool | ||||
ntfs-3g | ntfs-3g | ||||
pciutils | pciutils | ||||
rpi-eeprom | rpi-eeprom | ||||
raspinfo | |||||
raspi-utils | |||||
udisks2 | |||||
unzip zip p7zip-full | |||||
file | |||||
kms++-utils |
@@ -1,5 +1,5 @@ | |||||
--- stage2.orig/rootfs/boot/cmdline.txt | |||||
+++ stage2/rootfs/boot/cmdline.txt | |||||
--- stage2.orig/rootfs/boot/firmware/cmdline.txt | |||||
+++ stage2/rootfs/boot/firmware/cmdline.txt | |||||
@@ -1 +1 @@ | @@ -1 +1 @@ | ||||
-console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 fsck.repair=yes rootwait | -console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 fsck.repair=yes rootwait | ||||
+console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh | |||||
+console=serial0,115200 console=tty1 root=ROOTDEV rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot |
@@ -24,8 +24,6 @@ s/^#?[[:blank:]]*PasswordAuthentication[[:blank:]]*yes[[:blank:]]*$/PasswordAuth | |||||
fi | fi | ||||
on_chroot << EOF | on_chroot << EOF | ||||
gcc -march=native -Q --help=target | |||||
echo "++++++++++++++++++++++++++++++++++++" | |||||
systemctl disable hwclock.sh | systemctl disable hwclock.sh | ||||
systemctl disable nfs-common | systemctl disable nfs-common | ||||
systemctl disable rpcbind | systemctl disable rpcbind | ||||
@@ -54,11 +52,15 @@ on_chroot <<EOF | |||||
for GRP in input spi i2c gpio; do | for GRP in input spi i2c gpio; do | ||||
groupadd -f -r "\$GRP" | groupadd -f -r "\$GRP" | ||||
done | done | ||||
for GRP in adm dialout cdrom audio users sudo video games plugdev input gpio spi i2c netdev; do | |||||
for GRP in adm dialout cdrom audio users sudo video games plugdev input gpio spi i2c netdev render; do | |||||
adduser $FIRST_USER_NAME \$GRP | adduser $FIRST_USER_NAME \$GRP | ||||
done | done | ||||
EOF | EOF | ||||
if [ -f "${ROOTFS_DIR}/etc/sudoers.d/010_pi-nopasswd" ]; then | |||||
sed -i "s/^pi /$FIRST_USER_NAME /" "${ROOTFS_DIR}/etc/sudoers.d/010_pi-nopasswd" | |||||
fi | |||||
on_chroot << EOF | on_chroot << EOF | ||||
setupcon --force --save-only -v | setupcon --force --save-only -v | ||||
EOF | EOF | ||||
@@ -1,4 +1,4 @@ | |||||
wpasupplicant wireless-tools firmware-atheros firmware-brcm80211 firmware-libertas firmware-misc-nonfree firmware-realtek | wpasupplicant wireless-tools firmware-atheros firmware-brcm80211 firmware-libertas firmware-misc-nonfree firmware-realtek | ||||
raspberrypi-net-mods | raspberrypi-net-mods | ||||
dhcpcd5 | |||||
network-manager | |||||
net-tools | net-tools |
@@ -3,27 +3,10 @@ | |||||
install -v -d "${ROOTFS_DIR}/etc/wpa_supplicant" | install -v -d "${ROOTFS_DIR}/etc/wpa_supplicant" | ||||
install -v -m 600 files/wpa_supplicant.conf "${ROOTFS_DIR}/etc/wpa_supplicant/" | install -v -m 600 files/wpa_supplicant.conf "${ROOTFS_DIR}/etc/wpa_supplicant/" | ||||
on_chroot << EOF | |||||
SUDO_USER="${FIRST_USER_NAME}" raspi-config nonint do_boot_wait 0 | |||||
EOF | |||||
if [ -v WPA_COUNTRY ]; then | 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 | |||||
set -o pipefail | |||||
wpa_passphrase "${WPA_ESSID}" "${WPA_PASSWORD}" | tee -a "/etc/wpa_supplicant/wpa_supplicant.conf" | |||||
EOF | |||||
elif [ -v WPA_ESSID ]; then | |||||
cat >> "${ROOTFS_DIR}/etc/wpa_supplicant/wpa_supplicant.conf" << EOL | |||||
network={ | |||||
ssid="${WPA_ESSID}" | |||||
key_mgmt=NONE | |||||
} | |||||
EOL | |||||
on_chroot <<- EOF | |||||
SUDO_USER="${FIRST_USER_NAME}" raspi-config nonint do_wifi_country "${WPA_COUNTRY}" | |||||
EOF | |||||
fi | fi | ||||
# Disable wifi on 5GHz models if WPA_COUNTRY is not set | # Disable wifi on 5GHz models if WPA_COUNTRY is not set | ||||
@@ -31,7 +14,9 @@ mkdir -p "${ROOTFS_DIR}/var/lib/systemd/rfkill/" | |||||
if [ -n "$WPA_COUNTRY" ]; then | if [ -n "$WPA_COUNTRY" ]; then | ||||
echo 0 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-3f300000.mmcnr:wlan" | echo 0 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-3f300000.mmcnr:wlan" | ||||
echo 0 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-fe300000.mmcnr:wlan" | echo 0 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-fe300000.mmcnr:wlan" | ||||
echo 0 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-1001100000.mmc:wlan" | |||||
else | else | ||||
echo 1 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-3f300000.mmcnr:wlan" | echo 1 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-3f300000.mmcnr:wlan" | ||||
echo 1 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-fe300000.mmcnr:wlan" | echo 1 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-fe300000.mmcnr:wlan" | ||||
echo 1 > "${ROOTFS_DIR}/var/lib/systemd/rfkill/platform-1001100000.mmc:wlan" | |||||
fi | fi |
@@ -1,5 +1,5 @@ | |||||
gstreamer1.0-x gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-alsa gstreamer1.0-libav | gstreamer1.0-x gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-alsa gstreamer1.0-libav | ||||
qpdfview gtk2-engines alsa-utils | |||||
evince gtk2-engines alsa-utils | |||||
desktop-base | desktop-base | ||||
git | git | ||||
policykit-1 | policykit-1 | ||||
@@ -12,4 +12,4 @@ fonts-liberation2 | |||||
obconf | obconf | ||||
arandr | arandr | ||||
libcamera-tools | libcamera-tools | ||||
libcamera-apps | |||||
libcamera-apps |
@@ -1,6 +1,8 @@ | |||||
xserver-xorg xinit | xserver-xorg xinit | ||||
mousepad | mousepad | ||||
eom | |||||
lxde lxtask menu-xdg | lxde lxtask menu-xdg | ||||
zenity xdg-utils | zenity xdg-utils | ||||
gvfs-backends gvfs-fuse | gvfs-backends gvfs-fuse | ||||
lightdm gnome-themes-standard gnome-icon-theme | |||||
lightdm gnome-themes-extra-data gnome-icon-theme | |||||
gnome-keyring |
@@ -1,5 +0,0 @@ | |||||
#!/bin/bash -e | |||||
on_chroot << EOF | |||||
SUDO_USER="${FIRST_USER_NAME}" raspi-config nonint do_boot_wait 1 | |||||
EOF |
@@ -2,24 +2,18 @@ python3-pygame | |||||
python3-tk thonny | python3-tk thonny | ||||
python3-pgzero | python3-pgzero | ||||
python3-serial | python3-serial | ||||
python3-picamera | |||||
debian-reference-en dillo | debian-reference-en dillo | ||||
raspberrypi-net-mods raspberrypi-ui-mods | raspberrypi-net-mods raspberrypi-ui-mods | ||||
python3-pip | python3-pip | ||||
python3-numpy | python3-numpy | ||||
pypy | |||||
alacarte rc-gui sense-hat | alacarte rc-gui sense-hat | ||||
tree | tree | ||||
libgl1-mesa-dri libgles1 libgles2-mesa xcompmgr | libgl1-mesa-dri libgles1 libgles2-mesa xcompmgr | ||||
geany | geany | ||||
piclone | piclone | ||||
pigpio python3-pigpio raspi-gpio python3-rpi.gpio | |||||
python3-spidev | |||||
python3-twython | python3-twython | ||||
python3-smbus | |||||
python3-flask | python3-flask | ||||
pprompt | pprompt | ||||
piwiz | piwiz | ||||
rp-prefapps | rp-prefapps | ||||
ffmpeg | ffmpeg | ||||
vlc |
@@ -0,0 +1,5 @@ | |||||
#!/bin/bash -e | |||||
on_chroot << EOF | |||||
SUDO_USER="${FIRST_USER_NAME}" raspi-config nonint do_wayland W2 | |||||
EOF |
@@ -1,22 +0,0 @@ | |||||
python3-automationhat | |||||
python3-blinkt | |||||
python3-cap1xxx | |||||
python3-drumhat | |||||
python3-envirophat | |||||
python3-explorerhat | |||||
python3-fourletterphat | |||||
python3-microdotphat | |||||
python3-mote | |||||
python3-motephat | |||||
python3-phatbeat | |||||
python3-pianohat | |||||
python3-piglow | |||||
python3-rainbowhat | |||||
python3-scrollphat | |||||
python3-scrollphathd | |||||
python3-sn3218 | |||||
python3-skywriter | |||||
python3-touchphat | |||||
python3-buttonshim | |||||
python3-unicornhathd | |||||
python3-pantilthat |
@@ -0,0 +1,3 @@ | |||||
#!/bin/bash -e | |||||
sed -i 's/^.*HandlePowerKey=.*$/HandlePowerKey=ignore/' "${ROOTFS_DIR}/etc/systemd/logind.conf" |
@@ -5,7 +5,7 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
if [ ! -d "uhd" ]; then | if [ ! -d "uhd" ]; then | ||||
git clone --single-branch --branch UHD-3.15.LTS --depth 1 https://github.com/EttusResearch/uhd.git | |||||
git clone --single-branch --branch UHD-4.4 --depth 1 https://github.com/EttusResearch/uhd.git | |||||
fi | fi | ||||
cd uhd/host | cd uhd/host | ||||
@@ -2,5 +2,5 @@ swig | |||||
libsqlite3-dev | libsqlite3-dev | ||||
libi2c-dev | libi2c-dev | ||||
libusb-1.0-0-dev | libusb-1.0-0-dev | ||||
libwxgtk3.0-gtk3-dev | |||||
libwxgtk3.2-dev | |||||
freeglut3-dev | freeglut3-dev |
@@ -5,4 +5,5 @@ libcdk5-dev | |||||
libaio-dev | libaio-dev | ||||
libusb-1.0-0-dev | libusb-1.0-0-dev | ||||
libserialport-dev | libserialport-dev | ||||
libavahi-client-dev | |||||
libavahi-client-dev | |||||
libzstd-dev |
@@ -5,7 +5,7 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Radios" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Radios" | cd "/home/${FIRST_USER_NAME}/PiSDR/Radios" | ||||
if [ ! -d "libiio" ]; then | if [ ! -d "libiio" ]; then | ||||
git clone --depth 1 https://github.com/analogdevicesinc/libiio | |||||
git clone --depth 1 --branch libiio-v0 https://github.com/analogdevicesinc/libiio | |||||
fi | fi | ||||
cd libiio | cd libiio | ||||
@@ -5,7 +5,7 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Radios" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Radios" | cd "/home/${FIRST_USER_NAME}/PiSDR/Radios" | ||||
if [ ! -d "libad9361-iio" ]; then | if [ ! -d "libad9361-iio" ]; then | ||||
git clone --depth 1 https://github.com/analogdevicesinc/libad9361-iio | |||||
git clone --depth 1 --branch v0.3 https://github.com/analogdevicesinc/libad9361-iio | |||||
fi | fi | ||||
cd libad9361-iio | cd libad9361-iio | ||||
@@ -5,10 +5,10 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Radios" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Radios" | cd "/home/${FIRST_USER_NAME}/PiSDR/Radios" | ||||
if [ ! -d "rtl-sdr" ]; then | if [ ! -d "rtl-sdr" ]; then | ||||
git clone --depth 1 https://github.com/osmocom/rtl-sdr | |||||
git clone --depth 1 https://github.com/rtlsdrblog/rtl-sdr-blog.git | |||||
fi | fi | ||||
cd rtl-sdr | |||||
cd rtl-sdr-blog | |||||
mkdir -p build | mkdir -p build | ||||
cd build | cd build | ||||
cmake -GNinja -DINSTALL_UDEV_RULES=ON -DDETACH_KERNEL_DRIVER=ON .. | cmake -GNinja -DINSTALL_UDEV_RULES=ON -DDETACH_KERNEL_DRIVER=ON .. | ||||
@@ -5,7 +5,7 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Radios" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Radios" | cd "/home/${FIRST_USER_NAME}/PiSDR/Radios" | ||||
if [ ! -d "hackrf" ]; then | if [ ! -d "hackrf" ]; then | ||||
git clone https://github.com/mossmann/hackrf.git | |||||
git clone --depth 1 https://github.com/mossmann/hackrf.git | |||||
fi | fi | ||||
cd hackrf/host | cd hackrf/host | ||||
@@ -18,6 +18,7 @@ libqt5opengl5-dev | |||||
libcodec2-dev | libcodec2-dev | ||||
libsndfile1-dev | libsndfile1-dev | ||||
pybind11-dev | pybind11-dev | ||||
libspdlog-dev | |||||
gir1.2-gtk-3.0 | gir1.2-gtk-3.0 | ||||
swig | swig | ||||
@@ -35,4 +36,6 @@ python3-pip | |||||
python3-gi-cairo | python3-gi-cairo | ||||
python3-matplotlib | python3-matplotlib | ||||
python3-pygccxml | python3-pygccxml | ||||
python3-pyqtgraph | |||||
python3-pyqtgraph | |||||
python3-packaging | |||||
python3-jsonschema |
@@ -5,7 +5,7 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
if [ ! -d "volk" ]; then | if [ ! -d "volk" ]; then | ||||
git clone --single-branch --branch v2.5.0 --depth 1 --recurse-submodules --shallow-submodules https://github.com/gnuradio/volk.git | |||||
git clone --single-branch --branch v3.0.0 --depth 1 --recurse-submodules --shallow-submodules https://github.com/gnuradio/volk.git | |||||
fi | fi | ||||
cd volk | cd volk | ||||
@@ -5,7 +5,7 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
if [ ! -d "gnuradio" ]; then | if [ ! -d "gnuradio" ]; then | ||||
git clone --single-branch --branch maint-3.9 --depth 1 --recurse-submodules --shallow-submodules https://github.com/gnuradio/gnuradio.git | |||||
git clone --single-branch --branch maint-3.10 --depth 1 --recurse-submodules --shallow-submodules https://github.com/gnuradio/gnuradio.git | |||||
fi | fi | ||||
cd gnuradio | cd gnuradio | ||||
@@ -5,7 +5,7 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
if [ ! -d "gr-sdrplay3" ]; then | if [ ! -d "gr-sdrplay3" ]; then | ||||
git clone --single-branch --branch master --depth 1 https://github.com/fventuri/gr-sdrplay3.git | |||||
git clone --single-branch --branch main --depth 1 https://github.com/fventuri/gr-sdrplay3.git | |||||
fi | fi | ||||
cd gr-sdrplay3 | cd gr-sdrplay3 | ||||
@@ -41,3 +41,12 @@ libavcodec-dev | |||||
libavformat-dev | libavformat-dev | ||||
libopus-dev | libopus-dev | ||||
graphviz | graphviz | ||||
libqt5texttospeech5-dev | |||||
zlib1g-dev | |||||
libfaad-dev | |||||
libqt5gamepad5-dev | |||||
qtbase5-private-dev | |||||
qtwebengine5-dev | |||||
qml-module-qtquick-controls2 | |||||
libspeexdsp-dev | |||||
libsamplerate0-dev |
@@ -13,7 +13,7 @@ git reset --hard c0e92b92aca3d1d36c990b642b937c64d363c559 | |||||
mkdir -p build | mkdir -p build | ||||
cd build | cd build | ||||
cmake -GNinja .. | cmake -GNinja .. | ||||
ninja | |||||
ninja install | |||||
ldconfig | ldconfig | ||||
cd .. | cd .. | ||||
rm -fr build | rm -fr build | ||||
@@ -9,7 +9,7 @@ if [ ! -d "dsdcc" ]; then | |||||
fi | fi | ||||
cd dsdcc | cd dsdcc | ||||
git reset --hard "v1.9.0" | |||||
git reset --hard "v1.9.3" | |||||
mkdir -p build | mkdir -p build | ||||
cd build | cd build | ||||
cmake -GNinja -DUSE_MBELIB=ON .. | cmake -GNinja -DUSE_MBELIB=ON .. | ||||
@@ -5,11 +5,11 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
if [ ! -d "codec2" ]; then | if [ ! -d "codec2" ]; then | ||||
git clone https://github.com/drowe67/codec2.git | |||||
git clone https://github.com/drowe67/codec2-dev.git codec2 | |||||
fi | fi | ||||
cd codec2 | cd codec2 | ||||
git reset --hard 76a20416d715ee06f8b36a9953506876689a3bd2 | |||||
git reset --hard "v1.0.3" | |||||
mkdir -p build | mkdir -p build | ||||
cd build | cd build | ||||
cmake -GNinja .. | cmake -GNinja .. | ||||
@@ -5,13 +5,13 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
if [ ! -d "sdrangel" ]; then | if [ ! -d "sdrangel" ]; then | ||||
git clone --depth 1 --branch v6.5.5 https://github.com/f4exb/sdrangel.git | |||||
git clone --depth 1 --branch v7.15.3 https://github.com/f4exb/sdrangel.git | |||||
fi | fi | ||||
cd sdrangel | cd sdrangel | ||||
mkdir -p build | mkdir -p build | ||||
cd build | cd build | ||||
cmake -GNinja .. | |||||
cmake -DSOAPYSDR_DIR=/usr/local -GNinja .. | |||||
ninja install | ninja install | ||||
ldconfig | ldconfig | ||||
cd .. | cd .. | ||||
@@ -10,7 +10,7 @@ liblqr-1-0 | |||||
libmagickcore-6.q16-6 | libmagickcore-6.q16-6 | ||||
libmagickcore-6.q16-6-extra | libmagickcore-6.q16-6-extra | ||||
libmagickwand-6.q16-6 | libmagickwand-6.q16-6 | ||||
libnetpbm10 | |||||
libnetpbm11 | |||||
libpng-dev | libpng-dev | ||||
libwmf0.2-7 | libwmf0.2-7 | ||||
netpbm | netpbm |
@@ -1,5 +1,8 @@ | |||||
#!/bin/bash -e | #!/bin/bash -e | ||||
# currently not compiling with Bookworm | |||||
exit | |||||
on_chroot << EOF | on_chroot << EOF | ||||
python3 -m pip install --upgrade quisk | python3 -m pip install --upgrade quisk | ||||
EOF | EOF |
@@ -5,7 +5,7 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
if [ ! -d "RTLSDR-Airband" ]; then | if [ ! -d "RTLSDR-Airband" ]; then | ||||
git clone --depth 1 https://github.com/szpajder/RTLSDR-Airband.git | |||||
git clone --branch unstable --depth 1 https://github.com/szpajder/RTLSDR-Airband.git | |||||
fi | fi | ||||
cd RTLSDR-Airband | cd RTLSDR-Airband | ||||
@@ -0,0 +1,12 @@ | |||||
git | |||||
build-essential | |||||
cmake | |||||
pkg-config | |||||
ninja-build | |||||
meson | |||||
mesa-vulkan-drivers | |||||
libvulkan-dev | |||||
spirv-cross | |||||
glslang-tools | |||||
libglfw3-dev | |||||
libfftw3-dev |
@@ -0,0 +1,14 @@ | |||||
#!/bin/bash -e | |||||
on_chroot << EOF | |||||
mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
if [ ! -d "CyberEther" ]; then | |||||
git clone --branch development --depth 1 https://github.com/luigifcruz/CyberEther.git | |||||
cd CyberEther | |||||
meson -Dbuildtype=debugoptimized build | |||||
cd build | |||||
ninja | |||||
fi | |||||
EOF |
@@ -1,13 +0,0 @@ | |||||
#!/bin/bash -e | |||||
on_chroot << EOF | |||||
mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
if [ ! -d "FoxTelem" ]; then | |||||
wget http://amsat.us/FoxTelem/linux/FoxTelem_1.11g2_linux.tar.gz | |||||
tar -xvzf FoxTelem_1.11g2_linux.tar.gz | |||||
mv FoxTelem_1.11g2_linux FoxTelem | |||||
rm FoxTelem_1.11g2_linux.tar.gz | |||||
fi | |||||
EOF |
@@ -5,7 +5,7 @@ mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | |||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
if [ ! -d "SDRPlusPlus" ]; then | if [ ! -d "SDRPlusPlus" ]; then | ||||
git clone --single-branch --branch 1.0.4 --depth 1 https://github.com/AlexandreRouma/SDRPlusPlus.git | |||||
git clone --single-branch --branch master --depth 1 https://github.com/AlexandreRouma/SDRPlusPlus.git | |||||
fi | fi | ||||
cd SDRPlusPlus | cd SDRPlusPlus | ||||
@@ -1,14 +1,17 @@ | |||||
#!/bin/bash -e | #!/bin/bash -e | ||||
# currently not compiling with latest AirSpy drivers | |||||
exit | |||||
on_chroot << EOF | on_chroot << EOF | ||||
mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
if [ ! -d "urh" ]; then | if [ ! -d "urh" ]; then | ||||
git clone --depth 1 https://github.com/jopohl/urh.git | |||||
git clone --depth 1 --branch v2.9.4 https://github.com/jopohl/urh.git | |||||
fi | fi | ||||
cd urh | cd urh | ||||
python3 -m pip install --upgrade cython | |||||
python3 -m pip install cython==3.0.0 | |||||
python3 setup.py install | python3 setup.py install | ||||
EOF | EOF |
@@ -1,11 +1,14 @@ | |||||
#!/bin/bash -e | #!/bin/bash -e | ||||
# currently not compiling with latest Gtk | |||||
exit | |||||
on_chroot << EOF | on_chroot << EOF | ||||
mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | mkdir -p "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | cd "/home/${FIRST_USER_NAME}/PiSDR/Software" | ||||
if [ ! -d "iio-oscilloscope" ]; then | if [ ! -d "iio-oscilloscope" ]; then | ||||
git clone --depth 1 https://github.com/analogdevicesinc/iio-oscilloscope.git | |||||
git clone --depth 1 --branch v0.16-master https://github.com/analogdevicesinc/iio-oscilloscope.git | |||||
fi | fi | ||||
cd iio-oscilloscope | cd iio-oscilloscope | ||||