Merge remote-tracking branch 'upstream/master' into yunohost-stretch

This commit is contained in:
Alexandre Aubin 2018-04-29 03:40:57 +02:00
commit 9c161f0b35
32 changed files with 256 additions and 231 deletions

View file

@ -87,7 +87,8 @@ The following environment variables are supported:
* `USE_QEMU` (Default: `"0"`)
This enable the Qemu mode and set filesystem and image suffix if set to 1.
Setting to '1' enables the QEMU mode - creating an image that can be mounted via QEMU for an emulated
environment. These images include "-qemu" in the image file name.
A simple example for building Raspbian:
@ -115,7 +116,7 @@ The following process is followed to build images:
There are a number of different files and directories which can be used to
control different parts of the build process:
- **00-run.sh** - A unix shell script. Needs to be made executable for it to run
- **00-run.sh** - A unix shell script. Needs to be made executable for it to run.
- **00-run-chroot.sh** - A unix shell script which will be run in the chroot
of the image build directory. Needs to be made executable for it to run.
@ -127,9 +128,11 @@ The following process is followed to build images:
separated, per line.
- **00-packages-nr** - As 00-packages, except these will be installed using
the ```--no-install-recommends -y``` parameters to apt-get
- **00-patches** - A directory containing patch files to be applied
- **00-patches** - A directory containing patch files to be applied, using quilt.
If a file named 'EDIT' is present in the directory, the build process will
be interrupted with a bash session, allowing an opportunity to create/revise
the patches.
* If the stage directory contains files called "EXPORT_NOOBS" or "EXPORT_IMAGE" then
add this stage to a list of images to generate
@ -156,6 +159,12 @@ continue:
CONTINUE=1 ./build-docker.sh
```
After successful build, the build container is by default removed. This may be undesired when making incremental changes to a customized build. To prevent the build script from remove the container add
```bash
PRESERVE_CONTAINER=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
@ -224,14 +233,14 @@ 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 add an empty file named `SKIP_IMAGES` to `./stage4` (if building up to stage 2) or
to `./stage2` (if building a minimal system).
```bash
# Example for building a lite system
echo "IMG_NAME='Raspbian'" > config
touch ./stage3/SKIP ./stage4/SKIP ./stage5/SKIP
rm stage4/EXPORT* stage5/EXPORT*
touch ./stage4/SKIP_IMAGES ./stage5/SKIP_IMAGES
sudo ./build.sh # or ./build-docker.sh
```

View file

@ -21,6 +21,7 @@ fi
CONTAINER_NAME=${CONTAINER_NAME:-pigen_work}
CONTINUE=${CONTINUE:-0}
PRESERVE_CONTAINER=${PRESERVE_CONTAINER:-0}
if [ "$*" != "" ] || [ -z "${IMG_NAME}" ]; then
if [ -z "${IMG_NAME}" ]; then
@ -33,6 +34,7 @@ Usage:
Optional environment arguments: ( =<default> )
CONTAINER_NAME=pigen_work set a name for the build container
CONTINUE=1 continue from a previously started container
PRESERVE_CONTAINER=1 keep build container even on successful build
EOF
exit 1
fi
@ -55,7 +57,7 @@ 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" \
-e IMG_NAME=${IMG_NAME}\
-e IMG_NAME="${IMG_NAME}"\
pi-gen \
bash -e -o pipefail -c "dpkg-reconfigure qemu-user-static &&
cd /pi-gen; ./build.sh;
@ -64,7 +66,7 @@ if [ "$CONTAINER_EXISTS" != "" ]; then
else
trap "echo 'got CTRL+C... please wait 5s'; $DOCKER stop -t 5 ${CONTAINER_NAME}" SIGINT SIGTERM
time $DOCKER run --name "${CONTAINER_NAME}" --privileged \
-e IMG_NAME=${IMG_NAME}\
-e IMG_NAME="${IMG_NAME}"\
"${config_file[@]}" \
pi-gen \
bash -e -o pipefail -c "dpkg-reconfigure qemu-user-static &&
@ -75,6 +77,10 @@ fi
echo "copying results from deploy/"
$DOCKER cp "${CONTAINER_NAME}":/pi-gen/deploy .
ls -lah deploy
$DOCKER rm -v $CONTAINER_NAME
# cleanup
if [ "$PRESERVE_CONTAINER" != "1" ]; then
$DOCKER rm -v $CONTAINER_NAME
fi
echo "Done! Your image(s) should be in deploy/"

View file

