From 447c926fe4a8f0f694899882bde6a2ba58309750 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 31 Jul 2024 17:41:08 +0800 Subject: [PATCH 001/116] Lint for kbimg --- scripts/00bootup/module-setup.sh | 16 ++-- scripts/00bootup/mount.sh | 149 +++++++++++++++++++------------ scripts/bootloader.sh | 12 +-- scripts/common/log.sh | 10 ++- scripts/common/utils.sh | 36 +++++--- scripts/create/imageCreate.sh | 22 ++--- scripts/create/rootfsCreate.sh | 36 +++++--- scripts/kbimg.sh | 43 ++++----- scripts/set_in_chroot.sh | 6 +- 9 files changed, 190 insertions(+), 140 deletions(-) diff --git a/scripts/00bootup/module-setup.sh b/scripts/00bootup/module-setup.sh index 5460b2bc..a167c7bf 100644 --- a/scripts/00bootup/module-setup.sh +++ b/scripts/00bootup/module-setup.sh @@ -16,13 +16,13 @@ install() { } installkernel() { - hostonly='' \ - instmods \ - =drivers/ata \ - =drivers/nvme \ - =drivers/scsi \ - =drivers/net \ - =fs/fat \ - =fs/nls + 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 index 7f00fd6a..a9eacdad 100644 --- a/scripts/00bootup/mount.sh +++ b/scripts/00bootup/mount.sh @@ -3,13 +3,14 @@ arch=$(arch) min_size=8 log=/install.log -source /Global.cfg +source 00bootup/Global.cfg function CheckSpace() { - local disk_ava="$(parted -l | grep ${disk} | awk '{print $3}')" - if echo "${disk_ava}" | grep [GT]B$; then + local disk_ava + 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}')" + 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 @@ -32,7 +33,7 @@ function mount_proc_dev_sys() { } function GetDisk() { - disks=(`hwinfo --disk --short 2>&1 | grep -vi "^disk" | awk '{print $1}'`) + mapfile -t disks < <(hwinfo --disk --short 2>&1 | grep -vi "^disk" | awk '{print $1}') if [ ${#disks[*]} -gt 0 ]; then if [ -n "${disk}" ] && echo "${disks[@]}" | grep -wq "${disk}" ; then echo "${disk} exists, start partition" | tee -a ${log} @@ -44,7 +45,8 @@ function GetDisk() { return 1 fi CheckSpace - if [ $? -ne 0 ]; then + local status=$? + if [ $status -ne 0 ]; then echo "no enough space on ${disk}" | tee -a ${log} return 1 fi @@ -55,62 +57,72 @@ function GetDisk() { function PartitionAndFormatting() { echo "Partitioning and formatting disk $disk..." # partition and format - parted ${disk} -s mklabel gpt >> ${log} 2>&1 - if [ $? -ne 0 ]; then + parted "${disk}" -s mklabel gpt >> ${log} 2>&1 + local status=$? + if [ $status -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 + parted "${disk}" -s mkpart primary fat16 1M 100M >> ${log} 2>&1 + local status=$? + if [ $status -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 + parted "${disk}" -s mkpart primary ext4 100M 2600M >> ${log} 2>&1 + local status=$? + if [ $status -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 + parted "${disk}" -s mkpart primary ext4 2600M 5100M >> ${log} 2>&1 + local status=$? + if [ $status -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 + parted "${disk}" -s mkpart primary ext4 5100M 100% >> ${log} 2>&1 + local status=$? + if [ $status -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 + parted "${disk}" -s set 1 boot on >> ${log} 2>&1 + local status=$? + if [ $status -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 + mkfs.vfat -n "BOOT" "${disk}"1 >> ${log} 2>&1 + local status=$? + if [ $status -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 + mkfs.ext4 -L "ROOT-A" "${disk}"2 >> ${log} 2>&1 + local status=$? + if [ $status -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 + mkfs.ext4 -L "ROOT-B" "${disk}"3 >> ${log} 2>&1 + local status=$? + if [ $status -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 + mkfs.ext4 -L "PERSIST" "${disk}"4 >> ${log} 2>&1 + local status=$? + if [ $status -ne 0 ]; then echo "format failed" | tee -a ${log} return 1 fi @@ -120,7 +132,7 @@ function PartitionAndFormatting() { function InitNetwork() { echo "Initializing network..." - netNames=(`ifconfig -a | awk '{print $1}' | grep : | grep '^e' | awk -F: '{print $1}'`) + mapfile -t netNames < <(ifconfig -a | awk '{print $1}' | grep : | grep '^e' | awk -F: '{print $1}') if [ ${#netNames[*]} -gt 0 ]; then if [ -n "${net_name}" ] && echo "${netNames[@]}" | grep -wq "${net_name}" ; then echo "${net_name} exists, start set ip" | tee -a ${log} @@ -133,22 +145,25 @@ function InitNetwork() { return 1 fi - ifconfig ${net_name} up - if [ $? -ne 0 ]; then + ifconfig "${net_name}" up + local status=$? + if [ $status -ne 0 ]; then echo "load net card failed" | tee -a ${log} return 1 fi sleep 3 - ifconfig ${net_name} ${local_ip} netmask ${netmask} >> ${log} 2>&1 - if [ $? -ne 0 ]; then + ifconfig "${net_name}" "${local_ip}" netmask "${netmask}" >> ${log} 2>&1 + local status=$? + if [ $status -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 + route add default gw "${route_ip}" >> ${log} 2>&1 + local status=$? + if [ $status -ne 0 ]; then echo "add route failed" | tee -a ${log} return 1 fi @@ -159,8 +174,9 @@ function InitNetwork() { function MountRoot() { echo "Mounting rootfs..." # mount rootfs - mount ${disk}2 /sysroot >> ${log} 2>&1 - if [ $? -ne 0 ]; then + mount "${disk}"2 /sysroot >> ${log} 2>&1 + local status=$? + if [ $status -ne 0 ]; then echo "mount rootfs failed" | tee -a ${log} return 1 fi @@ -170,8 +186,9 @@ function MountRoot() { function MountPersist() { echo "Mounting persist" - mount ${disk}4 /sysroot/persist >> ${log} 2>&1 - if [ $? -ne 0 ]; then + mount "${disk}"4 /sysroot/persist >> ${log} 2>&1 + local status=$? + if [ $status -ne 0 ]; then echo "mount persist failed" | tee -a ${log} return 1 fi @@ -183,8 +200,9 @@ function MountPersist() { function MountBoot() { echo "Mounting boot" mkdir -p /sysroot/boot/efi - mount ${disk}1 /sysroot/boot/efi >> ${log} 2>&1 - if [ $? -ne 0 ]; then + mount "${disk}"1 /sysroot/boot/efi >> ${log} 2>&1 + local status=$? + if [ $status -ne 0 ]; then echo "mount boot failed" | tee -a ${log} return 1 fi @@ -194,20 +212,21 @@ function MountBoot() { function GetRootfs() { echo "Downloading rootfs..." - curl -o /${rootfs_name} http://${server_ip}/${rootfs_name} + curl -o /"${rootfs_name}" http://"${server_ip}"/"${rootfs_name}" if [ ! -e "/${rootfs_name}" ]; then echo "download rootfs failed" | tee -a ${log} return 1 fi - tar -xf /${rootfs_name} -C /sysroot - if [ $? -ne 0 ]; then + tar -xf /"${rootfs_name}" -C /sysroot + local status=$? + if [ $status -ne 0 ]; then echo "decompose rootfs failed" | tee -a ${log} return 1 fi - rm -rf /${rootfs_name} - mount -o remount,ro ${disk}2 /sysroot >> ${log} 2>&1 + rm -rf "${rootfs_name:?}" + mount -o remount,ro "${disk}"2 /sysroot >> ${log} 2>&1 return 0 } @@ -215,7 +234,8 @@ 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 + local status=$? + if [ $status -ne 0 ]; then echo "grub2-mkimage on x86 failed" | tee -a ${log} return 1 fi @@ -229,7 +249,8 @@ function Inst_Grub2_x86() { 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 + local status=$? + if [ $status -ne 0 ]; then echo "grub2-mkimage on aarch64 failed" | tee -a ${log} return 1 fi @@ -244,22 +265,24 @@ function SetBoot() { # mount boot echo "Setting boot" - if [ $arch == "x86_64" ]; then + if [ "$arch" == "x86_64" ]; then Inst_Grub2_x86 - if [ $? -ne 0 ]; then + local status=$? + if [ $status -ne 0 ]; then echo "install grub on x86 failed" | tee -a ${log} return 1 fi fi - if [ $arch == "aarch64" ]; then + if [ "$arch" == "aarch64" ]; then Inst_Grub2_aarch64 - if [ $? -ne 0 ]; then + local status=$? + if [ $status -ne 0 ]; then echo "install grub on aarch64 failed" | tee -a ${log} return 1 fi fi - sed -i 's#/dev/sda#'${disk}'#g' /sysroot/boot/efi/EFI/openEuler/grub.cfg + sed -i 's#/dev/sda#'"${disk}"'#g' /sysroot/boot/efi/EFI/openEuler/grub.cfg return 0 } @@ -268,7 +291,8 @@ function Bootup_Main() { # get disk echo "Checking disk info..." | tee -a ${log} GetDisk - if [ $? -ne 0 ]; then + local status=$? + if [ $status -ne 0 ]; then echo "Checking disk info failed" | tee -a ${log} return 1 fi @@ -276,7 +300,8 @@ function Bootup_Main() { # partition and format disk echo "Partion and formatting..." | tee -a ${log} PartitionAndFormatting - if [ $? -ne 0 ]; then + local status=$? + if [ $status -ne 0 ]; then echo "Partition and formatting disk failed" | tee -a ${log} return 1 fi @@ -284,7 +309,8 @@ function Bootup_Main() { # init network echo "Initializing network..." | tee -a ${log} InitNetwork - if [ $? -ne 0 ]; then + local status=$? + if [ $status -ne 0 ]; then echo "Initializing network failed" | tee -a ${log} return 1 fi @@ -294,14 +320,16 @@ function Bootup_Main() { # mount boot echo "Mounting root..." | tee -a ${log} MountRoot - if [ $? -ne 0 ]; then + local status=$? + if [ $status -ne 0 ]; then echo "Mounting root failed" | tee -a ${log} return 1 fi echo "Mounting boot..." | tee -a ${log} MountBoot - if [ $? -ne 0 ]; then + local status=$? + if [ $status -ne 0 ]; then echo "Mounting boot failed" | tee -a ${log} return 1 fi @@ -309,7 +337,8 @@ function Bootup_Main() { # download rootfs echo "Downloading rootfs..." | tee -a ${log} GetRootfs - if [ $? -ne 0 ]; then + local status=$? + if [ $status -ne 0 ]; then echo "Downloading rootfs failed" | tee -a ${log} return 1 fi @@ -317,14 +346,16 @@ function Bootup_Main() { # set boot echo "Setting boot..." | tee -a ${log} SetBoot - if [ $? -ne 0 ]; then + local status=$? + if [ $status -ne 0 ]; then echo "Setting boot failed" | tee -a ${log} return 1 fi # mount persist echo "Mounting persist..." | tee -a ${log} MountPersist - if [ $? -ne 0 ]; then + local status=$? + if [ $status -ne 0 ]; then echo "Mounting persist failed" | tee -a ${log} return 1 fi diff --git a/scripts/bootloader.sh b/scripts/bootloader.sh index df4be329..fdab587f 100644 --- a/scripts/bootloader.sh +++ b/scripts/bootloader.sh @@ -2,7 +2,7 @@ set -eu set -o pipefail set -x -ARCH=`arch` +ARCH=$(arch) function install_grub2_x86 () { @@ -10,10 +10,10 @@ function install_grub2_x86 () # make boot.img/core.img and setup, to support legacy boot mode GRUBNAME=$(which grub2-install) echo "Installing GRUB2..." - GRUB_OPTS=${GRUB_OPTS:-"--force"} - GRUB_OPTS="$GRUB_OPTS --target=i386-pc" + FORCE_OPT=${FORCE_OPT:-"--force"} + TARGET_OPT=${TARGET_OPT:-"--target=i386-pc"} - $GRUBNAME --modules="biosdisk part_msdos" $GRUB_OPTS $DEVICE + $GRUBNAME --modules="biosdisk part_msdos" "$FORCE_OPT" "$TARGET_OPT" "$DEVICE" else # make efi file, and save in FAT16 partition, to support UEFI boot mode cp -r /usr/lib/grub/x86_64-efi boot/efi/EFI/openEuler @@ -33,10 +33,10 @@ function install_grub2_efi () cp -f /boot/efi/EFI/openEuler/grubaa64.efi /boot/efi/EFI/BOOT/BOOTAA64.EFI } -if [ $ARCH == "x86_64" ]; then +if [ "$ARCH" == "x86_64" ]; then install_grub2_x86 fi -if [ $ARCH == "aarch64" ]; then +if [ "$ARCH" == "aarch64" ]; then install_grub2_efi fi diff --git a/scripts/common/log.sh b/scripts/common/log.sh index 4d3ed2b7..1d3696e6 100644 --- a/scripts/common/log.sh +++ b/scripts/common/log.sh @@ -10,11 +10,13 @@ ## See the Mulan PSL v2 for more details. function log_error_print(){ - local logmsg="[ ERROR ] - ""`date "+%b %d %Y %H:%M:%S"`"" $1" - echo $logmsg + local logmsg + logmsg="[ ERROR ] - ""$(date "+%b %d %Y %H:%M:%S")"" $1" + echo "$logmsg" } function log_info_print(){ - local logmsg="[ INFO ] - ""`date "+%b %d %Y %H:%M:%S"`"" $1" - echo $logmsg + local logmsg + logmsg="[ INFO ] - ""$(date "+%b %d %Y %H:%M:%S")"" $1" + echo "$logmsg" } diff --git a/scripts/common/utils.sh b/scripts/common/utils.sh index ec244b78..68932070 100644 --- a/scripts/common/utils.sh +++ b/scripts/common/utils.sh @@ -11,6 +11,8 @@ CHECK_REGEX='\||;|&|&&|\|\||>|>>|<|,|#|!|\$' +source 00bootup/Global.cfg + function mount_proc_dev_sys() { local tmp_root=$1 mount -t proc none "${tmp_root}/proc" @@ -31,8 +33,10 @@ function unmount_dir() { return 0 fi - local real_dir=$(readlink -e "${dir}") - local mnts=$(awk '{print $2}' < /proc/mounts | grep "^${real_dir}" | sort -r) + local real_dir + real_dir=$(readlink -e "${dir}") + local mnts + mnts=$(awk '{print $2}' < /proc/mounts | grep "^${real_dir}" | sort -r) for m in ${mnts}; do log_info_print "Unmount ${m}" umount -f "${m}" || true @@ -42,13 +46,16 @@ function unmount_dir() { } function init_part() { - local offset=$(fdisk -l system.img | grep $1 | awk '{print $2}') - local sizelimit=$(fdisk -l system.img | grep $1 | awk '{print $3}') + local offset + offset=$(fdisk -l system.img | grep "$1" | awk '{print $2}') + local sizelimit + sizelimit=$(fdisk -l system.img | grep "$1" | awk '{print $3}') sizelimit=$(echo "($sizelimit - $offset)*512" | bc) offset=$(echo "${offset}*512" | bc) - local loop=$(losetup -f) + local loop + loop=$(losetup -f) losetup -o "${offset}" --sizelimit "${sizelimit}" "${loop}" system.img - if [ $2 == "BOOT" ];then + if [ "$2" == "BOOT" ];then mkfs.vfat -n "$2" "${loop}" mount -t vfat "${loop}" "$3" else @@ -102,13 +109,13 @@ function check_file_valid() { function check_conf_valid() { local conf_path="${PWD}/00bootup/Global.cfg" - check_file_valid ${conf_path} "Globab.cfg" + check_file_valid "${conf_path}" "Globab.cfg" if [ $# != 7 ];then log_error_print "configure configured in Global.cfg is empty." exit 3 fi for addr in ${server_ip} ${local_ip} ${route_ip} ${netmask}; do - check_ip_valid $addr + check_ip_valid "$addr" done } @@ -118,8 +125,8 @@ function check_ip_valid() { log_error_print "ip address configured in Global.cfg is not valid." exit 3; fi - for quad in $(echo "${ipaddr//./ }"); do - if [ $quad -ge 0 ] && [ $quad -le 255 ];then + for quad in ${ipaddr//./ }; do + if [ "$quad" -ge 0 ] && [ "$quad" -le 255 ];then continue fi log_error_print "ip address configured in Global.cfg is not valid." @@ -133,7 +140,7 @@ function check_binary_exist() { } function check_repo_path() { - check_file_valid $1 "REPO file" + check_file_valid "$1" "REPO file" if [ -d "${RPM_ROOT}" ]; then log_error_print "there is a rootfs folder. please confirm if rootfs is being used, if not, please remove ${RPM_ROOT} first." exit 5 @@ -141,7 +148,8 @@ function check_repo_path() { } function check_disk_space() { - local disk_ava="$(df ${PWD} | awk 'NR==2{print}' | awk '{print $4}')" + local disk_ava + disk_ava="$(df "${PWD}" | awk 'NR==2{print}' | awk '{print $4}')" case $1 in docker) local maxsize=$((6*1024*1024)) @@ -180,12 +188,12 @@ function check_param() { } function check_docker_exist() { - if [[ "$(docker images -q $1 2> /dev/null)" == "" ]]; then + if [[ "$(docker images -q "$1" 2> /dev/null)" == "" ]]; then log_error_print "docker is not exist please pull $1 first " exit 9 fi } function check_docker_file() { - check_file_valid $1 "admin-container Dockerfile" + check_file_valid "$1" "admin-container Dockerfile" } \ No newline at end of file diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index 4d02f9d1..b939ec74 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -10,7 +10,6 @@ ## See the Mulan PSL v2 for more details. TMP_MOUNT_PATH="${PWD}/mnt" -RPM_ROOT="${PWD}/rootfs" IMG_SIZE=20 PWD="$(pwd)" function create_img() { @@ -29,21 +28,22 @@ function create_img() { parted system.img -s mkpart primary ext4 60MiB 2160MiB parted system.img -s mkpart primary ext4 2160MiB 4260MiB parted system.img -s mkpart primary ext4 4260MiB 100% - local device=$(losetup -f) + local device + device=$(losetup -f) losetup "${device}" system.img mkdir -p "${TMP_MOUNT_PATH}" init_part system.img2 ROOT-A "${TMP_MOUNT_PATH}" - mkdir -p ${BOOT_PATH} - chmod 755 ${BOOT_PATH} + mkdir -p "${BOOT_PATH}" + chmod 755 "${BOOT_PATH}" if [ "$BOOT_MODE" = "legacy" ]; then init_part system.img1 GRUB2 "${BOOT_PATH}" else init_part system.img1 BOOT "${BOOT_PATH}" fi - tar -x -C ${TMP_MOUNT_PATH} -f os.tar + tar -x -C "${TMP_MOUNT_PATH}" -f os.tar if [ "$BOOT_MODE" = "legacy" ]; then sed -i "s/insmod part_gpt/insmod part_msdos/g; \ s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ @@ -64,8 +64,8 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ umount "${TMP_MOUNT_PATH}" init_part system.img4 PERSIST "${TMP_MOUNT_PATH}" - mkdir ${TMP_MOUNT_PATH}/{var,etc,etcwork} - mkdir -p ${TMP_MOUNT_PATH}/etc/KubeOS/certs + mkdir "${TMP_MOUNT_PATH}"/{var,etc,etcwork} + mkdir -p "${TMP_MOUNT_PATH}"/etc/KubeOS/certs umount "${TMP_MOUNT_PATH}" losetup -D @@ -92,7 +92,7 @@ function create_pxe_img() { function create_docker_image() { local DOCKER_IMG="$6" create_os_tar_from_repo "$@" - docker build -t ${DOCKER_IMG} -f ./Dockerfile . + docker build -t "${DOCKER_IMG}" -f ./Dockerfile . } function create_vm_img() { @@ -116,7 +116,7 @@ function create_admin_img() { local DOCKERFILE="$1" local DOCKER_IMG="$2" local ADMIN_CONTAINER_DIR="$3" - cp ../bin/hostshell ${ADMIN_CONTAINER_DIR} - docker build -t ${DOCKER_IMG} -f ${DOCKERFILE} ${ADMIN_CONTAINER_DIR} - rm -rf ${ADMIN_CONTAINER_DIR}/hostshell + cp ../bin/hostshell "${ADMIN_CONTAINER_DIR}" + docker build -t "${DOCKER_IMG}" -f "${DOCKERFILE}" "${ADMIN_CONTAINER_DIR}" + rm -rf "${ADMIN_CONTAINER_DIR}"/hostshell } \ No newline at end of file diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 377cbf85..aac24985 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -17,33 +17,41 @@ function prepare_yum() { mount_proc_dev_sys "${RPM_ROOT}" # init yum repo local iso_repo="${RPM_ROOT}/etc/yum.repos.d/iso.repo" - cat "${REPO}" > ${RPM_ROOT}/etc/yum.repos.d/iso.repo + cat "${REPO}" > "$iso_repo" } function install_packages() { local REPO=$1 local BOOT_MODE=$2 - prepare_yum ${REPO} + prepare_yum "${REPO}" echo "install package.." - local filesize=$(stat -c "%s" ./rpmlist) + local filesize + filesize=$(stat -c "%s" ./rpmlist) local maxsize=$((1024*1024)) if [ "${filesize}" -gt "${maxsize}" ]; then echo "please check if rpmlist is too big or something wrong" exit 7 fi - local rpms=$(cat ./rpmlist | tr "\n" " ") + local rpms_name + rpms_name=$(tr "\n" " " < ./rpmlist) + old_ifs="$IFS" + IFS=' ' if [ "${ARCH}" == "x86_64" ]; then if [ "${BOOT_MODE}" = "legacy" ]; then - rpms+=" grub2" + rpms_name+=" grub2" else - rpms+=" grub2-efi grub2-tools grub2-efi-x64-modules grub2-pc-modules" + rpms_name+=" grub2-efi grub2-tools grub2-efi-x64-modules grub2-pc-modules" fi - yum -y --installroot="${RPM_ROOT}" install --nogpgcheck --setopt install_weak_deps=False ${rpms} + read -ra rpms <<< "${rpms_name}" + IFS="$old_ifs" + yum -y --installroot="${RPM_ROOT}" install --nogpgcheck --setopt install_weak_deps=False "${rpms[@]}" elif [ "${ARCH}" == "aarch64" ]; then - yum -y --installroot="${RPM_ROOT}" install --nogpgcheck --setopt install_weak_deps=False ${rpms} grub2-efi grub2-tools grub2-efi-aa64-modules + read -ra rpms <<< "${rpms_name}" + IFS="$old_ifs" + yum -y --installroot="${RPM_ROOT}" install --nogpgcheck --setopt install_weak_deps=False "${rpms[@]}" grub2-efi grub2-tools grub2-efi-aa64-modules fi yum -y --installroot="${RPM_ROOT}" clean all } @@ -76,7 +84,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ else cp grub.cfg "${RPM_ROOT}"/boot/efi/EFI/openEuler fi - cp -r ./00bootup ${RPM_ROOT}/usr/lib/dracut/modules.d/ + cp -r ./00bootup "${RPM_ROOT}"/usr/lib/dracut/modules.d/ cp set_in_chroot.sh "${RPM_ROOT}" ROOT_PWD="${PASSWD}" BOOT_MODE="${BOOT_MODE}" chroot "${RPM_ROOT}" bash /set_in_chroot.sh rm "${RPM_ROOT}/set_in_chroot.sh" @@ -91,15 +99,15 @@ function create_os_tar_from_repo() { local AGENT_PATH=$3 local PASSWD=$4 local BOOT_MODE=$5 - install_packages ${REPO} ${BOOT_MODE} - install_misc ${VERSION} ${AGENT_PATH} ${PASSWD} ${BOOT_MODE} + install_packages "${REPO}" "${BOOT_MODE}" + install_misc "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" unmount_dir "${RPM_ROOT}" tar -C "$RPM_ROOT" -cf ./os.tar . } function create_os_tar_from_docker() { local DOCKER_IMG=$1 - container_id=$(docker create ${DOCKER_IMG}) + container_id=$(docker create "${DOCKER_IMG}") echo "$container_id" - docker cp $container_id:/os.tar ./ - docker rm $container_id + docker cp "$container_id":/os.tar ./ + docker rm "$container_id" } diff --git a/scripts/kbimg.sh b/scripts/kbimg.sh index 0f75f0db..1dea6f64 100644 --- a/scripts/kbimg.sh +++ b/scripts/kbimg.sh @@ -11,7 +11,6 @@ set -e -NAME=KubeOS REPO="" VERSION="" AGENT_PATH="" @@ -116,8 +115,9 @@ function file_lock() { function test_lock() { file_lock "${LOCK}" - if [ $? -ne 0 ]; then - log_error_print "There is already an generate process running." + local status=$? + if [ $status -ne 0 ]; then + log_error_print "There is already an generate process running." exit 203 fi } @@ -142,7 +142,8 @@ function verify_upgrade_image_input() { for i in "p" "v" "b" "e" "d" do echo "$@" | grep -q "\-$i " - if [ "$?" -ne 0 ];then + local status=$? + if [ "$status" -ne 0 ];then log_error_print "option -$i is mandatory, please check input" show_upgrade_image_usage exit 3 @@ -153,15 +154,15 @@ function verify_upgrade_image_input() { do case $opt in p) - check_param $OPTARG + check_param "$OPTARG" REPO="$OPTARG" ;; v) - check_param $OPTARG + check_param "$OPTARG" VERSION="$OPTARG" ;; b) - check_param $OPTARG + check_param "$OPTARG" AGENT_PATH="$OPTARG" ;; e) @@ -169,7 +170,7 @@ function verify_upgrade_image_input() { PASSWD="$OPTARG" ;; d) - check_param $OPTARG + check_param "$OPTARG" DOCKER_IMG="$OPTARG" ;; l) @@ -189,7 +190,8 @@ function verify_repo_input() { for i in "p" "v" "b" "e" do echo "$@" | grep -q "\-$i " - if [ "$?" -ne 0 ];then + local status=$? + if [ "$status" -ne 0 ];then log_error_print "option -$i is mandatory, please check input" show_vm_pxe_image_usage exit 3 @@ -200,15 +202,15 @@ function verify_repo_input() { do case $opt in p) - check_param $OPTARG + check_param "$OPTARG" REPO="$OPTARG" ;; v) - check_param $OPTARG + check_param "$OPTARG" VERSION="$OPTARG" ;; b) - check_param $OPTARG + check_param "$OPTARG" AGENT_PATH="$OPTARG" ;; e) @@ -228,12 +230,12 @@ function verify_repo_input() { } function verify_docker_input() { - if [ $1 != "-d" ]; then + if [ "$1" != "-d" ]; then log_error_print "option $1 not found" show_vm_pxe_image_usage exit 3 fi - check_param $2 + check_param "$2" DOCKER_IMG=$2 } @@ -242,7 +244,8 @@ function verify_admin_input() { for i in "f" "d" do echo "$@" | grep -q "\-$i " - if [ "$?" -ne 0 ];then + local status=$? + if [ "$status" -ne 0 ];then log_error_print "option -$i is mandatory, please check input" show_admin_image_usage exit 3 @@ -253,11 +256,11 @@ function verify_admin_input() { do case $opt in f) - check_param $OPTARG + check_param "$OPTARG" DOCKERFILE="$OPTARG" ;; d) - check_param $OPTARG + check_param "$OPTARG" DOCKER_IMG="$OPTARG" ;; *) @@ -270,7 +273,6 @@ function verify_admin_input() { } function verify_create_input() { - local ret= local cmd=$1 case $1 in "upgrade-image") @@ -325,7 +327,7 @@ function verify_create_input() { fi fi check_disk_space "pxe" - check_conf_valid ${rootfs_name} ${disk} ${server_ip} ${local_ip} ${route_ip} ${netmask} ${net_name} + check_conf_valid "${rootfs_name}" "${disk}" "${server_ip}" "${local_ip}" "${route_ip}" "${netmask}" "${net_name}" if [ $# -eq 8 ]; then verify_repo_input "$@" check_repo_path "${REPO}" @@ -369,7 +371,6 @@ function verify_create_input() { } function kubeos_image_main() { - local ret= local cmd=$1 if [ "$#" -eq 1 ]; then case $1 in @@ -377,7 +378,7 @@ function kubeos_image_main() { show_options exit 0;; *) - log_error_print "params is invalid,please check it." + log_error_print "params is invalid, please check it." show_options exit 3;; esac diff --git a/scripts/set_in_chroot.sh b/scripts/set_in_chroot.sh index 80b5a91b..380ff28a 100644 --- a/scripts/set_in_chroot.sh +++ b/scripts/set_in_chroot.sh @@ -8,13 +8,13 @@ else fi ln -s /usr/lib/systemd/system/etc.mount /lib/systemd/system/local-fs.target.wants/etc.mount -str=`sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{print $2}'` +str=$(sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{print $2}') umask 0666 mv /etc/shadow /etc/shadow_bak sed -i '/^root:/d' /etc/shadow_bak -echo "root:"${ROOT_PWD}${str:1} > /etc/shadow +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` +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 From 123b5f63bb5ea2662706edcbd7f1eedc7faa854f Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 1 Aug 2024 10:14:42 +0800 Subject: [PATCH 002/116] modify module-setup.sh --- scripts/00bootup/module-setup.sh | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/scripts/00bootup/module-setup.sh b/scripts/00bootup/module-setup.sh index a167c7bf..75b33ab3 100644 --- a/scripts/00bootup/module-setup.sh +++ b/scripts/00bootup/module-setup.sh @@ -17,12 +17,6 @@ install() { installkernel() { hostonly='' - instmods - drivers/ata \ - drivers/nvme \ - drivers/scsi \ - drivers/net \ - fs/fat \ - fs/nls + instmods='drivers/ata drivers/nvme drivers/scsi drivers/net fs/fat fs/nls' } -- Gitee From 83bbb0a83643bcf0ea393b0106617f7aed20d8b2 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 1 Aug 2024 16:19:12 +0800 Subject: [PATCH 003/116] add copy file --- scripts/common/utils.sh | 13 +++ scripts/create/imageCreate.sh | 3 +- scripts/create/rootfsCreate.sh | 13 ++- scripts/kbimg.sh | 147 +++++++++++++++++++++++++-------- 4 files changed, 138 insertions(+), 38 deletions(-) diff --git a/scripts/common/utils.sh b/scripts/common/utils.sh index 68932070..97124822 100644 --- a/scripts/common/utils.sh +++ b/scripts/common/utils.sh @@ -107,6 +107,19 @@ function check_file_valid() { fi } +function check_dir_valid() { + local dir="$1" + local mesg="$2" + if [ ! -e "${dir}" ]; then + log_error_print "${mesg} is not exist." + exit 3 + fi + if [ ! -d "${dir}" ]; then + log_error_print "${mesg} is not a directory." + exit 3 + fi +} + function check_conf_valid() { local conf_path="${PWD}/00bootup/Global.cfg" check_file_valid "${conf_path}" "Globab.cfg" diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index b939ec74..211c00f6 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -90,7 +90,8 @@ function create_pxe_img() { } function create_docker_image() { - local DOCKER_IMG="$6" + local DOCKER_IMG="$1" + shift create_os_tar_from_repo "$@" docker build -t "${DOCKER_IMG}" -f ./Dockerfile . } diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index aac24985..a34bdbb1 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -61,6 +61,9 @@ function install_misc() { local AGENT_PATH=$2 local PASSWD=$3 local BOOT_MODE=$4 + local FLAG_COPY_FILE=$5 + local SRC_FILE=$6 + local DST_DIR=$7 local DNS_CONF="${PWD}/resolv.conf" cp ../files/*mount ../files/os-agent.service "${RPM_ROOT}/usr/lib/systemd/system/" cp ../files/os-release "${RPM_ROOT}/usr/lib/" @@ -91,6 +94,11 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ if [ -e "${DNS_CONF}" ]; then cp "${DNS_CONF}" "${RPM_ROOT}/etc/resolv.conf" fi + + if [ $FLAG_COPY_FILE -eq 0 ]; then + check_dir_valid "${DST_DIR}" "${DST_DIR}" + cp "${SRC_FILE}" "${DST_DIR}" + fi } function create_os_tar_from_repo() { @@ -99,8 +107,11 @@ function create_os_tar_from_repo() { local AGENT_PATH=$3 local PASSWD=$4 local BOOT_MODE=$5 + local FLAG_COPY_FILE=$6 + local SRC_FILE=$7 + local DST_DIR=$8 install_packages "${REPO}" "${BOOT_MODE}" - install_misc "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" + install_misc "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILE}" "${DST_DIR}" unmount_dir "${RPM_ROOT}" tar -C "$RPM_ROOT" -cf ./os.tar . } diff --git a/scripts/kbimg.sh b/scripts/kbimg.sh index 1dea6f64..e813566f 100644 --- a/scripts/kbimg.sh +++ b/scripts/kbimg.sh @@ -20,6 +20,9 @@ DOCKERFILE="" LOCK=./test.lock ADMIN_CONTAINER_DIR=./admin-container BOOT_MODE=efi +FLAG_COPY_FILE=1 +SRC_FILE="" +DST_DIR="" source common/globalVariables.sh &>/dev/null source common/log.sh &>/dev/null @@ -64,7 +67,7 @@ EOF function show_upgrade_image_usage() { cat << EOF -Usage : kbimg create upgrade-image -p isopath -v osversion -b osagentdir -e ospassword -d repository/name:tag +Usage : kbimg create upgrade-image -p isopath -v osversion -b osagentdir -e ospassword -d repository/name:tag -c src-file:dst-dir options: -p repo path @@ -73,6 +76,7 @@ options: -e os encrypted password -d docker image like repository/name:tag -l boot to legacy BIOS mode, if not specify, then UEFI mode + -c copy file to the specified directory -h,--help show help information EOF } @@ -80,7 +84,7 @@ EOF function show_vm_pxe_image_usage() { cat << EOF -Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password +Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password -c src-file:dst-dir or kbimg create [vm-image|pxe-image] -d repository/name:tag @@ -91,6 +95,7 @@ options: -e os encrypted password -d docker image like repository/name:tag -l boot to legacy BIOS mode, if not specify, then UEFI mode + -c copy file to the specified directory -h,--help show help information EOF } @@ -150,7 +155,7 @@ function verify_upgrade_image_input() { fi done set -eE - while getopts "p:v:e:b:d:l" opt + while getopts "p:v:e:b:d:c:l" opt do case $opt in p) @@ -173,6 +178,12 @@ function verify_upgrade_image_input() { check_param "$OPTARG" DOCKER_IMG="$OPTARG" ;; + c) + check_param "$OPTARG" + SRC_FILE=$(echo "$OPTARG" | awk -F: '{print $1}') + DST_DIR=$(echo "$OPTARG" | awk -F: '{print $2}') + FLAG_COPY_FILE=0 + ;; l) BOOT_MODE=legacy ;; @@ -198,7 +209,7 @@ function verify_repo_input() { fi done set -eE - while getopts "p:v:e:b:l" opt + while getopts "p:v:e:b:c:l" opt do case $opt in p) @@ -220,6 +231,12 @@ function verify_repo_input() { l) BOOT_MODE=legacy ;; + c) + check_param "$OPTARG" + SRC_FILE=$(echo "$OPTARG" | awk -F: '{print $1}') + DST_DIR=$(echo "$OPTARG" | awk -F: '{print $2}') + FLAG_COPY_FILE=0 + ;; *) log_error_print "option $opt not found" show_vm_pxe_image_usage @@ -230,13 +247,38 @@ function verify_repo_input() { } function verify_docker_input() { - if [ "$1" != "-d" ]; then - log_error_print "option $1 not found" - show_vm_pxe_image_usage - exit 3 - fi - check_param "$2" - DOCKER_IMG=$2 + set +eE + for i in "d" + do + echo "$@" | grep -q "\-$i " + local status=$? + if [ "$status" -ne 0 ];then + log_error_print "option -$i is mandatory, please check input" + show_vm_pxe_image_usage + exit 3 + fi + done + set -eE + while getopts "d:c:" opt + do + case $opt in + d) + check_param "$OPTARG" + DOCKER_IMG="$OPTARG" + ;; + c) + check_param "$OPTARG" + SRC_FILE=$(echo "$OPTARG" | awk -F: '{print $1}') + DST_DIR=$(echo "$OPTARG" | awk -F: '{print $2}') + FLAG_COPY_FILE=0 + ;; + *) + log_error_print "option $opt not found" + show_vm_pxe_image_usage + exit 3 + ;; + esac + done } function verify_admin_input() { @@ -274,7 +316,7 @@ function verify_admin_input() { function verify_create_input() { local cmd=$1 - case $1 in + case "$cmd" in "upgrade-image") shift if [ $# -eq 1 ]; then @@ -283,7 +325,7 @@ function verify_create_input() { exit 0 fi fi - if [[ $# -ne 10 && $# -ne 11 ]]; then + if [[ $# -lt 10 ]]; then log_error_print "the number of parameters is incorrect, please check it." show_upgrade_image_usage exit 3 @@ -292,28 +334,46 @@ function verify_create_input() { verify_upgrade_image_input "$@" check_repo_path "${REPO}" check_binary_exist "${AGENT_PATH}" - create_docker_image "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${DOCKER_IMG}" + if [ $FLAG_COPY_FILE -eq 0 ]; then + check_file_valid "${SRC_FILE}" "${SRC_FILE}" + fi + create_docker_image "${DOCKER_IMG}" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILE}" "${DST_DIR}" ;; "vm-image") shift - if [ $# -eq 1 ]; then + if [ $# -eq 1 ]; then if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then show_vm_pxe_image_usage exit 0 fi fi check_disk_space "vm" - if [[ $# -eq 8 || $# -eq 9 ]]; then - verify_repo_input "$@" - check_repo_path "${REPO}" - check_binary_exist "${AGENT_PATH}" - create_vm_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" - elif [ $# -eq 2 ]; then - verify_docker_input "$@" - check_docker_exist "${DOCKER_IMG}" - create_vm_img "docker" "${DOCKER_IMG}" + if [[ "$@" =~ "-p" ]]; then + if [[ $# -ge 8 ]]; then + verify_repo_input "$@" + check_repo_path "${REPO}" + check_binary_exist "${AGENT_PATH}" + if [ $FLAG_COPY_FILE -eq 0 ]; then + check_file_valid "${SRC_FILE}" "${SRC_FILE}" + fi + create_vm_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILE}" "${DST_DIR}" + else + log_error_print "the number of parameters is incorrect, please check it." + show_vm_pxe_image_usage + exit 3 + fi + elif [[ "$@" =~ "-d" ]]; then + if [[ $# -ge 2 ]]; then + verify_docker_input "$@" + check_docker_exist "${DOCKER_IMG}" + create_vm_img "docker" "${DOCKER_IMG}" + else + log_error_print "the number of parameters is incorrect, please check it." + show_vm_pxe_image_usage + exit 3 + fi else - log_error_print "the number of parameters is incorrect, please check it." + log_error_print "option -p or -d is mandatory, please check input" show_vm_pxe_image_usage exit 3 fi @@ -328,17 +388,32 @@ function verify_create_input() { fi check_disk_space "pxe" check_conf_valid "${rootfs_name}" "${disk}" "${server_ip}" "${local_ip}" "${route_ip}" "${netmask}" "${net_name}" - if [ $# -eq 8 ]; then - verify_repo_input "$@" - check_repo_path "${REPO}" - check_binary_exist "${AGENT_PATH}" - create_pxe_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" - elif [ $# -eq 2 ]; then - verify_docker_input "$@" - check_docker_exist "${DOCKER_IMG}" - create_pxe_img "docker" "${DOCKER_IMG}" + if [[ "$@" =~ "-p" ]]; then + if [ $# -ge 8 ]; then + verify_repo_input "$@" + check_repo_path "${REPO}" + check_binary_exist "${AGENT_PATH}" + if [ $FLAG_COPY_FILE -eq 0 ]; then + check_file_valid "${SRC_FILE}" "${SRC_FILE}" + fi + create_pxe_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILE}" "${DST_DIR}" + else + log_error_print "the number of parameters is incorrect, please check it." + show_vm_pxe_image_usage + exit 3 + fi + elif [[ "$@" =~ "-d" ]]; then + if [ $# -ge 2 ]; then + verify_docker_input "$@" + check_docker_exist "${DOCKER_IMG}" + create_pxe_img "docker" "${DOCKER_IMG}" + else + log_error_print "the number of parameters is incorrect, please check it." + show_vm_pxe_image_usage + exit 3 + fi else - log_error_print "the number of parameters is incorrect, please check it." + log_error_print "option -p or -d is mandatory, please check input" show_vm_pxe_image_usage exit 3 fi @@ -351,7 +426,7 @@ function verify_create_input() { exit 0 fi fi - if [ $# -ne 4 ]; then + if [ $# -lt 4 ]; then log_error_print "the number of parameters is incorrect, please check it." show_admin_image_usage exit 3 -- Gitee From d2bbdd45581bbd2269e3192af74180015ea62726 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 1 Aug 2024 23:23:26 +0800 Subject: [PATCH 004/116] copy multiple files (wait for test) --- scripts/common/utils.sh | 3 +- scripts/create/rootfsCreate.sh | 25 +++++++---- scripts/kbimg.sh | 76 ++++++++++++++++++++++++++-------- 3 files changed, 78 insertions(+), 26 deletions(-) diff --git a/scripts/common/utils.sh b/scripts/common/utils.sh index 97124822..80743f95 100644 --- a/scripts/common/utils.sh +++ b/scripts/common/utils.sh @@ -111,8 +111,7 @@ function check_dir_valid() { local dir="$1" local mesg="$2" if [ ! -e "${dir}" ]; then - log_error_print "${mesg} is not exist." - exit 3 + mkdir -p "${dir}" fi if [ ! -d "${dir}" ]; then log_error_print "${mesg} is not a directory." diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index a34bdbb1..3980a804 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -62,8 +62,8 @@ function install_misc() { local PASSWD=$3 local BOOT_MODE=$4 local FLAG_COPY_FILE=$5 - local SRC_FILE=$6 - local DST_DIR=$7 + local SRC_FILES=$6 + local DST_DIRS=$7 local DNS_CONF="${PWD}/resolv.conf" cp ../files/*mount ../files/os-agent.service "${RPM_ROOT}/usr/lib/systemd/system/" cp ../files/os-release "${RPM_ROOT}/usr/lib/" @@ -96,8 +96,19 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ fi if [ $FLAG_COPY_FILE -eq 0 ]; then - check_dir_valid "${DST_DIR}" "${DST_DIR}" - cp "${SRC_FILE}" "${DST_DIR}" + local src_files=() + local dst_dirs=() + echo $SRC_FILES | awk -F ':' '{for(i=1; i<=NF; i++) print $i}' | while read -r src_file; do + src_files+=("$src_file") + done + echo $DST_DIRS | awk -F ':' '{for(i=1; i<=NF; i++) print $i}' | while read -r dst_dir; do + check_dir_valid "${dst_dir}" "${dst_dir}" + dst_dirs+=("$dst_dir") + done + local len=${#src_files[@]} + for ((i=0; i/dev/null source common/log.sh &>/dev/null @@ -67,7 +67,7 @@ EOF function show_upgrade_image_usage() { cat << EOF -Usage : kbimg create upgrade-image -p isopath -v osversion -b osagentdir -e ospassword -d repository/name:tag -c src-file:dst-dir +Usage : kbimg create upgrade-image -p isopath -v osversion -b osagentdir -e ospassword -d repository/name:tag -c "src-file1:src-file2 dst-dir1:dst-dir2" options: -p repo path @@ -76,7 +76,7 @@ options: -e os encrypted password -d docker image like repository/name:tag -l boot to legacy BIOS mode, if not specify, then UEFI mode - -c copy file to the specified directory + -c copy files to the specified directories, use double quotes to enclose -h,--help show help information EOF } @@ -84,7 +84,7 @@ EOF function show_vm_pxe_image_usage() { cat << EOF -Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password -c src-file:dst-dir +Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password -c "src-file1:src-file2 dst-dir1:dst-dir2" or kbimg create [vm-image|pxe-image] -d repository/name:tag @@ -95,7 +95,7 @@ options: -e os encrypted password -d docker image like repository/name:tag -l boot to legacy BIOS mode, if not specify, then UEFI mode - -c copy file to the specified directory + -c copy files to the specified directories, use double quotes to enclose -h,--help show help information EOF } @@ -180,8 +180,8 @@ function verify_upgrade_image_input() { ;; c) check_param "$OPTARG" - SRC_FILE=$(echo "$OPTARG" | awk -F: '{print $1}') - DST_DIR=$(echo "$OPTARG" | awk -F: '{print $2}') + SRC_FILES=$(echo "$OPTARG" | awk -F: '{print $1}') + DST_DIRS=$(echo "$OPTARG" | awk -F: '{print $2}') FLAG_COPY_FILE=0 ;; l) @@ -233,8 +233,8 @@ function verify_repo_input() { ;; c) check_param "$OPTARG" - SRC_FILE=$(echo "$OPTARG" | awk -F: '{print $1}') - DST_DIR=$(echo "$OPTARG" | awk -F: '{print $2}') + SRC_FILES=$(echo "$OPTARG" | awk -F: '{print $1}') + DST_DIRS=$(echo "$OPTARG" | awk -F: '{print $2}') FLAG_COPY_FILE=0 ;; *) @@ -268,8 +268,8 @@ function verify_docker_input() { ;; c) check_param "$OPTARG" - SRC_FILE=$(echo "$OPTARG" | awk -F: '{print $1}') - DST_DIR=$(echo "$OPTARG" | awk -F: '{print $2}') + SRC_FILES=$(echo "$OPTARG" | awk -F: '{print $1}') + DST_DIRS=$(echo "$OPTARG" | awk -F: '{print $2}') FLAG_COPY_FILE=0 ;; *) @@ -335,7 +335,21 @@ function verify_create_input() { check_repo_path "${REPO}" check_binary_exist "${AGENT_PATH}" if [ $FLAG_COPY_FILE -eq 0 ]; then - check_file_valid "${SRC_FILE}" "${SRC_FILE}" + local src_files=() + local dst_dirs=() + echo $SRC_FILES | awk -F ':' '{for(i=1; i<=NF; i++) print $i}' | while read -r src_file; do + check_file_valid "${src_file}" "${src_file}" + src_files+=("$src_file") + done + echo $DST_DIRS | awk -F ':' '{for(i=1; i<=NF; i++) print $i}' | while read -r dst_dir; do + dst_dirs+=("$dst_dir") + done + local len1=${#src_files[@]} + local len2=${#dst_dirs[@]} + if [ $len1 -ne $len2 ]; then + log_error_print "the numbers of source files and destination directories are not equal, please check input" + exit 4 + fi fi create_docker_image "${DOCKER_IMG}" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILE}" "${DST_DIR}" ;; @@ -354,9 +368,23 @@ function verify_create_input() { check_repo_path "${REPO}" check_binary_exist "${AGENT_PATH}" if [ $FLAG_COPY_FILE -eq 0 ]; then - check_file_valid "${SRC_FILE}" "${SRC_FILE}" + local src_files=() + local dst_dirs=() + echo $SRC_FILES | awk -F ':' '{for(i=1; i<=NF; i++) print $i}' | while read -r src_file; do + check_file_valid "${src_file}" "${src_file}" + src_files+=("$src_file") + done + echo $DST_DIRS | awk -F ':' '{for(i=1; i<=NF; i++) print $i}' | while read -r dst_dir; do + dst_dirs+=("$dst_dir") + done + local len1=${#src_files[@]} + local len2=${#dst_dirs[@]} + if [ $len1 -ne $len2 ]; then + log_error_print "the numbers of source files and destination directories are not equal, please check input" + exit 4 + fi fi - create_vm_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILE}" "${DST_DIR}" + create_vm_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage @@ -394,9 +422,23 @@ function verify_create_input() { check_repo_path "${REPO}" check_binary_exist "${AGENT_PATH}" if [ $FLAG_COPY_FILE -eq 0 ]; then - check_file_valid "${SRC_FILE}" "${SRC_FILE}" + local src_files=() + local dst_dirs=() + echo $SRC_FILES | awk -F ':' '{for(i=1; i<=NF; i++) print $i}' | while read -r src_file; do + check_file_valid "${src_file}" "${src_file}" + src_files+=("$src_file") + done + echo $DST_DIRS | awk -F ':' '{for(i=1; i<=NF; i++) print $i}' | while read -r dst_dir; do + dst_dirs+=("$dst_dir") + done + local len1=${#src_files[@]} + local len2=${#dst_dirs[@]} + if [ $len1 -ne $len2 ]; then + log_error_print "the numbers of source files and destination directories are not equal, please check input" + exit 4 + fi fi - create_pxe_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILE}" "${DST_DIR}" + create_pxe_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage -- Gitee From c9e620dca6945cc046d37ec4a40be30d47623fd0 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 2 Aug 2024 10:18:45 +0800 Subject: [PATCH 005/116] copyfile multiple done --- scripts/create/rootfsCreate.sh | 10 ++--- scripts/kbimg.sh | 71 ++++++++++++++++------------------ 2 files changed, 38 insertions(+), 43 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 3980a804..8751c4c9 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -95,16 +95,16 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ cp "${DNS_CONF}" "${RPM_ROOT}/etc/resolv.conf" fi - if [ $FLAG_COPY_FILE -eq 0 ]; then + if [ "$FLAG_COPY_FILE" -eq 0 ]; then local src_files=() local dst_dirs=() - echo $SRC_FILES | awk -F ':' '{for(i=1; i<=NF; i++) print $i}' | while read -r src_file; do + while read -r src_file; do src_files+=("$src_file") - done - echo $DST_DIRS | awk -F ':' '{for(i=1; i<=NF; i++) print $i}' | while read -r dst_dir; do + done < <(echo "$SRC_FILES" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') + while read -r dst_dir; do check_dir_valid "${dst_dir}" "${dst_dir}" dst_dirs+=("$dst_dir") - done + done < <(echo "$DST_DIRS" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') local len=${#src_files[@]} for ((i=0; i Date: Fri, 2 Aug 2024 14:52:21 +0800 Subject: [PATCH 006/116] user systemd service (wait for test) --- scripts/common/utils.sh | 22 +++++++++++- scripts/create/rootfsCreate.sh | 27 +++++++++++--- scripts/kbimg.sh | 65 +++++++++------------------------- 3 files changed, 59 insertions(+), 55 deletions(-) diff --git a/scripts/common/utils.sh b/scripts/common/utils.sh index 80743f95..65ddd2bb 100644 --- a/scripts/common/utils.sh +++ b/scripts/common/utils.sh @@ -208,4 +208,24 @@ function check_docker_exist() { function check_docker_file() { check_file_valid "$1" "admin-container Dockerfile" -} \ No newline at end of file +} + +function check_copyfile_valid() { + local SRC_FILES=$1 + local DST_DIRS=$2 + local src_files=() + local dst_dirs=() + while read -r src_file; do + check_file_valid "${src_file}" "${src_file}" + src_files+=("$src_file") + done < <(echo "$SRC_FILES" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') + while read -r dst_dir; do + dst_dirs+=("$dst_dir") + done < <(echo "$DST_DIRS" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') + local len1=${#src_files[@]} + local len2=${#dst_dirs[@]} + if [ "$len1" -ne "$len2" ]; then + log_error_print "the numbers of source files and destination directories are not equal, please check input" + exit 4 + fi +} diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 8751c4c9..019519aa 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -95,21 +95,37 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ cp "${DNS_CONF}" "${RPM_ROOT}/etc/resolv.conf" fi + local src_files=() + local dst_dirs=() if [ "$FLAG_COPY_FILE" -eq 0 ]; then - local src_files=() - local dst_dirs=() while read -r src_file; do - src_files+=("$src_file") + src_files+=("${src_file}") done < <(echo "$SRC_FILES" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') while read -r dst_dir; do check_dir_valid "${dst_dir}" "${dst_dir}" - dst_dirs+=("$dst_dir") + dst_dirs+=("${dst_dir}") done < <(echo "$DST_DIRS" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') local len=${#src_files[@]} for ((i=0; i/dev/null source common/log.sh &>/dev/null @@ -77,6 +78,7 @@ options: -d docker image like repository/name:tag -l boot to legacy BIOS mode, if not specify, then UEFI mode -c copy files to the specified directories, use double quotes to enclose + -s add new systemd services -h,--help show help information EOF } @@ -96,6 +98,7 @@ options: -d docker image like repository/name:tag -l boot to legacy BIOS mode, if not specify, then UEFI mode -c copy files to the specified directories, use double quotes to enclose + -s add new systemd services -h,--help show help information EOF } @@ -155,7 +158,7 @@ function verify_upgrade_image_input() { fi done set -eE - while getopts "p:v:e:b:d:c:l" opt + while getopts "p:v:e:b:d:c:ls" opt do case $opt in p) @@ -187,6 +190,9 @@ function verify_upgrade_image_input() { l) BOOT_MODE=legacy ;; + s) + FLAG_SYSTEMD=0 + ;; *) log_error_print "option $opt not found" show_upgrade_image_usage @@ -237,6 +243,9 @@ function verify_repo_input() { DST_DIRS=$(echo "$OPTARG" | awk -F ' ' '{print $2}') FLAG_COPY_FILE=0 ;; + s) + FLAG_SYSTEMD=0 + ;; *) log_error_print "option $opt not found" show_vm_pxe_image_usage @@ -330,23 +339,9 @@ function verify_create_input() { check_repo_path "${REPO}" check_binary_exist "${AGENT_PATH}" if [ $FLAG_COPY_FILE -eq 0 ]; then - local src_files=() - local dst_dirs=() - while read -r src_file; do - check_file_valid "${src_file}" "${src_file}" - src_files+=("$src_file") - done < <(echo "$SRC_FILES" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') - while read -r dst_dir; do - dst_dirs+=("$dst_dir") - done < <(echo "$DST_DIRS" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') - local len1=${#src_files[@]} - local len2=${#dst_dirs[@]} - if [ "$len1" -ne "$len2" ]; then - log_error_print "the numbers of source files and destination directories are not equal, please check input" - exit 4 - fi + check_copyfile_valid "${SRC_FILES}" "${DST_DIRS}" fi - create_docker_image "${DOCKER_IMG}" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" + create_docker_image "${DOCKER_IMG}" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" "${FLAG_SYSTEMD}" ;; "vm-image") shift @@ -363,23 +358,9 @@ function verify_create_input() { check_repo_path "${REPO}" check_binary_exist "${AGENT_PATH}" if [ $FLAG_COPY_FILE -eq 0 ]; then - local src_files=() - local dst_dirs=() - while read -r src_file; do - check_file_valid "${src_file}" "${src_file}" - src_files+=("$src_file") - done < <(echo "$SRC_FILES" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') - while read -r dst_dir; do - dst_dirs+=("$dst_dir") - done < <(echo "$DST_DIRS" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') - local len1=${#src_files[@]} - local len2=${#dst_dirs[@]} - if [ "$len1" -ne "$len2" ]; then - log_error_print "the numbers of source files and destination directories are not equal, please check input" - exit 4 - fi + check_copyfile_valid "${SRC_FILES}" "${DST_DIRS}" fi - create_vm_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" + create_vm_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" "${FLAG_SYSTEMD}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage @@ -417,23 +398,9 @@ function verify_create_input() { check_repo_path "${REPO}" check_binary_exist "${AGENT_PATH}" if [ $FLAG_COPY_FILE -eq 0 ]; then - local src_files=() - local dst_dirs=() - while read -r src_file; do - check_file_valid "${src_file}" "${src_file}" - src_files+=("$src_file") - done < <(echo "$SRC_FILES" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') - while read -r dst_dir; do - dst_dirs+=("$dst_dir") - done < <(echo "$DST_DIRS" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') - local len1=${#src_files[@]} - local len2=${#dst_dirs[@]} - if [ "$len1" -ne "$len2" ]; then - log_error_print "the numbers of source files and destination directories are not equal, please check input" - exit 4 - fi + check_copyfile_valid "${SRC_FILES}" "${DST_DIRS}" fi - create_pxe_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" + create_pxe_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" "${FLAG_SYSTEMD}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage -- Gitee From f1e3d84972137c85f7bd8f4ea322c4f4d00e8f6b Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 2 Aug 2024 15:09:41 +0800 Subject: [PATCH 007/116] user systemd service shellcheck (wait for test) --- scripts/create/rootfsCreate.sh | 9 +++++---- scripts/kbimg.sh | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 019519aa..b146680a 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -110,15 +110,16 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ cp "${src_files[$i]}" "${dst_dirs[$i]}" done fi - if [ $FLAG_SYSTEMD -eq 0 ]; then + if [ "$FLAG_SYSTEMD" -eq 0 ]; then local num_files=${#src_files[@]} for ((i=0; i Date: Fri, 2 Aug 2024 15:27:33 +0800 Subject: [PATCH 008/116] user systemd service v3 test --- scripts/create/rootfsCreate.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index b146680a..29190588 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -120,10 +120,10 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ local dst_dir="${dst_dirs[$i]%"${dst_dirs[$i]##*[!/]}"}" local systemd_service="${dst_dirs[$i]}/${service_basename}" systemd_service="${1#"${RPM_ROOT}"}" - chroot "${RPM_ROOT}" bash - ln -s "${systemd_service}" "/etc/systemd/system/${service_basename}" - systemctl enable "${service_name}" - exit + chroot "${RPM_ROOT}" bash -c " + ln -s \"${systemd_service}\" \"/etc/systemd/system/${service_basename}\" + systemctl enable \"${service_name}\" + " fi done fi -- Gitee From d8014986ec44cc7737bce17728e13befd70422a9 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 2 Aug 2024 16:12:46 +0800 Subject: [PATCH 009/116] user systemd service v4 test --- scripts/create/rootfsCreate.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 29190588..ab4527eb 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -113,16 +113,14 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ if [ "$FLAG_SYSTEMD" -eq 0 ]; then local num_files=${#src_files[@]} for ((i=0; i Date: Fri, 2 Aug 2024 16:48:45 +0800 Subject: [PATCH 010/116] user systemd service v5 test --- scripts/create/rootfsCreate.sh | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index ab4527eb..1a714704 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -115,10 +115,17 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ for ((i=0; i Date: Fri, 2 Aug 2024 16:58:28 +0800 Subject: [PATCH 011/116] user systemd service v6 --- scripts/create/rootfsCreate.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 1a714704..fdd4c6b8 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -123,9 +123,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ dst_dir="${dst_dirs[$i]}" fi local systemd_service="${dst_dirs[$i]}/${service_basename}" - echo "${systemd_service}" systemd_service="${systemd_service#"${RPM_ROOT}"}" - echo "${systemd_service}" chroot "${RPM_ROOT}" bash -c " systemctl enable \"${systemd_service}\" " -- Gitee From 24e7403f037b81fafd0e72a57a2419a93921dc59 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 2 Aug 2024 17:54:48 +0800 Subject: [PATCH 012/116] grub password test --- scripts/create/rootfsCreate.sh | 26 +++++++++++++- scripts/kbimg.sh | 62 ++++++++++++++++++++++++++++++---- 2 files changed, 80 insertions(+), 8 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index fdd4c6b8..8e0cc6d5 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -64,6 +64,9 @@ function install_misc() { local FLAG_COPY_FILE=$5 local SRC_FILES=$6 local DST_DIRS=$7 + local FLAG_SYSTEMD=$8 + local FLAG_GRUB_PASSWD=$9 + local GRUB2_PASSWD=${10} local DNS_CONF="${PWD}/resolv.conf" cp ../files/*mount ../files/os-agent.service "${RPM_ROOT}/usr/lib/systemd/system/" cp ../files/os-release "${RPM_ROOT}/usr/lib/" @@ -78,14 +81,23 @@ EOF echo "VERSION_ID=${VERSION}" >> "${RPM_ROOT}/usr/lib/os-release" mv "${RPM_ROOT}"/boot/vmlinuz* "${RPM_ROOT}/boot/vmlinuz" mv "${RPM_ROOT}"/boot/initramfs* "${RPM_ROOT}/boot/initramfs.img" + local GRUB_PATH if [ "$BOOT_MODE" = "legacy" ]; then cp grub.cfg "${RPM_ROOT}"/boot/grub2 sed -i "s/insmod part_gpt/insmod part_msdos/g; \ s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ "${RPM_ROOT}"/boot/grub2/grub.cfg + GRUB_PATH="${RPM_ROOT}"/boot/grub2 else cp grub.cfg "${RPM_ROOT}"/boot/efi/EFI/openEuler + GRUB_PATH="${RPM_ROOT}"/boot/efi/EFI/openEuler + fi + if [ "$FLAG_GRUB_PASSWD" -eq 0 ]; then + local GRUB2_PASSWD_H + GRUB2_PASSWD_H=$(echo -e "${GRUB2_PASSWD}\n${GRUB2_PASSWD_H}" | grub-mkpasswd-pbkdf2) + echo "GRUB2_PASSWD=${GRUB2_PASSWD_H}" > "${GRUB_PATH}/user.cfg" + chmod 600 "${GRUB_PATH}/user.cfg" fi cp -r ./00bootup "${RPM_ROOT}"/usr/lib/dracut/modules.d/ cp set_in_chroot.sh "${RPM_ROOT}" @@ -142,8 +154,20 @@ function create_os_tar_from_repo() { local SRC_FILES=$7 local DST_DIRS=$8 local FLAG_SYSTEMD=$9 + local FLAG_GRUB_PASSWD=${10} + local GRUB_PASSWD=${11} install_packages "${REPO}" "${BOOT_MODE}" - install_misc "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" "${FLAG_SYSTEMD}" + install_misc \ + "${VERSION}" \ + "${AGENT_PATH}" \ + "${PASSWD}" \ + "${BOOT_MODE}" \ + "${FLAG_COPY_FILE}" \ + "${SRC_FILES}" \ + "${DST_DIRS}" \ + "${FLAG_SYSTEMD}" \ + "${FLAG_GRUB_PASSWD}" \ + "${GRUB_PASSWD}" unmount_dir "${RPM_ROOT}" tar -C "$RPM_ROOT" -cf ./os.tar . } diff --git a/scripts/kbimg.sh b/scripts/kbimg.sh index 8a602c4b..0c105b61 100644 --- a/scripts/kbimg.sh +++ b/scripts/kbimg.sh @@ -24,6 +24,8 @@ FLAG_COPY_FILE=1 SRC_FILES="" DST_DIRS="" FLAG_SYSTEMD=1 +FLAG_GRUB_PASSWD=1 +GRUB2_PASSWD="" source common/globalVariables.sh &>/dev/null source common/log.sh &>/dev/null @@ -68,7 +70,7 @@ EOF function show_upgrade_image_usage() { cat << EOF -Usage : kbimg create upgrade-image -p isopath -v osversion -b osagentdir -e ospassword -d repository/name:tag -c "src-file1:src-file2 dst-dir1:dst-dir2" +Usage : kbimg create upgrade-image -p iso-path -v os-version -b os-agent-dir -e os-password -d repository/name:tag -c "src-file1:src-file2 dst-dir1:dst-dir2" -g grub2-password options: -p repo path @@ -79,6 +81,7 @@ options: -l boot to legacy BIOS mode, if not specify, then UEFI mode -c copy files to the specified directories, use double quotes to enclose -s add new systemd services + -g grub password -h,--help show help information EOF } @@ -86,7 +89,7 @@ EOF function show_vm_pxe_image_usage() { cat << EOF -Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password -c "src-file1:src-file2 dst-dir1:dst-dir2" +Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password -c "src-file1:src-file2 dst-dir1:dst-dir2" -g grub2-password or kbimg create [vm-image|pxe-image] -d repository/name:tag @@ -99,6 +102,7 @@ options: -l boot to legacy BIOS mode, if not specify, then UEFI mode -c copy files to the specified directories, use double quotes to enclose -s add new systemd services + -g grub password -h,--help show help information EOF } @@ -158,7 +162,7 @@ function verify_upgrade_image_input() { fi done set -eE - while getopts "p:v:e:b:d:c:ls" opt + while getopts "p:v:e:b:d:c:g:ls" opt do case $opt in p) @@ -187,6 +191,10 @@ function verify_upgrade_image_input() { DST_DIRS=$(echo "$OPTARG" | awk -F ' ' '{print $2}') FLAG_COPY_FILE=0 ;; + g) + GRUB2_PASSWD="$OPTARG" + FLAG_GRUB_PASSWD=0 + ;; l) BOOT_MODE=legacy ;; @@ -215,7 +223,7 @@ function verify_repo_input() { fi done set -eE - while getopts "p:v:e:b:c:ls" opt + while getopts "p:v:e:b:c:g:ls" opt do case $opt in p) @@ -243,6 +251,10 @@ function verify_repo_input() { DST_DIRS=$(echo "$OPTARG" | awk -F ' ' '{print $2}') FLAG_COPY_FILE=0 ;; + g) + GRUB2_PASSWD="$OPTARG" + FLAG_GRUB_PASSWD=0 + ;; s) FLAG_SYSTEMD=0 ;; @@ -341,7 +353,19 @@ function verify_create_input() { if [ $FLAG_COPY_FILE -eq 0 ]; then check_copyfile_valid "${SRC_FILES}" "${DST_DIRS}" fi - create_docker_image "${DOCKER_IMG}" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" "${FLAG_SYSTEMD}" + create_docker_image \ + "${DOCKER_IMG}" \ + "${REPO}" \ + "${VERSION}" \ + "${AGENT_PATH}" \ + "${PASSWD}" \ + "${BOOT_MODE}" \ + "${FLAG_COPY_FILE}" \ + "${SRC_FILES}" \ + "${DST_DIRS}" \ + "${FLAG_SYSTEMD}" \ + "${FLAG_GRUB_PASSWD}" \ + "${GRUB2_PASSWD}" ;; "vm-image") shift @@ -360,7 +384,19 @@ function verify_create_input() { if [ $FLAG_COPY_FILE -eq 0 ]; then check_copyfile_valid "${SRC_FILES}" "${DST_DIRS}" fi - create_vm_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" "${FLAG_SYSTEMD}" + create_vm_img \ + "repo" \ + "${REPO}" \ + "${VERSION}" \ + "${AGENT_PATH}" \ + "${PASSWD}" \ + "${BOOT_MODE}" \ + "${FLAG_COPY_FILE}" \ + "${SRC_FILES}" \ + "${DST_DIRS}" \ + "${FLAG_SYSTEMD}" \ + "${FLAG_GRUB_PASSWD}" \ + "${GRUB2_PASSWD}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage @@ -400,7 +436,19 @@ function verify_create_input() { if [ $FLAG_COPY_FILE -eq 0 ]; then check_copyfile_valid "${SRC_FILES}" "${DST_DIRS}" fi - create_pxe_img "repo" "${REPO}" "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" "${FLAG_COPY_FILE}" "${SRC_FILES}" "${DST_DIRS}" "${FLAG_SYSTEMD}" + create_pxe_img \ + "repo" \ + "${REPO}" \ + "${VERSION}" \ + "${AGENT_PATH}" \ + "${PASSWD}" \ + "${BOOT_MODE}" \ + "${FLAG_COPY_FILE}" \ + "${SRC_FILES}" \ + "${DST_DIRS}" \ + "${FLAG_SYSTEMD}" \ + "${FLAG_GRUB_PASSWD}" \ + "${GRUB2_PASSWD}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage -- Gitee From 61f14caec885a36f3b3fa90b2c294cbc0829ae6c Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 2 Aug 2024 18:02:07 +0800 Subject: [PATCH 013/116] grub password v2 test --- scripts/create/rootfsCreate.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 8e0cc6d5..ac613e95 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -95,7 +95,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ fi if [ "$FLAG_GRUB_PASSWD" -eq 0 ]; then local GRUB2_PASSWD_H - GRUB2_PASSWD_H=$(echo -e "${GRUB2_PASSWD}\n${GRUB2_PASSWD_H}" | grub-mkpasswd-pbkdf2) + GRUB2_PASSWD_H=$(echo -e "${GRUB2_PASSWD}\n${GRUB2_PASSWD_H}" | grub2-mkpasswd-pbkdf2) echo "GRUB2_PASSWD=${GRUB2_PASSWD_H}" > "${GRUB_PATH}/user.cfg" chmod 600 "${GRUB_PATH}/user.cfg" fi -- Gitee From 57bce67044465af7c51a7d272343b416768b29bd Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 2 Aug 2024 18:07:12 +0800 Subject: [PATCH 014/116] grub password v3 test --- scripts/create/rootfsCreate.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index ac613e95..3b2ac1af 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -95,7 +95,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ fi if [ "$FLAG_GRUB_PASSWD" -eq 0 ]; then local GRUB2_PASSWD_H - GRUB2_PASSWD_H=$(echo -e "${GRUB2_PASSWD}\n${GRUB2_PASSWD_H}" | grub2-mkpasswd-pbkdf2) + GRUB2_PASSWD_H=$(echo -e "${GRUB2_PASSWD}\n${GRUB2_PASSWD}" | grub2-mkpasswd-pbkdf2) echo "GRUB2_PASSWD=${GRUB2_PASSWD_H}" > "${GRUB_PATH}/user.cfg" chmod 600 "${GRUB_PATH}/user.cfg" fi -- Gitee From 2acc2d3d595875d9b2ec2cb03418b30e1d1d3565 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 2 Aug 2024 18:17:39 +0800 Subject: [PATCH 015/116] grub password v4 test --- scripts/create/rootfsCreate.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 3b2ac1af..f0e95616 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -95,7 +95,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ fi if [ "$FLAG_GRUB_PASSWD" -eq 0 ]; then local GRUB2_PASSWD_H - GRUB2_PASSWD_H=$(echo -e "${GRUB2_PASSWD}\n${GRUB2_PASSWD}" | grub2-mkpasswd-pbkdf2) + GRUB2_PASSWD_H=$(echo -e "${GRUB2_PASSWD}\n${GRUB2_PASSWD}" | grub2-mkpasswd-pbkdf2 | grep PBKDF2 | awk '{print $7}') echo "GRUB2_PASSWD=${GRUB2_PASSWD_H}" > "${GRUB_PATH}/user.cfg" chmod 600 "${GRUB_PATH}/user.cfg" fi -- Gitee From 209372a5d2a4b68527ae0f5a2d3c82f8e701e006 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Mon, 5 Aug 2024 20:51:33 +0800 Subject: [PATCH 016/116] =?UTF-8?q?=E3=80=90test=E3=80=91copyfile=E6=8B=86?= =?UTF-8?q?=E5=88=86=E8=BE=93=E5=85=A5=EF=BC=9Badd=20user?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/common/utils.sh | 20 +++---- scripts/create/rootfsCreate.sh | 47 ++++++++++++++- scripts/kbimg.sh | 106 +++++++++++++++++++-------------- 3 files changed, 115 insertions(+), 58 deletions(-) diff --git a/scripts/common/utils.sh b/scripts/common/utils.sh index 65ddd2bb..fe7692c1 100644 --- a/scripts/common/utils.sh +++ b/scripts/common/utils.sh @@ -218,14 +218,14 @@ function check_copyfile_valid() { while read -r src_file; do check_file_valid "${src_file}" "${src_file}" src_files+=("$src_file") - done < <(echo "$SRC_FILES" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') - while read -r dst_dir; do - dst_dirs+=("$dst_dir") - done < <(echo "$DST_DIRS" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') - local len1=${#src_files[@]} - local len2=${#dst_dirs[@]} - if [ "$len1" -ne "$len2" ]; then - log_error_print "the numbers of source files and destination directories are not equal, please check input" - exit 4 - fi + done < <(echo "$SRC_FILES" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') + # while read -r dst_dir; do + # dst_dirs+=("$dst_dir") + # done < <(echo "$DST_DIRS" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') + # local len1=${#src_files[@]} + # local len2=${#dst_dirs[@]} + # if [ "$len1" -ne "$len2" ]; then + # log_error_print "the numbers of source files and destination directories are not equal, please check input" + # exit 4 + # fi } diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index f0e95616..54751870 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -67,6 +67,11 @@ function install_misc() { local FLAG_SYSTEMD=$8 local FLAG_GRUB_PASSWD=$9 local GRUB2_PASSWD=${10} + local FLAG_ADD_USER=${11} + local USERNAMES=${12} + local USERPASSWDS=${13} + local GROUPNAMES=${14} + local SUPERUSERS=${15} local DNS_CONF="${PWD}/resolv.conf" cp ../files/*mount ../files/os-agent.service "${RPM_ROOT}/usr/lib/systemd/system/" cp ../files/os-release "${RPM_ROOT}/usr/lib/" @@ -112,11 +117,11 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ if [ "$FLAG_COPY_FILE" -eq 0 ]; then while read -r src_file; do src_files+=("${src_file}") - done < <(echo "$SRC_FILES" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') + done < <(echo "$SRC_FILES" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') while read -r dst_dir; do check_dir_valid "${dst_dir}" "${dst_dir}" dst_dirs+=("${dst_dir}") - done < <(echo "$DST_DIRS" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') + done < <(echo "$DST_DIRS" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') local len=${#src_files[@]} for ((i=0; i /dev/null 2>&1; then + groupadd ${groupnames[$i]} + fi + useradd -m -G ${groupnames[$i]} -s /bin/bash ${usernames[$i]} + passwd ${userpasswds[$i]} + if [ \"${superuser[$i]}\" -eq 0 ]; then + echo \"${usernames[$i]} ALL=(ALL:ALL) ALL\" | EDITOR='tee -a' visudo + fi + done + " + fi } function create_os_tar_from_repo() { @@ -167,7 +203,12 @@ function create_os_tar_from_repo() { "${DST_DIRS}" \ "${FLAG_SYSTEMD}" \ "${FLAG_GRUB_PASSWD}" \ - "${GRUB_PASSWD}" + "${GRUB_PASSWD}" \ + "${FLAG_ADD_USER}" \ + "${USERNAMES}" \ + "${USERPASSWDS}" \ + "${GROUPNAMES}" \ + "${SUPERUSERS}" unmount_dir "${RPM_ROOT}" tar -C "$RPM_ROOT" -cf ./os.tar . } diff --git a/scripts/kbimg.sh b/scripts/kbimg.sh index 0c105b61..2a251659 100644 --- a/scripts/kbimg.sh +++ b/scripts/kbimg.sh @@ -26,6 +26,11 @@ DST_DIRS="" FLAG_SYSTEMD=1 FLAG_GRUB_PASSWD=1 GRUB2_PASSWD="" +FLAG_ADD_USER=1 +USERNAMES="" +USERPASSWDS="" +GROUPNAMES="" +SUPERUSERS="" source common/globalVariables.sh &>/dev/null source common/log.sh &>/dev/null @@ -70,7 +75,7 @@ EOF function show_upgrade_image_usage() { cat << EOF -Usage : kbimg create upgrade-image -p iso-path -v os-version -b os-agent-dir -e os-password -d repository/name:tag -c "src-file1:src-file2 dst-dir1:dst-dir2" -g grub2-password +Usage : kbimg create upgrade-image -p iso-path -v os-version -b os-agent-dir -e os-password -d repository/name:tag -c src-file:dst-dir -g grub2-password -u username:password:groupname:sudoflag options: -p repo path @@ -79,9 +84,10 @@ options: -e os encrypted password -d docker image like repository/name:tag -l boot to legacy BIOS mode, if not specify, then UEFI mode - -c copy files to the specified directories, use double quotes to enclose - -s add new systemd services + -c copy file to the specified directory + -s add new systemd services (use -c to copy .service file) -g grub password + -u add new user -h,--help show help information EOF } @@ -89,7 +95,7 @@ EOF function show_vm_pxe_image_usage() { cat << EOF -Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password -c "src-file1:src-file2 dst-dir1:dst-dir2" -g grub2-password +Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password -c src-file:dst-dir -g grub2-password -u username:password:groupname:sudoflag or kbimg create [vm-image|pxe-image] -d repository/name:tag @@ -100,9 +106,10 @@ options: -e os encrypted password -d docker image like repository/name:tag -l boot to legacy BIOS mode, if not specify, then UEFI mode - -c copy files to the specified directories, use double quotes to enclose - -s add new systemd services + -c copy file to the specified directory + -s add new systemd services (use -c to copy .service file) -g grub password + -u add new user -h,--help show help information EOF } @@ -162,7 +169,7 @@ function verify_upgrade_image_input() { fi done set -eE - while getopts "p:v:e:b:d:c:g:ls" opt + while getopts "p:v:e:b:d:lc:g:su:" opt do case $opt in p) @@ -185,27 +192,34 @@ function verify_upgrade_image_input() { check_param "$OPTARG" DOCKER_IMG="$OPTARG" ;; + l) + BOOT_MODE=legacy + ;; c) check_param "$OPTARG" - SRC_FILES=$(echo "$OPTARG" | awk -F ' ' '{print $1}') - DST_DIRS=$(echo "$OPTARG" | awk -F ' ' '{print $2}') + SRC_FILES+=" $(echo "$OPTARG" | awk -F ':' '{print $1}')" + DST_DIRS+=" $(echo "$OPTARG" | awk -F ':' '{print $2}')" FLAG_COPY_FILE=0 ;; g) GRUB2_PASSWD="$OPTARG" FLAG_GRUB_PASSWD=0 ;; - l) - BOOT_MODE=legacy - ;; s) FLAG_SYSTEMD=0 ;; - *) - log_error_print "option $opt not found" - show_upgrade_image_usage - exit 3 - ;; + u) + USERNAMES+=" $(echo "$OPTARG" | awk -F ':' '{print $1}')" + USERPASSWDS+=" $(echo "$OPTARG" | awk -F ':' '{print $2}')" + GROUPNAMES+=" $(echo "$OPTARG" | awk -F ':' '{print $3}')" + SUPERUSERS+=" $(echo "$OPTARG" | awk -F ':' '{print $4}')" + FLAG_ADD_USER=0 + ;; + *) + log_error_print "option $opt not found" + show_upgrade_image_usage + exit 3 + ;; esac done } @@ -223,7 +237,7 @@ function verify_repo_input() { fi done set -eE - while getopts "p:v:e:b:c:g:ls" opt + while getopts "p:v:e:b:lc:g:su:" opt do case $opt in p) @@ -247,8 +261,8 @@ function verify_repo_input() { ;; c) check_param "$OPTARG" - SRC_FILES=$(echo "$OPTARG" | awk -F ' ' '{print $1}') - DST_DIRS=$(echo "$OPTARG" | awk -F ' ' '{print $2}') + SRC_FILES+=" $(echo "$OPTARG" | awk -F ':' '{print $1}')" + DST_DIRS+=" $(echo "$OPTARG" | awk -F ':' '{print $2}')" FLAG_COPY_FILE=0 ;; g) @@ -258,6 +272,13 @@ function verify_repo_input() { s) FLAG_SYSTEMD=0 ;; + u) + USERNAMES+=" $(echo "$OPTARG" | awk -F ':' '{print $1}')" + USERPASSWDS+=" $(echo "$OPTARG" | awk -F ':' '{print $2}')" + GROUPNAMES+=" $(echo "$OPTARG" | awk -F ':' '{print $3}')" + SUPERUSERS+=" $(echo "$OPTARG" | awk -F ':' '{print $4}')" + FLAG_ADD_USER=0 + ;; *) log_error_print "option $opt not found" show_vm_pxe_image_usage @@ -268,33 +289,13 @@ function verify_repo_input() { } function verify_docker_input() { - set +eE if [ "$1" != "-d" ]; then log_error_print "option $1 not found" show_vm_pxe_image_usage exit 3 fi - set -eE - while getopts "d:c:" opt - do - case $opt in - d) - check_param "$OPTARG" - DOCKER_IMG="$OPTARG" - ;; - c) - check_param "$OPTARG" - SRC_FILES=$(echo "$OPTARG" | awk -F ' ' '{print $1}') - DST_DIRS=$(echo "$OPTARG" | awk -F ' ' '{print $2}') - FLAG_COPY_FILE=0 - ;; - *) - log_error_print "option $opt not found" - show_vm_pxe_image_usage - exit 3 - ;; - esac - done + check_param $2 + DOCKER_IMG=$2 } function verify_admin_input() { @@ -365,7 +366,12 @@ function verify_create_input() { "${DST_DIRS}" \ "${FLAG_SYSTEMD}" \ "${FLAG_GRUB_PASSWD}" \ - "${GRUB2_PASSWD}" + "${GRUB2_PASSWD}" \ + "${FLAG_ADD_USER}" \ + "${USERNAMES}" \ + "${USERPASSWDS}" \ + "${GROUPNAMES}" \ + "${SUPERUSERS}" ;; "vm-image") shift @@ -396,7 +402,12 @@ function verify_create_input() { "${DST_DIRS}" \ "${FLAG_SYSTEMD}" \ "${FLAG_GRUB_PASSWD}" \ - "${GRUB2_PASSWD}" + "${GRUB2_PASSWD}" \ + "${FLAG_ADD_USER}" \ + "${USERNAMES}" \ + "${USERPASSWDS}" \ + "${GROUPNAMES}" \ + "${SUPERUSERS}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage @@ -448,7 +459,12 @@ function verify_create_input() { "${DST_DIRS}" \ "${FLAG_SYSTEMD}" \ "${FLAG_GRUB_PASSWD}" \ - "${GRUB2_PASSWD}" + "${GRUB2_PASSWD}" \ + "${FLAG_ADD_USER}" \ + "${USERNAMES}" \ + "${USERPASSWDS}" \ + "${GROUPNAMES}" \ + "${SUPERUSERS}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage -- Gitee From 1f5bc9792ce7a41a1ce4c2afa508d592d3b1384f Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Mon, 5 Aug 2024 21:30:13 +0800 Subject: [PATCH 017/116] create sudo user --- scripts/create/rootfsCreate.sh | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 54751870..0cfbb1ce 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -164,16 +164,26 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ while read -r superuser; do superusers+=("${superuser}") done < <(echo "$SUPERUSERS" | awk -F ' ' 'for(i=1; i<=NF; i++) print $i') - local num_users=$(#usernames[@]) + local num_users=${#usernames[@]} chroot "${RPM_ROOT}" bash -c " for ((i=0; i /dev/null 2>&1; then groupadd ${groupnames[$i]} fi useradd -m -G ${groupnames[$i]} -s /bin/bash ${usernames[$i]} - passwd ${userpasswds[$i]} - if [ \"${superuser[$i]}\" -eq 0 ]; then - echo \"${usernames[$i]} ALL=(ALL:ALL) ALL\" | EDITOR='tee -a' visudo + echo \"${usernames[$i]}:${userpasswds[$i]}\" | chpasswd + if [ \"${superusers[$i]}\" -eq 0 ]; then + if visudo -c; then + echo \"${usernames[$i]} ALL=(ALL:ALL) ALL\" | tee -a /etc/sudoers.d/${usernames[$i]} + if grep -q \"${usernames[$i]}\" /etc/sudoers.d/${usernames[$i]}; then + echo \"Sudo privileges added for user ${usernames[$i]}.\" + else + echo \"Failed to add sudo privileges for user ${usernames[$i]}.\" + fi + else + echo \"Sudoers file syntax check failed. Please fix the sudoers file manually.\" + exit 5 + fi fi done " -- Gitee From 9fdf3186008fc6fca2c05509dcb221d27e83245c Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 6 Aug 2024 09:26:47 +0800 Subject: [PATCH 018/116] [user] fit shellcheck --- scripts/common/utils.sh | 4 ++-- scripts/create/rootfsCreate.sh | 2 +- scripts/kbimg.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/common/utils.sh b/scripts/common/utils.sh index fe7692c1..02e71e51 100644 --- a/scripts/common/utils.sh +++ b/scripts/common/utils.sh @@ -212,9 +212,9 @@ function check_docker_file() { function check_copyfile_valid() { local SRC_FILES=$1 - local DST_DIRS=$2 + # local DST_DIRS=$2 local src_files=() - local dst_dirs=() + # local dst_dirs=() while read -r src_file; do check_file_valid "${src_file}" "${src_file}" src_files+=("$src_file") diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 0cfbb1ce..3ba3f212 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -164,8 +164,8 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ while read -r superuser; do superusers+=("${superuser}") done < <(echo "$SUPERUSERS" | awk -F ' ' 'for(i=1; i<=NF; i++) print $i') - local num_users=${#usernames[@]} chroot "${RPM_ROOT}" bash -c " + local num_users=${#usernames[@]} for ((i=0; i /dev/null 2>&1; then groupadd ${groupnames[$i]} diff --git a/scripts/kbimg.sh b/scripts/kbimg.sh index 2a251659..ad92e1b8 100644 --- a/scripts/kbimg.sh +++ b/scripts/kbimg.sh @@ -294,7 +294,7 @@ function verify_docker_input() { show_vm_pxe_image_usage exit 3 fi - check_param $2 + check_param "$2" DOCKER_IMG=$2 } -- Gitee From 48f8e5de733c15c3621581d15cbf2af733725837 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 6 Aug 2024 10:22:14 +0800 Subject: [PATCH 019/116] fix syntax error --- scripts/create/rootfsCreate.sh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 3ba3f212..9516e847 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -154,20 +154,22 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ local superusers=() while read -r username; do usernames+=("${username}") - done < <(echo "$USERNAMES" | awk -F ' ' 'for(i=1; i<=NF; i++) print $i') + done < <(echo "$USERNAMES" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') while read -r userpasswd; do userpasswds+=("${userpasswd}") - done < <(echo "$USERPASSWDS" | awk -F ' ' 'for(i=1; i<=NF; i++) print $i') + done < <(echo "$USERPASSWDS" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') while read -r groupname; do groupnames+=("${groupname}") - done < <(echo "$GROUPNAMES" | awk -F ' ' 'for(i=1; i<=NF; i++) print $i') + done < <(echo "$GROUPNAMES" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') while read -r superuser; do superusers+=("${superuser}") - done < <(echo "$SUPERUSERS" | awk -F ' ' 'for(i=1; i<=NF; i++) print $i') + done < <(echo "$SUPERUSERS" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') + local num_users=${#usernames[@]} chroot "${RPM_ROOT}" bash -c " - local num_users=${#usernames[@]} for ((i=0; i /dev/null 2>&1; then + echo \"Add group ${groupnames[$i]}\" groupadd ${groupnames[$i]} fi useradd -m -G ${groupnames[$i]} -s /bin/bash ${usernames[$i]} -- Gitee From 3b3c50f8270635479b8364896e1b933d4050134b Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 6 Aug 2024 11:00:53 +0800 Subject: [PATCH 020/116] =?UTF-8?q?=E6=8A=BD=E8=B1=A1add=5Fuser.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/add_user.sh | 26 ++++++++++++++++++++++++++ scripts/create/rootfsCreate.sh | 28 ++++------------------------ 2 files changed, 30 insertions(+), 24 deletions(-) create mode 100644 scripts/add_user.sh diff --git a/scripts/add_user.sh b/scripts/add_user.sh new file mode 100644 index 00000000..6cbd081c --- /dev/null +++ b/scripts/add_user.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +username=$1 +password=$2 +groupname=$3 +superuser=$4 +echo \"${username} ${userpasswd} ${groupname} ${superuser}\" +if ! getent group ${groupname} > /dev/null 2>&1; then + echo \"Add group ${groupname}\" + groupadd ${groupname} +fi +useradd -m -G ${groupname} -s /bin/bash ${username} +echo \"${username}:${userpasswd}\" | chpasswd +if [ \"${superuser}\" -eq 0 ]; then + if visudo -c; then + echo \"${username} ALL=(ALL:ALL) ALL\" | tee -a /etc/sudoers.d/${username} + if grep -q \"${username}\" /etc/sudoers.d/${username}; then + echo \"Sudo privileges added for user ${username}.\" + else + echo \"Failed to add sudo privileges for user ${username}.\" + fi + else + echo \"Sudoers file syntax check failed. Please fix the sudoers file manually.\" + exit 5 + fi +fi diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 9516e847..f2b04673 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -106,6 +106,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ fi cp -r ./00bootup "${RPM_ROOT}"/usr/lib/dracut/modules.d/ cp set_in_chroot.sh "${RPM_ROOT}" + cp add_user.sh "${RPM_ROOT}" ROOT_PWD="${PASSWD}" BOOT_MODE="${BOOT_MODE}" chroot "${RPM_ROOT}" bash /set_in_chroot.sh rm "${RPM_ROOT}/set_in_chroot.sh" if [ -e "${DNS_CONF}" ]; then @@ -165,30 +166,9 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ superusers+=("${superuser}") done < <(echo "$SUPERUSERS" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') local num_users=${#usernames[@]} - chroot "${RPM_ROOT}" bash -c " - for ((i=0; i /dev/null 2>&1; then - echo \"Add group ${groupnames[$i]}\" - groupadd ${groupnames[$i]} - fi - useradd -m -G ${groupnames[$i]} -s /bin/bash ${usernames[$i]} - echo \"${usernames[$i]}:${userpasswds[$i]}\" | chpasswd - if [ \"${superusers[$i]}\" -eq 0 ]; then - if visudo -c; then - echo \"${usernames[$i]} ALL=(ALL:ALL) ALL\" | tee -a /etc/sudoers.d/${usernames[$i]} - if grep -q \"${usernames[$i]}\" /etc/sudoers.d/${usernames[$i]}; then - echo \"Sudo privileges added for user ${usernames[$i]}.\" - else - echo \"Failed to add sudo privileges for user ${usernames[$i]}.\" - fi - else - echo \"Sudoers file syntax check failed. Please fix the sudoers file manually.\" - exit 5 - fi - fi - done - " + for ((i=0; i Date: Tue, 6 Aug 2024 11:05:16 +0800 Subject: [PATCH 021/116] Update add_user.sh --- scripts/add_user.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/scripts/add_user.sh b/scripts/add_user.sh index 6cbd081c..ec0d37ab 100644 --- a/scripts/add_user.sh +++ b/scripts/add_user.sh @@ -4,23 +4,23 @@ username=$1 password=$2 groupname=$3 superuser=$4 -echo \"${username} ${userpasswd} ${groupname} ${superuser}\" +echo "${username} ${userpasswd} ${groupname} ${superuser}" if ! getent group ${groupname} > /dev/null 2>&1; then - echo \"Add group ${groupname}\" + echo "Add group ${groupname}" groupadd ${groupname} fi useradd -m -G ${groupname} -s /bin/bash ${username} -echo \"${username}:${userpasswd}\" | chpasswd -if [ \"${superuser}\" -eq 0 ]; then +echo "${username}:${userpasswd}" | chpasswd +if [ "${superuser}" -eq 0 ]; then if visudo -c; then - echo \"${username} ALL=(ALL:ALL) ALL\" | tee -a /etc/sudoers.d/${username} - if grep -q \"${username}\" /etc/sudoers.d/${username}; then - echo \"Sudo privileges added for user ${username}.\" + echo "${username} ALL=(ALL:ALL) ALL" | tee -a /etc/sudoers.d/${username} + if grep -q "${username}" /etc/sudoers.d/${username}; then + echo "Sudo privileges added for user ${username}." else - echo \"Failed to add sudo privileges for user ${username}.\" + echo "Failed to add sudo privileges for user ${username}." fi else - echo \"Sudoers file syntax check failed. Please fix the sudoers file manually.\" + echo "Sudoers file syntax check failed. Please fix the sudoers file manually." exit 5 fi fi -- Gitee From 175139ffdc8d20b971acb9b15588468dcddbb914 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 6 Aug 2024 11:19:03 +0800 Subject: [PATCH 022/116] Update add_user.sh --- scripts/add_user.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/add_user.sh b/scripts/add_user.sh index ec0d37ab..52dc0db7 100644 --- a/scripts/add_user.sh +++ b/scripts/add_user.sh @@ -4,13 +4,13 @@ username=$1 password=$2 groupname=$3 superuser=$4 -echo "${username} ${userpasswd} ${groupname} ${superuser}" +echo "${username} ${password} ${groupname} ${superuser}" if ! getent group ${groupname} > /dev/null 2>&1; then echo "Add group ${groupname}" groupadd ${groupname} fi useradd -m -G ${groupname} -s /bin/bash ${username} -echo "${username}:${userpasswd}" | chpasswd +echo "${username}:${password}" | chpasswd if [ "${superuser}" -eq 0 ]; then if visudo -c; then echo "${username} ALL=(ALL:ALL) ALL" | tee -a /etc/sudoers.d/${username} -- Gitee From e8655dbdb883ba67517ef0b748c3a1326a1af1fa Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 6 Aug 2024 11:38:04 +0800 Subject: [PATCH 023/116] Update rpmlist (sudo) --- scripts/rpmlist | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/rpmlist b/scripts/rpmlist index fb6f2381..472b703e 100644 --- a/scripts/rpmlist +++ b/scripts/rpmlist @@ -19,4 +19,5 @@ dracut coreutils gawk parted -dosfstools \ No newline at end of file +dosfstools +sudo \ No newline at end of file -- Gitee From fb344093e1eff843c9038072c01e89d2098bd4ec Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 6 Aug 2024 11:49:13 +0800 Subject: [PATCH 024/116] Update add_user.sh --- scripts/add_user.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/add_user.sh b/scripts/add_user.sh index 52dc0db7..a0907c47 100644 --- a/scripts/add_user.sh +++ b/scripts/add_user.sh @@ -13,8 +13,8 @@ useradd -m -G ${groupname} -s /bin/bash ${username} echo "${username}:${password}" | chpasswd if [ "${superuser}" -eq 0 ]; then if visudo -c; then - echo "${username} ALL=(ALL:ALL) ALL" | tee -a /etc/sudoers.d/${username} - if grep -q "${username}" /etc/sudoers.d/${username}; then + echo -e "${username}\tALL=(ALL:ALL)\tALL" | tee -a /etc/sudoers + if grep -q "${username}" /etc/sudoers; then echo "Sudo privileges added for user ${username}." else echo "Failed to add sudo privileges for user ${username}." -- Gitee From 63f4af458494143a1245fad31f873b79c7619c95 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 6 Aug 2024 12:03:16 +0800 Subject: [PATCH 025/116] shellcheck --- scripts/add_user.sh | 6 +++--- scripts/create/rootfsCreate.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/add_user.sh b/scripts/add_user.sh index a0907c47..1a9b4e8d 100644 --- a/scripts/add_user.sh +++ b/scripts/add_user.sh @@ -5,11 +5,11 @@ password=$2 groupname=$3 superuser=$4 echo "${username} ${password} ${groupname} ${superuser}" -if ! getent group ${groupname} > /dev/null 2>&1; then +if ! getent group "${groupname}" > /dev/null 2>&1; then echo "Add group ${groupname}" - groupadd ${groupname} + groupadd "${groupname}" fi -useradd -m -G ${groupname} -s /bin/bash ${username} +useradd -m -g "${groupname}" -s /bin/bash "${username}" echo "${username}:${password}" | chpasswd if [ "${superuser}" -eq 0 ]; then if visudo -c; then diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index f2b04673..10a5dccf 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -167,7 +167,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ done < <(echo "$SUPERUSERS" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') local num_users=${#usernames[@]} for ((i=0; i Date: Tue, 6 Aug 2024 12:17:20 +0800 Subject: [PATCH 026/116] merge coptfilev2-users -- Gitee From 7e362fed8d4006fd33c7d47f434a3ba04942ba53 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 6 Aug 2024 14:39:08 +0800 Subject: [PATCH 027/116] add fail prompt --- scripts/create/rootfsCreate.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 10a5dccf..9e45a216 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -145,6 +145,9 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ chroot "${RPM_ROOT}" bash -c " systemctl enable \"${systemd_service}\" " + if [ "$?" -ne 0 ]; then + echo "Failed to add service ${service_basename}" + fi fi done fi @@ -168,6 +171,9 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ local num_users=${#usernames[@]} for ((i=0; i Date: Tue, 6 Aug 2024 15:03:43 +0800 Subject: [PATCH 028/116] remove fail prompt --- scripts/create/rootfsCreate.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 9e45a216..10a5dccf 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -145,9 +145,6 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ chroot "${RPM_ROOT}" bash -c " systemctl enable \"${systemd_service}\" " - if [ "$?" -ne 0 ]; then - echo "Failed to add service ${service_basename}" - fi fi done fi @@ -171,9 +168,6 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ local num_users=${#usernames[@]} for ((i=0; i Date: Tue, 6 Aug 2024 17:34:51 +0800 Subject: [PATCH 029/116] [partition] v1 --- scripts/create/imageCreate.sh | 37 +++++++++++++++++++++++++++++----- scripts/create/rootfsCreate.sh | 9 ++++++++- scripts/kbimg.sh | 20 +++++++++++++++--- 3 files changed, 57 insertions(+), 9 deletions(-) diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index 211c00f6..85d0884b 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -14,6 +14,7 @@ IMG_SIZE=20 PWD="$(pwd)" function create_img() { local BOOT_MODE=$1 + local FLAG_PARTITION=$2 rm -f system.img update.img qemu-img create system.img ${IMG_SIZE}G if [ "$BOOT_MODE" = "legacy" ]; then @@ -25,9 +26,32 @@ function create_img() { parted system.img -s mklabel gpt parted system.img -s mkpart primary fat32 1MiB 60MiB fi - parted system.img -s mkpart primary ext4 60MiB 2160MiB - parted system.img -s mkpart primary ext4 2160MiB 4260MiB - parted system.img -s mkpart primary ext4 4260MiB 100% + if [ "${FLAG_PARTITION}" -eq 0 ]; then + local PARTITION_NUM=$3 + local PARTITION_SIZE=$4 + local partition_size=() + while read -r size; do + partition_size+=("${size}") + done < <(echo "$PARTITION_SIZE" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') + local len=${#partition_size[@]} + if [ $((len + 1)) -ne "$PARTITION_NUM" ]; then + echo "Partition count and size do not match, please check input" + exit 3 + fi + local offset=60 + for ((i=0;i/dev/null source common/log.sh &>/dev/null @@ -95,7 +98,7 @@ EOF function show_vm_pxe_image_usage() { cat << EOF -Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password -c src-file:dst-dir -g grub2-password -u username:password:groupname:sudoflag +Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password -c src-file:dst-dir -g grub2-password -u username:password:groupname:sudoflag -t partition-num:size1:size2:... or kbimg create [vm-image|pxe-image] -d repository/name:tag @@ -110,6 +113,7 @@ options: -s add new systemd services (use -c to copy .service file) -g grub password -u add new user + -t custom partition (for vm-image, omni the size of the last partition) -h,--help show help information EOF } @@ -237,7 +241,7 @@ function verify_repo_input() { fi done set -eE - while getopts "p:v:e:b:lc:g:su:" opt + while getopts "p:v:e:b:lc:g:su:t" opt do case $opt in p) @@ -279,6 +283,13 @@ function verify_repo_input() { SUPERUSERS+=" $(echo "$OPTARG" | awk -F ':' '{print $4}')" FLAG_ADD_USER=0 ;; + t) + check_param "$OPTARG" + PARTITION_NUM="${OPTARG%%:*}" + PARTITION_SIZE="${OPTARG#*:}" + PARTITION_SIZE="${PARTITION_SIZE#?}" + FLAG_PARTITION=0 + ;; *) log_error_print "option $opt not found" show_vm_pxe_image_usage @@ -407,7 +418,10 @@ function verify_create_input() { "${USERNAMES}" \ "${USERPASSWDS}" \ "${GROUPNAMES}" \ - "${SUPERUSERS}" + "${SUPERUSERS}" \ + "${FLAG_PARTITION}" \ + "${PARTITION_NUM}" \ + "${PARTITION_SIZE}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage -- Gitee From 24c44c5bbe80e9ed71f1e53bd2f153e1dbc1d43b Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 6 Aug 2024 17:37:35 +0800 Subject: [PATCH 030/116] [partition] v2.remove arguments in rootfsCreate.sh --- scripts/create/rootfsCreate.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 087b253d..bc24e2be 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -189,7 +189,6 @@ function create_os_tar_from_repo() { local USERPASSWDS=${14} local GROUPNAMES=${15} local SUPERUSERS=${16} - local FLAG_PARTITION=${17} install_packages "${REPO}" "${BOOT_MODE}" install_misc \ "${VERSION}" \ @@ -206,8 +205,7 @@ function create_os_tar_from_repo() { "${USERNAMES}" \ "${USERPASSWDS}" \ "${GROUPNAMES}" \ - "${SUPERUSERS}" \ - "${FLAG_PARTITION}" + "${SUPERUSERS}" unmount_dir "${RPM_ROOT}" tar -C "$RPM_ROOT" -cf ./os.tar . } -- Gitee From 93810f9a0f6b2620ea085d85d651a1dbb1b42848 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 6 Aug 2024 17:51:43 +0800 Subject: [PATCH 031/116] [partition] v3.remove check for number match --- scripts/create/imageCreate.sh | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index 85d0884b..ef1c59f5 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -33,16 +33,11 @@ function create_img() { while read -r size; do partition_size+=("${size}") done < <(echo "$PARTITION_SIZE" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') - local len=${#partition_size[@]} - if [ $((len + 1)) -ne "$PARTITION_NUM" ]; then - echo "Partition count and size do not match, please check input" - exit 3 - fi local offset=60 for ((i=0;i Date: Tue, 6 Aug 2024 17:52:23 +0800 Subject: [PATCH 032/116] [partition] v4 --- scripts/create/imageCreate.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index ef1c59f5..04ab399b 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -36,8 +36,8 @@ function create_img() { local offset=60 for ((i=0;i Date: Tue, 6 Aug 2024 18:00:44 +0800 Subject: [PATCH 033/116] [partition] v5.index start from 1 --- scripts/create/imageCreate.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index 04ab399b..e76a8cac 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -34,10 +34,10 @@ function create_img() { partition_size+=("${size}") done < <(echo "$PARTITION_SIZE" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') local offset=60 - for ((i=0;i Date: Tue, 6 Aug 2024 18:42:17 +0800 Subject: [PATCH 034/116] =?UTF-8?q?[partition]=20v6.=20delim=20from=20?= =?UTF-8?q?=E2=80=98=20=E2=80=98=20to=20':'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/create/imageCreate.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index e76a8cac..4ed68244 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -32,7 +32,7 @@ function create_img() { local partition_size=() while read -r size; do partition_size+=("${size}") - done < <(echo "$PARTITION_SIZE" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') + done < <(echo "$PARTITION_SIZE" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') local offset=60 for ((i=1;i<=PARTITION_NUM;i++)); do if [ "$i" -lt "$PARTITION_NUM" ]; then -- Gitee From 06f44f948e3188509337d426787b65ecd01e3fb5 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 6 Aug 2024 19:05:34 +0800 Subject: [PATCH 035/116] [partition] v7. t: --- scripts/kbimg.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/kbimg.sh b/scripts/kbimg.sh index b89ebaef..069ffdd4 100644 --- a/scripts/kbimg.sh +++ b/scripts/kbimg.sh @@ -241,7 +241,7 @@ function verify_repo_input() { fi done set -eE - while getopts "p:v:e:b:lc:g:su:t" opt + while getopts "p:v:e:b:lc:g:su:t:" opt do case $opt in p) @@ -287,7 +287,6 @@ function verify_repo_input() { check_param "$OPTARG" PARTITION_NUM="${OPTARG%%:*}" PARTITION_SIZE="${OPTARG#*:}" - PARTITION_SIZE="${PARTITION_SIZE#?}" FLAG_PARTITION=0 ;; *) -- Gitee From 100d7af8a78e3654e68464f85aefbfa6405a88d7 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 7 Aug 2024 09:30:27 +0800 Subject: [PATCH 036/116] [partition] v8. add to vm from docker --- scripts/create/imageCreate.sh | 9 ++++++--- scripts/kbimg.sh | 13 ++++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index 4ed68244..323ae113 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -119,15 +119,18 @@ function create_vm_img() { local opt=$1 shift local BOOT_MODE=$5 - local FLAG_PARTITION=${17} - local PARTITION_NUM=${18} - local PARTITION_SIZE=${19} case $opt in "repo") + local FLAG_PARTITION=${17} + local PARTITION_NUM=${18} + local PARTITION_SIZE=${19} create_os_tar_from_repo "$@" create_img "${BOOT_MODE}" "${FLAG_PARTITION}" "${PARTITION_NUM}" "${PARTITION_SIZE}" ;; "docker") + local FLAG_PARTITION=$2 + local PARTITION_NUM=$3 + local PARTITION_SIZE=$4 create_os_tar_from_docker "$@" create_img "${BOOT_MODE}" "${FLAG_PARTITION}" "${PARTITION_NUM}" "${PARTITION_SIZE}" ;; diff --git a/scripts/kbimg.sh b/scripts/kbimg.sh index 069ffdd4..d9565948 100644 --- a/scripts/kbimg.sh +++ b/scripts/kbimg.sh @@ -88,9 +88,10 @@ options: -d docker image like repository/name:tag -l boot to legacy BIOS mode, if not specify, then UEFI mode -c copy file to the specified directory - -s add new systemd services (use -c to copy .service file) + -s enable new systemd services (use -c to copy .service files) -g grub password -u add new user + -k execute hook scripts (use -c to copy .sh files) -h,--help show help information EOF } @@ -110,10 +111,11 @@ options: -d docker image like repository/name:tag -l boot to legacy BIOS mode, if not specify, then UEFI mode -c copy file to the specified directory - -s add new systemd services (use -c to copy .service file) + -s enable new systemd services (use -c to copy .service files) -g grub password -u add new user -t custom partition (for vm-image, omni the size of the last partition) + -k execute hook scripts (use -c to copy .sh files) -h,--help show help information EOF } @@ -430,7 +432,12 @@ function verify_create_input() { if [[ $# -ge 2 ]]; then verify_docker_input "$@" check_docker_exist "${DOCKER_IMG}" - create_vm_img "docker" "${DOCKER_IMG}" + create_vm_img \ + "docker" \ + "${DOCKER_IMG}" \ + "${FLAG_PARTITION}" \ + "${PARTITION_NUM}" \ + "${PARTITION_SIZE}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage -- Gitee From 4afff7a5ed28186b146db46cd429f5e6543e70f4 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 7 Aug 2024 10:14:37 +0800 Subject: [PATCH 037/116] [hook] v1 --- scripts/create/imageCreate.sh | 6 +++--- scripts/create/rootfsCreate.sh | 27 ++++++++++++++++++++++++--- scripts/kbimg.sh | 18 ++++++++++++++---- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index 323ae113..5edbb0a5 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -121,9 +121,9 @@ function create_vm_img() { local BOOT_MODE=$5 case $opt in "repo") - local FLAG_PARTITION=${17} - local PARTITION_NUM=${18} - local PARTITION_SIZE=${19} + local FLAG_PARTITION=${18} + local PARTITION_NUM=${19} + local PARTITION_SIZE=${20} create_os_tar_from_repo "$@" create_img "${BOOT_MODE}" "${FLAG_PARTITION}" "${PARTITION_NUM}" "${PARTITION_SIZE}" ;; diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index bc24e2be..bb1173fc 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -72,6 +72,7 @@ function install_misc() { local USERPASSWDS=${13} local GROUPNAMES=${14} local SUPERUSERS=${15} + local FLAG_HOOK=${16} local DNS_CONF="${PWD}/resolv.conf" cp ../files/*mount ../files/os-agent.service "${RPM_ROOT}/usr/lib/systemd/system/" cp ../files/os-release "${RPM_ROOT}/usr/lib/" @@ -140,8 +141,8 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ else dst_dir="${dst_dirs[$i]}" fi - local systemd_service="${dst_dirs[$i]}/${service_basename}" - systemd_service="${systemd_service#"${RPM_ROOT}"}" + dst_dir="${dst_dir#"${RPM_ROOT}"}" + local systemd_service="${dst_dir}/${service_basename}" chroot "${RPM_ROOT}" bash -c " systemctl enable \"${systemd_service}\" " @@ -170,6 +171,24 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ chroot "${RPM_ROOT}" bash /add_user.sh "${usernames[$i]}" "${userpasswds[$i]}" "${groupnames[$i]}" "${superusers[$i]}" done fi + if [ "$FLAG_HOOK" -eq 0 ]; then + local num_files=${#src_files[@]} + for ((i=0; i Date: Wed, 7 Aug 2024 10:20:40 +0800 Subject: [PATCH 038/116] [hook] v2. shellcheck --- scripts/create/rootfsCreate.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index bb1173fc..3397a695 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -185,7 +185,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ fi dst_dir="${dst_dir#"${RPM_ROOT}"}" local hook_script="${dst_dirs[$i]}/${script_basename}" - chroot "${RPM_ROOT}" bash hook_script + chroot "${RPM_ROOT}" bash "${hook_script}" fi done fi -- Gitee From 99650827b3e969905edf08d2e6f883874eca3969 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 7 Aug 2024 10:47:24 +0800 Subject: [PATCH 039/116] [hook] v3. bugfix --- scripts/create/rootfsCreate.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 3397a695..c5f18eae 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -184,7 +184,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ dst_dir="${dst_dirs[$i]}" fi dst_dir="${dst_dir#"${RPM_ROOT}"}" - local hook_script="${dst_dirs[$i]}/${script_basename}" + local hook_script="${dst_dir}/${script_basename}" chroot "${RPM_ROOT}" bash "${hook_script}" fi done -- Gitee From 5a72d6469ca5d747ccf5aa2c03693213ffa29fbf Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 7 Aug 2024 11:05:04 +0800 Subject: [PATCH 040/116] move copy user.sh into if --- scripts/create/rootfsCreate.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index c5f18eae..282da16c 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -107,7 +107,6 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ fi cp -r ./00bootup "${RPM_ROOT}"/usr/lib/dracut/modules.d/ cp set_in_chroot.sh "${RPM_ROOT}" - cp add_user.sh "${RPM_ROOT}" ROOT_PWD="${PASSWD}" BOOT_MODE="${BOOT_MODE}" chroot "${RPM_ROOT}" bash /set_in_chroot.sh rm "${RPM_ROOT}/set_in_chroot.sh" if [ -e "${DNS_CONF}" ]; then @@ -150,6 +149,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ done fi if [ "$FLAG_ADD_USER" -eq 0 ]; then + cp add_user.sh "${RPM_ROOT}" local usernames=() local userpasswds=() local groupnames=() @@ -170,6 +170,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ for ((i=0; i Date: Wed, 7 Aug 2024 15:07:20 +0800 Subject: [PATCH 041/116] remove partition --- scripts/create/imageCreate.sh | 34 +++++----------------------------- scripts/kbimg.sh | 19 +++---------------- 2 files changed, 8 insertions(+), 45 deletions(-) diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index 5edbb0a5..79052557 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -26,27 +26,9 @@ function create_img() { parted system.img -s mklabel gpt parted system.img -s mkpart primary fat32 1MiB 60MiB fi - if [ "${FLAG_PARTITION}" -eq 0 ]; then - local PARTITION_NUM=$3 - local PARTITION_SIZE=$4 - local partition_size=() - while read -r size; do - partition_size+=("${size}") - done < <(echo "$PARTITION_SIZE" | awk -F ':' '{for(i=1; i<=NF; i++) print $i}') - local offset=60 - for ((i=1;i<=PARTITION_NUM;i++)); do - if [ "$i" -lt "$PARTITION_NUM" ]; then - parted system.img -s mkpart primary ext4 "${offset}"MiB "$((offset + partition_size[i - 1]))"MiB - offset=$((offset + partition_size[i - 1])) - else - parted system.img -s mkpart primary ext4 "${offset}"MiB 100% - fi - done - else - parted system.img -s mkpart primary ext4 60MiB 2160MiB - parted system.img -s mkpart primary ext4 2160MiB 4260MiB - parted system.img -s mkpart primary ext4 4260MiB 100% - fi + parted system.img -s mkpart primary ext4 60MiB 2160MiB + parted system.img -s mkpart primary ext4 2160MiB 4260MiB + parted system.img -s mkpart primary ext4 4260MiB 100% local device device=$(losetup -f) losetup "${device}" system.img @@ -121,18 +103,12 @@ function create_vm_img() { local BOOT_MODE=$5 case $opt in "repo") - local FLAG_PARTITION=${18} - local PARTITION_NUM=${19} - local PARTITION_SIZE=${20} create_os_tar_from_repo "$@" - create_img "${BOOT_MODE}" "${FLAG_PARTITION}" "${PARTITION_NUM}" "${PARTITION_SIZE}" + create_img "${BOOT_MODE}" ;; "docker") - local FLAG_PARTITION=$2 - local PARTITION_NUM=$3 - local PARTITION_SIZE=$4 create_os_tar_from_docker "$@" - create_img "${BOOT_MODE}" "${FLAG_PARTITION}" "${PARTITION_NUM}" "${PARTITION_SIZE}" + create_img "${BOOT_MODE}" ;; esac diff --git a/scripts/kbimg.sh b/scripts/kbimg.sh index e0d52f16..44c0f8e0 100644 --- a/scripts/kbimg.sh +++ b/scripts/kbimg.sh @@ -32,9 +32,6 @@ USERPASSWDS="" GROUPNAMES="" SUPERUSERS="" FLAG_HOOK=1 -FLAG_PARTITION=1 -PARTITION_NUM=0 -PARTITION_SIZE="" source common/globalVariables.sh &>/dev/null source common/log.sh &>/dev/null @@ -100,7 +97,7 @@ EOF function show_vm_pxe_image_usage() { cat << EOF -Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password -c src-file:dst-dir -g grub2-password -u username:password:groupname:sudoflag -t partition-num:size1:size2:... +Usage : kbimg create [vm-image|pxe-image] -p iso-path -v os-version -b os-agent-dir -e os-password -c src-file:dst-dir -g grub2-password -u username:password:groupname:sudoflag or kbimg create [vm-image|pxe-image] -d repository/name:tag @@ -115,7 +112,6 @@ options: -s enable new systemd services (use -c to copy .service files) -g grub password -u add new user - -t custom partition (for vm-image, omni the size of the last partition) -k execute hook scripts (use -c to copy .sh files) -h,--help show help information EOF @@ -247,7 +243,7 @@ function verify_repo_input() { fi done set -eE - while getopts "p:v:e:b:lc:g:su:t:k" opt + while getopts "p:v:e:b:lc:g:su:k" opt do case $opt in p) @@ -289,12 +285,6 @@ function verify_repo_input() { SUPERUSERS+=" $(echo "$OPTARG" | awk -F ':' '{print $4}')" FLAG_ADD_USER=0 ;; - t) - check_param "$OPTARG" - PARTITION_NUM="${OPTARG%%:*}" - PARTITION_SIZE="${OPTARG#*:}" - FLAG_PARTITION=0 - ;; k) FLAG_HOOK=0 ;; @@ -428,10 +418,7 @@ function verify_create_input() { "${USERPASSWDS}" \ "${GROUPNAMES}" \ "${SUPERUSERS}" \ - "${FLAG_HOOK}" \ - "${FLAG_PARTITION}" \ - "${PARTITION_NUM}" \ - "${PARTITION_SIZE}" + "${FLAG_HOOK}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage -- Gitee From 34a7b29fc3bd403572ff1cd878869d212417c396 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 7 Aug 2024 15:08:17 +0800 Subject: [PATCH 042/116] remove partition --- scripts/create/imageCreate.sh | 1 - scripts/kbimg.sh | 7 +------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index 79052557..211c00f6 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -14,7 +14,6 @@ IMG_SIZE=20 PWD="$(pwd)" function create_img() { local BOOT_MODE=$1 - local FLAG_PARTITION=$2 rm -f system.img update.img qemu-img create system.img ${IMG_SIZE}G if [ "$BOOT_MODE" = "legacy" ]; then diff --git a/scripts/kbimg.sh b/scripts/kbimg.sh index 44c0f8e0..e94db8b0 100644 --- a/scripts/kbimg.sh +++ b/scripts/kbimg.sh @@ -428,12 +428,7 @@ function verify_create_input() { if [[ $# -ge 2 ]]; then verify_docker_input "$@" check_docker_exist "${DOCKER_IMG}" - create_vm_img \ - "docker" \ - "${DOCKER_IMG}" \ - "${FLAG_PARTITION}" \ - "${PARTITION_NUM}" \ - "${PARTITION_SIZE}" + create_vm_img "docker" "${DOCKER_IMG}" else log_error_print "the number of parameters is incorrect, please check it." show_vm_pxe_image_usage -- Gitee From 2f2eb672ab9257e82c45b605990adb91fd05f934 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 7 Aug 2024 16:24:54 +0800 Subject: [PATCH 043/116] function for user config --- scripts/create/rootfsCreate.sh | 58 +++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 282da16c..481cd5c9 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -61,18 +61,6 @@ function install_misc() { local AGENT_PATH=$2 local PASSWD=$3 local BOOT_MODE=$4 - local FLAG_COPY_FILE=$5 - local SRC_FILES=$6 - local DST_DIRS=$7 - local FLAG_SYSTEMD=$8 - local FLAG_GRUB_PASSWD=$9 - local GRUB2_PASSWD=${10} - local FLAG_ADD_USER=${11} - local USERNAMES=${12} - local USERPASSWDS=${13} - local GROUPNAMES=${14} - local SUPERUSERS=${15} - local FLAG_HOOK=${16} local DNS_CONF="${PWD}/resolv.conf" cp ../files/*mount ../files/os-agent.service "${RPM_ROOT}/usr/lib/systemd/system/" cp ../files/os-release "${RPM_ROOT}/usr/lib/" @@ -87,23 +75,14 @@ EOF echo "VERSION_ID=${VERSION}" >> "${RPM_ROOT}/usr/lib/os-release" mv "${RPM_ROOT}"/boot/vmlinuz* "${RPM_ROOT}/boot/vmlinuz" mv "${RPM_ROOT}"/boot/initramfs* "${RPM_ROOT}/boot/initramfs.img" - local GRUB_PATH if [ "$BOOT_MODE" = "legacy" ]; then cp grub.cfg "${RPM_ROOT}"/boot/grub2 sed -i "s/insmod part_gpt/insmod part_msdos/g; \ s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ "${RPM_ROOT}"/boot/grub2/grub.cfg - GRUB_PATH="${RPM_ROOT}"/boot/grub2 else - cp grub.cfg "${RPM_ROOT}"/boot/efi/EFI/openEuler - GRUB_PATH="${RPM_ROOT}"/boot/efi/EFI/openEuler - fi - if [ "$FLAG_GRUB_PASSWD" -eq 0 ]; then - local GRUB2_PASSWD_H - GRUB2_PASSWD_H=$(echo -e "${GRUB2_PASSWD}\n${GRUB2_PASSWD}" | grub2-mkpasswd-pbkdf2 | grep PBKDF2 | awk '{print $7}') - echo "GRUB2_PASSWD=${GRUB2_PASSWD_H}" > "${GRUB_PATH}/user.cfg" - chmod 600 "${GRUB_PATH}/user.cfg" + cp grub.cfg "${RPM_ROOT}"/boot/efi/EFI/openEuler fi cp -r ./00bootup "${RPM_ROOT}"/usr/lib/dracut/modules.d/ cp set_in_chroot.sh "${RPM_ROOT}" @@ -112,6 +91,29 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ if [ -e "${DNS_CONF}" ]; then cp "${DNS_CONF}" "${RPM_ROOT}/etc/resolv.conf" fi +} + +function custom_config() { + local BOOT_MODE=$1 + local FLAG_COPY_FILE=$2 + local SRC_FILES=$3 + local DST_DIRS=$4 + local FLAG_SYSTEMD=$5 + local FLAG_GRUB_PASSWD=$6 + local GRUB2_PASSWD=$7 + local FLAG_ADD_USER=$8 + local USERNAMES=$9 + local USERPASSWDS=${10} + local GROUPNAMES=${11} + local SUPERUSERS=${12} + local FLAG_HOOK=${13} + + local GRUB_PATH + if [ "$BOOT_MODE" = "legacy" ]; then + GRUB_PATH="${RPM_ROOT}"/boot/grub2 + else + GRUB_PATH="${RPM_ROOT}"/boot/efi/EFI/openEuler + fi local src_files=() local dst_dirs=() @@ -148,6 +150,12 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ fi done fi + if [ "$FLAG_GRUB_PASSWD" -eq 0 ]; then + local GRUB2_PASSWD_H + GRUB2_PASSWD_H=$(echo -e "${GRUB2_PASSWD}\n${GRUB2_PASSWD}" | grub2-mkpasswd-pbkdf2 | grep PBKDF2 | awk '{print $7}') + echo "GRUB2_PASSWD=${GRUB2_PASSWD_H}" > "${GRUB_PATH}/user.cfg" + chmod 600 "${GRUB_PATH}/user.cfg" + fi if [ "$FLAG_ADD_USER" -eq 0 ]; then cp add_user.sh "${RPM_ROOT}" local usernames=() @@ -211,10 +219,8 @@ function create_os_tar_from_repo() { local SUPERUSERS=${16} local FLAG_HOOK=${17} install_packages "${REPO}" "${BOOT_MODE}" - install_misc \ - "${VERSION}" \ - "${AGENT_PATH}" \ - "${PASSWD}" \ + install_misc "${VERSION}" "${AGENT_PATH}" "${PASSWD}" "${BOOT_MODE}" + custom_config \ "${BOOT_MODE}" \ "${FLAG_COPY_FILE}" \ "${SRC_FILES}" \ -- Gitee From a242ca2d269c9df5a08beaa9124c419f88c3fe29 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 8 Aug 2024 10:09:48 +0800 Subject: [PATCH 044/116] init --- .taplo.toml | 6 + KubeOS-Rust/Cargo.lock | 148 ++++++++++++++++++++++- KubeOS-Rust/Cargo.toml | 2 +- KubeOS-Rust/kbimg/Cargo.toml | 15 +++ KubeOS-Rust/kbimg/kbimg.toml | 43 +++++++ KubeOS-Rust/kbimg/src/admin_container.rs | 12 ++ KubeOS-Rust/kbimg/src/commands.rs | 122 +++++++++++++++++++ KubeOS-Rust/kbimg/src/docker_img.rs | 12 ++ KubeOS-Rust/kbimg/src/main.rs | 117 ++++++++++++++++++ KubeOS-Rust/kbimg/src/repo.rs | 12 ++ KubeOS-Rust/kbimg/src/utils.rs | 62 ++++++++++ KubeOS-Rust/kbimg/src/values.rs | 2 + 12 files changed, 551 insertions(+), 2 deletions(-) create mode 100644 .taplo.toml create mode 100644 KubeOS-Rust/kbimg/Cargo.toml create mode 100644 KubeOS-Rust/kbimg/kbimg.toml create mode 100644 KubeOS-Rust/kbimg/src/admin_container.rs create mode 100644 KubeOS-Rust/kbimg/src/commands.rs create mode 100644 KubeOS-Rust/kbimg/src/docker_img.rs create mode 100644 KubeOS-Rust/kbimg/src/main.rs create mode 100644 KubeOS-Rust/kbimg/src/repo.rs create mode 100644 KubeOS-Rust/kbimg/src/utils.rs create mode 100644 KubeOS-Rust/kbimg/src/values.rs diff --git a/.taplo.toml b/.taplo.toml new file mode 100644 index 00000000..2af124ff --- /dev/null +++ b/.taplo.toml @@ -0,0 +1,6 @@ +[[rule]] + +[rule.formatting] +indent_string = " " +reorder_arrays = true +reorder_keys = true diff --git a/KubeOS-Rust/Cargo.lock b/KubeOS-Rust/Cargo.lock index 93e3d07d..4ffc2bc2 100644 --- a/KubeOS-Rust/Cargo.lock +++ b/KubeOS-Rust/Cargo.lock @@ -187,6 +187,45 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "clap" +version = "3.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" +dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_derive", + "clap_lex", + "indexmap 1.9.3", + "once_cell", + "strsim", + "termcolor", + "textwrap", +] + +[[package]] +name = "clap_derive" +version = "3.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "cli" version = "1.0.6" @@ -632,6 +671,12 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1067,6 +1112,19 @@ dependencies = [ "url", ] +[[package]] +name = "kbimg" +version = "1.0.5" +dependencies = [ + "anyhow", + "clap", + "env_logger", + "log", + "regex", + "serde", + "toml 0.7.6", +] + [[package]] name = "kube" version = "0.66.0" @@ -1453,6 +1511,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + [[package]] name = "parity-tokio-ipc" version = "0.9.0" @@ -1587,7 +1651,31 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", ] [[package]] @@ -2013,6 +2101,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2194,6 +2291,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" +[[package]] +name = "textwrap" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" + [[package]] name = "thiserror" version = "1.0.50" @@ -2371,6 +2474,40 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tower" version = "0.4.13" @@ -2825,6 +2962,15 @@ version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" diff --git a/KubeOS-Rust/Cargo.toml b/KubeOS-Rust/Cargo.toml index 68ee670a..2886023f 100644 --- a/KubeOS-Rust/Cargo.toml +++ b/KubeOS-Rust/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["agent", "cli", "manager", "proxy"] +members = ["agent", "cli", "kbimg", "manager", "proxy"] resolver = "2" [profile.release] diff --git a/KubeOS-Rust/kbimg/Cargo.toml b/KubeOS-Rust/kbimg/Cargo.toml new file mode 100644 index 00000000..db206ea5 --- /dev/null +++ b/KubeOS-Rust/kbimg/Cargo.toml @@ -0,0 +1,15 @@ +[package] +description = "KubeOS kbimg" +edition = "2021" +license = "MulanPSL-2.0" +name = "kbimg" +version = "1.0.5" + +[dependencies] +anyhow = { version = "1.0" } +clap = { version = "=3.2.23", features = ["derive"] } +env_logger = { version = "0.9" } +log = { version = "= 0.4.15" } +regex = { version = "1.7.3" } +serde = { version = "1.0", features = ["derive"] } +toml = { version = "=0.7.6" } diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml new file mode 100644 index 00000000..f57c6578 --- /dev/null +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -0,0 +1,43 @@ +[from_repo] +agent_path = "./agent" +image_type = "vm-repo" +legacy_bios = true +repo_path = "./openEuler.repo" +root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" +version = "v1" + +[from_dockerimg] +image_name = "" +image_type = "vm-docker" + +[admin_container] +dockerfile = "" +image_name = "" + +[[users]] +groups = ["admin"] +name = "foo" +passwd = "foo" +sudo = "ALL=(ALL) ALL" + +[[users]] +groups = ["example"] +name = "bar" +passwd = "bar" + +[[copy_files]] +dst = "/persist/dst-file1" +src = "./src-file1" + +[[copy_files]] +dst = "/persist/dst-file2" +src = "./src-file2" + +[grub] +passwd = "foo" + +[systemd_service] +name = ["containerd", "kubelet"] + +[chroot_script] +path = "./chroot.sh" diff --git a/KubeOS-Rust/kbimg/src/admin_container.rs b/KubeOS-Rust/kbimg/src/admin_container.rs new file mode 100644 index 00000000..e611c72c --- /dev/null +++ b/KubeOS-Rust/kbimg/src/admin_container.rs @@ -0,0 +1,12 @@ +use std::path::PathBuf; + +use crate::{commands::AdminContainerInfo, Config, CreateImage}; + +impl CreateImage for AdminContainerInfo { + fn perpare(&self) -> anyhow::Result<()> { + todo!() + } + fn generate_scripts(&self, config: Config) -> anyhow::Result { + todo!() + } +} diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs new file mode 100644 index 00000000..a68899bc --- /dev/null +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -0,0 +1,122 @@ +use std::path::PathBuf; + +use clap::{Args, Parser, Subcommand}; +use serde::Deserialize; + +#[derive(Parser)] +#[clap(name = "kbimg")] +#[clap(author, version, about)] +#[clap(long_about = "A tool for creating KubeOS images.")] +pub struct Cli { + /// Path to the detailed configuration toml file + #[clap(short, long, value_parser)] + pub config: Option, + /// Enable debug mode, keep the scripts after execution + #[clap(short, long, action)] + pub debug: bool, + #[clap(subcommand)] + pub commands: Option, +} + +#[derive(Subcommand, Debug, Deserialize)] +pub enum Commands { + /// Create a new container image for upgrading KubeOS + #[clap(name = "upgrade-image")] + UpgradeImage(RepoInfo), + /// Create a new KubeOS vm image from repo + #[clap(name = "vm-repo")] + VMRepo(RepoInfo), + /// Create a new KubeOS vm image from docker image + #[clap(name = "vm-docker")] + VMDocker(DockerInfo), + /// Create a new KubeOS pxe image from repo + #[clap(name = "pxe-repo")] + PxeRepo(RepoInfo), + /// Create a new KubeOS pxe image from docker image + #[clap(name = "pxe-docker")] + PxeDocker(DockerInfo), + /// Create a KubeOS admin-container image + #[clap(name = "admin-container")] + AdminContainer(AdminContainerInfo), +} + +#[derive(Args, Debug, Deserialize, Clone)] +pub struct RepoInfo { + /// Required: KubeOS version + #[clap(short, long, value_parser)] + pub version: String, + /// Required: Repo path for installing packages + #[clap(short = 'p', long, value_parser)] + pub repo_path: PathBuf, + /// Required: Path to the agent binary + #[clap(short = 'b', long, value_parser)] + pub agent_path: PathBuf, + /// Required: Encrypted password for root user + #[clap(short = 'e', long, value_parser)] + pub root_passwd: String, + /// Optional: boot mode, default is uefi, enable this flag for legacy bios + #[clap(short, long, value_parser)] + pub legacy_bios: bool, + #[clap(skip)] + pub image_type: String, +} + +#[derive(Args, Debug, Deserialize, Clone)] +pub struct DockerInfo { + /// Required: Name of the container image + #[clap(short, long, value_parser)] + pub image_name: String, + #[clap(skip)] + pub image_type: String, +} + +#[derive(Args, Debug, Deserialize, Clone)] +pub struct AdminContainerInfo { + /// Required: Name of the container image + #[clap(short, long, value_parser)] + pub image_name: String, + /// Required: Path to the Dockerfile + #[clap(short, long, value_parser)] + pub dockerfile: PathBuf, +} + +#[derive(Debug, Deserialize, Default, Clone)] +pub struct Config { + pub from_repo: Option, + pub from_dockerimg: Option, + pub admin_container: Option, + pub users: Option>, + pub copy_files: Option>, + pub grub: Option, + pub systemd_service: Option, + pub chroot_script: Option, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct User { + pub name: String, + pub passwd: String, + pub groups: Option>, + pub sudo: Option, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct CopyFile { + pub src: String, + pub dst: String, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct Grub { + pub passwd: Option, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct SystemdService { + pub name: Vec, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct ChrootScript { + pub path: String, +} diff --git a/KubeOS-Rust/kbimg/src/docker_img.rs b/KubeOS-Rust/kbimg/src/docker_img.rs new file mode 100644 index 00000000..d65cf023 --- /dev/null +++ b/KubeOS-Rust/kbimg/src/docker_img.rs @@ -0,0 +1,12 @@ +use std::path::PathBuf; + +use crate::{commands::DockerInfo, Config, CreateImage}; + +impl CreateImage for DockerInfo { + fn perpare(&self) -> anyhow::Result<()> { + todo!() + } + fn generate_scripts(&self, config: Config) -> anyhow::Result { + todo!() + } +} diff --git a/KubeOS-Rust/kbimg/src/main.rs b/KubeOS-Rust/kbimg/src/main.rs new file mode 100644 index 00000000..e0f8e66b --- /dev/null +++ b/KubeOS-Rust/kbimg/src/main.rs @@ -0,0 +1,117 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. + * KubeOS is licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +use std::{fs, path::PathBuf, process::exit}; + +use anyhow::Result; +use clap::Parser; +use env_logger::{Builder, Env, Target}; +use log::{debug, error, info}; + +mod admin_container; +mod commands; +mod docker_img; +mod repo; +mod utils; +mod values; + +use utils::execute_scripts; + +use crate::commands::{Cli, Commands, Config}; + +trait CreateImage { + /// validate cmd args, check disk size and other prepare work + fn perpare(&self) -> Result<()>; + /// generate scripts for creating image. If debug is enabled, keep the scripts, otherwise execute them + fn generate_scripts(&self, config: Config) -> Result; +} + +fn process(info: Box, config: Config) -> Result<()> { + info.perpare()?; + let path = info.generate_scripts(config)?; + execute_scripts(path)?; + Ok(()) +} + +fn main() { + let cli = Cli::parse(); + if cli.debug { + Builder::from_env(Env::default().default_filter_or("debug")).target(Target::Stdout).init(); + } else { + Builder::from_env(Env::default().default_filter_or("info")).target(Target::Stdout).init(); + } + match cli.config { + Some(config) => { + info!("Loading config file"); + debug!("Config file path: {:?}", config); + let content = fs::read_to_string(config).unwrap(); + let data: Config = toml::from_str(&content).unwrap(); + debug!("Config: {:?}", data); + let info = if let Some(info) = data.from_repo.clone() { + Some(Box::new(info) as Box) + } else if let Some(info) = data.from_dockerimg.clone() { + Some(Box::new(info) as Box) + } else if let Some(info) = data.admin_container.clone() { + Some(Box::new(info) as Box) + } else { + None + }; + if let Some(i) = info { + match process(i, data) { + Ok(_) => { + info!("Image created successfully"); + }, + Err(e) => { + error!("Failed to create image: {:?}", e); + }, + } + } + exit(0); + }, + None => {}, + } + let info = match cli.commands { + Some(Commands::UpgradeImage(mut info)) => { + info.image_type = "upgrade".to_string(); + Some(Box::new(info) as Box) + }, + Some(Commands::VMRepo(mut info)) => { + info.image_type = "vm-repo".to_string(); + debug!("VMRepo: {:?}", info); + Some(Box::new(info) as Box) + }, + Some(Commands::VMDocker(mut info)) => { + info.image_type = "vm-docker".to_string(); + Some(Box::new(info) as Box) + }, + Some(Commands::PxeRepo(mut info)) => { + info.image_type = "pxe-repo".to_string(); + Some(Box::new(info) as Box) + }, + Some(Commands::PxeDocker(mut info)) => { + info.image_type = "pxe-docker".to_string(); + Some(Box::new(info) as Box) + }, + Some(Commands::AdminContainer(info)) => Some(Box::new(info) as Box), + None => None, + }; + if let Some(i) = info { + match process(i, Config::default()) { + Ok(_) => { + info!("Image created successfully"); + }, + Err(e) => { + error!("Failed to create image: {:?}", e); + }, + } + } +} diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs new file mode 100644 index 00000000..cdc8ac1b --- /dev/null +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -0,0 +1,12 @@ +use std::path::PathBuf; + +use crate::{commands::RepoInfo, Config, CreateImage}; + +impl CreateImage for RepoInfo { + fn perpare(&self) -> anyhow::Result<()> { + todo!() + } + fn generate_scripts(&self, config: Config) -> anyhow::Result { + todo!() + } +} diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs new file mode 100644 index 00000000..2983a41f --- /dev/null +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -0,0 +1,62 @@ +use std::{fs::File, io::Write, path::PathBuf, process::Command}; + +use anyhow::bail; +use log::{debug, error, info, trace}; + +pub(crate) fn execute_scripts(script: PathBuf) -> anyhow::Result<()> { + if !script.exists() { + bail!("Script does not exist: {:?}", script); + } + let status = Command::new("bash").arg(&script).status()?; + if !status.success() { + bail!("Failed to execute script: {}\n", script.display()); + } + Ok(()) +} + +pub(crate) fn write_vector_to_file(scripts: Vec, file_name: &str) -> anyhow::Result<()> { + debug!("Writing scripts to file: {:?}", file_name); + let mut file = File::create(file_name)?; + // set permissions based on regulation + for line in scripts { + write!(file, "{}", line)?; + } + Ok(()) +} + +/// Check if the input parameter is valid +pub(crate) fn is_valid_param + std::fmt::Debug>(param: S) -> bool { + let special_chars = vec!["|", ";", "&", "&&", "||", ">", ">>", "<", ",", "#", "!", "$"]; + !param.as_ref().chars().any(|c| special_chars.contains(&c.to_string().as_str())) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn init() { + let _ = env_logger::builder() + .target(env_logger::Target::Stdout) + .filter_level(log::LevelFilter::Trace) + .is_test(true) + .try_init(); + } + + #[test] + fn test_is_valid_param() { + init(); + assert_eq!(is_valid_param("test"), true); + assert_eq!(is_valid_param("test|test"), false); + assert_eq!(is_valid_param("test;test"), false); + assert_eq!(is_valid_param("test&test"), false); + assert_eq!(is_valid_param("test&&test"), false); + assert_eq!(is_valid_param("test||test"), false); + assert_eq!(is_valid_param("test>test"), false); + assert_eq!(is_valid_param("test>>test"), false); + assert_eq!(is_valid_param("test Date: Fri, 9 Aug 2024 18:04:59 +0800 Subject: [PATCH 045/116] prepare --- KubeOS-Rust/Cargo.lock | 254 ++++++++++++++++++----- KubeOS-Rust/kbimg/Cargo.toml | 2 + KubeOS-Rust/kbimg/kbimg.toml | 47 +++-- KubeOS-Rust/kbimg/src/admin_container.rs | 24 ++- KubeOS-Rust/kbimg/src/commands.rs | 3 + KubeOS-Rust/kbimg/src/docker_img.rs | 33 ++- KubeOS-Rust/kbimg/src/main.rs | 13 +- KubeOS-Rust/kbimg/src/repo.rs | 87 +++++++- KubeOS-Rust/kbimg/src/utils.rs | 13 +- KubeOS-Rust/kbimg/src/values.rs | 2 + 10 files changed, 385 insertions(+), 93 deletions(-) diff --git a/KubeOS-Rust/Cargo.lock b/KubeOS-Rust/Cargo.lock index 4ffc2bc2..f79f7983 100644 --- a/KubeOS-Rust/Cargo.lock +++ b/KubeOS-Rust/Cargo.lock @@ -61,7 +61,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.72", ] [[package]] @@ -72,7 +72,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.72", ] [[package]] @@ -172,11 +172,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -184,7 +190,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -263,6 +269,31 @@ dependencies = [ "libc", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + [[package]] name = "crypto-common" version = "0.1.6" @@ -543,7 +574,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.72", ] [[package]] @@ -904,7 +935,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.51.1", ] [[package]] @@ -1120,8 +1151,10 @@ dependencies = [ "clap", "env_logger", "log", + "nix 0.29.0", "regex", "serde", + "sysinfo", "toml 0.7.6", ] @@ -1236,9 +1269,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libredox" @@ -1292,7 +1325,7 @@ dependencies = [ "log", "mockall", "mockito", - "nix", + "nix 0.26.4", "predicates", "regex", "reqwest", @@ -1410,12 +1443,33 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.4.0", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "normalize-line-endings" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + [[package]] name = "num-traits" version = "0.2.17" @@ -1464,7 +1518,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.72", ] [[package]] @@ -1506,7 +1560,7 @@ dependencies = [ "lazy_static", "log", "manager", - "nix", + "nix 0.26.4", "serde", "serde_json", ] @@ -1588,7 +1642,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.72", ] [[package]] @@ -1680,9 +1734,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -1720,9 +1774,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1798,6 +1852,26 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.2.16" @@ -2075,7 +2149,7 @@ checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.72", ] [[package]] @@ -2226,9 +2300,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.37" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -2241,6 +2315,20 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sysinfo" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4115055da5f572fff541dd0c4e61b0262977f453cc9fe04be83aba25a89bdab" +dependencies = [ + "core-foundation-sys", + "libc", + "memchr", + "ntapi", + "rayon", + "windows", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -2299,22 +2387,22 @@ checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.72", ] [[package]] @@ -2377,7 +2465,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.72", ] [[package]] @@ -2592,7 +2680,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.72", ] [[package]] @@ -2726,7 +2814,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.72", "wasm-bindgen-shared", ] @@ -2760,7 +2848,7 @@ checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.72", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2821,6 +2909,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.51.1" @@ -2830,6 +2928,49 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -2845,7 +2986,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.6", ] [[package]] @@ -2865,17 +3006,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -2886,9 +3028,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -2898,9 +3040,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -2910,9 +3052,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -2922,9 +3070,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -2934,9 +3082,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -2946,9 +3094,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -2958,9 +3106,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" diff --git a/KubeOS-Rust/kbimg/Cargo.toml b/KubeOS-Rust/kbimg/Cargo.toml index db206ea5..99cdcfb0 100644 --- a/KubeOS-Rust/kbimg/Cargo.toml +++ b/KubeOS-Rust/kbimg/Cargo.toml @@ -10,6 +10,8 @@ anyhow = { version = "1.0" } clap = { version = "=3.2.23", features = ["derive"] } env_logger = { version = "0.9" } log = { version = "= 0.4.15" } +nix = "0.29.0" regex = { version = "1.7.3" } serde = { version = "1.0", features = ["derive"] } +sysinfo = "0.31.2" toml = { version = "=0.7.6" } diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index f57c6578..b458e7e3 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -1,10 +1,11 @@ [from_repo] -agent_path = "./agent" +agent_path = "/root/KubeOS/bin/os-agent" image_type = "vm-repo" legacy_bios = true -repo_path = "./openEuler.repo" +repo_path = "/etc/yum.repos.d/openEuler.repo" root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" version = "v1" +docker_img = "" [from_dockerimg] image_name = "" @@ -14,30 +15,30 @@ image_type = "vm-docker" dockerfile = "" image_name = "" -[[users]] -groups = ["admin"] -name = "foo" -passwd = "foo" -sudo = "ALL=(ALL) ALL" +# [[users]] +# groups = ["admin"] +# name = "foo" +# passwd = "foo" +# sudo = "ALL=(ALL) ALL" -[[users]] -groups = ["example"] -name = "bar" -passwd = "bar" +# [[users]] +# groups = ["example"] +# name = "bar" +# passwd = "bar" -[[copy_files]] -dst = "/persist/dst-file1" -src = "./src-file1" +# [[copy_files]] +# dst = "/persist/dst-file1" +# src = "./src-file1" -[[copy_files]] -dst = "/persist/dst-file2" -src = "./src-file2" +# [[copy_files]] +# dst = "/persist/dst-file2" +# src = "./src-file2" -[grub] -passwd = "foo" +# [grub] +# passwd = "foo" -[systemd_service] -name = ["containerd", "kubelet"] +# [systemd_service] +# name = ["containerd", "kubelet"] -[chroot_script] -path = "./chroot.sh" +# [chroot_script] +# path = "./chroot.sh" diff --git a/KubeOS-Rust/kbimg/src/admin_container.rs b/KubeOS-Rust/kbimg/src/admin_container.rs index e611c72c..b2c1c9cd 100644 --- a/KubeOS-Rust/kbimg/src/admin_container.rs +++ b/KubeOS-Rust/kbimg/src/admin_container.rs @@ -1,12 +1,32 @@ use std::path::PathBuf; +use anyhow::bail; +use crate::utils; use crate::{commands::AdminContainerInfo, Config, CreateImage}; impl CreateImage for AdminContainerInfo { - fn perpare(&self) -> anyhow::Result<()> { - todo!() + fn prepare(&self) -> anyhow::Result<()> { + let dockerfile = &self.dockerfile; + let image_name = &self.image_name; + verify_admin_input(&dockerfile, &image_name)?; + check_dockerfile_valid(&dockerfile)?; + Ok(()) } fn generate_scripts(&self, config: Config) -> anyhow::Result { todo!() } } + +fn verify_admin_input(dockerfile: &PathBuf, image_name: &str) -> anyhow::Result<()> { + if !utils::is_valid_param(dockerfile.to_str().unwrap()) { + bail!("params {} is invalid, please check input", dockerfile.to_str().unwrap()); + } + if !utils::is_valid_param(image_name) { + bail!("params {} is invalid, please check input", image_name); + } + Ok(()) +} + +fn check_dockerfile_valid(dockerfile: &PathBuf) -> anyhow::Result<()> { + utils::is_file_valid("admin-container Dockerfile", dockerfile) +} \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index a68899bc..2c7c3c8a 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -54,6 +54,9 @@ pub struct RepoInfo { /// Required: Encrypted password for root user #[clap(short = 'e', long, value_parser)] pub root_passwd: String, + /// Required only for upgrade: Docker image name + # [clap(short, long, value_parser)] + pub docker_img: String, /// Optional: boot mode, default is uefi, enable this flag for legacy bios #[clap(short, long, value_parser)] pub legacy_bios: bool, diff --git a/KubeOS-Rust/kbimg/src/docker_img.rs b/KubeOS-Rust/kbimg/src/docker_img.rs index d65cf023..f5c90345 100644 --- a/KubeOS-Rust/kbimg/src/docker_img.rs +++ b/KubeOS-Rust/kbimg/src/docker_img.rs @@ -1,12 +1,39 @@ -use std::path::PathBuf; +use std::{path::PathBuf, process::Command, str}; +use anyhow::bail; +use crate::utils; use crate::{commands::DockerInfo, Config, CreateImage}; impl CreateImage for DockerInfo { - fn perpare(&self) -> anyhow::Result<()> { - todo!() + fn prepare(&self) -> anyhow::Result<()> { + let image_name = &self.image_name; + verify_docker_input(&image_name)?; + check_docker_image(&image_name)?; + Ok(()) } fn generate_scripts(&self, config: Config) -> anyhow::Result { todo!() } } + +fn verify_docker_input(image_name: &str) -> anyhow::Result<()> { + if !utils::is_valid_param(image_name) { + bail!("params {} is invalid, please check input", image_name); + } + Ok(()) +} + +fn check_docker_image(image_name: &str) -> anyhow::Result<()> { + let output = Command::new("docker") + .args(&["images", "-q", image_name]) + .output() + .expect("Failed to execute command"); + + if output.status.success() { + let stdout = str::from_utf8(&output.stdout).expect("Invalid UTF-8 output"); + if stdout.trim().is_empty() { + bail!("docker image does NOT exist, please pull {} first.", image_name); + } + } + Ok(()) +} \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/main.rs b/KubeOS-Rust/kbimg/src/main.rs index e0f8e66b..de53a1c8 100644 --- a/KubeOS-Rust/kbimg/src/main.rs +++ b/KubeOS-Rust/kbimg/src/main.rs @@ -30,13 +30,13 @@ use crate::commands::{Cli, Commands, Config}; trait CreateImage { /// validate cmd args, check disk size and other prepare work - fn perpare(&self) -> Result<()>; + fn prepare(&self) -> Result<()>; /// generate scripts for creating image. If debug is enabled, keep the scripts, otherwise execute them fn generate_scripts(&self, config: Config) -> Result; } fn process(info: Box, config: Config) -> Result<()> { - info.perpare()?; + info.prepare()?; let path = info.generate_scripts(config)?; execute_scripts(path)?; Ok(()) @@ -44,11 +44,10 @@ fn process(info: Box, config: Config) -> Result<()> { fn main() { let cli = Cli::parse(); - if cli.debug { - Builder::from_env(Env::default().default_filter_or("debug")).target(Target::Stdout).init(); - } else { - Builder::from_env(Env::default().default_filter_or("info")).target(Target::Stdout).init(); - } + let default_log_level: &str = if cli.debug { "debug" } else { "info" }; + Builder::from_env(Env::default().default_filter_or(default_log_level)) + .target(Target::Stdout) + .init(); match cli.config { Some(config) => { info!("Loading config file"); diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index cdc8ac1b..ba784ace 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -1,12 +1,91 @@ -use std::path::PathBuf; +use std::{env, path::PathBuf, fs::File, fs::OpenOptions, io::Write}; +use anyhow::bail; +use sysinfo::Disks; +use crate::utils; +use crate::values::{RPM_ROOT, SCRIPT_NAME}; use crate::{commands::RepoInfo, Config, CreateImage}; impl CreateImage for RepoInfo { - fn perpare(&self) -> anyhow::Result<()> { - todo!() + fn prepare(&self) -> anyhow::Result<()> { + let repo_path = &self.repo_path; + let version = &self.version; + let agent_path = &self.agent_path; + let docker_img = &self.docker_img; + let image_type = &self.image_type; + if let Err(e) = verify_repo_input(&repo_path, &version, &agent_path, &docker_img) { + bail!(e); + } + if let Err(e) = check_disk_space(&image_type) { + bail!(e); + } + if let Err(e) = check_repo_file_valid(&repo_path) { + bail!(e); + } + if let Err(e) = check_agent_file_valid(&agent_path) { + bail!(e); + } + if let Err(e) = check_rootfs_occupied() { + bail!(e); + } + Ok(()) } + fn generate_scripts(&self, config: Config) -> anyhow::Result { - todo!() + todo!(); } } + +/// prepare +fn verify_repo_input(repo_path: &PathBuf, version: &str, agent_path: &PathBuf, docker_img: &str) -> anyhow::Result<()> { + if !utils::is_valid_param(repo_path.to_str().unwrap()) { + bail!("params {} is invalid, please check input", repo_path.to_str().unwrap()); + } + if !utils::is_valid_param(version) { + bail!("params {} is invalid, please check input", version); + } + if !utils::is_valid_param(agent_path.to_str().unwrap()) { + bail!("params {} is invalid, please check input", agent_path.to_str().unwrap()); + } + if !utils::is_valid_param(docker_img) { + bail!("params {} is invalid, please check input", docker_img); + } + Ok(()) +} + +fn check_disk_space(image_type: &str) -> anyhow::Result<()> { + let max_size: u64 = match image_type { + "upgrade-image" => 6, + "vm-repo" => 25, + "pxe-repo" => 5, + _ => bail!("Invalid image type: {}", image_type), + }; + + let current_dir = env::current_dir().expect("Failed to get current directory"); + let root_dir = current_dir.ancestors().last().expect("Failed to get current directory").to_path_buf(); + let disks: Disks = Disks::new_with_refreshed_list(); + for disk in &disks { + if disk.mount_point() == root_dir { + if disk.available_space() < max_size * 1024 * 1024 { + bail!("The available disk space is not enough, at least {}GiB.", max_size); + } + } + } + Ok(()) +} + +fn check_repo_file_valid(repo_path: &PathBuf) -> anyhow::Result<()> { + utils::is_file_valid("REPO file", repo_path) +} + +fn check_agent_file_valid(agent_path: &PathBuf) -> anyhow::Result<()> { + utils::is_file_valid("os-agent binary", agent_path) +} + +fn check_rootfs_occupied() -> anyhow::Result<()> { + let rpm_root = PathBuf::from(RPM_ROOT); + if rpm_root.is_dir() { + bail!("{} has existed, please confirm if rootfs is being used, or else remove the folder first.", rpm_root.to_str().unwrap()); + } + Ok(()) +} \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs index 2983a41f..0faa104f 100644 --- a/KubeOS-Rust/kbimg/src/utils.rs +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -1,7 +1,7 @@ use std::{fs::File, io::Write, path::PathBuf, process::Command}; use anyhow::bail; -use log::{debug, error, info, trace}; +use log::debug; pub(crate) fn execute_scripts(script: PathBuf) -> anyhow::Result<()> { if !script.exists() { @@ -30,6 +30,17 @@ pub(crate) fn is_valid_param + std::fmt::Debug>(param: S) -> bool !param.as_ref().chars().any(|c| special_chars.contains(&c.to_string().as_str())) } +/// Check if the path exists and is indeed a file +pub(crate) fn is_file_valid(msg: &str, path: &PathBuf) -> anyhow::Result<()> { + if !path.exists() { + bail!("{} does not exist: {:?}", msg, path); + } + if !path.is_file() { + bail!("{} exists but is not a file: {:?}", msg, path); + } + Ok(()) +} + #[cfg(test)] mod tests { use super::*; diff --git a/KubeOS-Rust/kbimg/src/values.rs b/KubeOS-Rust/kbimg/src/values.rs index 57b95018..b359f60f 100644 --- a/KubeOS-Rust/kbimg/src/values.rs +++ b/KubeOS-Rust/kbimg/src/values.rs @@ -1,2 +1,4 @@ pub(crate) const SCRIPT_NAME: &str = "kbimg.sh"; pub(crate) const BOOTLOADER_NAME: &str = "bootloader.sh"; + +pub(crate) const RPM_ROOT: &str = "rootfs"; \ No newline at end of file -- Gitee From 58f263e8ad3ebaeb4da0fba4a0f21969569c2c90 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Mon, 12 Aug 2024 22:44:56 +0800 Subject: [PATCH 046/116] =?UTF-8?q?=E6=B5=8B=E8=AF=95kbimg,sh=E7=94=9F?= =?UTF-8?q?=E6=88=90=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KubeOS-Rust/kbimg/src/commands.rs | 3 --- KubeOS-Rust/kbimg/src/main.rs | 7 ++++++- KubeOS-Rust/kbimg/src/repo.rs | 34 +++++++++++++++++++++++-------- KubeOS-Rust/kbimg/src/values.rs | 4 +++- scripts/kbimg.sh | 2 +- 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index 2c7c3c8a..a68899bc 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -54,9 +54,6 @@ pub struct RepoInfo { /// Required: Encrypted password for root user #[clap(short = 'e', long, value_parser)] pub root_passwd: String, - /// Required only for upgrade: Docker image name - # [clap(short, long, value_parser)] - pub docker_img: String, /// Optional: boot mode, default is uefi, enable this flag for legacy bios #[clap(short, long, value_parser)] pub legacy_bios: bool, diff --git a/KubeOS-Rust/kbimg/src/main.rs b/KubeOS-Rust/kbimg/src/main.rs index de53a1c8..a6bfe8c4 100644 --- a/KubeOS-Rust/kbimg/src/main.rs +++ b/KubeOS-Rust/kbimg/src/main.rs @@ -10,7 +10,7 @@ * See the Mulan PSL v2 for more details. */ -use std::{fs, path::PathBuf, process::exit}; +use std::{env, fs, path::PathBuf, process::exit}; use anyhow::Result; use clap::Parser; @@ -25,6 +25,7 @@ mod utils; mod values; use utils::execute_scripts; +use values::SCRIPTS_DIR; use crate::commands::{Cli, Commands, Config}; @@ -48,6 +49,10 @@ fn main() { Builder::from_env(Env::default().default_filter_or(default_log_level)) .target(Target::Stdout) .init(); + if let Err(e) = fs::create_dir_all(&SCRIPTS_DIR) { + error!("Failed to create scripts directory, {:?}", e); + exit(1); + } match cli.config { Some(config) => { info!("Loading config file"); diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index ba784ace..aa79911a 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -1,9 +1,12 @@ -use std::{env, path::PathBuf, fs::File, fs::OpenOptions, io::Write}; +use std::env; +use std::path::PathBuf; +use std::fs::{File, OpenOptions}; +use std::io::Write; use anyhow::bail; use sysinfo::Disks; -use crate::utils; -use crate::values::{RPM_ROOT, SCRIPT_NAME}; +use crate::{repo, utils}; +use crate::values::{KBIMG_NAME, RPM_ROOT, SCRIPTS_DIR}; use crate::{commands::RepoInfo, Config, CreateImage}; impl CreateImage for RepoInfo { @@ -11,9 +14,8 @@ impl CreateImage for RepoInfo { let repo_path = &self.repo_path; let version = &self.version; let agent_path = &self.agent_path; - let docker_img = &self.docker_img; let image_type = &self.image_type; - if let Err(e) = verify_repo_input(&repo_path, &version, &agent_path, &docker_img) { + if let Err(e) = verify_repo_input(&repo_path, &version, &agent_path) { bail!(e); } if let Err(e) = check_disk_space(&image_type) { @@ -32,12 +34,29 @@ impl CreateImage for RepoInfo { } fn generate_scripts(&self, config: Config) -> anyhow::Result { + create_kbimg(&format!("{}/{}", SCRIPTS_DIR, KBIMG_NAME), &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios); todo!(); } } +/// scripts +fn create_kbimg(path: &str, repo_path: &PathBuf, version: &str, agent_path: &PathBuf, root_passwd: &str, legacy_bios: bool) -> anyhow::Result<()> { + let mut file = File::create(path)?; + writeln!(file, r#" +#!/bin/bash +REPO_PATH="{}" +VERSION="{}" +AGENT_PATH="{}" +ROOT_PASSWD="{}" +BOOT_MODE="{}" + +create_vm_repo_image "${{REPO_PATH}}" "${{VERSION}}" "${{AGENT_PATH}}" "${{PASSWD}}" "${{BOOT_MODE}}" + "#, repo_path.to_str().unwrap(), version, agent_path.to_str().unwrap(), root_passwd, if legacy_bios { "legacy" } else { "uefi" })?; + Ok(()) +} + /// prepare -fn verify_repo_input(repo_path: &PathBuf, version: &str, agent_path: &PathBuf, docker_img: &str) -> anyhow::Result<()> { +fn verify_repo_input(repo_path: &PathBuf, version: &str, agent_path: &PathBuf) -> anyhow::Result<()> { if !utils::is_valid_param(repo_path.to_str().unwrap()) { bail!("params {} is invalid, please check input", repo_path.to_str().unwrap()); } @@ -47,9 +66,6 @@ fn verify_repo_input(repo_path: &PathBuf, version: &str, agent_path: &PathBuf, d if !utils::is_valid_param(agent_path.to_str().unwrap()) { bail!("params {} is invalid, please check input", agent_path.to_str().unwrap()); } - if !utils::is_valid_param(docker_img) { - bail!("params {} is invalid, please check input", docker_img); - } Ok(()) } diff --git a/KubeOS-Rust/kbimg/src/values.rs b/KubeOS-Rust/kbimg/src/values.rs index b359f60f..0dc757db 100644 --- a/KubeOS-Rust/kbimg/src/values.rs +++ b/KubeOS-Rust/kbimg/src/values.rs @@ -1,4 +1,6 @@ -pub(crate) const SCRIPT_NAME: &str = "kbimg.sh"; +pub(crate) const SCRIPTS_DIR: &str = "./scripts"; + +pub(crate) const KBIMG_NAME: &str = "kbimg.sh"; pub(crate) const BOOTLOADER_NAME: &str = "bootloader.sh"; pub(crate) const RPM_ROOT: &str = "rootfs"; \ No newline at end of file diff --git a/scripts/kbimg.sh b/scripts/kbimg.sh index e94db8b0..47e643b2 100644 --- a/scripts/kbimg.sh +++ b/scripts/kbimg.sh @@ -149,7 +149,7 @@ function clean_space() { delete_dir "${TMP_MOUNT_PATH}" delete_file os.tar rm -rf "${LOCK}" - delete_file ${ADMIN_CONTAINER_DIR}/hostshell + delete_file "${ADMIN_CONTAINER_DIR}"/hostshell } function clean_img() { -- Gitee From fdca5561396cace8230dcd91318ddebbed1ca408 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 13 Aug 2024 11:59:15 +0800 Subject: [PATCH 047/116] kbimg-rs-vm-repo --- KubeOS-Rust/kbimg/src/main.rs | 7 +- KubeOS-Rust/kbimg/src/repo.rs | 1051 +++++++++++++++++++++++++++++-- KubeOS-Rust/kbimg/src/utils.rs | 85 +++ KubeOS-Rust/kbimg/src/values.rs | 12 +- 4 files changed, 1109 insertions(+), 46 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/main.rs b/KubeOS-Rust/kbimg/src/main.rs index a6bfe8c4..3813663a 100644 --- a/KubeOS-Rust/kbimg/src/main.rs +++ b/KubeOS-Rust/kbimg/src/main.rs @@ -25,7 +25,6 @@ mod utils; mod values; use utils::execute_scripts; -use values::SCRIPTS_DIR; use crate::commands::{Cli, Commands, Config}; @@ -39,7 +38,7 @@ trait CreateImage { fn process(info: Box, config: Config) -> Result<()> { info.prepare()?; let path = info.generate_scripts(config)?; - execute_scripts(path)?; + // execute_scripts(path)?; Ok(()) } @@ -49,10 +48,6 @@ fn main() { Builder::from_env(Env::default().default_filter_or(default_log_level)) .target(Target::Stdout) .init(); - if let Err(e) = fs::create_dir_all(&SCRIPTS_DIR) { - error!("Failed to create scripts directory, {:?}", e); - exit(1); - } match cli.config { Some(config) => { info!("Loading config file"); diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index aa79911a..05366ce7 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -1,12 +1,12 @@ use std::env; use std::path::PathBuf; -use std::fs::{File, OpenOptions}; +use std::fs::{self, File}; use std::io::Write; use anyhow::bail; use sysinfo::Disks; -use crate::{repo, utils}; -use crate::values::{KBIMG_NAME, RPM_ROOT, SCRIPTS_DIR}; +use crate::utils; +use crate::values::{BOOTLOADER_NAME, BOOTUP_DIR, GLOBAL_CFG_NAME, GRUB_CFG_NAME, KBIMG_NAME, MODULE_SETUP_NAME, MOUNT_NAME, RPMLIST_NAME, SET_IN_CHROOT_NAME, UTILS_NAME}; use crate::{commands::RepoInfo, Config, CreateImage}; impl CreateImage for RepoInfo { @@ -15,43 +15,1030 @@ impl CreateImage for RepoInfo { let version = &self.version; let agent_path = &self.agent_path; let image_type = &self.image_type; - if let Err(e) = verify_repo_input(&repo_path, &version, &agent_path) { - bail!(e); - } - if let Err(e) = check_disk_space(&image_type) { - bail!(e); - } - if let Err(e) = check_repo_file_valid(&repo_path) { - bail!(e); - } - if let Err(e) = check_agent_file_valid(&agent_path) { - bail!(e); - } - if let Err(e) = check_rootfs_occupied() { - bail!(e); - } + verify_repo_input(&repo_path, &version, &agent_path)?; + check_disk_space(&image_type)?; + check_repo_file_valid(&repo_path)?; + check_agent_file_valid(&agent_path)?; Ok(()) } fn generate_scripts(&self, config: Config) -> anyhow::Result { - create_kbimg(&format!("{}/{}", SCRIPTS_DIR, KBIMG_NAME), &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios); - todo!(); + // ./00bootup + match fs::create_dir_all(BOOTUP_DIR) { + Ok(_) => { + let mut global_cfg = File::create(GLOBAL_CFG_NAME)?; + create_global_cfg(&mut global_cfg)?; + let mut module_setup = File::create(MODULE_SETUP_NAME)?; + create_module_setup(&mut module_setup)?; + let mut mount = File::create(MOUNT_NAME)?; + create_mount(&mut mount)?; + }, + Err(e) => { + bail!(e); + } + } + // grub.cfg + let mut grub_cfg = File::create(GRUB_CFG_NAME)?; + create_grub_cfg(&mut grub_cfg)?; + // utils.sh + let mut utils = File::create(UTILS_NAME)?; + create_utils(&mut utils)?; + // set_in_chroot.sh + let mut set_in_chroot = File::create(SET_IN_CHROOT_NAME)?; + create_set_in_chroot(&mut set_in_chroot)?; + // bootloader.sh + let mut bootloader = File::create(BOOTLOADER_NAME)?; + create_bootloader(&mut bootloader)?; + // rpmlist + let mut rpmlist = File::create(RPMLIST_NAME)?; + create_rpm_list(&mut rpmlist)?; + // kbimg.sh + let mut kbimg = File::create(KBIMG_NAME)?; + utils::create_global(&mut kbimg)?; + create_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios)?; + create_os_tar_from_repo(&mut kbimg)?; + create_img(&mut kbimg)?; + create_vm_repo_image(&mut kbimg)?; + + Ok(PathBuf::from(KBIMG_NAME)) } } /// scripts -fn create_kbimg(path: &str, repo_path: &PathBuf, version: &str, agent_path: &PathBuf, root_passwd: &str, legacy_bios: bool) -> anyhow::Result<()> { - let mut file = File::create(path)?; - writeln!(file, r#" -#!/bin/bash -REPO_PATH="{}" +fn create_global_cfg(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"# rootfs file name +rootfs_name=kubeos.tar + +# select the target disk to install kubeOS +disk=/dev/sda + +# pxe server ip address where stores the rootfs on the http server +server_ip=192.168.1.50 +# target machine ip +local_ip=192.168.1.100 +# target machine route +route_ip=192.168.1.1 +# target machine netmask +netmask=255.255.255.0 +# target machine netDevice name +net_name=eth0 +"# + )?; + Ok(()) +} + +fn create_module_setup(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"#!/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' +}} +"# + )?; + Ok(()) +} + +fn create_mount(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"#!/bin/bash +arch=$(arch) +min_size=8 +log=/install.log + +source ./Global.cfg + +function CheckSpace() {{ + local disk_ava + 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 mount_proc_dev_sys() {{ + local tmp_root=$1 + mount -t proc none "${{tmp_root}}/proc" + mount --bind /dev "${{tmp_root}}/dev" + mount --bind /dev/pts "${{tmp_root}}/dev/pts" + mount -t sysfs none "${{tmp_root}}/sys" +}} + +function GetDisk() {{ + mapfile -t disks < <(hwinfo --disk --short 2>&1 | grep -vi "^disk" | awk '{{print $1}}') + if [ ${{#disks[*]}} -gt 0 ]; then + if [ -n "${{disk}}" ] && echo "${{disks[@]}}" | grep -wq "${{disk}}" ; then + echo "${{disk}} exists, start partition" | tee -a ${{log}} + else + echo "disk not exist, please choose correct disk" | tee -a ${{log}} + fi + else + echo "no disk found" | tee -a ${{log}} + return 1 + fi + CheckSpace + local status=$? + if [ $status -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 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + parted "${{disk}}" -s mkpart primary fat16 1M 100M >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + parted "${{disk}}" -s mkpart primary ext4 100M 2600M >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + parted "${{disk}}" -s mkpart primary ext4 2600M 5100M >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + parted "${{disk}}" -s mkpart primary ext4 5100M 100% >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + parted "${{disk}}" -s set 1 boot on >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + mkfs.vfat -n "BOOT" "${{disk}}"1 >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "format failed" | tee -a ${{log}} + return 1 + fi + + mkfs.ext4 -L "ROOT-A" "${{disk}}"2 >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "format failed" | tee -a ${{log}} + return 1 + fi + + mkfs.ext4 -L "ROOT-B" "${{disk}}"3 >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "format failed" | tee -a ${{log}} + return 1 + fi + + mkfs.ext4 -L "PERSIST" "${{disk}}"4 >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "format failed" | tee -a ${{log}} + return 1 + fi + + return 0 +}} + +function InitNetwork() {{ + echo "Initializing network..." + mapfile -t netNames < <(ifconfig -a | awk '{{print $1}}' | grep : | grep '^e' | awk -F: '{{print $1}}') + if [ ${{#netNames[*]}} -gt 0 ]; then + if [ -n "${{net_name}}" ] && echo "${{netNames[@]}}" | grep -wq "${{net_name}}" ; then + echo "${{net_name}} exists, start set ip" | tee -a ${{log}} + else + echo "net_name not exist, choose default net" | tee -a ${{log}} + net_name=${{netNames[0]}} + fi + else + echo "no net Device found" | tee -a ${{log}} + return 1 + fi + + ifconfig "${{net_name}}" up + local status=$? + if [ $status -ne 0 ]; then + echo "load net card failed" | tee -a ${{log}} + return 1 + fi + sleep 3 + + ifconfig "${{net_name}}" "${{local_ip}}" netmask "${{netmask}}" >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "ip set failed" | tee -a ${{log}} + return 1 + fi + sleep 3 + + route add default gw "${{route_ip}}" >> ${{log}} 2>&1 + local status=$? + if [ $status -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 + local status=$? + if [ $status -ne 0 ]; then + echo "mount rootfs failed" | tee -a ${{log}} + return 1 + fi + + return 0 +}} + +function MountPersist() {{ + echo "Mounting persist" + mount "${{disk}}"4 /sysroot/persist >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "mount persist failed" | tee -a ${{log}} + return 1 + fi + mkdir /sysroot/persist/{{var,etc,etcwork}} + mkdir -p /sysroot/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 + local status=$? + if [ $status -ne 0 ]; then + echo "mount boot failed" | tee -a ${{log}} + return 1 + fi + return 0 +}} + +function GetRootfs() {{ + echo "Downloading rootfs..." + + curl -o /"${{rootfs_name}}" http://"${{server_ip}}"/"${{rootfs_name}}" + if [ ! -e "/${{rootfs_name}}" ]; then + echo "download rootfs failed" | tee -a ${{log}} + return 1 + fi + + tar -xf /"${{rootfs_name}}" -C /sysroot + local status=$? + if [ $status -ne 0 ]; then + echo "decompose rootfs failed" | tee -a ${{log}} + return 1 + fi + + rm -rf "${{rootfs_name:?}}" + mount -o remount,ro "${{disk}}"2 /sysroot >> ${{log}} 2>&1 + 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 + local status=$? + if [ $status -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 + local status=$? + if [ $status -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 + local status=$? + if [ $status -ne 0 ]; then + echo "install grub on x86 failed" | tee -a ${{log}} + return 1 + fi + fi + + if [ "$arch" == "aarch64" ]; then + Inst_Grub2_aarch64 + local status=$? + if [ $status -ne 0 ]; then + echo "install grub on aarch64 failed" | tee -a ${{log}} + return 1 + fi + fi + sed -i 's#/dev/sda#'"${{disk}}"'#g' /sysroot/boot/efi/EFI/openEuler/grub.cfg + + return 0 +}} + +function Bootup_Main() {{ + # get disk + echo "Checking disk info..." | tee -a ${{log}} + GetDisk + local status=$? + if [ $status -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 + local status=$? + if [ $status -ne 0 ]; then + echo "Partition and formatting disk failed" | tee -a ${{log}} + return 1 + fi + + # init network + echo "Initializing network..." | tee -a ${{log}} + InitNetwork + local status=$? + if [ $status -ne 0 ]; then + echo "Initializing network failed" | tee -a ${{log}} + return 1 + fi + + # mount partitions + + # mount boot + echo "Mounting root..." | tee -a ${{log}} + MountRoot + local status=$? + if [ $status -ne 0 ]; then + echo "Mounting root failed" | tee -a ${{log}} + return 1 + fi + + echo "Mounting boot..." | tee -a ${{log}} + MountBoot + local status=$? + if [ $status -ne 0 ]; then + echo "Mounting boot failed" | tee -a ${{log}} + return 1 + fi + + # download rootfs + echo "Downloading rootfs..." | tee -a ${{log}} + GetRootfs + local status=$? + if [ $status -ne 0 ]; then + echo "Downloading rootfs failed" | tee -a ${{log}} + return 1 + fi + mount_proc_dev_sys /sysroot + # set boot + echo "Setting boot..." | tee -a ${{log}} + SetBoot + local status=$? + if [ $status -ne 0 ]; then + echo "Setting boot failed" | tee -a ${{log}} + return 1 + fi + # mount persist + echo "Mounting persist..." | tee -a ${{log}} + MountPersist + local status=$? + if [ $status -ne 0 ]; then + echo "Mounting persist 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}} /sysroot/persist +else + echo "kubeOS install failed, see install.log" | tee -a ${{log}} +fi + +"# + )?; + Ok(()) +} + +fn create_grub_cfg(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"## Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. + # KubeOS is licensed under the Mulan PSL v2. + # You can use this software according to the terms and conditions of the Mulan PSL v2. + # You may obtain a copy of Mulan PSL v2 at: + # http://license.coscl.org.cn/MulanPSL2 + # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + # PURPOSE. +## See the Mulan PSL v2 for more details. +set pager=1 + +if [ -f ${{config_directory}}/grubenv ]; then + load_env -f ${{config_directory}}/grubenv +elif [ -s $prefix/grubenv ]; then + load_env +fi +if [ "${{next_entry}}" ] ; then + set default="${{next_entry}}" + set next_entry= + save_env next_entry + set boot_once=true +else + set default="${{saved_entry}}" +fi + +if [ x"${{feature_menuentry_id}}" = xy ]; then + menuentry_id_option="--id" +else + menuentry_id_option="" +fi + +export menuentry_id_option + +if [ "${{prev_saved_entry}}" ]; then + set saved_entry="${{prev_saved_entry}}" + save_env saved_entry + set prev_saved_entry= + save_env prev_saved_entry + set boot_once=true +fi + +function savedefault {{{{ + if [ -z "${{boot_once}}" ]; then + saved_entry="${{chosen}}" + save_env saved_entry + fi +}}}} + +function load_video {{{{ + if [ x$feature_all_video_module = xy ]; then + insmod all_video + else + insmod efi_gop + insmod efi_uga + insmod ieee1275_fb + insmod vbe + insmod vga + insmod video_bochs + insmod video_cirrus + fi +}}}} + +terminal_output console +if [ x$feature_timeout_style = xy ] ; then + set timeout_style=menu + set timeout=5 +# Fallback normal timeout code in case the timeout_style feature is +# unavailable. +else + set timeout=5 +fi +set superusers="root" +### END /etc/grub.d/00_header ### + +### BEGIN /etc/grub.d/01_users ### +if [ -f ${{prefix}}/user.cfg ]; then + source ${{prefix}}/user.cfg + if [ -n "${{GRUB2_PASSWORD}}" ]; then + set superusers="root" + export superusers + password_pbkdf2 root ${{GRUB2_PASSWORD}} + fi +fi +### END /etc/grub.d/01_users ### + +### BEGIN /etc/grub.d/10_linux ### +menuentry 'A' --class KubeOS --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'KubeOS-A' {{{{ + load_video + set gfxpayload=keep + insmod gzio + insmod part_gpt + insmod ext2 + set root='hd0,gpt2' + linux /boot/vmlinuz root=/dev/sda2 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 + initrd /boot/initramfs.img +}}}} + +menuentry 'B' --class KubeOS --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'KubeOS-B' {{{{ + load_video + set gfxpayload=keep + insmod gzio + insmod part_gpt + insmod ext2 + set root='hd0,gpt3' + linux /boot/vmlinuz root=/dev/sda3 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 + initrd /boot/initramfs.img +}}}} + +### END /etc/grub.d/10_linux ### + +### BEGIN /etc/grub.d/10_reset_boot_success ### +# Hiding the menu is ok if last boot was ok or if this is a first boot attempt to boot the entry +if [ "${{boot_success}}" = "1" -o "${{boot_indeterminate}}" = "1" ]; then + set menu_hide_ok=1 +else + set menu_hide_ok=0 +fi +# Reset boot_indeterminate after a successful boot +if [ "${{boot_success}}" = "1" ] ; then + set boot_indeterminate=0 +# Avoid boot_indeterminate causing the menu to be hidden more then once +elif [ "${{boot_indeterminate}}" = "1" ]; then + set boot_indeterminate=2 +fi +# Reset boot_success for current boot +set boot_success=0 +save_env boot_success boot_indeterminate +### END /etc/grub.d/10_reset_boot_success ### + +### BEGIN /etc/grub.d/12_menu_auto_hide ### +if [ x$feature_timeout_style = xy ] ; then + if [ "${{menu_show_once}}" ]; then + unset menu_show_once + save_env menu_show_once + set timeout_style=menu + set timeout=60 + elif [ "${{menu_auto_hide}}" -a "${{menu_hide_ok}}" = "1" ]; then + set orig_timeout_style=${{timeout_style}} + set orig_timeout=${{timeout}} + if [ "${{fastboot}}" = "1" ]; then + # timeout_style=menu + timeout=0 avoids the countdown code keypress check + set timeout_style=menu + set timeout=0 + else + set timeout_style=hidden + set timeout=1 + fi + fi +fi +### END /etc/grub.d/12_menu_auto_hide ### + +### BEGIN /etc/grub.d/20_linux_xen ### +### END /etc/grub.d/20_linux_xen ### + +### BEGIN /etc/grub.d/20_ppc_terminfo ### +### END /etc/grub.d/20_ppc_terminfo ### + +### BEGIN /etc/grub.d/30_uefi-firmware ### +### END /etc/grub.d/30_uefi-firmware ### + +### BEGIN /etc/grub.d/40_custom ### +# This file provides an easy way to add custom menu entries. Simply type the +# menu entries you want to add after this comment. Be careful not to change +# the 'exec tail' line above. +### END /etc/grub.d/40_custom ### + +### BEGIN /etc/grub.d/41_custom ### +if [ -f ${{config_directory}}/custom.cfg ]; then + source ${{config_directory}}/custom.cfg +elif [ -z "${{config_directory}}" -a -f $prefix/custom.cfg ]; then + source $prefix/custom.cfg; +fi +### END /etc/grub.d/41_custom ### +"# + )?; + Ok(()) +} + +fn create_utils(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"#!/bin/bash +## Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. +# KubeOS is licensed under the Mulan PSL v2. +# You can use this software according to the terms and conditions of the Mulan PSL v2. +# You may obtain a copy of Mulan PSL v2 at: +# http://license.coscl.org.cn/MulanPSL2 +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR +# PURPOSE. +## See the Mulan PSL v2 for more details. + +function mount_proc_dev_sys() {{ + local tmp_root=$1 + mount -t proc none "${{tmp_root}}/proc" + mount --bind /dev "${{tmp_root}}/dev" + mount --bind /dev/pts "${{tmp_root}}/dev/pts" + mount -t sysfs none "${{tmp_root}}/sys" +}} + +function unmount_dir() {{ + local dir=$1 + + if [ -L "${{dir}}" ] || [ -f "${{dir}}" ]; then + log_error_print "${{dir}} is not a directory, please check it." + return 1 + fi + + if [ ! -d "${{dir}}" ]; then + return 0 + fi + + local real_dir + real_dir=$(readlink -e "${{dir}}") + local mnts + mnts=$(awk '{{print $2}}' < /proc/mounts | grep "^${{real_dir}}" | sort -r) + for m in ${{mnts}}; do + log_info_print "Unmount ${{m}}" + umount -f "${{m}}" || true + done + + return 0 +}} + +function init_part() {{ + local offset + offset=$(fdisk -l system.img | grep "$1" | awk '{{print $2}}') + local sizelimit + sizelimit=$(fdisk -l system.img | grep "$1" | awk '{{print $3}}') + sizelimit=$(echo "($sizelimit - $offset)*512" | bc) + offset=$(echo "${{offset}}*512" | bc) + local loop + loop=$(losetup -f) + losetup -o "${{offset}}" --sizelimit "${{sizelimit}}" "${{loop}}" system.img + if [ "$2" == "BOOT" ];then + mkfs.vfat -n "$2" "${{loop}}" + mount -t vfat "${{loop}}" "$3" + else + mkfs.ext4 -L "$2" "${{loop}}" + mount -t ext4 "${{loop}}" "$3" + rm -rf "$3/lost+found" + fi +}} +"# + )?; + Ok(()) +} + +fn create_set_in_chroot(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"#!/bin/bash +ln -s /usr/lib/systemd/system/os-agent.service /usr/lib/systemd/system/multi-user.target.wants/os-agent.service +ln -s /usr/lib/systemd/system/kubelet.service /usr/lib/systemd/system/multi-user.target.wants/kubelet.service +if [ "$BOOT_MODE" = "legacy" ]; then + ln -s /usr/lib/systemd/system/boot-grub2.mount /lib/systemd/system/local-fs.target.wants/boot-grub2.mount +else + ln -s /usr/lib/systemd/system/boot-efi.mount /lib/systemd/system/local-fs.target.wants/boot-efi.mount +fi +ln -s /usr/lib/systemd/system/etc.mount /lib/systemd/system/local-fs.target.wants/etc.mount + +str=$(sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{{print $2}}') +umask 0666 +mv /etc/shadow /etc/shadow_bak +sed -i '/^root:/d' /etc/shadow_bak +echo "root:""${{ROOT_PASSWD}}""${{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 +"# + )?; + Ok(()) +} + +fn create_bootloader(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"#!/bin/bash +set -eu +set -o pipefail +set -x +ARCH=$(arch) + +function install_grub2_x86 () {{ + if [ "${{BOOT_MODE}}" = "legacy" ]; then + # make boot.img/core.img and setup, to support legacy boot mode + GRUBNAME=$(which grub2-install) + echo "Installing GRUB2..." + FORCE_OPT=${{FORCE_OPT:-"--force"}} + TARGET_OPT=${{TARGET_OPT:-"--target=i386-pc"}} + + $GRUBNAME --modules="biosdisk part_msdos" "${{FORCE_OPT}}" "${{TARGET_OPT}}" "${{DEVICE}}" + else + # make efi file, and save in FAT16 partition, to support UEFI boot mode + cp -r /usr/lib/grub/x86_64-efi boot/efi/EFI/openEuler + eval "grub2-mkimage -d /usr/lib/grub/x86_64-efi -O x86_64-efi --output=/boot/efi/EFI/openEuler/grubx64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" + + mkdir -p /boot/efi/EFI/BOOT/ + cp -f /boot/efi/EFI/openEuler/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI + fi +}} + +function install_grub2_efi () {{ + cp -r /usr/lib/grub/arm64-efi /boot/efi/EFI/openEuler/ + eval "grub2-mkimage -d /usr/lib/grub/arm64-efi -O arm64-efi --output=/boot/efi/EFI/openEuler/grubaa64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" + + mkdir -p /boot/efi/EFI/BOOT/ + cp -f /boot/efi/EFI/openEuler/grubaa64.efi /boot/efi/EFI/BOOT/BOOTAA64.EFI +}} + +if [ "${{ARCH}}" == "x86_64" ]; then + install_grub2_x86 +fi + +if [ "${{ARCH}}" == "aarch64" ]; then + install_grub2_efi +fi +"# + )?; + Ok(()) +} + +fn create_rpm_list(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"kernel +passwd +dhcp +NetworkManager +openssh-server +docker +kubernetes-kubeadm +kubernetes-kubelet +containernetworking-plugins +socat +conntrack-tools +ebtables +ethtool +rsyslog +vi +net-tools +hwinfo +dracut +coreutils +gawk +parted +dosfstools +sudo +"# + )?; + Ok(()) +} + +fn create_repo_vars(file: &mut File, repo_path: &PathBuf, version: &str, agent_path: &PathBuf, root_passwd: &str, legacy_bios: bool) -> anyhow::Result<()> { + writeln!(file, +r#"REPO_PATH="{}" VERSION="{}" AGENT_PATH="{}" -ROOT_PASSWD="{}" +ROOT_PASSWD='{}' BOOT_MODE="{}" +"#, + repo_path.to_str().unwrap(), + version, + agent_path.to_str().unwrap(), + root_passwd, + if legacy_bios { "legacy" } else { "uefi" })?; + Ok(()) +} + +fn create_os_tar_from_repo(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"function create_os_tar_from_repo() {{ + function prepare_yum() {{ + # init rpmdb + rpm --root "${{RPM_ROOT}}" --initdb + mkdir -p "${{RPM_ROOT}}"{{/etc/yum.repos.d,/persist,/proc,/dev/pts,/sys}} + mount_proc_dev_sys "${{RPM_ROOT}}" + # init yum repo + local iso_repo="${{RPM_ROOT}}/etc/yum.repos.d/iso.repo" + cat "${{REPO_PATH}}" > "$iso_repo" + }} + + function install_packages() {{ + prepare_yum "${{REPO}}" + + echo "install package.." + + local filesize + filesize=$(stat -c "%s" ./rpmlist) + local maxsize=$((1024*1024)) + if [ "${{filesize}}" -gt "${{maxsize}}" ]; then + echo "please check if rpmlist is too big or something wrong" + exit 7 + fi + + local rpms_name + rpms_name=$(tr "\n" " " < ./rpmlist) + old_ifs="$IFS" + IFS=' ' + if [ "${{ARCH}}" == "x86_64" ]; then + if [ "${{BOOT_MODE}}" = "legacy" ]; then + rpms_name+=" grub2" + else + rpms_name+=" grub2-efi grub2-tools grub2-efi-x64-modules grub2-pc-modules" + fi + read -ra rpms <<< "${{rpms_name}}" + IFS="$old_ifs" + yum -y --installroot="${{RPM_ROOT}}" install --nogpgcheck --setopt install_weak_deps=False "${{rpms[@]}}" + elif [ "${{ARCH}}" == "aarch64" ]; then + read -ra rpms <<< "${{rpms_name}}" + IFS="$old_ifs" + yum -y --installroot="${{RPM_ROOT}}" install --nogpgcheck --setopt install_weak_deps=False "${{rpms[@]}}" grub2-efi grub2-tools grub2-efi-aa64-modules + fi + yum -y --installroot="${{RPM_ROOT}}" clean all + }} + + function install_misc() {{ + local DNS_CONF="${{PWD}}/resolv.conf" + cp ../../files/*mount ../../files/os-agent.service "${{RPM_ROOT}}/usr/lib/systemd/system/" + cp ../../files/os-release "${{RPM_ROOT}}/usr/lib/" + cp "${{AGENT_PATH}}" "${{RPM_ROOT}}/usr/bin" + rm "${{RPM_ROOT}}/etc/os-release" -create_vm_repo_image "${{REPO_PATH}}" "${{VERSION}}" "${{AGENT_PATH}}" "${{PASSWD}}" "${{BOOT_MODE}}" - "#, repo_path.to_str().unwrap(), version, agent_path.to_str().unwrap(), root_passwd, if legacy_bios { "legacy" } else { "uefi" })?; + cat < "${{RPM_ROOT}}/usr/lib/os-release" +NAME=${{NAME}} +ID=${{NAME}} +EOF + echo "PRETTY_NAME=\"${{NAME}} ${{VERSION}}\"" >> "${{RPM_ROOT}}/usr/lib/os-release" + echo "VERSION_ID=${{VERSION}}" >> "${{RPM_ROOT}}/usr/lib/os-release" + mv "${{RPM_ROOT}}"/boot/vmlinuz* "${{RPM_ROOT}}/boot/vmlinuz" + mv "${{RPM_ROOT}}"/boot/initramfs* "${{RPM_ROOT}}/boot/initramfs.img" + if [ "$BOOT_MODE" = "legacy" ]; then + cp grub.cfg "${{RPM_ROOT}}"/boot/grub2 + sed -i "s/insmod part_gpt/insmod part_msdos/g; \ +s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ +s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ +"${{RPM_ROOT}}"/boot/grub2/grub.cfg + else + cp grub.cfg "${{RPM_ROOT}}"/boot/efi/EFI/openEuler + fi + cp -r ./00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ + cp set_in_chroot.sh "${{RPM_ROOT}}" + ROOT_PASSWD="${{ROOT_PASSWD}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{RPM_ROOT}}" bash /set_in_chroot.sh + rm "${{RPM_ROOT}}/set_in_chroot.sh" + if [ -e "${{DNS_CONF}}" ]; then + cp "${{DNS_CONF}}" "${{RPM_ROOT}}/etc/resolv.conf" + fi + }} + + install_packages "${{REPO_PATH}}" "${{BOOT_MODE}}" + install_misc "${{VERSION}}" "${{AGENT_PATH}}" "${{ROOT_PASSWD}}" "${{BOOT_MODE}}" + unmount_dir "${{RPM_ROOT}}" + tar -C "${{RPM_ROOT}}" -cf ./os.tar +}} +"# + )?; + Ok(()) +} + +fn create_img(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"function create_img() {{ + rm -f system.img update.img + qemu-img create system.img ${{IMG_SIZE}}G + if [ "${{BOOT_MODE}}" = "legacy" ]; then + local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/grub2 + parted system.img -s mklabel msdos + parted system.img -s mkpart primary ext4 1MiB 60MiB + else + local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/efi + parted system.img -s mklabel gpt + parted system.img -s mkpart primary fat32 1MiB 60MiB + fi + parted system.img -s mkpart primary ext4 60MiB 2160MiB + parted system.img -s mkpart primary ext4 2160MiB 4260MiB + parted system.img -s mkpart primary ext4 4260MiB 100% + local device + device=$(losetup -f) + losetup "${{device}}" system.img + + mkdir -p "${{TMP_MOUNT_PATH}}" + + init_part system.img2 ROOT-A "${{TMP_MOUNT_PATH}}" + + mkdir -p "${{BOOT_PATH}}" + chmod 755 "${{BOOT_PATH}}" + if [ "$BOOT_MODE" = "legacy" ]; then + init_part system.img1 GRUB2 "${{BOOT_PATH}}" + else + init_part system.img1 BOOT "${{BOOT_PATH}}" + fi + tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar + if [ "${{BOOT_MODE}}" = "legacy" ]; then + sed -i "s/insmod part_gpt/insmod part_msdos/g; \ +s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ +s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ +"${{TMP_MOUNT_PATH}}"/boot/grub2/grub.cfg + fi + sync + cp bootloader.sh "${{TMP_MOUNT_PATH}}" + mount_proc_dev_sys "${{TMP_MOUNT_PATH}}" + DEVICE="${{device}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{TMP_MOUNT_PATH}}" bash bootloader.sh + rm -rf "${{TMP_MOUNT_PATH}}/bootloader.sh" + sync + + dd if=/dev/disk/by-label/ROOT-A of=update.img bs=8M + sync + unmount_dir "${{TMP_MOUNT_PATH}}" + init_part system.img3 ROOT-B "${{TMP_MOUNT_PATH}}" + umount "${{TMP_MOUNT_PATH}}" + + init_part system.img4 PERSIST "${{TMP_MOUNT_PATH}}" + mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}} + mkdir -p "${{TMP_MOUNT_PATH}}"/etc/KubeOS/certs + umount "${{TMP_MOUNT_PATH}}" + + losetup -D + parted system.img -- set 1 boot on + qemu-img convert system.img -O qcow2 system.qcow2 +}} +"# + )?; + Ok(()) +} + +fn create_vm_repo_image(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"function create_vm_repo_image() {{ + create_os_tar_from_repo \ + "${{REPO_PATH}}" \ + "${{VERSION}}" \ + "${{AGENT_PATH}}" \ + "${{ROOT_PASSWD}}" \ + "${{BOOT_MODE}}" + create_img "${{BOOT_MODE}}" +}} + +test_lock +trap clean_space EXIT +trap clean_img ERR + +create_vm_repo_image"# + )?; Ok(()) } @@ -97,11 +1084,3 @@ fn check_repo_file_valid(repo_path: &PathBuf) -> anyhow::Result<()> { fn check_agent_file_valid(agent_path: &PathBuf) -> anyhow::Result<()> { utils::is_file_valid("os-agent binary", agent_path) } - -fn check_rootfs_occupied() -> anyhow::Result<()> { - let rpm_root = PathBuf::from(RPM_ROOT); - if rpm_root.is_dir() { - bail!("{} has existed, please confirm if rootfs is being used, or else remove the folder first.", rpm_root.to_str().unwrap()); - } - Ok(()) -} \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs index 0faa104f..822185d2 100644 --- a/KubeOS-Rust/kbimg/src/utils.rs +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -24,6 +24,91 @@ pub(crate) fn write_vector_to_file(scripts: Vec, file_name: &str) -> any Ok(()) } +/// Create general scripts +pub(crate) fn create_global(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"#!/bin/bash +## Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. +# KubeOS is licensed under the Mulan PSL v2. +# You can use this software according to the terms and conditions of the Mulan PSL v2. +# You may obtain a copy of Mulan PSL v2 at: +# http://license.coscl.org.cn/MulanPSL2 +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR +# PURPOSE. +## See the Mulan PSL v2 for more details. + +ARCH=$(arch) +PWD="$(pwd)" +TMP_MOUNT_PATH="${{PWD}}/mnt" +RPM_ROOT="${{PWD}}/rootfs" +IMG_SIZE=20 + +source ./utils.sh &>/dev/null + +function delete_dir() {{ + local ret=0 + local dir="$1" + unmount_dir "${{dir}}" + ret=$? + if [ "${{ret}}" -eq 0 ]; then + rm -rf "${{dir}}" + return 0 + else + log_error_print "${{dir}} is failed to unmount , can not delete ${{dir}}." + return 1 + fi +}} + +function delete_file() {{ + local file="$1" + if [ ! -e "${{file}}" ]; then + return 0 + fi + + if [ ! -f "${{file}}" ]; then + log_error_print "${{file}} is not a file." + return 1 + fi + + rm -f "${{file}}" + return 0 +}} + +function clean_space() {{ + delete_dir "${{RPM_ROOT}}" + delete_dir "${{TMP_MOUNT_PATH}}" + delete_file os.tar + rm -rf "${{LOCK}}" + delete_file "${{ADMIN_CONTAINER_DIR}}"/hostshell +}} + +function clean_img() {{ + delete_file system.img + delete_file update.img + delete_file initramfs.img + delete_file kubeos.tar +}} + +function file_lock() {{ + local lock_file=$1 + exec {{lock_fd}}>"${{lock_file}}" + flock -xn "${{lock_fd}}" +}} + +function test_lock() {{ + file_lock "${{LOCK}}" + local status=$? + if [ $status -ne 0 ]; then + log_error_print "There is already an generate process running." + exit 203 + fi +}} +"# +)?; + Ok(()) +} + /// Check if the input parameter is valid pub(crate) fn is_valid_param + std::fmt::Debug>(param: S) -> bool { let special_chars = vec!["|", ";", "&", "&&", "||", ">", ">>", "<", ",", "#", "!", "$"]; diff --git a/KubeOS-Rust/kbimg/src/values.rs b/KubeOS-Rust/kbimg/src/values.rs index 0dc757db..f8142ed5 100644 --- a/KubeOS-Rust/kbimg/src/values.rs +++ b/KubeOS-Rust/kbimg/src/values.rs @@ -1,6 +1,10 @@ -pub(crate) const SCRIPTS_DIR: &str = "./scripts"; - pub(crate) const KBIMG_NAME: &str = "kbimg.sh"; pub(crate) const BOOTLOADER_NAME: &str = "bootloader.sh"; - -pub(crate) const RPM_ROOT: &str = "rootfs"; \ No newline at end of file +pub(crate) const SET_IN_CHROOT_NAME: &str = "set_in_chroot.sh"; +pub(crate) const UTILS_NAME: &str = "utils.sh"; +pub(crate) const GRUB_CFG_NAME: &str = "grub.cfg"; +pub(crate) const RPMLIST_NAME: &str = "rpmlist"; +pub(crate) const BOOTUP_DIR: &str = "./00bootup"; +pub(crate) const GLOBAL_CFG_NAME: &str = "./00bootup/Global.cfg"; +pub(crate) const MODULE_SETUP_NAME: &str = "./00bootup/module-setup.sh"; +pub(crate) const MOUNT_NAME: &str = "./00bootup/mount.sh"; \ No newline at end of file -- Gitee From bfa23262311a0a2cf8afdb4e8ac04a0ac0844257 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 13 Aug 2024 12:50:37 +0800 Subject: [PATCH 048/116] lock --- KubeOS-Rust/kbimg/src/utils.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs index 822185d2..721e75a9 100644 --- a/KubeOS-Rust/kbimg/src/utils.rs +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -43,6 +43,7 @@ PWD="$(pwd)" TMP_MOUNT_PATH="${{PWD}}/mnt" RPM_ROOT="${{PWD}}/rootfs" IMG_SIZE=20 +LOCK=./test.lock source ./utils.sh &>/dev/null -- Gitee From 54c22cda08c7971d0ca5dd5f1a73406fc0177912 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 13 Aug 2024 16:07:32 +0800 Subject: [PATCH 049/116] vm-docker pxe-repo pxe-docker upgrade admin --- KubeOS-Rust/kbimg/src/admin_container.rs | 36 ++++- KubeOS-Rust/kbimg/src/commands.rs | 3 + KubeOS-Rust/kbimg/src/docker_img.rs | 88 +++++++++- KubeOS-Rust/kbimg/src/repo.rs | 197 +++++++++++------------ KubeOS-Rust/kbimg/src/utils.rs | 115 ++++++++++--- KubeOS-Rust/kbimg/src/values.rs | 1 + 6 files changed, 319 insertions(+), 121 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/admin_container.rs b/KubeOS-Rust/kbimg/src/admin_container.rs index b2c1c9cd..53783dd8 100644 --- a/KubeOS-Rust/kbimg/src/admin_container.rs +++ b/KubeOS-Rust/kbimg/src/admin_container.rs @@ -1,7 +1,10 @@ use std::path::PathBuf; +use std::fs::File; +use std::io::Write; use anyhow::bail; use crate::utils; +use crate::values::KBIMG_NAME; use crate::{commands::AdminContainerInfo, Config, CreateImage}; impl CreateImage for AdminContainerInfo { @@ -13,10 +16,41 @@ impl CreateImage for AdminContainerInfo { Ok(()) } fn generate_scripts(&self, config: Config) -> anyhow::Result { - todo!() + // kbimg.sh + let mut kbimg = File::create(KBIMG_NAME)?; + create_admin_vars(&mut kbimg, &self.image_name, &self.dockerfile)?; + create_admin_img(&mut kbimg)?; + Ok(PathBuf::from(KBIMG_NAME)) } } +/// scripts +fn create_admin_vars(file: &mut File, image_name: &str, dockerfile: &PathBuf) -> anyhow::Result<()> { + writeln!(file, +r#"DOCKERFILE={} +DOCKER_IMG={} +ADMIN_CONTAINER_DIR={} +"#, + dockerfile.to_str().unwrap(), + image_name, + "./admin-container" + )?; + Ok(()) +} + +fn create_admin_img(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"function create_admin_img() {{ + cp ../../bin/hostshell "${{ADMIN_CONTAINER_DIR}}" + docker build -t "${{DOCKER_IMG}}" -f "${{DOCKERFILE}}" "${{ADMIN_CONTAINER_DIR}}" + rm -rf "${{ADMIN_CONTAINER_DIR}}"/hostshell +}} +"# + )?; + Ok(()) +} + +/// prepare fn verify_admin_input(dockerfile: &PathBuf, image_name: &str) -> anyhow::Result<()> { if !utils::is_valid_param(dockerfile.to_str().unwrap()) { bail!("params {} is invalid, please check input", dockerfile.to_str().unwrap()); diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index a68899bc..1499a74b 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -54,6 +54,9 @@ pub struct RepoInfo { /// Required: Encrypted password for root user #[clap(short = 'e', long, value_parser)] pub root_passwd: String, + /// Required for upgrade-image + #[clap(short = 'd', long, value_parser)] + pub image_name: String, /// Optional: boot mode, default is uefi, enable this flag for legacy bios #[clap(short, long, value_parser)] pub legacy_bios: bool, diff --git a/KubeOS-Rust/kbimg/src/docker_img.rs b/KubeOS-Rust/kbimg/src/docker_img.rs index f5c90345..dcb29191 100644 --- a/KubeOS-Rust/kbimg/src/docker_img.rs +++ b/KubeOS-Rust/kbimg/src/docker_img.rs @@ -1,7 +1,12 @@ -use std::{path::PathBuf, process::Command, str}; +use std::process::Command; +use std::path::PathBuf; +use std::fs::File; +use std::io::Write; +use std::str; use anyhow::bail; -use crate::utils; +use crate::utils::{self, create_img}; +use crate::values::KBIMG_NAME; use crate::{commands::DockerInfo, Config, CreateImage}; impl CreateImage for DockerInfo { @@ -12,10 +17,87 @@ impl CreateImage for DockerInfo { Ok(()) } fn generate_scripts(&self, config: Config) -> anyhow::Result { - todo!() + if self.image_type == "vm-docker" { + // kbimg.sh + let mut kbimg = File::create(KBIMG_NAME)?; + utils::create_global(&mut kbimg)?; + create_docker_vars(&mut kbimg, &self.image_name)?; + create_os_tar_from_docker(&mut kbimg)?; + create_img(&mut kbimg)?; + create_vm_docker_img(&mut kbimg)?; + } + else { + // kbimg.sh + let mut kbimg = File::create(KBIMG_NAME)?; + utils::create_global(&mut kbimg)?; + create_docker_vars(&mut kbimg, &self.image_name)?; + create_os_tar_from_docker(&mut kbimg)?; + create_pxe_docker_img(&mut kbimg)?; + } + Ok(PathBuf::from(KBIMG_NAME)) } } +/// scripts +fn create_docker_vars(file: &mut File, image_name: &str) -> anyhow::Result<()> { + writeln!(file, +r#" +DOCKER_IMG="{}" +BOOT_MODE=efi +"#, + image_name + )?; + Ok(()) +} + +fn create_os_tar_from_docker(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"function create_os_tar_from_docker() {{ + container_id=$(docker create "${{DOCKER_IMG}}") + echo "$container_id" + docker cp "$container_id":/os.tar ./ + docker rm "$container_id" +}} +"# + )?; + Ok(()) +} + +fn create_vm_docker_img(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"function create_vm_docker_img() {{ + create_os_tar_from_docker + create_img +}} + +test_lock +trap clean_space EXIT +trap clean_img ERR + +create_vm_docker_img"# + )?; + Ok(()) +} + +fn create_pxe_docker_img(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"function create_pxe_docker_img() {{ + rm -rf initramfs.img kubeos.tar + create_os_tar_from_docker + tar -xvf os.tar ./initramfs.img + mv os.tar kubeos.tar +}} + +test_lock +trap clean_space EXIT +trap clean_img ERR + +create_pxe_docker_img"# + )?; + Ok(()) +} + +/// prepare fn verify_docker_input(image_name: &str) -> anyhow::Result<()> { if !utils::is_valid_param(image_name) { bail!("params {} is invalid, please check input", image_name); diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index 05366ce7..ce96ca2f 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -5,25 +5,21 @@ use std::io::Write; use anyhow::bail; use sysinfo::Disks; -use crate::utils; -use crate::values::{BOOTLOADER_NAME, BOOTUP_DIR, GLOBAL_CFG_NAME, GRUB_CFG_NAME, KBIMG_NAME, MODULE_SETUP_NAME, MOUNT_NAME, RPMLIST_NAME, SET_IN_CHROOT_NAME, UTILS_NAME}; +use crate::utils::{self, create_img}; +use crate::values::{BOOTLOADER_NAME, BOOTUP_DIR, DOCKERFILE_NAME, GLOBAL_CFG_NAME, GRUB_CFG_NAME, KBIMG_NAME, MODULE_SETUP_NAME, MOUNT_NAME, RPMLIST_NAME, SET_IN_CHROOT_NAME, UTILS_NAME}; use crate::{commands::RepoInfo, Config, CreateImage}; impl CreateImage for RepoInfo { fn prepare(&self) -> anyhow::Result<()> { - let repo_path = &self.repo_path; - let version = &self.version; - let agent_path = &self.agent_path; - let image_type = &self.image_type; - verify_repo_input(&repo_path, &version, &agent_path)?; - check_disk_space(&image_type)?; - check_repo_file_valid(&repo_path)?; - check_agent_file_valid(&agent_path)?; + verify_repo_input(&self.repo_path, &self.version, &self.agent_path, &self.image_name)?; + check_disk_space(&self.image_type)?; + check_repo_file_valid(&self.repo_path)?; + check_agent_file_valid(&self.agent_path)?; Ok(()) } fn generate_scripts(&self, config: Config) -> anyhow::Result { - // ./00bootup + // os_tar_from_repo -> ./00bootup match fs::create_dir_all(BOOTUP_DIR) { Ok(_) => { let mut global_cfg = File::create(GLOBAL_CFG_NAME)?; @@ -37,28 +33,49 @@ impl CreateImage for RepoInfo { bail!(e); } } - // grub.cfg + // os_tar_from_repo -> grub.cfg let mut grub_cfg = File::create(GRUB_CFG_NAME)?; create_grub_cfg(&mut grub_cfg)?; // utils.sh let mut utils = File::create(UTILS_NAME)?; create_utils(&mut utils)?; - // set_in_chroot.sh + // os_tar_from_repo -> set_in_chroot.sh let mut set_in_chroot = File::create(SET_IN_CHROOT_NAME)?; create_set_in_chroot(&mut set_in_chroot)?; - // bootloader.sh - let mut bootloader = File::create(BOOTLOADER_NAME)?; - create_bootloader(&mut bootloader)?; - // rpmlist + // os_tar_from_repo -> rpmlist let mut rpmlist = File::create(RPMLIST_NAME)?; create_rpm_list(&mut rpmlist)?; - // kbimg.sh - let mut kbimg = File::create(KBIMG_NAME)?; - utils::create_global(&mut kbimg)?; - create_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios)?; - create_os_tar_from_repo(&mut kbimg)?; - create_img(&mut kbimg)?; - create_vm_repo_image(&mut kbimg)?; + if self.image_type == "vm-repo" { + // parted -> bootloader.sh + let mut bootloader = File::create(BOOTLOADER_NAME)?; + create_bootloader(&mut bootloader)?; + // kbimg.sh + let mut kbimg = File::create(KBIMG_NAME)?; + utils::create_global(&mut kbimg)?; + create_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios, None)?; + create_os_tar_from_repo(&mut kbimg)?; + create_img(&mut kbimg)?; + create_vm_repo_img(&mut kbimg)?; + } + else if self.image_type == "pxe-repo" { + // kbimg.sh + let mut kbimg = File::create(KBIMG_NAME)?; + utils::create_global(&mut kbimg)?; + create_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios, None)?; + create_os_tar_from_repo(&mut kbimg)?; + create_pxe_repo_img(&mut kbimg)?; + } + else { + // Dockerfile + let mut dockerfile = File::create(DOCKERFILE_NAME)?; + create_docker_file(&mut dockerfile)?; + // kbimg.sh + let mut kbimg = File::create(KBIMG_NAME)?; + utils::create_global(&mut kbimg)?; + create_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios, Some(&self.image_name))?; + create_os_tar_from_repo(&mut kbimg)?; + create_docker_img(&mut kbimg)?; + } Ok(PathBuf::from(KBIMG_NAME)) } @@ -849,19 +866,25 @@ sudo Ok(()) } -fn create_repo_vars(file: &mut File, repo_path: &PathBuf, version: &str, agent_path: &PathBuf, root_passwd: &str, legacy_bios: bool) -> anyhow::Result<()> { +fn create_repo_vars(file: &mut File, repo_path: &PathBuf, version: &str, agent_path: &PathBuf, root_passwd: &str, legacy_bios: bool, docker_img: Option<&str>) -> anyhow::Result<()> { writeln!(file, r#"REPO_PATH="{}" VERSION="{}" AGENT_PATH="{}" ROOT_PASSWD='{}' BOOT_MODE="{}" +DOCKER_IMG="{}" "#, repo_path.to_str().unwrap(), version, agent_path.to_str().unwrap(), root_passwd, - if legacy_bios { "legacy" } else { "uefi" })?; + if legacy_bios { "legacy" } else { "efi" }, + match docker_img { + Some(content) => content, + None => "" + } + )?; Ok(()) } @@ -955,95 +978,68 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ Ok(()) } -fn create_img(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"function create_img() {{ - rm -f system.img update.img - qemu-img create system.img ${{IMG_SIZE}}G - if [ "${{BOOT_MODE}}" = "legacy" ]; then - local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/grub2 - parted system.img -s mklabel msdos - parted system.img -s mkpart primary ext4 1MiB 60MiB - else - local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/efi - parted system.img -s mklabel gpt - parted system.img -s mkpart primary fat32 1MiB 60MiB - fi - parted system.img -s mkpart primary ext4 60MiB 2160MiB - parted system.img -s mkpart primary ext4 2160MiB 4260MiB - parted system.img -s mkpart primary ext4 4260MiB 100% - local device - device=$(losetup -f) - losetup "${{device}}" system.img - - mkdir -p "${{TMP_MOUNT_PATH}}" - - init_part system.img2 ROOT-A "${{TMP_MOUNT_PATH}}" - - mkdir -p "${{BOOT_PATH}}" - chmod 755 "${{BOOT_PATH}}" - if [ "$BOOT_MODE" = "legacy" ]; then - init_part system.img1 GRUB2 "${{BOOT_PATH}}" - else - init_part system.img1 BOOT "${{BOOT_PATH}}" - fi - tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar - if [ "${{BOOT_MODE}}" = "legacy" ]; then - sed -i "s/insmod part_gpt/insmod part_msdos/g; \ -s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ -s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ -"${{TMP_MOUNT_PATH}}"/boot/grub2/grub.cfg - fi - sync - cp bootloader.sh "${{TMP_MOUNT_PATH}}" - mount_proc_dev_sys "${{TMP_MOUNT_PATH}}" - DEVICE="${{device}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{TMP_MOUNT_PATH}}" bash bootloader.sh - rm -rf "${{TMP_MOUNT_PATH}}/bootloader.sh" - sync - - dd if=/dev/disk/by-label/ROOT-A of=update.img bs=8M - sync - unmount_dir "${{TMP_MOUNT_PATH}}" - init_part system.img3 ROOT-B "${{TMP_MOUNT_PATH}}" - umount "${{TMP_MOUNT_PATH}}" - - init_part system.img4 PERSIST "${{TMP_MOUNT_PATH}}" - mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}} - mkdir -p "${{TMP_MOUNT_PATH}}"/etc/KubeOS/certs - umount "${{TMP_MOUNT_PATH}}" - - losetup -D - parted system.img -- set 1 boot on - qemu-img convert system.img -O qcow2 system.qcow2 +fn create_vm_repo_img(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"function create_vm_repo_image() {{ + create_os_tar_from_repo + create_img }} + +test_lock +trap clean_space EXIT +trap clean_img ERR + +create_vm_repo_image"# + )?; + Ok(()) +} + +fn create_pxe_repo_img(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"function create_pxe_repo_img() {{ + rm -rf initramfs.img kubeos.tar + create_os_tar_from_repo + tar -xvf os.tar ./initramfs.img + mv os.tar kubeos.tar +}} + +test_lock +trap clean_space EXIT +trap clean_img ERR + +create_pxe_repo_img"# + )?; + Ok(()) +} + +fn create_docker_file(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"FROM scratch +COPY os.tar / +CMD ["/bin/sh"] "# )?; Ok(()) } -fn create_vm_repo_image(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"function create_vm_repo_image() {{ - create_os_tar_from_repo \ - "${{REPO_PATH}}" \ - "${{VERSION}}" \ - "${{AGENT_PATH}}" \ - "${{ROOT_PASSWD}}" \ - "${{BOOT_MODE}}" - create_img "${{BOOT_MODE}}" +fn create_docker_img(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"function create_docker_img() {{ + create_os_tar_from_repo + docker build -t "${{DOCKER_IMG}}" -f ./Dockerfile . }} test_lock trap clean_space EXIT trap clean_img ERR -create_vm_repo_image"# +create_docker_img"# )?; - Ok(()) + Ok(()) } /// prepare -fn verify_repo_input(repo_path: &PathBuf, version: &str, agent_path: &PathBuf) -> anyhow::Result<()> { +fn verify_repo_input(repo_path: &PathBuf, version: &str, agent_path: &PathBuf, docker_img: &str) -> anyhow::Result<()> { if !utils::is_valid_param(repo_path.to_str().unwrap()) { bail!("params {} is invalid, please check input", repo_path.to_str().unwrap()); } @@ -1053,6 +1049,9 @@ fn verify_repo_input(repo_path: &PathBuf, version: &str, agent_path: &PathBuf) - if !utils::is_valid_param(agent_path.to_str().unwrap()) { bail!("params {} is invalid, please check input", agent_path.to_str().unwrap()); } + if !utils::is_valid_param(docker_img) { + bail!("params {} is invalid, please check input", docker_img); + } Ok(()) } diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs index 721e75a9..49891042 100644 --- a/KubeOS-Rust/kbimg/src/utils.rs +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -77,39 +77,118 @@ function delete_file() {{ }} function clean_space() {{ - delete_dir "${{RPM_ROOT}}" - delete_dir "${{TMP_MOUNT_PATH}}" - delete_file os.tar - rm -rf "${{LOCK}}" - delete_file "${{ADMIN_CONTAINER_DIR}}"/hostshell + delete_dir "${{RPM_ROOT}}" + delete_dir "${{TMP_MOUNT_PATH}}" + delete_file os.tar + rm -rf "${{LOCK}}" + delete_file "${{ADMIN_CONTAINER_DIR}}"/hostshell }} function clean_img() {{ - delete_file system.img - delete_file update.img - delete_file initramfs.img - delete_file kubeos.tar + delete_file system.img + delete_file update.img + delete_file initramfs.img + delete_file kubeos.tar }} function file_lock() {{ - local lock_file=$1 - exec {{lock_fd}}>"${{lock_file}}" - flock -xn "${{lock_fd}}" + local lock_file=$1 + exec {{lock_fd}}>"${{lock_file}}" + flock -xn "${{lock_fd}}" }} function test_lock() {{ - file_lock "${{LOCK}}" - local status=$? - if [ $status -ne 0 ]; then - log_error_print "There is already an generate process running." - exit 203 - fi + file_lock "${{LOCK}}" + local status=$? + if [ $status -ne 0 ]; then + log_error_print "There is already an generate process running." + exit 203 + fi +}} + +function log_error_print() {{ + local logmsg + logmsg="[ ERROR ] - ""$(date "+%b %d %Y %H:%M:%S")"" $1" + echo "$logmsg" +}} + +function log_info_print() {{ + local logmsg + logmsg="[ INFO ] - ""$(date "+%b %d %Y %H:%M:%S")"" $1" + echo "$logmsg" }} "# )?; Ok(()) } +/// Create create-img for vm +pub(crate) fn create_img(file: &mut File) -> anyhow::Result<()> { + writeln!(file, +r#"function create_img() {{ + rm -f system.img update.img + qemu-img create system.img ${{IMG_SIZE}}G + if [ "${{BOOT_MODE}}" = "legacy" ]; then + local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/grub2 + parted system.img -s mklabel msdos + parted system.img -s mkpart primary ext4 1MiB 60MiB + else + local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/efi + parted system.img -s mklabel gpt + parted system.img -s mkpart primary fat32 1MiB 60MiB + fi + parted system.img -s mkpart primary ext4 60MiB 2160MiB + parted system.img -s mkpart primary ext4 2160MiB 4260MiB + parted system.img -s mkpart primary ext4 4260MiB 100% + local device + device=$(losetup -f) + losetup "${{device}}" system.img + + mkdir -p "${{TMP_MOUNT_PATH}}" + + init_part system.img2 ROOT-A "${{TMP_MOUNT_PATH}}" + + mkdir -p "${{BOOT_PATH}}" + chmod 755 "${{BOOT_PATH}}" + if [ "$BOOT_MODE" = "legacy" ]; then + init_part system.img1 GRUB2 "${{BOOT_PATH}}" + else + init_part system.img1 BOOT "${{BOOT_PATH}}" + fi + tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar + if [ "${{BOOT_MODE}}" = "legacy" ]; then + sed -i "s/insmod part_gpt/insmod part_msdos/g; \ +s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ +s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ +"${{TMP_MOUNT_PATH}}"/boot/grub2/grub.cfg + fi + sync + cp bootloader.sh "${{TMP_MOUNT_PATH}}" + mount_proc_dev_sys "${{TMP_MOUNT_PATH}}" + DEVICE="${{device}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{TMP_MOUNT_PATH}}" bash bootloader.sh + rm -rf "${{TMP_MOUNT_PATH}}/bootloader.sh" + sync + + dd if=/dev/disk/by-label/ROOT-A of=update.img bs=8M + sync + unmount_dir "${{TMP_MOUNT_PATH}}" + init_part system.img3 ROOT-B "${{TMP_MOUNT_PATH}}" + umount "${{TMP_MOUNT_PATH}}" + + init_part system.img4 PERSIST "${{TMP_MOUNT_PATH}}" + mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}} + mkdir -p "${{TMP_MOUNT_PATH}}"/etc/KubeOS/certs + umount "${{TMP_MOUNT_PATH}}" + + losetup -D + parted system.img -- set 1 boot on + qemu-img convert system.img -O qcow2 system.qcow2 +}} +"# + )?; + Ok(()) +} + /// Check if the input parameter is valid pub(crate) fn is_valid_param + std::fmt::Debug>(param: S) -> bool { let special_chars = vec!["|", ";", "&", "&&", "||", ">", ">>", "<", ",", "#", "!", "$"]; diff --git a/KubeOS-Rust/kbimg/src/values.rs b/KubeOS-Rust/kbimg/src/values.rs index f8142ed5..1b8e3f81 100644 --- a/KubeOS-Rust/kbimg/src/values.rs +++ b/KubeOS-Rust/kbimg/src/values.rs @@ -4,6 +4,7 @@ pub(crate) const SET_IN_CHROOT_NAME: &str = "set_in_chroot.sh"; pub(crate) const UTILS_NAME: &str = "utils.sh"; pub(crate) const GRUB_CFG_NAME: &str = "grub.cfg"; pub(crate) const RPMLIST_NAME: &str = "rpmlist"; +pub(crate) const DOCKERFILE_NAME: &str = "Dockerfile"; pub(crate) const BOOTUP_DIR: &str = "./00bootup"; pub(crate) const GLOBAL_CFG_NAME: &str = "./00bootup/Global.cfg"; pub(crate) const MODULE_SETUP_NAME: &str = "./00bootup/module-setup.sh"; -- Gitee From eb3c5863f0aeeda4b14c049ebbb6c99e63c5a529 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 13 Aug 2024 17:58:39 +0800 Subject: [PATCH 050/116] kbimg-rust-optimisation (wait for call and test) --- KubeOS-Rust/kbimg/src/admin_container.rs | 8 +- KubeOS-Rust/kbimg/src/commands.rs | 6 +- KubeOS-Rust/kbimg/src/docker_img.rs | 31 +- KubeOS-Rust/kbimg/src/repo.rs | 31 +- KubeOS-Rust/kbimg/src/scripts_gen.rs | 1230 ++++++++++++++++++++++ KubeOS-Rust/kbimg/src/utils.rs | 21 +- KubeOS-Rust/kbimg/src/values.rs | 11 +- 7 files changed, 1317 insertions(+), 21 deletions(-) create mode 100644 KubeOS-Rust/kbimg/src/scripts_gen.rs diff --git a/KubeOS-Rust/kbimg/src/admin_container.rs b/KubeOS-Rust/kbimg/src/admin_container.rs index 53783dd8..643ac770 100644 --- a/KubeOS-Rust/kbimg/src/admin_container.rs +++ b/KubeOS-Rust/kbimg/src/admin_container.rs @@ -10,7 +10,7 @@ use crate::{commands::AdminContainerInfo, Config, CreateImage}; impl CreateImage for AdminContainerInfo { fn prepare(&self) -> anyhow::Result<()> { let dockerfile = &self.dockerfile; - let image_name = &self.image_name; + let image_name = &self.docker_img; verify_admin_input(&dockerfile, &image_name)?; check_dockerfile_valid(&dockerfile)?; Ok(()) @@ -18,21 +18,21 @@ impl CreateImage for AdminContainerInfo { fn generate_scripts(&self, config: Config) -> anyhow::Result { // kbimg.sh let mut kbimg = File::create(KBIMG_NAME)?; - create_admin_vars(&mut kbimg, &self.image_name, &self.dockerfile)?; + create_admin_vars(&mut kbimg, &self.docker_img, &self.dockerfile)?; create_admin_img(&mut kbimg)?; Ok(PathBuf::from(KBIMG_NAME)) } } /// scripts -fn create_admin_vars(file: &mut File, image_name: &str, dockerfile: &PathBuf) -> anyhow::Result<()> { +fn create_admin_vars(file: &mut File, docker_img: &str, dockerfile: &PathBuf) -> anyhow::Result<()> { writeln!(file, r#"DOCKERFILE={} DOCKER_IMG={} ADMIN_CONTAINER_DIR={} "#, dockerfile.to_str().unwrap(), - image_name, + docker_img, "./admin-container" )?; Ok(()) diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index 1499a74b..84297d17 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -56,7 +56,7 @@ pub struct RepoInfo { pub root_passwd: String, /// Required for upgrade-image #[clap(short = 'd', long, value_parser)] - pub image_name: String, + pub docker_img: String, /// Optional: boot mode, default is uefi, enable this flag for legacy bios #[clap(short, long, value_parser)] pub legacy_bios: bool, @@ -68,7 +68,7 @@ pub struct RepoInfo { pub struct DockerInfo { /// Required: Name of the container image #[clap(short, long, value_parser)] - pub image_name: String, + pub docker_img: String, #[clap(skip)] pub image_type: String, } @@ -77,7 +77,7 @@ pub struct DockerInfo { pub struct AdminContainerInfo { /// Required: Name of the container image #[clap(short, long, value_parser)] - pub image_name: String, + pub docker_img: String, /// Required: Path to the Dockerfile #[clap(short, long, value_parser)] pub dockerfile: PathBuf, diff --git a/KubeOS-Rust/kbimg/src/docker_img.rs b/KubeOS-Rust/kbimg/src/docker_img.rs index dcb29191..ef44b62d 100644 --- a/KubeOS-Rust/kbimg/src/docker_img.rs +++ b/KubeOS-Rust/kbimg/src/docker_img.rs @@ -6,14 +6,17 @@ use std::str; use anyhow::bail; use crate::utils::{self, create_img}; -use crate::values::KBIMG_NAME; +use crate::values::{local_ip, netmask, route_ip, server_ip, KBIMG_NAME}; use crate::{commands::DockerInfo, Config, CreateImage}; impl CreateImage for DockerInfo { fn prepare(&self) -> anyhow::Result<()> { - let image_name = &self.image_name; + let image_name = &self.docker_img; verify_docker_input(&image_name)?; check_docker_image(&image_name)?; + if self.image_type == "pxe-repo" { + check_pxe_conf_valid()?; + } Ok(()) } fn generate_scripts(&self, config: Config) -> anyhow::Result { @@ -21,7 +24,7 @@ impl CreateImage for DockerInfo { // kbimg.sh let mut kbimg = File::create(KBIMG_NAME)?; utils::create_global(&mut kbimg)?; - create_docker_vars(&mut kbimg, &self.image_name)?; + create_docker_vars(&mut kbimg, &self.docker_img)?; create_os_tar_from_docker(&mut kbimg)?; create_img(&mut kbimg)?; create_vm_docker_img(&mut kbimg)?; @@ -30,7 +33,7 @@ impl CreateImage for DockerInfo { // kbimg.sh let mut kbimg = File::create(KBIMG_NAME)?; utils::create_global(&mut kbimg)?; - create_docker_vars(&mut kbimg, &self.image_name)?; + create_docker_vars(&mut kbimg, &self.docker_img)?; create_os_tar_from_docker(&mut kbimg)?; create_pxe_docker_img(&mut kbimg)?; } @@ -39,13 +42,13 @@ impl CreateImage for DockerInfo { } /// scripts -fn create_docker_vars(file: &mut File, image_name: &str) -> anyhow::Result<()> { +fn create_docker_vars(file: &mut File, docker_img: &str) -> anyhow::Result<()> { writeln!(file, r#" DOCKER_IMG="{}" BOOT_MODE=efi "#, - image_name + docker_img )?; Ok(()) } @@ -118,4 +121,20 @@ fn check_docker_image(image_name: &str) -> anyhow::Result<()> { } } Ok(()) +} + +fn check_pxe_conf_valid() -> anyhow::Result<()> { + if !utils::is_addr_valid(server_ip) { + bail!("address {} is invalid, please check input", server_ip); + } + if !utils::is_addr_valid(local_ip) { + bail!("address {} is invalid, please check input", local_ip); + } + if !utils::is_addr_valid(route_ip) { + bail!("address {} is invalid, please check input", route_ip); + } + if !utils::is_addr_valid(netmask) { + bail!("address {} is invalid, please check input", netmask); + } + Ok(()) } \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index ce96ca2f..fbefe11a 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -6,15 +6,18 @@ use anyhow::bail; use sysinfo::Disks; use crate::utils::{self, create_img}; -use crate::values::{BOOTLOADER_NAME, BOOTUP_DIR, DOCKERFILE_NAME, GLOBAL_CFG_NAME, GRUB_CFG_NAME, KBIMG_NAME, MODULE_SETUP_NAME, MOUNT_NAME, RPMLIST_NAME, SET_IN_CHROOT_NAME, UTILS_NAME}; +use crate::values::{local_ip, netmask, route_ip, server_ip, BOOTLOADER_NAME, BOOTUP_DIR, DOCKERFILE_NAME, GLOBAL_CFG_NAME, GRUB_CFG_NAME, KBIMG_NAME, MODULE_SETUP_NAME, MOUNT_NAME, RPMLIST_NAME, SET_IN_CHROOT_NAME, UTILS_NAME}; use crate::{commands::RepoInfo, Config, CreateImage}; impl CreateImage for RepoInfo { fn prepare(&self) -> anyhow::Result<()> { - verify_repo_input(&self.repo_path, &self.version, &self.agent_path, &self.image_name)?; + verify_repo_input(&self.repo_path, &self.version, &self.agent_path, &self.docker_img)?; check_disk_space(&self.image_type)?; check_repo_file_valid(&self.repo_path)?; check_agent_file_valid(&self.agent_path)?; + if self.image_type == "pxe-repo" { + check_pxe_conf_valid()?; + } Ok(()) } @@ -72,7 +75,7 @@ impl CreateImage for RepoInfo { // kbimg.sh let mut kbimg = File::create(KBIMG_NAME)?; utils::create_global(&mut kbimg)?; - create_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios, Some(&self.image_name))?; + create_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios, Some(&self.docker_img))?; create_os_tar_from_repo(&mut kbimg)?; create_docker_img(&mut kbimg)?; } @@ -1066,9 +1069,9 @@ fn check_disk_space(image_type: &str) -> anyhow::Result<()> { let current_dir = env::current_dir().expect("Failed to get current directory"); let root_dir = current_dir.ancestors().last().expect("Failed to get current directory").to_path_buf(); let disks: Disks = Disks::new_with_refreshed_list(); - for disk in &disks { - if disk.mount_point() == root_dir { - if disk.available_space() < max_size * 1024 * 1024 { + for d in &disks { + if d.mount_point() == root_dir { + if d.available_space() < max_size * 1024 * 1024 { bail!("The available disk space is not enough, at least {}GiB.", max_size); } } @@ -1083,3 +1086,19 @@ fn check_repo_file_valid(repo_path: &PathBuf) -> anyhow::Result<()> { fn check_agent_file_valid(agent_path: &PathBuf) -> anyhow::Result<()> { utils::is_file_valid("os-agent binary", agent_path) } + +fn check_pxe_conf_valid() -> anyhow::Result<()> { + if !utils::is_addr_valid(server_ip) { + bail!("address {} is invalid, please check input", server_ip); + } + if !utils::is_addr_valid(local_ip) { + bail!("address {} is invalid, please check input", local_ip); + } + if !utils::is_addr_valid(route_ip) { + bail!("address {} is invalid, please check input", route_ip); + } + if !utils::is_addr_valid(netmask) { + bail!("address {} is invalid, please check input", netmask); + } + Ok(()) +} \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs new file mode 100644 index 00000000..b64f8e47 --- /dev/null +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -0,0 +1,1230 @@ +use std::fs::File; +use std::io::Write; +use std::path::Pathbuf; + +use Result; + +/* region: kbimg.sh */ +pub(crate) fn gen_global_vars(file: &mut File) -> Result<()> { + writeln!(file, +r#"ARCH=$(arch) +IMG_SIZE=20 +LOCK=./test.lock +PWD="$(pwd)" +RPM_ROOT="${{PWD}}/rootfs" +TMP_MOUNT_PATH="${{PWD}}/mnt" +"# + )?; + Ok(()) +} + +pub(crate) fn gen_global_func(file: &mut File) -> Result<()> { + writeln!(file, +r#"function delete_dir() {{ + local ret=0 + local dir="$1" + unmount_dir "${{dir}}" + ret=$? + if [ "${{ret}}" -eq 0 ]; then + rm -rf "${{dir}}" + return 0 + else + log_error_print "${{dir}} is failed to unmount , can not delete ${{dir}}." + return 1 + fi +}} + +function delete_file() {{ + local file="$1" + if [ ! -e "${{file}}" ]; then + return 0 + fi + + if [ ! -f "${{file}}" ]; then + log_error_print "${{file}} is not a file." + return 1 + fi + + rm -f "${{file}}" + return 0 +}} + +function clean_space() {{ + delete_dir "${{RPM_ROOT}}" + delete_dir "${{TMP_MOUNT_PATH}}" + delete_file os.tar + rm -rf "${{LOCK}}" + delete_file "${{ADMIN_CONTAINER_DIR}}"/hostshell +}} + +function clean_img() {{ + delete_file system.img + delete_file update.img + delete_file initramfs.img + delete_file kubeos.tar +}} + +function file_lock() {{ + local lock_file=$1 + exec {{lock_fd}}>"${{lock_file}}" + flock -xn "${{lock_fd}}" +}} + +function test_lock() {{ + file_lock "${{LOCK}}" + local status=$? + if [ $status -ne 0 ]; then + log_error_print "There is already an generate process running." + exit 203 + fi +}} + +function log_error_print() {{ + local logmsg + logmsg="[ ERROR ] - ""$(date "+%b %d %Y %H:%M:%S")"" $1" + echo "$logmsg" +}} + +function log_info_print() {{ + local logmsg + logmsg="[ INFO ] - ""$(date "+%b %d %Y %H:%M:%S")"" $1" + echo "$logmsg" +}} +"# + )?; + Ok(()) +} + +pub(crate) fn gen_mount_proc_dev_sys(file: &mut File) -> Result<()> { + writeln!(file, +r#"function mount_proc_dev_sys() {{ + local tmp_root=$1 + mount -t proc none "${{tmp_root}}/proc" + mount --bind /dev "${{tmp_root}}/dev" + mount --bind /dev/pts "${{tmp_root}}/dev/pts" + mount -t sysfs none "${{tmp_root}}/sys" +}} +"# + )?; + Ok(()) +} + +pub(crate) fn gen_unmount_dir(file: &mut File) -> Result<()> { + writeln!(file, +r#"function unmount_dir() {{ + local dir=$1 + + if [ -L "${{dir}}" ] || [ -f "${{dir}}" ]; then + log_error_print "${{dir}} is not a directory, please check it." + return 1 + fi + + if [ ! -d "${{dir}}" ]; then + return 0 + fi + + local real_dir + real_dir=$(readlink -e "${{dir}}") + local mnts + mnts=$(awk '{{print $2}}' < /proc/mounts | grep "^${{real_dir}}" | sort -r) + for m in ${{mnts}}; do + log_info_print "Unmount ${{m}}" + umount -f "${{m}}" || true + done + + return 0 +}} +"# + )?; + Ok(()) +} + +pub(crate) fn gen_init_part(file: &mut File) -> Result<()> { + writeln!(file, +r#"function init_part() {{ + local offset + offset=$(fdisk -l system.img | grep "$1" | awk '{{print $2}}') + local sizelimit + sizelimit=$(fdisk -l system.img | grep "$1" | awk '{{print $3}}') + sizelimit=$(echo "($sizelimit - $offset)*512" | bc) + offset=$(echo "${{offset}}*512" | bc) + local loop + loop=$(losetup -f) + losetup -o "${{offset}}" --sizelimit "${{sizelimit}}" "${{loop}}" system.img + if [ "$2" == "BOOT" ];then + mkfs.vfat -n "$2" "${{loop}}" + mount -t vfat "${{loop}}" "$3" + else + mkfs.ext4 -L "$2" "${{loop}}" + mount -t ext4 "${{loop}}" "$3" + rm -rf "$3/lost+found" + fi +}} +"# + )?; + Ok(()) +} + +// repo +pub(crate) fn gen_repo_vars(file: &mut File, repo_path: &PathBuf, version: &str, agent_path: &PathBuf, root_passwd: &str, legacy_bios: bool, docker_img: Option<&str>) -> Result<()> { + // wait for new + writeln!(file, +r#"REPO_PATH="{}" +VERSION="{}" +AGENT_PATH="{}" +ROOT_PASSWD='{}' +BOOT_MODE="{}" +DOCKER_IMG="{}" +"#, + repo_path.to_str().unwrap(), + version, + agent_path.to_str().unwrap(), + root_passwd, + if legacy_bios { "legacy" } else { "efi" }, + match docker_img { + Some(img_name) => img_name, + None => "" + } + )?; + Ok(()) +} + +pub(crate) fn gen_create_os_tar_from_repo(file: &mut File) -> Result<()> { + writeln!(file, +r#"function create_os_tar_from_repo() {{ + function prepare_yum() {{ + # init rpmdb + rpm --root "${{RPM_ROOT}}" --initdb + mkdir -p "${{RPM_ROOT}}"{{/etc/yum.repos.d,/persist,/proc,/dev/pts,/sys}} + mount_proc_dev_sys "${{RPM_ROOT}}" + # init yum repo + local iso_repo="${{RPM_ROOT}}/etc/yum.repos.d/iso.repo" + cat "${{REPO_PATH}}" > "$iso_repo" + }} + + function install_packages() {{ + prepare_yum "${{REPO}}" + + echo "install package.." + + local filesize + filesize=$(stat -c "%s" ./rpmlist) + local maxsize=$((1024*1024)) + if [ "${{filesize}}" -gt "${{maxsize}}" ]; then + echo "please check if rpmlist is too big or something wrong" + exit 7 + fi + + local rpms_name + rpms_name=$(tr "\n" " " < ./rpmlist) + old_ifs="$IFS" + IFS=' ' + if [ "${{ARCH}}" == "x86_64" ]; then + if [ "${{BOOT_MODE}}" = "legacy" ]; then + rpms_name+=" grub2" + else + rpms_name+=" grub2-efi grub2-tools grub2-efi-x64-modules grub2-pc-modules" + fi + read -ra rpms <<< "${{rpms_name}}" + IFS="$old_ifs" + yum -y --installroot="${{RPM_ROOT}}" install --nogpgcheck --setopt install_weak_deps=False "${{rpms[@]}}" + elif [ "${{ARCH}}" == "aarch64" ]; then + read -ra rpms <<< "${{rpms_name}}" + IFS="$old_ifs" + yum -y --installroot="${{RPM_ROOT}}" install --nogpgcheck --setopt install_weak_deps=False "${{rpms[@]}}" grub2-efi grub2-tools grub2-efi-aa64-modules + fi + yum -y --installroot="${{RPM_ROOT}}" clean all + }} + + function install_misc() {{ + local DNS_CONF="${{PWD}}/resolv.conf" + cp ../../files/*mount ../../files/os-agent.service "${{RPM_ROOT}}/usr/lib/systemd/system/" + cp ../../files/os-release "${{RPM_ROOT}}/usr/lib/" + cp "${{AGENT_PATH}}" "${{RPM_ROOT}}/usr/bin" + rm "${{RPM_ROOT}}/etc/os-release" + + cat < "${{RPM_ROOT}}/usr/lib/os-release" +NAME=${{NAME}} +ID=${{NAME}} +EOF + echo "PRETTY_NAME=\"${{NAME}} ${{VERSION}}\"" >> "${{RPM_ROOT}}/usr/lib/os-release" + echo "VERSION_ID=${{VERSION}}" >> "${{RPM_ROOT}}/usr/lib/os-release" + mv "${{RPM_ROOT}}"/boot/vmlinuz* "${{RPM_ROOT}}/boot/vmlinuz" + mv "${{RPM_ROOT}}"/boot/initramfs* "${{RPM_ROOT}}/boot/initramfs.img" + if [ "$BOOT_MODE" = "legacy" ]; then + cp grub.cfg "${{RPM_ROOT}}"/boot/grub2 + sed -i "s/insmod part_gpt/insmod part_msdos/g; \ +s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ +s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ +"${{RPM_ROOT}}"/boot/grub2/grub.cfg + else + cp grub.cfg "${{RPM_ROOT}}"/boot/efi/EFI/openEuler + fi + cp -r ./00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ + cp set_in_chroot.sh "${{RPM_ROOT}}" + ROOT_PASSWD="${{ROOT_PASSWD}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{RPM_ROOT}}" bash /set_in_chroot.sh + rm "${{RPM_ROOT}}/set_in_chroot.sh" + if [ -e "${{DNS_CONF}}" ]; then + cp "${{DNS_CONF}}" "${{RPM_ROOT}}/etc/resolv.conf" + fi + }} + + install_packages "${{REPO_PATH}}" "${{BOOT_MODE}}" + install_misc "${{VERSION}}" "${{AGENT_PATH}}" "${{ROOT_PASSWD}}" "${{BOOT_MODE}}" + unmount_dir "${{RPM_ROOT}}" + tar -C "${{RPM_ROOT}}" -cf ./os.tar +}} +"# + )?; + Ok(()) +} + +pub(crate) fn gen_create_img(file: &mut File) -> Result<()> { + writeln!(file, +r#"function create_img() {{ + rm -f system.img update.img + qemu-img create system.img ${{IMG_SIZE}}G + if [ "${{BOOT_MODE}}" = "legacy" ]; then + local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/grub2 + parted system.img -s mklabel msdos + parted system.img -s mkpart primary ext4 1MiB 60MiB + else + local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/efi + parted system.img -s mklabel gpt + parted system.img -s mkpart primary fat32 1MiB 60MiB + fi + parted system.img -s mkpart primary ext4 60MiB 2160MiB + parted system.img -s mkpart primary ext4 2160MiB 4260MiB + parted system.img -s mkpart primary ext4 4260MiB 100% + local device + device=$(losetup -f) + losetup "${{device}}" system.img + + mkdir -p "${{TMP_MOUNT_PATH}}" + + init_part system.img2 ROOT-A "${{TMP_MOUNT_PATH}}" + + mkdir -p "${{BOOT_PATH}}" + chmod 755 "${{BOOT_PATH}}" + if [ "$BOOT_MODE" = "legacy" ]; then + init_part system.img1 GRUB2 "${{BOOT_PATH}}" + else + init_part system.img1 BOOT "${{BOOT_PATH}}" + fi + tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar + if [ "${{BOOT_MODE}}" = "legacy" ]; then + sed -i "s/insmod part_gpt/insmod part_msdos/g; \ +s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ +s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ +"${{TMP_MOUNT_PATH}}"/boot/grub2/grub.cfg + fi + sync + cp bootloader.sh "${{TMP_MOUNT_PATH}}" + mount_proc_dev_sys "${{TMP_MOUNT_PATH}}" + DEVICE="${{device}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{TMP_MOUNT_PATH}}" bash bootloader.sh + rm -rf "${{TMP_MOUNT_PATH}}/bootloader.sh" + sync + + dd if=/dev/disk/by-label/ROOT-A of=update.img bs=8M + sync + unmount_dir "${{TMP_MOUNT_PATH}}" + init_part system.img3 ROOT-B "${{TMP_MOUNT_PATH}}" + umount "${{TMP_MOUNT_PATH}}" + + init_part system.img4 PERSIST "${{TMP_MOUNT_PATH}}" + mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}} + mkdir -p "${{TMP_MOUNT_PATH}}"/etc/KubeOS/certs + umount "${{TMP_MOUNT_PATH}}" + + losetup -D + parted system.img -- set 1 boot on + qemu-img convert system.img -O qcow2 system.qcow2 +}} +"# + )?; + Ok(()) +} + +pub(crate) fn gen_vm_repo_img(file: &mut File) -> Result<()> { + writeln!(file, +r#"function create_vm_repo_image() {{ + create_os_tar_from_repo + create_img +}} + +test_lock +trap clean_space EXIT +trap clean_img ERR + +create_vm_repo_image"# + )?; + Ok(()) +} + +pub(crate) fn gen_pxe_repo_img(file: &mut File) -> Result<()> { + writeln!(file, +r#"function create_vm_repo_image() {{ + rm -rf initramfs.img kubeos.tar + create_os_tar_from_repo + tar -xvf os.tar ./initramfs.img + mv os.tar kubeos.tar +}} + +test_lock +trap clean_space EXIT +trap clean_img ERR + +create_pxe_repo_img"# + )?; + Ok(()) +} + +pub(crate) fn gen_create_docker_img(file: &mut File) -> Result<()> { + writeln!(file, +r#"function create_docker_img() {{ + create_os_tar_from_repo + docker build -t "${{DOCKER_IMG}}" -f ./Dockerfile . +}} + +test_lock +trap clean_space EXIT +trap clean_img ERR + +create_docker_img"# + )?; + Ok(()) +} + +// docker +pub(crate) fn gen_docker_vars(file: &mut File, image_name: &str) -> Result<()> { + writeln!(file, +r#" +IMAGE_NAME="{}" +BOOT_MODE=efi +"#, + image_name + )?; + Ok(()) +} + +pub(crate) fn gen_create_os_tar_from_docker(file: &mut File) -> Result<()> { + writeln!(file, +r#"function create_os_tar_from_docker() {{ + container_id=$(docker create "${{DOCKER_IMG}}") + echo "$container_id" + docker cp "$container_id":/os.tar ./ + docker rm "$container_id" +}} +"# + )?; + Ok(()) +} + +pub(crate) fn gen_create_vm_docker_img(file: &mut File) -> Result<()> { + writeln!(file, +r#"function create_vm_docker_img() {{ + create_os_tar_from_docker + create_img +}} + +test_lock +trap clean_space EXIT +trap clean_img ERR + +create_vm_docker_img"# + )?; + Ok(()) +} + +pub(crate) fn gen_create_pxe_docker_img(file: &mut File) -> Result<()> { + writeln!(file, +r#"function create_pxe_docker_img() {{ + rm -rf initramfs.img kubeos.tar + create_os_tar_from_docker + tar -xvf os.tar ./initramfs.img + mv os.tar kubeos.tar +}} + +test_lock +trap clean_space EXIT +trap clean_img ERR + +create_pxe_docker_img"# + )?; + Ok(()) +} + +// admin +pub(crate) fn gen_admin_vars(file: &mut File, docker_img: &str, dockerfile: &PathBuf) -> Result<()> { + writeln!(file, +r#"DOCKER_IMG={} +DOCKERFILE={} +ADMIN_CONTAINER_DIR=./admin-container +"#, + dockerfile.to_str().unwrap(), + docker_img + )?; + Ok(()) +} + +pub(crate) fn gen_create_admin_img(file: &mut File) -> Result<()> { + writeln!(file, +r#"function create_admin_img() {{ + cp ../../bin/hostshell "${{ADMIN_CONTAINER_DIR}}" + docker build -t "${{DOCKER_IMG}}" -f "${{DOCKERFILE}}" "${{ADMIN_CONTAINER_DIR}}" + rm -rf "${{ADMIN_CONTAINER_DIR}}"/hostshell +}} + +test_lock +trap clean_space EXIT +trap clean_img ERR + +create_admin_img"# + )?; + Ok(()) +} +/* endregion */ + +/* region: set_in_chroot.sh */ +fn gen_set_in_chroot(file: &mut File) -> Result<()> { + writeln!(file, +r#"#!/bin/bash +ln -s /usr/lib/systemd/system/os-agent.service /usr/lib/systemd/system/multi-user.target.wants/os-agent.service +ln -s /usr/lib/systemd/system/kubelet.service /usr/lib/systemd/system/multi-user.target.wants/kubelet.service +if [ "$BOOT_MODE" = "legacy" ]; then + ln -s /usr/lib/systemd/system/boot-grub2.mount /lib/systemd/system/local-fs.target.wants/boot-grub2.mount +else + ln -s /usr/lib/systemd/system/boot-efi.mount /lib/systemd/system/local-fs.target.wants/boot-efi.mount +fi +ln -s /usr/lib/systemd/system/etc.mount /lib/systemd/system/local-fs.target.wants/etc.mount + +str=$(sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{{print $2}}') +umask 0666 +mv /etc/shadow /etc/shadow_bak +sed -i '/^root:/d' /etc/shadow_bak +echo "root:""${{ROOT_PASSWD}}""${{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 +"# + )?; + Ok(()) +} +/* endregion */ + +/* region: bootloader.sh */ +fn gen_bootloader(file: &mut File) -> Result<()> { + writeln!(file, +r#"#!/bin/bash +set -eu +set -o pipefail +set -x +ARCH=$(arch) + +function install_grub2_x86 () {{ + if [ "${{BOOT_MODE}}" = "legacy" ]; then + # make boot.img/core.img and setup, to support legacy boot mode + GRUBNAME=$(which grub2-install) + echo "Installing GRUB2..." + FORCE_OPT=${{FORCE_OPT:-"--force"}} + TARGET_OPT=${{TARGET_OPT:-"--target=i386-pc"}} + + $GRUBNAME --modules="biosdisk part_msdos" "${{FORCE_OPT}}" "${{TARGET_OPT}}" "${{DEVICE}}" + else + # make efi file, and save in FAT16 partition, to support UEFI boot mode + cp -r /usr/lib/grub/x86_64-efi boot/efi/EFI/openEuler + eval "grub2-mkimage -d /usr/lib/grub/x86_64-efi -O x86_64-efi --output=/boot/efi/EFI/openEuler/grubx64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" + + mkdir -p /boot/efi/EFI/BOOT/ + cp -f /boot/efi/EFI/openEuler/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI + fi +}} + +function install_grub2_efi () {{ + cp -r /usr/lib/grub/arm64-efi /boot/efi/EFI/openEuler/ + eval "grub2-mkimage -d /usr/lib/grub/arm64-efi -O arm64-efi --output=/boot/efi/EFI/openEuler/grubaa64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" + + mkdir -p /boot/efi/EFI/BOOT/ + cp -f /boot/efi/EFI/openEuler/grubaa64.efi /boot/efi/EFI/BOOT/BOOTAA64.EFI +}} + +if [ "${{ARCH}}" == "x86_64" ]; then + install_grub2_x86 +fi + +if [ "${{ARCH}}" == "aarch64" ]; then + install_grub2_efi +fi +"# + )?; + Ok(()) +} +/* endregion */ + +/* region: rpmlist */ +fn create_rpm_list(file: &mut File) -> Result<()> { + writeln!(file, +r#"kernel +passwd +dhcp +NetworkManager +openssh-server +docker +kubernetes-kubeadm +kubernetes-kubelet +containernetworking-plugins +socat +conntrack-tools +ebtables +ethtool +rsyslog +vi +net-tools +hwinfo +dracut +coreutils +gawk +parted +dosfstools +sudo +"# + )?; + Ok(()) +} +/* endregion */ + +/* region: grub.cfg */ +fn gen_grub_cfg(file: &mut File) -> Result<()> { + writeln!(file, +r#"## Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. + # KubeOS is licensed under the Mulan PSL v2. + # You can use this software according to the terms and conditions of the Mulan PSL v2. + # You may obtain a copy of Mulan PSL v2 at: + # http://license.coscl.org.cn/MulanPSL2 + # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + # PURPOSE. +## See the Mulan PSL v2 for more details. +set pager=1 + +if [ -f ${{config_directory}}/grubenv ]; then + load_env -f ${{config_directory}}/grubenv +elif [ -s $prefix/grubenv ]; then + load_env +fi +if [ "${{next_entry}}" ] ; then + set default="${{next_entry}}" + set next_entry= + save_env next_entry + set boot_once=true +else + set default="${{saved_entry}}" +fi + +if [ x"${{feature_menuentry_id}}" = xy ]; then + menuentry_id_option="--id" +else + menuentry_id_option="" +fi + +export menuentry_id_option + +if [ "${{prev_saved_entry}}" ]; then + set saved_entry="${{prev_saved_entry}}" + save_env saved_entry + set prev_saved_entry= + save_env prev_saved_entry + set boot_once=true +fi + +function savedefault {{{{ + if [ -z "${{boot_once}}" ]; then + saved_entry="${{chosen}}" + save_env saved_entry + fi +}}}} + +function load_video {{{{ + if [ x$feature_all_video_module = xy ]; then + insmod all_video + else + insmod efi_gop + insmod efi_uga + insmod ieee1275_fb + insmod vbe + insmod vga + insmod video_bochs + insmod video_cirrus + fi +}}}} + +terminal_output console +if [ x$feature_timeout_style = xy ] ; then + set timeout_style=menu + set timeout=5 +# Fallback normal timeout code in case the timeout_style feature is +# unavailable. +else + set timeout=5 +fi +set superusers="root" +### END /etc/grub.d/00_header ### + +### BEGIN /etc/grub.d/01_users ### +if [ -f ${{prefix}}/user.cfg ]; then + source ${{prefix}}/user.cfg + if [ -n "${{GRUB2_PASSWORD}}" ]; then + set superusers="root" + export superusers + password_pbkdf2 root ${{GRUB2_PASSWORD}} + fi +fi +### END /etc/grub.d/01_users ### + +### BEGIN /etc/grub.d/10_linux ### +menuentry 'A' --class KubeOS --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'KubeOS-A' {{{{ + load_video + set gfxpayload=keep + insmod gzio + insmod part_gpt + insmod ext2 + set root='hd0,gpt2' + linux /boot/vmlinuz root=/dev/sda2 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 + initrd /boot/initramfs.img +}}}} + +menuentry 'B' --class KubeOS --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'KubeOS-B' {{{{ + load_video + set gfxpayload=keep + insmod gzio + insmod part_gpt + insmod ext2 + set root='hd0,gpt3' + linux /boot/vmlinuz root=/dev/sda3 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 + initrd /boot/initramfs.img +}}}} + +### END /etc/grub.d/10_linux ### + +### BEGIN /etc/grub.d/10_reset_boot_success ### +# Hiding the menu is ok if last boot was ok or if this is a first boot attempt to boot the entry +if [ "${{boot_success}}" = "1" -o "${{boot_indeterminate}}" = "1" ]; then + set menu_hide_ok=1 +else + set menu_hide_ok=0 +fi +# Reset boot_indeterminate after a successful boot +if [ "${{boot_success}}" = "1" ] ; then + set boot_indeterminate=0 +# Avoid boot_indeterminate causing the menu to be hidden more then once +elif [ "${{boot_indeterminate}}" = "1" ]; then + set boot_indeterminate=2 +fi +# Reset boot_success for current boot +set boot_success=0 +save_env boot_success boot_indeterminate +### END /etc/grub.d/10_reset_boot_success ### + +### BEGIN /etc/grub.d/12_menu_auto_hide ### +if [ x$feature_timeout_style = xy ] ; then + if [ "${{menu_show_once}}" ]; then + unset menu_show_once + save_env menu_show_once + set timeout_style=menu + set timeout=60 + elif [ "${{menu_auto_hide}}" -a "${{menu_hide_ok}}" = "1" ]; then + set orig_timeout_style=${{timeout_style}} + set orig_timeout=${{timeout}} + if [ "${{fastboot}}" = "1" ]; then + # timeout_style=menu + timeout=0 avoids the countdown code keypress check + set timeout_style=menu + set timeout=0 + else + set timeout_style=hidden + set timeout=1 + fi + fi +fi +### END /etc/grub.d/12_menu_auto_hide ### + +### BEGIN /etc/grub.d/20_linux_xen ### +### END /etc/grub.d/20_linux_xen ### + +### BEGIN /etc/grub.d/20_ppc_terminfo ### +### END /etc/grub.d/20_ppc_terminfo ### + +### BEGIN /etc/grub.d/30_uefi-firmware ### +### END /etc/grub.d/30_uefi-firmware ### + +### BEGIN /etc/grub.d/40_custom ### +# This file provides an easy way to add custom menu entries. Simply type the +# menu entries you want to add after this comment. Be careful not to change +# the 'exec tail' line above. +### END /etc/grub.d/40_custom ### + +### BEGIN /etc/grub.d/41_custom ### +if [ -f ${{config_directory}}/custom.cfg ]; then + source ${{config_directory}}/custom.cfg +elif [ -z "${{config_directory}}" -a -f $prefix/custom.cfg ]; then + source $prefix/custom.cfg; +fi +### END /etc/grub.d/41_custom ### +"# + )?; + Ok(()) +} +/* endregion */ + +/* region: 00bootup */ +fn gen_global_cfg(file: &mut File, rootfs_name: &str, disk: &str, server_ip: &str, local_ip: &str, route_ip: &str, netmask: &str, net_name: &str) -> Result<()> { + writeln!(file, +r#"# rootfs file name +rootfs_name={} + +# select the target disk to install kubeOS +disk={} + +# pxe server ip address where stores the rootfs on the http server +server_ip={} +# target machine ip +local_ip={} +# target machine route +route_ip={} +# target machine netmask +netmask={} +# target machine netDevice name +net_name={} +"#, + rootfs_name, + disk, + server_ip, + local_ip, + route_ip, + netmask, + net_name + )?; + Ok(()) +} + +fn gen_module_setup(file: &mut File) -> Result<()> { + writeln!(file, +r#"#!/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' +}} +"# + )?; + Ok(()) +} + +fn gen_mount(file: &mut File) -> Result<()> { + writeln!(file, +r#"#!/bin/bash +arch=$(arch) +min_size=8 +log=/install.log + +source ./Global.cfg + +function CheckSpace() {{ + local disk_ava + 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 mount_proc_dev_sys() {{ + local tmp_root=$1 + mount -t proc none "${{tmp_root}}/proc" + mount --bind /dev "${{tmp_root}}/dev" + mount --bind /dev/pts "${{tmp_root}}/dev/pts" + mount -t sysfs none "${{tmp_root}}/sys" +}} + +function GetDisk() {{ + mapfile -t disks < <(hwinfo --disk --short 2>&1 | grep -vi "^disk" | awk '{{print $1}}') + if [ ${{#disks[*]}} -gt 0 ]; then + if [ -n "${{disk}}" ] && echo "${{disks[@]}}" | grep -wq "${{disk}}" ; then + echo "${{disk}} exists, start partition" | tee -a ${{log}} + else + echo "disk not exist, please choose correct disk" | tee -a ${{log}} + fi + else + echo "no disk found" | tee -a ${{log}} + return 1 + fi + CheckSpace + local status=$? + if [ $status -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 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + parted "${{disk}}" -s mkpart primary fat16 1M 100M >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + parted "${{disk}}" -s mkpart primary ext4 100M 2600M >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + parted "${{disk}}" -s mkpart primary ext4 2600M 5100M >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + parted "${{disk}}" -s mkpart primary ext4 5100M 100% >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + parted "${{disk}}" -s set 1 boot on >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "partition failed" | tee -a ${{log}} + return 1 + fi + + mkfs.vfat -n "BOOT" "${{disk}}"1 >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "format failed" | tee -a ${{log}} + return 1 + fi + + mkfs.ext4 -L "ROOT-A" "${{disk}}"2 >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "format failed" | tee -a ${{log}} + return 1 + fi + + mkfs.ext4 -L "ROOT-B" "${{disk}}"3 >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "format failed" | tee -a ${{log}} + return 1 + fi + + mkfs.ext4 -L "PERSIST" "${{disk}}"4 >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "format failed" | tee -a ${{log}} + return 1 + fi + + return 0 +}} + +function InitNetwork() {{ + echo "Initializing network..." + mapfile -t netNames < <(ifconfig -a | awk '{{print $1}}' | grep : | grep '^e' | awk -F: '{{print $1}}') + if [ ${{#netNames[*]}} -gt 0 ]; then + if [ -n "${{net_name}}" ] && echo "${{netNames[@]}}" | grep -wq "${{net_name}}" ; then + echo "${{net_name}} exists, start set ip" | tee -a ${{log}} + else + echo "net_name not exist, choose default net" | tee -a ${{log}} + net_name=${{netNames[0]}} + fi + else + echo "no net Device found" | tee -a ${{log}} + return 1 + fi + + ifconfig "${{net_name}}" up + local status=$? + if [ $status -ne 0 ]; then + echo "load net card failed" | tee -a ${{log}} + return 1 + fi + sleep 3 + + ifconfig "${{net_name}}" "${{local_ip}}" netmask "${{netmask}}" >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "ip set failed" | tee -a ${{log}} + return 1 + fi + sleep 3 + + route add default gw "${{route_ip}}" >> ${{log}} 2>&1 + local status=$? + if [ $status -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 + local status=$? + if [ $status -ne 0 ]; then + echo "mount rootfs failed" | tee -a ${{log}} + return 1 + fi + + return 0 +}} + +function MountPersist() {{ + echo "Mounting persist" + mount "${{disk}}"4 /sysroot/persist >> ${{log}} 2>&1 + local status=$? + if [ $status -ne 0 ]; then + echo "mount persist failed" | tee -a ${{log}} + return 1 + fi + mkdir /sysroot/persist/{{var,etc,etcwork}} + mkdir -p /sysroot/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 + local status=$? + if [ $status -ne 0 ]; then + echo "mount boot failed" | tee -a ${{log}} + return 1 + fi + return 0 +}} + +function GetRootfs() {{ + echo "Downloading rootfs..." + + curl -o /"${{rootfs_name}}" http://"${{server_ip}}"/"${{rootfs_name}}" + if [ ! -e "/${{rootfs_name}}" ]; then + echo "download rootfs failed" | tee -a ${{log}} + return 1 + fi + + tar -xf /"${{rootfs_name}}" -C /sysroot + local status=$? + if [ $status -ne 0 ]; then + echo "decompose rootfs failed" | tee -a ${{log}} + return 1 + fi + + rm -rf "${{rootfs_name:?}}" + mount -o remount,ro "${{disk}}"2 /sysroot >> ${{log}} 2>&1 + 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 + local status=$? + if [ $status -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 + local status=$? + if [ $status -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 + local status=$? + if [ $status -ne 0 ]; then + echo "install grub on x86 failed" | tee -a ${{log}} + return 1 + fi + fi + + if [ "$arch" == "aarch64" ]; then + Inst_Grub2_aarch64 + local status=$? + if [ $status -ne 0 ]; then + echo "install grub on aarch64 failed" | tee -a ${{log}} + return 1 + fi + fi + sed -i 's#/dev/sda#'"${{disk}}"'#g' /sysroot/boot/efi/EFI/openEuler/grub.cfg + + return 0 +}} + +function Bootup_Main() {{ + # get disk + echo "Checking disk info..." | tee -a ${{log}} + GetDisk + local status=$? + if [ $status -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 + local status=$? + if [ $status -ne 0 ]; then + echo "Partition and formatting disk failed" | tee -a ${{log}} + return 1 + fi + + # init network + echo "Initializing network..." | tee -a ${{log}} + InitNetwork + local status=$? + if [ $status -ne 0 ]; then + echo "Initializing network failed" | tee -a ${{log}} + return 1 + fi + + # mount partitions + + # mount boot + echo "Mounting root..." | tee -a ${{log}} + MountRoot + local status=$? + if [ $status -ne 0 ]; then + echo "Mounting root failed" | tee -a ${{log}} + return 1 + fi + + echo "Mounting boot..." | tee -a ${{log}} + MountBoot + local status=$? + if [ $status -ne 0 ]; then + echo "Mounting boot failed" | tee -a ${{log}} + return 1 + fi + + # download rootfs + echo "Downloading rootfs..." | tee -a ${{log}} + GetRootfs + local status=$? + if [ $status -ne 0 ]; then + echo "Downloading rootfs failed" | tee -a ${{log}} + return 1 + fi + mount_proc_dev_sys /sysroot + # set boot + echo "Setting boot..." | tee -a ${{log}} + SetBoot + local status=$? + if [ $status -ne 0 ]; then + echo "Setting boot failed" | tee -a ${{log}} + return 1 + fi + # mount persist + echo "Mounting persist..." | tee -a ${{log}} + MountPersist + local status=$? + if [ $status -ne 0 ]; then + echo "Mounting persist 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}} /sysroot/persist +else + echo "kubeOS install failed, see install.log" | tee -a ${{log}} +fi + +"# + )?; + Ok(()) +} +/* endregion */ + +/* region: dockerfile */ +fn gen_dockerfile(file: &mut File) -> Result<()> { + writeln!(file, +r#"FROM scratch +COPY os.tar / +CMD ["/bin/sh"] +"# + )?; + Ok(()) +} +/* endregion */ \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs index 49891042..b0430f93 100644 --- a/KubeOS-Rust/kbimg/src/utils.rs +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -1,7 +1,7 @@ use std::{fs::File, io::Write, path::PathBuf, process::Command}; use anyhow::bail; -use log::debug; +use log::{debug, error}; pub(crate) fn execute_scripts(script: PathBuf) -> anyhow::Result<()> { if !script.exists() { @@ -206,6 +206,25 @@ pub(crate) fn is_file_valid(msg: &str, path: &PathBuf) -> anyhow::Result<()> { Ok(()) } +/// Check if addr is valid +pub(crate) fn is_addr_valid(addr: &str) -> bool { + let ip_pattern = regex::Regex::new(r"^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$").unwrap(); + if !ip_pattern.is_match(addr) { + return false; + } + + for quad in addr.split('.') { + if let Ok(num) = quad.parse::() { + if num <= 255 { + continue; + } + } + return false; + } + + true +} + #[cfg(test)] mod tests { use super::*; diff --git a/KubeOS-Rust/kbimg/src/values.rs b/KubeOS-Rust/kbimg/src/values.rs index 1b8e3f81..b13a96ef 100644 --- a/KubeOS-Rust/kbimg/src/values.rs +++ b/KubeOS-Rust/kbimg/src/values.rs @@ -8,4 +8,13 @@ pub(crate) const DOCKERFILE_NAME: &str = "Dockerfile"; pub(crate) const BOOTUP_DIR: &str = "./00bootup"; pub(crate) const GLOBAL_CFG_NAME: &str = "./00bootup/Global.cfg"; pub(crate) const MODULE_SETUP_NAME: &str = "./00bootup/module-setup.sh"; -pub(crate) const MOUNT_NAME: &str = "./00bootup/mount.sh"; \ No newline at end of file +pub(crate) const MOUNT_NAME: &str = "./00bootup/mount.sh"; + +// pxe config +pub(crate) const rootfs_name: &str = "kubeos.tar"; +pub(crate) const disk: &str = "/dev/sda"; +pub(crate) const server_ip: &str = "192.168.1.50"; +pub(crate) const local_ip: &str = "192.168.1.100"; +pub(crate) const route_ip: &str = "192.168.1.1"; +pub(crate) const netmask: &str = "255.255.255.0"; +pub(crate) const net_name: &str = "eth0"; -- Gitee From 7693d41d568254ac718b6a2691630a76e82dc88a Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 14 Aug 2024 10:38:30 +0800 Subject: [PATCH 051/116] extract to scripts_gen.rs --- KubeOS-Rust/kbimg/src/admin_container.rs | 54 +- KubeOS-Rust/kbimg/src/docker_img.rs | 103 +- KubeOS-Rust/kbimg/src/main.rs | 3 +- KubeOS-Rust/kbimg/src/repo.rs | 1082 ++-------------------- KubeOS-Rust/kbimg/src/scripts_gen.rs | 85 +- KubeOS-Rust/kbimg/src/utils.rs | 167 +--- KubeOS-Rust/kbimg/src/values.rs | 21 +- 7 files changed, 189 insertions(+), 1326 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/admin_container.rs b/KubeOS-Rust/kbimg/src/admin_container.rs index 643ac770..d107dde2 100644 --- a/KubeOS-Rust/kbimg/src/admin_container.rs +++ b/KubeOS-Rust/kbimg/src/admin_container.rs @@ -1,10 +1,10 @@ use std::path::PathBuf; -use std::fs::File; -use std::io::Write; +use std::fs::{File, create_dir_all}; use anyhow::bail; +use crate::scripts_gen::{gen_admin_dockerfile, gen_admin_vars, gen_create_admin_img, gen_set_ssh_pub_key, gen_set_ssh_pub_key_service}; use crate::utils; -use crate::values::KBIMG_NAME; +use crate::values::{ADMIN_CONTAINER_DIR, ADMIN_DOCKERFILE_NAME, KBIMG_NAME, SET_SSH_PUB_KEY_NAME, SET_SSH_PUB_KEY_SERVICE_NAME}; use crate::{commands::AdminContainerInfo, Config, CreateImage}; impl CreateImage for AdminContainerInfo { @@ -16,41 +16,31 @@ impl CreateImage for AdminContainerInfo { Ok(()) } fn generate_scripts(&self, config: Config) -> anyhow::Result { + // admin-container + match create_dir_all(ADMIN_CONTAINER_DIR) { + Ok(_) => { + // Dockerfile + let mut dockerfile = File::create(ADMIN_DOCKERFILE_NAME)?; + gen_admin_dockerfile(&mut dockerfile)?; + // set-ssh-pub-key.service + let mut set_ssh_pub_key_service = File::create(SET_SSH_PUB_KEY_SERVICE_NAME)?; + gen_set_ssh_pub_key_service(&mut set_ssh_pub_key_service)?; + // set-ssh-pub-key.sh + let mut set_ssh_pub_key = File::create(SET_SSH_PUB_KEY_NAME)?; + gen_set_ssh_pub_key(&mut set_ssh_pub_key)?; + }, + Err(e) => { + bail!(e); + } + } // kbimg.sh let mut kbimg = File::create(KBIMG_NAME)?; - create_admin_vars(&mut kbimg, &self.docker_img, &self.dockerfile)?; - create_admin_img(&mut kbimg)?; + gen_admin_vars(&mut kbimg, &self.docker_img, &self.dockerfile)?; + gen_create_admin_img(&mut kbimg)?; Ok(PathBuf::from(KBIMG_NAME)) } } -/// scripts -fn create_admin_vars(file: &mut File, docker_img: &str, dockerfile: &PathBuf) -> anyhow::Result<()> { - writeln!(file, -r#"DOCKERFILE={} -DOCKER_IMG={} -ADMIN_CONTAINER_DIR={} -"#, - dockerfile.to_str().unwrap(), - docker_img, - "./admin-container" - )?; - Ok(()) -} - -fn create_admin_img(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"function create_admin_img() {{ - cp ../../bin/hostshell "${{ADMIN_CONTAINER_DIR}}" - docker build -t "${{DOCKER_IMG}}" -f "${{DOCKERFILE}}" "${{ADMIN_CONTAINER_DIR}}" - rm -rf "${{ADMIN_CONTAINER_DIR}}"/hostshell -}} -"# - )?; - Ok(()) -} - -/// prepare fn verify_admin_input(dockerfile: &PathBuf, image_name: &str) -> anyhow::Result<()> { if !utils::is_valid_param(dockerfile.to_str().unwrap()) { bail!("params {} is invalid, please check input", dockerfile.to_str().unwrap()); diff --git a/KubeOS-Rust/kbimg/src/docker_img.rs b/KubeOS-Rust/kbimg/src/docker_img.rs index ef44b62d..c55cdc42 100644 --- a/KubeOS-Rust/kbimg/src/docker_img.rs +++ b/KubeOS-Rust/kbimg/src/docker_img.rs @@ -1,12 +1,12 @@ use std::process::Command; use std::path::PathBuf; use std::fs::File; -use std::io::Write; use std::str; use anyhow::bail; -use crate::utils::{self, create_img}; -use crate::values::{local_ip, netmask, route_ip, server_ip, KBIMG_NAME}; +use crate::utils; +use crate::scripts_gen::{gen_create_img, gen_create_os_tar_from_docker, gen_create_pxe_docker_img, gen_create_vm_docker_img, gen_docker_vars, gen_global_func, gen_global_vars, gen_init_part}; +use crate::values::{LOCAL_IP, NETMASK, ROUTE_IP, SERVER_IP, KBIMG_NAME}; use crate::{commands::DockerInfo, Config, CreateImage}; impl CreateImage for DockerInfo { @@ -20,87 +20,26 @@ impl CreateImage for DockerInfo { Ok(()) } fn generate_scripts(&self, config: Config) -> anyhow::Result { + // kbimg.sh + let mut kbimg = File::create(KBIMG_NAME)?; + gen_global_vars(&mut kbimg)?; + gen_docker_vars(&mut kbimg, &self.docker_img)?; + gen_global_func(&mut kbimg)?; + gen_create_os_tar_from_docker(&mut kbimg)?; if self.image_type == "vm-docker" { // kbimg.sh - let mut kbimg = File::create(KBIMG_NAME)?; - utils::create_global(&mut kbimg)?; - create_docker_vars(&mut kbimg, &self.docker_img)?; - create_os_tar_from_docker(&mut kbimg)?; - create_img(&mut kbimg)?; - create_vm_docker_img(&mut kbimg)?; + gen_init_part(&mut kbimg)?; + gen_create_img(&mut kbimg)?; + gen_create_vm_docker_img(&mut kbimg)?; } else { // kbimg.sh - let mut kbimg = File::create(KBIMG_NAME)?; - utils::create_global(&mut kbimg)?; - create_docker_vars(&mut kbimg, &self.docker_img)?; - create_os_tar_from_docker(&mut kbimg)?; - create_pxe_docker_img(&mut kbimg)?; + gen_create_pxe_docker_img(&mut kbimg)?; } Ok(PathBuf::from(KBIMG_NAME)) } } -/// scripts -fn create_docker_vars(file: &mut File, docker_img: &str) -> anyhow::Result<()> { - writeln!(file, -r#" -DOCKER_IMG="{}" -BOOT_MODE=efi -"#, - docker_img - )?; - Ok(()) -} - -fn create_os_tar_from_docker(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"function create_os_tar_from_docker() {{ - container_id=$(docker create "${{DOCKER_IMG}}") - echo "$container_id" - docker cp "$container_id":/os.tar ./ - docker rm "$container_id" -}} -"# - )?; - Ok(()) -} - -fn create_vm_docker_img(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"function create_vm_docker_img() {{ - create_os_tar_from_docker - create_img -}} - -test_lock -trap clean_space EXIT -trap clean_img ERR - -create_vm_docker_img"# - )?; - Ok(()) -} - -fn create_pxe_docker_img(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"function create_pxe_docker_img() {{ - rm -rf initramfs.img kubeos.tar - create_os_tar_from_docker - tar -xvf os.tar ./initramfs.img - mv os.tar kubeos.tar -}} - -test_lock -trap clean_space EXIT -trap clean_img ERR - -create_pxe_docker_img"# - )?; - Ok(()) -} - -/// prepare fn verify_docker_input(image_name: &str) -> anyhow::Result<()> { if !utils::is_valid_param(image_name) { bail!("params {} is invalid, please check input", image_name); @@ -124,17 +63,17 @@ fn check_docker_image(image_name: &str) -> anyhow::Result<()> { } fn check_pxe_conf_valid() -> anyhow::Result<()> { - if !utils::is_addr_valid(server_ip) { - bail!("address {} is invalid, please check input", server_ip); + if !utils::is_addr_valid(SERVER_IP) { + bail!("address {} is invalid, please check input", SERVER_IP); } - if !utils::is_addr_valid(local_ip) { - bail!("address {} is invalid, please check input", local_ip); + if !utils::is_addr_valid(LOCAL_IP) { + bail!("address {} is invalid, please check input", LOCAL_IP); } - if !utils::is_addr_valid(route_ip) { - bail!("address {} is invalid, please check input", route_ip); + if !utils::is_addr_valid(ROUTE_IP) { + bail!("address {} is invalid, please check input", ROUTE_IP); } - if !utils::is_addr_valid(netmask) { - bail!("address {} is invalid, please check input", netmask); + if !utils::is_addr_valid(NETMASK) { + bail!("address {} is invalid, please check input", NETMASK); } Ok(()) } \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/main.rs b/KubeOS-Rust/kbimg/src/main.rs index 3813663a..e7cbad49 100644 --- a/KubeOS-Rust/kbimg/src/main.rs +++ b/KubeOS-Rust/kbimg/src/main.rs @@ -10,7 +10,7 @@ * See the Mulan PSL v2 for more details. */ -use std::{env, fs, path::PathBuf, process::exit}; +use std::{fs, path::PathBuf, process::exit}; use anyhow::Result; use clap::Parser; @@ -23,6 +23,7 @@ mod docker_img; mod repo; mod utils; mod values; +mod scripts_gen; use utils::execute_scripts; diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index fbefe11a..97ea25a1 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -1,12 +1,12 @@ use std::env; use std::path::PathBuf; -use std::fs::{self, File}; -use std::io::Write; +use std::fs::{File, create_dir_all}; use anyhow::bail; use sysinfo::Disks; -use crate::utils::{self, create_img}; -use crate::values::{local_ip, netmask, route_ip, server_ip, BOOTLOADER_NAME, BOOTUP_DIR, DOCKERFILE_NAME, GLOBAL_CFG_NAME, GRUB_CFG_NAME, KBIMG_NAME, MODULE_SETUP_NAME, MOUNT_NAME, RPMLIST_NAME, SET_IN_CHROOT_NAME, UTILS_NAME}; +use crate::utils; +use crate::values::{BOOTLOADER_NAME, BOOTUP_DIR, DISK, DOCKERFILE_NAME, GLOBAL_CFG_NAME, GRUB_CFG_NAME, KBIMG_NAME, LOCAL_IP, MODULE_SETUP_NAME, MOUNT_NAME, NETMASK, NET_NAME, ROOTFS_NAME, ROUTE_IP, RPMLIST_NAME, SERVER_IP, SET_IN_CHROOT_NAME}; +use crate::scripts_gen::{gen_bootloader, gen_create_docker_img, gen_create_img, gen_create_os_tar_from_repo, gen_create_pxe_repo_img, gen_create_vm_repo_img, gen_dockerfile, gen_global_cfg, gen_global_func, gen_global_vars, gen_grub_cfg, gen_init_part, gen_module_setup, gen_mount, gen_mount_proc_dev_sys, gen_repo_vars, gen_rpm_list, gen_set_in_chroot, gen_unmount_dir}; use crate::{commands::RepoInfo, Config, CreateImage}; impl CreateImage for RepoInfo { @@ -22,1026 +22,62 @@ impl CreateImage for RepoInfo { } fn generate_scripts(&self, config: Config) -> anyhow::Result { - // os_tar_from_repo -> ./00bootup - match fs::create_dir_all(BOOTUP_DIR) { - Ok(_) => { - let mut global_cfg = File::create(GLOBAL_CFG_NAME)?; - create_global_cfg(&mut global_cfg)?; - let mut module_setup = File::create(MODULE_SETUP_NAME)?; - create_module_setup(&mut module_setup)?; - let mut mount = File::create(MOUNT_NAME)?; - create_mount(&mut mount)?; - }, - Err(e) => { - bail!(e); - } - } - // os_tar_from_repo -> grub.cfg - let mut grub_cfg = File::create(GRUB_CFG_NAME)?; - create_grub_cfg(&mut grub_cfg)?; - // utils.sh - let mut utils = File::create(UTILS_NAME)?; - create_utils(&mut utils)?; - // os_tar_from_repo -> set_in_chroot.sh - let mut set_in_chroot = File::create(SET_IN_CHROOT_NAME)?; - create_set_in_chroot(&mut set_in_chroot)?; - // os_tar_from_repo -> rpmlist - let mut rpmlist = File::create(RPMLIST_NAME)?; - create_rpm_list(&mut rpmlist)?; - if self.image_type == "vm-repo" { - // parted -> bootloader.sh - let mut bootloader = File::create(BOOTLOADER_NAME)?; - create_bootloader(&mut bootloader)?; - // kbimg.sh - let mut kbimg = File::create(KBIMG_NAME)?; - utils::create_global(&mut kbimg)?; - create_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios, None)?; - create_os_tar_from_repo(&mut kbimg)?; - create_img(&mut kbimg)?; - create_vm_repo_img(&mut kbimg)?; - } + // rpmlist + let mut rpmlist = File::create(RPMLIST_NAME)?; + gen_rpm_list(&mut rpmlist)?; + // 00bootup + match create_dir_all(BOOTUP_DIR) { + Ok(_) => { + let mut global_cfg = File::create(GLOBAL_CFG_NAME)?; + gen_global_cfg(&mut global_cfg, ROOTFS_NAME, DISK, SERVER_IP, LOCAL_IP, ROUTE_IP, NETMASK, NET_NAME)?; + let mut module_setup = File::create(MODULE_SETUP_NAME)?; + gen_module_setup(&mut module_setup)?; + let mut mount = File::create(MOUNT_NAME)?; + gen_mount(&mut mount)?; + } + Err(e) => { + bail!(e); + } + } + // grub.cfg + let mut grub_cfg = File::create(GRUB_CFG_NAME)?; + gen_grub_cfg(&mut grub_cfg)?; + // set_in_chroot.sh + let mut set_in_chroot = File::create(SET_IN_CHROOT_NAME)?; + gen_set_in_chroot(&mut set_in_chroot)?; + // kbimg.sh + let mut kbimg = File::create(KBIMG_NAME)?; + gen_global_vars(&mut kbimg)?; + gen_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios, None)?; + gen_global_func(&mut kbimg)?; + gen_mount_proc_dev_sys(&mut kbimg)?; + gen_unmount_dir(&mut kbimg)?; + gen_create_os_tar_from_repo(&mut kbimg)?; + if self.image_type == "vm-repo" { + // bootloader.sh + let mut bootloader = File::create(BOOTLOADER_NAME)?; + gen_bootloader(&mut bootloader)?; + // kbimg.sh + gen_init_part(&mut kbimg)?; + gen_create_img(&mut kbimg)?; + gen_create_vm_repo_img(&mut kbimg)?; + } else if self.image_type == "pxe-repo" { - // kbimg.sh - let mut kbimg = File::create(KBIMG_NAME)?; - utils::create_global(&mut kbimg)?; - create_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios, None)?; - create_os_tar_from_repo(&mut kbimg)?; - create_pxe_repo_img(&mut kbimg)?; + // kbimg.sh + gen_create_pxe_repo_img(&mut kbimg)?; } else { - // Dockerfile - let mut dockerfile = File::create(DOCKERFILE_NAME)?; - create_docker_file(&mut dockerfile)?; - // kbimg.sh - let mut kbimg = File::create(KBIMG_NAME)?; - utils::create_global(&mut kbimg)?; - create_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios, Some(&self.docker_img))?; - create_os_tar_from_repo(&mut kbimg)?; - create_docker_img(&mut kbimg)?; + // Dockerfile + let mut dockerfile = File::create(DOCKERFILE_NAME)?; + gen_dockerfile(&mut dockerfile)?; + // kbimg.sh + gen_create_docker_img(&mut kbimg)?; } Ok(PathBuf::from(KBIMG_NAME)) } } -/// scripts -fn create_global_cfg(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"# rootfs file name -rootfs_name=kubeos.tar - -# select the target disk to install kubeOS -disk=/dev/sda - -# pxe server ip address where stores the rootfs on the http server -server_ip=192.168.1.50 -# target machine ip -local_ip=192.168.1.100 -# target machine route -route_ip=192.168.1.1 -# target machine netmask -netmask=255.255.255.0 -# target machine netDevice name -net_name=eth0 -"# - )?; - Ok(()) -} - -fn create_module_setup(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"#!/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' -}} -"# - )?; - Ok(()) -} - -fn create_mount(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"#!/bin/bash -arch=$(arch) -min_size=8 -log=/install.log - -source ./Global.cfg - -function CheckSpace() {{ - local disk_ava - 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 mount_proc_dev_sys() {{ - local tmp_root=$1 - mount -t proc none "${{tmp_root}}/proc" - mount --bind /dev "${{tmp_root}}/dev" - mount --bind /dev/pts "${{tmp_root}}/dev/pts" - mount -t sysfs none "${{tmp_root}}/sys" -}} - -function GetDisk() {{ - mapfile -t disks < <(hwinfo --disk --short 2>&1 | grep -vi "^disk" | awk '{{print $1}}') - if [ ${{#disks[*]}} -gt 0 ]; then - if [ -n "${{disk}}" ] && echo "${{disks[@]}}" | grep -wq "${{disk}}" ; then - echo "${{disk}} exists, start partition" | tee -a ${{log}} - else - echo "disk not exist, please choose correct disk" | tee -a ${{log}} - fi - else - echo "no disk found" | tee -a ${{log}} - return 1 - fi - CheckSpace - local status=$? - if [ $status -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 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${{log}} - return 1 - fi - - parted "${{disk}}" -s mkpart primary fat16 1M 100M >> ${{log}} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${{log}} - return 1 - fi - - parted "${{disk}}" -s mkpart primary ext4 100M 2600M >> ${{log}} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${{log}} - return 1 - fi - - parted "${{disk}}" -s mkpart primary ext4 2600M 5100M >> ${{log}} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${{log}} - return 1 - fi - - parted "${{disk}}" -s mkpart primary ext4 5100M 100% >> ${{log}} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${{log}} - return 1 - fi - - parted "${{disk}}" -s set 1 boot on >> ${{log}} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${{log}} - return 1 - fi - - mkfs.vfat -n "BOOT" "${{disk}}"1 >> ${{log}} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "format failed" | tee -a ${{log}} - return 1 - fi - - mkfs.ext4 -L "ROOT-A" "${{disk}}"2 >> ${{log}} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "format failed" | tee -a ${{log}} - return 1 - fi - - mkfs.ext4 -L "ROOT-B" "${{disk}}"3 >> ${{log}} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "format failed" | tee -a ${{log}} - return 1 - fi - - mkfs.ext4 -L "PERSIST" "${{disk}}"4 >> ${{log}} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "format failed" | tee -a ${{log}} - return 1 - fi - - return 0 -}} - -function InitNetwork() {{ - echo "Initializing network..." - mapfile -t netNames < <(ifconfig -a | awk '{{print $1}}' | grep : | grep '^e' | awk -F: '{{print $1}}') - if [ ${{#netNames[*]}} -gt 0 ]; then - if [ -n "${{net_name}}" ] && echo "${{netNames[@]}}" | grep -wq "${{net_name}}" ; then - echo "${{net_name}} exists, start set ip" | tee -a ${{log}} - else - echo "net_name not exist, choose default net" | tee -a ${{log}} - net_name=${{netNames[0]}} - fi - else - echo "no net Device found" | tee -a ${{log}} - return 1 - fi - - ifconfig "${{net_name}}" up - local status=$? - if [ $status -ne 0 ]; then - echo "load net card failed" | tee -a ${{log}} - return 1 - fi - sleep 3 - - ifconfig "${{net_name}}" "${{local_ip}}" netmask "${{netmask}}" >> ${{log}} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "ip set failed" | tee -a ${{log}} - return 1 - fi - sleep 3 - - route add default gw "${{route_ip}}" >> ${{log}} 2>&1 - local status=$? - if [ $status -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 - local status=$? - if [ $status -ne 0 ]; then - echo "mount rootfs failed" | tee -a ${{log}} - return 1 - fi - - return 0 -}} - -function MountPersist() {{ - echo "Mounting persist" - mount "${{disk}}"4 /sysroot/persist >> ${{log}} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "mount persist failed" | tee -a ${{log}} - return 1 - fi - mkdir /sysroot/persist/{{var,etc,etcwork}} - mkdir -p /sysroot/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 - local status=$? - if [ $status -ne 0 ]; then - echo "mount boot failed" | tee -a ${{log}} - return 1 - fi - return 0 -}} - -function GetRootfs() {{ - echo "Downloading rootfs..." - - curl -o /"${{rootfs_name}}" http://"${{server_ip}}"/"${{rootfs_name}}" - if [ ! -e "/${{rootfs_name}}" ]; then - echo "download rootfs failed" | tee -a ${{log}} - return 1 - fi - - tar -xf /"${{rootfs_name}}" -C /sysroot - local status=$? - if [ $status -ne 0 ]; then - echo "decompose rootfs failed" | tee -a ${{log}} - return 1 - fi - - rm -rf "${{rootfs_name:?}}" - mount -o remount,ro "${{disk}}"2 /sysroot >> ${{log}} 2>&1 - 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 - local status=$? - if [ $status -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 - local status=$? - if [ $status -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 - local status=$? - if [ $status -ne 0 ]; then - echo "install grub on x86 failed" | tee -a ${{log}} - return 1 - fi - fi - - if [ "$arch" == "aarch64" ]; then - Inst_Grub2_aarch64 - local status=$? - if [ $status -ne 0 ]; then - echo "install grub on aarch64 failed" | tee -a ${{log}} - return 1 - fi - fi - sed -i 's#/dev/sda#'"${{disk}}"'#g' /sysroot/boot/efi/EFI/openEuler/grub.cfg - - return 0 -}} - -function Bootup_Main() {{ - # get disk - echo "Checking disk info..." | tee -a ${{log}} - GetDisk - local status=$? - if [ $status -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 - local status=$? - if [ $status -ne 0 ]; then - echo "Partition and formatting disk failed" | tee -a ${{log}} - return 1 - fi - - # init network - echo "Initializing network..." | tee -a ${{log}} - InitNetwork - local status=$? - if [ $status -ne 0 ]; then - echo "Initializing network failed" | tee -a ${{log}} - return 1 - fi - - # mount partitions - - # mount boot - echo "Mounting root..." | tee -a ${{log}} - MountRoot - local status=$? - if [ $status -ne 0 ]; then - echo "Mounting root failed" | tee -a ${{log}} - return 1 - fi - - echo "Mounting boot..." | tee -a ${{log}} - MountBoot - local status=$? - if [ $status -ne 0 ]; then - echo "Mounting boot failed" | tee -a ${{log}} - return 1 - fi - - # download rootfs - echo "Downloading rootfs..." | tee -a ${{log}} - GetRootfs - local status=$? - if [ $status -ne 0 ]; then - echo "Downloading rootfs failed" | tee -a ${{log}} - return 1 - fi - mount_proc_dev_sys /sysroot - # set boot - echo "Setting boot..." | tee -a ${{log}} - SetBoot - local status=$? - if [ $status -ne 0 ]; then - echo "Setting boot failed" | tee -a ${{log}} - return 1 - fi - # mount persist - echo "Mounting persist..." | tee -a ${{log}} - MountPersist - local status=$? - if [ $status -ne 0 ]; then - echo "Mounting persist 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}} /sysroot/persist -else - echo "kubeOS install failed, see install.log" | tee -a ${{log}} -fi - -"# - )?; - Ok(()) -} - -fn create_grub_cfg(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"## Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. - # KubeOS is licensed under the Mulan PSL v2. - # You can use this software according to the terms and conditions of the Mulan PSL v2. - # You may obtain a copy of Mulan PSL v2 at: - # http://license.coscl.org.cn/MulanPSL2 - # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - # PURPOSE. -## See the Mulan PSL v2 for more details. -set pager=1 - -if [ -f ${{config_directory}}/grubenv ]; then - load_env -f ${{config_directory}}/grubenv -elif [ -s $prefix/grubenv ]; then - load_env -fi -if [ "${{next_entry}}" ] ; then - set default="${{next_entry}}" - set next_entry= - save_env next_entry - set boot_once=true -else - set default="${{saved_entry}}" -fi - -if [ x"${{feature_menuentry_id}}" = xy ]; then - menuentry_id_option="--id" -else - menuentry_id_option="" -fi - -export menuentry_id_option - -if [ "${{prev_saved_entry}}" ]; then - set saved_entry="${{prev_saved_entry}}" - save_env saved_entry - set prev_saved_entry= - save_env prev_saved_entry - set boot_once=true -fi - -function savedefault {{{{ - if [ -z "${{boot_once}}" ]; then - saved_entry="${{chosen}}" - save_env saved_entry - fi -}}}} - -function load_video {{{{ - if [ x$feature_all_video_module = xy ]; then - insmod all_video - else - insmod efi_gop - insmod efi_uga - insmod ieee1275_fb - insmod vbe - insmod vga - insmod video_bochs - insmod video_cirrus - fi -}}}} - -terminal_output console -if [ x$feature_timeout_style = xy ] ; then - set timeout_style=menu - set timeout=5 -# Fallback normal timeout code in case the timeout_style feature is -# unavailable. -else - set timeout=5 -fi -set superusers="root" -### END /etc/grub.d/00_header ### - -### BEGIN /etc/grub.d/01_users ### -if [ -f ${{prefix}}/user.cfg ]; then - source ${{prefix}}/user.cfg - if [ -n "${{GRUB2_PASSWORD}}" ]; then - set superusers="root" - export superusers - password_pbkdf2 root ${{GRUB2_PASSWORD}} - fi -fi -### END /etc/grub.d/01_users ### - -### BEGIN /etc/grub.d/10_linux ### -menuentry 'A' --class KubeOS --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'KubeOS-A' {{{{ - load_video - set gfxpayload=keep - insmod gzio - insmod part_gpt - insmod ext2 - set root='hd0,gpt2' - linux /boot/vmlinuz root=/dev/sda2 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 - initrd /boot/initramfs.img -}}}} - -menuentry 'B' --class KubeOS --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'KubeOS-B' {{{{ - load_video - set gfxpayload=keep - insmod gzio - insmod part_gpt - insmod ext2 - set root='hd0,gpt3' - linux /boot/vmlinuz root=/dev/sda3 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 - initrd /boot/initramfs.img -}}}} - -### END /etc/grub.d/10_linux ### - -### BEGIN /etc/grub.d/10_reset_boot_success ### -# Hiding the menu is ok if last boot was ok or if this is a first boot attempt to boot the entry -if [ "${{boot_success}}" = "1" -o "${{boot_indeterminate}}" = "1" ]; then - set menu_hide_ok=1 -else - set menu_hide_ok=0 -fi -# Reset boot_indeterminate after a successful boot -if [ "${{boot_success}}" = "1" ] ; then - set boot_indeterminate=0 -# Avoid boot_indeterminate causing the menu to be hidden more then once -elif [ "${{boot_indeterminate}}" = "1" ]; then - set boot_indeterminate=2 -fi -# Reset boot_success for current boot -set boot_success=0 -save_env boot_success boot_indeterminate -### END /etc/grub.d/10_reset_boot_success ### - -### BEGIN /etc/grub.d/12_menu_auto_hide ### -if [ x$feature_timeout_style = xy ] ; then - if [ "${{menu_show_once}}" ]; then - unset menu_show_once - save_env menu_show_once - set timeout_style=menu - set timeout=60 - elif [ "${{menu_auto_hide}}" -a "${{menu_hide_ok}}" = "1" ]; then - set orig_timeout_style=${{timeout_style}} - set orig_timeout=${{timeout}} - if [ "${{fastboot}}" = "1" ]; then - # timeout_style=menu + timeout=0 avoids the countdown code keypress check - set timeout_style=menu - set timeout=0 - else - set timeout_style=hidden - set timeout=1 - fi - fi -fi -### END /etc/grub.d/12_menu_auto_hide ### - -### BEGIN /etc/grub.d/20_linux_xen ### -### END /etc/grub.d/20_linux_xen ### - -### BEGIN /etc/grub.d/20_ppc_terminfo ### -### END /etc/grub.d/20_ppc_terminfo ### - -### BEGIN /etc/grub.d/30_uefi-firmware ### -### END /etc/grub.d/30_uefi-firmware ### - -### BEGIN /etc/grub.d/40_custom ### -# This file provides an easy way to add custom menu entries. Simply type the -# menu entries you want to add after this comment. Be careful not to change -# the 'exec tail' line above. -### END /etc/grub.d/40_custom ### - -### BEGIN /etc/grub.d/41_custom ### -if [ -f ${{config_directory}}/custom.cfg ]; then - source ${{config_directory}}/custom.cfg -elif [ -z "${{config_directory}}" -a -f $prefix/custom.cfg ]; then - source $prefix/custom.cfg; -fi -### END /etc/grub.d/41_custom ### -"# - )?; - Ok(()) -} - -fn create_utils(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"#!/bin/bash -## Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. -# KubeOS is licensed under the Mulan PSL v2. -# You can use this software according to the terms and conditions of the Mulan PSL v2. -# You may obtain a copy of Mulan PSL v2 at: -# http://license.coscl.org.cn/MulanPSL2 -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -# PURPOSE. -## See the Mulan PSL v2 for more details. - -function mount_proc_dev_sys() {{ - local tmp_root=$1 - mount -t proc none "${{tmp_root}}/proc" - mount --bind /dev "${{tmp_root}}/dev" - mount --bind /dev/pts "${{tmp_root}}/dev/pts" - mount -t sysfs none "${{tmp_root}}/sys" -}} - -function unmount_dir() {{ - local dir=$1 - - if [ -L "${{dir}}" ] || [ -f "${{dir}}" ]; then - log_error_print "${{dir}} is not a directory, please check it." - return 1 - fi - - if [ ! -d "${{dir}}" ]; then - return 0 - fi - - local real_dir - real_dir=$(readlink -e "${{dir}}") - local mnts - mnts=$(awk '{{print $2}}' < /proc/mounts | grep "^${{real_dir}}" | sort -r) - for m in ${{mnts}}; do - log_info_print "Unmount ${{m}}" - umount -f "${{m}}" || true - done - - return 0 -}} - -function init_part() {{ - local offset - offset=$(fdisk -l system.img | grep "$1" | awk '{{print $2}}') - local sizelimit - sizelimit=$(fdisk -l system.img | grep "$1" | awk '{{print $3}}') - sizelimit=$(echo "($sizelimit - $offset)*512" | bc) - offset=$(echo "${{offset}}*512" | bc) - local loop - loop=$(losetup -f) - losetup -o "${{offset}}" --sizelimit "${{sizelimit}}" "${{loop}}" system.img - if [ "$2" == "BOOT" ];then - mkfs.vfat -n "$2" "${{loop}}" - mount -t vfat "${{loop}}" "$3" - else - mkfs.ext4 -L "$2" "${{loop}}" - mount -t ext4 "${{loop}}" "$3" - rm -rf "$3/lost+found" - fi -}} -"# - )?; - Ok(()) -} - -fn create_set_in_chroot(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"#!/bin/bash -ln -s /usr/lib/systemd/system/os-agent.service /usr/lib/systemd/system/multi-user.target.wants/os-agent.service -ln -s /usr/lib/systemd/system/kubelet.service /usr/lib/systemd/system/multi-user.target.wants/kubelet.service -if [ "$BOOT_MODE" = "legacy" ]; then - ln -s /usr/lib/systemd/system/boot-grub2.mount /lib/systemd/system/local-fs.target.wants/boot-grub2.mount -else - ln -s /usr/lib/systemd/system/boot-efi.mount /lib/systemd/system/local-fs.target.wants/boot-efi.mount -fi -ln -s /usr/lib/systemd/system/etc.mount /lib/systemd/system/local-fs.target.wants/etc.mount - -str=$(sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{{print $2}}') -umask 0666 -mv /etc/shadow /etc/shadow_bak -sed -i '/^root:/d' /etc/shadow_bak -echo "root:""${{ROOT_PASSWD}}""${{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 -"# - )?; - Ok(()) -} - -fn create_bootloader(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"#!/bin/bash -set -eu -set -o pipefail -set -x -ARCH=$(arch) - -function install_grub2_x86 () {{ - if [ "${{BOOT_MODE}}" = "legacy" ]; then - # make boot.img/core.img and setup, to support legacy boot mode - GRUBNAME=$(which grub2-install) - echo "Installing GRUB2..." - FORCE_OPT=${{FORCE_OPT:-"--force"}} - TARGET_OPT=${{TARGET_OPT:-"--target=i386-pc"}} - - $GRUBNAME --modules="biosdisk part_msdos" "${{FORCE_OPT}}" "${{TARGET_OPT}}" "${{DEVICE}}" - else - # make efi file, and save in FAT16 partition, to support UEFI boot mode - cp -r /usr/lib/grub/x86_64-efi boot/efi/EFI/openEuler - eval "grub2-mkimage -d /usr/lib/grub/x86_64-efi -O x86_64-efi --output=/boot/efi/EFI/openEuler/grubx64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" - - mkdir -p /boot/efi/EFI/BOOT/ - cp -f /boot/efi/EFI/openEuler/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI - fi -}} - -function install_grub2_efi () {{ - cp -r /usr/lib/grub/arm64-efi /boot/efi/EFI/openEuler/ - eval "grub2-mkimage -d /usr/lib/grub/arm64-efi -O arm64-efi --output=/boot/efi/EFI/openEuler/grubaa64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" - - mkdir -p /boot/efi/EFI/BOOT/ - cp -f /boot/efi/EFI/openEuler/grubaa64.efi /boot/efi/EFI/BOOT/BOOTAA64.EFI -}} - -if [ "${{ARCH}}" == "x86_64" ]; then - install_grub2_x86 -fi - -if [ "${{ARCH}}" == "aarch64" ]; then - install_grub2_efi -fi -"# - )?; - Ok(()) -} - -fn create_rpm_list(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"kernel -passwd -dhcp -NetworkManager -openssh-server -docker -kubernetes-kubeadm -kubernetes-kubelet -containernetworking-plugins -socat -conntrack-tools -ebtables -ethtool -rsyslog -vi -net-tools -hwinfo -dracut -coreutils -gawk -parted -dosfstools -sudo -"# - )?; - Ok(()) -} - -fn create_repo_vars(file: &mut File, repo_path: &PathBuf, version: &str, agent_path: &PathBuf, root_passwd: &str, legacy_bios: bool, docker_img: Option<&str>) -> anyhow::Result<()> { - writeln!(file, -r#"REPO_PATH="{}" -VERSION="{}" -AGENT_PATH="{}" -ROOT_PASSWD='{}' -BOOT_MODE="{}" -DOCKER_IMG="{}" -"#, - repo_path.to_str().unwrap(), - version, - agent_path.to_str().unwrap(), - root_passwd, - if legacy_bios { "legacy" } else { "efi" }, - match docker_img { - Some(content) => content, - None => "" - } - )?; - Ok(()) -} - -fn create_os_tar_from_repo(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"function create_os_tar_from_repo() {{ - function prepare_yum() {{ - # init rpmdb - rpm --root "${{RPM_ROOT}}" --initdb - mkdir -p "${{RPM_ROOT}}"{{/etc/yum.repos.d,/persist,/proc,/dev/pts,/sys}} - mount_proc_dev_sys "${{RPM_ROOT}}" - # init yum repo - local iso_repo="${{RPM_ROOT}}/etc/yum.repos.d/iso.repo" - cat "${{REPO_PATH}}" > "$iso_repo" - }} - - function install_packages() {{ - prepare_yum "${{REPO}}" - - echo "install package.." - - local filesize - filesize=$(stat -c "%s" ./rpmlist) - local maxsize=$((1024*1024)) - if [ "${{filesize}}" -gt "${{maxsize}}" ]; then - echo "please check if rpmlist is too big or something wrong" - exit 7 - fi - - local rpms_name - rpms_name=$(tr "\n" " " < ./rpmlist) - old_ifs="$IFS" - IFS=' ' - if [ "${{ARCH}}" == "x86_64" ]; then - if [ "${{BOOT_MODE}}" = "legacy" ]; then - rpms_name+=" grub2" - else - rpms_name+=" grub2-efi grub2-tools grub2-efi-x64-modules grub2-pc-modules" - fi - read -ra rpms <<< "${{rpms_name}}" - IFS="$old_ifs" - yum -y --installroot="${{RPM_ROOT}}" install --nogpgcheck --setopt install_weak_deps=False "${{rpms[@]}}" - elif [ "${{ARCH}}" == "aarch64" ]; then - read -ra rpms <<< "${{rpms_name}}" - IFS="$old_ifs" - yum -y --installroot="${{RPM_ROOT}}" install --nogpgcheck --setopt install_weak_deps=False "${{rpms[@]}}" grub2-efi grub2-tools grub2-efi-aa64-modules - fi - yum -y --installroot="${{RPM_ROOT}}" clean all - }} - - function install_misc() {{ - local DNS_CONF="${{PWD}}/resolv.conf" - cp ../../files/*mount ../../files/os-agent.service "${{RPM_ROOT}}/usr/lib/systemd/system/" - cp ../../files/os-release "${{RPM_ROOT}}/usr/lib/" - cp "${{AGENT_PATH}}" "${{RPM_ROOT}}/usr/bin" - rm "${{RPM_ROOT}}/etc/os-release" - - cat < "${{RPM_ROOT}}/usr/lib/os-release" -NAME=${{NAME}} -ID=${{NAME}} -EOF - echo "PRETTY_NAME=\"${{NAME}} ${{VERSION}}\"" >> "${{RPM_ROOT}}/usr/lib/os-release" - echo "VERSION_ID=${{VERSION}}" >> "${{RPM_ROOT}}/usr/lib/os-release" - mv "${{RPM_ROOT}}"/boot/vmlinuz* "${{RPM_ROOT}}/boot/vmlinuz" - mv "${{RPM_ROOT}}"/boot/initramfs* "${{RPM_ROOT}}/boot/initramfs.img" - if [ "$BOOT_MODE" = "legacy" ]; then - cp grub.cfg "${{RPM_ROOT}}"/boot/grub2 - sed -i "s/insmod part_gpt/insmod part_msdos/g; \ -s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ -s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ -"${{RPM_ROOT}}"/boot/grub2/grub.cfg - else - cp grub.cfg "${{RPM_ROOT}}"/boot/efi/EFI/openEuler - fi - cp -r ./00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ - cp set_in_chroot.sh "${{RPM_ROOT}}" - ROOT_PASSWD="${{ROOT_PASSWD}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{RPM_ROOT}}" bash /set_in_chroot.sh - rm "${{RPM_ROOT}}/set_in_chroot.sh" - if [ -e "${{DNS_CONF}}" ]; then - cp "${{DNS_CONF}}" "${{RPM_ROOT}}/etc/resolv.conf" - fi - }} - - install_packages "${{REPO_PATH}}" "${{BOOT_MODE}}" - install_misc "${{VERSION}}" "${{AGENT_PATH}}" "${{ROOT_PASSWD}}" "${{BOOT_MODE}}" - unmount_dir "${{RPM_ROOT}}" - tar -C "${{RPM_ROOT}}" -cf ./os.tar -}} -"# - )?; - Ok(()) -} - -fn create_vm_repo_img(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"function create_vm_repo_image() {{ - create_os_tar_from_repo - create_img -}} - -test_lock -trap clean_space EXIT -trap clean_img ERR - -create_vm_repo_image"# - )?; - Ok(()) -} - -fn create_pxe_repo_img(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"function create_pxe_repo_img() {{ - rm -rf initramfs.img kubeos.tar - create_os_tar_from_repo - tar -xvf os.tar ./initramfs.img - mv os.tar kubeos.tar -}} - -test_lock -trap clean_space EXIT -trap clean_img ERR - -create_pxe_repo_img"# - )?; - Ok(()) -} - -fn create_docker_file(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"FROM scratch -COPY os.tar / -CMD ["/bin/sh"] -"# - )?; - Ok(()) -} - -fn create_docker_img(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"function create_docker_img() {{ - create_os_tar_from_repo - docker build -t "${{DOCKER_IMG}}" -f ./Dockerfile . -}} - -test_lock -trap clean_space EXIT -trap clean_img ERR - -create_docker_img"# - )?; - Ok(()) -} - -/// prepare fn verify_repo_input(repo_path: &PathBuf, version: &str, agent_path: &PathBuf, docker_img: &str) -> anyhow::Result<()> { if !utils::is_valid_param(repo_path.to_str().unwrap()) { bail!("params {} is invalid, please check input", repo_path.to_str().unwrap()); @@ -1088,17 +124,17 @@ fn check_agent_file_valid(agent_path: &PathBuf) -> anyhow::Result<()> { } fn check_pxe_conf_valid() -> anyhow::Result<()> { - if !utils::is_addr_valid(server_ip) { - bail!("address {} is invalid, please check input", server_ip); + if !utils::is_addr_valid(SERVER_IP) { + bail!("address {} is invalid, please check input", SERVER_IP); } - if !utils::is_addr_valid(local_ip) { - bail!("address {} is invalid, please check input", local_ip); + if !utils::is_addr_valid(LOCAL_IP) { + bail!("address {} is invalid, please check input", LOCAL_IP); } - if !utils::is_addr_valid(route_ip) { - bail!("address {} is invalid, please check input", route_ip); + if !utils::is_addr_valid(ROUTE_IP) { + bail!("address {} is invalid, please check input", ROUTE_IP); } - if !utils::is_addr_valid(netmask) { - bail!("address {} is invalid, please check input", netmask); + if !utils::is_addr_valid(NETMASK) { + bail!("address {} is invalid, please check input", NETMASK); } Ok(()) } \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index b64f8e47..0e1662a0 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -1,8 +1,7 @@ use std::fs::File; use std::io::Write; -use std::path::Pathbuf; - -use Result; +use std::path::PathBuf; +use anyhow::Result; /* region: kbimg.sh */ pub(crate) fn gen_global_vars(file: &mut File) -> Result<()> { @@ -345,7 +344,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ Ok(()) } -pub(crate) fn gen_vm_repo_img(file: &mut File) -> Result<()> { +pub(crate) fn gen_create_vm_repo_img(file: &mut File) -> Result<()> { writeln!(file, r#"function create_vm_repo_image() {{ create_os_tar_from_repo @@ -361,7 +360,7 @@ create_vm_repo_image"# Ok(()) } -pub(crate) fn gen_pxe_repo_img(file: &mut File) -> Result<()> { +pub(crate) fn gen_create_pxe_repo_img(file: &mut File) -> Result<()> { writeln!(file, r#"function create_vm_repo_image() {{ rm -rf initramfs.img kubeos.tar @@ -486,7 +485,7 @@ create_admin_img"# /* endregion */ /* region: set_in_chroot.sh */ -fn gen_set_in_chroot(file: &mut File) -> Result<()> { +pub(crate) fn gen_set_in_chroot(file: &mut File) -> Result<()> { writeln!(file, r#"#!/bin/bash ln -s /usr/lib/systemd/system/os-agent.service /usr/lib/systemd/system/multi-user.target.wants/os-agent.service @@ -515,7 +514,7 @@ rm -rf /usr/lib/dracut/modules.d/00bootup /* endregion */ /* region: bootloader.sh */ -fn gen_bootloader(file: &mut File) -> Result<()> { +pub(crate) fn gen_bootloader(file: &mut File) -> Result<()> { writeln!(file, r#"#!/bin/bash set -eu @@ -564,7 +563,7 @@ fi /* endregion */ /* region: rpmlist */ -fn create_rpm_list(file: &mut File) -> Result<()> { +pub(crate) fn gen_rpm_list(file: &mut File) -> Result<()> { writeln!(file, r#"kernel passwd @@ -596,7 +595,7 @@ sudo /* endregion */ /* region: grub.cfg */ -fn gen_grub_cfg(file: &mut File) -> Result<()> { +pub(crate) fn gen_grub_cfg(file: &mut File) -> Result<()> { writeln!(file, r#"## Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. # KubeOS is licensed under the Mulan PSL v2. @@ -778,7 +777,7 @@ fi /* endregion */ /* region: 00bootup */ -fn gen_global_cfg(file: &mut File, rootfs_name: &str, disk: &str, server_ip: &str, local_ip: &str, route_ip: &str, netmask: &str, net_name: &str) -> Result<()> { +pub(crate) fn gen_global_cfg(file: &mut File, rootfs_name: &str, disk: &str, server_ip: &str, local_ip: &str, route_ip: &str, netmask: &str, net_name: &str) -> Result<()> { writeln!(file, r#"# rootfs file name rootfs_name={} @@ -808,7 +807,7 @@ net_name={} Ok(()) } -fn gen_module_setup(file: &mut File) -> Result<()> { +pub(crate) fn gen_module_setup(file: &mut File) -> Result<()> { writeln!(file, r#"#!/bin/bash @@ -836,7 +835,7 @@ installkernel() {{ Ok(()) } -fn gen_mount(file: &mut File) -> Result<()> { +pub(crate) fn gen_mount(file: &mut File) -> Result<()> { writeln!(file, r#"#!/bin/bash arch=$(arch) @@ -1218,7 +1217,7 @@ fi /* endregion */ /* region: dockerfile */ -fn gen_dockerfile(file: &mut File) -> Result<()> { +pub(crate) fn gen_dockerfile(file: &mut File) -> Result<()> { writeln!(file, r#"FROM scratch COPY os.tar / @@ -1227,4 +1226,64 @@ CMD ["/bin/sh"] )?; Ok(()) } +/* endregion */ + +/* region: admin-container */ +pub(crate) fn gen_admin_dockerfile(file: &mut File) -> Result<()> { + writeln!(file, +r#"FROM openeuler-22.03-lts +MAINTAINER + +RUN yum -y install openssh-clients util-linux + +ADD ./sysmaster-0.2.3-1.oe2203.aarch64.rpm /home +RUN rpm -ivh /home/sysmaster-0.2.3-1.oe2203.aarch64.rpm + +COPY ./hostshell /usr/bin/ +COPY ./set-ssh-pub-key.sh /usr/local/bin +COPY ./set-ssh-pub-key.service /usr/lib/sysmaster + +EXPOSE 22 +# set sshd.service and set-ssh-pub-key.service pulled up by default +RUN sed -i 's/sysinit.target/sysinit.target;sshd.service;set-ssh-pub-key.service/g' /usr/lib/sysmaster/basic.target + +CMD ["/usr/lib/sysmaster/init"] +"# + )?; + Ok(()) +} + +pub(crate) fn gen_set_ssh_pub_key_service(file: &mut File) -> Result<()> { + writeln!(file, +r#"[Unit] +Description="set ssh authorized keys according to the secret which is set by user" + +[Service] +ExecStart="/usr/local/bin/set-ssh-pub-key.sh" +"# + )?; + Ok(()) +} + +pub(crate) fn gen_set_ssh_pub_key(file: &mut File) -> Result<()> { + writeln!(file, +r#"ssh_pub=$(cat /etc/secret-volume/ssh-pub-key) +ssh_dir="/root/.ssh" +authorized_file="$ssh_dir/authorized_keys" + +if [ ! -d "$ssh_dir" ]; then + mkdir "$ssh_dir" + chmod 700 "$ssh_dir" +fi + +if [ ! -f "$authorized_file" ]; then + touch "$authorized_file" + chmod 600 "$authorized_file" +fi + +echo "$ssh_pub" >> "$authorized_file" +"# + )?; + Ok(()) +} /* endregion */ \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs index b0430f93..88af4b96 100644 --- a/KubeOS-Rust/kbimg/src/utils.rs +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -24,171 +24,6 @@ pub(crate) fn write_vector_to_file(scripts: Vec, file_name: &str) -> any Ok(()) } -/// Create general scripts -pub(crate) fn create_global(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"#!/bin/bash -## Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. -# KubeOS is licensed under the Mulan PSL v2. -# You can use this software according to the terms and conditions of the Mulan PSL v2. -# You may obtain a copy of Mulan PSL v2 at: -# http://license.coscl.org.cn/MulanPSL2 -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -# PURPOSE. -## See the Mulan PSL v2 for more details. - -ARCH=$(arch) -PWD="$(pwd)" -TMP_MOUNT_PATH="${{PWD}}/mnt" -RPM_ROOT="${{PWD}}/rootfs" -IMG_SIZE=20 -LOCK=./test.lock - -source ./utils.sh &>/dev/null - -function delete_dir() {{ - local ret=0 - local dir="$1" - unmount_dir "${{dir}}" - ret=$? - if [ "${{ret}}" -eq 0 ]; then - rm -rf "${{dir}}" - return 0 - else - log_error_print "${{dir}} is failed to unmount , can not delete ${{dir}}." - return 1 - fi -}} - -function delete_file() {{ - local file="$1" - if [ ! -e "${{file}}" ]; then - return 0 - fi - - if [ ! -f "${{file}}" ]; then - log_error_print "${{file}} is not a file." - return 1 - fi - - rm -f "${{file}}" - return 0 -}} - -function clean_space() {{ - delete_dir "${{RPM_ROOT}}" - delete_dir "${{TMP_MOUNT_PATH}}" - delete_file os.tar - rm -rf "${{LOCK}}" - delete_file "${{ADMIN_CONTAINER_DIR}}"/hostshell -}} - -function clean_img() {{ - delete_file system.img - delete_file update.img - delete_file initramfs.img - delete_file kubeos.tar -}} - -function file_lock() {{ - local lock_file=$1 - exec {{lock_fd}}>"${{lock_file}}" - flock -xn "${{lock_fd}}" -}} - -function test_lock() {{ - file_lock "${{LOCK}}" - local status=$? - if [ $status -ne 0 ]; then - log_error_print "There is already an generate process running." - exit 203 - fi -}} - -function log_error_print() {{ - local logmsg - logmsg="[ ERROR ] - ""$(date "+%b %d %Y %H:%M:%S")"" $1" - echo "$logmsg" -}} - -function log_info_print() {{ - local logmsg - logmsg="[ INFO ] - ""$(date "+%b %d %Y %H:%M:%S")"" $1" - echo "$logmsg" -}} -"# -)?; - Ok(()) -} - -/// Create create-img for vm -pub(crate) fn create_img(file: &mut File) -> anyhow::Result<()> { - writeln!(file, -r#"function create_img() {{ - rm -f system.img update.img - qemu-img create system.img ${{IMG_SIZE}}G - if [ "${{BOOT_MODE}}" = "legacy" ]; then - local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/grub2 - parted system.img -s mklabel msdos - parted system.img -s mkpart primary ext4 1MiB 60MiB - else - local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/efi - parted system.img -s mklabel gpt - parted system.img -s mkpart primary fat32 1MiB 60MiB - fi - parted system.img -s mkpart primary ext4 60MiB 2160MiB - parted system.img -s mkpart primary ext4 2160MiB 4260MiB - parted system.img -s mkpart primary ext4 4260MiB 100% - local device - device=$(losetup -f) - losetup "${{device}}" system.img - - mkdir -p "${{TMP_MOUNT_PATH}}" - - init_part system.img2 ROOT-A "${{TMP_MOUNT_PATH}}" - - mkdir -p "${{BOOT_PATH}}" - chmod 755 "${{BOOT_PATH}}" - if [ "$BOOT_MODE" = "legacy" ]; then - init_part system.img1 GRUB2 "${{BOOT_PATH}}" - else - init_part system.img1 BOOT "${{BOOT_PATH}}" - fi - tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar - if [ "${{BOOT_MODE}}" = "legacy" ]; then - sed -i "s/insmod part_gpt/insmod part_msdos/g; \ -s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ -s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ -"${{TMP_MOUNT_PATH}}"/boot/grub2/grub.cfg - fi - sync - cp bootloader.sh "${{TMP_MOUNT_PATH}}" - mount_proc_dev_sys "${{TMP_MOUNT_PATH}}" - DEVICE="${{device}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{TMP_MOUNT_PATH}}" bash bootloader.sh - rm -rf "${{TMP_MOUNT_PATH}}/bootloader.sh" - sync - - dd if=/dev/disk/by-label/ROOT-A of=update.img bs=8M - sync - unmount_dir "${{TMP_MOUNT_PATH}}" - init_part system.img3 ROOT-B "${{TMP_MOUNT_PATH}}" - umount "${{TMP_MOUNT_PATH}}" - - init_part system.img4 PERSIST "${{TMP_MOUNT_PATH}}" - mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}} - mkdir -p "${{TMP_MOUNT_PATH}}"/etc/KubeOS/certs - umount "${{TMP_MOUNT_PATH}}" - - losetup -D - parted system.img -- set 1 boot on - qemu-img convert system.img -O qcow2 system.qcow2 -}} -"# - )?; - Ok(()) -} - /// Check if the input parameter is valid pub(crate) fn is_valid_param + std::fmt::Debug>(param: S) -> bool { let special_chars = vec!["|", ";", "&", "&&", "||", ">", ">>", "<", ",", "#", "!", "$"]; @@ -214,7 +49,7 @@ pub(crate) fn is_addr_valid(addr: &str) -> bool { } for quad in addr.split('.') { - if let Ok(num) = quad.parse::() { + if let Ok(num) = quad.parse::() { if num <= 255 { continue; } diff --git a/KubeOS-Rust/kbimg/src/values.rs b/KubeOS-Rust/kbimg/src/values.rs index b13a96ef..8f79f79c 100644 --- a/KubeOS-Rust/kbimg/src/values.rs +++ b/KubeOS-Rust/kbimg/src/values.rs @@ -1,7 +1,6 @@ pub(crate) const KBIMG_NAME: &str = "kbimg.sh"; pub(crate) const BOOTLOADER_NAME: &str = "bootloader.sh"; pub(crate) const SET_IN_CHROOT_NAME: &str = "set_in_chroot.sh"; -pub(crate) const UTILS_NAME: &str = "utils.sh"; pub(crate) const GRUB_CFG_NAME: &str = "grub.cfg"; pub(crate) const RPMLIST_NAME: &str = "rpmlist"; pub(crate) const DOCKERFILE_NAME: &str = "Dockerfile"; @@ -9,12 +8,16 @@ pub(crate) const BOOTUP_DIR: &str = "./00bootup"; pub(crate) const GLOBAL_CFG_NAME: &str = "./00bootup/Global.cfg"; pub(crate) const MODULE_SETUP_NAME: &str = "./00bootup/module-setup.sh"; pub(crate) const MOUNT_NAME: &str = "./00bootup/mount.sh"; +pub(crate) const ADMIN_CONTAINER_DIR: &str = "./admin-container"; +pub(crate) const ADMIN_DOCKERFILE_NAME: &str = "./admin-container/Dockerfile"; +pub(crate) const SET_SSH_PUB_KEY_SERVICE_NAME: &str = "./admin-container/set-ssh-pub-key.service"; +pub(crate) const SET_SSH_PUB_KEY_NAME: &str = "./admin-container/set-ssh-pub-key.sh"; -// pxe config -pub(crate) const rootfs_name: &str = "kubeos.tar"; -pub(crate) const disk: &str = "/dev/sda"; -pub(crate) const server_ip: &str = "192.168.1.50"; -pub(crate) const local_ip: &str = "192.168.1.100"; -pub(crate) const route_ip: &str = "192.168.1.1"; -pub(crate) const netmask: &str = "255.255.255.0"; -pub(crate) const net_name: &str = "eth0"; +// 00bootup config +pub(crate) const ROOTFS_NAME: &str = "kubeos.tar"; +pub(crate) const DISK: &str = "/dev/sda"; +pub(crate) const SERVER_IP: &str = "192.168.1.50"; +pub(crate) const LOCAL_IP: &str = "192.168.1.100"; +pub(crate) const ROUTE_IP: &str = "192.168.1.1"; +pub(crate) const NETMASK: &str = "255.255.255.0"; +pub(crate) const NET_NAME: &str = "eth0"; -- Gitee From f575d09e7572f489f31e0613d78cb78a09e896fe Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 14 Aug 2024 10:51:59 +0800 Subject: [PATCH 052/116] change image_name to docker_img --- KubeOS-Rust/kbimg/kbimg.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index b458e7e3..0230bac9 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -8,12 +8,12 @@ version = "v1" docker_img = "" [from_dockerimg] -image_name = "" +docker_img = "" image_type = "vm-docker" [admin_container] dockerfile = "" -image_name = "" +docker_img = "" # [[users]] # groups = ["admin"] -- Gitee From 6d3a65b208a8b16c5a0cb71c94bbafc20b7646d0 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 14 Aug 2024 10:54:35 +0800 Subject: [PATCH 053/116] add #!/bin/bash to gen_kbimg --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 0e1662a0..84200732 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -6,7 +6,8 @@ use anyhow::Result; /* region: kbimg.sh */ pub(crate) fn gen_global_vars(file: &mut File) -> Result<()> { writeln!(file, -r#"ARCH=$(arch) +r#"#!/bin/bash +ARCH=$(arch) IMG_SIZE=20 LOCK=./test.lock PWD="$(pwd)" -- Gitee From 89047cc2a6628059129942236632f99e9cbcaa7e Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 14 Aug 2024 11:04:39 +0800 Subject: [PATCH 054/116] [bugfix] generate os.tar add outdir --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 84200732..a852632c 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -272,7 +272,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ install_packages "${{REPO_PATH}}" "${{BOOT_MODE}}" install_misc "${{VERSION}}" "${{AGENT_PATH}}" "${{ROOT_PASSWD}}" "${{BOOT_MODE}}" unmount_dir "${{RPM_ROOT}}" - tar -C "${{RPM_ROOT}}" -cf ./os.tar + tar -C "${{RPM_ROOT}}" -cf ./os.tar . }} "# )?; -- Gitee From 4dba274a8ba0869f5fd7605b34559883e170def0 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 14 Aug 2024 11:20:26 +0800 Subject: [PATCH 055/116] fix spell error --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 4 ++-- KubeOS-Rust/kbimg/src/utils.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index a852632c..9f7cb752 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -347,7 +347,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ pub(crate) fn gen_create_vm_repo_img(file: &mut File) -> Result<()> { writeln!(file, -r#"function create_vm_repo_image() {{ +r#"function create_vm_repo_img() {{ create_os_tar_from_repo create_img }} @@ -363,7 +363,7 @@ create_vm_repo_image"# pub(crate) fn gen_create_pxe_repo_img(file: &mut File) -> Result<()> { writeln!(file, -r#"function create_vm_repo_image() {{ +r#"function create_pxe_repo_img() {{ rm -rf initramfs.img kubeos.tar create_os_tar_from_repo tar -xvf os.tar ./initramfs.img diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs index 88af4b96..ec542226 100644 --- a/KubeOS-Rust/kbimg/src/utils.rs +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -1,7 +1,7 @@ use std::{fs::File, io::Write, path::PathBuf, process::Command}; use anyhow::bail; -use log::{debug, error}; +use log::debug; pub(crate) fn execute_scripts(script: PathBuf) -> anyhow::Result<()> { if !script.exists() { -- Gitee From 45e276411c602b62763a8952826ae0beb9a1c910 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 14 Aug 2024 17:29:17 +0800 Subject: [PATCH 056/116] add_user, boot_mode and arch --- KubeOS-Rust/kbimg/kbimg.toml | 14 +- KubeOS-Rust/kbimg/src/docker_img.rs | 6 +- KubeOS-Rust/kbimg/src/repo.rs | 20 +- KubeOS-Rust/kbimg/src/scripts_gen.rs | 388 ++++++++++++++++----------- KubeOS-Rust/kbimg/src/utils.rs | 13 + ztest/1.txt | 1 + ztest/2.txt | 1 + 7 files changed, 260 insertions(+), 183 deletions(-) create mode 100644 ztest/1.txt create mode 100644 ztest/2.txt diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index 0230bac9..e04941f8 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -1,6 +1,6 @@ [from_repo] agent_path = "/root/KubeOS/bin/os-agent" -image_type = "vm-repo" +image_type = "pxe-repo" legacy_bios = true repo_path = "/etc/yum.repos.d/openEuler.repo" root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" @@ -26,13 +26,13 @@ docker_img = "" # name = "bar" # passwd = "bar" -# [[copy_files]] -# dst = "/persist/dst-file1" -# src = "./src-file1" +[[copy_files]] +dst = "/ztest" +src = "/root/KubeOS/ztest/1.txt" -# [[copy_files]] -# dst = "/persist/dst-file2" -# src = "./src-file2" +[[copy_files]] +dst = "/ztest" +src = "../../ztest/2.txt" # [grub] # passwd = "foo" diff --git a/KubeOS-Rust/kbimg/src/docker_img.rs b/KubeOS-Rust/kbimg/src/docker_img.rs index c55cdc42..95c015bb 100644 --- a/KubeOS-Rust/kbimg/src/docker_img.rs +++ b/KubeOS-Rust/kbimg/src/docker_img.rs @@ -15,7 +15,7 @@ impl CreateImage for DockerInfo { verify_docker_input(&image_name)?; check_docker_image(&image_name)?; if self.image_type == "pxe-repo" { - check_pxe_conf_valid()?; + check_bootup_conf_valid()?; } Ok(()) } @@ -29,7 +29,7 @@ impl CreateImage for DockerInfo { if self.image_type == "vm-docker" { // kbimg.sh gen_init_part(&mut kbimg)?; - gen_create_img(&mut kbimg)?; + gen_create_img(&mut kbimg, false)?; gen_create_vm_docker_img(&mut kbimg)?; } else { @@ -62,7 +62,7 @@ fn check_docker_image(image_name: &str) -> anyhow::Result<()> { Ok(()) } -fn check_pxe_conf_valid() -> anyhow::Result<()> { +fn check_bootup_conf_valid() -> anyhow::Result<()> { if !utils::is_addr_valid(SERVER_IP) { bail!("address {} is invalid, please check input", SERVER_IP); } diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index 97ea25a1..5c93bd5e 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -4,7 +4,7 @@ use std::fs::{File, create_dir_all}; use anyhow::bail; use sysinfo::Disks; -use crate::utils; +use crate::utils::{self, get_arch}; use crate::values::{BOOTLOADER_NAME, BOOTUP_DIR, DISK, DOCKERFILE_NAME, GLOBAL_CFG_NAME, GRUB_CFG_NAME, KBIMG_NAME, LOCAL_IP, MODULE_SETUP_NAME, MOUNT_NAME, NETMASK, NET_NAME, ROOTFS_NAME, ROUTE_IP, RPMLIST_NAME, SERVER_IP, SET_IN_CHROOT_NAME}; use crate::scripts_gen::{gen_bootloader, gen_create_docker_img, gen_create_img, gen_create_os_tar_from_repo, gen_create_pxe_repo_img, gen_create_vm_repo_img, gen_dockerfile, gen_global_cfg, gen_global_func, gen_global_vars, gen_grub_cfg, gen_init_part, gen_module_setup, gen_mount, gen_mount_proc_dev_sys, gen_repo_vars, gen_rpm_list, gen_set_in_chroot, gen_unmount_dir}; use crate::{commands::RepoInfo, Config, CreateImage}; @@ -16,13 +16,15 @@ impl CreateImage for RepoInfo { check_repo_file_valid(&self.repo_path)?; check_agent_file_valid(&self.agent_path)?; if self.image_type == "pxe-repo" { - check_pxe_conf_valid()?; + check_bootup_conf_valid()?; } Ok(()) } fn generate_scripts(&self, config: Config) -> anyhow::Result { - // rpmlist + let arch = get_arch(); + + // rpmlist let mut rpmlist = File::create(RPMLIST_NAME)?; gen_rpm_list(&mut rpmlist)?; // 00bootup @@ -44,7 +46,7 @@ impl CreateImage for RepoInfo { gen_grub_cfg(&mut grub_cfg)?; // set_in_chroot.sh let mut set_in_chroot = File::create(SET_IN_CHROOT_NAME)?; - gen_set_in_chroot(&mut set_in_chroot)?; + gen_set_in_chroot(&mut set_in_chroot, self.legacy_bios)?; // kbimg.sh let mut kbimg = File::create(KBIMG_NAME)?; gen_global_vars(&mut kbimg)?; @@ -52,14 +54,14 @@ impl CreateImage for RepoInfo { gen_global_func(&mut kbimg)?; gen_mount_proc_dev_sys(&mut kbimg)?; gen_unmount_dir(&mut kbimg)?; - gen_create_os_tar_from_repo(&mut kbimg)?; + gen_create_os_tar_from_repo(&mut kbimg, &arch, self.legacy_bios, &config.copy_files)?; if self.image_type == "vm-repo" { // bootloader.sh let mut bootloader = File::create(BOOTLOADER_NAME)?; - gen_bootloader(&mut bootloader)?; + gen_bootloader(&mut bootloader, &arch, self.legacy_bios)?; // kbimg.sh gen_init_part(&mut kbimg)?; - gen_create_img(&mut kbimg)?; + gen_create_img(&mut kbimg, self.legacy_bios)?; gen_create_vm_repo_img(&mut kbimg)?; } else if self.image_type == "pxe-repo" { @@ -123,7 +125,7 @@ fn check_agent_file_valid(agent_path: &PathBuf) -> anyhow::Result<()> { utils::is_file_valid("os-agent binary", agent_path) } -fn check_pxe_conf_valid() -> anyhow::Result<()> { +fn check_bootup_conf_valid() -> anyhow::Result<()> { if !utils::is_addr_valid(SERVER_IP) { bail!("address {} is invalid, please check input", SERVER_IP); } @@ -137,4 +139,4 @@ fn check_pxe_conf_valid() -> anyhow::Result<()> { bail!("address {} is invalid, please check input", NETMASK); } Ok(()) -} \ No newline at end of file +} diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 9f7cb752..0eafbcc6 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -3,11 +3,12 @@ use std::io::Write; use std::path::PathBuf; use anyhow::Result; +use crate::commands::CopyFile; + /* region: kbimg.sh */ pub(crate) fn gen_global_vars(file: &mut File) -> Result<()> { writeln!(file, r#"#!/bin/bash -ARCH=$(arch) IMG_SIZE=20 LOCK=./test.lock PWD="$(pwd)" @@ -26,23 +27,23 @@ r#"function delete_dir() {{ unmount_dir "${{dir}}" ret=$? if [ "${{ret}}" -eq 0 ]; then - rm -rf "${{dir}}" - return 0 + rm -rf "${{dir}}" + return 0 else - log_error_print "${{dir}} is failed to unmount , can not delete ${{dir}}." - return 1 + log_error_print "${{dir}} is failed to unmount , can not delete ${{dir}}." + return 1 fi }} function delete_file() {{ local file="$1" if [ ! -e "${{file}}" ]; then - return 0 + return 0 fi if [ ! -f "${{file}}" ]; then - log_error_print "${{file}} is not a file." - return 1 + log_error_print "${{file}} is not a file." + return 1 fi rm -f "${{file}}" @@ -115,12 +116,12 @@ r#"function unmount_dir() {{ local dir=$1 if [ -L "${{dir}}" ] || [ -f "${{dir}}" ]; then - log_error_print "${{dir}} is not a directory, please check it." - return 1 + log_error_print "${{dir}} is not a directory, please check it." + return 1 fi if [ ! -d "${{dir}}" ]; then - return 0 + return 0 fi local real_dir @@ -128,8 +129,8 @@ r#"function unmount_dir() {{ local mnts mnts=$(awk '{{print $2}}' < /proc/mounts | grep "^${{real_dir}}" | sort -r) for m in ${{mnts}}; do - log_info_print "Unmount ${{m}}" - umount -f "${{m}}" || true + log_info_print "Unmount ${{m}}" + umount -f "${{m}}" || true done return 0 @@ -152,12 +153,12 @@ r#"function init_part() {{ loop=$(losetup -f) losetup -o "${{offset}}" --sizelimit "${{sizelimit}}" "${{loop}}" system.img if [ "$2" == "BOOT" ];then - mkfs.vfat -n "$2" "${{loop}}" - mount -t vfat "${{loop}}" "$3" + mkfs.vfat -n "$2" "${{loop}}" + mount -t vfat "${{loop}}" "$3" else - mkfs.ext4 -L "$2" "${{loop}}" - mount -t ext4 "${{loop}}" "$3" - rm -rf "$3/lost+found" + mkfs.ext4 -L "$2" "${{loop}}" + mount -t ext4 "${{loop}}" "$3" + rm -rf "$3/lost+found" fi }} "# @@ -166,134 +167,192 @@ r#"function init_part() {{ } // repo -pub(crate) fn gen_repo_vars(file: &mut File, repo_path: &PathBuf, version: &str, agent_path: &PathBuf, root_passwd: &str, legacy_bios: bool, docker_img: Option<&str>) -> Result<()> { - // wait for new +pub(crate) fn gen_repo_vars(file: &mut File, repo_path: &PathBuf, version: &str, agent_path: &PathBuf, root_passwd: &str, legacy_bios: bool, docker_img: Option<&str>) -> Result<()> { writeln!(file, r#"REPO_PATH="{}" VERSION="{}" AGENT_PATH="{}" ROOT_PASSWD='{}' BOOT_MODE="{}" -DOCKER_IMG="{}" "#, repo_path.to_str().unwrap(), version, agent_path.to_str().unwrap(), - root_passwd, - if legacy_bios { "legacy" } else { "efi" }, - match docker_img { - Some(img_name) => img_name, - None => "" + root_passwd, + if legacy_bios { "legacy" } else { "efi" } + )?; + if let Some(obj) = docker_img { + writeln!(file, "DOCKER_IMG=\"{}\"\n", obj)?; } + Ok(()) +} + +pub(crate) fn gen_prepare_yum(file: &mut File) -> Result<()> { + writeln!(file, +r#"function prepare_yum() {{ + # init rpmdb + rpm --root "${{RPM_ROOT}}" --initdb + mkdir -p "${{RPM_ROOT}}"{{/etc/yum.repos.d,/persist,/proc,/dev/pts,/sys}} + mount_proc_dev_sys "${{RPM_ROOT}}" + # init yum repo + local iso_repo="${{RPM_ROOT}}/etc/yum.repos.d/iso.repo" + cat "${{REPO_PATH}}" > "$iso_repo" +}} +"# )?; Ok(()) } -pub(crate) fn gen_create_os_tar_from_repo(file: &mut File) -> Result<()> { +pub(crate) fn gen_install_packages(file: &mut File, arch: &str, legacy_bios: bool) -> Result<()> { writeln!(file, -r#"function create_os_tar_from_repo() {{ - function prepare_yum() {{ - # init rpmdb - rpm --root "${{RPM_ROOT}}" --initdb - mkdir -p "${{RPM_ROOT}}"{{/etc/yum.repos.d,/persist,/proc,/dev/pts,/sys}} - mount_proc_dev_sys "${{RPM_ROOT}}" - # init yum repo - local iso_repo="${{RPM_ROOT}}/etc/yum.repos.d/iso.repo" - cat "${{REPO_PATH}}" > "$iso_repo" - }} - - function install_packages() {{ - prepare_yum "${{REPO}}" - - echo "install package.." - - local filesize - filesize=$(stat -c "%s" ./rpmlist) - local maxsize=$((1024*1024)) - if [ "${{filesize}}" -gt "${{maxsize}}" ]; then - echo "please check if rpmlist is too big or something wrong" - exit 7 - fi +r#"function install_packages() {{ + prepare_yum "${{REPO_PATH}}" - local rpms_name - rpms_name=$(tr "\n" " " < ./rpmlist) - old_ifs="$IFS" - IFS=' ' - if [ "${{ARCH}}" == "x86_64" ]; then - if [ "${{BOOT_MODE}}" = "legacy" ]; then - rpms_name+=" grub2" - else - rpms_name+=" grub2-efi grub2-tools grub2-efi-x64-modules grub2-pc-modules" - fi - read -ra rpms <<< "${{rpms_name}}" - IFS="$old_ifs" - yum -y --installroot="${{RPM_ROOT}}" install --nogpgcheck --setopt install_weak_deps=False "${{rpms[@]}}" - elif [ "${{ARCH}}" == "aarch64" ]; then - read -ra rpms <<< "${{rpms_name}}" - IFS="$old_ifs" - yum -y --installroot="${{RPM_ROOT}}" install --nogpgcheck --setopt install_weak_deps=False "${{rpms[@]}}" grub2-efi grub2-tools grub2-efi-aa64-modules - fi - yum -y --installroot="${{RPM_ROOT}}" clean all - }} + echo "install package.." - function install_misc() {{ - local DNS_CONF="${{PWD}}/resolv.conf" - cp ../../files/*mount ../../files/os-agent.service "${{RPM_ROOT}}/usr/lib/systemd/system/" - cp ../../files/os-release "${{RPM_ROOT}}/usr/lib/" - cp "${{AGENT_PATH}}" "${{RPM_ROOT}}/usr/bin" - rm "${{RPM_ROOT}}/etc/os-release" + local filesize + filesize=$(stat -c "%s" ./rpmlist) + local maxsize=$((1024*1024)) + if [ "${{filesize}}" -gt "${{maxsize}}" ]; then + echo "please check if rpmlist is too big or something wrong" + exit 7 + fi - cat < "${{RPM_ROOT}}/usr/lib/os-release" + local rpms_name + rpms_name=$(tr "\n" " " < ./rpmlist) + old_ifs="$IFS" + IFS=' '"#)?; + + if arch == "x86_64" { + if legacy_bios { + writeln!(file, "\trpms_name+=\" grub2\"")?; + } + else { + writeln!(file, "\trpms_name+=\" grub2-efi grub2-tools grub2-efi-x64-modules grub2-pc-modules\"")?; + } + writeln!(file, +r#" read -ra rpms <<< "${{rpms_name}}" + IFS="$old_ifs" + yum -y --installroot="${{RPM_ROOT}}" install --nogpgcheck --setopt install_weak_deps=False "${{rpms[@]}}""# + )?; + } + else if arch == "aarch64" { + writeln!(file, +r#" read -ra rpms <<< "${{rpms_name}}" + IFS="$old_ifs" + yum -y --installroot="${{RPM_ROOT}}" install --nogpgcheck --setopt install_weak_deps=False "${{rpms[@]}}" grub2-efi grub2-tools grub2-efi-aa64-modules"# + )?; + } + writeln!(file, +r#" yum -y --installroot="${{RPM_ROOT}}" clean all +}} +"# + )?; + Ok(()) +} + +pub(crate) fn gen_install_misc(file: &mut File, legacy_bios: bool) -> Result<()> { + writeln!(file, +r#"function install_misc() {{ + local DNS_CONF="${{PWD}}/resolv.conf" + cp ../../files/*mount ../../files/os-agent.service "${{RPM_ROOT}}/usr/lib/systemd/system/" + cp ../../files/os-release "${{RPM_ROOT}}/usr/lib/" + cp "${{AGENT_PATH}}" "${{RPM_ROOT}}/usr/bin" + rm "${{RPM_ROOT}}/etc/os-release" + + cat < "${{RPM_ROOT}}/usr/lib/os-release" NAME=${{NAME}} ID=${{NAME}} EOF - echo "PRETTY_NAME=\"${{NAME}} ${{VERSION}}\"" >> "${{RPM_ROOT}}/usr/lib/os-release" - echo "VERSION_ID=${{VERSION}}" >> "${{RPM_ROOT}}/usr/lib/os-release" - mv "${{RPM_ROOT}}"/boot/vmlinuz* "${{RPM_ROOT}}/boot/vmlinuz" - mv "${{RPM_ROOT}}"/boot/initramfs* "${{RPM_ROOT}}/boot/initramfs.img" - if [ "$BOOT_MODE" = "legacy" ]; then - cp grub.cfg "${{RPM_ROOT}}"/boot/grub2 - sed -i "s/insmod part_gpt/insmod part_msdos/g; \ + echo "PRETTY_NAME=\"${{NAME}} ${{VERSION}}\"" >> "${{RPM_ROOT}}/usr/lib/os-release" + echo "VERSION_ID=${{VERSION}}" >> "${{RPM_ROOT}}/usr/lib/os-release" + mv "${{RPM_ROOT}}"/boot/vmlinuz* "${{RPM_ROOT}}/boot/vmlinuz" + mv "${{RPM_ROOT}}"/boot/initramfs* "${{RPM_ROOT}}/boot/initramfs.img""#)?; + + if legacy_bios { + writeln!(file, +r#" cp grub.cfg "${{RPM_ROOT}}"/boot/grub2 + sed -i "s/insmod part_gpt/insmod part_msdos/g; \ s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ -"${{RPM_ROOT}}"/boot/grub2/grub.cfg - else - cp grub.cfg "${{RPM_ROOT}}"/boot/efi/EFI/openEuler - fi - cp -r ./00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ - cp set_in_chroot.sh "${{RPM_ROOT}}" - ROOT_PASSWD="${{ROOT_PASSWD}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{RPM_ROOT}}" bash /set_in_chroot.sh - rm "${{RPM_ROOT}}/set_in_chroot.sh" - if [ -e "${{DNS_CONF}}" ]; then - cp "${{DNS_CONF}}" "${{RPM_ROOT}}/etc/resolv.conf" - fi - }} +"${{RPM_ROOT}}"/boot/grub2/grub.cfg"# + )?; + } + else { + writeln!(file, "\tcp grub.cfg \"${{RPM_ROOT}}\"/boot/efi/EFI/openEuler")?; + } - install_packages "${{REPO_PATH}}" "${{BOOT_MODE}}" - install_misc "${{VERSION}}" "${{AGENT_PATH}}" "${{ROOT_PASSWD}}" "${{BOOT_MODE}}" - unmount_dir "${{RPM_ROOT}}" - tar -C "${{RPM_ROOT}}" -cf ./os.tar . + writeln!(file, +r#" cp -r ./00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ + cp set_in_chroot.sh "${{RPM_ROOT}}" + ROOT_PASSWD="${{ROOT_PASSWD}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{RPM_ROOT}}" bash /set_in_chroot.sh + rm "${{RPM_ROOT}}/set_in_chroot.sh" + if [ -e "${{DNS_CONF}}" ]; then + cp "${{DNS_CONF}}" "${{RPM_ROOT}}/etc/resolv.conf" + fi }} -"# +"# )?; Ok(()) } -pub(crate) fn gen_create_img(file: &mut File) -> Result<()> { +pub(crate) fn gen_copy_files(file: &mut File, copy_files: &Vec) -> Result<()> { + writeln!(file, r#"function copy_files() {{"#)?; + for copy_file in copy_files { + writeln!(file, "\tcp \"{}\" \"${{RPM_ROOT}}{}\"", copy_file.src, copy_file.dst)?; + } + writeln!(file, "}}\n")?; + Ok(()) +} + +pub(crate) fn gen_create_os_tar_from_repo(file: &mut File, arch: &str, legacy_bios: bool, copy_files: &Option>) -> Result<()> { + gen_prepare_yum(file)?; + gen_install_packages(file, arch, legacy_bios)?; + gen_install_misc(file, legacy_bios)?; + if let Some(copy_files) = copy_files { + gen_copy_files(file, copy_files)?; + } + + writeln!(file, +r#"function create_os_tar_from_repo() {{ + install_packages + install_misc + + # (optional) custom config"#)?; + + if let Some(_) = copy_files { + writeln!(file, "\tcopy_files\n")?; + } + + writeln!(file, +r#" unmount_dir "${{RPM_ROOT}}" + tar -C "${{RPM_ROOT}}" -cf ./os.tar . +}} +"#)?; + Ok(()) +} + +pub(crate) fn gen_create_img(file: &mut File, legacy_bios: bool) -> Result<()> { writeln!(file, r#"function create_img() {{ rm -f system.img update.img - qemu-img create system.img ${{IMG_SIZE}}G - if [ "${{BOOT_MODE}}" = "legacy" ]; then - local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/grub2 - parted system.img -s mklabel msdos - parted system.img -s mkpart primary ext4 1MiB 60MiB - else - local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/efi - parted system.img -s mklabel gpt - parted system.img -s mkpart primary fat32 1MiB 60MiB - fi - parted system.img -s mkpart primary ext4 60MiB 2160MiB + qemu-img create system.img ${{IMG_SIZE}}G"#)?; + + if legacy_bios { + writeln!(file, +r#" local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/grub2 + parted system.img -s mklabel msdos + parted system.img -s mkpart primary ext4 1MiB 60MiB"#)?; + } + else { + writeln!(file, +r#" local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/efi + parted system.img -s mklabel gpt + parted system.img -s mkpart primary fat32 1MiB 60MiB"#)?; + } + + writeln!(file, +r#" parted system.img -s mkpart primary ext4 60MiB 2160MiB parted system.img -s mkpart primary ext4 2160MiB 4260MiB parted system.img -s mkpart primary ext4 4260MiB 100% local device @@ -305,20 +364,25 @@ r#"function create_img() {{ init_part system.img2 ROOT-A "${{TMP_MOUNT_PATH}}" mkdir -p "${{BOOT_PATH}}" - chmod 755 "${{BOOT_PATH}}" - if [ "$BOOT_MODE" = "legacy" ]; then - init_part system.img1 GRUB2 "${{BOOT_PATH}}" - else - init_part system.img1 BOOT "${{BOOT_PATH}}" - fi + chmod 755 "${{BOOT_PATH}}""#)?; + + if legacy_bios { + writeln!(file, +r#" init_part system.img1 GRUB2 "${{BOOT_PATH}}" tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar - if [ "${{BOOT_MODE}}" = "legacy" ]; then - sed -i "s/insmod part_gpt/insmod part_msdos/g; \ + sed -i "s/insmod part_gpt/insmod part_msdos/g; \ s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ -"${{TMP_MOUNT_PATH}}"/boot/grub2/grub.cfg - fi - sync +"${{TMP_MOUNT_PATH}}"/boot/grub2/grub.cfg"#)?; + } + else { + writeln!(file, +r#" init_part system.img1 BOOT "${{BOOT_PATH}}" +tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar"#)?; + } + + writeln!(file, +r#" sync cp bootloader.sh "${{TMP_MOUNT_PATH}}" mount_proc_dev_sys "${{TMP_MOUNT_PATH}}" DEVICE="${{device}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{TMP_MOUNT_PATH}}" bash bootloader.sh @@ -486,17 +550,21 @@ create_admin_img"# /* endregion */ /* region: set_in_chroot.sh */ -pub(crate) fn gen_set_in_chroot(file: &mut File) -> Result<()> { +pub(crate) fn gen_set_in_chroot(file: &mut File, legacy_bios: bool) -> Result<()> { writeln!(file, r#"#!/bin/bash ln -s /usr/lib/systemd/system/os-agent.service /usr/lib/systemd/system/multi-user.target.wants/os-agent.service -ln -s /usr/lib/systemd/system/kubelet.service /usr/lib/systemd/system/multi-user.target.wants/kubelet.service -if [ "$BOOT_MODE" = "legacy" ]; then - ln -s /usr/lib/systemd/system/boot-grub2.mount /lib/systemd/system/local-fs.target.wants/boot-grub2.mount -else - ln -s /usr/lib/systemd/system/boot-efi.mount /lib/systemd/system/local-fs.target.wants/boot-efi.mount -fi -ln -s /usr/lib/systemd/system/etc.mount /lib/systemd/system/local-fs.target.wants/etc.mount +ln -s /usr/lib/systemd/system/kubelet.service /usr/lib/systemd/system/multi-user.target.wants/kubelet.service"#)?; + + if legacy_bios { + writeln!(file, "ln -s /usr/lib/systemd/system/boot-grub2.mount /lib/systemd/system/local-fs.target.wants/boot-grub2.mount")?; + } + else { + writeln!(file, "ln -s /usr/lib/systemd/system/boot-efi.mount /lib/systemd/system/local-fs.target.wants/boot-efi.mount")?; + } + + writeln!(file, +r#"ln -s /usr/lib/systemd/system/etc.mount /lib/systemd/system/local-fs.target.wants/etc.mount str=$(sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{{print $2}}') umask 0666 @@ -515,48 +583,40 @@ rm -rf /usr/lib/dracut/modules.d/00bootup /* endregion */ /* region: bootloader.sh */ -pub(crate) fn gen_bootloader(file: &mut File) -> Result<()> { +pub(crate) fn gen_bootloader(file: &mut File, arch: &str, legacy_bios: bool) -> Result<()> { writeln!(file, r#"#!/bin/bash set -eu set -o pipefail set -x -ARCH=$(arch) - -function install_grub2_x86 () {{ - if [ "${{BOOT_MODE}}" = "legacy" ]; then - # make boot.img/core.img and setup, to support legacy boot mode - GRUBNAME=$(which grub2-install) - echo "Installing GRUB2..." - FORCE_OPT=${{FORCE_OPT:-"--force"}} - TARGET_OPT=${{TARGET_OPT:-"--target=i386-pc"}} - - $GRUBNAME --modules="biosdisk part_msdos" "${{FORCE_OPT}}" "${{TARGET_OPT}}" "${{DEVICE}}" - else - # make efi file, and save in FAT16 partition, to support UEFI boot mode - cp -r /usr/lib/grub/x86_64-efi boot/efi/EFI/openEuler - eval "grub2-mkimage -d /usr/lib/grub/x86_64-efi -O x86_64-efi --output=/boot/efi/EFI/openEuler/grubx64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" - mkdir -p /boot/efi/EFI/BOOT/ - cp -f /boot/efi/EFI/openEuler/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI - fi -}} +function install_grub2 () {{"#)?; -function install_grub2_efi () {{ - cp -r /usr/lib/grub/arm64-efi /boot/efi/EFI/openEuler/ - eval "grub2-mkimage -d /usr/lib/grub/arm64-efi -O arm64-efi --output=/boot/efi/EFI/openEuler/grubaa64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" + if arch == "aarch64" || (arch == "x86_64" && !legacy_bios) { + writeln!(file, +r#" cp -r /usr/lib/grub/x86_64-efi boot/efi/EFI/openEuler + eval "grub2-mkimage -d /usr/lib/grub/x86_64-efi -O x86_64-efi --output=/boot/efi/EFI/openEuler/grubx64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" mkdir -p /boot/efi/EFI/BOOT/ - cp -f /boot/efi/EFI/openEuler/grubaa64.efi /boot/efi/EFI/BOOT/BOOTAA64.EFI -}} - -if [ "${{ARCH}}" == "x86_64" ]; then - install_grub2_x86 -fi + cp -f /boot/efi/EFI/openEuler/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI +}} +"# + )?; + } + else { + writeln!(file, +r#" GRUBNAME=$(which grub2-install) + echo "Installing GRUB2..." + FORCE_OPT=${{FORCE_OPT:-"--force"}} + TARGET_OPT=${{TARGET_OPT:-"--target=i386-pc"}} + + $GRUBNAME --modules="biosdisk part_msdos" "$FORCE_OPT" "$TARGET_OPT" "$DEVICE" +"# + )?; + } -if [ "${{ARCH}}" == "aarch64" ]; then - install_grub2_efi -fi + writeln!(file, +r#"install_grub2 "# )?; Ok(()) diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs index ec542226..8938da87 100644 --- a/KubeOS-Rust/kbimg/src/utils.rs +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -60,6 +60,19 @@ pub(crate) fn is_addr_valid(addr: &str) -> bool { true } +/// Get architecture +pub(crate) fn get_arch() -> String { + let output = std::process::Command::new("arch") + .output() + .expect("Failed to execute `arch` command"); + if output.status.success() { + String::from_utf8_lossy(&output.stdout).trim().to_string() + } + else { + std::process::exit(-1); + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/ztest/1.txt b/ztest/1.txt new file mode 100644 index 00000000..249699de --- /dev/null +++ b/ztest/1.txt @@ -0,0 +1 @@ +123ewfdv89weoich3weu7ki4 \ No newline at end of file diff --git a/ztest/2.txt b/ztest/2.txt new file mode 100644 index 00000000..6d69266a --- /dev/null +++ b/ztest/2.txt @@ -0,0 +1 @@ +0987ytfcgvbhuyxaaaaaaaaaaaaiwq83r724f \ No newline at end of file -- Gitee From d0f0880591efe9975239c1b722058a4b1de7eda2 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 14 Aug 2024 17:32:19 +0800 Subject: [PATCH 057/116] fix spell error --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 0eafbcc6..f97ed91f 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -420,7 +420,7 @@ test_lock trap clean_space EXIT trap clean_img ERR -create_vm_repo_image"# +create_vm_repo_img"# )?; Ok(()) } -- Gitee From 8a355d6c669c1a84bea4abf8c16876ea98e0b9a5 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 14 Aug 2024 17:44:05 +0800 Subject: [PATCH 058/116] modify indent --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index f97ed91f..11911c9b 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -378,7 +378,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ else { writeln!(file, r#" init_part system.img1 BOOT "${{BOOT_PATH}}" -tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar"#)?; + tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar"#)?; } writeln!(file, @@ -925,11 +925,11 @@ function CheckSpace() {{ }} function mount_proc_dev_sys() {{ - local tmp_root=$1 - mount -t proc none "${{tmp_root}}/proc" - mount --bind /dev "${{tmp_root}}/dev" - mount --bind /dev/pts "${{tmp_root}}/dev/pts" - mount -t sysfs none "${{tmp_root}}/sys" + local tmp_root=$1 + mount -t proc none "${{tmp_root}}/proc" + mount --bind /dev "${{tmp_root}}/dev" + mount --bind /dev/pts "${{tmp_root}}/dev/pts" + mount -t sysfs none "${{tmp_root}}/sys" }} function GetDisk() {{ -- Gitee From 097d17ab889c9e0ae9d163e55b95bf3b56d71ada Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 15 Aug 2024 16:49:32 +0800 Subject: [PATCH 059/116] grub; collect to directory; fix too many parameters; generate misc files; dirname --- KubeOS-Rust/kbimg/kbimg.toml | 19 +- KubeOS-Rust/kbimg/src/admin_container.rs | 19 +- KubeOS-Rust/kbimg/src/commands.rs | 30 ++- KubeOS-Rust/kbimg/src/docker_img.rs | 35 +-- KubeOS-Rust/kbimg/src/main.rs | 27 ++- KubeOS-Rust/kbimg/src/repo.rs | 106 +++++---- KubeOS-Rust/kbimg/src/scripts_gen.rs | 275 ++++++++++++++++++----- KubeOS-Rust/kbimg/src/utils.rs | 27 ++- KubeOS-Rust/kbimg/src/values.rs | 71 ++++-- 9 files changed, 421 insertions(+), 188 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index e04941f8..49fcbd1a 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -1,11 +1,10 @@ [from_repo] agent_path = "/root/KubeOS/bin/os-agent" -image_type = "pxe-repo" +image_type = "vm-repo" legacy_bios = true repo_path = "/etc/yum.repos.d/openEuler.repo" root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" version = "v1" -docker_img = "" [from_dockerimg] docker_img = "" @@ -26,16 +25,16 @@ docker_img = "" # name = "bar" # passwd = "bar" -[[copy_files]] -dst = "/ztest" -src = "/root/KubeOS/ztest/1.txt" +# [[copy_files]] +# dst = "/ztest" +# src = "/root/KubeOS/ztest/1.txt" -[[copy_files]] -dst = "/ztest" -src = "../../ztest/2.txt" +# [[copy_files]] +# dst = "/ztest" +# src = "../../../ztest/2.txt" -# [grub] -# passwd = "foo" +[grub] +passwd = "foo" # [systemd_service] # name = ["containerd", "kubelet"] diff --git a/KubeOS-Rust/kbimg/src/admin_container.rs b/KubeOS-Rust/kbimg/src/admin_container.rs index d107dde2..941c25f9 100644 --- a/KubeOS-Rust/kbimg/src/admin_container.rs +++ b/KubeOS-Rust/kbimg/src/admin_container.rs @@ -2,31 +2,32 @@ use std::path::PathBuf; use std::fs::{File, create_dir_all}; use anyhow::bail; -use crate::scripts_gen::{gen_admin_dockerfile, gen_admin_vars, gen_create_admin_img, gen_set_ssh_pub_key, gen_set_ssh_pub_key_service}; +use crate::scripts_gen::*; use crate::utils; -use crate::values::{ADMIN_CONTAINER_DIR, ADMIN_DOCKERFILE_NAME, KBIMG_NAME, SET_SSH_PUB_KEY_NAME, SET_SSH_PUB_KEY_SERVICE_NAME}; +use crate::values::*; use crate::{commands::AdminContainerInfo, Config, CreateImage}; impl CreateImage for AdminContainerInfo { - fn prepare(&self) -> anyhow::Result<()> { + fn prepare(&self, _: &mut Config) -> anyhow::Result<()> { let dockerfile = &self.dockerfile; let image_name = &self.docker_img; verify_admin_input(&dockerfile, &image_name)?; check_dockerfile_valid(&dockerfile)?; Ok(()) } - fn generate_scripts(&self, config: Config) -> anyhow::Result { + + fn generate_scripts(&self, _: &Config) -> anyhow::Result { // admin-container match create_dir_all(ADMIN_CONTAINER_DIR) { Ok(_) => { // Dockerfile - let mut dockerfile = File::create(ADMIN_DOCKERFILE_NAME)?; + let mut dockerfile = File::create(&format!("{}/{}", ADMIN_CONTAINER_DIR, ADMIN_DOCKERFILE))?; gen_admin_dockerfile(&mut dockerfile)?; // set-ssh-pub-key.service - let mut set_ssh_pub_key_service = File::create(SET_SSH_PUB_KEY_SERVICE_NAME)?; + let mut set_ssh_pub_key_service = File::create(&format!("{}/{}", ADMIN_CONTAINER_DIR, ADMIN_SET_SSH_PUB_KEY_SERVICE))?; gen_set_ssh_pub_key_service(&mut set_ssh_pub_key_service)?; // set-ssh-pub-key.sh - let mut set_ssh_pub_key = File::create(SET_SSH_PUB_KEY_NAME)?; + let mut set_ssh_pub_key = File::create(&format!("{}/{}", ADMIN_CONTAINER_DIR, ADMIN_SET_SSH_PUB_KEY_SH))?; gen_set_ssh_pub_key(&mut set_ssh_pub_key)?; }, Err(e) => { @@ -34,10 +35,10 @@ impl CreateImage for AdminContainerInfo { } } // kbimg.sh - let mut kbimg = File::create(KBIMG_NAME)?; + let mut kbimg = File::create(&format!("{}/{}", SCRIPTS_DIR, KBIMG_SH))?; gen_admin_vars(&mut kbimg, &self.docker_img, &self.dockerfile)?; gen_create_admin_img(&mut kbimg)?; - Ok(PathBuf::from(KBIMG_NAME)) + Ok(PathBuf::from(&format!("{}/{}", SCRIPTS_DIR, KBIMG_SH))) } } diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index 84297d17..cb955ad1 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -56,12 +56,14 @@ pub struct RepoInfo { pub root_passwd: String, /// Required for upgrade-image #[clap(short = 'd', long, value_parser)] - pub docker_img: String, + pub docker_img: Option, /// Optional: boot mode, default is uefi, enable this flag for legacy bios #[clap(short, long, value_parser)] pub legacy_bios: bool, #[clap(skip)] pub image_type: String, + #[clap(skip)] + pub arch: Option, } #[derive(Args, Debug, Deserialize, Clone)] @@ -83,11 +85,37 @@ pub struct AdminContainerInfo { pub dockerfile: PathBuf, } +// pxe config +#[derive(Debug, Deserialize, Clone)] +pub(crate) struct BootupConfig { + pub rootfs_name: String, + pub disk: String, + pub server_ip: String, + pub local_ip: String, + pub route_ip: String, + pub netmask: String, + pub net_name: String, +} +impl BootupConfig { + pub fn new() -> Self { + BootupConfig { + rootfs_name: String::from("kubeos.tar"), + disk: String::from("/dev/sda"), + server_ip: String::from("192.168.1.50"), + local_ip: String::from("192.168.1.100"), + route_ip: String::from("192.168.1.1"), + netmask: String::from("255.255.255.0"), + net_name: String::from("eth0"), + } + } +} + #[derive(Debug, Deserialize, Default, Clone)] pub struct Config { pub from_repo: Option, pub from_dockerimg: Option, pub admin_container: Option, + pub bootup_config: Option, pub users: Option>, pub copy_files: Option>, pub grub: Option, diff --git a/KubeOS-Rust/kbimg/src/docker_img.rs b/KubeOS-Rust/kbimg/src/docker_img.rs index 95c015bb..70ec978f 100644 --- a/KubeOS-Rust/kbimg/src/docker_img.rs +++ b/KubeOS-Rust/kbimg/src/docker_img.rs @@ -4,24 +4,27 @@ use std::fs::File; use std::str; use anyhow::bail; -use crate::utils; -use crate::scripts_gen::{gen_create_img, gen_create_os_tar_from_docker, gen_create_pxe_docker_img, gen_create_vm_docker_img, gen_docker_vars, gen_global_func, gen_global_vars, gen_init_part}; -use crate::values::{LOCAL_IP, NETMASK, ROUTE_IP, SERVER_IP, KBIMG_NAME}; +use crate::commands::BootupConfig; +use crate::scripts_gen::*; +use crate::utils::{self, check_pxe_conf_valid}; +use crate::values::*; use crate::{commands::DockerInfo, Config, CreateImage}; impl CreateImage for DockerInfo { - fn prepare(&self) -> anyhow::Result<()> { + fn prepare(&self, config: &mut Config) -> anyhow::Result<()> { let image_name = &self.docker_img; verify_docker_input(&image_name)?; check_docker_image(&image_name)?; + config.bootup_config = Some(BootupConfig::new()); if self.image_type == "pxe-repo" { - check_bootup_conf_valid()?; + check_pxe_conf_valid(config.bootup_config.as_ref().unwrap())?; } Ok(()) } - fn generate_scripts(&self, config: Config) -> anyhow::Result { + + fn generate_scripts(&self, _: &Config) -> anyhow::Result { // kbimg.sh - let mut kbimg = File::create(KBIMG_NAME)?; + let mut kbimg = File::create(&format!("{}/{}", SCRIPTS_DIR, KBIMG_SH))?; gen_global_vars(&mut kbimg)?; gen_docker_vars(&mut kbimg, &self.docker_img)?; gen_global_func(&mut kbimg)?; @@ -36,7 +39,7 @@ impl CreateImage for DockerInfo { // kbimg.sh gen_create_pxe_docker_img(&mut kbimg)?; } - Ok(PathBuf::from(KBIMG_NAME)) + Ok(PathBuf::from(&format!("{}/{}", SCRIPTS_DIR, KBIMG_SH))) } } @@ -61,19 +64,3 @@ fn check_docker_image(image_name: &str) -> anyhow::Result<()> { } Ok(()) } - -fn check_bootup_conf_valid() -> anyhow::Result<()> { - if !utils::is_addr_valid(SERVER_IP) { - bail!("address {} is invalid, please check input", SERVER_IP); - } - if !utils::is_addr_valid(LOCAL_IP) { - bail!("address {} is invalid, please check input", LOCAL_IP); - } - if !utils::is_addr_valid(ROUTE_IP) { - bail!("address {} is invalid, please check input", ROUTE_IP); - } - if !utils::is_addr_valid(NETMASK) { - bail!("address {} is invalid, please check input", NETMASK); - } - Ok(()) -} \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/main.rs b/KubeOS-Rust/kbimg/src/main.rs index e7cbad49..bd93e47b 100644 --- a/KubeOS-Rust/kbimg/src/main.rs +++ b/KubeOS-Rust/kbimg/src/main.rs @@ -12,7 +12,7 @@ use std::{fs, path::PathBuf, process::exit}; -use anyhow::Result; +use anyhow::{bail, Result}; use clap::Parser; use env_logger::{Builder, Env, Target}; use log::{debug, error, info}; @@ -25,22 +25,28 @@ mod utils; mod values; mod scripts_gen; -use utils::execute_scripts; +use utils::{execute_scripts, get_arch}; +use values::SCRIPTS_DIR; use crate::commands::{Cli, Commands, Config}; trait CreateImage { /// validate cmd args, check disk size and other prepare work - fn prepare(&self) -> Result<()>; + fn prepare(&self, config: &mut Config) -> Result<()>; /// generate scripts for creating image. If debug is enabled, keep the scripts, otherwise execute them - fn generate_scripts(&self, config: Config) -> Result; + fn generate_scripts(&self, config: &Config) -> Result; } -fn process(info: Box, config: Config) -> Result<()> { - info.prepare()?; - let path = info.generate_scripts(config)?; - // execute_scripts(path)?; - Ok(()) +fn process(info: Box, mut config: Config) -> Result<()> { + match fs::create_dir_all(SCRIPTS_DIR) { + Ok(_) => { + info.prepare(&mut config)?; + let path = info.generate_scripts(&config)?; + // execute_scripts(path)?; + Ok(()) + }, + Err(e) => bail!(e) + } } fn main() { @@ -56,7 +62,8 @@ fn main() { let content = fs::read_to_string(config).unwrap(); let data: Config = toml::from_str(&content).unwrap(); debug!("Config: {:?}", data); - let info = if let Some(info) = data.from_repo.clone() { + let info = if let Some(mut info) = data.from_repo.clone() { + info.arch = Some(get_arch()); Some(Box::new(info) as Box) } else if let Some(info) = data.from_dockerimg.clone() { Some(Box::new(info) as Box) diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index 5c93bd5e..6dce34a4 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -4,61 +4,83 @@ use std::fs::{File, create_dir_all}; use anyhow::bail; use sysinfo::Disks; -use crate::utils::{self, get_arch}; -use crate::values::{BOOTLOADER_NAME, BOOTUP_DIR, DISK, DOCKERFILE_NAME, GLOBAL_CFG_NAME, GRUB_CFG_NAME, KBIMG_NAME, LOCAL_IP, MODULE_SETUP_NAME, MOUNT_NAME, NETMASK, NET_NAME, ROOTFS_NAME, ROUTE_IP, RPMLIST_NAME, SERVER_IP, SET_IN_CHROOT_NAME}; -use crate::scripts_gen::{gen_bootloader, gen_create_docker_img, gen_create_img, gen_create_os_tar_from_repo, gen_create_pxe_repo_img, gen_create_vm_repo_img, gen_dockerfile, gen_global_cfg, gen_global_func, gen_global_vars, gen_grub_cfg, gen_init_part, gen_module_setup, gen_mount, gen_mount_proc_dev_sys, gen_repo_vars, gen_rpm_list, gen_set_in_chroot, gen_unmount_dir}; +use crate::commands::BootupConfig; +use crate::utils::{self, check_pxe_conf_valid}; +use crate::values::*; +use crate::scripts_gen::*; use crate::{commands::RepoInfo, Config, CreateImage}; impl CreateImage for RepoInfo { - fn prepare(&self) -> anyhow::Result<()> { - verify_repo_input(&self.repo_path, &self.version, &self.agent_path, &self.docker_img)?; + fn prepare(&self, config: &mut Config) -> anyhow::Result<()> { + verify_repo_input(&self)?; check_disk_space(&self.image_type)?; check_repo_file_valid(&self.repo_path)?; check_agent_file_valid(&self.agent_path)?; + config.bootup_config = Some(BootupConfig::new()); if self.image_type == "pxe-repo" { - check_bootup_conf_valid()?; + check_pxe_conf_valid(&config.bootup_config.as_ref().unwrap())?; } Ok(()) } - fn generate_scripts(&self, config: Config) -> anyhow::Result { - let arch = get_arch(); - + fn generate_scripts(&self, config: &Config) -> anyhow::Result { // rpmlist - let mut rpmlist = File::create(RPMLIST_NAME)?; + let mut rpmlist = File::create(&format!("{}/{}", SCRIPTS_DIR, RPMLIST))?; gen_rpm_list(&mut rpmlist)?; // 00bootup match create_dir_all(BOOTUP_DIR) { Ok(_) => { - let mut global_cfg = File::create(GLOBAL_CFG_NAME)?; - gen_global_cfg(&mut global_cfg, ROOTFS_NAME, DISK, SERVER_IP, LOCAL_IP, ROUTE_IP, NETMASK, NET_NAME)?; - let mut module_setup = File::create(MODULE_SETUP_NAME)?; + let mut global_cfg = File::create(&format!("{}/{}", BOOTUP_DIR, BOOTUP_GLOBAL_CFG))?; + gen_global_cfg(&mut global_cfg, &config.bootup_config.as_ref().unwrap())?; + let mut module_setup = File::create(&format!("{}/{}", BOOTUP_DIR, BOOTUP_MODULE_SETUP_SH))?; gen_module_setup(&mut module_setup)?; - let mut mount = File::create(MOUNT_NAME)?; + let mut mount = File::create(&format!("{}/{}", BOOTUP_DIR, BOOTUP_MOUNT_SH))?; gen_mount(&mut mount)?; } Err(e) => { bail!(e); } } + // misc-files + match create_dir_all(MISC_FILES_DIR) { + Ok(_) => { + let mut boot_efi_mount = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_BOOT_EFI_MOUNT))?; + gen_boot_efi_mount(&mut boot_efi_mount)?; + let mut boot_grub2_mount = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_BOOT_GRUB2_MOUNT))?; + gen_boot_grub2_mount(&mut boot_grub2_mount)?; + let mut etc_mount = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_ETC_MOUNT))?; + gen_etc_mount(&mut etc_mount)?; + let mut os_agent_service = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_OS_AGENT_SERVICE))?; + gen_os_agent_service(&mut os_agent_service)?; + let mut os_release = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_OS_RELEASE))?; + gen_os_release(&mut os_release)?; + let mut persist_mount = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_PERSIST_MOUNT))?; + gen_persist_mount(&mut persist_mount)?; + let mut var_mount = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_VAR_MOUNT))?; + gen_var_mount(&mut var_mount)?; + } + Err(e) => { + bail!(e); + } + } // grub.cfg - let mut grub_cfg = File::create(GRUB_CFG_NAME)?; + let mut grub_cfg = File::create(&format!("{}/{}", SCRIPTS_DIR, GRUB_CFG))?; gen_grub_cfg(&mut grub_cfg)?; // set_in_chroot.sh - let mut set_in_chroot = File::create(SET_IN_CHROOT_NAME)?; + let mut set_in_chroot = File::create(&format!("{}/{}", SCRIPTS_DIR, SET_IN_CHROOT_SH))?; gen_set_in_chroot(&mut set_in_chroot, self.legacy_bios)?; // kbimg.sh - let mut kbimg = File::create(KBIMG_NAME)?; + let mut kbimg = File::create(&format!("{}/{}", SCRIPTS_DIR, KBIMG_SH))?; gen_global_vars(&mut kbimg)?; - gen_repo_vars(&mut kbimg, &self.repo_path, &self.version, &self.agent_path, &self.root_passwd, self.legacy_bios, None)?; + gen_repo_vars(&mut kbimg, &self)?; gen_global_func(&mut kbimg)?; gen_mount_proc_dev_sys(&mut kbimg)?; gen_unmount_dir(&mut kbimg)?; - gen_create_os_tar_from_repo(&mut kbimg, &arch, self.legacy_bios, &config.copy_files)?; + gen_create_os_tar_from_repo(&mut kbimg, &self, &config)?; if self.image_type == "vm-repo" { // bootloader.sh - let mut bootloader = File::create(BOOTLOADER_NAME)?; - gen_bootloader(&mut bootloader, &arch, self.legacy_bios)?; + let mut bootloader = File::create(&format!("{}/{}", SCRIPTS_DIR, BOOTLOADER_SH))?; + gen_bootloader(&mut bootloader, self.arch.as_ref().unwrap(), self.legacy_bios)?; // kbimg.sh gen_init_part(&mut kbimg)?; gen_create_img(&mut kbimg, self.legacy_bios)?; @@ -70,29 +92,31 @@ impl CreateImage for RepoInfo { } else { // Dockerfile - let mut dockerfile = File::create(DOCKERFILE_NAME)?; + let mut dockerfile = File::create(&format!("{}/{}", SCRIPTS_DIR, DOCKERFILE))?; gen_dockerfile(&mut dockerfile)?; // kbimg.sh gen_create_docker_img(&mut kbimg)?; } - Ok(PathBuf::from(KBIMG_NAME)) + Ok(PathBuf::from(&format!("{}/{}", SCRIPTS_DIR, KBIMG_SH))) } } -fn verify_repo_input(repo_path: &PathBuf, version: &str, agent_path: &PathBuf, docker_img: &str) -> anyhow::Result<()> { - if !utils::is_valid_param(repo_path.to_str().unwrap()) { - bail!("params {} is invalid, please check input", repo_path.to_str().unwrap()); +fn verify_repo_input(info: &RepoInfo) -> anyhow::Result<()> { + if !utils::is_valid_param(info.repo_path.to_str().unwrap()) { + bail!("params {} is invalid, please check input", info.repo_path.to_str().unwrap()); + } + if !utils::is_valid_param(&info.version) { + bail!("params {} is invalid, please check input", info.version); } - if !utils::is_valid_param(version) { - bail!("params {} is invalid, please check input", version); + if !utils::is_valid_param(info.agent_path.to_str().unwrap()) { + bail!("params {} is invalid, please check input", info.agent_path.to_str().unwrap()); } - if !utils::is_valid_param(agent_path.to_str().unwrap()) { - bail!("params {} is invalid, please check input", agent_path.to_str().unwrap()); + if let Some(docker_img) = &info.docker_img { + if !utils::is_valid_param(docker_img) { + bail!("params {} is invalid, please check input", docker_img); + } } - if !utils::is_valid_param(docker_img) { - bail!("params {} is invalid, please check input", docker_img); - } Ok(()) } @@ -124,19 +148,3 @@ fn check_repo_file_valid(repo_path: &PathBuf) -> anyhow::Result<()> { fn check_agent_file_valid(agent_path: &PathBuf) -> anyhow::Result<()> { utils::is_file_valid("os-agent binary", agent_path) } - -fn check_bootup_conf_valid() -> anyhow::Result<()> { - if !utils::is_addr_valid(SERVER_IP) { - bail!("address {} is invalid, please check input", SERVER_IP); - } - if !utils::is_addr_valid(LOCAL_IP) { - bail!("address {} is invalid, please check input", LOCAL_IP); - } - if !utils::is_addr_valid(ROUTE_IP) { - bail!("address {} is invalid, please check input", ROUTE_IP); - } - if !utils::is_addr_valid(NETMASK) { - bail!("address {} is invalid, please check input", NETMASK); - } - Ok(()) -} diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 11911c9b..2dc66864 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -3,7 +3,7 @@ use std::io::Write; use std::path::PathBuf; use anyhow::Result; -use crate::commands::CopyFile; +use crate::commands::{Config, CopyFile, Grub, RepoInfo, BootupConfig}; /* region: kbimg.sh */ pub(crate) fn gen_global_vars(file: &mut File) -> Result<()> { @@ -167,7 +167,7 @@ r#"function init_part() {{ } // repo -pub(crate) fn gen_repo_vars(file: &mut File, repo_path: &PathBuf, version: &str, agent_path: &PathBuf, root_passwd: &str, legacy_bios: bool, docker_img: Option<&str>) -> Result<()> { +pub(crate) fn gen_repo_vars(file: &mut File, info: &RepoInfo) -> Result<()> { writeln!(file, r#"REPO_PATH="{}" VERSION="{}" @@ -175,14 +175,14 @@ AGENT_PATH="{}" ROOT_PASSWD='{}' BOOT_MODE="{}" "#, - repo_path.to_str().unwrap(), - version, - agent_path.to_str().unwrap(), - root_passwd, - if legacy_bios { "legacy" } else { "efi" } + info.repo_path.to_str().unwrap(), + &info.version, + info.agent_path.to_str().unwrap(), + &info.root_passwd, + if info.legacy_bios { "legacy" } else { "efi" } )?; - if let Some(obj) = docker_img { - writeln!(file, "DOCKER_IMG=\"{}\"\n", obj)?; + if let Some(docker_img) = &info.docker_img { + writeln!(file, "DOCKER_IMG=\"{}\"\n", docker_img)?; } Ok(()) } @@ -251,12 +251,51 @@ r#" yum -y --installroot="${{RPM_ROOT}}" clean all Ok(()) } -pub(crate) fn gen_install_misc(file: &mut File, legacy_bios: bool) -> Result<()> { +pub(crate) fn gen_copy_files(file: &mut File, copy_files: &Vec) -> Result<()> { + writeln!(file, r#"function copy_files() {{"#)?; + for copy_file in copy_files { + writeln!(file, "\tcp \"{}\" \"${{RPM_ROOT}}{}\"", copy_file.src, copy_file.dst)?; + } + writeln!(file, "}}\n")?; + Ok(()) +} + +pub(crate) fn gen_grub_config(file: &mut File, legacy_bios: bool, grub: &Grub) -> Result<()> { + writeln!(file, +r#"function grub_config {{ + local GRUB_PATH"# + )?; + if legacy_bios { + writeln!(file, "\tGRUB_PATH=\"${{RPM_ROOT}}\"/boot/grub2")?; + } + else { + writeln!(file, "\tGRUB_PATH=\"${{RPM_ROOT}}\"/efi/EFI/openEuler")?; + } + if let Some(grub_passwd) = &grub.passwd { + writeln!(file, +r#" local GRUB_PASSWD + GRUB_PASSWD=$(echo -e "${}\n${}" | grub2-mkpasswd-pbkdf2 | grep PBKDF2 | awk '{{print $7}}') + echo "GRUB2_PASSWD=${{GRUB_PASSWD}}" > "${{GRUB_PATH}}/user.cfg" + chmod 600 "${{GRUB_PATH}}/user.cfg" +"#, + grub_passwd, grub_passwd)?; + } + Ok(()) +} + +pub(crate) fn gen_install_misc(file: &mut File, legacy_bios: bool, config: &Config) -> Result<()> { + if let Some(copy_files) = &config.copy_files { + gen_copy_files(file, ©_files)?; + } + if let Some(grub) = &config.grub { + gen_grub_config(file, legacy_bios, &grub)?; + } + writeln!(file, r#"function install_misc() {{ local DNS_CONF="${{PWD}}/resolv.conf" - cp ../../files/*mount ../../files/os-agent.service "${{RPM_ROOT}}/usr/lib/systemd/system/" - cp ../../files/os-release "${{RPM_ROOT}}/usr/lib/" + cp ./misc-files/*mount ./misc-files/os-agent.service "${{RPM_ROOT}}/usr/lib/systemd/system/" + cp ./misc-files/os-release "${{RPM_ROOT}}/usr/lib/" cp "${{AGENT_PATH}}" "${{RPM_ROOT}}/usr/bin" rm "${{RPM_ROOT}}/etc/os-release" @@ -285,7 +324,18 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ writeln!(file, r#" cp -r ./00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ cp set_in_chroot.sh "${{RPM_ROOT}}" - ROOT_PASSWD="${{ROOT_PASSWD}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{RPM_ROOT}}" bash /set_in_chroot.sh + + (optional) custom cofig"#)?; + + if let Some(_) = &config.copy_files { + writeln!(file, "\tcopy_files\n")?; + } + if let Some(_) = &config.grub { + writeln!(file, "\tgrub_passwd\n")?; + } + + writeln!(file, +r#" ROOT_PASSWD="${{ROOT_PASSWD}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{RPM_ROOT}}" bash /set_in_chroot.sh rm "${{RPM_ROOT}}/set_in_chroot.sh" if [ -e "${{DNS_CONF}}" ]; then cp "${{DNS_CONF}}" "${{RPM_ROOT}}/etc/resolv.conf" @@ -296,36 +346,16 @@ r#" cp -r ./00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ Ok(()) } -pub(crate) fn gen_copy_files(file: &mut File, copy_files: &Vec) -> Result<()> { - writeln!(file, r#"function copy_files() {{"#)?; - for copy_file in copy_files { - writeln!(file, "\tcp \"{}\" \"${{RPM_ROOT}}{}\"", copy_file.src, copy_file.dst)?; - } - writeln!(file, "}}\n")?; - Ok(()) -} - -pub(crate) fn gen_create_os_tar_from_repo(file: &mut File, arch: &str, legacy_bios: bool, copy_files: &Option>) -> Result<()> { +pub(crate) fn gen_create_os_tar_from_repo(file: &mut File, info: &RepoInfo, config: &Config) -> Result<()> { gen_prepare_yum(file)?; - gen_install_packages(file, arch, legacy_bios)?; - gen_install_misc(file, legacy_bios)?; - if let Some(copy_files) = copy_files { - gen_copy_files(file, copy_files)?; - } - + gen_install_packages(file, info.arch.as_ref().unwrap(), info.legacy_bios)?; + gen_install_misc(file, info.legacy_bios, config)?; + writeln!(file, r#"function create_os_tar_from_repo() {{ install_packages install_misc - - # (optional) custom config"#)?; - - if let Some(_) = copy_files { - writeln!(file, "\tcopy_files\n")?; - } - - writeln!(file, -r#" unmount_dir "${{RPM_ROOT}}" + unmount_dir "${{RPM_ROOT}}" tar -C "${{RPM_ROOT}}" -cf ./os.tar . }} "#)?; @@ -534,7 +564,9 @@ ADMIN_CONTAINER_DIR=./admin-container pub(crate) fn gen_create_admin_img(file: &mut File) -> Result<()> { writeln!(file, r#"function create_admin_img() {{ - cp ../../bin/hostshell "${{ADMIN_CONTAINER_DIR}}" + local scripts_dir=$(cd "$(dirname "$0")" && pwd) + local kubeos_root_dir=$(dirname $(dirname "${{scripts_dir}}")) + cp "${{kubeos_root_dir}}"/bin/hostshell "${{ADMIN_CONTAINER_DIR}}" docker build -t "${{DOCKER_IMG}}" -f "${{DOCKERFILE}}" "${{ADMIN_CONTAINER_DIR}}" rm -rf "${{ADMIN_CONTAINER_DIR}}"/hostshell }} @@ -658,16 +690,7 @@ sudo /* region: grub.cfg */ pub(crate) fn gen_grub_cfg(file: &mut File) -> Result<()> { writeln!(file, -r#"## Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. - # KubeOS is licensed under the Mulan PSL v2. - # You can use this software according to the terms and conditions of the Mulan PSL v2. - # You may obtain a copy of Mulan PSL v2 at: - # http://license.coscl.org.cn/MulanPSL2 - # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - # PURPOSE. -## See the Mulan PSL v2 for more details. -set pager=1 +r#"set pager=1 if [ -f ${{config_directory}}/grubenv ]; then load_env -f ${{config_directory}}/grubenv @@ -838,7 +861,7 @@ fi /* endregion */ /* region: 00bootup */ -pub(crate) fn gen_global_cfg(file: &mut File, rootfs_name: &str, disk: &str, server_ip: &str, local_ip: &str, route_ip: &str, netmask: &str, net_name: &str) -> Result<()> { +pub(crate) fn gen_global_cfg(file: &mut File, pxe_config: &BootupConfig) -> Result<()> { writeln!(file, r#"# rootfs file name rootfs_name={} @@ -857,13 +880,13 @@ netmask={} # target machine netDevice name net_name={} "#, - rootfs_name, - disk, - server_ip, - local_ip, - route_ip, - netmask, - net_name + pxe_config.rootfs_name, + pxe_config.disk, + pxe_config.server_ip, + pxe_config.local_ip, + pxe_config.route_ip, + pxe_config.netmask, + pxe_config.net_name )?; Ok(()) } @@ -1347,4 +1370,142 @@ echo "$ssh_pub" >> "$authorized_file" )?; Ok(()) } +/* endregion */ + +/* region: misc-files */ +pub(crate) fn gen_boot_efi_mount(file: &mut File) -> Result<()> { + writeln!(file, +r#"[Unit] +Description=grub2 Dir +DefaultDependencies=no +Conflicts=umount.target +Before=local-fs.target umount.target + +[Mount] +What=/dev/disk/by-label/BOOT +Where=/boot/efi +Type=vfat +Options=defaults + +[Install] +WantedBy=local-fs.target +"# + )?; + Ok(()) +} + +pub(crate) fn gen_boot_grub2_mount(file: &mut File) -> Result<()> { + writeln!(file, +r#"[Unit] +Description=grub2 Dir +DefaultDependencies=no +Conflicts=umount.target +Before=local-fs.target umount.target + +[Mount] +What=/dev/disk/by-label/GRUB2 +Where=/boot/grub2 +Type=ext4 +Options=defaults + +[Install] +WantedBy=local-fs.target +"# + )?; + Ok(()) +} + +pub(crate) fn gen_etc_mount(file: &mut File) -> Result<()> { + writeln!(file, +r#"[Unit] +Description=etc Dir +DefaultDependencies=no +Conflicts=umount.target +Before=local-fs.target umount.target +Wants=persist.mount +After=persist.mount + +[Mount] +What=overlay +Where=/etc +Type=overlay +Options=upperdir=/persist/etc,lowerdir=/etc,workdir=/persist/etcwork + +[Install] +WantedBy=local-fs.target +"# + )?; + Ok(()) +} + +pub(crate) fn gen_os_agent_service(file: &mut File) -> Result<()> { + writeln!(file, +r#"[Unit] +Description=Agent For KubeOS + +[Service] +Environment=GOTRACEBACK=crash +ExecStart=/usr/bin/os-agent +KillMode=process +Restart=on-failure + +[Install] +WantedBy=multi-user.target +"# + )?; + Ok(()) +} + +pub(crate) fn gen_os_release(file: &mut File) -> Result<()> { + writeln!(file, +r#"NAME=KubeOS +ID=KubeOS +"# + )?; + Ok(()) +} + +pub(crate) fn gen_persist_mount(file: &mut File) -> Result<()> { + writeln!(file, +r#"[Unit] +Description=PERSIST Dir (/persist) +DefaultDependencies=no +Conflicts=umount.target +Before=local-fs.target umount.target + +[Mount] +What=/dev/disk/by-label/PERSIST +Where=/persist +Type=ext4 +Options=defaults + +[Install] +WantedBy=local-fs.target +"# + )?; + Ok(()) +} + +pub(crate) fn gen_var_mount(file: &mut File) -> Result<()> { + writeln!(file, +r#"[Unit] +Description=var Dir +DefaultDependencies=no +Conflicts=umount.target +Before=local-fs.target umount.target +Wants=persist.mount +After=persist.mount + +[Mount] +What=/persist/var +Where=/var +Type=node +Options=bind + +[Install] +WantedBy=local-fs.target +"# + )?; + Ok(()) +} /* endregion */ \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs index 8938da87..68091ca4 100644 --- a/KubeOS-Rust/kbimg/src/utils.rs +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -3,6 +3,8 @@ use std::{fs::File, io::Write, path::PathBuf, process::Command}; use anyhow::bail; use log::debug; +use crate::commands::BootupConfig; + pub(crate) fn execute_scripts(script: PathBuf) -> anyhow::Result<()> { if !script.exists() { bail!("Script does not exist: {:?}", script); @@ -60,17 +62,30 @@ pub(crate) fn is_addr_valid(addr: &str) -> bool { true } +/// Check pxe config +pub(crate) fn check_pxe_conf_valid(pxe_config: &BootupConfig) -> anyhow::Result<()> { + if !is_addr_valid(&pxe_config.server_ip) { + bail!("address {} is invalid, please check input", &pxe_config.server_ip); + } + if !is_addr_valid(&pxe_config.local_ip) { + bail!("address {} is invalid, please check input", &pxe_config.local_ip); + } + if !is_addr_valid(&pxe_config.route_ip) { + bail!("address {} is invalid, please check input", &pxe_config.route_ip); + } + if !is_addr_valid(&pxe_config.netmask) { + bail!("address {} is invalid, please check input", &pxe_config.netmask); + } + Ok(()) +} + /// Get architecture pub(crate) fn get_arch() -> String { let output = std::process::Command::new("arch") .output() .expect("Failed to execute `arch` command"); - if output.status.success() { - String::from_utf8_lossy(&output.stdout).trim().to_string() - } - else { - std::process::exit(-1); - } + + String::from_utf8_lossy(&output.stdout).trim().to_string() } #[cfg(test)] diff --git a/KubeOS-Rust/kbimg/src/values.rs b/KubeOS-Rust/kbimg/src/values.rs index 8f79f79c..b735e8f0 100644 --- a/KubeOS-Rust/kbimg/src/values.rs +++ b/KubeOS-Rust/kbimg/src/values.rs @@ -1,23 +1,50 @@ -pub(crate) const KBIMG_NAME: &str = "kbimg.sh"; -pub(crate) const BOOTLOADER_NAME: &str = "bootloader.sh"; -pub(crate) const SET_IN_CHROOT_NAME: &str = "set_in_chroot.sh"; -pub(crate) const GRUB_CFG_NAME: &str = "grub.cfg"; -pub(crate) const RPMLIST_NAME: &str = "rpmlist"; -pub(crate) const DOCKERFILE_NAME: &str = "Dockerfile"; -pub(crate) const BOOTUP_DIR: &str = "./00bootup"; -pub(crate) const GLOBAL_CFG_NAME: &str = "./00bootup/Global.cfg"; -pub(crate) const MODULE_SETUP_NAME: &str = "./00bootup/module-setup.sh"; -pub(crate) const MOUNT_NAME: &str = "./00bootup/mount.sh"; -pub(crate) const ADMIN_CONTAINER_DIR: &str = "./admin-container"; -pub(crate) const ADMIN_DOCKERFILE_NAME: &str = "./admin-container/Dockerfile"; -pub(crate) const SET_SSH_PUB_KEY_SERVICE_NAME: &str = "./admin-container/set-ssh-pub-key.service"; -pub(crate) const SET_SSH_PUB_KEY_NAME: &str = "./admin-container/set-ssh-pub-key.sh"; +// scripts-auto/ +// ├── kbimg.sh +// ├── bootloader.sh +// ├── set_in_chroot.sh +// ├── grub.cfg +// ├── rpmlist +// ├── Dockerfile +// ├── 00bootup/ +// │ ├── Global.cfg +// │ ├── module-setup.sh +// │ └── mount.sh +// ├── admin-container/ +// │ ├── Dockerfile +// │ ├── set-ssg-pub-key.service +// │ └── set-ssh-pub-key.sh +// └── misc-files/ +// ├── boot-efi.mount +// ├── boot-grub2.mount +// ├── etc.mount +// ├── os-agent.service +// ├── os-release +// ├── persist.mount +// └── var.mount -// 00bootup config -pub(crate) const ROOTFS_NAME: &str = "kubeos.tar"; -pub(crate) const DISK: &str = "/dev/sda"; -pub(crate) const SERVER_IP: &str = "192.168.1.50"; -pub(crate) const LOCAL_IP: &str = "192.168.1.100"; -pub(crate) const ROUTE_IP: &str = "192.168.1.1"; -pub(crate) const NETMASK: &str = "255.255.255.0"; -pub(crate) const NET_NAME: &str = "eth0"; +pub(crate) const SCRIPTS_DIR: &str = "./scripts-auto"; +pub(crate) const KBIMG_SH: &str = "kbimg.sh"; +pub(crate) const BOOTLOADER_SH: &str = "bootloader.sh"; +pub(crate) const SET_IN_CHROOT_SH: &str = "set_in_chroot.sh"; +pub(crate) const GRUB_CFG: &str = "grub.cfg"; +pub(crate) const RPMLIST: &str = "rpmlist"; +pub(crate) const DOCKERFILE: &str = "Dockerfile"; + +pub(crate) const BOOTUP_DIR: &str = "./scripts-auto/00bootup"; +pub(crate) const BOOTUP_GLOBAL_CFG: &str = "Global.cfg"; +pub(crate) const BOOTUP_MODULE_SETUP_SH: &str = "module-setup.sh"; +pub(crate) const BOOTUP_MOUNT_SH: &str = "mount.sh"; + +pub(crate) const ADMIN_CONTAINER_DIR: &str = "./scripts-auto/admin-container"; +pub(crate) const ADMIN_DOCKERFILE: &str = "Dockerfile"; +pub(crate) const ADMIN_SET_SSH_PUB_KEY_SERVICE: &str = "set-ssh-pub-key.service"; +pub(crate) const ADMIN_SET_SSH_PUB_KEY_SH: &str = "set-ssh-pub-key.sh"; + +pub(crate) const MISC_FILES_DIR: &str = "./scripts-auto/misc-files"; +pub(crate) const MISC_BOOT_EFI_MOUNT: &str = "boot-efi.mount"; +pub(crate) const MISC_BOOT_GRUB2_MOUNT: &str = "boot-grub2.mount"; +pub(crate) const MISC_ETC_MOUNT: &str = "etc.mount"; +pub(crate) const MISC_OS_AGENT_SERVICE: &str = "os-agent.service"; +pub(crate) const MISC_OS_RELEASE: &str = "os-release"; +pub(crate) const MISC_PERSIST_MOUNT: &str = "persist.mount"; +pub(crate) const MISC_VAR_MOUNT: &str = "var.mount"; -- Gitee From 134cb7d8b940c83e1c90c8b6e2583240f75f33ae Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 15 Aug 2024 16:59:48 +0800 Subject: [PATCH 060/116] fix spell error and directory error --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 2dc66864..e4e6e68a 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -14,6 +14,7 @@ LOCK=./test.lock PWD="$(pwd)" RPM_ROOT="${{PWD}}/rootfs" TMP_MOUNT_PATH="${{PWD}}/mnt" +SCRIPTS_DIR=$(cd "$(dirname "$0")" && pwd) "# )?; Ok(()) @@ -211,7 +212,7 @@ r#"function install_packages() {{ echo "install package.." local filesize - filesize=$(stat -c "%s" ./rpmlist) + filesize=$(stat -c "%s" "${{SCRIPTS_DIR}}"/rpmlist) local maxsize=$((1024*1024)) if [ "${{filesize}}" -gt "${{maxsize}}" ]; then echo "please check if rpmlist is too big or something wrong" @@ -219,7 +220,7 @@ r#"function install_packages() {{ fi local rpms_name - rpms_name=$(tr "\n" " " < ./rpmlist) + rpms_name=$(tr "\n" " " < "${{SCRIPTS_DIR}}"/rpmlist) old_ifs="$IFS" IFS=' '"#)?; @@ -262,7 +263,7 @@ pub(crate) fn gen_copy_files(file: &mut File, copy_files: &Vec) -> Res pub(crate) fn gen_grub_config(file: &mut File, legacy_bios: bool, grub: &Grub) -> Result<()> { writeln!(file, -r#"function grub_config {{ +r#"function grub_config() {{ local GRUB_PATH"# )?; if legacy_bios { @@ -277,6 +278,7 @@ r#" local GRUB_PASSWD GRUB_PASSWD=$(echo -e "${}\n${}" | grub2-mkpasswd-pbkdf2 | grep PBKDF2 | awk '{{print $7}}') echo "GRUB2_PASSWD=${{GRUB_PASSWD}}" > "${{GRUB_PATH}}/user.cfg" chmod 600 "${{GRUB_PATH}}/user.cfg" +}} "#, grub_passwd, grub_passwd)?; } @@ -325,7 +327,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ r#" cp -r ./00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ cp set_in_chroot.sh "${{RPM_ROOT}}" - (optional) custom cofig"#)?; + #(optional) custom cofig"#)?; if let Some(_) = &config.copy_files { writeln!(file, "\tcopy_files\n")?; @@ -564,8 +566,7 @@ ADMIN_CONTAINER_DIR=./admin-container pub(crate) fn gen_create_admin_img(file: &mut File) -> Result<()> { writeln!(file, r#"function create_admin_img() {{ - local scripts_dir=$(cd "$(dirname "$0")" && pwd) - local kubeos_root_dir=$(dirname $(dirname "${{scripts_dir}}")) + local kubeos_root_dir=$(dirname $(dirname "${{SCRIPTS_DIR}}")) cp "${{kubeos_root_dir}}"/bin/hostshell "${{ADMIN_CONTAINER_DIR}}" docker build -t "${{DOCKER_IMG}}" -f "${{DOCKERFILE}}" "${{ADMIN_CONTAINER_DIR}}" rm -rf "${{ADMIN_CONTAINER_DIR}}"/hostshell -- Gitee From f6f686657f96878d99d281b7a6b546cfdf40da6d Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 15 Aug 2024 17:29:44 +0800 Subject: [PATCH 061/116] relative dir to absolute --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 47 ++++++++++++++-------------- KubeOS-Rust/kbimg/src/utils.rs | 21 ++++++------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index e4e6e68a..46bb4721 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -10,11 +10,11 @@ pub(crate) fn gen_global_vars(file: &mut File) -> Result<()> { writeln!(file, r#"#!/bin/bash IMG_SIZE=20 -LOCK=./test.lock +SCRIPTS_DIR=$(cd "$(dirname "$0")" && pwd) +LOCK="${{SCRIPTS_DIR}}/test.lock" PWD="$(pwd)" RPM_ROOT="${{PWD}}/rootfs" TMP_MOUNT_PATH="${{PWD}}/mnt" -SCRIPTS_DIR=$(cd "$(dirname "$0")" && pwd) "# )?; Ok(()) @@ -54,16 +54,16 @@ function delete_file() {{ function clean_space() {{ delete_dir "${{RPM_ROOT}}" delete_dir "${{TMP_MOUNT_PATH}}" - delete_file os.tar + delete_file "${{SCRIPTS_DIR}}"/os.tar rm -rf "${{LOCK}}" delete_file "${{ADMIN_CONTAINER_DIR}}"/hostshell }} function clean_img() {{ - delete_file system.img - delete_file update.img - delete_file initramfs.img - delete_file kubeos.tar + delete_file "${{SCRIPTS_DIR}}"/system.img + delete_file "${{SCRIPTS_DIR}}"/update.img + delete_file "${{SCRIPTS_DIR}}"/initramfs.img + delete_file "${{SCRIPTS_DIR}}"/kubeos.tar }} function file_lock() {{ @@ -275,7 +275,7 @@ r#"function grub_config() {{ if let Some(grub_passwd) = &grub.passwd { writeln!(file, r#" local GRUB_PASSWD - GRUB_PASSWD=$(echo -e "${}\n${}" | grub2-mkpasswd-pbkdf2 | grep PBKDF2 | awk '{{print $7}}') + GRUB_PASSWD=$(echo -e "{}\n{}" | grub2-mkpasswd-pbkdf2 | grep PBKDF2 | awk '{{print $7}}') echo "GRUB2_PASSWD=${{GRUB_PASSWD}}" > "${{GRUB_PATH}}/user.cfg" chmod 600 "${{GRUB_PATH}}/user.cfg" }} @@ -296,8 +296,8 @@ pub(crate) fn gen_install_misc(file: &mut File, legacy_bios: bool, config: &Conf writeln!(file, r#"function install_misc() {{ local DNS_CONF="${{PWD}}/resolv.conf" - cp ./misc-files/*mount ./misc-files/os-agent.service "${{RPM_ROOT}}/usr/lib/systemd/system/" - cp ./misc-files/os-release "${{RPM_ROOT}}/usr/lib/" + cp "${{SCRIPTS_DIR}}"/misc-files/*mount "${{SCRIPTS_DIR}}"/misc-files/os-agent.service "${{RPM_ROOT}}/usr/lib/systemd/system/" + cp "${{SCRIPTS_DIR}}"/misc-files/os-release "${{RPM_ROOT}}/usr/lib/" cp "${{AGENT_PATH}}" "${{RPM_ROOT}}/usr/bin" rm "${{RPM_ROOT}}/etc/os-release" @@ -312,7 +312,7 @@ EOF if legacy_bios { writeln!(file, -r#" cp grub.cfg "${{RPM_ROOT}}"/boot/grub2 +r#" cp "${{SCRIPTS_DIR}}"/grub.cfg "${{RPM_ROOT}}"/boot/grub2 sed -i "s/insmod part_gpt/insmod part_msdos/g; \ s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ @@ -320,12 +320,12 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ )?; } else { - writeln!(file, "\tcp grub.cfg \"${{RPM_ROOT}}\"/boot/efi/EFI/openEuler")?; + writeln!(file, "\tcp \"${{SCRIPTS_DIR}}\"grub.cfg \"${{RPM_ROOT}}\"/boot/efi/EFI/openEuler")?; } writeln!(file, -r#" cp -r ./00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ - cp set_in_chroot.sh "${{RPM_ROOT}}" +r#" cp -r "${{SCRIPTS_DIR}}"/00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ + cp "${{SCRIPTS_DIR}}"/set_in_chroot.sh "${{RPM_ROOT}}" #(optional) custom cofig"#)?; @@ -460,10 +460,10 @@ create_vm_repo_img"# pub(crate) fn gen_create_pxe_repo_img(file: &mut File) -> Result<()> { writeln!(file, r#"function create_pxe_repo_img() {{ - rm -rf initramfs.img kubeos.tar + rm -rf "${{SCRIPTS_DIR}}"/initramfs.img "${{SCRIPTS_DIR}}"/kubeos.tar create_os_tar_from_repo - tar -xvf os.tar ./initramfs.img - mv os.tar kubeos.tar + tar -xvf "${{SCRIPTS_DIR}}"/os.tar "${{SCRIPTS_DIR}}"/initramfs.img + mv "${{SCRIPTS_DIR}}"/os.tar "${{SCRIPTS_DIR}}"/kubeos.tar }} test_lock @@ -479,7 +479,7 @@ pub(crate) fn gen_create_docker_img(file: &mut File) -> Result<()> { writeln!(file, r#"function create_docker_img() {{ create_os_tar_from_repo - docker build -t "${{DOCKER_IMG}}" -f ./Dockerfile . + docker build -t "${{DOCKER_IMG}}" -f "${{SCRIPTS_DIR}}"/Dockerfile . }} test_lock @@ -508,7 +508,7 @@ pub(crate) fn gen_create_os_tar_from_docker(file: &mut File) -> Result<()> { r#"function create_os_tar_from_docker() {{ container_id=$(docker create "${{DOCKER_IMG}}") echo "$container_id" - docker cp "$container_id":/os.tar ./ + docker cp "$container_id":/os.tar "${{SCRIPTS_DIR}}" docker rm "$container_id" }} "# @@ -535,10 +535,10 @@ create_vm_docker_img"# pub(crate) fn gen_create_pxe_docker_img(file: &mut File) -> Result<()> { writeln!(file, r#"function create_pxe_docker_img() {{ - rm -rf initramfs.img kubeos.tar + rm -rf "${{SCRIPTS_DIR}}"/initramfs.img "${{SCRIPTS_DIR}}"/kubeos.tar create_os_tar_from_docker - tar -xvf os.tar ./initramfs.img - mv os.tar kubeos.tar + tar -xvf "${{SCRIPTS_DIR}}"/os.tar "${{SCRIPTS_DIR}}"/initramfs.img + mv "${{SCRIPTS_DIR}}"/os.tar "${{SCRIPTS_DIR}}"/kubeos.tar }} test_lock @@ -555,7 +555,7 @@ pub(crate) fn gen_admin_vars(file: &mut File, docker_img: &str, dockerfile: &Pat writeln!(file, r#"DOCKER_IMG={} DOCKERFILE={} -ADMIN_CONTAINER_DIR=./admin-container +ADMIN_CONTAINER_DIR="${{SCRIPTS_DIR}}"/admin-container "#, dockerfile.to_str().unwrap(), docker_img @@ -644,6 +644,7 @@ r#" GRUBNAME=$(which grub2-install) TARGET_OPT=${{TARGET_OPT:-"--target=i386-pc"}} $GRUBNAME --modules="biosdisk part_msdos" "$FORCE_OPT" "$TARGET_OPT" "$DEVICE" +}} "# )?; } diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs index 68091ca4..de5c1d6d 100644 --- a/KubeOS-Rust/kbimg/src/utils.rs +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -1,7 +1,6 @@ -use std::{fs::File, io::Write, path::PathBuf, process::Command}; +use std::{path::PathBuf, process::Command}; use anyhow::bail; -use log::debug; use crate::commands::BootupConfig; @@ -16,15 +15,15 @@ pub(crate) fn execute_scripts(script: PathBuf) -> anyhow::Result<()> { Ok(()) } -pub(crate) fn write_vector_to_file(scripts: Vec, file_name: &str) -> anyhow::Result<()> { - debug!("Writing scripts to file: {:?}", file_name); - let mut file = File::create(file_name)?; - // set permissions based on regulation - for line in scripts { - write!(file, "{}", line)?; - } - Ok(()) -} +// pub(crate) fn write_vector_to_file(scripts: Vec, file_name: &str) -> anyhow::Result<()> { +// debug!("Writing scripts to file: {:?}", file_name); +// let mut file = File::create(file_name)?; +// // set permissions based on regulation +// for line in scripts { +// write!(file, "{}", line)?; +// } +// Ok(()) +// } /// Check if the input parameter is valid pub(crate) fn is_valid_param + std::fmt::Debug>(param: S) -> bool { -- Gitee From ba956fee047c64b738bd058fc1894d4b1fdd49b5 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 15 Aug 2024 17:39:18 +0800 Subject: [PATCH 062/116] fix spell error --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 46bb4721..ace43f2a 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -333,7 +333,7 @@ r#" cp -r "${{SCRIPTS_DIR}}"/00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules. writeln!(file, "\tcopy_files\n")?; } if let Some(_) = &config.grub { - writeln!(file, "\tgrub_passwd\n")?; + writeln!(file, "\tgrub_config\n")?; } writeln!(file, -- Gitee From 9d8ba81accab16b62017de163b04b77bfb8e8cac Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 15 Aug 2024 17:49:11 +0800 Subject: [PATCH 063/116] change PWD to SCRIPTS_DIR --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index ace43f2a..e67902f9 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -12,9 +12,8 @@ r#"#!/bin/bash IMG_SIZE=20 SCRIPTS_DIR=$(cd "$(dirname "$0")" && pwd) LOCK="${{SCRIPTS_DIR}}/test.lock" -PWD="$(pwd)" -RPM_ROOT="${{PWD}}/rootfs" -TMP_MOUNT_PATH="${{PWD}}/mnt" +RPM_ROOT="${{SCRIPTS_DIR}}/rootfs" +TMP_MOUNT_PATH="${{SCRIPTS_DIR}}/mnt" "# )?; Ok(()) @@ -295,7 +294,7 @@ pub(crate) fn gen_install_misc(file: &mut File, legacy_bios: bool, config: &Conf writeln!(file, r#"function install_misc() {{ - local DNS_CONF="${{PWD}}/resolv.conf" + local DNS_CONF="${{SCRIPTS_DIR}}/resolv.conf" cp "${{SCRIPTS_DIR}}"/misc-files/*mount "${{SCRIPTS_DIR}}"/misc-files/os-agent.service "${{RPM_ROOT}}/usr/lib/systemd/system/" cp "${{SCRIPTS_DIR}}"/misc-files/os-release "${{RPM_ROOT}}/usr/lib/" cp "${{AGENT_PATH}}" "${{RPM_ROOT}}/usr/bin" @@ -415,7 +414,7 @@ r#" init_part system.img1 BOOT "${{BOOT_PATH}}" writeln!(file, r#" sync - cp bootloader.sh "${{TMP_MOUNT_PATH}}" + cp "${{SCRIPTS_DIR}}"/bootloader.sh "${{TMP_MOUNT_PATH}}" mount_proc_dev_sys "${{TMP_MOUNT_PATH}}" DEVICE="${{device}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{TMP_MOUNT_PATH}}" bash bootloader.sh rm -rf "${{TMP_MOUNT_PATH}}/bootloader.sh" -- Gitee From 4993b9d9680ccfed5de1ff7bf0ccad4a6acea012 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 15 Aug 2024 20:18:27 +0800 Subject: [PATCH 064/116] modify path --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 36 ++++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index e67902f9..aff62aaf 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -357,7 +357,7 @@ r#"function create_os_tar_from_repo() {{ install_packages install_misc unmount_dir "${{RPM_ROOT}}" - tar -C "${{RPM_ROOT}}" -cf ./os.tar . + tar -C "${{RPM_ROOT}}" -cf "${{SCRIPTS_DIR}}"/os.tar . }} "#)?; Ok(()) @@ -366,40 +366,40 @@ r#"function create_os_tar_from_repo() {{ pub(crate) fn gen_create_img(file: &mut File, legacy_bios: bool) -> Result<()> { writeln!(file, r#"function create_img() {{ - rm -f system.img update.img - qemu-img create system.img ${{IMG_SIZE}}G"#)?; + rm -f "${{SCRIPTS_DIR}}"/system.img "${{SCRIPTS_DIR}}"/update.img + qemu-img create "${{SCRIPTS_DIR}}"/system.img ${{IMG_SIZE}}G"#)?; if legacy_bios { writeln!(file, r#" local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/grub2 - parted system.img -s mklabel msdos - parted system.img -s mkpart primary ext4 1MiB 60MiB"#)?; + parted "${{SCRIPTS_DIR}}"/system.img -s mklabel msdos + parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 1MiB 60MiB"#)?; } else { writeln!(file, r#" local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/efi - parted system.img -s mklabel gpt - parted system.img -s mkpart primary fat32 1MiB 60MiB"#)?; + parted "${{SCRIPTS_DIR}}"/system.img -s mklabel gpt + parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary fat32 1MiB 60MiB"#)?; } writeln!(file, -r#" parted system.img -s mkpart primary ext4 60MiB 2160MiB - parted system.img -s mkpart primary ext4 2160MiB 4260MiB - parted system.img -s mkpart primary ext4 4260MiB 100% +r#" parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 60MiB 2160MiB + parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 2160MiB 4260MiB + parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 4260MiB 100% local device device=$(losetup -f) - losetup "${{device}}" system.img + losetup "${{device}}" "${{SCRIPTS_DIR}}"/system.img mkdir -p "${{TMP_MOUNT_PATH}}" - init_part system.img2 ROOT-A "${{TMP_MOUNT_PATH}}" + init_part "${{SCRIPTS_DIR}}"/system.img2 ROOT-A "${{TMP_MOUNT_PATH}}" mkdir -p "${{BOOT_PATH}}" chmod 755 "${{BOOT_PATH}}""#)?; if legacy_bios { writeln!(file, -r#" init_part system.img1 GRUB2 "${{BOOT_PATH}}" +r#" init_part "${{SCRIPTS_DIR}}"/system.img1 GRUB2 "${{BOOT_PATH}}" tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar sed -i "s/insmod part_gpt/insmod part_msdos/g; \ s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ @@ -408,7 +408,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ } else { writeln!(file, -r#" init_part system.img1 BOOT "${{BOOT_PATH}}" +r#" init_part "${{SCRIPTS_DIR}}"/system.img1 BOOT "${{BOOT_PATH}}" tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar"#)?; } @@ -423,17 +423,17 @@ r#" sync dd if=/dev/disk/by-label/ROOT-A of=update.img bs=8M sync unmount_dir "${{TMP_MOUNT_PATH}}" - init_part system.img3 ROOT-B "${{TMP_MOUNT_PATH}}" + init_part "${{SCRIPTS_DIR}}"/system.img3 ROOT-B "${{TMP_MOUNT_PATH}}" umount "${{TMP_MOUNT_PATH}}" - init_part system.img4 PERSIST "${{TMP_MOUNT_PATH}}" + init_part "${{SCRIPTS_DIR}}"/system.img4 PERSIST "${{TMP_MOUNT_PATH}}" mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}} mkdir -p "${{TMP_MOUNT_PATH}}"/etc/KubeOS/certs umount "${{TMP_MOUNT_PATH}}" losetup -D - parted system.img -- set 1 boot on - qemu-img convert system.img -O qcow2 system.qcow2 + parted "${{SCRIPTS_DIR}}"/system.img -- set 1 boot on + qemu-img convert "${{SCRIPTS_DIR}}"/system.img -O qcow2 "${{SCRIPTS_DIR}}"/system.qcow2 }} "# )?; -- Gitee From c974d0895ea0899b197ca6db5c9879b1079d25cf Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 16 Aug 2024 09:48:48 +0800 Subject: [PATCH 065/116] modify path --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index aff62aaf..975c4053 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -144,14 +144,14 @@ pub(crate) fn gen_init_part(file: &mut File) -> Result<()> { writeln!(file, r#"function init_part() {{ local offset - offset=$(fdisk -l system.img | grep "$1" | awk '{{print $2}}') + offset=$(fdisk -l "${{SCRIPTS_DIR}}"/system.img | grep "$1" | awk '{{print $2}}') local sizelimit - sizelimit=$(fdisk -l system.img | grep "$1" | awk '{{print $3}}') + sizelimit=$(fdisk -l "${{SCRIPTS_DIR}}"/system.img | grep "$1" | awk '{{print $3}}') sizelimit=$(echo "($sizelimit - $offset)*512" | bc) offset=$(echo "${{offset}}*512" | bc) local loop loop=$(losetup -f) - losetup -o "${{offset}}" --sizelimit "${{sizelimit}}" "${{loop}}" system.img + losetup -o "${{offset}}" --sizelimit "${{sizelimit}}" "${{loop}}" "${{SCRIPTS_DIR}}"/system.img if [ "$2" == "BOOT" ];then mkfs.vfat -n "$2" "${{loop}}" mount -t vfat "${{loop}}" "$3" @@ -420,7 +420,7 @@ r#" sync rm -rf "${{TMP_MOUNT_PATH}}/bootloader.sh" sync - dd if=/dev/disk/by-label/ROOT-A of=update.img bs=8M + dd if=/dev/disk/by-label/ROOT-A of="${{SCRIPTS_DIR}}"/update.img bs=8M sync unmount_dir "${{TMP_MOUNT_PATH}}" init_part "${{SCRIPTS_DIR}}"/system.img3 ROOT-B "${{TMP_MOUNT_PATH}}" -- Gitee From 57ee92f00c04a331f751b3fd030cc4ed8a11b7f7 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 16 Aug 2024 10:09:40 +0800 Subject: [PATCH 066/116] execute --- KubeOS-Rust/kbimg/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KubeOS-Rust/kbimg/src/main.rs b/KubeOS-Rust/kbimg/src/main.rs index bd93e47b..98b4451d 100644 --- a/KubeOS-Rust/kbimg/src/main.rs +++ b/KubeOS-Rust/kbimg/src/main.rs @@ -42,7 +42,7 @@ fn process(info: Box, mut config: Config) -> Result<()> { Ok(_) => { info.prepare(&mut config)?; let path = info.generate_scripts(&config)?; - // execute_scripts(path)?; + execute_scripts(path)?; Ok(()) }, Err(e) => bail!(e) -- Gitee From abad6c5540982492a4468233074734bf9dadd354 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 16 Aug 2024 10:16:51 +0800 Subject: [PATCH 067/116] modify path --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 975c4053..54588d66 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -400,7 +400,7 @@ r#" parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 60MiB 2160MiB if legacy_bios { writeln!(file, r#" init_part "${{SCRIPTS_DIR}}"/system.img1 GRUB2 "${{BOOT_PATH}}" - tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar + tar -x -C "${{TMP_MOUNT_PATH}}" -f "${{SCRIPTS_DIR}}"/os.tar sed -i "s/insmod part_gpt/insmod part_msdos/g; \ s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ @@ -409,7 +409,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ else { writeln!(file, r#" init_part "${{SCRIPTS_DIR}}"/system.img1 BOOT "${{BOOT_PATH}}" - tar -x -C "${{TMP_MOUNT_PATH}}" -f os.tar"#)?; + tar -x -C "${{TMP_MOUNT_PATH}}" -f "${{SCRIPTS_DIR}}"/os.tar"#)?; } writeln!(file, -- Gitee From ca92ca20463f23e7ccd2d94a583bfd7e69513b36 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 16 Aug 2024 10:20:00 +0800 Subject: [PATCH 068/116] modify path --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 54588d66..4291a576 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -565,7 +565,7 @@ ADMIN_CONTAINER_DIR="${{SCRIPTS_DIR}}"/admin-container pub(crate) fn gen_create_admin_img(file: &mut File) -> Result<()> { writeln!(file, r#"function create_admin_img() {{ - local kubeos_root_dir=$(dirname $(dirname "${{SCRIPTS_DIR}}")) + local kubeos_root_dir=$(dirname $(dirname $(dirname "${{SCRIPTS_DIR}}"))) cp "${{kubeos_root_dir}}"/bin/hostshell "${{ADMIN_CONTAINER_DIR}}" docker build -t "${{DOCKER_IMG}}" -f "${{DOCKERFILE}}" "${{ADMIN_CONTAINER_DIR}}" rm -rf "${{ADMIN_CONTAINER_DIR}}"/hostshell -- Gitee From 8926bbc107e449fc170a37a3cd67074fb4a412c3 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 16 Aug 2024 13:29:10 +0800 Subject: [PATCH 069/116] add users; set -ex; additional rpms --- KubeOS-Rust/kbimg/kbimg.toml | 25 +++---- KubeOS-Rust/kbimg/src/commands.rs | 2 + KubeOS-Rust/kbimg/src/repo.rs | 4 +- KubeOS-Rust/kbimg/src/scripts_gen.rs | 97 ++++++++++++++++++++++------ scripts/add_user.sh | 10 +-- 5 files changed, 99 insertions(+), 39 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index 49fcbd1a..c7ac01d0 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -5,6 +5,9 @@ legacy_bios = true repo_path = "/etc/yum.repos.d/openEuler.repo" root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" version = "v1" +add_rpms = [ + "nginx" +] [from_dockerimg] docker_img = "" @@ -14,16 +17,16 @@ image_type = "vm-docker" dockerfile = "" docker_img = "" -# [[users]] -# groups = ["admin"] -# name = "foo" -# passwd = "foo" -# sudo = "ALL=(ALL) ALL" +[[users]] +groups = ["admin"] +name = "foo" +passwd = "foo" +sudo = "ALL=(ALL) ALL" -# [[users]] -# groups = ["example"] -# name = "bar" -# passwd = "bar" +[[users]] +groups = ["example"] +name = "bar" +passwd = "bar" # [[copy_files]] # dst = "/ztest" @@ -33,8 +36,8 @@ docker_img = "" # dst = "/ztest" # src = "../../../ztest/2.txt" -[grub] -passwd = "foo" +# [grub] +# passwd = "foo" # [systemd_service] # name = ["containerd", "kubelet"] diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index cb955ad1..d3ebad5d 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -64,6 +64,8 @@ pub struct RepoInfo { pub image_type: String, #[clap(skip)] pub arch: Option, + #[clap(short = 'r', long, value_parser)] + pub add_rpms: Option>, } #[derive(Args, Debug, Deserialize, Clone)] diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index 6dce34a4..142f45e5 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -26,7 +26,7 @@ impl CreateImage for RepoInfo { fn generate_scripts(&self, config: &Config) -> anyhow::Result { // rpmlist let mut rpmlist = File::create(&format!("{}/{}", SCRIPTS_DIR, RPMLIST))?; - gen_rpm_list(&mut rpmlist)?; + gen_rpm_list(&mut rpmlist, &self.add_rpms)?; // 00bootup match create_dir_all(BOOTUP_DIR) { Ok(_) => { @@ -68,7 +68,7 @@ impl CreateImage for RepoInfo { gen_grub_cfg(&mut grub_cfg)?; // set_in_chroot.sh let mut set_in_chroot = File::create(&format!("{}/{}", SCRIPTS_DIR, SET_IN_CHROOT_SH))?; - gen_set_in_chroot(&mut set_in_chroot, self.legacy_bios)?; + gen_set_in_chroot(&mut set_in_chroot, self.legacy_bios, &config)?; // kbimg.sh let mut kbimg = File::create(&format!("{}/{}", SCRIPTS_DIR, KBIMG_SH))?; gen_global_vars(&mut kbimg)?; diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 4291a576..b87a3afb 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -1,14 +1,17 @@ use std::fs::File; use std::io::Write; use std::path::PathBuf; -use anyhow::Result; +use anyhow::{Ok, Result}; -use crate::commands::{Config, CopyFile, Grub, RepoInfo, BootupConfig}; +use crate::commands::{BootupConfig, Config, CopyFile, Grub, RepoInfo, User}; /* region: kbimg.sh */ pub(crate) fn gen_global_vars(file: &mut File) -> Result<()> { writeln!(file, r#"#!/bin/bash + +set -ex + IMG_SIZE=20 SCRIPTS_DIR=$(cd "$(dirname "$0")" && pwd) LOCK="${{SCRIPTS_DIR}}/test.lock" @@ -582,7 +585,46 @@ create_admin_img"# /* endregion */ /* region: set_in_chroot.sh */ -pub(crate) fn gen_set_in_chroot(file: &mut File, legacy_bios: bool) -> Result<()> { +pub(crate) fn gen_add_users(file: &mut File, users: &Vec) -> Result<()> { + writeln!(file, r#"# add users"#)?; + for user in users { + let name = &user.name; + let passwd = &user.passwd; + let groups = match user.groups.clone() { + Some(groups) => groups, + None => vec![name.clone()], + }; + for group in &groups { + writeln!(file, +r#"if ! getent group "${}" > /dev/null 2>&1; then + groupadd "${}" +fi +"#, + group, group)?; + } + write!(file, r#"useradd -m -g "{}""#, &groups[0])?; + if groups.len() > 1 { + let additional_groups = &groups[1..].join(","); + write!(file, r#" -G {}"#, additional_groups)?; + } + writeln!(file, r#" -s /bin/bash "{}""#, &name)?; + writeln!(file, r#"echo "{}:{}" | chpasswd"#, name, passwd)?; + if let Some(sudo) = &user.sudo { + writeln!(file, +r#"if visudo -c; then + echo -e "{} {}" | tee -a /etc/sudoers +else + echo "Sudoers file syntax check failed. Please fix the sudoers file manually." + exit 5 +fi +"#, + name, sudo)?; + } + } + Ok(()) +} + +pub(crate) fn gen_set_in_chroot(file: &mut File, legacy_bios: bool, config: &Config) -> Result<()> { writeln!(file, r#"#!/bin/bash ln -s /usr/lib/systemd/system/os-agent.service /usr/lib/systemd/system/multi-user.target.wants/os-agent.service @@ -608,8 +650,14 @@ rm -rf /etc/shadow_bak dracut -f -v --add bootup /initramfs.img --kver "$(ls /lib/modules)" rm -rf /usr/lib/dracut/modules.d/00bootup -"# + +# (optional) custom config"# )?; + + if let Some(users) = &config.users { + gen_add_users(file, users)?; + } + Ok(()) } /* endregion */ @@ -657,33 +705,40 @@ r#"install_grub2 /* endregion */ /* region: rpmlist */ -pub(crate) fn gen_rpm_list(file: &mut File) -> Result<()> { +pub(crate) fn gen_rpm_list(file: &mut File, add_rpms: &Option>) -> Result<()> { writeln!(file, -r#"kernel -passwd +r#"NetworkManager +conntrack-tools +containernetworking-plugins +coreutils dhcp -NetworkManager -openssh-server docker -kubernetes-kubeadm -kubernetes-kubelet -containernetworking-plugins -socat -conntrack-tools +dosfstools +dracut ebtables ethtool -rsyslog -vi -net-tools -hwinfo -dracut -coreutils gawk +hwinfo +kernel +kubernetes-kubeadm +kubernetes-kubelet +net-tools +openssh-server +passwd parted -dosfstools +rsyslog +socat sudo +vi "# )?; + + if let Some(add_rpms) = add_rpms { + for add_rpm in add_rpms { + writeln!(file, "{}", add_rpm); + } + } + Ok(()) } /* endregion */ diff --git a/scripts/add_user.sh b/scripts/add_user.sh index 1a9b4e8d..6dc33075 100644 --- a/scripts/add_user.sh +++ b/scripts/add_user.sh @@ -14,11 +14,11 @@ echo "${username}:${password}" | chpasswd if [ "${superuser}" -eq 0 ]; then if visudo -c; then echo -e "${username}\tALL=(ALL:ALL)\tALL" | tee -a /etc/sudoers - if grep -q "${username}" /etc/sudoers; then - echo "Sudo privileges added for user ${username}." - else - echo "Failed to add sudo privileges for user ${username}." - fi + if grep -q "${username}" /etc/sudoers; then + echo "Sudo privileges added for user ${username}." + else + echo "Failed to add sudo privileges for user ${username}." + fi else echo "Sudoers file syntax check failed. Please fix the sudoers file manually." exit 5 -- Gitee From 1f5018c0da874d50ec4745d203c2f53f3703fa01 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 16 Aug 2024 13:55:27 +0800 Subject: [PATCH 070/116] fix spell error --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index b87a3afb..d210c628 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -596,10 +596,9 @@ pub(crate) fn gen_add_users(file: &mut File, users: &Vec) -> Result<()> { }; for group in &groups { writeln!(file, -r#"if ! getent group "${}" > /dev/null 2>&1; then - groupadd "${}" -fi -"#, +r#"if ! getent group "{}" > /dev/null 2>&1; then + groupadd "{}" +fi"#, group, group)?; } write!(file, r#"useradd -m -g "{}""#, &groups[0])?; @@ -616,8 +615,7 @@ r#"if visudo -c; then else echo "Sudoers file syntax check failed. Please fix the sudoers file manually." exit 5 -fi -"#, +fi"#, name, sudo)?; } } @@ -735,7 +733,7 @@ vi if let Some(add_rpms) = add_rpms { for add_rpm in add_rpms { - writeln!(file, "{}", add_rpm); + writeln!(file, "{}", add_rpm)?; } } -- Gitee From 6fdfd4e7d7335de50fbb128a4cbf2eb6c84d25d3 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 16 Aug 2024 14:16:39 +0800 Subject: [PATCH 071/116] entire rpmlist in toml --- KubeOS-Rust/kbimg/kbimg.toml | 26 ++++++++++++++++++-- KubeOS-Rust/kbimg/src/commands.rs | 5 ++-- KubeOS-Rust/kbimg/src/repo.rs | 2 +- KubeOS-Rust/kbimg/src/scripts_gen.rs | 36 +++------------------------- 4 files changed, 31 insertions(+), 38 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index c7ac01d0..7e616384 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -5,8 +5,30 @@ legacy_bios = true repo_path = "/etc/yum.repos.d/openEuler.repo" root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" version = "v1" -add_rpms = [ - "nginx" +rpmlist = [ + "NetworkManager" + "conntrack-tools" + "containernetworking-plugins" + "coreutils" + "dhcp" + "docker" + "dosfstools" + "dracut" + "ebtables" + "ethtool" + "gawk" + "hwinfo" + "kernel" + "kubernetes-kubeadm" + "kubernetes-kubelet" + "net-tools" + "openssh-server" + "passwd" + "parted" + "rsyslog" + "socat" + "sudo" + "vi" ] [from_dockerimg] diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index d3ebad5d..348aadd1 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -57,6 +57,9 @@ pub struct RepoInfo { /// Required for upgrade-image #[clap(short = 'd', long, value_parser)] pub docker_img: Option, + /// Required: RPM packages + #[clap(short = 'r', long, value_parser)] + pub rpmlist: Vec, /// Optional: boot mode, default is uefi, enable this flag for legacy bios #[clap(short, long, value_parser)] pub legacy_bios: bool, @@ -64,8 +67,6 @@ pub struct RepoInfo { pub image_type: String, #[clap(skip)] pub arch: Option, - #[clap(short = 'r', long, value_parser)] - pub add_rpms: Option>, } #[derive(Args, Debug, Deserialize, Clone)] diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index 142f45e5..ce21850e 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -26,7 +26,7 @@ impl CreateImage for RepoInfo { fn generate_scripts(&self, config: &Config) -> anyhow::Result { // rpmlist let mut rpmlist = File::create(&format!("{}/{}", SCRIPTS_DIR, RPMLIST))?; - gen_rpm_list(&mut rpmlist, &self.add_rpms)?; + gen_rpm_list(&mut rpmlist, &self.rpmlist)?; // 00bootup match create_dir_all(BOOTUP_DIR) { Ok(_) => { diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index d210c628..54a8509d 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -703,40 +703,10 @@ r#"install_grub2 /* endregion */ /* region: rpmlist */ -pub(crate) fn gen_rpm_list(file: &mut File, add_rpms: &Option>) -> Result<()> { - writeln!(file, -r#"NetworkManager -conntrack-tools -containernetworking-plugins -coreutils -dhcp -docker -dosfstools -dracut -ebtables -ethtool -gawk -hwinfo -kernel -kubernetes-kubeadm -kubernetes-kubelet -net-tools -openssh-server -passwd -parted -rsyslog -socat -sudo -vi -"# - )?; - - if let Some(add_rpms) = add_rpms { - for add_rpm in add_rpms { - writeln!(file, "{}", add_rpm)?; - } +pub(crate) fn gen_rpm_list(file: &mut File, rpmlist: &Vec) -> Result<()> { + for rpm in rpmlist { + writeln!(file, "{}", rpm)?; } - Ok(()) } /* endregion */ -- Gitee From fd2e196e98c2cab32c9aacd8249e2338439e5858 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 16 Aug 2024 14:17:15 +0800 Subject: [PATCH 072/116] fix comma --- KubeOS-Rust/kbimg/kbimg.toml | 46 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index 7e616384..a950be42 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -6,29 +6,29 @@ repo_path = "/etc/yum.repos.d/openEuler.repo" root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" version = "v1" rpmlist = [ - "NetworkManager" - "conntrack-tools" - "containernetworking-plugins" - "coreutils" - "dhcp" - "docker" - "dosfstools" - "dracut" - "ebtables" - "ethtool" - "gawk" - "hwinfo" - "kernel" - "kubernetes-kubeadm" - "kubernetes-kubelet" - "net-tools" - "openssh-server" - "passwd" - "parted" - "rsyslog" - "socat" - "sudo" - "vi" + "NetworkManager", + "conntrack-tools", + "containernetworking-plugins", + "coreutils", + "dhcp", + "docker", + "dosfstools", + "dracut", + "ebtables", + "ethtool", + "gawk", + "hwinfo", + "kernel", + "kubernetes-kubeadm", + "kubernetes-kubelet", + "net-tools", + "openssh-server", + "passwd", + "parted", + "rsyslog", + "socat", + "sudo", + "vi", ] [from_dockerimg] -- Gitee From 20881c3f9ba8b879403c470eeccbef9b2a67aad5 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 16 Aug 2024 15:01:21 +0800 Subject: [PATCH 073/116] systemd service --- KubeOS-Rust/kbimg/kbimg.toml | 34 +++++++++++------------ KubeOS-Rust/kbimg/src/scripts_gen.rs | 14 +++++++++- ztest/1.txt | 1 - ztest/2.txt | 1 - ztest/containerd.service | 41 ++++++++++++++++++++++++++++ ztest/kubelet.service | 27 ++++++++++++++++++ 6 files changed, 98 insertions(+), 20 deletions(-) delete mode 100644 ztest/1.txt delete mode 100644 ztest/2.txt create mode 100644 ztest/containerd.service create mode 100644 ztest/kubelet.service diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index a950be42..b64b82b1 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -39,30 +39,30 @@ image_type = "vm-docker" dockerfile = "" docker_img = "" -[[users]] -groups = ["admin"] -name = "foo" -passwd = "foo" -sudo = "ALL=(ALL) ALL" +# [[users]] +# groups = ["admin"] +# name = "foo" +# passwd = "foo" +# sudo = "ALL=(ALL) ALL" -[[users]] -groups = ["example"] -name = "bar" -passwd = "bar" +# [[users]] +# groups = ["example"] +# name = "bar" +# passwd = "bar" -# [[copy_files]] -# dst = "/ztest" -# src = "/root/KubeOS/ztest/1.txt" +[[copy_files]] +dst = "/usr/lib/systemd/system" +src = "/root/KubeOS/ztest/containerd.service" -# [[copy_files]] -# dst = "/ztest" -# src = "../../../ztest/2.txt" +[[copy_files]] +dst = "/usr/lib/systemd/system" +src = "/root/KubeOS/ztest/kubelet.service" # [grub] # passwd = "foo" -# [systemd_service] -# name = ["containerd", "kubelet"] +[systemd_service] +name = ["containerd", "kubelet"] # [chroot_script] # path = "./chroot.sh" diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 54a8509d..3c076454 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -3,7 +3,7 @@ use std::io::Write; use std::path::PathBuf; use anyhow::{Ok, Result}; -use crate::commands::{BootupConfig, Config, CopyFile, Grub, RepoInfo, User}; +use crate::commands::{BootupConfig, Config, CopyFile, Grub, RepoInfo, SystemdService, User}; /* region: kbimg.sh */ pub(crate) fn gen_global_vars(file: &mut File) -> Result<()> { @@ -622,6 +622,15 @@ fi"#, Ok(()) } +pub(crate) fn gen_systemd_services(file: &mut File, systemd_services: &SystemdService) -> Result<()> { + writeln!(file, r#"# systemd services"#)?; + let services_name = &systemd_services.name; + for service_name in services_name { + writeln!(file, r#"systemctl enable {}"#, service_name)?; + } + Ok(()) +} + pub(crate) fn gen_set_in_chroot(file: &mut File, legacy_bios: bool, config: &Config) -> Result<()> { writeln!(file, r#"#!/bin/bash @@ -655,6 +664,9 @@ rm -rf /usr/lib/dracut/modules.d/00bootup if let Some(users) = &config.users { gen_add_users(file, users)?; } + if let Some(systemd_services) = &config.systemd_service { + gen_systemd_services(file, systemd_services)?; + } Ok(()) } diff --git a/ztest/1.txt b/ztest/1.txt deleted file mode 100644 index 249699de..00000000 --- a/ztest/1.txt +++ /dev/null @@ -1 +0,0 @@ -123ewfdv89weoich3weu7ki4 \ No newline at end of file diff --git a/ztest/2.txt b/ztest/2.txt deleted file mode 100644 index 6d69266a..00000000 --- a/ztest/2.txt +++ /dev/null @@ -1 +0,0 @@ -0987ytfcgvbhuyxaaaaaaaaaaaaiwq83r724f \ No newline at end of file diff --git a/ztest/containerd.service b/ztest/containerd.service new file mode 100644 index 00000000..a55972a2 --- /dev/null +++ b/ztest/containerd.service @@ -0,0 +1,41 @@ +# Copyright The containerd Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[Unit] +Description=containerd container runtime +Documentation=https://containerd.io +After=network.target local-fs.target + +[Service] +ExecStartPre=-/sbin/modprobe overlay +ExecStart=/usr/local/bin/containerd + +Type=notify +Delegate=yes +KillMode=process +Restart=always +RestartSec=5 + +# Having non-zero Limit*s causes performance problems due to accounting overhead +# in the kernel. We recommend using cgroups to do container-local accounting. +LimitNPROC=infinity +LimitCORE=infinity + +# Comment TasksMax if your systemd version does not supports it. +# Only systemd 226 and above support this version. +TasksMax=infinity +OOMScoreAdjust=-999 + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/ztest/kubelet.service b/ztest/kubelet.service new file mode 100644 index 00000000..4cd8a281 --- /dev/null +++ b/ztest/kubelet.service @@ -0,0 +1,27 @@ +[Unit] +Description=Kubernetes Kubelet Server +Documentation=https://github.com/GoogleCloudPlatform/kubernetes +After=docker.service +Wants=docker.socket + +[Service] +EnvironmentFile=-/etc/kubernetes/kubelet.env +ExecStartPre=-/bin/mkdir -p /var/lib/kubelet/volume-plugins +ExecStart=/usr/local/bin/kubelet \ + $KUBE_LOGTOSTDERR \ + $KUBE_LOG_LEVEL \ + $KUBELET_API_SERVER \ + $KUBELET_ADDRESS \ + $KUBELET_PORT \ + $KUBELET_HOSTNAME \ + $KUBE_ALLOW_PRIV \ + $KUBELET_ARGS \ + $DOCKER_SOCKET \ + $KUBELET_NETWORK_PLUGIN \ + $KUBELET_VOLUME_PLUGIN \ + $KUBELET_CLOUDPROVIDER +Restart=always +RestartSec=10s + +[Install] +WantedBy=multi-user.target \ No newline at end of file -- Gitee From f4f93d049c965377de5680cb8952b411124b8117 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 16 Aug 2024 16:55:51 +0800 Subject: [PATCH 074/116] change ln to cmd --- KubeOS-Rust/kbimg/kbimg.toml | 8 ++++---- KubeOS-Rust/kbimg/src/scripts_gen.rs | 10 +++++----- ztest/kubelet.service | 27 --------------------------- 3 files changed, 9 insertions(+), 36 deletions(-) delete mode 100644 ztest/kubelet.service diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index b64b82b1..43903aaf 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -54,15 +54,15 @@ docker_img = "" dst = "/usr/lib/systemd/system" src = "/root/KubeOS/ztest/containerd.service" -[[copy_files]] -dst = "/usr/lib/systemd/system" -src = "/root/KubeOS/ztest/kubelet.service" +# [[copy_files]] +# dst = "/usr/lib/systemd/system" +# src = "/root/KubeOS/ztest/kubelet.service" # [grub] # passwd = "foo" [systemd_service] -name = ["containerd", "kubelet"] +name = ["containerd"] # [chroot_script] # path = "./chroot.sh" diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 3c076454..7e1fe4ee 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -634,18 +634,18 @@ pub(crate) fn gen_systemd_services(file: &mut File, systemd_services: &SystemdSe pub(crate) fn gen_set_in_chroot(file: &mut File, legacy_bios: bool, config: &Config) -> Result<()> { writeln!(file, r#"#!/bin/bash -ln -s /usr/lib/systemd/system/os-agent.service /usr/lib/systemd/system/multi-user.target.wants/os-agent.service -ln -s /usr/lib/systemd/system/kubelet.service /usr/lib/systemd/system/multi-user.target.wants/kubelet.service"#)?; +systemctl enable os-agent +systemctl enable kubelet"#)?; if legacy_bios { - writeln!(file, "ln -s /usr/lib/systemd/system/boot-grub2.mount /lib/systemd/system/local-fs.target.wants/boot-grub2.mount")?; + writeln!(file, "systemctl enable boot-grub2.mount")?; } else { - writeln!(file, "ln -s /usr/lib/systemd/system/boot-efi.mount /lib/systemd/system/local-fs.target.wants/boot-efi.mount")?; + writeln!(file, "systemctl enable boot-efi.mount")?; } writeln!(file, -r#"ln -s /usr/lib/systemd/system/etc.mount /lib/systemd/system/local-fs.target.wants/etc.mount +r#"systemctl enable etc.mount str=$(sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{{print $2}}') umask 0666 diff --git a/ztest/kubelet.service b/ztest/kubelet.service deleted file mode 100644 index 4cd8a281..00000000 --- a/ztest/kubelet.service +++ /dev/null @@ -1,27 +0,0 @@ -[Unit] -Description=Kubernetes Kubelet Server -Documentation=https://github.com/GoogleCloudPlatform/kubernetes -After=docker.service -Wants=docker.socket - -[Service] -EnvironmentFile=-/etc/kubernetes/kubelet.env -ExecStartPre=-/bin/mkdir -p /var/lib/kubelet/volume-plugins -ExecStart=/usr/local/bin/kubelet \ - $KUBE_LOGTOSTDERR \ - $KUBE_LOG_LEVEL \ - $KUBELET_API_SERVER \ - $KUBELET_ADDRESS \ - $KUBELET_PORT \ - $KUBELET_HOSTNAME \ - $KUBE_ALLOW_PRIV \ - $KUBELET_ARGS \ - $DOCKER_SOCKET \ - $KUBELET_NETWORK_PLUGIN \ - $KUBELET_VOLUME_PLUGIN \ - $KUBELET_CLOUDPROVIDER -Restart=always -RestartSec=10s - -[Install] -WantedBy=multi-user.target \ No newline at end of file -- Gitee From db4b79ee8200b4ff4164da8499155aa6eb83ced1 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 16 Aug 2024 17:47:43 +0800 Subject: [PATCH 075/116] hook-rs --- KubeOS-Rust/kbimg/kbimg.toml | 14 +++++----- KubeOS-Rust/kbimg/src/scripts_gen.rs | 31 +++++++++++++++++++-- ztest/containerd.service | 41 ---------------------------- ztest/myscript.sh | 2 ++ 4 files changed, 37 insertions(+), 51 deletions(-) delete mode 100644 ztest/containerd.service create mode 100644 ztest/myscript.sh diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index 43903aaf..e409b4fc 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -50,9 +50,9 @@ docker_img = "" # name = "bar" # passwd = "bar" -[[copy_files]] -dst = "/usr/lib/systemd/system" -src = "/root/KubeOS/ztest/containerd.service" +# [[copy_files]] +# dst = "/usr/lib/systemd/system" +# src = "/root/KubeOS/ztest/containerd.service" # [[copy_files]] # dst = "/usr/lib/systemd/system" @@ -61,8 +61,8 @@ src = "/root/KubeOS/ztest/containerd.service" # [grub] # passwd = "foo" -[systemd_service] -name = ["containerd"] +# [systemd_service] +# name = ["containerd"] -# [chroot_script] -# path = "./chroot.sh" +[chroot_script] +path = "../../ztest/myscript.sh" diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 7e1fe4ee..b32d1ff6 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -1,9 +1,9 @@ use std::fs::File; use std::io::Write; use std::path::PathBuf; -use anyhow::{Ok, Result}; +use anyhow::{Ok, Result, bail}; -use crate::commands::{BootupConfig, Config, CopyFile, Grub, RepoInfo, SystemdService, User}; +use crate::commands::*; /* region: kbimg.sh */ pub(crate) fn gen_global_vars(file: &mut File) -> Result<()> { @@ -287,6 +287,25 @@ r#" local GRUB_PASSWD Ok(()) } +pub(crate) fn gen_chroot_script(file: &mut File, chroot_script: &ChrootScript) -> Result<()> { + let script_path = PathBuf::from(&chroot_script.path); + match script_path.canonicalize() { + core::result::Result::Ok(absolute_path) => { + if let Some(script_name) = absolute_path.file_name() { + writeln!(file, +r#"function chroot_script() {{ + cp "{}" "${{RPM_ROOT}}" + chroot "${{RPM_ROOT}}" bash /{} +}} +"#, + absolute_path.as_path().to_str().unwrap(), script_name.to_str().unwrap())?; + } + Ok(()) + } + Err(e) => bail!(e) + } +} + pub(crate) fn gen_install_misc(file: &mut File, legacy_bios: bool, config: &Config) -> Result<()> { if let Some(copy_files) = &config.copy_files { gen_copy_files(file, ©_files)?; @@ -294,6 +313,9 @@ pub(crate) fn gen_install_misc(file: &mut File, legacy_bios: bool, config: &Conf if let Some(grub) = &config.grub { gen_grub_config(file, legacy_bios, &grub)?; } + if let Some(chroot_script) = &config.chroot_script { + gen_chroot_script(file, &chroot_script)?; + } writeln!(file, r#"function install_misc() {{ @@ -329,7 +351,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ r#" cp -r "${{SCRIPTS_DIR}}"/00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ cp "${{SCRIPTS_DIR}}"/set_in_chroot.sh "${{RPM_ROOT}}" - #(optional) custom cofig"#)?; + #(optional) custom config"#)?; if let Some(_) = &config.copy_files { writeln!(file, "\tcopy_files\n")?; @@ -337,6 +359,9 @@ r#" cp -r "${{SCRIPTS_DIR}}"/00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules. if let Some(_) = &config.grub { writeln!(file, "\tgrub_config\n")?; } + if let Some(_) = &config.chroot_script { + writeln!(file, "\tchroot_script\n")?; + } writeln!(file, r#" ROOT_PASSWD="${{ROOT_PASSWD}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{RPM_ROOT}}" bash /set_in_chroot.sh diff --git a/ztest/containerd.service b/ztest/containerd.service deleted file mode 100644 index a55972a2..00000000 --- a/ztest/containerd.service +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright The containerd Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -[Unit] -Description=containerd container runtime -Documentation=https://containerd.io -After=network.target local-fs.target - -[Service] -ExecStartPre=-/sbin/modprobe overlay -ExecStart=/usr/local/bin/containerd - -Type=notify -Delegate=yes -KillMode=process -Restart=always -RestartSec=5 - -# Having non-zero Limit*s causes performance problems due to accounting overhead -# in the kernel. We recommend using cgroups to do container-local accounting. -LimitNPROC=infinity -LimitCORE=infinity - -# Comment TasksMax if your systemd version does not supports it. -# Only systemd 226 and above support this version. -TasksMax=infinity -OOMScoreAdjust=-999 - -[Install] -WantedBy=multi-user.target \ No newline at end of file diff --git a/ztest/myscript.sh b/ztest/myscript.sh new file mode 100644 index 00000000..2c263d4a --- /dev/null +++ b/ztest/myscript.sh @@ -0,0 +1,2 @@ +#!/bin/bash +echo "11111" \ No newline at end of file -- Gitee From 7b020375877363963c1ce3e07b46bbb796215827 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 20 Aug 2024 10:27:06 +0800 Subject: [PATCH 076/116] partition --- KubeOS-Rust/kbimg/kbimg.toml | 10 ++++++-- KubeOS-Rust/kbimg/src/commands.rs | 11 ++++++++- KubeOS-Rust/kbimg/src/docker_img.rs | 4 ++-- KubeOS-Rust/kbimg/src/repo.rs | 2 +- KubeOS-Rust/kbimg/src/scripts_gen.rs | 36 +++++++++++++++++++++------- ztest/myscript.sh | 2 -- 6 files changed, 48 insertions(+), 17 deletions(-) delete mode 100644 ztest/myscript.sh diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index e409b4fc..c4cb99f7 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -64,5 +64,11 @@ docker_img = "" # [systemd_service] # name = ["containerd"] -[chroot_script] -path = "../../ztest/myscript.sh" +# [chroot_script] +# path = "../../ztest/myscript.sh" + +[disk_partition] +first = 100 +second = 2500 +third = 2300 +img_size = 30 \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index 348aadd1..254da73e 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -88,7 +88,7 @@ pub struct AdminContainerInfo { pub dockerfile: PathBuf, } -// pxe config +// bootup config #[derive(Debug, Deserialize, Clone)] pub(crate) struct BootupConfig { pub rootfs_name: String, @@ -124,6 +124,7 @@ pub struct Config { pub grub: Option, pub systemd_service: Option, pub chroot_script: Option, + pub disk_partition: Option, } #[derive(Deserialize, Debug, Clone)] @@ -154,3 +155,11 @@ pub struct SystemdService { pub struct ChrootScript { pub path: String, } + +#[derive(Deserialize, Debug, Clone)] +pub struct DiskPartition { + pub first: u32, + pub second: u32, + pub third: u32, + pub img_size: u32, +} \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/docker_img.rs b/KubeOS-Rust/kbimg/src/docker_img.rs index 70ec978f..9a09c20a 100644 --- a/KubeOS-Rust/kbimg/src/docker_img.rs +++ b/KubeOS-Rust/kbimg/src/docker_img.rs @@ -22,7 +22,7 @@ impl CreateImage for DockerInfo { Ok(()) } - fn generate_scripts(&self, _: &Config) -> anyhow::Result { + fn generate_scripts(&self, config: &Config) -> anyhow::Result { // kbimg.sh let mut kbimg = File::create(&format!("{}/{}", SCRIPTS_DIR, KBIMG_SH))?; gen_global_vars(&mut kbimg)?; @@ -32,7 +32,7 @@ impl CreateImage for DockerInfo { if self.image_type == "vm-docker" { // kbimg.sh gen_init_part(&mut kbimg)?; - gen_create_img(&mut kbimg, false)?; + gen_create_img(&mut kbimg, false, &config)?; gen_create_vm_docker_img(&mut kbimg)?; } else { diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index ce21850e..c7649f99 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -83,7 +83,7 @@ impl CreateImage for RepoInfo { gen_bootloader(&mut bootloader, self.arch.as_ref().unwrap(), self.legacy_bios)?; // kbimg.sh gen_init_part(&mut kbimg)?; - gen_create_img(&mut kbimg, self.legacy_bios)?; + gen_create_img(&mut kbimg, self.legacy_bios, &config)?; gen_create_vm_repo_img(&mut kbimg)?; } else if self.image_type == "pxe-repo" { diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index b32d1ff6..43e5a66b 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -12,7 +12,6 @@ r#"#!/bin/bash set -ex -IMG_SIZE=20 SCRIPTS_DIR=$(cd "$(dirname "$0")" && pwd) LOCK="${{SCRIPTS_DIR}}/test.lock" RPM_ROOT="${{SCRIPTS_DIR}}/rootfs" @@ -391,30 +390,49 @@ r#"function create_os_tar_from_repo() {{ Ok(()) } -pub(crate) fn gen_create_img(file: &mut File, legacy_bios: bool) -> Result<()> { +pub(crate) fn gen_create_img(file: &mut File, legacy_bios: bool, config: &Config) -> Result<()> { + let mut first: u32 = 60; + let mut second: u32 = 2100; + let mut third: u32 = 2100; + let mut img_size: u32 = 20; + if let Some(disk_partition) = &config.disk_partition { + first = disk_partition.first; + second = disk_partition.second; + third = disk_partition.third; + img_size = disk_partition.img_size; + if first + second + third + 2100 > img_size * 1024 { + bail!("Image size({}G) is not enough for partitions, please check input", img_size) + } + } + second += first; + third += second; + writeln!(file, r#"function create_img() {{ rm -f "${{SCRIPTS_DIR}}"/system.img "${{SCRIPTS_DIR}}"/update.img - qemu-img create "${{SCRIPTS_DIR}}"/system.img ${{IMG_SIZE}}G"#)?; + qemu-img create "${{SCRIPTS_DIR}}"/system.img {}G"#, img_size)?; if legacy_bios { writeln!(file, r#" local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/grub2 parted "${{SCRIPTS_DIR}}"/system.img -s mklabel msdos - parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 1MiB 60MiB"#)?; + parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 1MiB {}MiB"#, first)?; } else { writeln!(file, r#" local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/efi parted "${{SCRIPTS_DIR}}"/system.img -s mklabel gpt - parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary fat32 1MiB 60MiB"#)?; + parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary fat32 1MiB {}MiB"#, first)?; } writeln!(file, -r#" parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 60MiB 2160MiB - parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 2160MiB 4260MiB - parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 4260MiB 100% - local device +r#" parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext {}MiB {}MiB + parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 {}MiB {}MiB + parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 {}MiB 100%"#, + first, second, second, third, third)?; + + writeln!(file, +r#" local device device=$(losetup -f) losetup "${{device}}" "${{SCRIPTS_DIR}}"/system.img diff --git a/ztest/myscript.sh b/ztest/myscript.sh deleted file mode 100644 index 2c263d4a..00000000 --- a/ztest/myscript.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -echo "11111" \ No newline at end of file -- Gitee From 20af166a783cc6101980f1fa37fd9c514189dcbe Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 20 Aug 2024 10:38:01 +0800 Subject: [PATCH 077/116] fix spell error --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 43e5a66b..de9e653d 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -350,7 +350,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ r#" cp -r "${{SCRIPTS_DIR}}"/00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules.d/ cp "${{SCRIPTS_DIR}}"/set_in_chroot.sh "${{RPM_ROOT}}" - #(optional) custom config"#)?; + # (optional) custom config"#)?; if let Some(_) = &config.copy_files { writeln!(file, "\tcopy_files\n")?; @@ -426,7 +426,7 @@ r#" local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/efi } writeln!(file, -r#" parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext {}MiB {}MiB +r#" parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 {}MiB {}MiB parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 {}MiB {}MiB parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 {}MiB 100%"#, first, second, second, third, third)?; -- Gitee From c7a9f78176ad49a65a786f0a327034d283d0b2e8 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 20 Aug 2024 11:08:11 +0800 Subject: [PATCH 078/116] persist mkdir --- KubeOS-Rust/kbimg/kbimg.toml | 5 ++++- KubeOS-Rust/kbimg/src/commands.rs | 6 ++++++ KubeOS-Rust/kbimg/src/scripts_gen.rs | 30 ++++++++++++++++------------ 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index c4cb99f7..cc074b8f 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -71,4 +71,7 @@ docker_img = "" first = 100 second = 2500 third = 2300 -img_size = 30 \ No newline at end of file +img_size = 30 + +[persist_mkdir] +name = ["opt", "optwork"] \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index 254da73e..5ec31110 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -125,6 +125,7 @@ pub struct Config { pub systemd_service: Option, pub chroot_script: Option, pub disk_partition: Option, + pub persist_mkdir: Option, } #[derive(Deserialize, Debug, Clone)] @@ -162,4 +163,9 @@ pub struct DiskPartition { pub second: u32, pub third: u32, pub img_size: u32, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct PersistMkdir { + pub name: Vec, } \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index de9e653d..cad9cc1a 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -391,21 +391,19 @@ r#"function create_os_tar_from_repo() {{ } pub(crate) fn gen_create_img(file: &mut File, legacy_bios: bool, config: &Config) -> Result<()> { - let mut first: u32 = 60; - let mut second: u32 = 2100; - let mut third: u32 = 2100; - let mut img_size: u32 = 20; - if let Some(disk_partition) = &config.disk_partition { - first = disk_partition.first; - second = disk_partition.second; - third = disk_partition.third; - img_size = disk_partition.img_size; + let (first, second, third, img_size) = if let Some(disk_partition) = &config.disk_partition { + let first = disk_partition.first; + let second = disk_partition.second; + let third = disk_partition.third; + let img_size = disk_partition.img_size; if first + second + third + 2100 > img_size * 1024 { bail!("Image size({}G) is not enough for partitions, please check input", img_size) } + (first, first + second, first + second + third, img_size) } - second += first; - third += second; + else { + (60, 2160, 4260, 20) + }; writeln!(file, r#"function create_img() {{ @@ -473,8 +471,14 @@ r#" sync umount "${{TMP_MOUNT_PATH}}" init_part "${{SCRIPTS_DIR}}"/system.img4 PERSIST "${{TMP_MOUNT_PATH}}" - mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}} - mkdir -p "${{TMP_MOUNT_PATH}}"/etc/KubeOS/certs + mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}}"#)?; + + if let Some(persist_mkdir) = &config.persist_mkdir { + writeln!(file, r#"mkdir "${{TMP_MOUNT_PATH}}"/{{{}}}"#, persist_mkdir.name.join(","))?; + } + + writeln!(file, +r#" mkdir -p "${{TMP_MOUNT_PATH}}"/etc/KubeOS/certs umount "${{TMP_MOUNT_PATH}}" losetup -D -- Gitee From ffa36125a421388bdc9d4f4771320d3ae22a9ff9 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 20 Aug 2024 11:09:44 +0800 Subject: [PATCH 079/116] fix space --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index cad9cc1a..e2412f0f 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -474,7 +474,7 @@ r#" sync mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}}"#)?; if let Some(persist_mkdir) = &config.persist_mkdir { - writeln!(file, r#"mkdir "${{TMP_MOUNT_PATH}}"/{{{}}}"#, persist_mkdir.name.join(","))?; + writeln!(file, "\tmkdir \"${{TMP_MOUNT_PATH}}\"/{{{}}}", persist_mkdir.name.join(","))?; } writeln!(file, -- Gitee From ebd5b3ea2821b87030303376e606b8d629501c37 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 21 Aug 2024 11:10:42 +0800 Subject: [PATCH 080/116] mount one disk one partition --- KubeOS-Rust/kbimg/kbimg.toml | 18 +++--- KubeOS-Rust/kbimg/src/commands.rs | 7 +++ KubeOS-Rust/kbimg/src/scripts_gen.rs | 83 ++++++++++++++++++++-------- 3 files changed, 79 insertions(+), 29 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index cc074b8f..58325b67 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -67,11 +67,15 @@ docker_img = "" # [chroot_script] # path = "../../ztest/myscript.sh" -[disk_partition] -first = 100 -second = 2500 -third = 2300 -img_size = 30 +# [disk_partition] +# first = 100 +# second = 2500 +# third = 2300 +# img_size = 30 -[persist_mkdir] -name = ["opt", "optwork"] \ No newline at end of file +# [persist_mkdir] +# name = ["opt", "optwork"] + +[mount_disk] +dev_name="/dev/sd3" +mnt_point="/disk3" \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index 5ec31110..5f4c56fa 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -126,6 +126,7 @@ pub struct Config { pub chroot_script: Option, pub disk_partition: Option, pub persist_mkdir: Option, + pub mount_disk: Option, } #[derive(Deserialize, Debug, Clone)] @@ -168,4 +169,10 @@ pub struct DiskPartition { #[derive(Deserialize, Debug, Clone)] pub struct PersistMkdir { pub name: Vec, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct MountDisk { + pub dev_name: String, + pub mnt_point: String, } \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index e2412f0f..f318f6e5 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -390,7 +390,38 @@ r#"function create_os_tar_from_repo() {{ Ok(()) } +pub(crate) fn gen_mount_disk(file: &mut File, legacy_bios: bool, mount_disk: &MountDisk) -> Result<()> { + let dev_name = &mount_disk.dev_name; + let mnt_point = &mount_disk.mnt_point; + writeln!(file, +r#"function mount_disk() {{ + if [ ! -b "{}" ]; then + echo "Disk {} not found" + exit 5 + fi + mkdir -p "${{TMP_MOUNT_PATH}}{}""#, + dev_name, dev_name, mnt_point)?; + if legacy_bios { + writeln!(file, "\tparted {} -s mklabel msdos", dev_name)?; + } + else { + writeln!(file, "\tparted {} -s mklabel gpt", dev_name)?; + } + writeln!(file, +r#" parted {} -s mkpart primary ext4 1MiB 100% + mkfs.ext4 "{}1" + mount "{}1" "{}" +}} +"#, + dev_name, dev_name, dev_name, mnt_point)?; + Ok(()) +} + pub(crate) fn gen_create_img(file: &mut File, legacy_bios: bool, config: &Config) -> Result<()> { + if let Some(mount_disk) = &config.mount_disk { + gen_mount_disk(file, legacy_bios, mount_disk)?; + } + let (first, second, third, img_size) = if let Some(disk_partition) = &config.disk_partition { let first = disk_partition.first; let second = disk_partition.second; @@ -407,44 +438,44 @@ pub(crate) fn gen_create_img(file: &mut File, legacy_bios: bool, config: &Config writeln!(file, r#"function create_img() {{ - rm -f "${{SCRIPTS_DIR}}"/system.img "${{SCRIPTS_DIR}}"/update.img - qemu-img create "${{SCRIPTS_DIR}}"/system.img {}G"#, img_size)?; + rm -f "${{SCRIPTS_DIR}}"/system.img "${{SCRIPTS_DIR}}/update.img" + qemu-img create "${{SCRIPTS_DIR}}/system.img" {}G"#, img_size)?; if legacy_bios { writeln!(file, r#" local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/grub2 - parted "${{SCRIPTS_DIR}}"/system.img -s mklabel msdos - parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 1MiB {}MiB"#, first)?; + parted "${{SCRIPTS_DIR}}/system.img" -s mklabel msdos + parted "${{SCRIPTS_DIR}}/system.img" -s mkpart primary ext4 1MiB {}MiB"#, first)?; } else { writeln!(file, r#" local BOOT_PATH=${{TMP_MOUNT_PATH}}/boot/efi - parted "${{SCRIPTS_DIR}}"/system.img -s mklabel gpt - parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary fat32 1MiB {}MiB"#, first)?; + parted "${{SCRIPTS_DIR}}/system.img" -s mklabel gpt + parted "${{SCRIPTS_DIR}}/system.img" -s mkpart primary fat32 1MiB {}MiB"#, first)?; } writeln!(file, -r#" parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 {}MiB {}MiB - parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 {}MiB {}MiB - parted "${{SCRIPTS_DIR}}"/system.img -s mkpart primary ext4 {}MiB 100%"#, +r#" parted "${{SCRIPTS_DIR}}/system.img" -s mkpart primary ext4 {}MiB {}MiB + parted "${{SCRIPTS_DIR}}/system.img" -s mkpart primary ext4 {}MiB {}MiB + parted "${{SCRIPTS_DIR}}/system.img" -s mkpart primary ext4 {}MiB 100%"#, first, second, second, third, third)?; writeln!(file, r#" local device device=$(losetup -f) - losetup "${{device}}" "${{SCRIPTS_DIR}}"/system.img + losetup "${{device}}" "${{SCRIPTS_DIR}}/system.img" mkdir -p "${{TMP_MOUNT_PATH}}" - init_part "${{SCRIPTS_DIR}}"/system.img2 ROOT-A "${{TMP_MOUNT_PATH}}" + init_part "${{SCRIPTS_DIR}}/system.img2" ROOT-A "${{TMP_MOUNT_PATH}}" mkdir -p "${{BOOT_PATH}}" chmod 755 "${{BOOT_PATH}}""#)?; if legacy_bios { writeln!(file, -r#" init_part "${{SCRIPTS_DIR}}"/system.img1 GRUB2 "${{BOOT_PATH}}" - tar -x -C "${{TMP_MOUNT_PATH}}" -f "${{SCRIPTS_DIR}}"/os.tar +r#" init_part "${{SCRIPTS_DIR}}/system.img1" GRUB2 "${{BOOT_PATH}}" + tar -x -C "${{TMP_MOUNT_PATH}}" -f "${{SCRIPTS_DIR}}/os.tar" sed -i "s/insmod part_gpt/insmod part_msdos/g; \ s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ @@ -452,8 +483,8 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ } else { writeln!(file, -r#" init_part "${{SCRIPTS_DIR}}"/system.img1 BOOT "${{BOOT_PATH}}" - tar -x -C "${{TMP_MOUNT_PATH}}" -f "${{SCRIPTS_DIR}}"/os.tar"#)?; +r#" init_part "${{SCRIPTS_DIR}}/system.img1" BOOT "${{BOOT_PATH}}" + tar -x -C "${{TMP_MOUNT_PATH}}" -f "${{SCRIPTS_DIR}}/os.tar""#)?; } writeln!(file, @@ -464,13 +495,13 @@ r#" sync rm -rf "${{TMP_MOUNT_PATH}}/bootloader.sh" sync - dd if=/dev/disk/by-label/ROOT-A of="${{SCRIPTS_DIR}}"/update.img bs=8M + dd if=/dev/disk/by-label/ROOT-A of="${{SCRIPTS_DIR}}/update.img" bs=8M sync unmount_dir "${{TMP_MOUNT_PATH}}" - init_part "${{SCRIPTS_DIR}}"/system.img3 ROOT-B "${{TMP_MOUNT_PATH}}" + init_part "${{SCRIPTS_DIR}}/system.img3" ROOT-B "${{TMP_MOUNT_PATH}}" umount "${{TMP_MOUNT_PATH}}" - init_part "${{SCRIPTS_DIR}}"/system.img4 PERSIST "${{TMP_MOUNT_PATH}}" + init_part "${{SCRIPTS_DIR}}/system.img4" PERSIST "${{TMP_MOUNT_PATH}}" mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}}"#)?; if let Some(persist_mkdir) = &config.persist_mkdir { @@ -478,12 +509,20 @@ r#" sync } writeln!(file, -r#" mkdir -p "${{TMP_MOUNT_PATH}}"/etc/KubeOS/certs +r#" mkdir -p "${{TMP_MOUNT_PATH}}/etc/KubeOS/certs" umount "${{TMP_MOUNT_PATH}}" - losetup -D - parted "${{SCRIPTS_DIR}}"/system.img -- set 1 boot on - qemu-img convert "${{SCRIPTS_DIR}}"/system.img -O qcow2 "${{SCRIPTS_DIR}}"/system.qcow2 + # (optional) custom config +"#)?; + + if let Some(_) = &config.mount_disk { + writeln!(file, "\tmount_disk")?; + } + + writeln!(file, +r#" losetup -D + parted "${{SCRIPTS_DIR}}/system.img" -- set 1 boot on + qemu-img convert "${{SCRIPTS_DIR}}/system.img" -O qcow2 "${{SCRIPTS_DIR}}/system.qcow2" }} "# )?; -- Gitee From 75f1b9308ebb74083b6ed507850866eb536d0592 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 21 Aug 2024 14:12:17 +0800 Subject: [PATCH 081/116] set -e; write to writeln --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 2 +- KubeOS-Rust/kbimg/src/utils.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index f318f6e5..df4c678e 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -10,7 +10,7 @@ pub(crate) fn gen_global_vars(file: &mut File) -> Result<()> { writeln!(file, r#"#!/bin/bash -set -ex +set -e SCRIPTS_DIR=$(cd "$(dirname "$0")" && pwd) LOCK="${{SCRIPTS_DIR}}/test.lock" diff --git a/KubeOS-Rust/kbimg/src/utils.rs b/KubeOS-Rust/kbimg/src/utils.rs index de5c1d6d..107d1372 100644 --- a/KubeOS-Rust/kbimg/src/utils.rs +++ b/KubeOS-Rust/kbimg/src/utils.rs @@ -20,7 +20,7 @@ pub(crate) fn execute_scripts(script: PathBuf) -> anyhow::Result<()> { // let mut file = File::create(file_name)?; // // set permissions based on regulation // for line in scripts { -// write!(file, "{}", line)?; +// writeln!(file, "{}", line)?; // } // Ok(()) // } -- Gitee From e9413aa38463215348be4956053de56180448d58 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 21 Aug 2024 14:38:32 +0800 Subject: [PATCH 082/116] double qoutes only for variables --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 84 ++++++++++++++-------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index df4c678e..b7531946 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -13,9 +13,9 @@ r#"#!/bin/bash set -e SCRIPTS_DIR=$(cd "$(dirname "$0")" && pwd) -LOCK="${{SCRIPTS_DIR}}/test.lock" -RPM_ROOT="${{SCRIPTS_DIR}}/rootfs" -TMP_MOUNT_PATH="${{SCRIPTS_DIR}}/mnt" +LOCK="${{SCRIPTS_DIR}}"/test.lock +RPM_ROOT="${{SCRIPTS_DIR}}"/rootfs +TMP_MOUNT_PATH="${{SCRIPTS_DIR}}"/mnt "# )?; Ok(()) @@ -102,10 +102,10 @@ pub(crate) fn gen_mount_proc_dev_sys(file: &mut File) -> Result<()> { writeln!(file, r#"function mount_proc_dev_sys() {{ local tmp_root=$1 - mount -t proc none "${{tmp_root}}/proc" - mount --bind /dev "${{tmp_root}}/dev" - mount --bind /dev/pts "${{tmp_root}}/dev/pts" - mount -t sysfs none "${{tmp_root}}/sys" + mount -t proc none "${{tmp_root}}"/proc + mount --bind /dev "${{tmp_root}}"/dev + mount --bind /dev/pts "${{tmp_root}}"/dev/pts + mount -t sysfs none "${{tmp_root}}"/sys }} "# )?; @@ -197,7 +197,7 @@ r#"function prepare_yum() {{ mkdir -p "${{RPM_ROOT}}"{{/etc/yum.repos.d,/persist,/proc,/dev/pts,/sys}} mount_proc_dev_sys "${{RPM_ROOT}}" # init yum repo - local iso_repo="${{RPM_ROOT}}/etc/yum.repos.d/iso.repo" + local iso_repo="${{RPM_ROOT}}"/etc/yum.repos.d/iso.repo cat "${{REPO_PATH}}" > "$iso_repo" }} "# @@ -254,7 +254,7 @@ r#" yum -y --installroot="${{RPM_ROOT}}" clean all } pub(crate) fn gen_copy_files(file: &mut File, copy_files: &Vec) -> Result<()> { - writeln!(file, r#"function copy_files() {{"#)?; + writeln!(file, "function copy_files() {{")?; for copy_file in copy_files { writeln!(file, "\tcp \"{}\" \"${{RPM_ROOT}}{}\"", copy_file.src, copy_file.dst)?; } @@ -277,8 +277,8 @@ r#"function grub_config() {{ writeln!(file, r#" local GRUB_PASSWD GRUB_PASSWD=$(echo -e "{}\n{}" | grub2-mkpasswd-pbkdf2 | grep PBKDF2 | awk '{{print $7}}') - echo "GRUB2_PASSWD=${{GRUB_PASSWD}}" > "${{GRUB_PATH}}/user.cfg" - chmod 600 "${{GRUB_PATH}}/user.cfg" + echo "GRUB2_PASSWD=${{GRUB_PASSWD}}" > "${{GRUB_PATH}}"/user.cfg + chmod 600 "${{GRUB_PATH}}"/user.cfg }} "#, grub_passwd, grub_passwd)?; @@ -318,20 +318,20 @@ pub(crate) fn gen_install_misc(file: &mut File, legacy_bios: bool, config: &Conf writeln!(file, r#"function install_misc() {{ - local DNS_CONF="${{SCRIPTS_DIR}}/resolv.conf" - cp "${{SCRIPTS_DIR}}"/misc-files/*mount "${{SCRIPTS_DIR}}"/misc-files/os-agent.service "${{RPM_ROOT}}/usr/lib/systemd/system/" - cp "${{SCRIPTS_DIR}}"/misc-files/os-release "${{RPM_ROOT}}/usr/lib/" - cp "${{AGENT_PATH}}" "${{RPM_ROOT}}/usr/bin" - rm "${{RPM_ROOT}}/etc/os-release" + local DNS_CONF="${{SCRIPTS_DIR}}"/resolv.conf + cp "${{SCRIPTS_DIR}}"/misc-files/*mount "${{SCRIPTS_DIR}}"/misc-files/os-agent.service "${{RPM_ROOT}}"/usr/lib/systemd/system/ + cp "${{SCRIPTS_DIR}}"/misc-files/os-release "${{RPM_ROOT}}"/usr/lib/ + cp "${{AGENT_PATH}}" "${{RPM_ROOT}}"/usr/bin + rm "${{RPM_ROOT}}"/etc/os-release - cat < "${{RPM_ROOT}}/usr/lib/os-release" + cat < "${{RPM_ROOT}}"/usr/lib/os-release NAME=${{NAME}} ID=${{NAME}} EOF - echo "PRETTY_NAME=\"${{NAME}} ${{VERSION}}\"" >> "${{RPM_ROOT}}/usr/lib/os-release" - echo "VERSION_ID=${{VERSION}}" >> "${{RPM_ROOT}}/usr/lib/os-release" - mv "${{RPM_ROOT}}"/boot/vmlinuz* "${{RPM_ROOT}}/boot/vmlinuz" - mv "${{RPM_ROOT}}"/boot/initramfs* "${{RPM_ROOT}}/boot/initramfs.img""#)?; + echo "PRETTY_NAME=\"${{NAME}} ${{VERSION}}\"" >> "${{RPM_ROOT}}"/usr/lib/os-release + echo "VERSION_ID=${{VERSION}}" >> "${{RPM_ROOT}}"/usr/lib/os-release + mv "${{RPM_ROOT}}"/boot/vmlinuz* "${{RPM_ROOT}}"/boot/vmlinuz + mv "${{RPM_ROOT}}"/boot/initramfs* "${{RPM_ROOT}}"/boot/initramfs.img"#)?; if legacy_bios { writeln!(file, @@ -366,7 +366,7 @@ r#" cp -r "${{SCRIPTS_DIR}}"/00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules. r#" ROOT_PASSWD="${{ROOT_PASSWD}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{RPM_ROOT}}" bash /set_in_chroot.sh rm "${{RPM_ROOT}}/set_in_chroot.sh" if [ -e "${{DNS_CONF}}" ]; then - cp "${{DNS_CONF}}" "${{RPM_ROOT}}/etc/resolv.conf" + cp "${{DNS_CONF}}" "${{RPM_ROOT}}"/etc/resolv.conf fi }} "# @@ -463,19 +463,19 @@ r#" parted "${{SCRIPTS_DIR}}/system.img" -s mkpart primary ext4 {}MiB {}MiB writeln!(file, r#" local device device=$(losetup -f) - losetup "${{device}}" "${{SCRIPTS_DIR}}/system.img" + losetup "${{device}}" "${{SCRIPTS_DIR}}"/system.img mkdir -p "${{TMP_MOUNT_PATH}}" - init_part "${{SCRIPTS_DIR}}/system.img2" ROOT-A "${{TMP_MOUNT_PATH}}" + init_part "${{SCRIPTS_DIR}}"/system.img2 ROOT-A "${{TMP_MOUNT_PATH}}" mkdir -p "${{BOOT_PATH}}" chmod 755 "${{BOOT_PATH}}""#)?; if legacy_bios { writeln!(file, -r#" init_part "${{SCRIPTS_DIR}}/system.img1" GRUB2 "${{BOOT_PATH}}" - tar -x -C "${{TMP_MOUNT_PATH}}" -f "${{SCRIPTS_DIR}}/os.tar" +r#" init_part "${{SCRIPTS_DIR}}"/system.img1 GRUB2 "${{BOOT_PATH}}" + tar -x -C "${{TMP_MOUNT_PATH}}" -f "${{SCRIPTS_DIR}}"/os.tar sed -i "s/insmod part_gpt/insmod part_msdos/g; \ s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ @@ -483,8 +483,8 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ } else { writeln!(file, -r#" init_part "${{SCRIPTS_DIR}}/system.img1" BOOT "${{BOOT_PATH}}" - tar -x -C "${{TMP_MOUNT_PATH}}" -f "${{SCRIPTS_DIR}}/os.tar""#)?; +r#" init_part "${{SCRIPTS_DIR}}"/system.img1 BOOT "${{BOOT_PATH}}" + tar -x -C "${{TMP_MOUNT_PATH}}" -f "${{SCRIPTS_DIR}}"/os.tar"#)?; } writeln!(file, @@ -492,16 +492,16 @@ r#" sync cp "${{SCRIPTS_DIR}}"/bootloader.sh "${{TMP_MOUNT_PATH}}" mount_proc_dev_sys "${{TMP_MOUNT_PATH}}" DEVICE="${{device}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{TMP_MOUNT_PATH}}" bash bootloader.sh - rm -rf "${{TMP_MOUNT_PATH}}/bootloader.sh" + rm -rf "${{TMP_MOUNT_PATH}}"/bootloader.sh sync - dd if=/dev/disk/by-label/ROOT-A of="${{SCRIPTS_DIR}}/update.img" bs=8M + dd if=/dev/disk/by-label/ROOT-A of="${{SCRIPTS_DIR}}"/update.img bs=8M sync unmount_dir "${{TMP_MOUNT_PATH}}" - init_part "${{SCRIPTS_DIR}}/system.img3" ROOT-B "${{TMP_MOUNT_PATH}}" + init_part "${{SCRIPTS_DIR}}"/system.img3 ROOT-B "${{TMP_MOUNT_PATH}}" umount "${{TMP_MOUNT_PATH}}" - init_part "${{SCRIPTS_DIR}}/system.img4" PERSIST "${{TMP_MOUNT_PATH}}" + init_part "${{SCRIPTS_DIR}}"/system.img4 PERSIST "${{TMP_MOUNT_PATH}}" mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}}"#)?; if let Some(persist_mkdir) = &config.persist_mkdir { @@ -509,7 +509,7 @@ r#" sync } writeln!(file, -r#" mkdir -p "${{TMP_MOUNT_PATH}}/etc/KubeOS/certs" +r#" mkdir -p "${{TMP_MOUNT_PATH}}"/etc/KubeOS/certs umount "${{TMP_MOUNT_PATH}}" # (optional) custom config @@ -521,8 +521,8 @@ r#" mkdir -p "${{TMP_MOUNT_PATH}}/etc/KubeOS/certs" writeln!(file, r#" losetup -D - parted "${{SCRIPTS_DIR}}/system.img" -- set 1 boot on - qemu-img convert "${{SCRIPTS_DIR}}/system.img" -O qcow2 "${{SCRIPTS_DIR}}/system.qcow2" + parted "${{SCRIPTS_DIR}}"/system.img -- set 1 boot on + qemu-img convert "${{SCRIPTS_DIR}}"/system.img -O qcow2 "${{SCRIPTS_DIR}}"/system.qcow2 }} "# )?; @@ -672,7 +672,7 @@ create_admin_img"# /* region: set_in_chroot.sh */ pub(crate) fn gen_add_users(file: &mut File, users: &Vec) -> Result<()> { - writeln!(file, r#"# add users"#)?; + writeln!(file, "# add users")?; for user in users { let name = &user.name; let passwd = &user.passwd; @@ -687,13 +687,13 @@ r#"if ! getent group "{}" > /dev/null 2>&1; then fi"#, group, group)?; } - write!(file, r#"useradd -m -g "{}""#, &groups[0])?; + write!(file, "useradd -m -g {}", &groups[0])?; if groups.len() > 1 { let additional_groups = &groups[1..].join(","); - write!(file, r#" -G {}"#, additional_groups)?; + write!(file, " -G {}", additional_groups)?; } - writeln!(file, r#" -s /bin/bash "{}""#, &name)?; - writeln!(file, r#"echo "{}:{}" | chpasswd"#, name, passwd)?; + writeln!(file, " -s /bin/bash \"{}\"", &name)?; + writeln!(file, "echo \"{}:{}\" | chpasswd", name, passwd)?; if let Some(sudo) = &user.sudo { writeln!(file, r#"if visudo -c; then @@ -709,10 +709,10 @@ fi"#, } pub(crate) fn gen_systemd_services(file: &mut File, systemd_services: &SystemdService) -> Result<()> { - writeln!(file, r#"# systemd services"#)?; + writeln!(file, "# systemd services")?; let services_name = &systemd_services.name; for service_name in services_name { - writeln!(file, r#"systemctl enable {}"#, service_name)?; + writeln!(file, "systemctl enable {}", service_name)?; } Ok(()) } -- Gitee From ce5c2c3427e6ddf3d4e37f89f6ad434169ff2052 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 21 Aug 2024 15:11:35 +0800 Subject: [PATCH 083/116] remove mount disk --- KubeOS-Rust/kbimg/kbimg.toml | 4 --- KubeOS-Rust/kbimg/src/commands.rs | 7 ----- KubeOS-Rust/kbimg/src/scripts_gen.rs | 41 +--------------------------- 3 files changed, 1 insertion(+), 51 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index 58325b67..a6605676 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -75,7 +75,3 @@ docker_img = "" # [persist_mkdir] # name = ["opt", "optwork"] - -[mount_disk] -dev_name="/dev/sd3" -mnt_point="/disk3" \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index 5f4c56fa..2828a5a6 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -126,7 +126,6 @@ pub struct Config { pub chroot_script: Option, pub disk_partition: Option, pub persist_mkdir: Option, - pub mount_disk: Option, } #[derive(Deserialize, Debug, Clone)] @@ -170,9 +169,3 @@ pub struct DiskPartition { pub struct PersistMkdir { pub name: Vec, } - -#[derive(Deserialize, Debug, Clone)] -pub struct MountDisk { - pub dev_name: String, - pub mnt_point: String, -} \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index b7531946..a8852108 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -390,38 +390,7 @@ r#"function create_os_tar_from_repo() {{ Ok(()) } -pub(crate) fn gen_mount_disk(file: &mut File, legacy_bios: bool, mount_disk: &MountDisk) -> Result<()> { - let dev_name = &mount_disk.dev_name; - let mnt_point = &mount_disk.mnt_point; - writeln!(file, -r#"function mount_disk() {{ - if [ ! -b "{}" ]; then - echo "Disk {} not found" - exit 5 - fi - mkdir -p "${{TMP_MOUNT_PATH}}{}""#, - dev_name, dev_name, mnt_point)?; - if legacy_bios { - writeln!(file, "\tparted {} -s mklabel msdos", dev_name)?; - } - else { - writeln!(file, "\tparted {} -s mklabel gpt", dev_name)?; - } - writeln!(file, -r#" parted {} -s mkpart primary ext4 1MiB 100% - mkfs.ext4 "{}1" - mount "{}1" "{}" -}} -"#, - dev_name, dev_name, dev_name, mnt_point)?; - Ok(()) -} - pub(crate) fn gen_create_img(file: &mut File, legacy_bios: bool, config: &Config) -> Result<()> { - if let Some(mount_disk) = &config.mount_disk { - gen_mount_disk(file, legacy_bios, mount_disk)?; - } - let (first, second, third, img_size) = if let Some(disk_partition) = &config.disk_partition { let first = disk_partition.first; let second = disk_partition.second; @@ -512,15 +481,7 @@ r#" sync r#" mkdir -p "${{TMP_MOUNT_PATH}}"/etc/KubeOS/certs umount "${{TMP_MOUNT_PATH}}" - # (optional) custom config -"#)?; - - if let Some(_) = &config.mount_disk { - writeln!(file, "\tmount_disk")?; - } - - writeln!(file, -r#" losetup -D + losetup -D parted "${{SCRIPTS_DIR}}"/system.img -- set 1 boot on qemu-img convert "${{SCRIPTS_DIR}}"/system.img -O qcow2 "${{SCRIPTS_DIR}}"/system.qcow2 }} -- Gitee From ad59748605d44b3af24d631101e1fb4d062977fc Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 23 Aug 2024 10:31:31 +0800 Subject: [PATCH 084/116] example of disk and volume mount --- KubeOS-Rust/kbimg/src/repo.rs | 4 ++ KubeOS-Rust/kbimg/src/scripts_gen.rs | 56 ++++++++++++++++++++++++++++ KubeOS-Rust/kbimg/src/values.rs | 2 + 3 files changed, 62 insertions(+) diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index c7649f99..68254163 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -58,6 +58,10 @@ impl CreateImage for RepoInfo { gen_persist_mount(&mut persist_mount)?; let mut var_mount = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_VAR_MOUNT))?; gen_var_mount(&mut var_mount)?; + let mut disk_mount = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_DISK_EXAMPLE_MOUNT))?; + gen_disk_example_mount(&mut disk_mount)?; + let mut volume_mount = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_VOLUME_EXAMPLE_MOUNT))?; + gen_volume_example_mount(&mut volume_mount)?; } Err(e) => { bail!(e); diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index a8852108..f2b0d5a0 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -944,6 +944,7 @@ fi /* endregion */ /* region: 00bootup */ +// 00bootup/global.cfg pub(crate) fn gen_global_cfg(file: &mut File, pxe_config: &BootupConfig) -> Result<()> { writeln!(file, r#"# rootfs file name @@ -974,6 +975,7 @@ net_name={} Ok(()) } +// 00bootup/module-setup.sh pub(crate) fn gen_module_setup(file: &mut File) -> Result<()> { writeln!(file, r#"#!/bin/bash @@ -1002,6 +1004,7 @@ installkernel() {{ Ok(()) } +// 00bootup/mount.sh pub(crate) fn gen_mount(file: &mut File) -> Result<()> { writeln!(file, r#"#!/bin/bash @@ -1396,6 +1399,7 @@ CMD ["/bin/sh"] /* endregion */ /* region: admin-container */ +// admin-container/dockerfile pub(crate) fn gen_admin_dockerfile(file: &mut File) -> Result<()> { writeln!(file, r#"FROM openeuler-22.03-lts @@ -1420,6 +1424,7 @@ CMD ["/usr/lib/sysmaster/init"] Ok(()) } +// admin-container/set-ssh-pub-key.service pub(crate) fn gen_set_ssh_pub_key_service(file: &mut File) -> Result<()> { writeln!(file, r#"[Unit] @@ -1432,6 +1437,7 @@ ExecStart="/usr/local/bin/set-ssh-pub-key.sh" Ok(()) } +// admin-container/set-ssh-pub-key.sh pub(crate) fn gen_set_ssh_pub_key(file: &mut File) -> Result<()> { writeln!(file, r#"ssh_pub=$(cat /etc/secret-volume/ssh-pub-key) @@ -1456,6 +1462,7 @@ echo "$ssh_pub" >> "$authorized_file" /* endregion */ /* region: misc-files */ +// misc-files/boot-efi.mount pub(crate) fn gen_boot_efi_mount(file: &mut File) -> Result<()> { writeln!(file, r#"[Unit] @@ -1477,6 +1484,7 @@ WantedBy=local-fs.target Ok(()) } +// misc-files/boot-grub2.mount pub(crate) fn gen_boot_grub2_mount(file: &mut File) -> Result<()> { writeln!(file, r#"[Unit] @@ -1498,6 +1506,7 @@ WantedBy=local-fs.target Ok(()) } +// misc-files/etc.mount pub(crate) fn gen_etc_mount(file: &mut File) -> Result<()> { writeln!(file, r#"[Unit] @@ -1521,6 +1530,7 @@ WantedBy=local-fs.target Ok(()) } +// misc-files/os-agent.service pub(crate) fn gen_os_agent_service(file: &mut File) -> Result<()> { writeln!(file, r#"[Unit] @@ -1539,6 +1549,7 @@ WantedBy=multi-user.target Ok(()) } +// misc-files/os-release pub(crate) fn gen_os_release(file: &mut File) -> Result<()> { writeln!(file, r#"NAME=KubeOS @@ -1548,6 +1559,7 @@ ID=KubeOS Ok(()) } +// misc-files/persist.mount pub(crate) fn gen_persist_mount(file: &mut File) -> Result<()> { writeln!(file, r#"[Unit] @@ -1569,6 +1581,7 @@ WantedBy=local-fs.target Ok(()) } +// misc-files/var.mount pub(crate) fn gen_var_mount(file: &mut File) -> Result<()> { writeln!(file, r#"[Unit] @@ -1591,4 +1604,47 @@ WantedBy=local-fs.target )?; Ok(()) } + +// misc-files/disk.mount +pub(crate) fn gen_disk_example_mount(file: &mut File) -> Result<()> { + writeln!(file, +r#"[Unit] +Description=Mount Disk +Documentation=man:systemd.mount(5) +After=local-fs.target + +[Mount] +What=/dev/sda1 +Where=/mnt/data +Type=ext4 +Options=defaults,noatime + +[Install] +WantedBy=multi-user.target +"# + )?; + Ok(()) +} + +// misc-files/volume.mount +pub(crate) fn gen_volume_example_mount(file: &mut File) -> Result<()> { + writeln!(file, +r#"[Unit] +Description=Mount Logical Volume +Documentation=man:systemd.mount(5) +After=lvm2.service +Requires=lvm2.service + +[Mount] +What=/dev/myvg/mylv +Where=/mnt/mydata +Type=ext4 +Options=defaults + +[Install] +WantedBy=multi-user.target +"# + )?; + Ok(()) +} /* endregion */ \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/values.rs b/KubeOS-Rust/kbimg/src/values.rs index b735e8f0..b7ef1ad5 100644 --- a/KubeOS-Rust/kbimg/src/values.rs +++ b/KubeOS-Rust/kbimg/src/values.rs @@ -48,3 +48,5 @@ pub(crate) const MISC_OS_AGENT_SERVICE: &str = "os-agent.service"; pub(crate) const MISC_OS_RELEASE: &str = "os-release"; pub(crate) const MISC_PERSIST_MOUNT: &str = "persist.mount"; pub(crate) const MISC_VAR_MOUNT: &str = "var.mount"; +pub(crate) const MISC_DISK_EXAMPLE_MOUNT: &str = "disk-example.mount"; +pub(crate) const MISC_VOLUME_EXAMPLE_MOUNT: &str = "volume-example.mount"; -- Gitee From 78e983794a2e1a99adc8a1cd0036f77c27f32f33 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 23 Aug 2024 14:51:38 +0800 Subject: [PATCH 085/116] modify doc --- KubeOS-Rust/kbimg/src/commands.rs | 20 +- KubeOS-Rust/kbimg/src/repo.rs | 6 +- KubeOS-Rust/kbimg/src/scripts_gen.rs | 47 --- KubeOS-Rust/kbimg/src/values.rs | 11 +- ...66\344\275\234\346\214\207\345\257\274.md" | 294 +++++++++++++----- 5 files changed, 238 insertions(+), 140 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/commands.rs b/KubeOS-Rust/kbimg/src/commands.rs index 2828a5a6..7db829c3 100644 --- a/KubeOS-Rust/kbimg/src/commands.rs +++ b/KubeOS-Rust/kbimg/src/commands.rs @@ -3,6 +3,8 @@ use std::path::PathBuf; use clap::{Args, Parser, Subcommand}; use serde::Deserialize; +use crate::values::{DISK, LOCAL_IP, NETMASK, NET_NAME, ROOTFS_NAME, ROUTE_IP, SERVER_IP}; + #[derive(Parser)] #[clap(name = "kbimg")] #[clap(author, version, about)] @@ -21,7 +23,7 @@ pub struct Cli { #[derive(Subcommand, Debug, Deserialize)] pub enum Commands { /// Create a new container image for upgrading KubeOS - #[clap(name = "upgrade-image")] + #[clap(name = "upgrade")] UpgradeImage(RepoInfo), /// Create a new KubeOS vm image from repo #[clap(name = "vm-repo")] @@ -54,7 +56,7 @@ pub struct RepoInfo { /// Required: Encrypted password for root user #[clap(short = 'e', long, value_parser)] pub root_passwd: String, - /// Required for upgrade-image + /// Required for upgrade #[clap(short = 'd', long, value_parser)] pub docker_img: Option, /// Required: RPM packages @@ -102,13 +104,13 @@ pub(crate) struct BootupConfig { impl BootupConfig { pub fn new() -> Self { BootupConfig { - rootfs_name: String::from("kubeos.tar"), - disk: String::from("/dev/sda"), - server_ip: String::from("192.168.1.50"), - local_ip: String::from("192.168.1.100"), - route_ip: String::from("192.168.1.1"), - netmask: String::from("255.255.255.0"), - net_name: String::from("eth0"), + rootfs_name: String::from(ROOTFS_NAME), + disk: String::from(DISK), + server_ip: String::from(SERVER_IP), + local_ip: String::from(LOCAL_IP), + route_ip: String::from(ROUTE_IP), + netmask: String::from(NETMASK), + net_name: String::from(NET_NAME), } } } diff --git a/KubeOS-Rust/kbimg/src/repo.rs b/KubeOS-Rust/kbimg/src/repo.rs index 68254163..4c246603 100644 --- a/KubeOS-Rust/kbimg/src/repo.rs +++ b/KubeOS-Rust/kbimg/src/repo.rs @@ -58,10 +58,6 @@ impl CreateImage for RepoInfo { gen_persist_mount(&mut persist_mount)?; let mut var_mount = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_VAR_MOUNT))?; gen_var_mount(&mut var_mount)?; - let mut disk_mount = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_DISK_EXAMPLE_MOUNT))?; - gen_disk_example_mount(&mut disk_mount)?; - let mut volume_mount = File::create(&format!("{}/{}", MISC_FILES_DIR, MISC_VOLUME_EXAMPLE_MOUNT))?; - gen_volume_example_mount(&mut volume_mount)?; } Err(e) => { bail!(e); @@ -126,7 +122,7 @@ fn verify_repo_input(info: &RepoInfo) -> anyhow::Result<()> { fn check_disk_space(image_type: &str) -> anyhow::Result<()> { let max_size: u64 = match image_type { - "upgrade-image" => 6, + "upgrade" => 6, "vm-repo" => 25, "pxe-repo" => 5, _ => bail!("Invalid image type: {}", image_type), diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index f2b0d5a0..274fca8d 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -318,7 +318,6 @@ pub(crate) fn gen_install_misc(file: &mut File, legacy_bios: bool, config: &Conf writeln!(file, r#"function install_misc() {{ - local DNS_CONF="${{SCRIPTS_DIR}}"/resolv.conf cp "${{SCRIPTS_DIR}}"/misc-files/*mount "${{SCRIPTS_DIR}}"/misc-files/os-agent.service "${{RPM_ROOT}}"/usr/lib/systemd/system/ cp "${{SCRIPTS_DIR}}"/misc-files/os-release "${{RPM_ROOT}}"/usr/lib/ cp "${{AGENT_PATH}}" "${{RPM_ROOT}}"/usr/bin @@ -365,9 +364,6 @@ r#" cp -r "${{SCRIPTS_DIR}}"/00bootup "${{RPM_ROOT}}"/usr/lib/dracut/modules. writeln!(file, r#" ROOT_PASSWD="${{ROOT_PASSWD}}" BOOT_MODE="${{BOOT_MODE}}" chroot "${{RPM_ROOT}}" bash /set_in_chroot.sh rm "${{RPM_ROOT}}/set_in_chroot.sh" - if [ -e "${{DNS_CONF}}" ]; then - cp "${{DNS_CONF}}" "${{RPM_ROOT}}"/etc/resolv.conf - fi }} "# )?; @@ -1604,47 +1600,4 @@ WantedBy=local-fs.target )?; Ok(()) } - -// misc-files/disk.mount -pub(crate) fn gen_disk_example_mount(file: &mut File) -> Result<()> { - writeln!(file, -r#"[Unit] -Description=Mount Disk -Documentation=man:systemd.mount(5) -After=local-fs.target - -[Mount] -What=/dev/sda1 -Where=/mnt/data -Type=ext4 -Options=defaults,noatime - -[Install] -WantedBy=multi-user.target -"# - )?; - Ok(()) -} - -// misc-files/volume.mount -pub(crate) fn gen_volume_example_mount(file: &mut File) -> Result<()> { - writeln!(file, -r#"[Unit] -Description=Mount Logical Volume -Documentation=man:systemd.mount(5) -After=lvm2.service -Requires=lvm2.service - -[Mount] -What=/dev/myvg/mylv -Where=/mnt/mydata -Type=ext4 -Options=defaults - -[Install] -WantedBy=multi-user.target -"# - )?; - Ok(()) -} /* endregion */ \ No newline at end of file diff --git a/KubeOS-Rust/kbimg/src/values.rs b/KubeOS-Rust/kbimg/src/values.rs index b7ef1ad5..6cdeb0eb 100644 --- a/KubeOS-Rust/kbimg/src/values.rs +++ b/KubeOS-Rust/kbimg/src/values.rs @@ -48,5 +48,12 @@ pub(crate) const MISC_OS_AGENT_SERVICE: &str = "os-agent.service"; pub(crate) const MISC_OS_RELEASE: &str = "os-release"; pub(crate) const MISC_PERSIST_MOUNT: &str = "persist.mount"; pub(crate) const MISC_VAR_MOUNT: &str = "var.mount"; -pub(crate) const MISC_DISK_EXAMPLE_MOUNT: &str = "disk-example.mount"; -pub(crate) const MISC_VOLUME_EXAMPLE_MOUNT: &str = "volume-example.mount"; + +// bootup config +pub(crate) const ROOTFS_NAME: &str = "kubeos.tar"; +pub(crate) const DISK: &str = "/dev/sda"; +pub(crate) const SERVER_IP: &str = "192.168.1.50"; +pub(crate) const LOCAL_IP: &str = "192.168.1.100"; +pub(crate) const ROUTE_IP: &str = "192.168.1.1"; +pub(crate) const NETMASK: &str = "255.255.255.0"; +pub(crate) const NET_NAME: &str = "eth0"; diff --git "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" index f2823c85..ed999f9a 100644 --- "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" +++ "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" @@ -2,39 +2,91 @@ ## 简介 ## -kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制作KubeOS 容器,虚拟机和物理机镜像 +kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制作KubeOS容器,虚拟机和物理机镜像 ## 命令介绍 ## ### 命令格式 ### -**bash kbimg.sh** \[ --help | -h \] create \[ COMMANDS \] \[ OPTIONS \] +**\** \[ --config | -c \] \ -### 参数说明 ### +### 配置文件说明 ### -* COMMANDS +* from_repo: 从 repo 创建 OCI 镜像、虚拟机镜像或物理机镜像 - | 参数 | 描述 | - |------------------------------| ---------------------------------------------- | - | upgrade-image | 生成用于安装和升级的OCI镜像格式的 KubeOS 镜像 | - | vm-image | 生成用于部署和升级的虚拟机镜像 | - | pxe-image | 生成物理机安装所需的镜像及文件 | + | 参数 | 描述 | + | --- | --- | + | agent_path | os-agent 二进制的路径 | + | image_type | upgrade: 用于安装和升级的 OCI 镜像格式的 KubeOS 镜像; vm-repo: 用于部署和升级的虚拟机镜像; pxe-repo: 物理机安装所需的镜像及文件 | + | legacy_bios | 镜像为 legacy 引导或 UEFI 引导 | + | repo_path | repo 文件的路径,repo 文件中配置制作镜像所需要的 yum 源 | + | root_passwd | KubeOS 镜像 root 用户密码,加密后的带盐值的密码,可以用 openssl、kiwi 命令生成 | + | version | 制作出来的 KubeOS 镜像的版本 | + | rpmlist | 镜像所需的 rpm 包 | + | docker_img | 生成或者使用的 docker 镜像 | +* from_docker: 从 docker 镜像创建虚拟机镜像或物理机镜像 + | 参数 | 描述 | + | --- | --- | + | docker_img | 生成或者使用的 docker 镜像 | + | image_type | vm-docker: 用于部署和升级的虚拟机镜像; pxe-docker: 物理机安装所需的镜像及文件 | -* OPTIONS +* admin_container: - | 参数 | 描述 | - | ------------ | ------------------------------------------------------------ | - | -p | repo 文件的路径,repo 文件中配置制作镜像所需要的 yum 源 | - | -v | 制作出来的KubeOS镜像的版本 | - | -b | os-agent二进制的路径 | - | -e | KubeOS 镜像 root 用户密码,加密后的带盐值的密码,可以用 openssl,kiwi 命令生成 | - | -d | 生成或者使用的 docke r镜像 | - | -l | 如果指定参数,则镜像为legacy引导,不指定默认是UEFI引导 | - | -h --help | 查看帮助信息 | + | 参数 | 描述 | + | --- | --- | + | dockerfile | dockerfile 路径 | + | docker_img | 生成或者使用的 docker 镜像 | +* [OPTIONAL] users: 添加用户 + | 参数 | 描述 | + | --- | --- | + | groups | [OPTIONAL] 用户组 (第一个为主组,其他为附加组) | + | name | 用户名 | + | passwd | 密码 | + | sudo | [OPTIONAL] 用户是否具有 sudo 权限 | + +* [OPTIONAL] copy_files: 拷贝文件到指定目录 + + | 参数 | 描述 | + | --- | --- | + | dst | 目标目录 | + | src | 源文件路径 | + +* [OPTIONAL] grub: grub配置 + + | 参数 | 描述 | + | --- | --- | + | passwd | [OPTIONAL] grub 密码 | + +* [OPTIONAL] systemd_service: 新增 systemd 服务 + + | 参数 | 描述 | + | --- | --- | + | name | systemd 服务名 | + +* [OPTIONAL] chroot_script: 自定义 chroot 脚本 + + | 参数 | 描述 | + | --- | --- | + | path | 脚本路径 | + +* [OPTIONAL] disk_partition: 自定义分区大小和镜像大小 + + | 参数 | 描述 | + | --- | --- | + | first | 引导分区大小 | + | second | ROOT-A 分区大小 | + | third | ROOT-B 分区大小 | + | img_size | 镜像大小 | + +* [OPTIONAL] persist_mkdir: persist 分区新建目录 + + | 参数 | 描述 | + | --- | --- | + | name | 目录名 | ## 使用说明 ## @@ -43,6 +95,48 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 * kbimg.sh 执行需要 root 权限 * 当前仅支持 x86和 AArch64 架构使用 * 容器 OS 镜像制作工具的 rpm 包源为 openEuler 具体版本的 everything 仓库和 EPOL 仓库。制作镜像时提供的 repo 文件中,yum 源建议同时配置 openEuler 具体版本的 everything 仓库和 EPOL 仓库 +* 新增 systemd 服务需要将对应的 .service 文件拷贝至镜像/usr/lib/systemd/system目录 + ```toml + [[copy_files]] + dst = "/usr/lib/systemd/system" + src = ".../containerd.service" + + [systemd_service] + name = ["containerd"] + ``` +* 如需挂载数据盘,请先自定义```disk.mount```文件,并启用**copy_files**和**systemd_service**设置启动时挂载 + ``` + [Unit] + Description=Mount Disk + Documentation=man:systemd.mount(5) + After=local-fs.target + + [Mount] + What=/dev/sda1 + Where=/mnt/data + Type=ext4 + Options=defaults,noatime + + [Install] + WantedBy=multi-user.target + ``` +* 如需配置逻辑卷,请先确保已做好分卷,在镜像中启用lvm服务,并启用**copy_files**和**systemd_service**设置启动时挂载 + ``` + [Unit] + Description=Mount Logical Volume + Documentation=man:systemd.mount(5) + After=lvm2.service + Requires=lvm2.service + + [Mount] + What=/dev/myvg/mylv + Where=/mnt/mydata + Type=ext4 + Options=defaults + + [Install] + WantedBy=multi-user.target + ``` ### KubeOS OCI 镜像制作 ### @@ -52,23 +146,40 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 * 使用默认 rpmlist 进行容器OS镜像制作时所需磁盘空间至少为6G,如自已定义 rpmlist 可能会超过6G #### 使用示例 #### -* 如需进行DNS配置,请先在```scripts```目录下自定义```resolv.conf```文件 -```shell - cd /opt/kubeOS/scripts - touch resolv.conf - vim resolv.conf -``` + +* 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用**copy_files**字段将配置文件拷贝到/etc目录 + + ```shell + touch \/resolv.conf + vim \resolv.conf + ``` + + ```toml + [[copy_files]] + dst = "/etc" + src = "" + ``` + * 制作KubeOS容器镜像 -``` shell -cd /opt/kubeOS/scripts -bash kbimg.sh create upgrade-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' -d your_imageRepository/imageName:version -``` -* 制作完成后查看制作出来的KubeOS容器镜像 + ```toml + [from_repo] + agent_path = "/bin/os-agent" + image_type = "upgrade" + legacy_bios = true + repo_path = "xxx.repo" + root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" + version = "v1" + docker_img = "your_imageRepository/imageName:version" + rpmlist = [ + # your rpm list + ] + ``` -``` shell -docker images -``` +* 制作完成后查看制作出来的KubeOS容器镜像 + ``` shell + docker images + ``` ### KubeOS 虚拟机镜像制作 ### @@ -82,26 +193,45 @@ docker images #### 使用示例 #### * 使用repo源制作 - * 如需进行DNS配置,请先在```scripts```目录下自定义```resolv.conf```文件 - ```shell - cd /opt/kubeOS/scripts - touch resolv.conf - vim resolv.conf - ``` + + * 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用**copy_files**字段将配置文件拷贝到/etc目录 + + ```shell + touch \/resolv.conf + vim \resolv.conf + ``` + + ```toml + [[copy_files]] + dst = "/etc" + src = "" + ``` + * KubeOS虚拟机镜像制作 - ``` shell - cd /opt/kubeOS/scripts - bash kbimg.sh create vm-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' - ``` + + ```toml + [from_repo] + agent_path = "/bin/os-agent" + image_type = "vm-repo" + legacy_bios = true + repo_path = "xxx.repo" + root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" + version = "v1" + rpmlist = [ + # your rpm list + ] + ``` * 使用docker镜像制作 - ``` shell - cd /opt/kubeOS/scripts - bash kbimg.sh create vm-image -d your_imageRepository/imageName:version + ```toml + [from_dockerimg] + docker_img = "your_imageRepository/imageName:version" + image_type = "vm-docker" ``` + * 结果说明 - 容器 OS 镜像制作完成后,会在 /opt/kubeOS/scripts 目录下生成: + 容器 OS 镜像制作完成后,会在 KubeOS-Rust/kbimg/scripts-auto 目录下生成: * system.qcow2: qcow2 格式的系统镜像,大小默认为 20GiB,支持的根文件系统分区大小 < 2020 MiB,持久化分区 < 16GiB 。 * update.img: 用于升级的根文件系统分区镜像 @@ -116,44 +246,54 @@ docker images * 不支持多个磁盘都安装KubeOS,可能会造成启动失败或挂载紊乱 * 容器OS 目前不支持 x86 架构的物理机使用 legacy 启动模式启动 * 使用默认rpmlist进行镜像制作时所需磁盘空间至少为5G,如自已定义 rpmlist 可能会超过5G + #### 使用示例 #### -* 首先需要修改```00bootup/Global.cfg```的配置,对相关参数进行配置,参数均为必填,ip目前仅支持ipv4,配置示例如下 +* 首先需要修改```values.rs```中```bootup config```的配置,对相关参数进行配置,参数均为必填,ip目前仅支持ipv4,配置示例如下 - ```shell - # rootfs file name - rootfs_name=kubeos.tar - # select the target disk to install kubeOS - disk=/dev/sda - # pxe server ip address where stores the rootfs on the http server - server_ip=192.168.1.50 - # target machine temporary ip - local_ip=192.168.1.100 - # target machine temporary route - route_ip=192.168.1.1 - # target machine temporary netmask - netmask=255.255.255.0 - # target machine netDevice name - net_name=eth0 + ```rust + pub(crate) const ROOTFS_NAME: &str = "kubeos.tar"; + pub(crate) const DISK: &str = "/dev/sda"; + pub(crate) const SERVER_IP: &str = "192.168.1.50"; + pub(crate) const LOCAL_IP: &str = "192.168.1.100"; + pub(crate) const ROUTE_IP: &str = "192.168.1.1"; + pub(crate) const NETMASK: &str = "255.255.255.0"; + pub(crate) const NET_NAME: &str = "eth0"; ``` * 使用 repo 源制作 - * 如需进行DNS配置,请在```scripts```目录下自定义```resolv.conf```文件 - ```shell - cd /opt/kubeOS/scripts - touch resolv.conf - vim resolv.conf - ``` - * KubeOS物理机安装所需镜像制作 - ``` - cd /opt/kubeOS/scripts - bash kbimg.sh create pxe-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' - ``` + * 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用**copy_files**字段将配置文件拷贝到/etc目录 + + ```shell + touch \/resolv.conf + vim \resolv.conf + ``` + + ```toml + [[copy_files]] + dst = "/etc" + src = "" + ``` + + * KubeOS物理机安装所需镜像制作 + ```toml + [from_repo] + agent_path = "/bin/os-agent" + image_type = "pxe-repo" + legacy_bios = true + repo_path = "xxx.repo" + root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" + version = "v1" + rpmlist = [ + # your rpm list + ] + ``` * 使用 docker 镜像制作 - ``` shell - cd /opt/kubeOS/scripts - bash kbimg.sh create pxe-image -d your_imageRepository/imageName:version + ```toml + [from_dockerimg] + docker_img = "your_imageRepository/imageName:version" + image_type = "vm-docker" ``` * 结果说明 -- Gitee From d4dcb5cf3caed2ec5f2c25f11d6c385e3f61bdee Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Fri, 23 Aug 2024 15:02:10 +0800 Subject: [PATCH 086/116] modify doc --- ...66\344\275\234\346\214\207\345\257\274.md" | 39 +++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" index ed999f9a..419c83b6 100644 --- "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" +++ "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" @@ -8,7 +8,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 ### 命令格式 ### -**\** \[ --config | -c \] \ +**.../kbimg** \[ --config | -c \] \ ### 配置文件说明 ### @@ -95,7 +95,8 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 * kbimg.sh 执行需要 root 权限 * 当前仅支持 x86和 AArch64 架构使用 * 容器 OS 镜像制作工具的 rpm 包源为 openEuler 具体版本的 everything 仓库和 EPOL 仓库。制作镜像时提供的 repo 文件中,yum 源建议同时配置 openEuler 具体版本的 everything 仓库和 EPOL 仓库 -* 新增 systemd 服务需要将对应的 .service 文件拷贝至镜像/usr/lib/systemd/system目录 +* 新增 systemd 服务需要将对应的 .service 文件或 .mount 文件拷贝至镜像/usr/lib/systemd/system目录 + ```toml [[copy_files]] dst = "/usr/lib/systemd/system" @@ -104,8 +105,11 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 [systemd_service] name = ["containerd"] ``` -* 如需挂载数据盘,请先自定义```disk.mount```文件,并启用**copy_files**和**systemd_service**设置启动时挂载 + +* 如需挂载数据盘,请先自定义```disk.mount```文件,并启用```copy_files```和```systemd_service```设置启动时挂载磁盘 + ``` + # disk.mount [Unit] Description=Mount Disk Documentation=man:systemd.mount(5) @@ -120,8 +124,20 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 [Install] WantedBy=multi-user.target ``` -* 如需配置逻辑卷,请先确保已做好分卷,在镜像中启用lvm服务,并启用**copy_files**和**systemd_service**设置启动时挂载 + + ```toml + [[copy_files]] + dst = "/usr/lib/systemd/system" + src = ".../disk.mount" + + [systemd_service] + name = ["disk.mount"] ``` + +* 如需配置逻辑卷,请先确保已做好分卷,在镜像中启用lvm服务,然后自定义```volume.mount```文件,并启用```copy_files```和```systemd_service```设置启动时挂载逻辑卷 + + ``` + # volume.mount [Unit] Description=Mount Logical Volume Documentation=man:systemd.mount(5) @@ -138,6 +154,15 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 WantedBy=multi-user.target ``` + ```toml + [[copy_files]] + dst = "/usr/lib/systemd/system" + src = ".../volume.mount" + + [systemd_service] + name = ["volume.mount"] + ``` + ### KubeOS OCI 镜像制作 ### #### 注意事项 #### @@ -147,7 +172,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 #### 使用示例 #### -* 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用**copy_files**字段将配置文件拷贝到/etc目录 +* 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用```copy_files```字段将配置文件拷贝到```/etc```目录 ```shell touch \/resolv.conf @@ -194,7 +219,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 * 使用repo源制作 - * 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用**copy_files**字段将配置文件拷贝到/etc目录 + * 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用**copy_files**字段将配置文件拷贝到```/etc```目录 ```shell touch \/resolv.conf @@ -262,7 +287,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 ``` * 使用 repo 源制作 - * 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用**copy_files**字段将配置文件拷贝到/etc目录 + * 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用```copy_files```字段将配置文件拷贝到```/etc```目录 ```shell touch \/resolv.conf -- Gitee From 8b0d5d6579f272ecaeff7c8470bd3d502d85ec5c Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Tue, 27 Aug 2024 16:53:25 +0800 Subject: [PATCH 087/116] makefile spell error; grub.cfg {{{{}}}} and sda->vda --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 20 ++++++++++---------- Makefile | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 274fca8d..b541ad93 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -801,14 +801,14 @@ if [ "${{prev_saved_entry}}" ]; then set boot_once=true fi -function savedefault {{{{ +function savedefault {{ if [ -z "${{boot_once}}" ]; then saved_entry="${{chosen}}" save_env saved_entry fi -}}}} +}} -function load_video {{{{ +function load_video {{ if [ x$feature_all_video_module = xy ]; then insmod all_video else @@ -820,7 +820,7 @@ function load_video {{{{ insmod video_bochs insmod video_cirrus fi -}}}} +}} terminal_output console if [ x$feature_timeout_style = xy ] ; then @@ -846,27 +846,27 @@ fi ### END /etc/grub.d/01_users ### ### BEGIN /etc/grub.d/10_linux ### -menuentry 'A' --class KubeOS --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'KubeOS-A' {{{{ +menuentry 'A' --class KubeOS --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'KubeOS-A' {{ load_video set gfxpayload=keep insmod gzio insmod part_gpt insmod ext2 set root='hd0,gpt2' - linux /boot/vmlinuz root=/dev/sda2 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 + linux /boot/vmlinuz root=/dev/vda2 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 initrd /boot/initramfs.img -}}}} +}} -menuentry 'B' --class KubeOS --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'KubeOS-B' {{{{ +menuentry 'B' --class KubeOS --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'KubeOS-B' {{ load_video set gfxpayload=keep insmod gzio insmod part_gpt insmod ext2 set root='hd0,gpt3' - linux /boot/vmlinuz root=/dev/sda3 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 + linux /boot/vmlinuz root=/dev/vda3 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 initrd /boot/initramfs.img -}}}} +}} ### END /etc/grub.d/10_linux ### diff --git a/Makefile b/Makefile index d4cd71e3..75017f9e 100644 --- a/Makefile +++ b/Makefile @@ -78,7 +78,7 @@ rust-agent: # Install CRDs into a cluster install: manifests - kubectl apply -f confg/crd + kubectl apply -f config/crd # Uninstall CRDs from a cluster uninstall: manifests -- Gitee From 5c85c2d0f32368665e120ecde954b19f0470ace3 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 28 Aug 2024 09:34:10 +0800 Subject: [PATCH 088/116] path error --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 6 +++--- ...\217\345\210\266\344\275\234\346\214\207\345\257\274.md" | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index b541ad93..446c7553 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -342,7 +342,7 @@ s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ )?; } else { - writeln!(file, "\tcp \"${{SCRIPTS_DIR}}\"grub.cfg \"${{RPM_ROOT}}\"/boot/efi/EFI/openEuler")?; + writeln!(file, "\tcp \"${{SCRIPTS_DIR}}\"/grub.cfg \"${{RPM_ROOT}}\"/boot/efi/EFI/openEuler")?; } writeln!(file, @@ -853,7 +853,7 @@ menuentry 'A' --class KubeOS --class gnu-linux --class gnu --class os --unrestri insmod part_gpt insmod ext2 set root='hd0,gpt2' - linux /boot/vmlinuz root=/dev/vda2 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 + linux /boot/vmlinuz root=/dev/sda2 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 initrd /boot/initramfs.img }} @@ -864,7 +864,7 @@ menuentry 'B' --class KubeOS --class gnu-linux --class gnu --class os --unrestri insmod part_gpt insmod ext2 set root='hd0,gpt3' - linux /boot/vmlinuz root=/dev/vda3 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 + linux /boot/vmlinuz root=/dev/sda3 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 initrd /boot/initramfs.img }} diff --git "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" index 419c83b6..3743e842 100644 --- "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" +++ "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" @@ -116,7 +116,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 After=local-fs.target [Mount] - What=/dev/sda1 + What=/dev/sdb Where=/mnt/data Type=ext4 Options=defaults,noatime -- Gitee From 69cd858d408b323190d7ad70e892ce15f79f1598 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 28 Aug 2024 17:11:14 +0800 Subject: [PATCH 089/116] mount disk --- KubeOS-Rust/kbimg/kbimg.toml | 28 +++++++++---------- KubeOS-Rust/kbimg/src/scripts_gen.rs | 8 ++++-- ...66\344\275\234\346\214\207\345\257\274.md" | 4 +-- persist-data.mount | 13 +++++++++ 4 files changed, 34 insertions(+), 19 deletions(-) create mode 100644 persist-data.mount diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index a6605676..70fdb7e6 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -1,7 +1,7 @@ [from_repo] agent_path = "/root/KubeOS/bin/os-agent" image_type = "vm-repo" -legacy_bios = true +legacy_bios = false repo_path = "/etc/yum.repos.d/openEuler.repo" root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" version = "v1" @@ -31,13 +31,13 @@ rpmlist = [ "vi", ] -[from_dockerimg] -docker_img = "" -image_type = "vm-docker" +# [from_dockerimg] +# docker_img = "" +# image_type = "vm-docker" -[admin_container] -dockerfile = "" -docker_img = "" +# [admin_container] +# dockerfile = "" +# docker_img = "" # [[users]] # groups = ["admin"] @@ -50,9 +50,9 @@ docker_img = "" # name = "bar" # passwd = "bar" -# [[copy_files]] -# dst = "/usr/lib/systemd/system" -# src = "/root/KubeOS/ztest/containerd.service" +[[copy_files]] +dst = "/usr/lib/systemd/system" +src = "/root/KubeOS/persist-data.mount" # [[copy_files]] # dst = "/usr/lib/systemd/system" @@ -61,8 +61,8 @@ docker_img = "" # [grub] # passwd = "foo" -# [systemd_service] -# name = ["containerd"] +[systemd_service] +name = ["persist-data.mount"] # [chroot_script] # path = "../../ztest/myscript.sh" @@ -73,5 +73,5 @@ docker_img = "" # third = 2300 # img_size = 30 -# [persist_mkdir] -# name = ["opt", "optwork"] +[persist_mkdir] +name = ["data"] diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 446c7553..dd5e5ee8 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -470,7 +470,9 @@ r#" sync mkdir "${{TMP_MOUNT_PATH}}"/{{var,etc,etcwork}}"#)?; if let Some(persist_mkdir) = &config.persist_mkdir { - writeln!(file, "\tmkdir \"${{TMP_MOUNT_PATH}}\"/{{{}}}", persist_mkdir.name.join(","))?; + for name in &persist_mkdir.name { + writeln!(file, "\tmkdir \"${{TMP_MOUNT_PATH}}\"/{}", name)?; + } } writeln!(file, @@ -853,7 +855,7 @@ menuentry 'A' --class KubeOS --class gnu-linux --class gnu --class os --unrestri insmod part_gpt insmod ext2 set root='hd0,gpt2' - linux /boot/vmlinuz root=/dev/sda2 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 + linux /boot/vmlinuz root=/dev/vda2 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 initrd /boot/initramfs.img }} @@ -864,7 +866,7 @@ menuentry 'B' --class KubeOS --class gnu-linux --class gnu --class os --unrestri insmod part_gpt insmod ext2 set root='hd0,gpt3' - linux /boot/vmlinuz root=/dev/sda3 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 + linux /boot/vmlinuz root=/dev/vda3 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3 initrd /boot/initramfs.img }} diff --git "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" index 3743e842..17648d15 100644 --- "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" +++ "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" @@ -106,7 +106,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 name = ["containerd"] ``` -* 如需挂载数据盘,请先自定义```disk.mount```文件,并启用```copy_files```和```systemd_service```设置启动时挂载磁盘 +* 如需挂载数据盘,请先自定义```persist-data.mount```文件,并启用```copy_files```和```systemd_service```字段设置启动时挂载,启用```persist_mkdir```字段创建挂载点 ``` # disk.mount @@ -117,7 +117,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 [Mount] What=/dev/sdb - Where=/mnt/data + Where=/persist/data Type=ext4 Options=defaults,noatime diff --git a/persist-data.mount b/persist-data.mount new file mode 100644 index 00000000..08d8473c --- /dev/null +++ b/persist-data.mount @@ -0,0 +1,13 @@ +[Unit] +Description=Mount Disk +Documentation=man:systemd.mount(5) +After=local-fs.target + +[Mount] +What=/dev/vdb +Where=/persist/data +Type=ext4 +Options=defaults,noatime + +[Install] +WantedBy=local-fs.target \ No newline at end of file -- Gitee From d48651d2761d3677b42f54f8962a814494ebba12 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 28 Aug 2024 17:30:25 +0800 Subject: [PATCH 090/116] chroot systemctl to ln --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index dd5e5ee8..20fbf49e 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -668,10 +668,9 @@ fi"#, } pub(crate) fn gen_systemd_services(file: &mut File, systemd_services: &SystemdService) -> Result<()> { - writeln!(file, "# systemd services")?; let services_name = &systemd_services.name; for service_name in services_name { - writeln!(file, "systemctl enable {}", service_name)?; + writeln!(file, "ln -s /usr/lib/systemd/system/{} /lib/systemd/system/local-fs.target.wants/{}", service_name, service_name)?; } Ok(()) } @@ -679,18 +678,18 @@ pub(crate) fn gen_systemd_services(file: &mut File, systemd_services: &SystemdSe pub(crate) fn gen_set_in_chroot(file: &mut File, legacy_bios: bool, config: &Config) -> Result<()> { writeln!(file, r#"#!/bin/bash -systemctl enable os-agent -systemctl enable kubelet"#)?; +ln -s /usr/lib/systemd/system/os-agent.service /usr/lib/systemd/system/multi-user.target.wants/os-agent.service +ln -s /usr/lib/systemd/system/kubelet.service /usr/lib/systemd/system/multi-user.target.wants/kubelet.service"#)?; if legacy_bios { - writeln!(file, "systemctl enable boot-grub2.mount")?; + writeln!(file, "ln -s /usr/lib/systemd/system/boot-grub2.mount /lib/systemd/system/local-fs.target.wants/boot-grub2.mount")?; } else { - writeln!(file, "systemctl enable boot-efi.mount")?; + writeln!(file, "ln -s /usr/lib/systemd/system/boot-efi.mount /lib/systemd/system/local-fs.target.wants/boot-efi.mount")?; } writeln!(file, -r#"systemctl enable etc.mount +r#"ln -s /usr/lib/systemd/system/etc.mount /lib/systemd/system/local-fs.target.wants/etc.mount str=$(sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{{print $2}}') umask 0666 -- Gitee From 83a808eee16e6a9d81c06d612d210301d4941b99 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 28 Aug 2024 17:44:24 +0800 Subject: [PATCH 091/116] order --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 20fbf49e..0f40d335 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -680,18 +680,23 @@ pub(crate) fn gen_set_in_chroot(file: &mut File, legacy_bios: bool, config: &Con r#"#!/bin/bash ln -s /usr/lib/systemd/system/os-agent.service /usr/lib/systemd/system/multi-user.target.wants/os-agent.service ln -s /usr/lib/systemd/system/kubelet.service /usr/lib/systemd/system/multi-user.target.wants/kubelet.service"#)?; - if legacy_bios { writeln!(file, "ln -s /usr/lib/systemd/system/boot-grub2.mount /lib/systemd/system/local-fs.target.wants/boot-grub2.mount")?; } else { writeln!(file, "ln -s /usr/lib/systemd/system/boot-efi.mount /lib/systemd/system/local-fs.target.wants/boot-efi.mount")?; } + writeln!(file, r#"ln -s /usr/lib/systemd/system/etc.mount /lib/systemd/system/local-fs.target.wants/etc.mount"#)?; + if let Some(users) = &config.users { + gen_add_users(file, users)?; + } + if let Some(systemd_services) = &config.systemd_service { + gen_systemd_services(file, systemd_services)?; + } + writeln!(file, -r#"ln -s /usr/lib/systemd/system/etc.mount /lib/systemd/system/local-fs.target.wants/etc.mount - -str=$(sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{{print $2}}') +r#"str=$(sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{{print $2}}') umask 0666 mv /etc/shadow /etc/shadow_bak sed -i '/^root:/d' /etc/shadow_bak @@ -700,17 +705,8 @@ 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 - -# (optional) custom config"# +rm -rf /usr/lib/dracut/modules.d/00bootup"# )?; - - if let Some(users) = &config.users { - gen_add_users(file, users)?; - } - if let Some(systemd_services) = &config.systemd_service { - gen_systemd_services(file, systemd_services)?; - } Ok(()) } -- Gitee From 56700dbee2ed47f0082aa537ed746bc22112e4d6 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Wed, 28 Aug 2024 17:57:49 +0800 Subject: [PATCH 092/116] \n --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 0f40d335..bf0f5db2 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -696,7 +696,8 @@ ln -s /usr/lib/systemd/system/kubelet.service /usr/lib/systemd/system/multi-user } writeln!(file, -r#"str=$(sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{{print $2}}') +r#" +str=$(sed -n '/^root:/p' /etc/shadow | awk -F "root:" '{{print $2}}') umask 0666 mv /etc/shadow /etc/shadow_bak sed -i '/^root:/d' /etc/shadow_bak -- Gitee From 6a18ad532192d15d97b8bcef89e5dd91390eaac8 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 29 Aug 2024 09:29:18 +0800 Subject: [PATCH 093/116] systemd /usr to /etc --- KubeOS-Rust/kbimg/kbimg.toml | 2 +- KubeOS-Rust/kbimg/src/scripts_gen.rs | 6 +++--- ...345\210\266\344\275\234\346\214\207\345\257\274.md" | 10 ++++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index 70fdb7e6..fd00ec6b 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -51,7 +51,7 @@ rpmlist = [ # passwd = "bar" [[copy_files]] -dst = "/usr/lib/systemd/system" +dst = "/etc/systemd/system" src = "/root/KubeOS/persist-data.mount" # [[copy_files]] diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index bf0f5db2..7cc43f59 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -668,9 +668,9 @@ fi"#, } pub(crate) fn gen_systemd_services(file: &mut File, systemd_services: &SystemdService) -> Result<()> { - let services_name = &systemd_services.name; - for service_name in services_name { - writeln!(file, "ln -s /usr/lib/systemd/system/{} /lib/systemd/system/local-fs.target.wants/{}", service_name, service_name)?; + for service_name in &systemd_services.name { + // writeln!(file, "ln -s /usr/lib/systemd/system/{} /lib/systemd/system/local-fs.target.wants/{}", service_name, service_name)?; + writeln!(file, "systemctl enable {}", service_name)?; } Ok(()) } diff --git "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" index 17648d15..604fd532 100644 --- "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" +++ "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" @@ -107,9 +107,11 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 ``` * 如需挂载数据盘,请先自定义```persist-data.mount```文件,并启用```copy_files```和```systemd_service```字段设置启动时挂载,启用```persist_mkdir```字段创建挂载点 +* .mount文件名由挂载点路径生成,将斜杠替换为连字符 +* 建议将.mount文件拷贝到```/etc/systemd/system```目录,若拷贝到```/usr/lib/systemd/system```可能无法正常启用 ``` - # disk.mount + # persist-data.mount [Unit] Description=Mount Disk Documentation=man:systemd.mount(5) @@ -127,11 +129,11 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 ```toml [[copy_files]] - dst = "/usr/lib/systemd/system" - src = ".../disk.mount" + dst = "/etc/systemd/system" + src = ".../persist-data.mount" [systemd_service] - name = ["disk.mount"] + name = ["persist-data.mount"] ``` * 如需配置逻辑卷,请先确保已做好分卷,在镜像中启用lvm服务,然后自定义```volume.mount```文件,并启用```copy_files```和```systemd_service```设置启动时挂载逻辑卷 -- Gitee From 20d3a41b4461f7b58b6727c69976d3d2fc83968b Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 29 Aug 2024 09:43:41 +0800 Subject: [PATCH 094/116] systemd: /etc to /usr, systemctl to ln --- KubeOS-Rust/kbimg/kbimg.toml | 2 +- KubeOS-Rust/kbimg/src/scripts_gen.rs | 3 +-- ...217\345\210\266\344\275\234\346\214\207\345\257\274.md" | 7 +++---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index fd00ec6b..70fdb7e6 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -51,7 +51,7 @@ rpmlist = [ # passwd = "bar" [[copy_files]] -dst = "/etc/systemd/system" +dst = "/usr/lib/systemd/system" src = "/root/KubeOS/persist-data.mount" # [[copy_files]] diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 7cc43f59..ea9ac749 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -669,8 +669,7 @@ fi"#, pub(crate) fn gen_systemd_services(file: &mut File, systemd_services: &SystemdService) -> Result<()> { for service_name in &systemd_services.name { - // writeln!(file, "ln -s /usr/lib/systemd/system/{} /lib/systemd/system/local-fs.target.wants/{}", service_name, service_name)?; - writeln!(file, "systemctl enable {}", service_name)?; + writeln!(file, "ln -s /usr/lib/systemd/system/{} /lib/systemd/system/local-fs.target.wants/{}", service_name, service_name)?; } Ok(()) } diff --git "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" index 604fd532..baf2fd41 100644 --- "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" +++ "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" @@ -95,7 +95,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 * kbimg.sh 执行需要 root 权限 * 当前仅支持 x86和 AArch64 架构使用 * 容器 OS 镜像制作工具的 rpm 包源为 openEuler 具体版本的 everything 仓库和 EPOL 仓库。制作镜像时提供的 repo 文件中,yum 源建议同时配置 openEuler 具体版本的 everything 仓库和 EPOL 仓库 -* 新增 systemd 服务需要将对应的 .service 文件或 .mount 文件拷贝至镜像/usr/lib/systemd/system目录 +* 新增 systemd 服务需要将对应的 .service 文件或 .mount 文件拷贝至镜像```/usr/lib/systemd/system```目录 ```toml [[copy_files]] @@ -108,7 +108,6 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 * 如需挂载数据盘,请先自定义```persist-data.mount```文件,并启用```copy_files```和```systemd_service```字段设置启动时挂载,启用```persist_mkdir```字段创建挂载点 * .mount文件名由挂载点路径生成,将斜杠替换为连字符 -* 建议将.mount文件拷贝到```/etc/systemd/system```目录,若拷贝到```/usr/lib/systemd/system```可能无法正常启用 ``` # persist-data.mount @@ -124,12 +123,12 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 Options=defaults,noatime [Install] - WantedBy=multi-user.target + WantedBy=local-fs.target ``` ```toml [[copy_files]] - dst = "/etc/systemd/system" + dst = "/usr/lib/systemd/system" src = ".../persist-data.mount" [systemd_service] -- Gitee From 6cbeb028235016703c8c8f767418098885501462 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 29 Aug 2024 11:06:56 +0800 Subject: [PATCH 095/116] volume --- KubeOS-Rust/kbimg/kbimg.toml | 7 +- ...66\344\275\234\346\214\207\345\257\274.md" | 116 ++++++++++-------- persist-data.mount | 13 -- volume.service | 16 +++ 4 files changed, 83 insertions(+), 69 deletions(-) delete mode 100644 persist-data.mount create mode 100644 volume.service diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index 70fdb7e6..2a94ef16 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -21,6 +21,7 @@ rpmlist = [ "kernel", "kubernetes-kubeadm", "kubernetes-kubelet", + "lvm2", "net-tools", "openssh-server", "passwd", @@ -52,7 +53,7 @@ rpmlist = [ [[copy_files]] dst = "/usr/lib/systemd/system" -src = "/root/KubeOS/persist-data.mount" +src = "/root/KubeOS/volume.service" # [[copy_files]] # dst = "/usr/lib/systemd/system" @@ -62,7 +63,7 @@ src = "/root/KubeOS/persist-data.mount" # passwd = "foo" [systemd_service] -name = ["persist-data.mount"] +name = ["volume"] # [chroot_script] # path = "../../ztest/myscript.sh" @@ -74,4 +75,4 @@ name = ["persist-data.mount"] # img_size = 30 [persist_mkdir] -name = ["data"] +name = ["lv_data"] diff --git "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" index baf2fd41..e35e4a57 100644 --- "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" +++ "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" @@ -106,63 +106,73 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 name = ["containerd"] ``` -* 如需挂载数据盘,请先自定义```persist-data.mount```文件,并启用```copy_files```和```systemd_service```字段设置启动时挂载,启用```persist_mkdir```字段创建挂载点 -* .mount文件名由挂载点路径生成,将斜杠替换为连字符 + * 如需挂载数据盘,请先自定义```persist-data.mount```文件,并启用```copy_files```和```systemd_service```字段设置启动时挂载,启用```persist_mkdir```字段创建挂载点 + * .mount文件名由挂载点路径生成,将斜杠替换为连字符 + * 虚拟机配置文件中指定磁盘总线类型为```virtio```,名称为```vdX``` - ``` - # persist-data.mount - [Unit] - Description=Mount Disk - Documentation=man:systemd.mount(5) - After=local-fs.target - - [Mount] - What=/dev/sdb - Where=/persist/data - Type=ext4 - Options=defaults,noatime - - [Install] - WantedBy=local-fs.target - ``` + ``` + # persist-data.mount + [Unit] + Description=Mount Disk + Documentation=man:systemd.mount(5) + After=local-fs.target + + [Mount] + What=/dev/vdb + Where=/persist/data + Type=ext4 + Options=defaults,noatime + + [Install] + WantedBy=local-fs.target + ``` - ```toml - [[copy_files]] - dst = "/usr/lib/systemd/system" - src = ".../persist-data.mount" + ```toml + [[copy_files]] + dst = "/usr/lib/systemd/system" + src = ".../persist-data.mount" - [systemd_service] - name = ["persist-data.mount"] - ``` + [systemd_service] + name = ["persist-data.mount"] -* 如需配置逻辑卷,请先确保已做好分卷,在镜像中启用lvm服务,然后自定义```volume.mount```文件,并启用```copy_files```和```systemd_service```设置启动时挂载逻辑卷 + [persist_mkdir] + name = ["data"] + ``` - ``` - # volume.mount - [Unit] - Description=Mount Logical Volume - Documentation=man:systemd.mount(5) - After=lvm2.service - Requires=lvm2.service - - [Mount] - What=/dev/myvg/mylv - Where=/mnt/mydata - Type=ext4 - Options=defaults - - [Install] - WantedBy=multi-user.target - ``` + * 如需配置逻辑卷,请先自定义```volume.service```文件,并启用```copy_files```和```systemd_service```设置启动时配置逻辑卷,启用```persist_mkdir```字段创建挂载点 + * 虚拟机配置文件中指定磁盘总线类型为```virtio```,名称为```vdX``` - ```toml - [[copy_files]] - dst = "/usr/lib/systemd/system" - src = ".../volume.mount" + ``` + # volume.service + [Unit] + Description=Mount Logical Volume + After=local-fs.target + + [Service] + Type=oneshot + RemainAfterExit=yes + ExecStart=pvcreate /dev/vdb + ExecStart=pvcreate /dev/vdc + ExecStart=vgcreate my_vg /dev/vdb /dev/vdc + ExecStart=lvcreate -L 8G -n my_lv my_vg + ExecStart=mkfs.ext4 /dev/my_vg/my_lv + ExecStart=mount /dev/my_vg/my_lv /persist/lv_data + + [Install] + WantedBy=local-fs.target + ``` - [systemd_service] - name = ["volume.mount"] - ``` + ```toml + [[copy_files]] + dst = "/usr/lib/systemd/system" + src = ".../volume.service" + + [systemd_service] + name = ["volume"] + + [persist_mkdir] + name = ["lv_data"] + ``` ### KubeOS OCI 镜像制作 ### @@ -198,7 +208,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 version = "v1" docker_img = "your_imageRepository/imageName:version" rpmlist = [ - # your rpm list + # your rpms ] ``` @@ -244,7 +254,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" version = "v1" rpmlist = [ - # your rpm list + # your rpms ] ``` @@ -311,7 +321,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" version = "v1" rpmlist = [ - # your rpm list + # your rpms ] ``` diff --git a/persist-data.mount b/persist-data.mount deleted file mode 100644 index 08d8473c..00000000 --- a/persist-data.mount +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=Mount Disk -Documentation=man:systemd.mount(5) -After=local-fs.target - -[Mount] -What=/dev/vdb -Where=/persist/data -Type=ext4 -Options=defaults,noatime - -[Install] -WantedBy=local-fs.target \ No newline at end of file diff --git a/volume.service b/volume.service new file mode 100644 index 00000000..53ff6499 --- /dev/null +++ b/volume.service @@ -0,0 +1,16 @@ +[Unit] +Description=Mount Logical Volume +After=local-fs.target + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=pvcreate /dev/vdb +ExecStart=pvcreate /dev/vdc +ExecStart=vgcreate my_vg /dev/vdb /dev/vdc +ExecStart=lvcreate -L 8G -n my_lv my_vg +ExecStart=mkfs.ext4 /dev/my_vg/my_lv +ExecStart=mount /dev/my_vg/my_lv /persist/lv_data + +[Install] +WantedBy=local-fs.target \ No newline at end of file -- Gitee From 3776b6973409028856d88833231d6c4d429426dc Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 29 Aug 2024 11:17:34 +0800 Subject: [PATCH 096/116] systemd add .service suffix --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index ea9ac749..6ef1e5a6 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -669,7 +669,14 @@ fi"#, pub(crate) fn gen_systemd_services(file: &mut File, systemd_services: &SystemdService) -> Result<()> { for service_name in &systemd_services.name { - writeln!(file, "ln -s /usr/lib/systemd/system/{} /lib/systemd/system/local-fs.target.wants/{}", service_name, service_name)?; + if service_name.ends_with(".mount") { + writeln!(file, "ln -s /usr/lib/systemd/system/{} /lib/systemd/system/local-fs.target.wants/{}", service_name, service_name)?; + } + else { + let mut service_fullname: String = service_name.clone(); + service_fullname.push_str(".service"); + writeln!(file, "ln -s /usr/lib/systemd/system/{} /lib/systemd/system/local-fs.target.wants/{}", service_fullname, service_fullname)?; + } } Ok(()) } -- Gitee From 9e22ce2953d624f03f44ff937a5a0abe20496559 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 29 Aug 2024 11:55:52 +0800 Subject: [PATCH 097/116] md --- ...0\266\344\275\234\346\214\207\345\257\274.md" | 2 +- volume.service | 16 ---------------- 2 files changed, 1 insertion(+), 17 deletions(-) delete mode 100644 volume.service diff --git "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" index e35e4a57..4003e273 100644 --- "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" +++ "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" @@ -154,7 +154,7 @@ kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制 ExecStart=pvcreate /dev/vdb ExecStart=pvcreate /dev/vdc ExecStart=vgcreate my_vg /dev/vdb /dev/vdc - ExecStart=lvcreate -L 8G -n my_lv my_vg + ExecStart=lvcreate -L 15G -n my_lv my_vg ExecStart=mkfs.ext4 /dev/my_vg/my_lv ExecStart=mount /dev/my_vg/my_lv /persist/lv_data diff --git a/volume.service b/volume.service deleted file mode 100644 index 53ff6499..00000000 --- a/volume.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=Mount Logical Volume -After=local-fs.target - -[Service] -Type=oneshot -RemainAfterExit=yes -ExecStart=pvcreate /dev/vdb -ExecStart=pvcreate /dev/vdc -ExecStart=vgcreate my_vg /dev/vdb /dev/vdc -ExecStart=lvcreate -L 8G -n my_lv my_vg -ExecStart=mkfs.ext4 /dev/my_vg/my_lv -ExecStart=mount /dev/my_vg/my_lv /persist/lv_data - -[Install] -WantedBy=local-fs.target \ No newline at end of file -- Gitee From ff91469aff09a34f23456c76dacc53554f1c42b4 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 29 Aug 2024 14:45:14 +0800 Subject: [PATCH 098/116] correct efi grub path --- KubeOS-Rust/kbimg/src/scripts_gen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KubeOS-Rust/kbimg/src/scripts_gen.rs b/KubeOS-Rust/kbimg/src/scripts_gen.rs index 6ef1e5a6..a33e2769 100644 --- a/KubeOS-Rust/kbimg/src/scripts_gen.rs +++ b/KubeOS-Rust/kbimg/src/scripts_gen.rs @@ -271,7 +271,7 @@ r#"function grub_config() {{ writeln!(file, "\tGRUB_PATH=\"${{RPM_ROOT}}\"/boot/grub2")?; } else { - writeln!(file, "\tGRUB_PATH=\"${{RPM_ROOT}}\"/efi/EFI/openEuler")?; + writeln!(file, "\tGRUB_PATH=\"${{RPM_ROOT}}\"/boot/efi/EFI/openEuler")?; } if let Some(grub_passwd) = &grub.passwd { writeln!(file, -- Gitee From 44bdadddac4003aac7773fdc98fe62b3f08eee3e Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 29 Aug 2024 14:47:11 +0800 Subject: [PATCH 099/116] . --- KubeOS-Rust/kbimg/kbimg.toml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index 2a94ef16..8f721491 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -40,30 +40,30 @@ rpmlist = [ # dockerfile = "" # docker_img = "" -# [[users]] -# groups = ["admin"] -# name = "foo" -# passwd = "foo" -# sudo = "ALL=(ALL) ALL" +[[users]] +groups = ["admin"] +name = "foo" +passwd = "foo" +sudo = "ALL=(ALL) ALL" -# [[users]] -# groups = ["example"] -# name = "bar" -# passwd = "bar" +[[users]] +groups = ["example"] +name = "bar" +passwd = "bar" -[[copy_files]] -dst = "/usr/lib/systemd/system" -src = "/root/KubeOS/volume.service" +# [[copy_files]] +# dst = "/usr/lib/systemd/system" +# src = "/root/KubeOS/volume.service" # [[copy_files]] # dst = "/usr/lib/systemd/system" # src = "/root/KubeOS/ztest/kubelet.service" -# [grub] -# passwd = "foo" +[grub] +passwd = "foo" -[systemd_service] -name = ["volume"] +# [systemd_service] +# name = ["volume"] # [chroot_script] # path = "../../ztest/myscript.sh" @@ -74,5 +74,5 @@ name = ["volume"] # third = 2300 # img_size = 30 -[persist_mkdir] -name = ["lv_data"] +# [persist_mkdir] +# name = ["lv_data"] -- Gitee From cd3ac74e98452fc27f455527cb17558e8ff4a2e9 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 29 Aug 2024 15:40:39 +0800 Subject: [PATCH 100/116] Complete! --- KubeOS-Rust/kbimg/kbimg.toml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/KubeOS-Rust/kbimg/kbimg.toml b/KubeOS-Rust/kbimg/kbimg.toml index 8f721491..63252c3a 100644 --- a/KubeOS-Rust/kbimg/kbimg.toml +++ b/KubeOS-Rust/kbimg/kbimg.toml @@ -40,16 +40,16 @@ rpmlist = [ # dockerfile = "" # docker_img = "" -[[users]] -groups = ["admin"] -name = "foo" -passwd = "foo" -sudo = "ALL=(ALL) ALL" +# [[users]] +# groups = ["admin"] +# name = "foo" +# passwd = "foo" +# sudo = "ALL=(ALL) ALL" -[[users]] -groups = ["example"] -name = "bar" -passwd = "bar" +# [[users]] +# groups = ["example"] +# name = "bar" +# passwd = "bar" # [[copy_files]] # dst = "/usr/lib/systemd/system" @@ -59,8 +59,8 @@ passwd = "bar" # dst = "/usr/lib/systemd/system" # src = "/root/KubeOS/ztest/kubelet.service" -[grub] -passwd = "foo" +# [grub] +# passwd = "foo" # [systemd_service] # name = ["volume"] -- Gitee From eb9a3025dbf5861458d17e478c1ed5940c0eaab8 Mon Sep 17 00:00:00 2001 From: Tomoki_sunzj Date: Thu, 29 Aug 2024 17:48:55 +0800 Subject: [PATCH 101/116] Clean! --- Makefile | 9 +- docs/quick-start.md | 16 +- files/boot-efi.mount | 24 - files/boot-grub2.mount | 14 - files/etc.mount | 26 - files/os-agent.service | 21 - files/os-release | 2 - files/persist.mount | 24 - files/var.mount | 26 - scripts/00bootup/Global.cfg | 16 - scripts/00bootup/module-setup.sh | 22 - scripts/00bootup/mount.sh | 372 ------------ scripts/Dockerfile | 3 - scripts/add_user.sh | 26 - scripts/admin-container/Dockerfile | 28 - .../admin-container/set-ssh-pub-key.service | 15 - scripts/admin-container/set-ssh-pub-key.sh | 26 - scripts/bootloader.sh | 42 -- scripts/common/globalVariables.sh | 22 - scripts/common/log.sh | 22 - scripts/common/utils.sh | 231 -------- scripts/create/imageCreate.sh | 123 ---- scripts/create/rootfsCreate.sh | 246 -------- scripts/grub.cfg | 173 ------ scripts/kbimg.sh | 558 ------------------ scripts/rpmlist | 23 - scripts/set_in_chroot.sh | 20 - 27 files changed, 17 insertions(+), 2113 deletions(-) delete mode 100644 files/boot-efi.mount delete mode 100644 files/boot-grub2.mount delete mode 100644 files/etc.mount delete mode 100644 files/os-agent.service delete mode 100644 files/os-release delete mode 100644 files/persist.mount delete mode 100644 files/var.mount delete mode 100644 scripts/00bootup/Global.cfg delete mode 100644 scripts/00bootup/module-setup.sh delete mode 100644 scripts/00bootup/mount.sh delete mode 100644 scripts/Dockerfile delete mode 100644 scripts/add_user.sh delete mode 100644 scripts/admin-container/Dockerfile delete mode 100644 scripts/admin-container/set-ssh-pub-key.service delete mode 100755 scripts/admin-container/set-ssh-pub-key.sh delete mode 100644 scripts/bootloader.sh delete mode 100644 scripts/common/globalVariables.sh delete mode 100644 scripts/common/log.sh delete mode 100644 scripts/common/utils.sh delete mode 100644 scripts/create/imageCreate.sh delete mode 100644 scripts/create/rootfsCreate.sh delete mode 100644 scripts/grub.cfg delete mode 100644 scripts/kbimg.sh delete mode 100644 scripts/rpmlist delete mode 100644 scripts/set_in_chroot.sh diff --git a/Makefile b/Makefile index 75017f9e..d91b3dbf 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,7 @@ all: proxy operator agent hostshell rust-kubeos # Build binary proxy: - ${GO_BUILD_CGO} ${LD_FLAGS} -o bin/proxy cmd/proxy/main.go + ${GO_BUILD_CGO} ${LD_FLAGS} -o bin/proxy cmd/proxy/main.go strip bin/proxy operator: @@ -76,6 +76,13 @@ rust-proxy: rust-agent: cd KubeOS-Rust && ${RUSTFLAGS} cargo build --profile release --target-dir ../bin/rust --package os-agent +rust-kbimg: + cd KubeOS-Rust && ${RUSTFLAGS} cargo build --profile release --target-dir ../bin/rust --package kbimg + +# clean binary +clean: + rm -rf bin + # Install CRDs into a cluster install: manifests kubectl apply -f config/crd diff --git a/docs/quick-start.md b/docs/quick-start.md index 9656fb99..d9eeeb31 100644 --- a/docs/quick-start.md +++ b/docs/quick-start.md @@ -28,6 +28,7 @@ * operator:负责控制集群的升级 * proxy:负责集群和agent通信,从k8s传递升级指令给agent,从agent传递升级状态给k8s * os-agent:负责节点升级和运维 + * kbimg: 负责构件KubeOS虚拟机镜像 ```shell cd KubeOS @@ -42,6 +43,7 @@ │   ├── ... │   └── release │   ├── ... + │   ├── kbimg │   ├── os-agent │   └── proxy ``` @@ -105,16 +107,16 @@ * 请确保os-agent属主和属组为root,建议os-agent文件权限为500 * 容器OS虚拟机镜像制作 - 进入scripts目录,执行脚本 + * 进入KubeOS-Rust/kbimg/kbimg.toml文件,修改镜像配置,详见 [容器OS镜像制作指导](user_guide/容器OS镜像制作指导.md) + * 执行kbimg二进制 - ```shell - cd scripts - bash kbimg.sh create vm-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' - ``` + ```shell + bin/rust/release/kbimg -c KubeOS-Rust/kbimg/kbimg.toml + ``` * 其中 xx.repo 为制作镜像所需要的 yum 源,yum 源建议配置为 openEuler 具体版本的 everything 仓库和 EPOL 仓库。 - * 容器 OS 镜像制作完成后,会在 scripts 目录下生成: - * raw格式的系统镜像system.img,system.img大小默认为20G,支持的根文件系统分区大小<2020MiB,持久化分区<16GB。 + * 容器 OS 镜像制作完成后,会在当前工作目录下生成: + * raw格式的系统镜像 system.img ,system.img大小默认为20G,支持的根文件系统分区大小<2020MiB,持久化分区<16GB。 * qcow2 格式的系统镜像 system.qcow2。 * 可用于升级的根文件系统分区镜像 update.img 。 * 制作出来的容器 OS 虚拟机镜像目前只能用于 CPU 架构为 x86 和 AArch64 的虚拟机场景,x86 架构的虚拟机使用 legacy 启动模式启动需制作镜像时指定-l参数 diff --git a/files/boot-efi.mount b/files/boot-efi.mount deleted file mode 100644 index cd0e79b7..00000000 --- a/files/boot-efi.mount +++ /dev/null @@ -1,24 +0,0 @@ -## Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. - # KubeOS is licensed under the Mulan PSL v2. - # You can use this software according to the terms and conditions of the Mulan PSL v2. - # You may obtain a copy of Mulan PSL v2 at: - # http://license.coscl.org.cn/MulanPSL2 - # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - # PURPOSE. -## See the Mulan PSL v2 for more details. - -[Unit] -Description=grub2 Dir -DefaultDependencies=no -Conflicts=umount.target -Before=local-fs.target umount.target - -[Mount] -What=/dev/disk/by-label/BOOT -Where=/boot/efi -Type=vfat -Options=defaults - -[Install] -WantedBy=local-fs.target diff --git a/files/boot-grub2.mount b/files/boot-grub2.mount deleted file mode 100644 index e6c41500..00000000 --- a/files/boot-grub2.mount +++ /dev/null @@ -1,14 +0,0 @@ -[Unit] -Description=grub2 Dir -DefaultDependencies=no -Conflicts=umount.target -Before=local-fs.target umount.target - -[Mount] -What=/dev/disk/by-label/GRUB2 -Where=/boot/grub2 -Type=ext4 -Options=defaults - -[Install] -WantedBy=local-fs.target diff --git a/files/etc.mount b/files/etc.mount deleted file mode 100644 index 7501f78a..00000000 --- a/files/etc.mount +++ /dev/null @@ -1,26 +0,0 @@ -## Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. - # KubeOS is licensed under the Mulan PSL v2. - # You can use this software according to the terms and conditions of the Mulan PSL v2. - # You may obtain a copy of Mulan PSL v2 at: - # http://license.coscl.org.cn/MulanPSL2 - # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - # PURPOSE. -## See the Mulan PSL v2 for more details. - -[Unit] -Description=etc Dir -DefaultDependencies=no -Conflicts=umount.target -Before=local-fs.target umount.target -Wants=persist.mount -After=persist.mount - -[Mount] -What=overlay -Where=/etc -Type=overlay -Options=upperdir=/persist/etc,lowerdir=/etc,workdir=/persist/etcwork - -[Install] -WantedBy=local-fs.target diff --git a/files/os-agent.service b/files/os-agent.service deleted file mode 100644 index f7788049..00000000 --- a/files/os-agent.service +++ /dev/null @@ -1,21 +0,0 @@ -## Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. - # KubeOS is licensed under the Mulan PSL v2. - # You can use this software according to the terms and conditions of the Mulan PSL v2. - # You may obtain a copy of Mulan PSL v2 at: - # http://license.coscl.org.cn/MulanPSL2 - # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - # PURPOSE. -## See the Mulan PSL v2 for more details. - -[Unit] -Description=Agent For KubeOS - -[Service] -Environment=GOTRACEBACK=crash -ExecStart=/usr/bin/os-agent -KillMode=process -Restart=on-failure - -[Install] -WantedBy=multi-user.target diff --git a/files/os-release b/files/os-release deleted file mode 100644 index e55b57ca..00000000 --- a/files/os-release +++ /dev/null @@ -1,2 +0,0 @@ -NAME=KubeOS -ID=KubeOS diff --git a/files/persist.mount b/files/persist.mount deleted file mode 100644 index edc46d2b..00000000 --- a/files/persist.mount +++ /dev/null @@ -1,24 +0,0 @@ -## Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. - # KubeOS is licensed under the Mulan PSL v2. - # You can use this software according to the terms and conditions of the Mulan PSL v2. - # You may obtain a copy of Mulan PSL v2 at: - # http://license.coscl.org.cn/MulanPSL2 - # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - # PURPOSE. -## See the Mulan PSL v2 for more details. - -[Unit] -Description=PERSIST Dir (/persist) -DefaultDependencies=no -Conflicts=umount.target -Before=local-fs.target umount.target - -[Mount] -What=/dev/disk/by-label/PERSIST -Where=/persist -Type=ext4 -Options=defaults - -[Install] -WantedBy=local-fs.target diff --git a/files/var.mount b/files/var.mount deleted file mode 100644 index 4343207d..00000000 --- a/files/var.mount +++ /dev/null @@ -1,26 +0,0 @@ -## Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. - # KubeOS is licensed under the Mulan PSL v2. - # You can use this software according to the terms and conditions of the Mulan PSL v2. - # You may obtain a copy of Mulan PSL v2 at: - # http://license.coscl.org.cn/MulanPSL2 - # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - # PURPOSE. -## See the Mulan PSL v2 for more details. - -[Unit] -Description=var Dir -DefaultDependencies=no -Conflicts=umount.target -Before=local-fs.target umount.target -Wants=persist.mount -After=persist.mount - -[Mount] -What=/persist/var -Where=/var -Type=node -Options=bind - -[Install] -WantedBy=local-fs.target diff --git a/scripts/00bootup/Global.cfg b/scripts/00bootup/Global.cfg deleted file mode 100644 index dd78617c..00000000 --- a/scripts/00bootup/Global.cfg +++ /dev/null @@ -1,16 +0,0 @@ -# rootfs file name -rootfs_name=kubeos.tar - -# select the target disk to install kubeOS -disk=/dev/sda - -# pxe server ip address where stores the rootfs on the http server -server_ip=192.168.1.50 -# target machine ip -local_ip=192.168.1.100 -# target machine route -route_ip=192.168.1.1 -# target machine netmask -netmask=255.255.255.0 -# target machine netDevice name -net_name=eth0 diff --git a/scripts/00bootup/module-setup.sh b/scripts/00bootup/module-setup.sh deleted file mode 100644 index 75b33ab3..00000000 --- a/scripts/00bootup/module-setup.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 deleted file mode 100644 index a9eacdad..00000000 --- a/scripts/00bootup/mount.sh +++ /dev/null @@ -1,372 +0,0 @@ -#!/bin/bash -arch=$(arch) -min_size=8 -log=/install.log - -source 00bootup/Global.cfg - -function CheckSpace() { - local disk_ava - 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 mount_proc_dev_sys() { - local tmp_root=$1 - mount -t proc none "${tmp_root}/proc" - mount --bind /dev "${tmp_root}/dev" - mount --bind /dev/pts "${tmp_root}/dev/pts" - mount -t sysfs none "${tmp_root}/sys" -} - -function GetDisk() { - mapfile -t disks < <(hwinfo --disk --short 2>&1 | grep -vi "^disk" | awk '{print $1}') - if [ ${#disks[*]} -gt 0 ]; then - if [ -n "${disk}" ] && echo "${disks[@]}" | grep -wq "${disk}" ; then - echo "${disk} exists, start partition" | tee -a ${log} - else - echo "disk not exist, please choose correct disk" | tee -a ${log} - fi - else - echo "no disk found" | tee -a ${log} - return 1 - fi - CheckSpace - local status=$? - if [ $status -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 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${log} - return 1 - fi - - parted "${disk}" -s mkpart primary fat16 1M 100M >> ${log} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${log} - return 1 - fi - - parted "${disk}" -s mkpart primary ext4 100M 2600M >> ${log} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${log} - return 1 - fi - - parted "${disk}" -s mkpart primary ext4 2600M 5100M >> ${log} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${log} - return 1 - fi - - parted "${disk}" -s mkpart primary ext4 5100M 100% >> ${log} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${log} - return 1 - fi - - parted "${disk}" -s set 1 boot on >> ${log} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "partition failed" | tee -a ${log} - return 1 - fi - - mkfs.vfat -n "BOOT" "${disk}"1 >> ${log} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "format failed" | tee -a ${log} - return 1 - fi - - mkfs.ext4 -L "ROOT-A" "${disk}"2 >> ${log} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "format failed" | tee -a ${log} - return 1 - fi - - mkfs.ext4 -L "ROOT-B" "${disk}"3 >> ${log} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "format failed" | tee -a ${log} - return 1 - fi - - mkfs.ext4 -L "PERSIST" "${disk}"4 >> ${log} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "format failed" | tee -a ${log} - return 1 - fi - - return 0 -} - -function InitNetwork() { - echo "Initializing network..." - mapfile -t netNames < <(ifconfig -a | awk '{print $1}' | grep : | grep '^e' | awk -F: '{print $1}') - if [ ${#netNames[*]} -gt 0 ]; then - if [ -n "${net_name}" ] && echo "${netNames[@]}" | grep -wq "${net_name}" ; then - echo "${net_name} exists, start set ip" | tee -a ${log} - else - echo "net_name not exist, choose default net" | tee -a ${log} - net_name=${netNames[0]} - fi - else - echo "no net Device found" | tee -a ${log} - return 1 - fi - - ifconfig "${net_name}" up - local status=$? - if [ $status -ne 0 ]; then - echo "load net card failed" | tee -a ${log} - return 1 - fi - sleep 3 - - ifconfig "${net_name}" "${local_ip}" netmask "${netmask}" >> ${log} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "ip set failed" | tee -a ${log} - return 1 - fi - sleep 3 - - route add default gw "${route_ip}" >> ${log} 2>&1 - local status=$? - if [ $status -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 - local status=$? - if [ $status -ne 0 ]; then - echo "mount rootfs failed" | tee -a ${log} - return 1 - fi - - return 0 -} - -function MountPersist() { - echo "Mounting persist" - mount "${disk}"4 /sysroot/persist >> ${log} 2>&1 - local status=$? - if [ $status -ne 0 ]; then - echo "mount persist failed" | tee -a ${log} - return 1 - fi - mkdir /sysroot/persist/{var,etc,etcwork} - mkdir -p /sysroot/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 - local status=$? - if [ $status -ne 0 ]; then - echo "mount boot failed" | tee -a ${log} - return 1 - fi - return 0 -} - -function GetRootfs() { - echo "Downloading rootfs..." - - curl -o /"${rootfs_name}" http://"${server_ip}"/"${rootfs_name}" - if [ ! -e "/${rootfs_name}" ]; then - echo "download rootfs failed" | tee -a ${log} - return 1 - fi - - tar -xf /"${rootfs_name}" -C /sysroot - local status=$? - if [ $status -ne 0 ]; then - echo "decompose rootfs failed" | tee -a ${log} - return 1 - fi - - rm -rf "${rootfs_name:?}" - mount -o remount,ro "${disk}"2 /sysroot >> ${log} 2>&1 - 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 - local status=$? - if [ $status -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 - local status=$? - if [ $status -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 - local status=$? - if [ $status -ne 0 ]; then - echo "install grub on x86 failed" | tee -a ${log} - return 1 - fi - fi - - if [ "$arch" == "aarch64" ]; then - Inst_Grub2_aarch64 - local status=$? - if [ $status -ne 0 ]; then - echo "install grub on aarch64 failed" | tee -a ${log} - return 1 - fi - fi - sed -i 's#/dev/sda#'"${disk}"'#g' /sysroot/boot/efi/EFI/openEuler/grub.cfg - - return 0 -} - -function Bootup_Main() { - # get disk - echo "Checking disk info..." | tee -a ${log} - GetDisk - local status=$? - if [ $status -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 - local status=$? - if [ $status -ne 0 ]; then - echo "Partition and formatting disk failed" | tee -a ${log} - return 1 - fi - - # init network - echo "Initializing network..." | tee -a ${log} - InitNetwork - local status=$? - if [ $status -ne 0 ]; then - echo "Initializing network failed" | tee -a ${log} - return 1 - fi - - # mount partitions - - # mount boot - echo "Mounting root..." | tee -a ${log} - MountRoot - local status=$? - if [ $status -ne 0 ]; then - echo "Mounting root failed" | tee -a ${log} - return 1 - fi - - echo "Mounting boot..." | tee -a ${log} - MountBoot - local status=$? - if [ $status -ne 0 ]; then - echo "Mounting boot failed" | tee -a ${log} - return 1 - fi - - # download rootfs - echo "Downloading rootfs..." | tee -a ${log} - GetRootfs - local status=$? - if [ $status -ne 0 ]; then - echo "Downloading rootfs failed" | tee -a ${log} - return 1 - fi - mount_proc_dev_sys /sysroot - # set boot - echo "Setting boot..." | tee -a ${log} - SetBoot - local status=$? - if [ $status -ne 0 ]; then - echo "Setting boot failed" | tee -a ${log} - return 1 - fi - # mount persist - echo "Mounting persist..." | tee -a ${log} - MountPersist - local status=$? - if [ $status -ne 0 ]; then - echo "Mounting persist 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} /sysroot/persist -else - echo "kubeOS install failed, see install.log" | tee -a ${log} -fi diff --git a/scripts/Dockerfile b/scripts/Dockerfile deleted file mode 100644 index 3da47081..00000000 --- a/scripts/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM scratch -COPY os.tar / -CMD ["/bin/sh"] diff --git a/scripts/add_user.sh b/scripts/add_user.sh deleted file mode 100644 index 6dc33075..00000000 --- a/scripts/add_user.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -username=$1 -password=$2 -groupname=$3 -superuser=$4 -echo "${username} ${password} ${groupname} ${superuser}" -if ! getent group "${groupname}" > /dev/null 2>&1; then - echo "Add group ${groupname}" - groupadd "${groupname}" -fi -useradd -m -g "${groupname}" -s /bin/bash "${username}" -echo "${username}:${password}" | chpasswd -if [ "${superuser}" -eq 0 ]; then - if visudo -c; then - echo -e "${username}\tALL=(ALL:ALL)\tALL" | tee -a /etc/sudoers - if grep -q "${username}" /etc/sudoers; then - echo "Sudo privileges added for user ${username}." - else - echo "Failed to add sudo privileges for user ${username}." - fi - else - echo "Sudoers file syntax check failed. Please fix the sudoers file manually." - exit 5 - fi -fi diff --git a/scripts/admin-container/Dockerfile b/scripts/admin-container/Dockerfile deleted file mode 100644 index d4ddd062..00000000 --- a/scripts/admin-container/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -## Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. -# KubeOS is licensed under the Mulan PSL v2. -# You can use this software according to the terms and conditions of the Mulan PSL v2. -# You may obtain a copy of Mulan PSL v2 at: -# http://license.coscl.org.cn/MulanPSL2 -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -# PURPOSE. -## See the Mulan PSL v2 for more details. - -FROM openeuler-22.03-lts -MAINTAINER - -RUN yum -y install openssh-clients util-linux - - -ADD ./sysmaster-0.2.3-1.oe2203.aarch64.rpm /home -RUN rpm -ivh /home/sysmaster-0.2.3-1.oe2203.aarch64.rpm - -COPY ./hostshell /usr/bin/ -COPY ./set-ssh-pub-key.sh /usr/local/bin -COPY ./set-ssh-pub-key.service /usr/lib/sysmaster - -EXPOSE 22 -# set sshd.service and set-ssh-pub-key.service pulled up by default -RUN sed -i 's/sysinit.target/sysinit.target;sshd.service;set-ssh-pub-key.service/g' /usr/lib/sysmaster/basic.target - -CMD ["/usr/lib/sysmaster/init"] diff --git a/scripts/admin-container/set-ssh-pub-key.service b/scripts/admin-container/set-ssh-pub-key.service deleted file mode 100644 index 84dd12d9..00000000 --- a/scripts/admin-container/set-ssh-pub-key.service +++ /dev/null @@ -1,15 +0,0 @@ -## Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. - # KubeOS is licensed under the Mulan PSL v2. - # You can use this software according to the terms and conditions of the Mulan PSL v2. - # You may obtain a copy of Mulan PSL v2 at: - # http://license.coscl.org.cn/MulanPSL2 - # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - # PURPOSE. -## See the Mulan PSL v2 for more details. - -[Unit] -Description="set ssh authorized keys according to the secret which is set by user" - -[Service] -ExecStart="/usr/local/bin/set-ssh-pub-key.sh" diff --git a/scripts/admin-container/set-ssh-pub-key.sh b/scripts/admin-container/set-ssh-pub-key.sh deleted file mode 100755 index e91a15de..00000000 --- a/scripts/admin-container/set-ssh-pub-key.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -## Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. -# KubeOS is licensed under the Mulan PSL v2. -# You can use this software according to the terms and conditions of the Mulan PSL v2. -# You may obtain a copy of Mulan PSL v2 at: -# http://license.coscl.org.cn/MulanPSL2 -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -# PURPOSE. -## See the Mulan PSL v2 for more details. - -ssh_pub=$(cat /etc/secret-volume/ssh-pub-key) -ssh_dir="/root/.ssh" -authorized_file="$ssh_dir/authorized_keys" - -if [ ! -d "$ssh_dir" ]; then - mkdir "$ssh_dir" - chmod 700 "$ssh_dir" -fi - -if [ ! -f "$authorized_file" ]; then - touch "$authorized_file" - chmod 600 "$authorized_file" -fi - -echo "$ssh_pub" >> "$authorized_file" diff --git a/scripts/bootloader.sh b/scripts/bootloader.sh deleted file mode 100644 index fdab587f..00000000 --- a/scripts/bootloader.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -set -eu -set -o pipefail -set -x -ARCH=$(arch) - -function install_grub2_x86 () -{ - if [ "$BOOT_MODE" = "legacy" ]; then - # make boot.img/core.img and setup, to support legacy boot mode - GRUBNAME=$(which grub2-install) - echo "Installing GRUB2..." - FORCE_OPT=${FORCE_OPT:-"--force"} - TARGET_OPT=${TARGET_OPT:-"--target=i386-pc"} - - $GRUBNAME --modules="biosdisk part_msdos" "$FORCE_OPT" "$TARGET_OPT" "$DEVICE" - else - # make efi file, and save in FAT16 partition, to support UEFI boot mode - cp -r /usr/lib/grub/x86_64-efi boot/efi/EFI/openEuler - eval "grub2-mkimage -d /usr/lib/grub/x86_64-efi -O x86_64-efi --output=/boot/efi/EFI/openEuler/grubx64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" - - mkdir -p /boot/efi/EFI/BOOT/ - cp -f /boot/efi/EFI/openEuler/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI - fi -} - -function install_grub2_efi () -{ - cp -r /usr/lib/grub/arm64-efi /boot/efi/EFI/openEuler/ - eval "grub2-mkimage -d /usr/lib/grub/arm64-efi -O arm64-efi --output=/boot/efi/EFI/openEuler/grubaa64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" - - mkdir -p /boot/efi/EFI/BOOT/ - cp -f /boot/efi/EFI/openEuler/grubaa64.efi /boot/efi/EFI/BOOT/BOOTAA64.EFI -} - -if [ "$ARCH" == "x86_64" ]; then - install_grub2_x86 -fi - -if [ "$ARCH" == "aarch64" ]; then - install_grub2_efi -fi diff --git a/scripts/common/globalVariables.sh b/scripts/common/globalVariables.sh deleted file mode 100644 index 95af9c85..00000000 --- a/scripts/common/globalVariables.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -## Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. -# KubeOS is licensed under the Mulan PSL v2. -# You can use this software according to the terms and conditions of the Mulan PSL v2. -# You may obtain a copy of Mulan PSL v2 at: -# http://license.coscl.org.cn/MulanPSL2 -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -# PURPOSE. -## See the Mulan PSL v2 for more details. - -IMG_SIZE=20 -PWD="$(pwd)" -TMP_MOUNT_PATH="${PWD}/mnt" -RPM_ROOT="${PWD}/rootfs" -ARCH=$(arch) - -export IMG_SIZE -export PWD -export TMP_MOUNT_PATH -export RPM_ROOT -export ARCH diff --git a/scripts/common/log.sh b/scripts/common/log.sh deleted file mode 100644 index 1d3696e6..00000000 --- a/scripts/common/log.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -## Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. -# KubeOS is licensed under the Mulan PSL v2. -# You can use this software according to the terms and conditions of the Mulan PSL v2. -# You may obtain a copy of Mulan PSL v2 at: -# http://license.coscl.org.cn/MulanPSL2 -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -# PURPOSE. -## See the Mulan PSL v2 for more details. - -function log_error_print(){ - local logmsg - logmsg="[ ERROR ] - ""$(date "+%b %d %Y %H:%M:%S")"" $1" - echo "$logmsg" -} - -function log_info_print(){ - local logmsg - logmsg="[ INFO ] - ""$(date "+%b %d %Y %H:%M:%S")"" $1" - echo "$logmsg" -} diff --git a/scripts/common/utils.sh b/scripts/common/utils.sh deleted file mode 100644 index 02e71e51..00000000 --- a/scripts/common/utils.sh +++ /dev/null @@ -1,231 +0,0 @@ -#!/bin/bash -## Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. -# KubeOS is licensed under the Mulan PSL v2. -# You can use this software according to the terms and conditions of the Mulan PSL v2. -# You may obtain a copy of Mulan PSL v2 at: -# http://license.coscl.org.cn/MulanPSL2 -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -# PURPOSE. -## See the Mulan PSL v2 for more details. - -CHECK_REGEX='\||;|&|&&|\|\||>|>>|<|,|#|!|\$' - -source 00bootup/Global.cfg - -function mount_proc_dev_sys() { - local tmp_root=$1 - mount -t proc none "${tmp_root}/proc" - mount --bind /dev "${tmp_root}/dev" - mount --bind /dev/pts "${tmp_root}/dev/pts" - mount -t sysfs none "${tmp_root}/sys" -} - -function unmount_dir() { - local dir=$1 - - if [ -L "${dir}" ] || [ -f "${dir}" ]; then - log_error_print "${dir} is not a directory, please check it." - return 1 - fi - - if [ ! -d "${dir}" ]; then - return 0 - fi - - local real_dir - real_dir=$(readlink -e "${dir}") - local mnts - mnts=$(awk '{print $2}' < /proc/mounts | grep "^${real_dir}" | sort -r) - for m in ${mnts}; do - log_info_print "Unmount ${m}" - umount -f "${m}" || true - done - - return 0 -} - -function init_part() { - local offset - offset=$(fdisk -l system.img | grep "$1" | awk '{print $2}') - local sizelimit - sizelimit=$(fdisk -l system.img | grep "$1" | awk '{print $3}') - sizelimit=$(echo "($sizelimit - $offset)*512" | bc) - offset=$(echo "${offset}*512" | bc) - local loop - loop=$(losetup -f) - losetup -o "${offset}" --sizelimit "${sizelimit}" "${loop}" system.img - if [ "$2" == "BOOT" ];then - mkfs.vfat -n "$2" "${loop}" - mount -t vfat "${loop}" "$3" - else - mkfs.ext4 -L "$2" "${loop}" - mount -t ext4 "${loop}" "$3" - rm -rf "$3/lost+found" - fi -} - -function delete_dir() { - local ret=0 - local dir="$1" - unmount_dir "${dir}" - ret=$? - if [ "${ret}" -eq 0 ]; then - rm -rf "${dir}" - return 0 - else - log_error_print "${dir} is failed to unmount , can not delete $dir." - return 1 - fi -} - -function delete_file() { - local file="$1" - if [ ! -e "${file}" ]; then - return 0 - fi - - if [ ! -f "${file}" ]; then - log_error_print "${file} is not a file." - return 1 - fi - - rm -f "${file}" - return 0 -} - -function check_file_valid() { - local file="$1" - local mesg="$2" - if [ ! -e "${file}" ]; then - log_error_print "${mesg} is not exist." - exit 3 - fi - if [ ! -f "${file}" ];then - log_error_print "${mesg} is not a file." - exit 3 - fi -} - -function check_dir_valid() { - local dir="$1" - local mesg="$2" - if [ ! -e "${dir}" ]; then - mkdir -p "${dir}" - fi - if [ ! -d "${dir}" ]; then - log_error_print "${mesg} is not a directory." - exit 3 - fi -} - -function check_conf_valid() { - local conf_path="${PWD}/00bootup/Global.cfg" - check_file_valid "${conf_path}" "Globab.cfg" - if [ $# != 7 ];then - log_error_print "configure configured in Global.cfg is empty." - exit 3 - fi - for addr in ${server_ip} ${local_ip} ${route_ip} ${netmask}; do - check_ip_valid "$addr" - done -} - -function check_ip_valid() { - local ipaddr="$1"; - if [[ ! $ipaddr =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] ; then - log_error_print "ip address configured in Global.cfg is not valid." - exit 3; - fi - for quad in ${ipaddr//./ }; do - if [ "$quad" -ge 0 ] && [ "$quad" -le 255 ];then - continue - fi - log_error_print "ip address configured in Global.cfg is not valid." - exit 3; - done - -} - -function check_binary_exist() { - check_file_valid "$1" "os-agent binary" -} - -function check_repo_path() { - check_file_valid "$1" "REPO file" - if [ -d "${RPM_ROOT}" ]; then - log_error_print "there is a rootfs folder. please confirm if rootfs is being used, if not, please remove ${RPM_ROOT} first." - exit 5 - fi -} - -function check_disk_space() { - local disk_ava - disk_ava="$(df "${PWD}" | awk 'NR==2{print}' | awk '{print $4}')" - case $1 in - docker) - local maxsize=$((6*1024*1024)) - if [ "${disk_ava}" -lt "${maxsize}" ]; then - log_error_print "The available disk space is not enough, at least 6GiB." - exit 6 - fi - ;; - vm) - local maxsize=$((25*1024*1024)) - if [ "${disk_ava}" -lt "${maxsize}" ]; then - log_error_print "The available disk space is not enough, at least 25GiB." - exit 6 - fi - ;; - pxe) - local maxsize=$((5*1024*1024)) - if [ "${disk_ava}" -lt "${maxsize}" ]; then - log_error_print "The available disk space is not enough, at least 5GiB." - exit 6 - fi - ;; - esac -} - -function check_param() { - set +eE - local arg=$1 - echo "${arg}" | grep -v -E -q ${CHECK_REGEX} - filterParam=$(echo "${arg}" | grep -v -E ${CHECK_REGEX}) - if [[ "${filterParam}" != "${arg}" ]]; then - log_error_print "params ${arg} is invalid, please check it." - exit 3 - fi - set -eE -} - -function check_docker_exist() { - if [[ "$(docker images -q "$1" 2> /dev/null)" == "" ]]; then - log_error_print "docker is not exist please pull $1 first " - exit 9 - fi -} - -function check_docker_file() { - check_file_valid "$1" "admin-container Dockerfile" -} - -function check_copyfile_valid() { - local SRC_FILES=$1 - # local DST_DIRS=$2 - local src_files=() - # local dst_dirs=() - while read -r src_file; do - check_file_valid "${src_file}" "${src_file}" - src_files+=("$src_file") - done < <(echo "$SRC_FILES" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') - # while read -r dst_dir; do - # dst_dirs+=("$dst_dir") - # done < <(echo "$DST_DIRS" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') - # local len1=${#src_files[@]} - # local len2=${#dst_dirs[@]} - # if [ "$len1" -ne "$len2" ]; then - # log_error_print "the numbers of source files and destination directories are not equal, please check input" - # exit 4 - # fi -} diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh deleted file mode 100644 index 211c00f6..00000000 --- a/scripts/create/imageCreate.sh +++ /dev/null @@ -1,123 +0,0 @@ -#!/bin/bash -## Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. -# KubeOS is licensed under the Mulan PSL v2. -# You can use this software according to the terms and conditions of the Mulan PSL v2. -# You may obtain a copy of Mulan PSL v2 at: -# http://license.coscl.org.cn/MulanPSL2 -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -# PURPOSE. -## See the Mulan PSL v2 for more details. - -TMP_MOUNT_PATH="${PWD}/mnt" -IMG_SIZE=20 -PWD="$(pwd)" -function create_img() { - local BOOT_MODE=$1 - rm -f system.img update.img - qemu-img create system.img ${IMG_SIZE}G - if [ "$BOOT_MODE" = "legacy" ]; then - local BOOT_PATH=${TMP_MOUNT_PATH}/boot/grub2 - parted system.img -s mklabel msdos - parted system.img -s mkpart primary ext4 1MiB 60MiB - else - local BOOT_PATH=${TMP_MOUNT_PATH}/boot/efi - parted system.img -s mklabel gpt - parted system.img -s mkpart primary fat32 1MiB 60MiB - fi - parted system.img -s mkpart primary ext4 60MiB 2160MiB - parted system.img -s mkpart primary ext4 2160MiB 4260MiB - parted system.img -s mkpart primary ext4 4260MiB 100% - local device - device=$(losetup -f) - losetup "${device}" system.img - - mkdir -p "${TMP_MOUNT_PATH}" - - init_part system.img2 ROOT-A "${TMP_MOUNT_PATH}" - - mkdir -p "${BOOT_PATH}" - chmod 755 "${BOOT_PATH}" - if [ "$BOOT_MODE" = "legacy" ]; then - init_part system.img1 GRUB2 "${BOOT_PATH}" - else - init_part system.img1 BOOT "${BOOT_PATH}" - fi - tar -x -C "${TMP_MOUNT_PATH}" -f os.tar - if [ "$BOOT_MODE" = "legacy" ]; then - sed -i "s/insmod part_gpt/insmod part_msdos/g; \ -s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ -s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ -"${TMP_MOUNT_PATH}"/boot/grub2/grub.cfg - fi - sync - cp bootloader.sh "${TMP_MOUNT_PATH}" - mount_proc_dev_sys "${TMP_MOUNT_PATH}" - DEVICE="${device}" BOOT_MODE="${BOOT_MODE}" chroot "${TMP_MOUNT_PATH}" bash bootloader.sh - rm -rf "${TMP_MOUNT_PATH}/bootloader.sh" - sync - - dd if=/dev/disk/by-label/ROOT-A of=update.img bs=8M - sync - unmount_dir "${TMP_MOUNT_PATH}" - init_part system.img3 ROOT-B "${TMP_MOUNT_PATH}" - umount "${TMP_MOUNT_PATH}" - - init_part system.img4 PERSIST "${TMP_MOUNT_PATH}" - mkdir "${TMP_MOUNT_PATH}"/{var,etc,etcwork} - mkdir -p "${TMP_MOUNT_PATH}"/etc/KubeOS/certs - umount "${TMP_MOUNT_PATH}" - - losetup -D - parted system.img -- set 1 boot on - qemu-img convert system.img -O qcow2 system.qcow2 -} - -function create_pxe_img() { - rm -rf initramfs.img kubeos.tar - local opt=$1 - shift - case $opt in - "repo") - create_os_tar_from_repo "$@" - ;; - "docker") - create_os_tar_from_docker "$@" - ;; - esac - tar -xvf os.tar ./initramfs.img - mv os.tar kubeos.tar -} - -function create_docker_image() { - local DOCKER_IMG="$1" - shift - create_os_tar_from_repo "$@" - docker build -t "${DOCKER_IMG}" -f ./Dockerfile . -} - -function create_vm_img() { - local opt=$1 - shift - local BOOT_MODE=$5 - case $opt in - "repo") - create_os_tar_from_repo "$@" - create_img "${BOOT_MODE}" - ;; - "docker") - create_os_tar_from_docker "$@" - create_img "${BOOT_MODE}" - ;; - esac - -} - -function create_admin_img() { - local DOCKERFILE="$1" - local DOCKER_IMG="$2" - local ADMIN_CONTAINER_DIR="$3" - cp ../bin/hostshell "${ADMIN_CONTAINER_DIR}" - docker build -t "${DOCKER_IMG}" -f "${DOCKERFILE}" "${ADMIN_CONTAINER_DIR}" - rm -rf "${ADMIN_CONTAINER_DIR}"/hostshell -} \ No newline at end of file diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh deleted file mode 100644 index 481cd5c9..00000000 --- a/scripts/create/rootfsCreate.sh +++ /dev/null @@ -1,246 +0,0 @@ -#!/bin/bash -## Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. -# KubeOS is licensed under the Mulan PSL v2. -# You can use this software according to the terms and conditions of the Mulan PSL v2. -# You may obtain a copy of Mulan PSL v2 at: -# http://license.coscl.org.cn/MulanPSL2 -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -# PURPOSE. -## See the Mulan PSL v2 for more details. - -function prepare_yum() { - # init rpmdb - local REPO=$1 - rpm --root "${RPM_ROOT}" --initdb - mkdir -p "${RPM_ROOT}"{/etc/yum.repos.d,/persist,/proc,/dev/pts,/sys} - mount_proc_dev_sys "${RPM_ROOT}" - # init yum repo - local iso_repo="${RPM_ROOT}/etc/yum.repos.d/iso.repo" - cat "${REPO}" > "$iso_repo" -} - -function install_packages() { - local REPO=$1 - local BOOT_MODE=$2 - prepare_yum "${REPO}" - - echo "install package.." - - local filesize - filesize=$(stat -c "%s" ./rpmlist) - local maxsize=$((1024*1024)) - if [ "${filesize}" -gt "${maxsize}" ]; then - echo "please check if rpmlist is too big or something wrong" - exit 7 - fi - - local rpms_name - rpms_name=$(tr "\n" " " < ./rpmlist) - old_ifs="$IFS" - IFS=' ' - if [ "${ARCH}" == "x86_64" ]; then - if [ "${BOOT_MODE}" = "legacy" ]; then - rpms_name+=" grub2" - else - rpms_name+=" grub2-efi grub2-tools grub2-efi-x64-modules grub2-pc-modules" - fi - read -ra rpms <<< "${rpms_name}" - IFS="$old_ifs" - yum -y --installroot="${RPM_ROOT}" install --nogpgcheck --setopt install_weak_deps=False "${rpms[@]}" - elif [ "${ARCH}" == "aarch64" ]; then - read -ra rpms <<< "${rpms_name}" - IFS="$old_ifs" - yum -y --installroot="${RPM_ROOT}" install --nogpgcheck --setopt install_weak_deps=False "${rpms[@]}" grub2-efi grub2-tools grub2-efi-aa64-modules - fi - yum -y --installroot="${RPM_ROOT}" clean all -} - -function install_misc() { - local VERSION=$1 - local AGENT_PATH=$2 - local PASSWD=$3 - local BOOT_MODE=$4 - local DNS_CONF="${PWD}/resolv.conf" - cp ../files/*mount ../files/os-agent.service "${RPM_ROOT}/usr/lib/systemd/system/" - cp ../files/os-release "${RPM_ROOT}/usr/lib/" - cp "${AGENT_PATH}" "${RPM_ROOT}/usr/bin" - rm "${RPM_ROOT}/etc/os-release" - - cat < "${RPM_ROOT}/usr/lib/os-release" -NAME=${NAME} -ID=${NAME} -EOF - echo "PRETTY_NAME=\"${NAME} ${VERSION}\"" >> "${RPM_ROOT}/usr/lib/os-release" - echo "VERSION_ID=${VERSION}" >> "${RPM_ROOT}/usr/lib/os-release" - mv "${RPM_ROOT}"/boot/vmlinuz* "${RPM_ROOT}/boot/vmlinuz" - mv "${RPM_ROOT}"/boot/initramfs* "${RPM_ROOT}/boot/initramfs.img" - if [ "$BOOT_MODE" = "legacy" ]; then - cp grub.cfg "${RPM_ROOT}"/boot/grub2 - sed -i "s/insmod part_gpt/insmod part_msdos/g; \ -s/set root='hd0,gpt2'/set root='hd0,msdos2'/g; \ -s/set root='hd0,gpt3'/set root='hd0,msdos3'/g" \ -"${RPM_ROOT}"/boot/grub2/grub.cfg - else - cp grub.cfg "${RPM_ROOT}"/boot/efi/EFI/openEuler - fi - cp -r ./00bootup "${RPM_ROOT}"/usr/lib/dracut/modules.d/ - cp set_in_chroot.sh "${RPM_ROOT}" - ROOT_PWD="${PASSWD}" BOOT_MODE="${BOOT_MODE}" chroot "${RPM_ROOT}" bash /set_in_chroot.sh - rm "${RPM_ROOT}/set_in_chroot.sh" - if [ -e "${DNS_CONF}" ]; then - cp "${DNS_CONF}" "${RPM_ROOT}/etc/resolv.conf" - fi -} - -function custom_config() { - local BOOT_MODE=$1 - local FLAG_COPY_FILE=$2 - local SRC_FILES=$3 - local DST_DIRS=$4 - local FLAG_SYSTEMD=$5 - local FLAG_GRUB_PASSWD=$6 - local GRUB2_PASSWD=$7 - local FLAG_ADD_USER=$8 - local USERNAMES=$9 - local USERPASSWDS=${10} - local GROUPNAMES=${11} - local SUPERUSERS=${12} - local FLAG_HOOK=${13} - - local GRUB_PATH - if [ "$BOOT_MODE" = "legacy" ]; then - GRUB_PATH="${RPM_ROOT}"/boot/grub2 - else - GRUB_PATH="${RPM_ROOT}"/boot/efi/EFI/openEuler - fi - - local src_files=() - local dst_dirs=() - if [ "$FLAG_COPY_FILE" -eq 0 ]; then - while read -r src_file; do - src_files+=("${src_file}") - done < <(echo "$SRC_FILES" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') - while read -r dst_dir; do - check_dir_valid "${dst_dir}" "${dst_dir}" - dst_dirs+=("${dst_dir}") - done < <(echo "$DST_DIRS" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') - local len=${#src_files[@]} - for ((i=0; i "${GRUB_PATH}/user.cfg" - chmod 600 "${GRUB_PATH}/user.cfg" - fi - if [ "$FLAG_ADD_USER" -eq 0 ]; then - cp add_user.sh "${RPM_ROOT}" - local usernames=() - local userpasswds=() - local groupnames=() - local superusers=() - while read -r username; do - usernames+=("${username}") - done < <(echo "$USERNAMES" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') - while read -r userpasswd; do - userpasswds+=("${userpasswd}") - done < <(echo "$USERPASSWDS" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') - while read -r groupname; do - groupnames+=("${groupname}") - done < <(echo "$GROUPNAMES" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') - while read -r superuser; do - superusers+=("${superuser}") - done < <(echo "$SUPERUSERS" | awk -F ' ' '{for(i=1; i<=NF; i++) print $i}') - local num_users=${#usernames[@]} - for ((i=0; i