diff --git a/docs/pxe.md b/docs/pxe.md new file mode 100644 index 0000000000000000000000000000000000000000..4a5a6ef21b0179e8b2b192ae5e6c6742992911f8 --- /dev/null +++ b/docs/pxe.md @@ -0,0 +1,99 @@ +## 关闭防火墙以及selinux +### 关闭防火墙 +``` bash + systemctl stop firewalld +``` +关闭selinux +临时关闭 +`setenforce 0` +永久关闭 +``` bash + vim /etc/selinux/config + + SELINUX=disabled +``` +查询selinux状态 +`getenforce` +## 配置静态IP +``` + vim /etc/sysconfig/network-scripts/ifcfg-enp3s0 # enp3s0为网卡名,不同机器可能不一样 + + # 修改为如下 + TYPE=Ethernet + BOOTPROTO=static + NAME=enp3s0 + DEVICE=enp3s0 + ONBOOT=yes + IPADDR=192.168.1.50 + NETMASK=255.255.255.0 + GATEWAY=192.168.1.1 + + # 载入配置 + nmcli conn up enp3s0 +``` +## 安装dhcp, tftp, http +### httpd的安装 +``` bash + dnf install httpd -y + systemctl start httpd + systemctl enable httpd +``` +### tftp的安装与配置 +安装 +``` bash + dnf install tftp-server -y + systemctl start tftp + systemctl enable tftp +``` +复制openEuler官方镜像的目录pxeboot里的`grubx64.efi`以及`grub.cfg`到`tftpboot`目录下 + +复制生成的物理机启动文件`initramfs.img`以及`vmlinuz`到`tftpboot`目录里,并设置相应的权限 + +修改grub.cfg +打开文件 +``` bash + vim /var/lib/tftpboot/grub.cfg +``` +修改目录部分为如下 +``` bash + menuentry 'kubeOS install' --class openeuler --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-5.10.0-60.18.0.50.oe2203.x86_64-advanced-96974102-92e3-4dbf-9deb-d77dc0a29c92' { + load_video + set gfxpayload=keep + insmod gzio + insmod part_gpt + insmod ext2 + set root=(tftp,192.168.1.50) + linux /vmlinuz-5.10.0-60.18.0.50.oe2203.x86_64 + initrd /kubeos-initrd.img + } +``` +root部分为pxe服务器地址 +### dhcp安装和配置 +安装 +``` bash + dnf install dhcp -y +``` +配置 +打开配置文件 +`vim /etc/dhcp/dhcpd.conf` +修改配置 +``` bash + ddns-update-style interim; + ignore client-updates; + filename "grubx64.efi"; + next-server 192.168.1.50; + subnet 192.168.1.0 netmask 255.255.255.0 { + option routers 192.168.1.1; + option subnet-mask 255.255.255.0; + range dynamic-bootp 192.168.1.100 192.168.1.200; + default-lease-time 21600; + max-lease-time 43200; + } +``` +启动服务 +``` bash + systemctl start dhcpd + systemctl enable dhcpd +``` + +生成之后,重启,开启UEFI以及pxe启动选项 \ No newline at end of file diff --git a/scripts/00bootup/Global.cfg b/scripts/00bootup/Global.cfg new file mode 100644 index 0000000000000000000000000000000000000000..cad4e33cb70c1cfe0ca9be9d42ba828b2f67ff07 --- /dev/null +++ b/scripts/00bootup/Global.cfg @@ -0,0 +1,12 @@ +# rootfs file name +rootfs_name=kubeos.tar + +# select the target disk to install kubeOS +disk=/dev/sda + +# address where stores the rootfs on the http server +server_ip=192.168.1.50 + +local_ip=192.168.1.100 + +route_ip=192.168.1.1 \ No newline at end of file diff --git a/scripts/00bootup/module-setup.sh b/scripts/00bootup/module-setup.sh new file mode 100644 index 0000000000000000000000000000000000000000..5460b2bcd0075a90d33fbfcd01d6210e49c91333 --- /dev/null +++ b/scripts/00bootup/module-setup.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +check() { + return 0 +} + +depends() { + echo systemd +} + +install() { + inst_multiple -o grub2-mkimage mkfs.ext4 mkfs.vfat lsblk tar cpio gunzip lspci parted dhclient ifconfig curl hwinfo head tee arch df awk route + inst_hook mount 00 "$moddir/mount.sh" + inst_simple "$moddir/mount.sh" "/mount.sh" + inst_simple "$moddir/Global.cfg" "/Global.cfg" +} + +installkernel() { + hostonly='' \ + instmods \ + =drivers/ata \ + =drivers/nvme \ + =drivers/scsi \ + =drivers/net \ + =fs/fat \ + =fs/nls +} + diff --git a/scripts/00bootup/mount.sh b/scripts/00bootup/mount.sh new file mode 100644 index 0000000000000000000000000000000000000000..a04a364f70d5957f9c3ee068cf7e08df1511ae17 --- /dev/null +++ b/scripts/00bootup/mount.sh @@ -0,0 +1,332 @@ +#!/bin/bash +arch=$(arch) +min_size=8 +log=/install.log + +source /Global.cfg + +function CheckSpace() { + local disk_ava="$(parted -l | grep ${disk} | awk '{print $3}')" + if echo "${disk_ava}" | grep [GT]B$; then + if echo "${disk_ava}" | grep GB$; then + disk_ava="$(echo ${disk_ava} | awk -F G '{print $1}' | awk -F . '{print $1}')" + if [ "${disk_ava}" -lt ${min_size} ]; then + echo "The available disk space is not enough, at least ${min_size}GB." | tee -a ${log} + return 1 + fi + fi + else + echo "The available disk space is not enough, at least ${min_size}G." | tee -a ${log} + return 1 + fi + + return 0 +} + +function GetDisk() { + disks=$(hwinfo --disk --short | grep -vi "^disk" | awk '{print $1}') + if [ ! -z ${disks} ]; then + if [ ! -z ${disk} ] && echo "${disks[@]}" | grep -wq "${disk}" ; then + echo "${disk} exists, start partition" | tee -a ${log} + else + echo "disk not exist, choose default disk" | tee -a ${log} + disk=$(echo ${disks[0]}) + fi + else + echo "no disk found" | tee -a ${log} + return 1 + fi + + + CheckSpace + if [ $? -ne 0 ]; then + echo "no enough space on ${disk}" | tee -a ${log} + return 1 + fi + + return 0 +} + +function PartitionAndFormatting() { + echo "Partitioning and formatting disk $disk..." + # partition and format + parted ${disk} -s mklabel gpt >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + parted ${disk} -s mkpart primary fat16 1M 100M >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + parted ${disk} -s mkpart primary ext4 100M 2600M >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + parted ${disk} -s mkpart primary ext4 2600M 5100M >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + parted ${disk} -s mkpart primary ext4 5100M 100% >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + parted ${disk} -s set 1 boot on >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "partition failed" | tee -a ${log} + return 1 + fi + + mkfs.vfat -n "BOOT" ${disk}1 >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "format failed" | tee -a ${log} + return 1 + fi + + mkfs.ext4 -L "ROOT-A" ${disk}2 >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "format failed" | tee -a ${log} + return 1 + fi + + mkfs.ext4 -L "ROOT-B" ${disk}3 >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "format failed" | tee -a ${log} + return 1 + fi + + mkfs.ext4 -L "PERSIST" ${disk}4 >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "format failed" | tee -a ${log} + return 1 + fi + + return 0 +} + +function InitNetwork() { + echo "Initializing network..." + # 获取网卡信息,默认只有一个网卡 + net_name=`ifconfig -a | awk '{print $1}' | grep : | grep '^e' | awk -F: '{print $1}'` + # dhclient --timeout 60 >> ${log} 2>&1 + + ifconfig ${net_name} up + if [ $? -ne 0 ]; then + echo "load net card failed" | tee -a ${log} + return 1 + fi + sleep 3 + + ifconfig ${net_name} ${local_ip} netmask 255.255.255.0 >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "ip set failed" | tee -a ${log} + return 1 + fi + sleep 3 + + route add default gw ${route_ip} >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "add route failed" | tee -a ${log} + return 1 + fi + sleep 3 + + + + return 0 +} + +function MountRoot() { + echo "Mounting rootfs..." + # mount rootfs + mount ${disk}2 /sysroot >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "mount rootfs failed" | tee -a ${log} + return 1 + fi + + return 0 +} + +function MountPersist() { + echo "Mounting persist" + mkdir /persist + mount ${disk}4 /persist >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "mount persist failed" | tee -a ${log} + return 1 + fi + mkdir /persist/{var,etc,etcwork} + mkdir -p /persist/etc/KubeOS/certs + return 0 +} + +function MountBoot() { + echo "Mounting boot" + mkdir -p /sysroot/boot/efi + mount ${disk}1 /sysroot/boot/efi >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "mount boot failed" | tee -a ${log} + return 1 + fi + return 0 +} + +function GetRootfs() { + echo "Downloading rootfs..." + + curl -o /persist/${rootfs_name} http://${server_ip}/${rootfs_name} + if [ ! -e "/persist/${rootfs_name}" ]; then + echo "download rootfs failed" | tee -a ${log} + return 1 + fi + + tar -xvf /persist/${rootfs_name} -C /sysroot + if [ $? -ne 0 ]; then + echo "decompose rootfs failed" | tee -a ${log} + return 1 + fi + + rm -rf /persist/${rootfs_name} + + return 0 +} + +function Inst_Grub2_x86() { + # copy the files that boot need + cp -r /sysroot/usr/lib/grub/x86_64-efi /sysroot/boot/efi/EFI/openEuler + eval "grub2-mkimage -d /sysroot/usr/lib/grub/x86_64-efi -O x86_64-efi --output=/sysroot/boot/efi/EFI/openEuler/grubx64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "grub2-mkimage on x86 failed" | tee -a ${log} + return 1 + fi + + mkdir -p /sysroot/boot/efi/EFI/BOOT/ + cp -f /sysroot/boot/efi/EFI/openEuler/grubx64.efi /sysroot/boot/efi/EFI/BOOT/BOOTX64.EFI + + return 0 +} + +function Inst_Grub2_aarch64() { + cp -r /sysroot/usr/lib/grub/arm64-efi /sysroot/boot/efi/EFI/openEuler/ + eval "grub2-mkimage -d /sysroot/usr/lib/grub/arm64-efi -O arm64-efi --output=/sysroot/boot/efi/EFI/openEuler/grubaa64.efi '--prefix=(,gpt1)/EFI/openEuler' fat part_gpt part_msdos linux" >> ${log} 2>&1 + if [ $? -ne 0 ]; then + echo "grub2-mkimage on aarch64 failed" | tee -a ${log} + return 1 + fi + + mkdir -p /sysroot/boot/efi/EFI/BOOT/ + cp -f /sysroot/boot/efi/EFI/openEuler/grubaa64.efi /sysroot/boot/efi/EFI/BOOT/BOOTAA64.EFI + + return 0 +} + +function SetBoot() { + # mount boot + echo "Setting boot" + + if [ $arch == "x86_64" ]; then + Inst_Grub2_x86 + if [ $? -ne 0 ]; then + echo "install grub on x86 failed" | tee -a ${log} + return 1 + fi + fi + + if [ $arch == "aarch64" ]; then + Inst_Grub2_aarch64 + if [ $? -ne 0 ]; then + echo "install grub on aarch64 failed" | tee -a ${log} + return 1 + fi + fi + + return 0 +} + +function Bootup_Main() { + # get disk + echo "Checking disk info..." | tee -a ${log} + GetDisk + if [ $? -ne 0 ]; then + echo "Checking disk info failed" | tee -a ${log} + return 1 + fi + + # partition and format disk + echo "Partion and formatting..." | tee -a ${log} + PartitionAndFormatting + if [ $? -ne 0 ]; then + echo "Partition and formatting disk failed" | tee -a ${log} + return 1 + fi + + # init network + echo "Initializing network..." | tee -a ${log} + InitNetwork + if [ $? -ne 0 ]; then + echo "Initializing network failed" | tee -a ${log} + return 1 + fi + + # mount partitions + echo "Mounting root..." | tee -a ${log} + MountRoot + if [ $? -ne 0 ]; then + echo "Mounting root failed" | tee -a ${log} + return 1 + fi + + # mount persist + echo "Mounting persisst..." | tee -a ${log} + MountPersist + if [ $? -ne 0 ]; then + echo "Mounting persist failed" | tee -a ${log} + return 1 + fi + + # mount boot + echo "Mounting boot..." | tee -a ${log} + MountBoot + if [ $? -ne 0 ]; then + echo "Mounting boot failed" | tee -a ${log} + return 1 + fi + + # download rootfs + echo "Downloading rootfs..." | tee -a ${log} + GetRootfs + if [ $? -ne 0 ]; then + echo "Downloading rootfs failed" | tee -a ${log} + return 1 + fi + + # set boot + echo "Setting boot..." | tee -a ${log} + SetBoot + if [ $? -ne 0 ]; then + echo "Setting boot failed" | tee -a ${log} + return 1 + fi + + return 0 +} + +Bootup_Main +ret=$? +if [ ${ret} -eq 0 ]; then + echo "kubeOS install success! switch to root" | tee -a ${log} + cp ${log} /persist +else + echo "kubeOS install failed, see install.log" | tee -a ${log} +fi + diff --git a/scripts/create/imageCreate.sh b/scripts/create/imageCreate.sh index f8dafbe08635afdea352f79aee8a0391f51f539c..77e4618e1671c14869578648a8978913a1558b62 100644 --- a/scripts/create/imageCreate.sh +++ b/scripts/create/imageCreate.sh @@ -62,13 +62,13 @@ function create_pxe_img() { case $opt in "repo") create_os_tar_from_repo "$@" - tar -xvf os.tar ./boot/initramfs.img + tar -xvf os.tar ./initramfs.img tar -xvf os.tar ./boot/vmlinuz ;; "docker") create_os_tar_from_docker "$@" - tar -xvf os.tar boot/initramfs.img - tar -xvf os.tar boot/vmlinuz + tar -xvf os.tar ./initramfs.img + tar -xvf os.tar ./boot/vmlinuz ;; esac mv os.tar kubeos.tar diff --git a/scripts/create/rootfsCreate.sh b/scripts/create/rootfsCreate.sh index 8049f09349e7bba10b4b087dbdc19acab78e72d2..e5c53d532bd5fb1b34858a18d65b32d9726d89dd 100644 --- a/scripts/create/rootfsCreate.sh +++ b/scripts/create/rootfsCreate.sh @@ -61,6 +61,7 @@ EOF mv "${RPM_ROOT}"/boot/initramfs* "${RPM_ROOT}/boot/initramfs.img" cp grub.cfg "${RPM_ROOT}"/boot/grub2 cp grub.cfg "${RPM_ROOT}"/boot/efi/EFI/openEuler + cp -r ./00bootup ${RPM_ROOT}/usr/lib/dracut/modules.d/ cp set_in_chroot.sh "${RPM_ROOT}" ROOT_PWD="${PASSWD}" chroot "${RPM_ROOT}" bash /set_in_chroot.sh rm "${RPM_ROOT}/set_in_chroot.sh" diff --git a/scripts/rpmlist b/scripts/rpmlist index 7a9adfacdd7bd2eb155b2e1eb658dd0eb505662f..077a1642cfb119bcc9512a29722f149263a9cfd6 100644 --- a/scripts/rpmlist +++ b/scripts/rpmlist @@ -13,4 +13,12 @@ socat conntrack-tools ebtables ethtool -rsyslog \ No newline at end of file +rsyslog +vi +net-tools +hwinfo +dracut +coreutils +gawk +parted +dosfstools \ No newline at end of file diff --git a/scripts/set_in_chroot.sh b/scripts/set_in_chroot.sh index bacef789c4b9972cf8a938c9c4d4875cd99187da..4b061df6a7e773c4223524ca1ba1e8d35cfcff66 100644 --- a/scripts/set_in_chroot.sh +++ b/scripts/set_in_chroot.sh @@ -11,3 +11,6 @@ sed -i '/^root:/d' /etc/shadow_bak echo "root:"${ROOT_PWD}${str:1} > /etc/shadow cat /etc/shadow_bak >> /etc/shadow rm -rf /etc/shadow_bak + +dracut -f -v --add bootup /initramfs.img --kver `ls /lib/modules` +rm -rf /usr/lib/dracut/modules.d/00bootup \ No newline at end of file