Linux运维_Bash脚本_源码安装Go-1.21.11

Linux运维_Bash脚本_源码安装Go-1.21.11

Bash (Bourne Again Shell) 是一个解释器,负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件,并于 1989 年发布的免费软件,作为 Sh (Bourne Shell) 的替代品。

您可以在 Linux 和 MacOS 机器上使用 Bash,甚至可以通过适用于 Linux 的 Windows 子系统在 Windows 10 机器上使用。

使用方法

  • 下载源码包:

go1.4-bootstrap-20171003.tar.gz

go1.16.src.tar.gz

go1.17.3.src.tar.gz

go1.21.11.src.tar.gz

  • 放于指定路径:

这里 Bash Shell 脚本的全局变量 STORAGE 指定的存放源码包的路径 /home/goufeng 可进行修改。

  • 执行 Bash Shell 脚本:

输入 /[路径名]/[脚本名].sh 即可进行自动编译部署,过程中提示输入 (y/n) 输入 y 则进行下一步,这样分阶段确认的原因是为了确保能够看到上一个源码编译结果中可能的错误和提示。

完整脚本

#! /bin/bash
# Create By GF 2024-08-03 01:34

# --------------------------------------------------
# Install First: 
# * GCC

# ----------------- Dep for Go 1.16 ----------------
# Need File: go1.4-bootstrap-20171003.tar.gz
# -------------------- Go - 1.16 -------------------
# Need File: go1.16.src.tar.gz
# ------------------- Go - 1.17.3 ------------------
# Need File: go1.17.3.src.tar.gz
# ------------------- Go - 1.21.11 -----------------
# Need File: go1.21.11.src.tar.gz

# ##################################################
STORAGE=/home/goufeng

# ########################################## Dep for Go 1.16 #########################################

