962 lines
24 KiB
Bash
962 lines
24 KiB
Bash
#!/bin/bash
|
|
|
|
# Copyright (C) 2017-2018 Daniel Tartavel-jeannot <contact@librepc.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
function title()
|
|
{
|
|
echo -e "\e[1;32m$1\e[0m"
|
|
}
|
|
|
|
function info()
|
|
{
|
|
echo -e "\e[36m$1\e[0m"
|
|
}
|
|
|
|
function warning()
|
|
{
|
|
echo -e "\e[1;35m$1\e[0m"
|
|
}
|
|
|
|
function error()
|
|
{
|
|
echo -e "\e[1;31m$1\e[0m"
|
|
}
|
|
|
|
info $0
|
|
|
|
SOURCE_PATH="$(/bin/dirname "$(readlink -f "$0")")"
|
|
INSTALL_PATH="$SOURCE_PATH/arm"
|
|
FILES_PATH="$SOURCE_PATH/files"
|
|
PLATFORMS_PATH="$SOURCE_PATH/platforms"
|
|
|
|
CMDNAME=$(/bin/basename "$0")
|
|
|
|
#while read -r;do
|
|
# for MAGEIA_VERSION in $REPLY
|
|
# do
|
|
# if [ $MAGEIA_VERSION <= 5 ];then
|
|
# echo 'Mageia version >= 6 is needed'
|
|
# exit
|
|
# fi
|
|
# break
|
|
# done
|
|
#done < /etc/version
|
|
|
|
|
|
|
|
function help()
|
|
{
|
|
echo "$CMDNAME [option] [size of image in Go]"
|
|
echo "Options:"
|
|
echo "--all create ready to burn image of Mageia $MAGEIA_VERSION"
|
|
echo "--clean Clean all (suppress all) to make a new image"
|
|
echo "--size size of image default: 7Go"
|
|
echo "--build-path Path to the build directory of the image of Mageia $MAGEIA_VERSION"
|
|
echo "--target target system (for now rpi, odroid)"
|
|
echo "--target-version version of the target (0, 1, 2, 3 for rpi, 3 or 4 for odroid)"
|
|
echo "--config Path to config files"
|
|
echo "--bootfs filesystem of boot partition (ext4 or vfat) default: ext4"
|
|
echo "--nonfree activate nonfree repos"
|
|
echo "--tainted activate tainted repos"
|
|
echo "\nBuild levels:"
|
|
echo "--create-chroot Create the chroot directory"
|
|
echo "--addmedia add mirrors"
|
|
echo "--update-mirror update urpmi database"
|
|
echo "--install-basesystem install base system"
|
|
echo "--chroot chroot to arm directory and launch packages installation"
|
|
echo "--create-image Create the image of Mageia $MAGEIA_VERSION"
|
|
|
|
echo -e "\nFor image size, make sure it fit on physical support. (Default size is 7 Go)"
|
|
}
|
|
|
|
|
|
# cleaning build space
|
|
function clean()
|
|
{
|
|
# Unmounting /dev /proc /sys in chroot
|
|
title "Cleaning"
|
|
if ! [ -z "$(mountpoint -qd "$BUILD_PATH/dev")" ];then
|
|
info "Unmounting $BUILD_PATH/dev"
|
|
umount "$BUILD_PATH/dev"
|
|
if ! [ $? -ne 0 ];then
|
|
error "line $LINENO can't unmount $BUILD_PATH/dev : exiting"
|
|
#exit 1
|
|
fi
|
|
fi
|
|
if ! [ -z "$(mountpoint -qd "$BUILD_PATH/sys")" ];then
|
|
info "Unmounting $BUILD_PATH/sys"
|
|
umount "$BUILD_PATH/sys"
|
|
if ! [ $? -ne 0 ];then
|
|
error "line $LINENO can't unmount $BUILD_PATH/sys : exiting"
|
|
#exit 1
|
|
fi
|
|
fi
|
|
if ! [ -z "$(mountpoint -qd "$BUILD_PATH/proc")" ];then
|
|
info "Unmounting $BUILD_PATH/proc"
|
|
umount "$BUILD_PATH/proc"
|
|
if ! [ $? -ne 0 ];then
|
|
error "line $LINENO can't unmount $BUILD_PATH/proc : exiting"
|
|
#exit 1
|
|
fi
|
|
fi
|
|
# Removing old Build directory
|
|
if [ -d "$BUILD_PATH" ];then
|
|
info "Removing $BUILD_PATH"
|
|
/bin/rm -Rf "$BUILD_PATH"
|
|
else
|
|
warning "$BUILD_PATH does not exists"
|
|
fi
|
|
# removing old image
|
|
if [ -e "$IMAGE" ];then
|
|
info "Removing $IMAGE"
|
|
/bin/rm -f "$INSTALL_PATH/$IMAGE"
|
|
else
|
|
warning "$IMAGE does not exists"
|
|
fi
|
|
# removing loop devices
|
|
for LOOP in $(ls /dev/loop*[0-9]p1)
|
|
do
|
|
X=${LOOP:0:10}
|
|
if [ -e "$X" ];then
|
|
info "removing $X"
|
|
partx -d "$X"
|
|
fi
|
|
done
|
|
# Removing boot and root directory
|
|
if [ -d "$BOOT" ];then
|
|
info "Removing $BOOT"
|
|
/bin/rmdir "$BOOT"
|
|
else
|
|
warning "$BOOT does not exists"
|
|
fi
|
|
if [ -d "$ROOT" ];then
|
|
info "Removing $ROOT"
|
|
/bin/rmdir "$ROOT"
|
|
else
|
|
warning "$ROOT does not exists"
|
|
fi
|
|
exit 0
|
|
}
|
|
|
|
# creation of install path and copy of qemu ( installing it if not yet installed )
|
|
|
|
function createchroot()
|
|
{
|
|
title "Making chroot"
|
|
if ! [ -f /bin/qemu-arm-static ]; then
|
|
title "Qemu package not present : installing qemu packages"
|
|
/sbin/urpmi --auto --no-recommends qemu-user-static
|
|
if ! [ $? -eq 0 ];then
|
|
error "line $LINENO can't install qemu-user-static : exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
# Starting qemu service if not started
|
|
/bin/systemctl is-active systemd-binfmt.service
|
|
if [ $? -ne 0 ]; then
|
|
title "Starting systemd-binfmt.service"
|
|
/bin/systemctl start systemd-binfmt.service
|
|
if ! [ $? -ne 0 ];then
|
|
error "line $LINENO can't start qemu-user-static : exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
# adding Mageia repositories
|
|
function addmedia()
|
|
{
|
|
title "Creating media $MIRROR"
|
|
/sbin/urpmi.addmedia --urpmi-root "$BUILD_PATH" --distrib "$MIRROR"
|
|
err=$?
|
|
if [ $err -ne 0 ];then
|
|
error "line $LINENO error $err - can't add medias from $MIRROR : exiting"
|
|
exit 1
|
|
fi
|
|
if [ $NONFREE -eq 1 ];then
|
|
title "activating non-free repos"
|
|
/sbin/urpmi.update --urpmi-root "$BUILD_PATH" --no-ignore Nonfree\ Release Nonfree\ Updates
|
|
err=$?
|
|
if [ $err -ne 0 ];then
|
|
error "line $LINENO error $err - can't activate medias nonfree : exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
if [ $TAINTED -eq 1 ];then
|
|
title "activating tainted repos"
|
|
/sbin/urpmi.update --urpmi-root "$BUILD_PATH" --no-ignore Tainted\ Release Tainted\ Updates
|
|
err=$?
|
|
if [ $err -ne 0 ];then
|
|
error "line $LINENO error $err - can't activate medias tainted : exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
function updatemirror()
|
|
{
|
|
title "updating mirror"
|
|
/sbin/urpmi.update -a --urpmi-root "$BUILD_PATH"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO can't update mirrors : exiting"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function installbasesystem()
|
|
{
|
|
|
|
# Create Build path
|
|
if ! [ -d "$BUILD_PATH" ];then
|
|
warning "Build path ( $BUILD_PATH ) does not exists, do you want i create it ? [Y|n] "
|
|
read yn
|
|
if [ -z $yn ] || [ $yn = "Y" ] || [ $yn = "y" ];then
|
|
title "Creating $BUILD_PATH"
|
|
/bin/mkdir -p "$BUILD_PATH/usr/bin" "$BUILD_PATH/usr/lib/binfmt.d"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO can't create $BUILD_PATH : exiting"
|
|
exit 1
|
|
fi
|
|
else
|
|
exit 1
|
|
fi
|
|
else
|
|
info "Build path exists"
|
|
fi
|
|
|
|
title "installing basesystem"
|
|
/sbin/urpmi --urpmi-root "$BUILD_PATH" --ignorearch --no-verify-rpm --auto --split-level 200 --split-length 200 shadow-utils basesystem-minimal
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error installing shadow-utils or basesystem-minimal : exiting"
|
|
exit 1
|
|
fi
|
|
#/sbin/urpmi --urpmi-root "$BUILD_PATH" --ignorearch --no-verify-rpm --auto --split-level 200 --split-length 200 basesystem-minimal
|
|
#if [ $? -ne 0 ];then
|
|
# error "line $LINENO error installing basesystem-minimal : exiting"
|
|
# exit 1
|
|
#fi
|
|
/sbin/urpmi --urpmi-root "$BUILD_PATH" --ignorearch --no-verify-rpm --auto --split-level 200 --split-length 200 urpmi locales-fr systemd u-boot
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error installing urpmi or locales.fr : exiting"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function preparechroot()
|
|
{
|
|
title "Preparing chrooting in $BUILD_PATH"
|
|
|
|
#Copying qemu
|
|
|
|
/bin/cp /bin/qemu-arm-static "$BUILD_PATH/usr/bin/"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO can't copy /bin/qemu-user-static to $BUILD_PATH/usr/bin/ : exiting"
|
|
exit 1
|
|
fi
|
|
/bin/cp /usr/lib/binfmt.d/qemu-arm-static.conf "$BUILD_PATH/usr/lib/binfmt.d"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO can't copy /usr/lib/binfmt.d/qemu-arm-static.conf to $BUILD_PATH/usr/lib/binfmt.d : exiting"
|
|
exit 1
|
|
fi
|
|
|
|
|
|
info "making /etc/hostname"
|
|
echo "$HOSTNAME" > "$BUILD_PATH/etc/hostname"
|
|
|
|
info "copying second stage script in $BUILD_PATH"
|
|
echo "/bin/cp $CONFIG_PATH/second_stage_install.sh $BUILD_PATH/"
|
|
cp --preserve=mode "$CONFIG_PATH/second_stage_install.sh" "$BUILD_PATH/second_stage_install.sh"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error copying $CONFIG_PATH/second_stage_install.sh : exiting"
|
|
exit 1
|
|
fi
|
|
|
|
info "creation of user account"
|
|
echo "/bin/passwd << EOF
|
|
$ROOT_PWD
|
|
$ROOT_PWD
|
|
EOF
|
|
/sbin/useradd $ID_USER
|
|
/bin/passwd $ID_USER << EOF
|
|
$PASSWORD
|
|
$PASSWORD
|
|
EOF" >>"$BUILD_PATH/second_stage_install.sh"
|
|
|
|
|
|
|
|
info "Copying skel in root directory"
|
|
/bin/rsync -rlptH /etc/skel/ "$BUILD_PATH/root/"
|
|
|
|
|
|
case $TARGET in
|
|
odroid)
|
|
#TEMPORARY CODE
|
|
#copying kernel odroid not existing in mageia repos
|
|
info "copying kernel-odroid and u-boot rpms in $BUILD_PATH/root"
|
|
echo "/bin/cp $CONFIG_PATH/kernel-odroid-4.14.y-1.armv7hl.rpm $BUILD_PATH/root/"
|
|
/usr/bin/cp --preserve=mode "$CONFIG_PATH/kernel-odroid-4.14.y-1.armv7hl.rpm" "$BUILD_PATH/root/"
|
|
echo "/bin/cp $CONFIG_PATH/u-boot-20180507-3.mga7.armv7hl.rpm $BUILD_PATH/root/"
|
|
/usr/bin/cp --preserve=mode "$CONFIG_PATH/u-boot-20180507-3.mga7.armv7hl.rpm" "$BUILD_PATH/root/"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error copying $CONFIG_PATH/kernel-odroid-4.14.y-1.armv7hl.rpm : exiting"
|
|
exit 1
|
|
fi
|
|
;;
|
|
rpi)
|
|
;;
|
|
esac
|
|
}
|
|
|
|
function jumpchroot()
|
|
{
|
|
title "chrooting to $BUILD_PATH"
|
|
info "mounting dev, sys, proc directories in chroot"
|
|
/bin/mount -B /dev "$BUILD_PATH/dev"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error mounting $BUILD_PATH/dev : exiting"
|
|
exit 1
|
|
fi
|
|
/bin/mount -B /sys "$BUILD_PATH/sys"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error mounting $BUILD_PATH/sys : exiting"
|
|
exit 1
|
|
fi
|
|
/bin/mount -B /proc "$BUILD_PATH/proc"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error mounting $BUILD_PATH/proc : exiting"
|
|
exit 1
|
|
fi
|
|
info "Copying resolv.conf"
|
|
/bin/cp -v --preserve=mode /etc/resolv.conf "$BUILD_PATH/etc/"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error copying $BUILD_PATH/etc/resolv.conf : exiting"
|
|
exit 1
|
|
fi
|
|
if [ "$OPT" = "chroot" ];then
|
|
/sbin/chroot "$BUILD_PATH"
|
|
else
|
|
/sbin/chroot --userspec root:root "$BUILD_PATH" /bin/bash -v -c 'sh /second_stage_install.sh'
|
|
fi
|
|
RET=$?
|
|
if [ $RET -ne 0 ];then
|
|
error "line $LINENO Warning : chrooting to $BUILD_PATH retrurn an error $RET"
|
|
ERRORN=$((ERRORN++))
|
|
fi
|
|
info "unmounting dev, sys, proc"
|
|
/bin/umount -lf "$BUILD_PATH/dev"
|
|
if [ $? -ne 0 ];then
|
|
warning "line $LINENO Warning : error unmounting $BUILD_PATH/dev, continuing anyway"
|
|
ERRORN=$((ERRORN++))
|
|
fi
|
|
/bin/umount -lf "$BUILD_PATH/sys"
|
|
if [ $? -ne 0 ];then
|
|
warning "line $LINENO Warning : error unmounting $BUILD_PATH/sys, continuing anyway"
|
|
ERRORN=$((ERRORN++))
|
|
fi
|
|
/bin/umount -lf "$BUILD_PATH/proc"
|
|
if [ $? -ne 0 ];then
|
|
warning "line $LINENO Warning : error unmounting $BUILD_PATH/proc, continuing anyway"
|
|
ERRORN=$((ERRORN++))
|
|
fi
|
|
}
|
|
|
|
function verify_disk_space()
|
|
{
|
|
title "Verifying if there is enough space on disk to make the image"
|
|
DISK_SPACE=$(/usr/bin/df -BG --output=avail "$INSTALL_PATH" | sed '1d;s/[^0-9]//g')
|
|
info "Free disk space: ${DISK_SPACE}G"
|
|
if [ $DISK_SPACE -lt $IMAGE_SIZE ];then
|
|
warning "image size is greater than disk space"
|
|
info "correct the problem and relaunch the script with parameter --create-rpi-image"
|
|
info "$0 --size $IMAGE_SIZE --create-rpi-image"
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
function createxu3image()
|
|
{
|
|
title "Creating Odroid XU3-XU4 image"
|
|
createimage
|
|
if [ -z "$BOOTFS" ];then
|
|
BOOTFS="ext4"
|
|
fi
|
|
formatpartitions "$BOOTFS" ext4
|
|
copyingsystem
|
|
}
|
|
|
|
|
|
function createrpiimage()
|
|
{
|
|
title "Creating Pi image"
|
|
|
|
if ! [ -d "$FIRMWARE_PATH/$FIRMWARE_DIR" ];then # the firmware directory does not exists
|
|
echo "$(ls *.zip| wc -l)"
|
|
if [ "$(ls *.zip| wc -l)" -eq 0 ];then # the firmware archive does not exists
|
|
warning "The raspberry pi firmware need to be downloaded"
|
|
info "Downloading FIRMWARE_FILENAME"
|
|
wget $FIRMWARE_DOWNLOAD_URL
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error downloading raspberry firmware at $FIRMWARE_DOWNLOAD_URL :exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
info "extracting firmware"
|
|
unzip -d "$FIRMWARE_PATH" *.zip
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error unzipping $FIRMWARE_PATH : exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
title "Making raspberry pi image"
|
|
|
|
createimage
|
|
if [ -z $BOOTFS ];then
|
|
BOOTFS="vfat"
|
|
fi
|
|
formatpartitions $BOOTFS ext4
|
|
copyingsystem
|
|
|
|
}
|
|
|
|
createimage()
|
|
{
|
|
title " in $IMAGE"
|
|
if [ -f "$INSTALL_PATH/$IMAGE" ];then
|
|
warning "Deleting previous image"
|
|
/bin/rm -f "$INSTALL_PATH/$IMAGE"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error can't remove previous image at $INSTALL_PATH/$IMAGE : exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
warning "please wait until end of image creation"
|
|
/bin/dd if=/dev/zero of="$INSTALL_PATH/$IMAGE" bs=1MB count=$(( $IMAGE_SIZE * 1024 ))
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO can't make image at $INSTALL_PATH/$IMAGE : exiting"
|
|
exit 1
|
|
fi
|
|
DEVICE=$(/sbin/losetup -f --show "$INSTALL_PATH/$IMAGE")
|
|
if [ $TARGET = "odroid" ];then
|
|
info "installing blobs"
|
|
pushd "$CONFIG_PATH/sd_fuse"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error directory $CONFIG_PATH/sd_fuse does not exists : exiting"
|
|
exit 1
|
|
else
|
|
./sd_fusing.sh "$DEVICE"
|
|
fi
|
|
pushd
|
|
fi
|
|
|
|
info "making partitions"
|
|
/sbin/fdisk "$DEVICE" << EOF
|
|
n
|
|
p
|
|
1
|
|
|
|
+128M
|
|
t
|
|
c
|
|
n
|
|
p
|
|
2
|
|
|
|
|
|
a
|
|
1
|
|
a
|
|
2
|
|
w
|
|
EOF
|
|
|
|
# Activate loop device
|
|
/sbin/losetup -d "$DEVICE"
|
|
DEVICE=$(/sbin/partx -va "$INSTALL_PATH/$IMAGE" | /bin/grep -m 1 -E -o '/dev/loop.?')
|
|
info "device $DEVICE"
|
|
info "partitions list:"
|
|
info "$(/sbin/partx -v "$INSTALL_PATH/$IMAGE")"
|
|
BOOTP="${DEVICE}p1"
|
|
ROOTP="${DEVICE}p2"
|
|
}
|
|
|
|
formatpartitions()
|
|
{
|
|
info "Formatting partitions"
|
|
info "Boot : $BOOTP as $1"
|
|
"/sbin/mkfs.$1" "$BOOTP"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error formating $BOOTP : exiting"
|
|
/sbin/losetup -d "$DEVICE"
|
|
exit 1
|
|
fi
|
|
info "Root : $ROOTP as $2"
|
|
"/sbin/mkfs.$2" "$ROOTP"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error formating $ROOTP : exiting"
|
|
/sbin/losetup -d "$DEVICE"
|
|
exit 1
|
|
fi
|
|
BOOT_UUID=$(blkid -s UUID -o value UUID "$BOOTP")
|
|
info "Boot UUID: $BOOT_UUID"
|
|
ROOT_UUID=$(blkid -s UUID -o value UUID "$ROOTP")
|
|
info "Root UUID: $ROOT_UUID"
|
|
}
|
|
|
|
copyingsystem()
|
|
{
|
|
info "mounting partitions, making mountpoint if necessary"
|
|
if ! [ -d "$BOOT" ];then
|
|
/bin/mkdir "$BOOT"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error making directory $BOOT : exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
if ! [ -d "$ROOT" ];then
|
|
/bin/mkdir "$ROOT"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error making directory $ROOT : exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
/bin/mount "$BOOTP" "$BOOT"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error mounting $BOOTP : exiting"
|
|
exit 1
|
|
fi
|
|
/bin/mount "$ROOTP" "$ROOT"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error mounting $ROOTP : exiting"
|
|
exit 1
|
|
fi
|
|
|
|
info "making /etc/fstab"
|
|
echo "proc /proc proc defaults 0 0
|
|
UUID=$BOOT_UUID /mnt/arm_boot vfat defaults 0 0
|
|
UUID=$ROOT_UUID / ext4 defaults 0 0" > "$BUILD_PATH"/etc/fstab
|
|
|
|
if [ ! -d "$BUILD_PATH/boot/extlinux" ];then
|
|
info "making /boot/extlinux/extlinux.conf"
|
|
mkdir -p "$BUILD_PATH/boot/extlinux"
|
|
fi
|
|
if [ ! -f "$BUILD_PATH/boot/extlinux/extlinux.conf" ];then
|
|
sed -e s/\<UUID\>/$ROOT_UUID/g $CONFIG_PATH/extlinux.conf >"$BUILD_PATH/boot/extlinux/extlinux.conf"
|
|
KERNEL_ID=`basename $BUILD_PATH/usr/lib/linux-*`
|
|
sed -i -e s/\<FDTDIR\>/$KERNEL_ID/g "$BUILD_PATH/boot/extlinux/extlinux.conf"
|
|
fi
|
|
case $TARGET in
|
|
rpi)
|
|
|
|
info "copying 10-vchiq-permissions.rules"
|
|
cp --preserve=mode "$CONFIG_PATH/10-vchiq-permissions.rules" "$BUILD_PATH/etc/udev/rules.d/"
|
|
info "Making /etc/modules"
|
|
echo "vchiq
|
|
snd_bcm2835
|
|
vc4
|
|
brcmfmac" >> "$BUILD_PATH"/etc/modules
|
|
|
|
ARM_BOOT="$BUILD_PATH/mnt/arm_boot"
|
|
if ! [ -d "$ARM_BOOT" ];then
|
|
mkdir -p "$ARM_BOOT"
|
|
fi
|
|
info "copying modprobe.conf"
|
|
/usr/bin/cp -v --preserve=mode "$CONFIG_PATH/modprobe.conf" "$BUILD_PATH/etc/"
|
|
chown root:root "$BUILD_PATH/etc/modprobe.conf"
|
|
|
|
info "copying firmware, overlays in rpi boot partition"
|
|
# cp -v --preserve=mode "$BUILD_PATH/usr/lib/linux-"* "$BOOT/dtb"
|
|
cp -v --preserve=mode "$FIRMWARE_PATH/$FIRMWARE_DIR/boot/start"* "$ARM_BOOT/"
|
|
cp -v --preserve=mode "$FIRMWARE_PATH/$FIRMWARE_DIR/boot/fixup"* "$ARM_BOOT/"
|
|
cp -v --preserve=mode "$FIRMWARE_PATH/$FIRMWARE_DIR/boot/bootcode.bin"* "$ARM_BOOT/"
|
|
cp -vR --preserve=mode "$FIRMWARE_PATH/$FIRMWARE_DIR/boot/overlays" "$ARM_BOOT/"
|
|
|
|
info "copying u-boot binary to $ARM_BOOT"
|
|
case $TARGET_VERSION in
|
|
2)
|
|
info "copying u-boot for $TARGET 2"
|
|
cp --preserve=mode "$BUILD_PATH/usr/lib/u-boot/rpi_2/u-boot.bin" "$ARM_BOOT/kernel.img"
|
|
;;
|
|
0)
|
|
info "copying u-boot for $TARGET 0"
|
|
cp --preserve=mode "$BUILD_PATH/usr/lib/u-boot/rpi_0_w/u-boot.bin" "$ARM_BOOT/kernel.img"
|
|
;;
|
|
1)
|
|
info "copying u-boot for $TARGET 1"
|
|
cp --preserve=mode "$BUILD_PATH/usr/lib/u-boot/rpi/u-boot.bin" "$ARM_BOOT/kernel.img"
|
|
;;
|
|
3_32)
|
|
info "copying u-boot for $TARGET 3 32 bits"
|
|
cp --preserve=mode "$BUILD_PATH/usr/lib/u-boot/rpi_3_32b/u-boot.bin" "$ARM_BOOT/kernel.img"
|
|
;;
|
|
3+)
|
|
info "copying u-boot for $TARGET 3b+ 32 bits"
|
|
cp --preserve=mode "$BUILD_PATH/usr/lib/u-boot/rpi_3_32b/u-boot.bin" "$ARM_BOOT/kernel.img"
|
|
;;
|
|
esac
|
|
|
|
# info "copying raspberry optionals files in opt"
|
|
# /bin/rsync -rlptDH "$FIRMWARE_PATH/$FIRMWARE_DIR/opt/" "$BUILD_PATH/opt/"
|
|
|
|
info "copying wifi firmware file missing in kernel-firmware-nonfree"
|
|
if ! [ -d "$ROOT/usr/lib/firmware/brcm/" ];then
|
|
/bin/mkdir -p "$ROOT/usr/lib/firmware/brcm/"
|
|
fi
|
|
if ! [ -f "$ROOT/usr/lib/firmware/brcm/brcmfmac434"* ];then
|
|
/bin/cp --preserve=mode "$CONFIG_PATH/brcmfmac434"* "$ROOT/usr/lib/firmware/brcm/"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO error copying wifi firmware in $ROOTP/usr/lib/firmware/brcm/ : exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
info "copying Mageia image to root partition"
|
|
/bin/rsync -rlptogDH --exclude "$ARM_BOOT/" --exclude "qemu-arm-static*" "$BUILD_PATH/" "$ROOT/"
|
|
/bin/rsync -rlptogDH "$ARM_BOOT/" "$BOOT/"
|
|
;;
|
|
odroid)
|
|
ODROID_BOOT="$BUILD_PATH/mnt/odroid_boot"
|
|
if ! [ -d "$ODROID_BOOT" ];then
|
|
mkdir -p "$ODROID_BOOT"
|
|
fi
|
|
case $TARGET_VERSION in
|
|
xu4)
|
|
info "copying u-boot for $TARGET $TARGET_VERSION"
|
|
cp --preserve=mode "$BUILD_PATH/usr/lib/u-boot/$TARGET-$TARGET_VERSION/u-boot.bin" "$ARM_BOOT/"
|
|
;;
|
|
esac
|
|
# temporary code waiting inclusion of xu4 in Mageia kernel and u-boot
|
|
|
|
info "Copying extlinux.conf on $ODROID_BOOT"
|
|
cp --preserve=mode -R "$BUILD_PATH/boot/extlinux" "$ODROID_BOOT/"
|
|
info "copying Mageia image to root partition"
|
|
/bin/rsync -rlptogDH --exclude "$ODROID_BOOT/" --exclude "qemu-arm-static*" "$BUILD_PATH/" "$ROOT/"
|
|
/bin/rsync -rlptogDH "$ODROID_BOOT/" "$BOOT/"
|
|
;;
|
|
esac
|
|
|
|
# info "copying tools in /usr/local/bin/"
|
|
# /bin/cp -v --preserve=mode "$SOURCE_PATH/tools/" "$BUILD_PATH/usr/local/bin/"
|
|
# if ! [ $? -eq 0 ];then
|
|
# error "line $LINENO error copying tools"
|
|
# ERRORN=$((ERRORN++))
|
|
# fi
|
|
# /bin/mkdir "$ROOT/boot"
|
|
|
|
copyingcommon
|
|
# Syncing devices before unmounting
|
|
/usr/bin/sync
|
|
/usr/bin/umount "$BOOT" "$ROOT"
|
|
if [ $? -eq 0 ];then
|
|
/bin/rmdir "$BOOT" "$ROOT"
|
|
else
|
|
error "line $LINENO error unmounting $ROOT or $BOOT : exiting"
|
|
exit 1
|
|
fi
|
|
|
|
/usr/sbin/partx -d "$DEVICE"
|
|
if [ $? -ne 0 ];then
|
|
error "line $LINENO warning : error unmounting $DEVICE "
|
|
exit 1
|
|
fi
|
|
warning "You can now burn the image ( $INSTALL_PATH/$IMAGE ) on SD card"
|
|
}
|
|
|
|
# Copying files common to all systems
|
|
copyingcommon()
|
|
{
|
|
title "Copying common files and configuration"
|
|
rsync -rlptDH "$SOURCE_PATH/common/" "$ROOT/"
|
|
rsync -rlptDH "$SOURCE_PATH/tools/"*.sh "$ROOT/usr/local/bin/"
|
|
chown root:root "$ROOT/usr/local/bin/"
|
|
}
|
|
|
|
if [ $# == 0 ];then
|
|
help
|
|
exit
|
|
fi
|
|
|
|
|
|
# parsing commandline
|
|
TEMP=$(getopt -o h,a --long all,help,clean,create-chroot,addmedia,create-image,,config:,target:,target-version:,chroot,bootfs:,install-basesystem,update-mirror,build-path:,size:,nonfree,tainted -n $CMDNAME -- "$@")
|
|
if [ $? -ne 0 ] ; then error "line $LINENO Failed parsing options." >&2 ; exit 1 ; fi
|
|
eval set -- "$TEMP"
|
|
|
|
echo "$TEMP"
|
|
# Note the quotes around `$TEMP': they are essential!
|
|
while true;
|
|
do
|
|
case "$1" in
|
|
-h|--help)
|
|
help
|
|
exit 0
|
|
;;
|
|
-a|--all)
|
|
OPT="all"
|
|
shift 1
|
|
;;
|
|
--clean)
|
|
OPT="clean"
|
|
shift
|
|
;;
|
|
--size)
|
|
IMAGE_SIZE_P=$2
|
|
shift 2
|
|
;;
|
|
--build-path)
|
|
INSTALL_PATH_P="$2"
|
|
shift 2
|
|
;;
|
|
--chroot)
|
|
if [ -z $OPT ];then
|
|
OPT="chroot"
|
|
fi
|
|
shift
|
|
;;
|
|
--create-chroot)
|
|
if [ -z $OPT ];then
|
|
OPT="createchroot"
|
|
fi
|
|
shift
|
|
;;
|
|
--addmedia)
|
|
if [ -z $OPT ];then
|
|
OPT="addmedia"
|
|
fi
|
|
shift
|
|
;;
|
|
--update-mirror)
|
|
if [ -z $OPT ];then
|
|
OPT="updatemirror"
|
|
fi
|
|
shift
|
|
;;
|
|
--install-basesystem)
|
|
if [ -z $OPT ];then
|
|
OPT="installbasesystem"
|
|
fi
|
|
shift
|
|
;;
|
|
--create-image)
|
|
if [ -z $OPT ];then
|
|
CREATEIMAGE=true
|
|
OPT="createimage"
|
|
fi
|
|
shift
|
|
;;
|
|
--target)
|
|
TARGET_P=$2
|
|
shift 2
|
|
;;
|
|
--target-version)
|
|
TARGET_VERSION_P=$2
|
|
shift 2
|
|
;;
|
|
--config)
|
|
CONFIG_PATH="$PLATFORMS_PATH/$2"
|
|
shift 2
|
|
;;
|
|
--bootfs)
|
|
BOOTFS_P=$2
|
|
shift 2
|
|
;;
|
|
--nonfree)
|
|
NONFREE_P=1
|
|
;;
|
|
--tainted)
|
|
TAINTED_P=1
|
|
;;
|
|
--)
|
|
shift
|
|
break;;
|
|
*)
|
|
error "Parameter $1 does not exists "
|
|
exit 1;;
|
|
esac
|
|
done
|
|
|
|
|
|
# path of config file
|
|
if ! [ -d "$CONFIG_PATH" ];then
|
|
info " Config path does not exists, defaulting to ./platforms/$TARGET"
|
|
CONFIG_PATH="$PLATFORMS_PATH/$TARGET"
|
|
warning "Do you want i make it and copy the template file in? [Y|n] "
|
|
read yn
|
|
if [ -z $yn ] || [ $yn = "Y" ] || [ $yn = "y" ];then
|
|
/usr/bin/mkdir "$CONFIG_PATH/"
|
|
/usr/bin/cp --preserve=mode "$SOURCE_PATH/config.template" "$CONFIG_PATH/mageia4arm.cfg"
|
|
warning "You need now to modify the config file ($CONFIG_PATH/mageia4arm.cfg) and relaunch the script"
|
|
exit 2
|
|
else
|
|
error( "Error: Can't continue without config file, exiting" )
|
|
exit 3
|
|
fi
|
|
fi
|
|
|
|
if [ -e "$CONFIG_PATH/mageia4arm.cfg" ];then
|
|
info "using $CONFIG_PATH/mageia4arm.cfg as config"
|
|
. "$CONFIG_PATH/mageia4arm.cfg"
|
|
else
|
|
warning "Config file does not exists, do you want i copy template ? [Y|n] "
|
|
read yn
|
|
if [ -z $yn ] || [ $yn = "Y" ] || [ $yn = "y" ];then
|
|
/usr/bin/cp --preserve=mode "$SOURCE_PATH/mageia4arm.cfg.template" "$CONFIG_PATH/mageia4arm.cfg"
|
|
warning "You need now to modify the config file ($CONFIG_PATH/mageia4arm.cfg) and relaunch the script"
|
|
exit 2
|
|
fi
|
|
fi
|
|
else
|
|
|
|
fi
|
|
|
|
if ! [ -z "$IMAGE_SIZE_P" ];then
|
|
IMAGE_SIZE=$IMAGE_SIZE_P
|
|
fi
|
|
if ! [ -z "$INSTALL_PATH_P" ];then
|
|
INSTALL_PATH=$INSTALL_PATH_P
|
|
fi
|
|
if ! [ -z "$TARGET_P" ];then
|
|
TARGET=$TARGET_P
|
|
fi
|
|
if ! [ -z "$TARGET_VERSION_P" ];then
|
|
TARGET_VERSION=$TARGET_VERSION_P
|
|
fi
|
|
if ! [ -z "$BOOTFS_P" ];then
|
|
BOOTFS=$BOOTFS_P
|
|
fi
|
|
if ! [ -z "$NONFREE_P" ];then
|
|
NONFREE=$NONFREE_P
|
|
fi
|
|
if ! [ -z "$TAINTED_P" ];then
|
|
TAINTED=$TAINTED_P
|
|
fi
|
|
|
|
info "Option: "$OPT
|
|
|
|
IMAGE="Mageia-${MAGEIA_VERSION}-$TARGET$TARGET_VERSION.img"
|
|
BOOT="/mnt/boot"
|
|
ROOT="/mnt/root"
|
|
BUILD_PATH="$INSTALL_PATH/build"
|
|
ARM_VERSION="armv7hl"
|
|
|
|
# assign function for building image of TARGET ( rpi, odroid )
|
|
case $TARGET in
|
|
odroid)
|
|
CREATEIMG="createxu3image"
|
|
;;
|
|
rpi)
|
|
CREATEIMG="createrpiimage"
|
|
;;
|
|
*)
|
|
error "No Target : $TARGET"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
info "target : $TARGET"
|
|
info "target_version : $TARGET_VERSION"
|
|
info "source path: $SOURCE_PATH"
|
|
info "Install path: $INSTALL_PATH"
|
|
info "Build path: $BUILD_PATH"
|
|
info "Commande : $CMDNAME"
|
|
info "Firmware path : $FIRMWARE_PATH"
|
|
info "Firmware dir : $FIRMWARE_DIR"
|
|
|
|
# Defining default image size to 7 go
|
|
if [[ "$IMAGE_SIZE" -lt 7 ]] || [[ "$IMAGE_SIZE" -gt 128 ]];then
|
|
IMAGE_SIZE=7
|
|
fi
|
|
|
|
# change dir to install path and create it if not existing
|
|
if [ "$OPT" != "clean" ];then
|
|
info "cd $INSTALL_PATH"
|
|
if ! [ -e "$INSTALL_PATH" ];then
|
|
/bin/mkdir -p "$INSTALL_PATH"
|
|
if [ -z $? ];then
|
|
error "line $LINENO can't make directory $INSTALL_PATH , exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
cd "$INSTALL_PATH"
|
|
if [ -z $? ];then
|
|
error "line $LINENO can't change to directory $INSTALL_PATH , exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
#if no parameters then display help message
|
|
if [ -z $OPT ];then
|
|
OPT="--help"
|
|
fi
|
|
|
|
info "Image size is: $IMAGE_SIZE Go"
|
|
|
|
case $OPT in
|
|
clean)
|
|
clean
|
|
;;
|
|
all)
|
|
verify_disk_space
|
|
if [ $? -eq 1 ];then
|
|
echo -e "Not enough space on disk\nDo you want to continue anyway ? [Y,n]"
|
|
read yn
|
|
if [ $yn = "n" ];then
|
|
exit 6
|
|
fi
|
|
fi
|
|
createchroot
|
|
addmedia
|
|
updatemirror
|
|
installbasesystem
|
|
preparechroot
|
|
jumpchroot
|
|
$CREATEIMG
|
|
;;
|
|
createchroot)
|
|
createchroot
|
|
;;
|
|
chroot)
|
|
jumpchroot
|
|
;;
|
|
addmedia)
|
|
addmedia
|
|
;;
|
|
updatemirror)
|
|
updatemirror
|
|
;;
|
|
createimage)
|
|
verify_disk_space
|
|
if [ $? -eq 1 ];then
|
|
warning "Not enough space on disk"
|
|
exit 6
|
|
fi
|
|
$CREATEIMG
|
|
;;
|
|
installbasesystem)
|
|
installbasesystem
|
|
;;
|
|
esac
|
|
|
|
|
|
if ! [ -z $ERRORN ];then
|
|
warning "Some errors occurs : $ERRORN errors"
|
|
fi
|