@ -1,22 +1,23 @@
#!/bin/bash -e
# shellcheck disable=SC2119,SC1091
run_sub_stage()
{
log "Begin ${SUB_STAGE_DIR}"
pushd ${SUB_STAGE_DIR} > /dev/null
pushd "${SUB_STAGE_DIR}" > /dev/null
for i in {00..99}; do
if [ -f ${i}-debconf ]; then
if [ -f "${i}-debconf" ]; then
log "Begin ${SUB_STAGE_DIR}/${i}-debconf"
on_chroot << EOF
debconf-set-selections <<SELEOF
`cat ${i}-debconf`
$(cat "${i}-debconf")
SELEOF
EOF
log "End ${SUB_STAGE_DIR}/${i}-debconf"
fi
if [ -f ${i}-packages-nr ]; then
if [ -f "${i}-packages-nr" ]; then
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
on_chroot << EOF
apt-get install --no-install-recommends -y $PACKAGES
@ -24,9 +25,9 @@ EOF
fi
log "End ${SUB_STAGE_DIR}/${i}-packages-nr"
fi
if [ -f ${i}-packages ]; then
if [ -f "${i}-packages" ]; then
log "Begin ${SUB_STAGE_DIR}/${i}-packages"
PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < ${i}-packages)"
PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${i}-packages")"
if [ -n "$PACKAGES" ]; then
on_chroot << EOF
apt-get install -y $PACKAGES
@ -34,18 +35,18 @@ EOF
fi
log "End ${SUB_STAGE_DIR}/${i}-packages"
fi
if [ -d ${i}-patches ]; then
if [ -d "${i}-patches" ]; then
log "Begin ${SUB_STAGE_DIR}/${i}-patches"
pushd ${STAGE_WORK_DIR} > /dev/null
pushd "${STAGE_WORK_DIR}" > /dev/null
if [ "${CLEAN}" = "1" ]; then
rm -rf .pc
rm -rf *-pc
rm -rf ./*-pc
fi
QUILT_PATCHES=${SUB_STAGE_DIR}/${i}-patches
SUB_STAGE_QUILT_PATCH_DIR="$(basename $SUB_STAGE_DIR)-pc"
mkdir -p $SUB_STAGE_QUILT_PATCH_DIR
ln -snf $SUB_STAGE_QUILT_PATCH_DIR .pc
if [ -e ${SUB_STAGE_DIR}/${i}-patches/EDIT ]; then
QUILT_PATCHES="${SUB_STAGE_DIR}/${i}-patches"
SUB_STAGE_QUILT_PATCH_DIR="$(basename "$SUB_STAGE_DIR")-pc"
mkdir -p "$SUB_STAGE_QUILT_PATCH_DIR"
ln -snf "$SUB_STAGE_QUILT_PATCH_DIR" .pc
if [ -e "${SUB_STAGE_DIR}/${i}-patches/EDIT" ]; then
echo "Dropping into bash to edit patches..."
bash
fi
@ -80,20 +81,20 @@ EOF
run_stage(){
log "Begin ${STAGE_DIR}"
STAGE=$(basename ${STAGE_DIR})
pushd ${STAGE_DIR} > /dev/null
unmount ${WORK_DIR}/${STAGE}
STAGE_WORK_DIR=${WORK_DIR}/${STAGE}
ROOTFS_DIR=${STAGE_WORK_DIR}/rootfs
STAGE="$(basename "${STAGE_DIR}")"
pushd "${STAGE_DIR}" > /dev/null
unmount "${WORK_DIR}/${STAGE}"
STAGE_WORK_DIR="${WORK_DIR}/${STAGE}"
ROOTFS_DIR="${STAGE_WORK_DIR}"/rootfs
if [ ! -f SKIP_IMAGES ]; then
if [ -f ${STAGE_DIR}/EXPORT_IMAGE ]; then
if [ -f "${STAGE_DIR}/EXPORT_IMAGE" ]; then
EXPORT_DIRS="${EXPORT_DIRS} ${STAGE_DIR}"
fi
fi
if [ ! -f SKIP ]; then
if [ "${CLEAN}" = "1" ]; then
if [ -d ${ROOTFS_DIR} ]; then
rm -rf ${ROOTFS_DIR}
if [ -d "${ROOTFS_DIR}" ]; then
rm -rf "${ROOTFS_DIR}"
fi
fi
if [ -x prerun.sh ]; then
@ -102,16 +103,16 @@ run_stage(){
log "End ${STAGE_DIR}/prerun.sh"
fi
for SUB_STAGE_DIR in ${STAGE_DIR}/*; do
if [ -d ${SUB_STAGE_DIR} ] &&
[ ! -f ${SUB_STAGE_DIR}/SKIP ]; then
if [ -d "${SUB_STAGE_DIR}" ] &&
[ ! -f "${SUB_STAGE_DIR}/SKIP" ]; then
run_sub_stage
fi
done
fi
unmount ${WORK_DIR}/${STAGE}
PREV_STAGE=${STAGE}
PREV_STAGE_DIR=${STAGE_DIR}
PREV_ROOTFS_DIR=${ROOTFS_DIR}
unmount "${WORK_DIR}/${STAGE}"
PREV_STAGE="${STAGE}"
PREV_STAGE_DIR="${STAGE_DIR}"
PREV_ROOTFS_DIR="${ROOTFS_DIR}"
popd > /dev/null
log "End ${STAGE_DIR}"
}
@ -131,15 +132,17 @@ if [ -z "${IMG_NAME}" ]; then
exit 1
fi
export USE_QEMU=${USE_QEMU:-0}
export IMG_DATE=${IMG_DATE:-"$(date +%Y-%m-%d)"}
export USE_QEMU="${USE_QEMU:-0}"
export IMG_DATE="${IMG_DATE:-"$(date +%Y-%m-%d)"}"
export BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export SCRIPT_DIR="${BASE_DIR}/scripts"
export WORK_DIR=${WORK_DIR:-"${BASE_DIR}/work/${IMG_DATE}-${IMG_NAME}"}
export 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 BASE_DIR
export CLEAN
export IMG_NAME
export APT_PROXY
@ -162,29 +165,33 @@ export QUILT_NO_DIFF_INDEX=1
export QUILT_NO_DIFF_TIMESTAMPS=1
export QUILT_REFRESH_ARGS="-p ab"
source ${SCRIPT_DIR}/common
source ${SCRIPT_DIR}/dependencies_check
# shellcheck source=scripts/common
source "${SCRIPT_DIR}/common"
# shellcheck source=scripts/dependencies_check
source "${SCRIPT_DIR}/dependencies_check"
dependencies_check ${BASE_DIR}/depends
dependencies_check "${BASE_DIR}/depends"
mkdir -p ${WORK_DIR}
mkdir -p "${WORK_DIR}"
log "Begin ${BASE_DIR}"
for STAGE_DIR in ${BASE_DIR}/stage*; do
for STAGE_DIR in "${BASE_DIR}/stage"*; do
run_stage
done
CLEAN=1
for EXPORT_DIR in ${EXPORT_DIRS}; do
STAGE_DIR=${BASE_DIR}/export-image
# shellcheck source=/dev/null
source "${EXPORT_DIR}/EXPORT_IMAGE"
EXPORT_ROOTFS_DIR=${WORK_DIR}/$(basename ${EXPORT_DIR})/rootfs
EXPORT_ROOTFS_DIR=${WORK_DIR}/$(basename "${EXPORT_DIR}")/rootfs
run_stage
if [ "${USE_QEMU}" != "1" ]; then
if [ -e ${EXPORT_DIR}/EXPORT_NOOBS ]; then
source ${EXPORT_DIR}/EXPORT_NOOBS
STAGE_DIR=${BASE_DIR}/export-noobs
if [ -e "${EXPORT_DIR}/EXPORT_NOOBS" ]; then
# shellcheck source=/dev/null
source "${EXPORT_DIR}/EXPORT_NOOBS"
STAGE_DIR="${BASE_DIR}/export-noobs"
run_stage
fi
fi

View file

@ -1,13 +1,5 @@
#!/bin/bash -e
if [ -e ${ROOTFS_DIR}/etc/ld.so.preload ]; then
mv ${ROOTFS_DIR}/etc/ld.so.preload ${ROOTFS_DIR}/etc/ld.so.preload.disabled
fi
if [ ! -e ${ROOTFS_DIR}/usr/sbin/policy-rc.d ]; then
install -m 744 files/policy-rc.d ${ROOTFS_DIR}/usr/sbin/
fi
if [ ! -x ${ROOTFS_DIR}/usr/bin/qemu-arm-static ]; then
cp /usr/bin/qemu-arm-static ${ROOTFS_DIR}/usr/bin/
if [ ! -x "${ROOTFS_DIR}/usr/bin/qemu-arm-static" ]; then
cp /usr/bin/qemu-arm-static "${ROOTFS_DIR}/usr/bin/"
fi

View file

@ -1,3 +0,0 @@
#!/bin/sh
exit 101

View file

@ -1,3 +1,3 @@
#!/bin/bash -e
install -m 644 files/resolv.conf ${ROOTFS_DIR}/etc/
install -m 644 files/resolv.conf "${ROOTFS_DIR}/etc/"

View file

@ -2,12 +2,12 @@
IMG_FILE="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img"
IMGID="$(dd if=${IMG_FILE} skip=440 bs=1 count=4 2>/dev/null | xxd -e | cut -f 2 -d' ')"
IMGID="$(dd if="${IMG_FILE}" skip=440 bs=1 count=4 2>/dev/null | xxd -e | cut -f 2 -d' ')"
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/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
sed -i "s/ROOTDEV/PARTUUID=${ROOT_PARTUUID}/" "${ROOTFS_DIR}/boot/cmdline.txt"

View file

@ -8,80 +8,75 @@ on_chroot << EOF
hardlink -t /usr/share/doc
EOF
if [ -d ${ROOTFS_DIR}/home/pi/.config ]; then
chmod 700 ${ROOTFS_DIR}/home/pi/.config
if [ -d "${ROOTFS_DIR}/home/pi/.config" ]; then
chmod 700 "${ROOTFS_DIR}/home/pi/.config"
fi
rm -f ${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache
rm -f ${ROOTFS_DIR}/usr/sbin/policy-rc.d
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/apt/apt.conf.d/51cache"
rm -f "${ROOTFS_DIR}/usr/bin/qemu-arm-static"
rm -f ${ROOTFS_DIR}/etc/apt/sources.list~
rm -f ${ROOTFS_DIR}/etc/apt/trusted.gpg~
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}/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}"/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}"/usr/share/icons/*/icon-theme.cache
rm -f ${ROOTFS_DIR}/var/lib/dbus/machine-id
rm -f "${ROOTFS_DIR}/var/lib/dbus/machine-id"
true > ${ROOTFS_DIR}/etc/machine-id
true > "${ROOTFS_DIR}/etc/machine-id"
ln -nsf /proc/mounts ${ROOTFS_DIR}/etc/mtab
ln -nsf /proc/mounts "${ROOTFS_DIR}/etc/mtab"
for _FILE in $(find ${ROOTFS_DIR}/var/log/ -type f); do
true > ${_FILE}
done
find "${ROOTFS_DIR}/var/log/" -type f -exec cp /dev/null {} \;
rm -f "${ROOTFS_DIR}/root/.vnc/private.key"
rm -f "${ROOTFS_DIR}/etc/vnc/updateid"
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/
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/"
cp "$ROOTFS_DIR/etc/rpi-issue" "$INFO_FILE"
firmware=$(zgrep "firmware as of" "$ROOTFS_DIR/usr/share/doc/raspberrypi-kernel/changelog.Debian.gz" | \
head -n1 | \
sed -n 's|.* \([^ ]*\)$|\1|p')
printf "\nFirmware: https://github.com/raspberrypi/firmware/tree/%s\n" "$firmware" >> "$INFO_FILE"
{
firmware=$(zgrep "firmware as of" \
"$ROOTFS_DIR/usr/share/doc/raspberrypi-kernel/changelog.Debian.gz" | \
head -n1 | sed -n 's|.* \([^ ]*\)$|\1|p')
printf "\nFirmware: https://github.com/raspberrypi/firmware/tree/%s\n" "$firmware"
kernel=$(curl -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/git_hash")
printf "Kernel: https://github.com/raspberrypi/linux/tree/%s\n" "$kernel" >> "$INFO_FILE"
kernel="$(curl -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/git_hash")"
printf "Kernel: https://github.com/raspberrypi/linux/tree/%s\n" "$kernel"
uname=$(curl -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/uname_string7")
printf "Uname string: %s\n" "$uname" >> "$INFO_FILE"
uname="$(curl -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/uname_string7")"
printf "\nPackages:\n">> "$INFO_FILE"
dpkg -l --root "$ROOTFS_DIR" >> "$INFO_FILE"
printf "Uname string: %s\n" "$uname"
printf "\nPackages:\n"
dpkg -l --root "$ROOTFS_DIR"
} >> "$INFO_FILE"
ROOT_DEV=$(mount | grep "${ROOTFS_DIR} " | cut -f1 -d' ')
ROOT_DEV="$(mount | grep "${ROOTFS_DIR} " | cut -f1 -d' ')"
unmount ${ROOTFS_DIR}
zerofree -v ${ROOT_DEV}
unmount "${ROOTFS_DIR}"
zerofree -v "${ROOT_DEV}"
unmount_image ${IMG_FILE}
unmount_image "${IMG_FILE}"
mkdir -p ${DEPLOY_DIR}
mkdir -p "${DEPLOY_DIR}"
rm -f ${DEPLOY_DIR}/image_${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.zip
rm -f "${DEPLOY_DIR}/image_${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.zip"
pushd ${STAGE_WORK_DIR} > /dev/null
zip ${DEPLOY_DIR}/image_${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.zip $(basename ${IMG_FILE})
pushd "${STAGE_WORK_DIR}" > /dev/null
zip "${DEPLOY_DIR}/image_${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.zip" \
"$(basename "${IMG_FILE}")"
popd > /dev/null
cp "$INFO_FILE" "$DEPLOY_DIR"

View file

@ -2,21 +2,22 @@
IMG_FILE="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img"
unmount_image ${IMG_FILE}
unmount_image "${IMG_FILE}"
rm -f ${IMG_FILE}
rm -f "${IMG_FILE}"
rm -rf ${ROOTFS_DIR}
mkdir -p ${ROOTFS_DIR}
rm -rf "${ROOTFS_DIR}"
mkdir -p "${ROOTFS_DIR}"
BOOT_SIZE=$(du --apparent-size -s ${EXPORT_ROOTFS_DIR}/boot --block-size=1 | cut -f 1)
TOTAL_SIZE=$(du --apparent-size -s ${EXPORT_ROOTFS_DIR} --exclude var/cache/apt/archives --block-size=1 | cut -f 1)
BOOT_SIZE=$(du --apparent-size -s "${EXPORT_ROOTFS_DIR}/boot" --block-size=1 | cut -f 1)
TOTAL_SIZE=$(du --apparent-size -s "${EXPORT_ROOTFS_DIR}" --exclude var/cache/apt/archives --block-size=1 | cut -f 1)
ROUND_SIZE="$((4 * 1024 * 1024))"
IMG_SIZE=$(((BOOT_SIZE + TOTAL_SIZE + (800 * 1024 * 1024) + ROUND_SIZE) / ROUND_SIZE * ROUND_SIZE))
ROUNDED_ROOT_SECTOR=$(((2 * BOOT_SIZE + ROUND_SIZE) / ROUND_SIZE * ROUND_SIZE / 512 + 8192))
IMG_SIZE=$(((BOOT_SIZE + TOTAL_SIZE + (800 * 1024 * 1024) + ROUND_SIZE - 1) / ROUND_SIZE * ROUND_SIZE))
truncate -s ${IMG_SIZE} ${IMG_FILE}
fdisk -H 255 -S 63 ${IMG_FILE} <<EOF
truncate -s "${IMG_SIZE}" "${IMG_FILE}"
fdisk -H 255 -S 63 "${IMG_FILE}" <<EOF
o
n
@ -29,14 +30,14 @@ c
n
8192
${ROUNDED_ROOT_SECTOR}
p
w
EOF
PARTED_OUT=$(parted -s ${IMG_FILE} unit b print)
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 \
@ -47,8 +48,8 @@ ROOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^ 2'| xargs echo -n \
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})
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"
@ -58,11 +59,11 @@ for FEATURE in metadata_csum 64bit; do
ROOT_FEATURES="^$FEATURE,$ROOT_FEATURES"
fi
done
mkdosfs -n boot -F 32 -v $BOOT_DEV > /dev/null
mkfs.ext4 -L rootfs -O $ROOT_FEATURES $ROOT_DEV > /dev/null
mkdosfs -n boot -F 32 -v "$BOOT_DEV" > /dev/null
mkfs.ext4 -L rootfs -O "$ROOT_FEATURES" "$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
mount -v "$ROOT_DEV" "${ROOTFS_DIR}" -t ext4
mkdir -p "${ROOTFS_DIR}/boot"
mount -v "$BOOT_DEV" "${ROOTFS_DIR}/boot" -t vfat
rsync -aHAXx --exclude var/cache/apt/archives ${EXPORT_ROOTFS_DIR}/ ${ROOTFS_DIR}/
rsync -aHAXx --exclude var/cache/apt/archives "${EXPORT_ROOTFS_DIR}/" "${ROOTFS_DIR}/"

View file

@ -2,35 +2,35 @@
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/OS.png ${NOOBS_DIR}/
install -v files/release_notes.txt ${NOOBS_DIR}/
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/OS.png "${NOOBS_DIR}/"
install -v files/release_notes.txt "${NOOBS_DIR}/"
tar -v -c -C files/marketing -f ${NOOBS_DIR}/marketing.tar .
tar -v -c -C files/marketing -f "${NOOBS_DIR}/marketing.tar" .
BOOT_SIZE=$(xz --robot -l ${NOOBS_DIR}/boot.tar.xz | grep totals | cut -f 5)
ROOT_SIZE=$(xz --robot -l ${NOOBS_DIR}/root.tar.xz | grep totals | cut -f 5)
BOOT_SIZE="$(xz --robot -l "${NOOBS_DIR}/boot.tar.xz" | grep totals | cut -f 5)"
ROOT_SIZE="$(xz --robot -l "${NOOBS_DIR}/root.tar.xz" | grep totals | cut -f 5)"
BOOT_SIZE=$(expr ${BOOT_SIZE} / 1000000 \+ 1)
ROOT_SIZE=$(expr ${ROOT_SIZE} / 1000000 \+ 1)
BOOT_SIZE="$(( BOOT_SIZE / 1000000 + 1))"
ROOT_SIZE="$(( ROOT_SIZE / 1000000 + 1))"
BOOT_NOM=$(expr ${BOOT_SIZE} \* 3)
ROOT_NOM=$(expr ${ROOT_SIZE} \+ 400)
BOOT_NOM="$(( BOOT_SIZE * 3 ))"
ROOT_NOM="$(( ROOT_SIZE + 400 ))"
mv "${NOOBS_DIR}/OS.png" "${NOOBS_DIR}/$(echo ${NOOBS_NAME} | sed 's/ /_/g').png"
mv "${NOOBS_DIR}/OS.png" "${NOOBS_DIR}/${NOOBS_NAME// /_}.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_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}/partitions.json" -i -e "s|BOOT_NOM|${BOOT_NOM}|"
sed "${NOOBS_DIR}/partitions.json" -i -e "s|ROOT_NOM|${ROOT_NOM}|"
sed ${NOOBS_DIR}/os.json -i -e "s|UNRELEASED|${IMG_DATE}|"
sed ${NOOBS_DIR}/os.json -i -e "s|NOOBS_NAME|${NOOBS_NAME}|"
sed ${NOOBS_DIR}/os.json -i -e "s|NOOBS_DESCRIPTION|${NOOBS_DESCRIPTION}|"
sed "${NOOBS_DIR}/os.json" -i -e "s|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}|"
sed "${NOOBS_DIR}/release_notes.txt" -i -e "s|UNRELEASED|${IMG_DATE}|"
cp -a ${NOOBS_DIR} ${DEPLOY_DIR}/
cp -a "${NOOBS_DIR}" "${DEPLOY_DIR}/"

View file

@ -1,7 +1,7 @@
{
"description": "NOOBS_DESCRIPTION",
"feature_level": 35120124,
"kernel": "4.9",
"kernel": "4.14",
"name": "NOOBS_NAME",
"password": "raspberry",
"release_date": "UNRELEASED",

View file

@ -1,4 +1,41 @@
UNRELEASED:
* Fixed race between wifi-country.service and raspberrypi-net-mods.service
* Linux kernel 4.14.34+
* Raspberry Pi firmware 5db8e4e1c63178e200d6fbea23ed4a9bf4656658
2018-03-13:
* Raspberry Pi 3 B+ support
* WiFi is disabled until wireless regulatory domain is set (Pi 3 B+ only)
- The domain can be done through 'Raspberry Pi Configuration' (rc_gui),
'raspi-config' or by setting 'country=' to an appropriate ISO 3166
alpha2 country code in /etc/wpa_supplicant/wpa_supplicant.conf.
* Default wireless regulatory domain is now unset
* Added support to desktop for different screen sizes and resolutions,
including multiple preset options in Appearance Settings and pixel doubling
option in Raspberry Pi Configuration
* Version 2.1.16 of Thonny included
* Version 29.0.0.113 of Adobe PepperFlash player included
* Version 1.2.post1 of Pygame Zero included
* Bluetooth plugin now supports connection to Bluetooth LE HID devices
* Network plugin now indicates 5G-compatible APs
* Latest changes to Bluez ALSA service merged
- service now started on CLI boot as well as GUI boot
* Latest changes to dhcpcd networking plugin merged
* Improved support for running on pi-top devices
* Small design changes to PiX theme and icons
* Bug fix - hide spurious window resize handles
* Bug fix - Scratch 2 remote GPIO state block now works correctly
* Updated WiFi Firmware
- brcmfmac43455-sdio 7.45.154
- brcmfmac43430-sdio 7.45.98.38
* New packages:
- policykit-1
- obconf
- python-buttonshim python3-buttonshim
- python-unicornhathd python3-unicornhathd
- python-pantilthat python3-pantilthat
* Linux kernel 4.9.80+
* Raspberry Pi firmware 3347884c7df574bbabeff6dca63caf686e629699
2017-11-29:
* Added battery monitor plugin for taskbar - works on x86 images or first-generation Pi-Top
* Added cutdown mode to PCManFM file manager to reduce complexity
* Added ability to rename files in PCManFM by clicking name when selected

View file

@ -2,14 +2,14 @@
IMG_FILE="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img"
NOOBS_DIR="${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}"
unmount_image ${IMG_FILE}
unmount_image "${IMG_FILE}"
mkdir -p ${STAGE_WORK_DIR}
cp ${WORK_DIR}/export-image/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img ${STAGE_WORK_DIR}/
mkdir -p "${STAGE_WORK_DIR}"
cp "${WORK_DIR}/export-image/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}.img" "${STAGE_WORK_DIR}/"
rm -rf ${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}
rm -rf "${STAGE_WORK_DIR}/${IMG_DATE}-${IMG_NAME}${IMG_SUFFIX}"
PARTED_OUT=$(parted -s ${IMG_FILE} unit b print)
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 \
@ -20,21 +20,21 @@ ROOT_OFFSET=$(echo "$PARTED_OUT" | grep -e '^ 2'| xargs echo -n \
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})
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}
mkdir -p "${STAGE_WORK_DIR}/rootfs"
mkdir -p "${NOOBS_DIR}"
mount $ROOT_DEV ${STAGE_WORK_DIR}/rootfs
mount $BOOT_DEV ${STAGE_WORK_DIR}/rootfs/boot
mount "$ROOT_DEV" "${STAGE_WORK_DIR}/rootfs"
mount "$BOOT_DEV" "${STAGE_WORK_DIR}/rootfs/boot"
ln -sv "/lib/systemd/system/apply_noobs_os_config.service" "$ROOTFS_DIR/etc/systemd/system/multi-user.target.wants/apply_noobs_os_config.service"
bsdtar --numeric-owner --format gnutar --use-compress-program pxz -C ${STAGE_WORK_DIR}/rootfs/boot -cpf ${NOOBS_DIR}/boot.tar.xz .
umount ${STAGE_WORK_DIR}/rootfs/boot
bsdtar --numeric-owner --format gnutar --use-compress-program pxz -C ${STAGE_WORK_DIR}/rootfs --one-file-system -cpf ${NOOBS_DIR}/root.tar.xz .
bsdtar --numeric-owner --format gnutar --use-compress-program pxz -C "${STAGE_WORK_DIR}/rootfs/boot" -cpf "${NOOBS_DIR}/boot.tar.xz" .
umount "${STAGE_WORK_DIR}/rootfs/boot"
bsdtar --numeric-owner --format gnutar --use-compress-program pxz -C "${STAGE_WORK_DIR}/rootfs" --one-file-system -cpf "${NOOBS_DIR}/root.tar.xz" .
unmount_image ${IMG_FILE}
unmount_image "${IMG_FILE}"

View file

View file

@ -1,5 +1,5 @@
log (){
date +"[%T] $@" | tee -a "${LOG_FILE}"
date +"[%T] $*" | tee -a "${LOG_FILE}"
}
export -f log
@ -15,10 +15,10 @@ bootstrap(){
local BOOTSTRAP_CMD=debootstrap
fi
capsh --drop=cap_setfcap -- -c "${BOOTSTRAP_CMD} --components=main,contrib,non-free \
capsh --drop=cap_setfcap -- "${BOOTSTRAP_CMD}" --components=main,contrib,non-free \
--arch armhf \
--keyring "${STAGE_DIR}/files/raspberrypi.gpg" \
$1 $2 $3" || rmdir "$2/debootstrap"
"$1" "$2" "$3" || rmdir "$2/debootstrap"
}
export -f bootstrap

View file

@ -10,11 +10,11 @@ dependencies_check()
for depfile in "$@"; do
if [[ -e "$depfile" ]]; then
deps="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < ${BASE_DIR}/depends)"
deps="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${BASE_DIR}/depends")"
fi
for dep in $deps; do
if ! hash ${dep%:*} 2>/dev/null; then
if ! hash "${dep%:*}" 2>/dev/null; then
missing="${missing:+$missing }${dep#*:}"
fi
done