# Function: 制作安装(Make Install) Go-1.4-Bootstrap-20171003
# ##################################################
function Make_Install_Go_1_4_Bootstrap_20171003() {
   
   

    # Compile Error Handle:
    # ----------------------------------------------
    # /home/liu/go1.4/src/lib9/fmt/fltfmt.c: In function '__efgfmt':
    # /home/liu/go1.4/src/lib9/fmt/fltfmt.c:437:5: error: this statement may fall through [-Werror=implicit-fallthrough=]
    #    if(ndigits > prec) {
   
   
    #      ^
    # /home/liu/go1.4/src/lib9/fmt/fltfmt.c:451:2: note: here
    #   default:
    #   ^~~~~~~
    # cc1: all warnings being treated as errors
    # ..............................................
    # 1. 确认 switch 语句: 找到包含 default: 的 switch 语句。
    # 2. 检查 case 分支: 查看在 default: 之前的所有 case 分支, 确保每个分支在结束时都有适当的 break (或 return、continue 等, 取决于上下文)。
    # 3. 理解逻辑: 确保 switch 语句的逻辑是你所期望的。如果某个 case 分支确实应该允许控制流落入下一个 case 或 default, 那么确保这是有意的, 并且代码的可读性和可维护性不会因此受损。
    # 4. 修改代码: 如果发现有不必要的 fall through, 添加缺失的 break 语句。如果 fall through 是有意的, 但编译器警告你, 你可以考虑使用编译器特定的注释来指示这是预期的行为 (例如, 对于 GCC 和 Clang, 你可以在两个 case 之间添加 // fall through 注释)。
    # ----------------------------------------------
    # /home/goufeng/go/src/cmd/6c/txt.c: In function 'gmove':
    # /home/goufeng/go/src/cmd/6c/txt.c:995:28: error: left shift of negative value [-Werror=shift-negative-value]
    #      f->vconst |= (vlong)~0 << 32;
    #                             ^~
    # /home/goufeng/go/src/cmd/6c/txt.c:1045:28: error: left shift of negative value [-Werror=shift-negative-value]
    #      f->vconst |= (vlong)~0 << 32;
    #                             ^~
    # cc1: all warnings being treated as errors
    # ..............................................
    # 这个错误是由于在 C 语言中, 对负数进行左移操作是不被允许的, 尤其是在严格的编译环境下 (如你的编译器将所有警告视为错误)。
    # 在代码中, (vlong)~0 << 32 试图将一个全为 1 的负数 (通过 ~0 得到) 左移 32 位。这通常用于设置一个特定大小的数据类型的所有位为 1, 但在 C 语言中, 直接对负数进行位移操作可能会导致未定义行为。
    # 可以通过确保参与位移操作的值是正数或无符号数来避免这个错误。可以显式地将 ~0 转换为无符号类型来解决这个问题, 例如:
    # 将 "f->vconst |= (vlong)~0 << 32;" 改为 "f->vconst |= (vlong)((unsigned long long)~0ULL << 32);"。

    if [[ ! -d "/opt/go-1.4-bootstrap-20171003" ]]; then
    
        local VERIFY
        local STEP_UNZIPPED=0
        local STEP_MOVED=0
        local STEP_CHANGE_DIRECTORY=0
        local STEP_MADE=0
    
        # ------------------------------------------
        read -p "[Confirm] Make and Install ( go-1.4-bootstrap-20171003 )? (y/n)>" VERIFY
        if [[ "$VERIFY" != "y" ]]; then exit 1; fi

        # ------------------------------------------
        tar -zxvf $STORAGE/go1.4-bootstrap-20171003.tar.gz && STEP_UNZIPPED=1
        
        # ------------------------------------------
        # The compilation directory of "Go" needs to be stored properly. After compilation, "GOROOT" defaults to the compilation directory.
        # Go 的编译目录需要妥善存放, 编译完成后, GOROOT 默认在编译目录下。
        cp -r $STORAGE/go /opt/go-1.4-bootstrap-20171003 && STEP_MOVED=1
        
        # ------------------------------------------
        cd /opt/go-1.4-bootstrap-20171003/src && STEP_CHANGE_DIRECTORY=1
        
        # ------------------------------------------
        sed -i "1045s%(vlong)~0 << 32%(vlong)((unsigned long long)~0ULL << 32)%" /opt/go-1.4-bootstrap-20171003/src/cmd/6c/txt.c
        sed -i  "995s%(vlong)~0 << 32%(vlong)((unsigned long long)~0ULL << 32)%" /opt/go-1.4-bootstrap-20171003/src/cmd/6c/txt.c
        
        # ------------------------------------------
        sed -i "451i // fall through" /opt/go-1.4-bootstrap-20171003/src/lib9/fmt/fltfmt.c
        # ..........................................
        sed -i "204i // fall through" /opt/go-1.4-bootstrap-20171003/src/lib9/fmt/strtod.c
        sed -i "198i // fall through" /opt/go-1.4-bootstrap-20171003/src/lib9/fmt/strtod.c
        sed -i "187i // fall through" /opt/go-1.4-bootstrap-20171003/src/lib9/fmt/strtod.c
        sed -i "145i // fall through" /opt/go-1.4-bootstrap-20171003/src/lib9/fmt/strtod.c
        
<think>好的,我现在需要帮助用户解决如何将已安装的kubeadm、kubelet和kubectl从版本1.21.10降级到1.18.0的问题。用户提到他们想通过yum来安装指定版本,但现有的版本已经安装并且是最新的。首先,我需要确认正确的卸载和安装步骤,确保过程正确无误,避免出现依赖或配置问题。 首先,根据用户提供的引用资料,特别是引用[1]和[2],用户之前可能已经尝试过安装1.18.0版本,但遇到了已安装最新版本的问题。所以,正确的步骤应该是先卸载现有的1.21.10版本,然后再安装指定版本。但需要注意,卸载过程中可能需要清理相关的配置和依赖,避免残留文件影响新版本的安装。 接下来,我需要检查卸载命令是否正确。通常,使用yum remove可以卸载软件包,但用户需要明确包名。根据引用[1]中的例子,包名是kubectl-1.18.0,所以应该卸载kubelet、kubeadm和kubectl三个组件。卸载完成后,可能需要清理残留的配置文件,比如在/etc/kubernetes/目录下的文件,或者/var/lib/kubelet/中的数据。但需要谨慎操作,避免误删重要文件。 然后,安装指定版本的步骤,用户引用[2]中提到使用yum install并指定版本号,同时启用kubelet服务。但需要确保yum仓库中有1.18.0版本的包可用。如果用户的仓库中没有旧版本,可能需要配置包含旧版本包的仓库,或者使用其他源。比如,用户引用[5]中提到使用阿里云镜像站,可能需要配置相应的repo文件,确保可以访问到1.18.0版本的软件包。 另外,安装完成后,用户需要启用kubelet服务,但在安装新版本后,可能需要重新启动服务,并检查服务状态是否正常。此外,版本降级可能会导致兼容性问题,比如Kubernetes集群中其他组件的版本是否匹配,用户是否已经部署了Master节点或者其他组件,这些可能需要同步降级,否则可能出现不兼容的情况。但用户的问题可能仅限于节点的工具版本,而非整个集群,所以需要明确用户的环境。 在用户提供的引用中,引用[3]和[4]可能不直接相关,但引用[5]提到了环境初始化和外网连接,所以需要确保安装过程中网络通畅,能够正确下载软件包。 总结步骤应该是: 1. 卸载现有版本(1.21.10)。 2. 清理残留配置(可选)。 3. 配置yum仓库,确保包含1.18.0版本的包。 4. 安装指定版本的kubeadm、kubelet、kubectl。 5. 启用并启动kubelet服务。 6. 验证安装版本是否正确。 但需要注意,用户可能已经安装了最新版本,直接安装旧版本可能会遇到依赖问题,因为yum默认会安装最新版本,除非明确指定旧版本。如果用户已经按照引用[2]中的方法指定了版本号,可能需要先添加正确的仓库,或者使用--showduplicates来查看可用版本,再指定安装。 此外,可能需要禁用自动更新,避免yum自动升级到新版本。可以通过在yum配置中设置exclude=kube*,或者使用yum versionlock命令来锁定版本。 最后,用户可能需要初始化或加入集群,这时候需要注意kubeadm的版本与集群其他组件的一致性,否则可能出现兼容性问题。但根据问题描述,用户可能只需要替换本地的命令行工具,而不是整个集群的版本,所以需要明确用户的具体需求。</think>### 分步解决方案 1. **卸载现有版本(1.21.10)** ```bash # 卸载 kubeadm、kubelet、kubectl sudo yum remove -y kubeadm kubelet kubectl ``` - 若提示无相关软件包,可尝试指定完整包名: ```bash sudo yum remove -y kubeadm-1.21.10 kubelet-1.21.10 kubectl-1.21.10 ``` 2. **清理残留配置(可选)** ```bash # 删除 Kubernetes 相关配置和数据 sudo rm -rf /etc/kubernetes/ sudo rm -rf /var/lib/kubelet/ ``` 3. **添加 Kubernetes 1.18.0 的 YUM 仓库** - 如果已配置阿里云镜像源(如引用[5]),可直接使用: ```bash cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 EOF ``` - 更新仓库缓存: ```bash sudo yum clean all sudo yum makecache ``` 4. **安装指定版本(1.18.0)** ```bash # 安装并锁定版本 sudo yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 # 禁止自动更新 sudo yum versionlock add kubelet kubeadm kubectl ``` 5. **启用 kubelet 服务** ```bash sudo systemctl enable kubelet sudo systemctl start kubelet ``` 6. **验证安装** ```bash kubeadm version --output=json kubectl version --client=true --short ``` ### 注意事项 - 若需加入 Kubernetes 集群,需确保集群版本与工具版本兼容(1.18.0)[^5]。 - 降级可能引发组件间兼容性问题,需同步调整集群其他组件版本[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mostcow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值