Basic code for OS image packaging script
This commit is contained in:
Executable
+222
@@ -0,0 +1,222 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e # exit on error
|
||||
set -o pipefail # exit on pipeline error
|
||||
set -u # treat unset variable as error
|
||||
#set -x
|
||||
|
||||
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
|
||||
|
||||
CMD=(setup_host install_pkg finish_up)
|
||||
|
||||
NVIDIA_DRIVER_VERSION=530
|
||||
|
||||
function help() {
|
||||
# if $1 is set, use $1 as headline message in help()
|
||||
if [ -z ${1+x} ]; then
|
||||
echo -e "This script builds Ubuntu from scratch"
|
||||
echo -e
|
||||
else
|
||||
echo -e $1
|
||||
echo
|
||||
fi
|
||||
echo -e "Supported commands : ${CMD[*]}"
|
||||
echo -e
|
||||
echo -e "Syntax: $0 [start_cmd] [-] [end_cmd]"
|
||||
echo -e "\trun from start_cmd to end_end"
|
||||
echo -e "\tif start_cmd is omitted, start from first command"
|
||||
echo -e "\tif end_cmd is omitted, end with last command"
|
||||
echo -e "\tenter single cmd to run the specific command"
|
||||
echo -e "\tenter '-' as only argument to run all commands"
|
||||
echo -e
|
||||
exit 0
|
||||
}
|
||||
|
||||
function find_index() {
|
||||
local ret;
|
||||
local i;
|
||||
for ((i=0; i<${#CMD[*]}; i++)); do
|
||||
if [ "${CMD[i]}" == "$1" ]; then
|
||||
index=$i;
|
||||
return;
|
||||
fi
|
||||
done
|
||||
help "Command not found : $1"
|
||||
}
|
||||
|
||||
function check_host() {
|
||||
if [ $(id -u) -ne 0 ]; then
|
||||
echo "This script should be run as 'root'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
export HOME=/root
|
||||
export LC_ALL=C
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
}
|
||||
|
||||
function setup_host() {
|
||||
echo "=====> running setup_host ..."
|
||||
|
||||
cat <<EOF > /etc/apt/sources.list
|
||||
deb $TARGET_UBUNTU_MIRROR $TARGET_UBUNTU_VERSION main restricted universe multiverse
|
||||
deb-src $TARGET_UBUNTU_MIRROR $TARGET_UBUNTU_VERSION main restricted universe multiverse
|
||||
|
||||
deb $TARGET_UBUNTU_MIRROR $TARGET_UBUNTU_VERSION-security main restricted universe multiverse
|
||||
deb-src $TARGET_UBUNTU_MIRROR $TARGET_UBUNTU_VERSION-security main restricted universe multiverse
|
||||
|
||||
deb $TARGET_UBUNTU_MIRROR $TARGET_UBUNTU_VERSION-updates main restricted universe multiverse
|
||||
deb-src $TARGET_UBUNTU_MIRROR $TARGET_UBUNTU_VERSION-updates main restricted universe multiverse
|
||||
EOF
|
||||
|
||||
echo "$TARGET_NAME" > /etc/hostname
|
||||
|
||||
# we need to install systemd first, to configure machine id
|
||||
apt-get update
|
||||
apt-get install -y libterm-readline-gnu-perl systemd-sysv
|
||||
|
||||
#configure machine id
|
||||
dbus-uuidgen > /etc/machine-id
|
||||
ln -fs /etc/machine-id /var/lib/dbus/machine-id
|
||||
|
||||
# don't understand why, but multiple sources indicate this
|
||||
dpkg-divert --local --rename --add /sbin/initctl
|
||||
ln -s /bin/true /sbin/initctl
|
||||
}
|
||||
|
||||
# Load configuration values from file
|
||||
function load_config() {
|
||||
if [[ -f "$SCRIPT_DIR/config.sh" ]]; then
|
||||
. "$SCRIPT_DIR/config.sh"
|
||||
elif [[ -f "$SCRIPT_DIR/default_config.sh" ]]; then
|
||||
. "$SCRIPT_DIR/default_config.sh"
|
||||
else
|
||||
>&2 echo "Unable to find default config file $SCRIPT_DIR/default_config.sh, aborting."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
function install_pkg() {
|
||||
echo "=====> running install_pkg ... will take a long time ..."
|
||||
apt-get -y upgrade
|
||||
|
||||
# install live packages
|
||||
apt-get install -y \
|
||||
sudo \
|
||||
ubuntu-standard \
|
||||
casper \
|
||||
discover \
|
||||
laptop-detect \
|
||||
os-prober \
|
||||
network-manager \
|
||||
resolvconf \
|
||||
net-tools \
|
||||
wireless-tools \
|
||||
wpagui \
|
||||
grub-common \
|
||||
grub-gfxpayload-lists \
|
||||
grub-pc \
|
||||
grub-pc-bin \
|
||||
grub2-common \
|
||||
locales \
|
||||
ubuntu-drivers-common
|
||||
|
||||
# install nvidia drivers
|
||||
ubuntu-drivers install nvidia:${NVIDIA_DRIVER_VERSION}
|
||||
|
||||
case $TARGET_UBUNTU_VERSION in
|
||||
"focal" | "bionic")
|
||||
apt-get install -y lupin-casper
|
||||
;;
|
||||
*)
|
||||
echo "Package lupin-casper is not needed. Skipping."
|
||||
;;
|
||||
esac
|
||||
|
||||
# install kernel
|
||||
apt-get install -y --no-install-recommends $TARGET_KERNEL_PACKAGE
|
||||
|
||||
# graphic installer - ubiquity
|
||||
apt-get install -y \
|
||||
ubiquity \
|
||||
ubiquity-casper \
|
||||
ubiquity-frontend-gtk \
|
||||
ubiquity-slideshow-ubuntu \
|
||||
ubiquity-ubuntu-artwork
|
||||
|
||||
# Call into config function
|
||||
customize_image
|
||||
|
||||
# remove unused and clean up apt cache
|
||||
apt-get autoremove -y
|
||||
|
||||
# final touch
|
||||
dpkg-reconfigure locales
|
||||
dpkg-reconfigure resolvconf
|
||||
|
||||
# network manager
|
||||
cat <<EOF > /etc/NetworkManager/NetworkManager.conf
|
||||
[main]
|
||||
rc-manager=resolvconf
|
||||
plugins=ifupdown,keyfile
|
||||
dns=dnsmasq
|
||||
|
||||
[ifupdown]
|
||||
managed=false
|
||||
EOF
|
||||
|
||||
dpkg-reconfigure network-manager
|
||||
|
||||
apt-get clean -y
|
||||
}
|
||||
|
||||
function finish_up() {
|
||||
echo "=====> finish_up"
|
||||
|
||||
# truncate machine id (why??)
|
||||
truncate -s 0 /etc/machine-id
|
||||
|
||||
# remove diversion (why??)
|
||||
rm /sbin/initctl
|
||||
dpkg-divert --rename --remove /sbin/initctl
|
||||
|
||||
rm -rf /tmp/* ~/.bash_history
|
||||
}
|
||||
|
||||
# ============= main ================
|
||||
|
||||
load_config
|
||||
check_host
|
||||
|
||||
# check number of args
|
||||
if [[ $# == 0 || $# > 3 ]]; then help; fi
|
||||
|
||||
# loop through args
|
||||
dash_flag=false
|
||||
start_index=0
|
||||
end_index=${#CMD[*]}
|
||||
for ii in "$@";
|
||||
do
|
||||
if [[ $ii == "-" ]]; then
|
||||
dash_flag=true
|
||||
continue
|
||||
fi
|
||||
find_index $ii
|
||||
if [[ $dash_flag == false ]]; then
|
||||
start_index=$index
|
||||
else
|
||||
end_index=$(($index+1))
|
||||
fi
|
||||
done
|
||||
if [[ $dash_flag == false ]]; then
|
||||
end_index=$(($start_index + 1))
|
||||
fi
|
||||
|
||||
# loop through the commands
|
||||
for ((ii=$start_index; ii<$end_index; ii++)); do
|
||||
${CMD[ii]}
|
||||
done
|
||||
|
||||
echo "$0 - Initial build is done!"
|
||||
|
||||
Reference in New Issue
Block a user