View file

View file

@ -1,13 +1,13 @@
#!/bin/bash -e
install -m 644 files/sources.list ${ROOTFS_DIR}/etc/apt/
install -m 644 files/raspi.list ${ROOTFS_DIR}/etc/apt/sources.list.d/
install -m 644 files/sources.list "${ROOTFS_DIR}/etc/apt/"
install -m 644 files/raspi.list "${ROOTFS_DIR}/etc/apt/sources.list.d/"
if [ -n "$APT_PROXY" ]; then
install -m 644 files/51cache ${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache
sed ${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache -i -e "s|APT_PROXY|${APT_PROXY}|"
install -m 644 files/51cache "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache"
sed "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache" -i -e "s|APT_PROXY|${APT_PROXY}|"
else
rm -f ${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache
rm -f "${ROOTFS_DIR}/etc/apt/apt.conf.d/51cache"
fi
on_chroot apt-key add - < files/raspberrypi.gpg.key

View file

@ -1,3 +1,3 @@
deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi
deb http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspbian.org/raspbian/ stretch main contrib non-free rpi
#deb-src http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi

View file

@ -1,5 +1,5 @@
#!/bin/bash -e
if [ ! -d ${ROOTFS_DIR} ]; then
bootstrap stretch ${ROOTFS_DIR} http://mirrordirector.raspbian.org/raspbian/
if [ ! -d "${ROOTFS_DIR}" ]; then
bootstrap stretch "${ROOTFS_DIR}" http://raspbian.raspberrypi.org/raspbian/
fi

View file

@ -1,4 +1,4 @@
#!/bin/bash -e
install -m 644 files/cmdline.txt ${ROOTFS_DIR}/boot/
install -m 644 files/config.txt ${ROOTFS_DIR}/boot/
install -m 644 files/cmdline.txt "${ROOTFS_DIR}/boot/"
install -m 644 files/config.txt "${ROOTFS_DIR}/boot/"

View file

@ -1,9 +1,8 @@
#!/bin/bash -e
install -d ${ROOTFS_DIR}/etc/systemd/system/getty@tty1.service.d
install -m 644 files/noclear.conf ${ROOTFS_DIR}/etc/systemd/system/getty@tty1.service.d/noclear.conf
install -m 744 files/policy-rc.d ${ROOTFS_DIR}/usr/sbin/policy-rc.d #TODO: Necessary in systemd?
install -v -m 644 files/fstab ${ROOTFS_DIR}/etc/fstab
install -d "${ROOTFS_DIR}/etc/systemd/system/getty@tty1.service.d"
install -m 644 files/noclear.conf "${ROOTFS_DIR}/etc/systemd/system/getty@tty1.service.d/noclear.conf"
install -v -m 644 files/fstab "${ROOTFS_DIR}/etc/fstab"
on_chroot << EOF
echo "root:root" | chpasswd

View file

@ -1,3 +0,0 @@
#!/bin/sh
exit 101

View file

@ -1,6 +1,6 @@
#!/bin/bash -e
install -m 644 files/ipv6.conf ${ROOTFS_DIR}/etc/modprobe.d/ipv6.conf
install -m 644 files/hostname ${ROOTFS_DIR}/etc/hostname
install -m 644 files/ipv6.conf "${ROOTFS_DIR}/etc/modprobe.d/ipv6.conf"
install -m 644 files/hostname "${ROOTFS_DIR}/etc/hostname"
ln -sf /dev/null ${ROOTFS_DIR}/etc/systemd/network/99-default.link
ln -sf /dev/null "${ROOTFS_DIR}/etc/systemd/network/99-default.link"

View file

@ -1,5 +1,5 @@
#!/bin/bash -e
if [ ! -d ${ROOTFS_DIR} ]; then
if [ ! -d "${ROOTFS_DIR}" ]; then
copy_previous
fi

View file

@ -1,3 +0,0 @@
#!/bin/bash -e
touch ${ROOTFS_DIR}/spindle_install

View file

@ -1,3 +0,0 @@
#!/bin/bash -e
rm -f ${ROOTFS_DIR}/spindle_install

View file

@ -1,15 +1,15 @@
#!/bin/bash -e
install -m 755 files/resize2fs_once ${ROOTFS_DIR}/etc/init.d/
install -m 755 files/resize2fs_once "${ROOTFS_DIR}/etc/init.d/"
install -d ${ROOTFS_DIR}/etc/systemd/system/rc-local.service.d
install -m 644 files/ttyoutput.conf ${ROOTFS_DIR}/etc/systemd/system/rc-local.service.d/
install -d "${ROOTFS_DIR}/etc/systemd/system/rc-local.service.d"
install -m 644 files/ttyoutput.conf "${ROOTFS_DIR}/etc/systemd/system/rc-local.service.d/"
install -m 644 files/50raspi ${ROOTFS_DIR}/etc/apt/apt.conf.d/
install -m 644 files/50raspi "${ROOTFS_DIR}/etc/apt/apt.conf.d/"
install -m 644 files/console-setup ${ROOTFS_DIR}/etc/default/
install -m 644 files/console-setup "${ROOTFS_DIR}/etc/default/"
install -m 755 files/rc.local ${ROOTFS_DIR}/etc/
install -m 755 files/rc.local "${ROOTFS_DIR}/etc/"
on_chroot << EOF
systemctl disable hwclock.sh
@ -21,15 +21,7 @@ EOF
if [ "${USE_QEMU}" = "1" ]; then
echo "enter QEMU mode"
install -m 644 files/90-qemu.rules ${ROOTFS_DIR}/etc/udev/rules.d/
if [ -e ${ROOTFS_DIR}/etc/ld.so.preload.disabled ]; then
rm ${ROOTFS_DIR}/etc/ld.so.preload.disabled
touch ${ROOTFS_DIR}/etc/ld.so.preload.disabled
fi
if [ -e ${ROOTFS_DIR}/etc/ld.so.preload ]; then
rm ${ROOTFS_DIR}/etc/ld.so.preload
touch ${ROOTFS_DIR}/etc/ld.so.preload
fi
install -m 644 files/90-qemu.rules "${ROOTFS_DIR}/etc/udev/rules.d/"
on_chroot << EOF
systemctl disable resize2fs_once
EOF
@ -42,7 +34,7 @@ fi
on_chroot << \EOF
for GRP in input spi i2c gpio; do
groupadd -f -r $GRP
groupadd -f -r "$GRP"
done
EOF
@ -54,7 +46,7 @@ on_chroot << EOF
usermod --pass='*' root
EOF
rm -f ${ROOTFS_DIR}/etc/ssh/ssh_host_*_key*
rm -f "${ROOTFS_DIR}/etc/ssh/"ssh_host_*_key*
# Dirty hack, ... otherwise the build script says in the next step that it cant

View file

@ -1,8 +1,8 @@
#!/bin/bash -e
install -v -d ${ROOTFS_DIR}/etc/systemd/system/dhcpcd.service.d
install -v -m 644 files/wait.conf ${ROOTFS_DIR}/etc/systemd/system/dhcpcd.service.d/
install -v -d "${ROOTFS_DIR}/etc/systemd/system/dhcpcd.service.d"
install -v -m 644 files/wait.conf "${ROOTFS_DIR}/etc/systemd/system/dhcpcd.service.d/"
install -v -d ${ROOTFS_DIR}/etc/wpa_supplicant
install -v -m 600 files/wpa_supplicant.conf ${ROOTFS_DIR}/etc/wpa_supplicant/
install -v -d "${ROOTFS_DIR}/etc/wpa_supplicant"
install -v -m 600 files/wpa_supplicant.conf "${ROOTFS_DIR}/etc/wpa_supplicant/"

View file

@ -1,3 +1,2 @@
country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

View file

@ -1,5 +1,5 @@
#!/bin/bash -e
if [ ! -d ${ROOTFS_DIR} ]; then
if [ ! -d "${ROOTFS_DIR}" ]; then
copy_previous
fi

View file

@ -1,5 +1,5 @@
#!/bin/bash -e
if [ ! -d ${ROOTFS_DIR} ]; then
if [ ! -d "${ROOTFS_DIR}" ]; then
copy_previous
fi