533 lines
12 KiB
Bash
Executable File
533 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
# Build planck linux system and generate ISO
|
|
# Version: 0.0.1
|
|
# (C) Chris Dorman, 2020-2021 - GPLv3+
|
|
|
|
workdir=`pwd`
|
|
rootdir="/planck"
|
|
corecount=25
|
|
|
|
# endtag used for iso filename, and some rootfs configs
|
|
endtag=`date +"%Y%m%d-%H%M"`
|
|
|
|
# Echo colors
|
|
NORMAL="\e[0m"
|
|
RED="\e[0;31m"
|
|
GREEN="\e[0;32m"
|
|
BLUE="\e[0;34m"
|
|
YELLOW="\e[1;33m"
|
|
MAGENTA="\e[0;35m"
|
|
CYAN="\e[0;36m"
|
|
|
|
# function to check if errors occurred
|
|
status()
|
|
{
|
|
local CHECK=$?
|
|
echo -en "\033[68G"
|
|
if [ $CHECK = 0 ] ; then
|
|
echo -e "[ \e[0;32mOK\e[0m ]"
|
|
else
|
|
echo -e "[ \e[0;31mFAILED\e[0m ]"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# same as above but doesn't output [ OK ]
|
|
status_silent()
|
|
{
|
|
local CHECK=$?
|
|
echo -en "\033[68G"
|
|
if [ $CHECK != 0 ] ; then
|
|
echo -e "[ \e[0;31mFAILED\e[0m ]"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
if [ "$(id -u)" != "0" ]; then
|
|
echo -e "[$RED Error $NORMAL] This script needs to be executed by root."
|
|
exit 1
|
|
fi
|
|
|
|
if [ -d $rootdir ]; then
|
|
rm -r $rootdir
|
|
fi
|
|
|
|
if [ -d $workdir/src/rootfs ]; then
|
|
rm -r $workdir/src/rootfs
|
|
fi
|
|
|
|
# if called, print everything instead of hiding. Debugging purposes
|
|
case $2 in
|
|
--verbose|-v) verbose=1;;
|
|
*) verbose=0;
|
|
esac
|
|
|
|
# Build linux kernel
|
|
do_kernel()
|
|
{
|
|
|
|
echo -e "[$YELLOW Working $NORMAL] Configuring & building Linux kernel"
|
|
cd $workdir/src/linux-*
|
|
status
|
|
|
|
echo -n "Configuring..."
|
|
cp ../../cfg/linux-*.conf .config
|
|
status
|
|
|
|
echo -n "Building kernel base..."
|
|
if [ "$verbose" == "1" ]; then
|
|
make bzImage -j$corecount
|
|
status
|
|
else
|
|
make bzImage -j$corecount > /dev/null 2>&1
|
|
status
|
|
fi
|
|
|
|
#echo -n "Building kernel modules..."
|
|
#if [ "$verbose" == "1" ]; then
|
|
# make modules -j20
|
|
# status
|
|
#else
|
|
# make modules -j20 > /dev/null 2>&1
|
|
# status
|
|
#fi
|
|
|
|
#echo -n "Installing kernel modules..."
|
|
#make INSTALL_MOD_PATH=`pwd`/_pkg modules_install > /dev/null 2>&1
|
|
#status
|
|
|
|
echo -n "Installing kernel headers..."
|
|
make INSTALL_HDR_PATH=$rootdir headers_install > /dev/null 2>&1
|
|
status
|
|
|
|
cd ..
|
|
|
|
}
|
|
|
|
# Build musl-libc for compiler wrapping and OS dependencies
|
|
do_musl()
|
|
{
|
|
#Building musl for planck linux
|
|
echo -e "[$YELLOW Working $NORMAL] Configuring & building musl-libc"
|
|
cd $workdir/src
|
|
|
|
cd musl
|
|
echo -n "Building musl..."
|
|
if [ "$verbose" == "1" ]; then
|
|
./configure --prefix=$rootdir
|
|
silent_status
|
|
make -j$corecount
|
|
status_silent
|
|
make install
|
|
status
|
|
else
|
|
./configure --prefix=$rootdir > /dev/null 2>&1
|
|
status_silent
|
|
make -j$corecount > /dev/null 2>&1
|
|
status_silent
|
|
make install > /dev/null 2>&1
|
|
status
|
|
fi
|
|
cd ../..
|
|
|
|
#cp -a linux-headers/include $rootdir/.
|
|
|
|
export PATH=$PATH:$rootdir/bin
|
|
}
|
|
|
|
# Build base system
|
|
do_base()
|
|
{
|
|
|
|
echo -e "[$YELLOW Working $NORMAL] Configuring & building system utilities"
|
|
cd $workdir/src
|
|
|
|
#BUILD PACKAGE: sbase
|
|
cd sbase
|
|
echo -n "Building sbase..."
|
|
if [ "$verbose" == "1" ]; then
|
|
make -j$corecount
|
|
status_silent
|
|
make install
|
|
status
|
|
else
|
|
make -j$corecount > /dev/null 2>&1
|
|
status_silent
|
|
make install > /dev/null 2>&1
|
|
status
|
|
fi
|
|
cd ..
|
|
|
|
cd ubase
|
|
echo -n "Building ubase..."
|
|
if [ "$verbose" == "1" ]; then
|
|
make -j$corecount
|
|
status_silent
|
|
make install
|
|
status
|
|
else
|
|
make -j$corecount > /dev/null 2>&1
|
|
status_silent
|
|
make install > /dev/null 2>&1
|
|
status
|
|
fi
|
|
cd ..
|
|
|
|
cd sinit
|
|
echo -n "Building sinit..."
|
|
if [ "$verbose" == "1" ]; then
|
|
make -j$corecount
|
|
status_silent
|
|
make install
|
|
status
|
|
else
|
|
make -j$corecount > /dev/null 2>&1
|
|
status_silent
|
|
make install > /dev/null 2>&1
|
|
status
|
|
fi
|
|
cd ..
|
|
|
|
cd sdhcp
|
|
echo -n "Building sdhcp..."
|
|
if [ "$verbose" == "1" ]; then
|
|
make -j$corecount
|
|
status_silent
|
|
make install
|
|
status
|
|
else
|
|
make -j$corecount > /dev/null 2>&1
|
|
status_silent
|
|
make install > /dev/null 2>&1
|
|
status
|
|
fi
|
|
cd ..
|
|
|
|
cd smdev
|
|
echo -n "Building smdev..."
|
|
if [ "$verbose" == "1" ]; then
|
|
make -j$corecount
|
|
status_silent
|
|
make install
|
|
status
|
|
else
|
|
make -j$corecount > /dev/null 2>&1
|
|
status_silent
|
|
make install > /dev/null 2>&1
|
|
status
|
|
fi
|
|
cd ..
|
|
|
|
cd dish
|
|
echo -n "Building dash..."
|
|
if [ "$verbose" == "1" ]; then
|
|
make -j$corecount
|
|
status_silent
|
|
make install
|
|
status
|
|
else
|
|
make -j$corecount > /dev/null 2>&1
|
|
status_silent
|
|
make install > /dev/null 2>&1
|
|
status
|
|
fi
|
|
cd $workdir/src
|
|
|
|
cd tcc
|
|
echo -n "Building tcc..."
|
|
if [ "$verbose" == "1" ]; then
|
|
./configure --prefix=$rootdir --crtprefix=$rootdir/lib --cc=musl-gcc --elfinterp=$rootdir/lib/libc.so --sysincludepaths=$rootdir/include --libpaths=$rootdir/lib --config-bcheck=no --config-musl=yes
|
|
status_silent
|
|
make -j$corecount
|
|
status_silent
|
|
make install
|
|
status
|
|
else
|
|
./configure --prefix=$rootdir --crtprefix=$rootdir/lib --cc=musl-gcc --elfinterp=$rootdir/lib/libc.so --sysincludepaths=$rootdir/include --libpaths=$rootdir/lib --config-bcheck=no --config-musl=yes> /dev/null 2>&1
|
|
status_silent
|
|
make -j$corecount > /dev/null 2>&1
|
|
status_silent
|
|
make install > /dev/null 2>&1
|
|
status
|
|
fi
|
|
cd ..
|
|
|
|
cd texor
|
|
echo -n "Building texor..."
|
|
if [ "$verbose" == "1" ]; then
|
|
make -j$corecount
|
|
status_silent
|
|
cp texor $rootdir/bin/.
|
|
status
|
|
else
|
|
make -j$corecount > /dev/null 2>&1
|
|
status_silent
|
|
cp texor $rootdir/bin/. > /dev/null 2>&1
|
|
status
|
|
fi
|
|
cd ..
|
|
|
|
cd wgetlite
|
|
echo -n "Building wgetlite..."
|
|
if [ "$verbose" == "1" ]; then
|
|
CC=musl-gcc
|
|
make -j$corecount
|
|
status_silent
|
|
cp wgetlite $rootdir/bin/wget
|
|
status
|
|
else
|
|
CC=musl-gcc
|
|
make -j$corecount > /dev/null 2>&1
|
|
status_silent
|
|
cp wgetlite $rootdir/bin/wget > /dev/null 2>&1
|
|
status
|
|
fi
|
|
cd ..
|
|
|
|
# END PACKAGE BUILD
|
|
|
|
# Link libc.so musl linker
|
|
cd $rootdir
|
|
cd lib
|
|
ln -s libc.so ld-musl-x86_64.so.1
|
|
|
|
cd $workdir/src
|
|
}
|
|
|
|
# Configure rootfs for live boot
|
|
configure_system()
|
|
{
|
|
|
|
echo -e "[$YELLOW Working $NORMAL] Configuring root filesystem"
|
|
if [ ! -d $workdir/src/rootfs ]; then
|
|
mkdir $workdir/src/rootfs
|
|
fi
|
|
if [ ! -d $rootdir/dev ]; then
|
|
mkdir $rootdir/dev
|
|
fi
|
|
|
|
cd $workdir/src/rootfs
|
|
|
|
echo -n "Filling /dev..."
|
|
cp ../../cfg/mkdevs $rootdir/bin/mkdevs
|
|
$rootdir/bin/mkdevs $rootdir/dev > /dev/null 2>&1
|
|
cp -a $rootdir .
|
|
status_silent
|
|
ln -s planck/dev dev
|
|
status
|
|
|
|
cd planck
|
|
|
|
if [ ! -d etc ]; then
|
|
mkdir etc
|
|
fi
|
|
|
|
echo -n "Configuring networking..."
|
|
echo "127.0.0.1 localhost" > etc/hosts
|
|
echo "localhost 127.0.0.1" > etc/networks
|
|
echo "linux" > etc/hostname
|
|
echo "order hosts,bind" > etc/host.conf
|
|
echo "multi on" >> etc/host.conf
|
|
status
|
|
|
|
echo -n "Setting up default users and groups..."
|
|
echo "root:x:0:0:root:/root:/bin/sh" > etc/passwd
|
|
echo "root::13525:0:99999:7:::" > etc/shadow
|
|
echo "root:x:0:" > etc/group
|
|
echo "root:*::" > etc/gshadow
|
|
chmod 640 etc/shadow
|
|
chmod 640 etc/gshadow
|
|
status
|
|
|
|
#echo -n "Copying kernel modules..."
|
|
#cp -a ../$kerneldir/_pkg/* .
|
|
#status
|
|
|
|
#echo -n "Copying kernel headers..."
|
|
#cp -a ../$kerneldir/_hdr/* .
|
|
#status
|
|
|
|
echo -n "Compiling termtypes for core terminfo...."
|
|
tic -o ./share/terminfo ../../../cfg/terminfo/termtypes > /dev/null 2>&1
|
|
status
|
|
|
|
echo -n "Finishing up..."
|
|
echo "# /etc/securetty: List of terminals on which root is allowed to login.
|
|
#
|
|
console
|
|
|
|
# For people with serial port consoles
|
|
ttyS0
|
|
|
|
# Standard consoles
|
|
tty1
|
|
tty2
|
|
tty3
|
|
tty4
|
|
tty5
|
|
tty6
|
|
tty7" > etc/securetty
|
|
|
|
echo "/bin/sh" > etc/shells
|
|
echo "/bin/dash" >> etc/shells
|
|
|
|
echo "Planck Linux\r \l" > etc/issue
|
|
echo "" >> etc/issue
|
|
|
|
echo "proc /proc proc defaults 0 0
|
|
sysfs /sys sysfs defaults 0 0
|
|
devpts /dev/pts devpts defaults 0 0
|
|
tmpfs /dev/shm tmpfs defaults 0 0" > etc/fstab
|
|
|
|
echo "Welcome to
|
|
______________ ______
|
|
___ __ \\__ /_____ ________________ /__
|
|
__ /_/ /_ /_ __ \`/_ __ \\ ___/_ //_/
|
|
_ ____/_ / / /_/ /_ / / / /__ _ ,<
|
|
/_/ /_/ \\__,_/ /_/ /_/\\___/ /_/|_|
|
|
Linux - With no GNU libraries!
|
|
" > etc/motd
|
|
|
|
echo "[SUID]
|
|
# Allow command to be run by anyone.
|
|
su = ssx root.root
|
|
passwd = ssx root.root
|
|
loadkmap = ssx root.root
|
|
mount = ssx root.root
|
|
reboot = ssx root.root
|
|
halt = ssx root.root" > etc/busybox.conf
|
|
|
|
echo "# /etc/profile: system-wide .profile file for the Bourne shells
|
|
|
|
PATH=\"/freon/bin:/freon/sbin:/freon/usr/bin:/freon/usr/sbin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/bin:/usr/local/sbin\"
|
|
LD_LIBRARY_PATH=\"/freon/lib:/freon/lib64:/freon/usr/lib:/lib64:/usr/lib:/lib:/usr/local/lib\"
|
|
TERM=\"xterm\"
|
|
TERMINFO=\"/share/terminfo\"
|
|
|
|
NORMAL=\"\\[\\e[0m\\]\"
|
|
RED=\"\\[\\e[0;31m\\]\"
|
|
GREEN=\"\\[\\e[0;32m\\]\"
|
|
BLUE=\"\\[\\e[0;34m\\]\"
|
|
YELLOW=\"\\[\\e[1;33m\\]\"
|
|
MAGENTA=\"\\[\\e[0;35m\\]\"
|
|
CYAN=\"\\[\\e[0;36m\\]\"
|
|
|
|
if [ \"\`id -u\`\" -eq 0 ]; then
|
|
PS1=\"$RED\\u$GREEN@$BLUE\\h [ $MAGENTA\\w$BLUE ]# \$NORMAL\"
|
|
else
|
|
PS1=\"$RED\\u$GREEN@$BLUE\\h [ $MAGENTA\\w$BLUE ]\\\$ \$NORMAL\"
|
|
fi
|
|
|
|
export PATH LD_LIBRARY_PATH PS1 DISPLAY ignoreeof
|
|
umask 022
|
|
|
|
export G_FILENAME_ENCODING=iso8859-1
|
|
" > etc/profile
|
|
|
|
echo "proc /planck/proc proc defaults 0 0
|
|
sysfs /planck/sys sysfs defaults 0 0
|
|
devpts /planck/dev/pts devpts defaults 0 0
|
|
tmpfs /planck/dev/shm tmpfs defaults 0 0" > etc/fstab
|
|
|
|
status
|
|
|
|
cd $workdir
|
|
}
|
|
|
|
# generate initramfs for live boot.
|
|
gen_rootfs()
|
|
{
|
|
echo -e "[$YELLOW Working $NORMAL] Generating filesystem..."
|
|
|
|
cd $workdir/src/rootfs
|
|
|
|
ln -s planck/bin bin
|
|
ln -s planck/lib lib
|
|
ln -s planck/share share
|
|
ln -s planck/sbin sbin
|
|
ln -s planck/etc etc
|
|
mkdir planck/proc
|
|
mkdir planck/sys
|
|
mkdir planck/run
|
|
if [ ! -d planck/dev/pts ]; then
|
|
mkdir planck/dev/pts
|
|
fi
|
|
ln -s planck/proc proc
|
|
ln -s planck/sys sys
|
|
mkdir root
|
|
|
|
echo -n "Stripping build..."
|
|
strip -g planck/lib/*.so > /dev/null 2>&1
|
|
strip -g planck/lib/*.a > /dev/null 2>&1
|
|
strip planck/bin/* > /dev/null 2>&1
|
|
strip planck/sbin/* > /dev/null 2>&1
|
|
|
|
cp ../../cfg/planck* planck/etc/.
|
|
|
|
echo -n "Compressing rootfs tree..."
|
|
find . -print | cpio -o -H newc | gzip -9 > ../../planck.gz 2>&1
|
|
status
|
|
|
|
cd $workdir
|
|
}
|
|
|
|
# setup bootloader for iso
|
|
do_isolinux()
|
|
{
|
|
echo -e "[$YELLOW Working $NORMAL] Setting up bootloader."
|
|
|
|
cd $workdir/src
|
|
|
|
if [ ! -d cdroot ]; then
|
|
mkdir cdroot
|
|
mkdir cdroot/boot
|
|
fi
|
|
|
|
cd syslinux
|
|
|
|
echo -n "Copying isolinux files to iso..."
|
|
cp bios/core/isolinux.bin ../cdroot
|
|
status_silent
|
|
cp bios/com32/elflink/ldlinux/ldlinux.c32 ../cdroot
|
|
status
|
|
|
|
echo -n "Generating isolinux config..."
|
|
echo "Planck Linux
|
|
Press <enter> to boot" > ../cdroot/display.txt
|
|
echo "display display.txt
|
|
default Planck
|
|
label Planck
|
|
kernel /boot/bzImage
|
|
append initrd=/boot/planck.gz rw root=/dev/null vga=788
|
|
implicit 0
|
|
prompt 1
|
|
timeout 5" > ../cdroot/isolinux.cfg
|
|
status
|
|
|
|
cd $workdir
|
|
}
|
|
|
|
# generate complete iso ready for boot
|
|
gen_iso()
|
|
{
|
|
|
|
echo -e -n "[$YELLOW Working $NORMAL] Generating bootable ISO image."
|
|
|
|
cd $workdir/src
|
|
|
|
cp ../planck.gz cdroot/boot
|
|
cp linux-*/arch/x86/boot/bzImage cdroot/boot/bzImage
|
|
|
|
genisoimage -R -o ../planck-$endtag.iso -b isolinux.bin \
|
|
-c boot.cat -no-emul-boot -boot-load-size 4 \
|
|
-V "Planck Linux" -input-charset iso8859-1 -boot-info-table cdroot > /dev/null 2>&1
|
|
status
|
|
|
|
}
|
|
|
|
case $1 in
|
|
full) do_kernel; do_musl; do_base; configure_system; gen_rootfs; do_isolinux; gen_iso;;
|
|
rootfs) do_musl; do_base; configure_system; gen_rootfs;;
|
|
*) echo "Unknown argument: ./build-planck [full|rootfs]";;
|
|
esac
|