|
#!/bin/bash |
|
|
|
set -x |
|
|
|
DISK=$1 |
|
BOOTLABEL=$2 |
|
ROOTDIR=$3 |
|
|
|
if [ -z "$DISK" -o -z "$BOOTLABEL" ]; then |
|
echo "Syntax: $0 <image|disk> <root-label> [<chroot-dir>]" |
|
exit 1 |
|
fi |
|
|
|
if [ "$UID" != "0" ]; then |
|
echo "Must be root. - $UID" |
|
exit 1 |
|
fi |
|
|
|
# Exit on errors |
|
set -xe |
|
|
|
# Install dependencies |
|
apt-get install -y --force-yes \ |
|
debootstrap \ |
|
gdisk \ |
|
rsync \ |
|
grub-efi-amd64-bin \ |
|
e2fsprogs |
|
|
|
# Create chroot (if requested) |
|
if [ -z "$ROOTDIR" ]; then |
|
ROOTDIR=chroot |
|
|
|
|
|
if [ ! -e "$ROOTDIR" ];then |
|
# Bootstrap minimal system |
|
debootstrap --variant=minbase focal $ROOTDIR https://mirrors.ustc.edu.cn/ubuntu |
|
fi |
|
|
|
# Install kernel and grub |
|
for d in dev sys proc; do mount --bind /$d $ROOTDIR/$d; done |
|
|
|
chroot $ROOTDIR /bin/bash -x -l -- <<'EOF' |
|
echo 'LANG="en_US.UTF-8"' > /etc/default/locale |
|
|
|
cat <<END > /etc/apt/apt.conf.d/01norecommend |
|
APT::Install-Recommends "0"; |
|
APT::Install-Suggests "0"; |
|
END |
|
|
|
|
|
cat <<END > /etc/apt/sources.list |
|
deb http://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse |
|
deb-src http://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse |
|
|
|
deb http://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse |
|
deb-src http://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse |
|
|
|
deb http://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse |
|
deb-src http://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse |
|
END |
|
|
|
apt-get update -y |
|
|
|
adduser --disabled-password --gecos "wention,,," --home /home/wention wention |
|
usermod -a -G adm,sudo wention |
|
echo "wention:wention" | chpasswd |
|
|
|
for locale in en_US.UTF-8; do locale-gen "$locale"; done |
|
|
|
ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
|
dpkg-reconfigure -f noninteractive tzdata |
|
|
|
#echo "" > /etc/hostname |
|
dbus-uuidgen > /etc/machine-id |
|
ln -fs /etc/machine-id /var/lib/dbus/machine-id |
|
|
|
# create diversion |
|
dpkg-divert --local --rename --add /sbin/initctl |
|
ln -s /bin/true /sbin/initctl |
|
|
|
|
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes \ |
|
linux-image-generic \ |
|
sudo ubuntu-minimal os-prober net-tools locales \ |
|
libterm-readline-gnu-perl systemd-sysv \ |
|
plymouth-theme-ubuntu-logo ubuntu-gnome-desktop ubuntu-gnome-wallpapers yaru-theme-* \ |
|
curl vim firefox \ |
|
grub-pc |
|
|
|
adduser --disabled-password --gecos "wention,,," --home /home/wention wention |
|
usermod -a -G adm,sudo wention |
|
echo "wention:wention" | chpasswd |
|
|
|
# remove diversion |
|
rm /sbin/initctl |
|
dpkg-divert --rename --remove /sbin/initctl |
|
|
|
|
|
cat <<END > /etc/fstab |
|
LABEL="$BOOTLABEL" / ext4 defaults 0 0 |
|
END |
|
|
|
# cleanup |
|
#apt-get clean |
|
EOF |
|
|
|
umount $ROOTDIR/{dev,proc,sys} |
|
fi |
|
|
|
# Create sparse file (if we're not dealing with a block device) |
|
if [ ! -b "${DISK}" ]; then |
|
truncate --size 30G $DISK |
|
fi |
|
|
|
# Create partition layout |
|
sgdisk --clear \ |
|
--new 1::+1M --typecode=1:ef02 --change-name=1:'BIOS boot partition' \ |
|
--new 2::+200M --typecode=2:ef00 --change-name=2:'EFI System' \ |
|
--new 3::-0 --typecode=3:8300 --change-name=3:'Linux root filesystem' \ |
|
$DISK |
|
|
|
# Loop sparse file |
|
LOOPDEV=$(losetup --find --show $DISK) |
|
partprobe ${LOOPDEV} |
|
|
|
# Create filesystems |
|
mkfs.fat -F32 ${LOOPDEV}p2 |
|
mkfs.ext4 -F -L "${BOOTLABEL}" ${LOOPDEV}p3 |
|
|
|
# Mount OS partition, copy chroot, install grub |
|
MOUNTDIR=$(mktemp -d -t demoXXXXXX) |
|
mount ${LOOPDEV}p3 ${MOUNTDIR} |
|
|
|
rsync -a ${ROOTDIR}/ ${MOUNTDIR}/ |
|
|
|
for d in dev sys proc; do mount --bind /$d ${MOUNTDIR}/$d; done |
|
chroot ${MOUNTDIR}/ grub-install --modules="ls search search_label search_fs_uuid ext2 part_gpt lvm ntfs" ${LOOPDEV} |
|
chroot ${MOUNTDIR}/ update-grub |
|
|
|
umount $MOUNTDIR/{dev,proc,sys,} |
|
rmdir $MOUNTDIR |
|
|
|
# Mount EFI partition |
|
MOUNTDIR=$(mktemp -d -t demoXXXXXX) |
|
mount ${LOOPDEV}p2 $MOUNTDIR |
|
|
|
mkdir -p ${MOUNTDIR}/EFI/BOOT |
|
grub-mkimage \ |
|
-d /usr/lib/grub/x86_64-efi \ |
|
-o ${MOUNTDIR}/EFI/BOOT/bootx64.efi \ |
|
-p /efi/boot \ |
|
-O x86_64-efi \ |
|
fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop \ |
|
efi_uga ls search search_label search_fs_uuid search_fs_file gfxterm gfxterm_background \ |
|
gfxterm_menu test all_video loadenv exfat ext2 ntfs btrfs hfsplus udf |
|
|
|
# Create grub config |
|
cat <<GRUBCFG > ${MOUNTDIR}/EFI/BOOT/grub.cfg |
|
search --label "${BOOTLABEL}" --set prefix |
|
configfile (\$prefix)/boot/grub/grub.cfg |
|
GRUBCFG |
|
|
|
umount $MOUNTDIR |
|
rmdir $MOUNTDIR |
|
|
|
# Remove loop device |
|
sync ${LOOPDEV} |
|
losetup -d ${LOOPDEV} |
|
|
|
echo "Done. ${DISK} is ready to be booted via BIOS and UEFI." |
|
|