Skip to content

Instantly share code, notes, and snippets.

@wention
Last active March 1, 2022 09:19
Show Gist options
  • Select an option

  • Save wention/1e4b663c7b2599e2fe517fa83d036ffd to your computer and use it in GitHub Desktop.

Select an option

Save wention/1e4b663c7b2599e2fe517fa83d036ffd to your computer and use it in GitHub Desktop.
Build custum ubuntu with bios/efi bootable

Prepare

sudo apt-get install \
    binutils \
    debootstrap \
    squashfs-tools \
    xorriso \
    grub-pc-bin \
    grub-efi-amd64-bin \
    mtools

create base system

sudo debootstrap \
   --arch=amd64 \
   --variant=minbase \
   focal \
   chroot \
   http://cn.archive.ubuntu.com/ubuntu/

Install systemd

apt-get install -y libterm-readline-gnu-perl systemd-sysv

Configure machine-id and divert

dbus-uuidgen > /etc/machine-id

ln -fs /etc/machine-id /var/lib/dbus/machine-id
#!/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."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment