From 236b8ddeb3bc7f35eb817769f117ecd68a59335c Mon Sep 17 00:00:00 2001 From: stedylan <836671668@qq.com> Date: Sun, 7 Aug 2022 01:47:14 +0800 Subject: [PATCH] Write a tool to support KubeOS deployment on physical machines. This tool uses dracut module to make partitions and formatting, set network infomation, get rootfs and set boot options in initramfs before switch to the real root. Signed-off-by: stedylan <836671668@qq.com> --- scripts/00bootup/Global.cfg | 12 ++ scripts/00bootup/module-setup.sh | 28 +++ scripts/00bootup/mount.sh | 332 +++++++++++++++++++++++++++++++ scripts/create/imageCreate.sh | 4 +- scripts/create/rootfsCreate.sh | 1 + scripts/rpmlist | 10 +- scripts/set_in_chroot.sh | 3 + 7 files changed, 387 insertions(+), 3 deletions(-) create mode 100644 scripts/00bootup/Global.cfg create mode 100644 scripts/00bootup/module-setup.sh create mode 100644 scripts/00bootup/mount.sh diff --git a/scripts/00bootup/Global.cfg b/scripts/00bootup/Global.cfg new file mode 100644 index 00000000..cad4e33c --- /dev/null +++ b/scripts/00bootup/Global.cfg @@ -0,0 +1,12 @@ +# rootfs file name +rootfs_name=kubeos.tar + +# select the target disk to install kubeOS +disk=/dev/sda + +# address where stores the rootfs on the http server +server_ip=192.168.1.50 + +local_ip=192.168.1.100 + +route_ip=192.168.1.1 \ No newline at end of file diff --git a/scripts/00bootup/module-setup.sh b/scripts/00bootup/module-setup.sh new file mode 100644 index 00000000..5460b2bc --- /dev/null +++ b/scripts/00bootup/module-setup.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +check() { + return 0 +} + +depends() { + echo systemd +} + +install() { + inst_multiple -o grub2-mkimage mkfs.ext4 mkfs.vfat lsblk tar cpio gunzip lspci parted dhclient ifconfig curl hwinfo head tee arch df awk route + inst_hook mount 00 "$moddir/mount.sh" + inst_simple "$moddir/mount.sh" "/mount.sh" + inst_simple "$moddir/Global.cfg" "/Global.cfg" +} + +installkernel() { + hostonly='' \ + instmods \ + =drivers/ata \ + =drivers/nvme \ + =drivers/scsi \ + =drivers/net \ + =fs/fat \ + =fs/nls +} + diff --git a/scripts/00bootup/mount.sh b/scripts/00bootup/mount.sh new file mode 100644 index 00000000..a04a364f --- /dev/null +++ b/scripts/00bootup/mount.sh @@ -0,0 +1,332 @@ +#!/bin/bash +arch=$(arch) +min_size=8 +log=/install.log + +source /Global.cfg + +function CheckSpace() { + local disk_ava="$(parted -l | grep ${disk} | awk '{print $3}')" + if echo "${disk_ava}" | grep [GT]B$; then + if echo "${disk_ava}" | grep GB$; then + disk_ava="$(echo ${disk_ava} | awk -F G '{print $1}' | awk -F . '{print $1}')" + if [ "${disk_ava}" -lt ${min_size} ]; then + echo "The available disk space is not enough, at least ${min_size}GB." | tee -a ${log} + return 1 + fi + fi + else + echo "The available disk space is not enough, at least ${min_size}G." | tee -a ${log} + return 1 + fi + + return 0 +} + +function GetDisk() { + disks=$(hwinfo --disk --short | grep -vi "^disk" | awk '{print $1}') + if [ ! -z ${disks} ]; then + if [ ! -z ${disk} ] && echo "${disks[@]}" | grep -wq "${disk}" ; then + echo "${disk} exists, start partition" | tee -a ${log} + else + echo "disk not exist, choose default disk" | tee -a ${log} + disk=$(echo ${disks[0]}) + fi + else + echo "no disk found" | tee -a ${log} + return 1 + fi + + + CheckSpace + if [ $? -ne 0 ]; then + echo "no enough space on ${disk}" | tee -a ${log} + return 1 + fi + + return 0 +} + +function PartitionAndFormatting() { + echo "Partitioning and formatting disk $disk..." + # partition and format + parted ${disk} -s mklabel gpt >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + parted ${disk} -s mkpart primary fat16 1M 100M >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + parted ${disk} -s mkpart primary ext4 100M 2600M >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + parted ${disk} -s mkpart primary ext4 2600M 5100M >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + parted ${disk} -s mkpart primary ext4 5100M 100% >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + parted ${disk} -s set 1 boot on >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + mkfs.vfat -n "BOOT" ${disk}1 >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "format failed" | tee -a ${log} + return 1 + fi + + mkfs.ext4 -L "ROOT-A" ${disk}2 >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "format failed" | tee -a ${log} + return 1 + fi + + mkfs.ext4 -L "ROOT-B" ${disk}3 >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "format failed" | tee -a ${log} + return 1 + fi + + mkfs.ext4 -L "PERSIST" ${disk}4 >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "format failed" | tee -a ${log} + return 1 + fi + + return 0 +} + +function InitNetwork() { + echo "Initializing network..." + # 获取网卡信息,默认只有一个网卡 + net_name=`ifconfig -a | awk '{print $1}' | grep : | grep '^e' | awk -F: '{print $1}'` + # dhclient --timeout 60 >> ${log} 2>&1 + + ifconfig ${net_name} up + if [ $? -ne 0 ]; then + echo "load net card failed" | tee -a ${log} + return 1 + fi + sleep 3 + + ifconfig ${net_name} ${local_ip} netmask 255.255.255.0 >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "ip set failed" | tee -a ${log} + return 1 + fi + sleep 3 + + route add default gw ${route_ip} >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "add route failed" | tee -a ${log} + return 1 + fi + sleep 3 + + + + return 0 +} + +function MountRoot() { + echo "Mounting rootfs..." + # mount rootfs + mount ${disk}2 /sysroot >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "mount rootfs failed" | tee -a ${log} + return 1 + fi + + return 0 +} + +function MountPersist() { + echo "Mounting persist" + mkdir /persist + mount ${disk}4 /persist >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "mount persist failed" | tee -a ${log} + return 1 + fi + mkdir /persist/{var,etc,etcwork} + mkdir -p /persist/etc/KubeOS/certs + return 0 +} + +function MountBoot() { + echo "Mounting boot" + mkdir -p /sysroot/boot/efi + mount ${disk}1 /sysroot/boot/efi >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "mount boot failed" | tee -a ${log} + return 1 + fi + return 0 +} + +function GetRootfs() { + echo "Downloading rootfs..." + + curl -o /persist/${rootfs_name} http://${server_ip}/${rootfs_name} + if [ ! -e "/persist/${rootfs_name}" ]; then + echo "download rootfs failed" | tee -a ${log} + return 1 + fi + + tar -xvf /persist/${rootfs_name} -C /sysroot + if [ $? -ne 0 ]; then + echo "decompose rootfs failed" | tee -a ${log} + return 1 + fi + + rm -rf /persist/${rootfs_name} + + return 0 +} + +function Inst_Grub2_x86() { + # copy the files that boot need + cp -r /sysroot/usr/lib/grub/x86_64-efi /sysroot/boot/efi/EFI/openEuler + eval "grub2-mkimage -d /sysroot/usr/lib/grub/x86_64-efi -O x86_64-efi --output=/sysroot/boot/efi/EFI/openEuler/grubx64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "grub2-mkimage on x86 failed" | tee -a ${log} + return 1 + fi + + mkdir -p /sysroot/boot/efi/EFI/BOOT/ + cp -f /sysroot/boot/efi/EFI/openEuler/grubx64.efi /sysroot/boot/efi/EFI/BOOT/BOOTX64.EFI + + return 0 +} + +function Inst_Grub2_aarch64() { + cp -r /sysroot/usr/lib/grub/arm64-efi /sysroot/boot/efi/EFI/openEuler/ + eval "grub2-mkimage -d /sysroot/usr/lib/grub/arm64-efi -O arm64-efi --output=/sysroot/boot/efi/EFI/openEuler/grubaa64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "grub2-mkimage on aarch64 failed" | tee -a ${log} + return 1 + fi + + mkdir -p /sysroot/boot/efi/EFI/BOOT/ + cp -f /sysroot/boot/efi/EFI/openEuler/grubaa64.efi /sysroot/boot/efi/EFI/BOOT/BOOTAA64.EFI + + return 0 +} + +function SetBoot() { + # mount boot + echo "Setting boot" + + if [ $arch == "x86_64" ]; then + Inst_Grub2_x86 + if [ $? -ne 0 ]; then + echo "install grub on x86 failed" | tee -a ${log} + return 1 + fi + fi + + if [ $arch == "aarch64" ]; then + Inst_Grub2_aarch64 + if [ $? -ne 0 ]; then + echo "install grub on aarch64 failed" | tee -a ${log} + return 1 + fi + fi + + return 0 +} + +function Bootup_Main() { + # get disk + echo "Checking disk info..." | tee -a ${log} + GetDisk + if [ $? -ne 0 ]; then + echo "Checking disk info failed" | tee -a ${log} + return 1 + fi + + # partition and format disk + echo "Partion and formatting..." | tee -a ${log} + PartitionAndFormatting + if [ $? -ne 0 ]; then + echo "Partition and formatting disk failed" | tee -a ${log} + return 1 + fi + + # init network + echo "Initializing network..." | tee -a ${log} + InitNetwork + if [ $? -ne 0 ]; then + echo "Initializing network failed" | tee -a ${log} + return 1 + fi + + # mount partitions + echo "Mounting root..." | tee -a ${log} + MountRoot + if [ $? -ne 0 ]; then + echo "Mounting root failed" | tee -a ${log} + return 1 + fi + + # mount persist + echo "Mounting persisst..." | tee -a ${log} + MountPersist + if [ $? -ne 0 ]; then + echo "Mounting persist failed" | tee -a ${log} + return 1 + fi + + # mount boot + echo "Mounting boot..." | tee -a ${log} + MountBoot + if [ $? -ne 0 ]; then + echo "Mounting boot failed" | tee -a ${log} + return 1 + fi + + # download rootfs + echo "Downloading rootfs..." | tee -a ${log} + GetRootfs + if [ $? -ne 0 ]; then + echo "Downloading rootfs failed" | tee -a ${log} + return 1 + fi + + # set boot + echo "Setting boot..." | tee -a ${log} + SetBoot + if [ $? -ne 0 ]; then + echo "Setting boot failed" | tee -a ${log} + return 1 + fi + + return 0 +} + +Bootup_Main +ret=$? +if [ ${ret} -eq 0 ]; then + echo "kubeOS install success! switch to root" | tee -a ${log} + cp ${log} /persist +else + echo "kubeOS install failed, see install.log" | tee -a ${log} +fi + diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index f8dafbe0..95ebcde8 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -62,12 +62,12 @@ function create_pxe_img() { case $opt in "repo") create_os_tar_from_repo "$@" - tar -xvf os.tar ./boot/initramfs.img + tar -xvf os.tar ./initramfs.img tar -xvf os.tar ./boot/vmlinuz ;; "docker") create_os_tar_from_docker "$@" - tar -xvf os.tar boot/initramfs.img + tar -xvf os.tar initramfs.img tar -xvf os.tar boot/vmlinuz ;; esac diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 8049f093..e5c53d53 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -61,6 +61,7 @@ EOF mv "${RPM_ROOT}"/boot/initramfs* "${RPM_ROOT}/boot/initramfs.img" cp grub.cfg "${RPM_ROOT}"/boot/grub2 cp grub.cfg "${RPM_ROOT}"/boot/efi/EFI/openEuler + cp -r ./00bootup ${RPM_ROOT}/usr/lib/dracut/modules.d/ cp set_in_chroot.sh "${RPM_ROOT}" ROOT_PWD="${PASSWD}" chroot "${RPM_ROOT}" bash /set_in_chroot.sh rm "${RPM_ROOT}/set_in_chroot.sh" diff --git a/scripts/rpmlist b/scripts/rpmlist index 7a9adfac..077a1642 100644 --- a/scripts/rpmlist +++ b/scripts/rpmlist @@ -13,4 +13,12 @@ socat conntrack-tools ebtables ethtool -rsyslog \ No newline at end of file +rsyslog +vi +net-tools +hwinfo +dracut +coreutils +gawk +parted +dosfstools \ No newline at end of file diff --git a/scripts/set_in_chroot.sh b/scripts/set_in_chroot.sh index bacef789..4b061df6 100644 --- a/scripts/set_in_chroot.sh +++ b/scripts/set_in_chroot.sh @@ -11,3 +11,6 @@ sed -i '/^root:/d' /etc/shadow_bak echo "root:"${ROOT_PWD}${str:1} > /etc/shadow cat /etc/shadow_bak >> /etc/shadow rm -rf /etc/shadow_bak + +dracut -f -v --add bootup /initramfs.img --kver `ls /lib/modules` +rm -rf /usr/lib/dracut/modules.d/00bootup \ No newline at end of file -- Gitee