Merge pull request #21 from home-assistant/dev
Merge in changes from pre-release image into dev.
This commit is contained in:
commit
50878e20ce
3
.dockerignore
Normal file
3
.dockerignore
Normal file
|
@ -0,0 +1,3 @@
|
|||
output/
|
||||
work/
|
||||
deploy/
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,6 +1,7 @@
|
|||
deploy/*
|
||||
work/*
|
||||
config
|
||||
postrun.sh
|
||||
SKIP
|
||||
.pc
|
||||
*-pc
|
||||
|
|
12
Dockerfile
Normal file
12
Dockerfile
Normal file
|
@ -0,0 +1,12 @@
|
|||
FROM debian:jessie
|
||||
|
||||
RUN apt-get -y update && \
|
||||
apt-get -y install \
|
||||
git vim parted \
|
||||
quilt realpath qemu-user-static debootstrap zerofree pxz zip dosfstools \
|
||||
bsdtar libcap2-bin rsync grep \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY . /pi-gen/
|
||||
|
||||
VOLUME [ "/pi-gen/work", "/pi-gen/deploy"]
|
37
README.md
Normal file → Executable file
37
README.md
Normal file → Executable file
|
@ -5,10 +5,11 @@ The Haspbian image is built with the same script that generates the official [Ra
|
|||
|
||||
By default the Haspbian image is built on a Debian 8 droplet on Digital Ocean and takes about 30 minutes to build on the cheapest droplet. Dependencies and everything is handled by the build script with the exception of `git`.
|
||||
|
||||
|
||||
Build instructions:
|
||||
- Install git. `sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get install git`
|
||||
- Clone the `rpi_gen` code. `git clone https://github.com/home-assistant/pi-gen.git`
|
||||
- Create a file in the current folder named `config`. More about it's contense below.
|
||||
- Create a file in the current folder named `config`. More about it's contents below.
|
||||
- Run the build script, with sudo or as root. `sudo ./build.sh`
|
||||
- Wait ~30 minutes for build to complete.
|
||||
- Retrieve your freshly built Raspberry Pi image from the `rpi_gen\deploy` folder.
|
||||
|
@ -16,7 +17,7 @@ Build instructions:
|
|||
|
||||
### Dependencies
|
||||
|
||||
`quilt qemu-arm-static:qemu-user-static debootstrap kpartx zerofree pxz zip mkdosfs:dosfstools capsh:libcap2-bin bsdtar`
|
||||
`quilt parted realpath qemu-user-static debootstrap zerofree pxz zip dosfstools bsdtar libcap2-bin grep rsync`
|
||||
|
||||
## Config
|
||||
|
||||
|
@ -35,7 +36,25 @@ A simple example for building Hassbian:
|
|||
IMG_NAME='Hassbian'
|
||||
```
|
||||
|
||||
### Raspbian Stage Overview
|
||||
## Docker Build
|
||||
|
||||
```bash
|
||||
nano config # Edit your config file. See above.
|
||||
./build-docker.sh
|
||||
```
|
||||
If everything goes well, your finished image will be in the `deploy/` folder.
|
||||
You can then remove the build container with `docker rm pigen_work`
|
||||
|
||||
If something breaks along the line, you can edit the corresponding scripts, and
|
||||
continue:
|
||||
|
||||
```
|
||||
CONTINUE=1 ./build-docker.sh
|
||||
```
|
||||
|
||||
There is a possibility that even when running from a docker container, the installation of `qemu-user-static` will silently fail when building the image because `binfmt-support` _must be enabled on the underlying kernel_. An easy fix is to ensure `binfmt-support` is installed on the host machine before starting the `./build-docker.sh` script (or using your own docker build solution).
|
||||
|
||||
### Raspbian Stage Anatomy
|
||||
|
||||
The build of Hassbian is divided up into several stages for logical clarity
|
||||
and modularity. This causes some initial complexity, but it simplifies
|
||||
|
@ -78,20 +97,18 @@ maintenance and allows for more easy customization.
|
|||
specific packages are installed, permissions are set and users created.
|
||||
This is the only stage we add to the original build script.
|
||||
|
||||
The original **Stage 3** and **Stage 4** are removed since they are not
|
||||
The original **Stage 4** and **Stage 5** are removed since they are not
|
||||
used on the HASSbian image.
|
||||
|
||||
|
||||
|
||||
|
||||
### Stage specification
|
||||
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 remove the `EXPORT*` files from `./stage4` (if building up to stage 2) or from `./stage2` (if building a minimal system).
|
||||
Then remove the `EXPORT*` files from `./stage3` (if building up to stage 2) and add them to `./stage2`.
|
||||
|
||||
```
|
||||
# Example for building a lite system without Home Assistant
|
||||
## Example for building a lite system without Home Assistant
|
||||
$ touch ./stage3/SKIP
|
||||
$ rm stage3/EXPORT*
|
||||
$ touch stage3/EXPORT_IMAGE
|
||||
```
|
||||
|
||||
If you wish to build further configurations upon (for example) the lite system, you can also delete the contents of `./stage3` and replace with your own contents in the same format.
|
||||
|
|
73
build-docker.sh
Executable file
73
build-docker.sh
Executable file
|
@ -0,0 +1,73 @@
|
|||
#!/bin/bash -e
|
||||
DOCKER="docker"
|
||||
set +e
|
||||
$DOCKER ps >/dev/null 2>&1
|
||||
if [ $? != 0 ]; then
|
||||
DOCKER="sudo docker"
|
||||
fi
|
||||
if ! $DOCKER ps >/dev/null; then
|
||||
echo "error connecting to docker:"
|
||||
$DOCKER ps
|
||||
exit 1
|
||||
fi
|
||||
set -e
|
||||
|
||||
config_mount=
|
||||
if [ -f config ]; then
|
||||
config_mount="-v $(pwd)/config:/pi-gen/config:ro"
|
||||
source config
|
||||
fi
|
||||
|
||||
CONTAINER_NAME=${CONTAINER_NAME:-pigen_work}
|
||||
CONTINUE=${CONTINUE:-0}
|
||||
|
||||
if [ "$*" != "" ] || [ -z "${IMG_NAME}" ]; then
|
||||
if [ -z "${IMG_NAME}" ]; then
|
||||
echo "IMG_NAME not set in 'build'" 1>&2
|
||||
echo 1>&2
|
||||
fi
|
||||
cat >&2 <<EOF
|
||||
Usage:
|
||||
build-docker.sh [options]
|
||||
Optional environment arguments: ( =<default> )
|
||||
CONTAINER_NAME=pigen_work set a name for the build container
|
||||
CONTINUE=0 continue from a previously started container
|
||||
EOF
|
||||
exit 1
|
||||
fi
|
||||
|
||||
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."
|
||||
echo "You can delete the existing container like this:"
|
||||
echo " docker rm $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 \
|
||||
--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;
|
||||
rsync -av work/*/build.log deploy/" &
|
||||
wait
|
||||
else
|
||||
trap "echo 'got CTRL+C... please wait 5s'; docker stop -t 5 ${CONTAINER_NAME}" SIGINT SIGTERM
|
||||
$DOCKER run --name "${CONTAINER_NAME}" --privileged \
|
||||
-v $(pwd)/deploy:/pi-gen/deploy \
|
||||
${config_mount} \
|
||||
pi-gen \
|
||||
bash -e -o pipefail -c "dpkg-reconfigure qemu-user-static &&
|
||||
cd /pi-gen; ./build.sh &&
|
||||
rsync -av work/*/build.log deploy/" &
|
||||
wait
|
||||
fi
|
||||
echo "Done! Your image(s) should be in deploy/"
|
24
build.sh
24
build.sh
|
@ -67,10 +67,10 @@ EOF
|
|||
./${i}-run.sh
|
||||
log "End ${SUB_STAGE_DIR}/${i}-run.sh"
|
||||
fi
|
||||
if [ -f ${i}-run-chroot ]; then
|
||||
log "Begin ${SUB_STAGE_DIR}/${i}-run-chroot"
|
||||
on_chroot < ${i}-run-chroot
|
||||
log "End ${SUB_STAGE_DIR}/${i}-run-chroot"
|
||||
if [ -f ${i}-run-chroot.sh ]; then
|
||||
log "Begin ${SUB_STAGE_DIR}/${i}-run-chroot.sh"
|
||||
on_chroot < ${i}-run-chroot.sh
|
||||
log "End ${SUB_STAGE_DIR}/${i}-run-chroot.sh"
|
||||
fi
|
||||
done
|
||||
popd > /dev/null
|
||||
|
@ -132,8 +132,8 @@ export IMG_DATE=${IMG_DATE:-"$(date -u +%Y-%m-%d)"}
|
|||
|
||||
export BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
export SCRIPT_DIR="${BASE_DIR}/scripts"
|
||||
export WORK_DIR="${BASE_DIR}/work/${IMG_DATE}-${IMG_NAME}"
|
||||
export DEPLOY_DIR="${BASE_DIR}/deploy"
|
||||
export WORK_DIR=${WORK_DIR:-"${BASE_DIR}/work/${IMG_DATE}-${IMG_NAME}"}
|
||||
export DEPLOY_DIR=${DEPLOY_DIR:-"${BASE_DIR}/deploy"}
|
||||
export LOG_FILE="${WORK_DIR}/build.log"
|
||||
|
||||
export CLEAN
|
||||
|
@ -148,6 +148,8 @@ export PREV_STAGE_DIR
|
|||
export ROOTFS_DIR
|
||||
export PREV_ROOTFS_DIR
|
||||
export IMG_SUFFIX
|
||||
export NOOBS_NAME
|
||||
export NOOBS_DESCRIPTION
|
||||
export EXPORT_DIR
|
||||
export EXPORT_ROOTFS_DIR
|
||||
|
||||
|
@ -172,13 +174,21 @@ done
|
|||
CLEAN=1
|
||||
for EXPORT_DIR in ${EXPORT_DIRS}; do
|
||||
STAGE_DIR=${BASE_DIR}/export-image
|
||||
IMG_SUFFIX=$(cat ${EXPORT_DIR}/EXPORT_IMAGE)
|
||||
source "${EXPORT_DIR}/EXPORT_IMAGE"
|
||||
EXPORT_ROOTFS_DIR=${WORK_DIR}/$(basename ${EXPORT_DIR})/rootfs
|
||||
run_stage
|
||||
if [ -e ${EXPORT_DIR}/EXPORT_NOOBS ]; then
|
||||
source ${EXPORT_DIR}/EXPORT_NOOBS
|
||||
STAGE_DIR=${BASE_DIR}/export-noobs
|
||||
run_stage
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -x postrun.sh ]; then
|
||||
log "Begin postrun.sh"
|
||||
cd "${BASE_DIR}"
|
||||
./postrun.sh
|
||||
log "End postrun.sh"
|
||||
fi
|
||||
|
||||
log "End ${BASE_DIR}"
|
||||
|
|
6
depends
6
depends
|
@ -1,8 +1,12 @@
|
|||
quilt
|
||||
parted
|
||||
realpath
|
||||
qemu-arm-static:qemu-user-static
|
||||
debootstrap
|
||||
kpartx zerofree
|
||||
zerofree
|
||||
pxz zip
|
||||
mkdosfs:dosfstools
|
||||
capsh:libcap2-bin
|
||||
bsdtar
|
||||
grep
|
||||
rsync
|
12
export-image/03-set-partuuid/00-run.sh
Executable file
12
export-image/03-set-partuuid/00-run.sh
Executable file
|
@ -0,0 +1,12 @@
|
|||
#!/bin/bash -e
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img"
|
||||
|
||||
IMGID="$(fdisk -l ${IMG_FILE} | sed -n 's/Disk identifier: 0x\([^ ]*\)/\1/p')"
|
||||
|
||||
BOOT_PARTUUID="${IMGID}-01"
|
||||
ROOT_PARTUUID="${IMGID}-02"
|
||||
|
||||
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}/boot/cmdline.txt
|
|
@ -18,6 +18,29 @@ 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
|
||||
|
||||
rm -f ${ROOTFS_DIR}/etc/apt/sources.list~
|
||||
rm -f ${ROOTFS_DIR}/etc/apt/trusted.gpg~
|
||||
|
||||
rm -f ${ROOTFS_DIR}/etc/passwd-
|
||||
rm -f ${ROOTFS_DIR}/etc/group-
|
||||
rm -f ${ROOTFS_DIR}/etc/shadow-
|
||||
rm -f ${ROOTFS_DIR}/etc/gshadow-
|
||||
|
||||
rm -f ${ROOTFS_DIR}/var/cache/debconf/*-old
|
||||
rm -f ${ROOTFS_DIR}/var/lib/dpkg/*-old
|
||||
|
||||
rm -f ${ROOTFS_DIR}/usr/share/icons/*/icon-theme.cache
|
||||
|
||||
rm -f ${ROOTFS_DIR}/var/lib/dbus/machine-id
|
||||
|
||||
true > ${ROOTFS_DIR}/etc/machine-id
|
||||
|
||||
for _FILE in $(find ${ROOTFS_DIR}/var/log/ -type f); do
|
||||
true > ${_FILE}
|
||||
done
|
||||
|
||||
rm -f "${ROOTFS_DIR}/root/.vnc/private.key"
|
||||
|
||||
update_issue $(basename ${EXPORT_DIR})
|
||||
install -m 644 ${ROOTFS_DIR}/etc/rpi-issue ${ROOTFS_DIR}/boot/issue.txt
|
||||
install files/LICENSE.oracle ${ROOTFS_DIR}/boot/
|
|
@ -8,19 +8,19 @@ rm -f ${IMG_FILE}
|
|||
rm -rf ${ROOTFS_DIR}
|
||||
mkdir -p ${ROOTFS_DIR}
|
||||
|
||||
BOOT_SIZE=$(du -sh ${EXPORT_ROOTFS_DIR}/boot -B M | cut -f 1 | tr -d M)
|
||||
TOTAL_SIZE=$(du -sh ${EXPORT_ROOTFS_DIR} -B M | cut -f 1 | tr -d M)
|
||||
BOOT_SIZE=$(du -s ${EXPORT_ROOTFS_DIR}/boot --block-size=1 | cut -f 1)
|
||||
TOTAL_SIZE=$(du -s ${EXPORT_ROOTFS_DIR} --exclude var/cache/apt/archives --block-size=1 | cut -f 1)
|
||||
|
||||
IMG_SIZE=$(expr $BOOT_SIZE \* 2 \+ $TOTAL_SIZE \+ 512)M
|
||||
IMG_SIZE=$((BOOT_SIZE + TOTAL_SIZE + (400 * 1024 * 1024)))
|
||||
|
||||
fallocate -l ${IMG_SIZE} ${IMG_FILE}
|
||||
fdisk ${IMG_FILE} > /dev/null 2>&1 <<EOF
|
||||
fdisk -H 255 -S 63 ${IMG_FILE} <<EOF
|
||||
o
|
||||
n
|
||||
|
||||
|
||||
8192
|
||||
+`expr $BOOT_SIZE \* 3`M
|
||||
+$((BOOT_SIZE * 2 /512))
|
||||
p
|
||||
t
|
||||
c
|
||||
|
@ -34,15 +34,27 @@ p
|
|||
w
|
||||
EOF
|
||||
|
||||
LOOP_DEV=`kpartx -asv ${IMG_FILE} | grep -E -o -m1 'loop[[:digit:]]+' | head -n 1`
|
||||
BOOT_DEV=/dev/mapper/${LOOP_DEV}p1
|
||||
ROOT_DEV=/dev/mapper/${LOOP_DEV}p2
|
||||
PARTED_OUT=$(parted -s ${IMG_FILE} unit b print)
|
||||
BOOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^ 1'| xargs echo -n \
|
||||
| cut -d" " -f 2 | tr -d B)
|
||||
BOOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^ 1'| xargs echo -n \
|
||||
| cut -d" " -f 4 | tr -d B)
|
||||
|
||||
mkdosfs -n boot -S 512 -s 16 -v $BOOT_DEV > /dev/null
|
||||
ROOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^ 2'| xargs echo -n \
|
||||
| cut -d" " -f 2 | tr -d B)
|
||||
ROOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^ 2'| xargs echo -n \
|
||||
| cut -d" " -f 4 | tr -d B)
|
||||
|
||||
BOOT_DEV=$(losetup --show -f -o ${BOOT_OFFSET} --sizelimit ${BOOT_LENGTH} ${IMG_FILE})
|
||||
ROOT_DEV=$(losetup --show -f -o ${ROOT_OFFSET} --sizelimit ${ROOT_LENGTH} ${IMG_FILE})
|
||||
echo "/boot: offset $BOOT_OFFSET, length $BOOT_LENGTH"
|
||||
echo "/: offset $ROOT_OFFSET, length $ROOT_LENGTH"
|
||||
|
||||
mkdosfs -n boot -F 32 -v $BOOT_DEV > /dev/null
|
||||
mkfs.ext4 -O ^huge_file $ROOT_DEV > /dev/null
|
||||
|
||||
mount -v $ROOT_DEV ${ROOTFS_DIR} -t ext4
|
||||
mkdir -p ${ROOTFS_DIR}/boot
|
||||
mount -v $BOOT_DEV ${ROOTFS_DIR}/boot -t vfat
|
||||
|
||||
rsync -aHAXx ${EXPORT_ROOTFS_DIR}/ ${ROOTFS_DIR}/
|
||||
rsync -aHAXx --exclude var/cache/apt/archives ${EXPORT_ROOTFS_DIR}/ ${ROOTFS_DIR}/
|
||||
|
|
|
@ -5,7 +5,7 @@ NOOBS_DIR="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}"
|
|||
install -v -m 744 files/partition_setup.sh ${NOOBS_DIR}/
|
||||
install -v files/partitions.json ${NOOBS_DIR}/
|
||||
install -v files/os.json ${NOOBS_DIR}/
|
||||
install -v files/Raspbian.png ${NOOBS_DIR}/
|
||||
install -v files/OS.png ${NOOBS_DIR}/
|
||||
install -v files/release_notes.txt ${NOOBS_DIR}/
|
||||
|
||||
tar -v -c -C files/marketing -f ${NOOBS_DIR}/marketing.tar .
|
||||
|
@ -19,13 +19,18 @@ ROOT_SIZE=$(expr ${ROOT_SIZE} / 1000000 \+ 1)
|
|||
BOOT_NOM=$(expr ${BOOT_SIZE} \* 3)
|
||||
ROOT_NOM=$(expr ${ROOT_SIZE} \+ 400)
|
||||
|
||||
mv "${NOOBS_DIR}/OS.png" "${NOOBS_DIR}/$(echo ${NOOBS_NAME} | sed 's/ /_/g').png"
|
||||
|
||||
sed ${NOOBS_DIR}/partitions.json -i -e "s|BOOT_SIZE|${BOOT_SIZE}|"
|
||||
sed ${NOOBS_DIR}/partitions.json -i -e "s|ROOT_SIZE|${ROOT_SIZE}|"
|
||||
|
||||
sed ${NOOBS_DIR}/partitions.json -i -e "s|BOOT_NOM|${BOOT_NOM}|"
|
||||
sed ${NOOBS_DIR}/partitions.json -i -e "s|ROOT_NOM|${ROOT_NOM}|"
|
||||
|
||||
sed ${NOOBS_DIR}/release_notes.txt -i -e "s|UNRELEASED|${IMG_DATE}|"
|
||||
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}/release_notes.txt -i -e "s|UNRELEASED|${IMG_DATE}|"
|
||||
|
||||
cp -a ${NOOBS_DIR} ${DEPLOY_DIR}/
|
||||
|
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"description": "A community-created port of Debian jessie for the Raspberry Pi",
|
||||
"description": "NOOBS_DESCRIPTION",
|
||||
"feature_level": 35120124,
|
||||
"kernel": "4.4",
|
||||
"name": "Raspbian",
|
||||
"name": "NOOBS_NAME",
|
||||
"password": "raspberry",
|
||||
"release_date": "UNRELEASED",
|
||||
"supported_hex_revisions": "2,3,4,5,6,7,8,9,d,e,f,10,11,12,14,19,1040,1041,0092,0093,2082",
|
||||
|
|
|
@ -12,10 +12,22 @@ mkdir -p /tmp/1 /tmp/2
|
|||
mount "$part1" /tmp/1
|
||||
mount "$part2" /tmp/2
|
||||
|
||||
sed /tmp/1/cmdline.txt -i -e "s|root=/dev/[^ ]*|root=${part2}|"
|
||||
sed /tmp/1/cmdline.txt -i -e "s|root=[^ ]*|root=${part2}|"
|
||||
sed /tmp/2/etc/fstab -i -e "s|^.* / |${part2} / |"
|
||||
sed /tmp/2/etc/fstab -i -e "s|^.* /boot |${part1} /boot |"
|
||||
|
||||
if [ -f /mnt/ssh ]; then
|
||||
cp /mnt/ssh /tmp/1/
|
||||
fi
|
||||
|
||||
if [ -f /mnt/ssh.txt ]; then
|
||||
cp /mnt/ssh.txt /tmp/1/
|
||||
fi
|
||||
|
||||
if [ -f /settings/wpa_supplicant.conf ]; then
|
||||
cp /settings/wpa_supplicant.conf /tmp/1/
|
||||
fi
|
||||
|
||||
if ! grep -q resize /proc/cmdline; then
|
||||
sed -i 's| quiet init=/usr/lib/raspi-config/init_resize.sh||' /tmp/1/cmdline.txt
|
||||
fi
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
{
|
||||
"filesystem_type": "FAT",
|
||||
"label": "boot",
|
||||
"mkfs_options": "-F 32",
|
||||
"partition_size_nominal": BOOT_NOM,
|
||||
"uncompressed_tarball_size": BOOT_SIZE,
|
||||
"want_maximised": false
|
||||
|
|
|
@ -1,4 +1,27 @@
|
|||
UNRELEASED:
|
||||
* Wolfram Mathematica updated to version 11.0.1
|
||||
* Adobe Flash Player updated to version 25.0.0.127
|
||||
* Use PARTUUID to support USB boot
|
||||
2017-03-02:
|
||||
* Updated kernel and firmware (final Pi Zero W support)
|
||||
* Wolfram Mathematica updated to version 11
|
||||
* NOOBS installs now checks for presence of 'ssh' file on the NOOBS partition.
|
||||
2017-02-16:
|
||||
* Chromium browser updated to version 56
|
||||
* Adobe Flash Player updated to version 24.0.0.221
|
||||
* RealVNC Server and Viewer updated to version 6.0.2 (RealVNC Connect)
|
||||
* Sonic Pi updated to version 2.11
|
||||
* Node-RED updated to version 0.15.3
|
||||
* Scratch updated to version 120117
|
||||
* Detection of SSH enabled with default password moved into PAM
|
||||
* Updated desktop GL driver to support use of fake KMS option
|
||||
* Raspberry Pi Configuration and raspi-config allow setting of fixed HDMI resolution
|
||||
* raspi-config allows enabling of serial hardware independent of serial terminal
|
||||
* Updates to kernel and firmware
|
||||
* Various minor bug fixes and usability and appearance tweaks
|
||||
2017-01-11:
|
||||
* Re-release of the 2016-11-25 image with a FAT32-formatted boot partition
|
||||
2016-11-25:
|
||||
* SSH disabled by default; can be enabled by creating a file with name "ssh" in boot partition
|
||||
* Prompt for password change at boot when SSH enabled with default password unchanged
|
||||
* Adobe Flash Player included
|
||||
|
|
|
@ -9,9 +9,21 @@ cp ${WORK_DIR}/export-image/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img ${STAGE_WOR
|
|||
|
||||
rm -rf ${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}
|
||||
|
||||
LOOP_DEV=`kpartx -asv ${IMG_FILE} | grep -E -o -m1 'loop[[:digit:]]+' | head -n 1`
|
||||
BOOT_DEV=/dev/mapper/${LOOP_DEV}p1
|
||||
ROOT_DEV=/dev/mapper/${LOOP_DEV}p2
|
||||
PARTED_OUT=$(parted -s ${IMG_FILE} unit b print)
|
||||
BOOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^ 1'| xargs echo -n \
|
||||
| cut -d" " -f 2 | tr -d B)
|
||||
BOOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^ 1'| xargs echo -n \
|
||||
| cut -d" " -f 4 | tr -d B)
|
||||
|
||||
ROOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^ 2'| xargs echo -n \
|
||||
| cut -d" " -f 2 | tr -d B)
|
||||
ROOT_LENGTH=$(echo "$PARTED_OUT" | grep -e '^ 2'| xargs echo -n \
|
||||
| cut -d" " -f 4 | tr -d B)
|
||||
|
||||
BOOT_DEV=$(losetup --show -f -o ${BOOT_OFFSET} --sizelimit ${BOOT_LENGTH} ${IMG_FILE})
|
||||
ROOT_DEV=$(losetup --show -f -o ${ROOT_OFFSET} --sizelimit ${ROOT_LENGTH} ${IMG_FILE})
|
||||
echo "/boot: offset $BOOT_OFFSET, length $BOOT_LENGTH"
|
||||
echo "/: offset $ROOT_OFFSET, length $ROOT_LENGTH"
|
||||
|
||||
mkdir -p ${STAGE_WORK_DIR}/rootfs
|
||||
mkdir -p ${NOOBS_DIR}
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
log (){
|
||||
date +"[%T] $@" | tee -a ${LOG_FILE}
|
||||
date +"[%T] $@" | tee -a "${LOG_FILE}"
|
||||
}
|
||||
export -f log
|
||||
|
||||
bootstrap(){
|
||||
local ARCH=$(dpkg --print-architecture)
|
||||
local ARCH
|
||||
ARCH=$(dpkg --print-architecture)
|
||||
|
||||
export http_proxy=${APT_PROXY}
|
||||
|
||||
|
@ -22,12 +23,12 @@ bootstrap(){
|
|||
export -f bootstrap
|
||||
|
||||
copy_previous(){
|
||||
if [ ! -d ${PREV_ROOTFS_DIR} ]; then
|
||||
if [ ! -d "${PREV_ROOTFS_DIR}" ]; then
|
||||
echo "Previous stage rootfs not found"
|
||||
false
|
||||
fi
|
||||
mkdir -p ${ROOTFS_DIR}
|
||||
rsync -aHAXx ${PREV_ROOTFS_DIR}/ ${ROOTFS_DIR}/
|
||||
mkdir -p "${ROOTFS_DIR}"
|
||||
rsync -aHAXx --exclude var/cache/apt/archives "${PREV_ROOTFS_DIR}/" "${ROOTFS_DIR}/"
|
||||
}
|
||||
export -f copy_previous
|
||||
|
||||
|
@ -38,10 +39,11 @@ unmount(){
|
|||
DIR=$1
|
||||
fi
|
||||
|
||||
while mount | grep -q $DIR; do
|
||||
local LOCS=`mount | grep $DIR | cut -f 3 -d ' ' | sort -r`
|
||||
while mount | grep -q "$DIR"; do
|
||||
local LOCS
|
||||
LOCS=$(mount | grep "$DIR" | cut -f 3 -d ' ' | sort -r)
|
||||
for loc in $LOCS; do
|
||||
umount $loc
|
||||
umount "$loc"
|
||||
done
|
||||
done
|
||||
}
|
||||
|
@ -50,42 +52,47 @@ export -f unmount
|
|||
unmount_image(){
|
||||
sync
|
||||
sleep 1
|
||||
local LOOP_DEV=$(losetup -j ${1} | cut -f1 -d':')
|
||||
if [ -n "${LOOP_DEV}" ]; then
|
||||
local MOUNTED_DIR=$(mount | grep $(basename ${LOOP_DEV}) | head -n 1 | cut -f 3 -d ' ')
|
||||
if [ -n "${MOUNTED_DIR}" ]; then
|
||||
unmount $(dirname ${MOUNTED_DIR})
|
||||
local LOOP_DEVICES
|
||||
LOOP_DEVICES=$(losetup -j "${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}")"
|
||||
fi
|
||||
sleep 1
|
||||
losetup -d "${LOOP_DEV}"
|
||||
fi
|
||||
sleep 1
|
||||
kpartx -ds ${LOOP_DEV}
|
||||
losetup -d ${LOOP_DEV}
|
||||
fi
|
||||
done
|
||||
}
|
||||
export -f unmount_image
|
||||
|
||||
on_chroot() {
|
||||
if ! mount | grep -q `realpath ${ROOTFS_DIR}/proc`; then
|
||||
mount -t proc proc ${ROOTFS_DIR}/proc
|
||||
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/proc)"; then
|
||||
mount -t proc proc "${ROOTFS_DIR}/proc"
|
||||
fi
|
||||
|
||||
if ! mount | grep -q `realpath ${ROOTFS_DIR}/dev`; then
|
||||
mount --bind /dev ${ROOTFS_DIR}/dev
|
||||
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/dev)"; then
|
||||
mount --bind /dev "${ROOTFS_DIR}/dev"
|
||||
fi
|
||||
|
||||
if ! mount | grep -q `realpath ${ROOTFS_DIR}/dev/pts`; then
|
||||
mount --bind /dev/pts ${ROOTFS_DIR}/dev/pts
|
||||
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/dev/pts)"; then
|
||||
mount --bind /dev/pts "${ROOTFS_DIR}/dev/pts"
|
||||
fi
|
||||
|
||||
if ! mount | grep -q `realpath ${ROOTFS_DIR}/sys`; then
|
||||
mount --bind /sys ${ROOTFS_DIR}/sys
|
||||
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/sys)"; then
|
||||
mount --bind /sys "${ROOTFS_DIR}/sys"
|
||||
fi
|
||||
|
||||
capsh --drop=cap_setfcap --chroot=${ROOTFS_DIR}/ -- "$@"
|
||||
capsh --drop=cap_setfcap "--chroot=${ROOTFS_DIR}/" -- "$@"
|
||||
}
|
||||
export -f on_chroot
|
||||
|
||||
update_issue() {
|
||||
local GIT_HASH=$(git rev-parse HEAD)
|
||||
echo -e "Raspberry Pi reference ${IMG_DATE}\nGenerated using pi-gen, https://github.com/RPi-Distro/pi-gen, ${GIT_HASH}, ${1}" > ${ROOTFS_DIR}/etc/rpi-issue
|
||||
local GIT_HASH
|
||||
GIT_HASH=$(git rev-parse HEAD)
|
||||
echo -e "Raspberry Pi reference ${IMG_DATE}\nGenerated using pi-gen, https://github.com/RPi-Distro/pi-gen, ${GIT_HASH}, ${1}" > "${ROOTFS_DIR}/etc/rpi-issue"
|
||||
}
|
||||
export -f update_issue
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 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
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# For more options and information see
|
||||
# http://www.raspberrypi.org/documentation/configuration/config-txt.md
|
||||
# http://rpf.io/configtxtreadme
|
||||
# Some settings may impact device functionality. See link above for details
|
||||
|
||||
# uncomment if you get no picture on HDMI for a default "safe" mode
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
proc /proc proc defaults 0 0
|
||||
/dev/mmcblk0p1 /boot vfat defaults 0 2
|
||||
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
|
||||
BOOTDEV /boot vfat defaults 0 2
|
||||
ROOTDEV / ext4 defaults,noatime 0 1
|
||||
|
|
|
@ -6,4 +6,4 @@ Index: jessie-stage1/rootfs/etc/hosts
|
|||
ff02::1 ip6-allnodes
|
||||
ff02::2 ip6-allrouters
|
||||
|
||||
+127.0.1.1 hassbian
|
||||
+127.0.0.1 hassbian
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
# Encoding to use on the console:
|
||||
# Choices: ARMSCII-8, CP1251, CP1255, CP1256, GEORGIAN-ACADEMY, GEORGIAN-PS, IBM1133, ISIRI-3342, ISO-8859-1, ISO-8859-10, ISO-8859-11, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, KOI8-R, KOI8-U, TIS-620, UTF-8, VISCII
|
||||
console-setup console-setup/charmap47 select UTF-8
|
||||
console-setup console-setup/charmap47 select UTF-8
|
||||
# Character set to support:
|
||||
# Choices: . Arabic, # Armenian, # Cyrillic - KOI8-R and KOI8-U, # Cyrillic - non-Slavic languages, # Cyrillic - Slavic languages (also Bosnian and Serbian Latin), . Ethiopic, # Georgian, # Greek, # Hebrew, # Lao, # Latin1 and Latin5 - western Europe and Turkic languages, # Latin2 - central Europe and Romanian, # Latin3 and Latin8 - Chichewa; Esperanto; Irish; Maltese and Welsh, # Latin7 - Lithuanian; Latvian; Maori and Marshallese, . Latin - Vietnamese, # Thai, . Combined - Latin; Slavic Cyrillic; Hebrew; basic Arabic, . Combined - Latin; Slavic Cyrillic; Greek, . Combined - Latin; Slavic and non-Slavic Cyrillic, Guess optimal character set
|
||||
console-setup console-setup/codeset47 select Guess optimal character set
|
||||
# Font for the console:
|
||||
# Choices: Fixed, Goha, GohaClassic, Terminus, TerminusBold, TerminusBoldVGA, VGA, Do not change the boot/kernel font, Let the system select a suitable font
|
||||
console-setup console-setup/fontface47 select Do not change the boot/kernel font
|
||||
# Geographic area:
|
||||
# Choices: Africa, America, Antarctica, Australia, Arctic Ocean, Asia, Atlantic Ocean, Europe, Indian Ocean, Pacific Ocean, System V timezones, US, None of the above
|
||||
tzdata tzdata/Areas select Etc
|
||||
|
|
|
@ -15,3 +15,4 @@ pi-bluetooth
|
|||
apt-listchanges
|
||||
usb-modeswitch
|
||||
apt-transport-https
|
||||
libpam-chksshpwd
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
Index: jessie-stage2/rootfs/etc/default/console-setup
|
||||
===================================================================
|
||||
--- jessie-stage2.orig/rootfs/etc/default/console-setup
|
||||
+++ jessie-stage2/rootfs/etc/default/console-setup
|
||||
@@ -6,9 +6,9 @@ ACTIVE_CONSOLES="/dev/tty[1-6]"
|
||||
|
||||
CHARMAP="UTF-8"
|
||||
|
||||
-CODESET="Lat15"
|
||||
-FONTFACE="Fixed"
|
||||
-FONTSIZE="8x16"
|
||||
+CODESET="guess"
|
||||
+FONTFACE=""
|
||||
+FONTSIZE=""
|
||||
|
||||
VIDEOMODE=
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
--- a/rootfs/boot/cmdline.txt
|
||||
+++ b/rootfs/boot/cmdline.txt
|
||||
@@ -1 +1 @@
|
||||
-dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
|
||||
+dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh
|
||||
-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
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
01-useradd.diff
|
||||
02-swap.diff
|
||||
03-console-setup.diff
|
||||
04-inputrc.diff
|
||||
05-path.diff
|
||||
06-rc_local.diff
|
||||
|
|
|
@ -9,6 +9,7 @@ install -m 644 files/ttyoutput.conf ${ROOTFS_DIR}/etc/systemd/system/rc-local.
|
|||
|
||||
install -m 644 files/50raspi ${ROOTFS_DIR}/etc/apt/apt.conf.d/
|
||||
|
||||
install -m 644 files/console-setup ${ROOTFS_DIR}/etc/default/
|
||||
|
||||
on_chroot << EOF
|
||||
systemctl disable hwclock.sh
|
||||
|
|
16
stage2/01-sys-tweaks/files/console-setup
Normal file
16
stage2/01-sys-tweaks/files/console-setup
Normal file
|
@ -0,0 +1,16 @@
|
|||
# CONFIGURATION FILE FOR SETUPCON
|
||||
|
||||
# Consult the console-setup(5) manual page.
|
||||
|
||||
ACTIVE_CONSOLES="/dev/tty[1-6]"
|
||||
|
||||
CHARMAP="UTF-8"
|
||||
|
||||
CODESET="guess"
|
||||
FONTFACE=""
|
||||
FONTSIZE=""
|
||||
|
||||
VIDEOMODE=
|
||||
|
||||
# The following is an example how to use a braille font
|
||||
# FONT='lat9w-08.psf.gz brl-8x8.psf'
|
|
@ -12,7 +12,7 @@
|
|||
case "$1" in
|
||||
start)
|
||||
log_daemon_msg "Starting resize2fs_once"
|
||||
ROOT_DEV=`grep -Eo 'root=[[:graph:]]+' /proc/cmdline | cut -d '=' -f 2-` &&
|
||||
ROOT_DEV=$(findmnt / -o source -n) &&
|
||||
resize2fs $ROOT_DEV &&
|
||||
update-rc.d resize2fs_once remove &&
|
||||
rm /etc/init.d/resize2fs_once &&
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
on_chroot << EOF
|
||||
apt-get clean
|
||||
EOF
|
|
@ -1 +1 @@
|
|||
git python3 python3-venv python3-pip bluetooth libbluetooth-dev rng-tools htop tmux avahi-daemon
|
||||
git python3 python3-venv python3-pip bluetooth libbluetooth-dev rng-tools rpi-update htop tmux avahi-daemon libtool autoconf
|
||||
|
|
|
@ -6,13 +6,15 @@ useradd -u 1001 -g 1001 -rm homeassistant
|
|||
EOF
|
||||
|
||||
install -v -o 1001 -g 1001 -d ${ROOTFS_DIR}/srv/homeassistant
|
||||
install -m 644 files/home-assistant@homeassistant.service ${ROOTFS_DIR}/etc/systemd/system/
|
||||
install -m 644 files/install_homeassistant.service ${ROOTFS_DIR}/etc/systemd/system/
|
||||
wget -O files//install_homeassistant.sh https://raw.githubusercontent.com/home-assistant/hassbian-scripts/master/install_homeassistant.sh
|
||||
install -m 755 files/install_homeassistant.sh ${ROOTFS_DIR}/usr/local/bin/
|
||||
wget -O files/hassbian-scripts-0.2.deb https://github.com/home-assistant/hassbian-scripts/releases/download/v0.2/hassbian-scripts-0.2.deb
|
||||
install -v -m 600 files/hassbian-scripts-0.2.deb ${ROOTFS_DIR}/srv/homeassistant/
|
||||
|
||||
on_chroot << EOF
|
||||
systemctl enable install_homeassistant.service
|
||||
dpkg -i /srv/homeassistant//hassbian-scripts-0.2.deb
|
||||
EOF
|
||||
|
||||
on_chroot << EOF
|
||||
systemctl enable install_homeassistant
|
||||
EOF
|
||||
|
||||
on_chroot << \EOF
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
# This is a simple service file for systems with systemd to tun HA as user.
|
||||
#
|
||||
# For details please check https://home-assistant.io/getting-started/autostart/
|
||||
#
|
||||
[Unit]
|
||||
Description=Home Assistant for %i
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=%i
|
||||
ExecStart=/srv/homeassistant/bin/hass
|
||||
SendSIGKILL=no
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
# This is a simple service file for systems with systemd to tun HA as user.
|
||||
#
|
||||
# For details please check https://home-assistant.io/getting-started/autostart/
|
||||
#
|
||||
[Unit]
|
||||
Description=Install Home Assistant
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/local/bin/install_homeassistant.sh
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
|
@ -1,41 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
echo "Home Assistant install script for Hassbian"
|
||||
echo "Copyright(c) 2017 Fredrik Lindqvist <https://github.im/Landrash>"
|
||||
|
||||
echo "Changing to homeassistant user"
|
||||
sudo -u homeassistant -H /bin/bash << EOF
|
||||
|
||||
echo "Creating Home Assistant venv"
|
||||
python3 -m venv /srv/homeassistant
|
||||
|
||||
echo "Changing to Home Assistant venv"
|
||||
source /srv/homeassistant/bin/activate
|
||||
|
||||
echo "Install latest version of Home Assistant"
|
||||
pip3 install homeassistant
|
||||
|
||||
echo "Deactivating virtualenv"
|
||||
deactivate
|
||||
|
||||
echo "Downloading HASSbian helper scripts"
|
||||
cd /home/pi
|
||||
git clone https://github.com/home-assistant/hassbian-scripts.git
|
||||
|
||||
EOF
|
||||
|
||||
echo "Enable Home Assistant service"
|
||||
systemctl enable home-assistant@homeassistant.service
|
||||
sync
|
||||
|
||||
echo "Disable and remove Home Assitant install"
|
||||
systemctl disable install_homeassistant
|
||||
rm /etc/systemd/system/install_homeassistant.service
|
||||
rm /usr/local/bin/install_homeassistant.sh
|
||||
systemctl daemon-reload
|
||||
|
||||
echo "Start Home Assistant"
|
||||
systemctl start home-assistant@homeassistant.service
|
||||
|
||||
echo "Installation done. To continue have a look at "
|
||||
echo "If this script failed then this Raspberry Pi most likely did not have a fully functioning internet connection."
|
Loading…
Reference in New Issue
Block a user