initial version
This commit is contained in:
commit
45bcaa9172
27
Dockerfile
Normal file
27
Dockerfile
Normal file
@ -0,0 +1,27 @@
|
||||
FROM alpine:3.10
|
||||
|
||||
RUN apk update && \
|
||||
apk add automake build-base git autoconf confuse-dev linux-headers \
|
||||
findutils mtools e2fsprogs-extra alpine-sdk dosfstools && \
|
||||
rm -rf /var/cache/apk/*
|
||||
|
||||
RUN git clone https://github.com/pengutronix/genimage.git /tmp/genimage && \
|
||||
cd /tmp/genimage && \
|
||||
./autogen.sh && \
|
||||
./configure CFLAGS='-g -O0' --prefix=/usr && \
|
||||
make install && \
|
||||
cd && \
|
||||
rm -rf /tmp/genimage
|
||||
|
||||
|
||||
ADD ./resources/genext2fs /genext2fs
|
||||
|
||||
RUN cd /genext2fs && \
|
||||
abuild-keygen -a -i -q && \
|
||||
abuild -F -P /tmp/pkg && \
|
||||
apk add /tmp/pkg/x86_64/genext2fs-1*.apk && \
|
||||
rm -rf /tmp/pkg/
|
||||
|
||||
ADD ./resources /resources
|
||||
|
||||
WORKDIR /work
|
283
resources/build.sh
Executable file
283
resources/build.sh
Executable file
@ -0,0 +1,283 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
# User config
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
: ${ALPINE_BRANCH:="3.10"}
|
||||
: ${ALPINE_MIRROR:="http://dl-cdn.alpinelinux.org/alpine"}
|
||||
|
||||
: ${TIME_ZONE:="Etc/UTC"}
|
||||
: ${HOST_NAME:="alpine"}
|
||||
: ${ROOT_PASSWORD:="alpine"}
|
||||
: ${IMG_NAME:="alpine-${ALPINE_BRANCH}-sdcard.img"}
|
||||
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
# static config
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
RES_PATH=/resources/
|
||||
BASE_PACKAGES="alpine-base tzdata parted ifupdown e2fsprogs-extra util-linux coreutils linux-rpi2"
|
||||
|
||||
WORK_PATH="/work"
|
||||
OUTPUT_PATH="/output"
|
||||
ROOTFS_PATH="${WORK_PATH}/root_fs"
|
||||
BOOTFS_PATH="${WORK_PATH}/boot_fs"
|
||||
DATAFS_PATH="${WORK_PATH}/data_fs"
|
||||
IMAGE_PATH="${WORK_PATH}/img"
|
||||
|
||||
|
||||
# ensure work directory is clean
|
||||
rm -rf ${WORK_PATH}/*
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
# functions
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
|
||||
chroot_exec() {
|
||||
chroot "${ROOTFS_PATH}" "$@" 1>&2
|
||||
}
|
||||
|
||||
make_image() {
|
||||
[ -d /tmp/genimage ] && rm -rf /tmp/genimage
|
||||
genimage --rootpath $1 \
|
||||
--tmppath /tmp/genimage \
|
||||
--inputpath ${IMAGE_PATH} \
|
||||
--outputpath ${IMAGE_PATH} \
|
||||
--config $2
|
||||
}
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
# create root FS
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
|
||||
echo ">> Prepare root FS"
|
||||
|
||||
# update local repositories to destination ones to ensure the right packages where installed
|
||||
cat >/etc/apk/repositories <<EOF
|
||||
${ALPINE_MIRROR}/v${ALPINE_BRANCH}/main
|
||||
${ALPINE_MIRROR}/v${ALPINE_BRANCH}/community
|
||||
EOF
|
||||
|
||||
# copy apk keys to new root (required for initial apk add run)
|
||||
mkdir -p ${ROOTFS_PATH}/etc/apk/keys/
|
||||
cp /usr/share/apk/keys/*.rsa.pub ${ROOTFS_PATH}/etc/apk/keys/
|
||||
|
||||
# copy repositories to new root
|
||||
cp /etc/apk/repositories ${ROOTFS_PATH}/etc/apk/repositories
|
||||
|
||||
# initial package installation
|
||||
apk --root ${ROOTFS_PATH} --update-cache --initdb --arch armhf add $BASE_PACKAGES
|
||||
|
||||
# add google DNS to enable network access inside chroot
|
||||
echo "nameserver 8.8.8.8" > ${ROOTFS_PATH}/etc/resolv.conf
|
||||
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
echo ">> Configure root FS"
|
||||
|
||||
# set root password
|
||||
chroot_exec passwd << EOF
|
||||
${ROOT_PASSWORD}
|
||||
${ROOT_PASSWORD}
|
||||
EOF
|
||||
|
||||
# Set time zone
|
||||
echo "${TIME_ZONE}" > ${ROOTFS_PATH}/etc/timezone
|
||||
chroot_exec ln -fs /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
|
||||
|
||||
# Set host name
|
||||
chroot_exec rc-update add hostname default
|
||||
cat >${ROOTFS_PATH}/etc/hosts <<EOF
|
||||
127.0.0.1 localhost ${HOST_NAME}
|
||||
::1 localhost ${HOST_NAME}
|
||||
EOF
|
||||
cat >${ROOTFS_PATH}/etc/hostname <<EOF
|
||||
${HOST_NAME}
|
||||
EOF
|
||||
|
||||
# enable local startup files (stored in /etc/local.d/)
|
||||
chroot_exec rc-update add local default
|
||||
cat >${ROOTFS_PATH}/etc/conf.d/local <<EOF
|
||||
rc_verbose=yes
|
||||
EOF
|
||||
|
||||
# prepare network
|
||||
chroot_exec rc-update add networking default
|
||||
cat >${ROOTFS_PATH}/etc/network/interfaces <<EOF
|
||||
# interfaces(5) file used by ifup(8) and ifdown(8)
|
||||
# Include files from /etc/network/interfaces.d:
|
||||
source-directory /etc/network/interfaces.d
|
||||
|
||||
auto lo
|
||||
iface lo inet loopback
|
||||
|
||||
auto eth0
|
||||
iface eth0 inet dhcp
|
||||
EOF
|
||||
|
||||
# networking should not wait for local -> local brings up the interface
|
||||
sed -i '/^\tneed/ s/$/ local/' ${ROOTFS_PATH}/etc/init.d/networking
|
||||
|
||||
# bring up eth0 on startup
|
||||
cat >${ROOTFS_PATH}/etc/local.d/11-up_eth0.start <<EOF
|
||||
#!/bin/sh
|
||||
ifconfig eth0 up
|
||||
EOF
|
||||
chmod +x ${ROOTFS_PATH}/etc/local.d/11-up_eth0.start
|
||||
|
||||
# make root file system writeable
|
||||
cat >${ROOTFS_PATH}/etc/local.d/10-remount_root.start <<EOF
|
||||
#!/bin/sh
|
||||
mount -o remount,rw /
|
||||
EOF
|
||||
chmod +x ${ROOTFS_PATH}/etc/local.d/10-remount_root.start
|
||||
|
||||
# add script to resize data partition
|
||||
cp ${RES_PATH}/resizedata.sh ${ROOTFS_PATH}/etc/local.d/90-resizedata.start
|
||||
chmod +x ${ROOTFS_PATH}/etc/local.d/90-resizedata.start
|
||||
|
||||
# mount data and boot partition (root is already mounted)
|
||||
cat >${ROOTFS_PATH}/etc/fstab <<EOF
|
||||
/dev/mmcblk0p1 /boot vfat defaults,ro 0 2
|
||||
/dev/mmcblk0p3 /data ext4 defaults 0 1
|
||||
EOF
|
||||
|
||||
# custom
|
||||
chroot_exec apk add dropbear
|
||||
chroot_exec rc-update add dropbear
|
||||
|
||||
|
||||
rm -rf ${ROOTFS_PATH}/var/cache/apk/*
|
||||
|
||||
# TODO /etc/motd
|
||||
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
# create boot FS
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
|
||||
echo ">> Configure boot FS"
|
||||
|
||||
# download base firmware
|
||||
mkdir -p ${BOOTFS_PATH}
|
||||
wget -P ${BOOTFS_PATH} https://github.com/raspberrypi/firmware/raw/master/boot/bootcode.bin
|
||||
wget -P ${BOOTFS_PATH} https://github.com/raspberrypi/firmware/raw/master/boot/fixup.dat
|
||||
wget -P ${BOOTFS_PATH} https://github.com/raspberrypi/firmware/raw/master/boot/fixup_cd.dat
|
||||
wget -P ${BOOTFS_PATH} https://github.com/raspberrypi/firmware/raw/master/boot/fixup_x.dat
|
||||
wget -P ${BOOTFS_PATH} https://github.com/raspberrypi/firmware/raw/master/boot/start.elf
|
||||
wget -P ${BOOTFS_PATH} https://github.com/raspberrypi/firmware/raw/master/boot/start_cd.elf
|
||||
wget -P ${BOOTFS_PATH} https://github.com/raspberrypi/firmware/raw/master/boot/start_x.elf
|
||||
|
||||
# copy linux kernel and overlays
|
||||
cp ${ROOTFS_PATH}/usr/lib/linux-*-rpi2/*.dtb ${BOOTFS_PATH}/
|
||||
cp -r ${ROOTFS_PATH}/usr/lib/linux-*-rpi2/overlays ${BOOTFS_PATH}/
|
||||
cp ${ROOTFS_PATH}/boot/initramfs-rpi2 ${BOOTFS_PATH}/
|
||||
cp ${ROOTFS_PATH}/boot/vmlinuz-rpi2 ${BOOTFS_PATH}/
|
||||
|
||||
# write boot config
|
||||
cat >${BOOTFS_PATH}/config.txt <<EOF
|
||||
disable_splash=1
|
||||
boot_delay=0
|
||||
|
||||
gpu_mem=256
|
||||
gpu_mem_256=64
|
||||
|
||||
hdmi_drive=1
|
||||
hdmi_group=2
|
||||
hdmi_mode=1
|
||||
hdmi_mode=87
|
||||
hdmi_cvt 800 480 60 6 0 0 0
|
||||
|
||||
[pi2]
|
||||
kernel=vmlinuz-rpi2
|
||||
initramfs initramfs-rpi2
|
||||
|
||||
[pi3]
|
||||
kernel=vmlinuz-rpi2
|
||||
initramfs initramfs-rpi2
|
||||
|
||||
[all]
|
||||
include usercfg.txt
|
||||
|
||||
EOF
|
||||
|
||||
cat >${BOOTFS_PATH}/cmdline.txt <<EOF
|
||||
console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 fsck.repair=yes rw rootwait quiet
|
||||
|
||||
EOF
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
# create data FS
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
|
||||
echo ">> Configure data FS"
|
||||
mkdir -p ${DATAFS_PATH}
|
||||
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
# create image
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
|
||||
echo ">> Create SD card image"
|
||||
|
||||
# boot partition
|
||||
cat >${WORK_PATH}/genimage_boot.cfg <<EOF
|
||||
image boot.vfat {
|
||||
name = "boot"
|
||||
vfat {
|
||||
}
|
||||
size = 32M
|
||||
}
|
||||
EOF
|
||||
make_image ${BOOTFS_PATH} ${WORK_PATH}/genimage_boot.cfg
|
||||
|
||||
# root partition
|
||||
cat >${WORK_PATH}/genimage_root.cfg <<EOF
|
||||
image rootfs.ext4 {
|
||||
name = "root"
|
||||
ext4 {
|
||||
}
|
||||
size = 150MB
|
||||
}
|
||||
EOF
|
||||
make_image ${ROOTFS_PATH} ${WORK_PATH}/genimage_root.cfg
|
||||
|
||||
# data partition
|
||||
cat >${WORK_PATH}/genimage_data.cfg <<EOF
|
||||
image datafs.ext4 {
|
||||
name = "data"
|
||||
ext4 {
|
||||
}
|
||||
size = 20MB
|
||||
}
|
||||
EOF
|
||||
make_image ${DATAFS_PATH} ${WORK_PATH}/genimage_data.cfg
|
||||
|
||||
# sd card image
|
||||
cat >${WORK_PATH}/genimage_sdcard.cfg <<EOF
|
||||
image sdcard.img {
|
||||
hdimage {
|
||||
}
|
||||
|
||||
partition boot {
|
||||
partition-type = 0xC
|
||||
bootable = "true"
|
||||
image = "boot.vfat"
|
||||
}
|
||||
|
||||
partition rootfs {
|
||||
partition-type = 0x83
|
||||
image = "rootfs.ext4"
|
||||
}
|
||||
|
||||
partition datafs {
|
||||
partition-type = 0x83
|
||||
image = "datafs.ext4"
|
||||
}
|
||||
}
|
||||
EOF
|
||||
make_image ${IMAGE_PATH} ${WORK_PATH}/genimage_sdcard.cfg
|
||||
|
||||
# copy final image
|
||||
cp ${IMAGE_PATH}/sdcard.img ${OUTPUT_PATH}/${IMG_NAME}
|
44
resources/genext2fs/APKBUILD
Normal file
44
resources/genext2fs/APKBUILD
Normal file
@ -0,0 +1,44 @@
|
||||
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
|
||||
pkgname=genext2fs
|
||||
pkgver=1.4.1
|
||||
pkgrel=0
|
||||
pkgdesc="Tool for generating an ext2 filesystem as non-root"
|
||||
url="http://genext2fs.sourceforge.net/"
|
||||
arch="all"
|
||||
license="GPLv2"
|
||||
depends=""
|
||||
depends_dev=""
|
||||
makedepends="$depends_dev"
|
||||
install=""
|
||||
subpackages="$pkgname-doc"
|
||||
source="http://downloads.sourceforge.net/project/genext2fs/genext2fs/$pkgver/genext2fs-$pkgver.tar.gz"
|
||||
_builddir="$srcdir"/genext2fs-$pkgver
|
||||
prepare() {
|
||||
local i
|
||||
cd "$_builddir"
|
||||
for i in $source; do
|
||||
case $i in
|
||||
*.patch) msg $i; patch -p1 -i "$srcdir"/$i || return 1;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
build() {
|
||||
cd "$_builddir"
|
||||
./configure \
|
||||
--build=$CBUILD \
|
||||
--host=$CHOST \
|
||||
--prefix=/usr \
|
||||
--sysconfdir=/etc \
|
||||
--mandir=/usr/share/man \
|
||||
--infodir=/usr/share/info \
|
||||
--localstatedir=/var \
|
||||
|| return 1
|
||||
make || return 1
|
||||
}
|
||||
package() {
|
||||
cd "$_builddir"
|
||||
make DESTDIR="$pkgdir" install || return 1
|
||||
}
|
||||
md5sums="b7b6361bcce2cedff1ae437fadafe53b genext2fs-1.4.1.tar.gz"
|
||||
sha256sums="404dbbfa7a86a6c3de8225c8da254d026b17fd288e05cec4df2cc7e1f4feecfc genext2fs-1.4.1.tar.gz"
|
||||
sha512sums="1b9ec7044014423345ae6b09862ba6903f5b3e0f68fb8bbcf97daf2705471cc1633a9fdbc5e00afe1b191e1af7bed87bde2e538bc7365469218f2a00b062845c genext2fs-1.4.1.tar.gz"
|
63
resources/resizedata.sh
Executable file
63
resources/resizedata.sh
Executable file
@ -0,0 +1,63 @@
|
||||
#!/bin/sh -e
|
||||
logger -t "rc.resizedata" "Expanding root partition"
|
||||
|
||||
# Detect root partition device
|
||||
ROOT_PART=$(mount | sed -n 's|^/dev/\(.*\) on / .*|\1|p')
|
||||
if [ -z "$ROOT_PART" ] ; then
|
||||
log_warning_msg "unable to detect root partition device"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Extract root device name
|
||||
case "${ROOT_PART}" in
|
||||
mmcblk0*) ROOT_DEV=mmcblk0 ;;
|
||||
sda*) ROOT_DEV=sda ;;
|
||||
esac
|
||||
|
||||
# get last partition
|
||||
LAST_PART_NUM=$(parted /dev/${ROOT_DEV} -ms unit s p | tail -n 1 | cut -f 1 -d:)
|
||||
LAST_PART="${ROOT_DEV}p${LAST_PART_NUM}"
|
||||
|
||||
|
||||
# unmount if mounted
|
||||
if grep -qs "/dev/${LAST_PART}" /proc/mounts; then
|
||||
umount /dev/${LAST_PART}
|
||||
fi
|
||||
|
||||
# Get the starting offset of last partition
|
||||
PART_START=$(parted /dev/${ROOT_DEV} -ms unit s p | grep "^${LAST_PART_NUM}" | cut -f 2 -d: | sed 's/[^0-9]//g')
|
||||
if [ -z "$PART_START" ] ; then
|
||||
logger -t "rc.resizedata" "${ROOT_DEV} unable to get starting sector of the partition"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Get the possible last sector for the root partition
|
||||
PART_LAST=$(fdisk -l /dev/${ROOT_DEV} | grep '^Disk.*sectors' | awk '{ print $7 - 1 }')
|
||||
if [ -z "$PART_LAST" ] ; then
|
||||
logger -t "rc.resizedata" "${ROOT_DEV} unable to get last sector of the partition"
|
||||
return 1
|
||||
fi
|
||||
|
||||
### Since rc.local is run with "sh -e", let's add "|| true" to prevent premature exit
|
||||
echo "resize partition"
|
||||
fdisk /dev/${ROOT_DEV} > /dev/null <<EOF2 || true
|
||||
p
|
||||
d
|
||||
$LAST_PART_NUM
|
||||
n
|
||||
p
|
||||
$LAST_PART_NUM
|
||||
$PART_START
|
||||
$PART_LAST
|
||||
p
|
||||
w
|
||||
EOF2
|
||||
|
||||
# Reload the partition table, resize root filesystem then remove resizing code from this file
|
||||
partprobe /dev/${ROOT_DEV} &&
|
||||
resize2fs -p /dev/${LAST_PART} &&
|
||||
logger -t "rc.resizedata" "Root partition successfully resized."
|
||||
|
||||
mount -a
|
||||
|
||||
rm -f /etc/local.d/90-resizedata.start
|
Loading…
Reference in New Issue
Block a user