CentOs Stream脚本安装单机版Kubernetes并配置Calico和NFS

2023-05-16

随着Kubernetes和CentOs的不断升级,在安装Kubernetes时,网上其他的一些参考资料可能会遇到一些问题。本文以脚本方式列出了所有步骤,这些步骤对于一台纯净的CentOs Stream服务器来说,可以流畅执行并完成Kubernetes安装,并且解决了安装过程中遇到的各种问题。

在安装之前,首先假定已经完成了NFS Server的配置,如果没有完成,可以参考本文后面的脚本。

安装Kubernetes的脚本如下:

#!/bin/bash

# Get current path of the script

SOURCE="$0"
while [ -h "$SOURCE" ]; do
    DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
    SOURCE="$(readlink "$SOURCE")"
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

# Introduce the general functions

if test -f $DIR/centos-functions.sh; then
    source $DIR/centos-functions.sh
fi

# Introduce the release dependending functions

REDHAT_REL=$(get_redhat_release)
if test -f $DIR/centos$REDHAT_REL-functions.sh; then
    source $DIR/centos$REDHAT_REL-functions.sh
fi

# remove podman

if test -n $(rpm -qa | grep podman); then
   yum remove -y podman || error_exit "Failed to remove podman!"
fi

# close swap

if test -n $(swapon -s); then
   swapoff -a || error_exit "Failed to close the swap!"
   sudo sed -i 's/.*swap.*/#&/' /etc/fstab || error_exit "Failed to close the swap!"
fi

# disable selinux

if [ $(sestatus -v | awk {'print $NF'}) != "disabled" ]; then
   setenforce 0 || error_exit "Failed to disable selinux!"
   SELINUX_LINE_NO=$(grep -n "SELINUX=" < /etc/selinux/config | awk -F ':' {'printf $1'})
   sed -i.bak "${SELINUX_LINE_NO}c SELINUX=disabled" /etc/selinux/config
fi

# disable firewalld

systemctl stop firewalld.service || error_exit "Failed to stop firewalld!"
systemctl disable firewalld.service || error_exit "Failed to disable firewalld!"

if test -z "$(rpm -qa docker-ce)"; then
   #  systemctl stop docker
   #  yum erase docker \
   #                  docker-client \
   #                  docker-client-latest \
   #                  docker-common \
   #                  docker-latest \
   #                  docker-latest-logrotate \
   #                  docker-logrotate \
   #                  docker-selinux \
   #                  docker-engine-selinux \
   #                  docker-engine \
   #                  docker-ce
   #  find /etc/systemd -name '*docker*' -exec rm -f {} \;
   #  find /etc/systemd -name '*docker*' -exec rm -f {} \;
   #  find /lib/systemd -name '*docker*' -exec rm -f {} \;
   #  rm -rf /var/lib/docker
   #  rm -rf /var/run/docker
    yum install -y yum-utils  device-mapper-persistent-data lvm2  || error_exit "Failed to install docker!"
    yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    yum install docker-ce -y || error_exit "Failed to install docker!"
    systemctl start docker
    systemctl enable docker
    docker version 
fi

# setup kubernetes.repo

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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
__EOF__ || error_exit "Failed to create kubernetes repo!"

# modify docker daemon.json

DOCKER_DAEMON_FILE="/etc/docker/daemon.json"
if test ! -f $DOCKER_DAEMON_FILE; then
   cat << __EOF__ > $DOCKER_DAEMON_FILE
{
   "exec-opts": ["native.cgroupdriver=systemd"],
   "registry-mirrors" : ["https://agsw1hla.mirror.aliyuncs.com"]
}
__EOF__ || error_exit "Failed to create docker daemon config file!"
else
   if test -f ${DOCKER_DAEMON_FILE}.bak; then
      rm -f ${DOCKER_DAEMON_FILE}.bak || error_exit "Failed to delete the BACKUP file of docker daemon config!"
   fi
   cp -f ${DOCKER_DAEMON_FILE} ${DOCKER_DAEMON_FILE}.bak
   DRIVER_LINE_NO=$(grep -n "native.cgroupdriver=" < $DOCKER_DAEMON_FILE | awk -F ":" {'printf $1'})
   REGISTRY_MIRRORS_LINE_NO=$(grep -n "registry-mirrors" < $DOCKER_DAEMON_FILE | awk -F ":" {'printf $1'})
   END_LINE_NO=$(grep -n "}" < $DOCKER_DAEMON_FILE | awk -F ":" {'printf $1'})
   if test -z DRIVER_LINE_NO; then
      sed -i "${END_LINE_NO}i , \"exec-opts\": [\"native.cgroupdriver=systemd\"]" $DOCKER_DAEMON_FILE
   else
      sed -i "${DRIVER_LINE_NO}c \"exec-opts\": [\"native.cgroupdriver=systemd\"]," $DOCKER_DAEMON_FILE
   fi
   if test -z REGISTRY_MIRRORS_LINE_NO; then
      sed -i "${END_LINE_NO}i , \"registry-mirrors\" : [\"https://agsw1hla.mirror.aliyuncs.com\"]" $DOCKER_DAEMON_FILE
   else
      sed -i "${REGISTRY_MIRRORS_LINE_NO}c , \"registry-mirrors\" : [\"https://agsw1hla.mirror.aliyuncs.com\"]" $DOCKER_DAEMON_FILE
   fi
fi

# Install k8s

yum install -y kubectl kubelet kubeadm

# modify the kubeadm configuration file

KUBEADM_CONFIG_FILE="/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf"
ARGS_LINE_NO=$(grep -n "KUBELET_KUBECONFIG_ARGS=" < $KUBEADM_CONFIG_FILE | awk -F ":" {'printf $1'})
if test -z "$ARGS_LINE_NO"; then
   error_exit "KUBELET_KUBECONFIG_ARGS not found in $KUBEADM_CONFIG_FILE!"
fi
GREP_RESULT=$(sed -n ${ARGS_LINE_NO}p $KUBEADM_CONFIG_FILE | grep "\-\-cgroup\-driver=")
if test -z "$GREP_RESULT"; then
   ARGS_NEW_LINE=$(grep "KUBELET_KUBECONFIG_ARGS=" $KUBEADM_CONFIG_FILE | sed "s/\"/ --cgroup-driver=systemd\"/2")
   sed -i.bak "${ARGS_LINE_NO}c $ARGS_NEW_LINE" $KUBEADM_CONFIG_FILE
fi

# modify the kubeadm flags env file

KUBEADM_FLAGS_ENV_FILE="/var/lib/kubelet/kubeadm-flags.env"
ARGS_LINE_NO=$(grep -n "KUBELET_KUBEADM_ARGS=" < $KUBEADM_FLAGS_ENV_FILE | awk -F ":" {'printf $1'})
if test -z "$ARGS_LINE_NO"; then
   error_exit "KUBELET_KUBEADM_ARGS not found in $KUBEADM_FLAGS_ENV_FILE!"
fi
GREP_RESULT=$(sed -n ${ARGS_LINE_NO}p $KUBEADM_FLAGS_ENV_FILE | grep "\-\-cgroup\-driver")
if test -z "$GREP_RESULT"; then
   ARGS_NEW_LINE=$(grep "KUBELET_KUBEADM_ARGS=" $KUBEADM_FLAGS_ENV_FILE | sed "s/\"/ --cgroup-driver=systemd\"/2")
   sed -i.bak "${ARGS_LINE_NO}c $ARGS_NEW_LINE" $KUBEADM_FLAGS_ENV_FILE
fi

# Start k8s

systemctl daemon-reload
systemctl restart docker
systemctl enable docker
systemctl enable kubelet
kubeadm init --apiserver-advertise-address=0.0.0.0 --apiserver-cert-extra-sans=127.0.0.1 --image-repository=registry.aliyuncs.com/google_containers --ignore-preflight-errors=all --kubernetes-version=v1.23.5 --service-cidr=10.10.0.0/16 --pod-network-cidr=10.18.0.0/16
if test -z $(kubectl cluster-info | grep "Kubernetes control plane is running at"); then
   echo "Failed to adopt a kubernetes control plane, please check!"
else
   echo "Kubernetes control plane is adopted successfully!"
fi
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# Allow master to be scheduled

kubectl taint nodes --all node-role.kubernetes.io/master-

# Download the following images and save into bundle

# docker pull docker.io/calico/cni:v3.22.1
# docker pull docker.io/calico/pod2daemon-flexvol:v3.22.1
# docker pull docker.io/calico/node:v3.22.1
# docker pull docker.io/calico/kube-controllers:v3.22.1
# docker save -o calico-cni-v3.22.1.tar docker.io/calico/cni:v3.22.1 
# docker save -o calico-pod2daemon-flexvol-v3.22.1.tar docker.io/calico/pod2daemon-flexvol:v3.22.1
# docker save -o calico-node-v3.22.1.tar docker.io/calico/node:v3.22.1
# docker save -o calico-kube-controllers-v3.22.1.tar docker.io/calico/kube-controllers:v3.22.1
# docker save -o nfs-client-provisioner.tar nfs-client-provisioner:latest
# scp -P 35022 root@104.238.131.240:/root/nfs-client-provisioner.tar .
# scp -P 35022 root@104.238.131.240:/root/calico-kube-controllers-v3.22.1.tar .
# scp -P 35022 root@104.238.131.240:/root/calico-node-v3.22.1.tar .
# scp -P 35022 root@104.238.131.240:/root/calico-pod2daemon-flexvol-v3.22.1.tar .
# scp -P 35022 root@104.238.131.240:/root/calico-cni-v3.22.1.tar .
# scp -P 35022 d:\downloads\calico-cni-v3.22.1.tar root@106.55.61.142:/root/bundles
# scp -P 35022 d:\downloads\calico-pod2daemon-flexvol-v3.22.1.tar root@106.55.61.142:/root/bundles
# scp -P 35022 d:\downloads\calico-node-v3.22.1.tar root@106.55.61.142:/root/bundles
# scp -P 35022 d:\downloads\calico-kube-controllers-v3.22.1.tar root@106.55.61.142:/root/bundles
# scp -P 35022 d:\downloads\nfs-client-provisioner.tar root@106.55.61.142:/root/bundles

# install Calico

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# prepare NFS configurations

NFS_SERVER_ADDR=$(get_host_ip_addr)
NFS_PATH=$(showmount -e | grep $NFS_SERVER_ADDR | awk {'printf $1'})

if test ! -d $HOME/k8s/nfs; then
   mkdir -p $HOME/k8s/nfs
fi
cat <<- __EOF__ | tee $HOME/k8s/nfs/nfs-rbac.yaml &>/dev/null;
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
  namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
   name: nfs-provisioner-runner
   namespace: default
rules:
   -  apiGroups: [""]
      resources: ["persistentvolumes"]
      verbs: ["get", "list", "watch", "create", "delete"]
   -  apiGroups: [""]
      resources: ["persistentvolumeclaims"]
      verbs: ["get", "list", "watch", "update"]
   -  apiGroups: ["storage.k8s.io"]
      resources: ["storageclasses"]
      verbs: ["get", "list", "watch"]
   -  apiGroups: [""]
      resources: ["events"]
      verbs: ["watch", "create", "update", "patch"]
   -  apiGroups: [""]
      resources: ["services", "endpoints"]
      verbs: ["get","create","list", "watch","update"]
   -  apiGroups: ["extensions"]
      resources: ["podsecuritypolicies"]
      resourceNames: ["nfs-provisioner"]
      verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
__EOF__
cat <<- __EOF__ | tee $HOME/k8s/nfs/nfs-deployment.yaml &>/dev/null;
kind: Deployment
apiVersion: apps/v1
metadata:
   name: nfs-client-provisioner
   namespace: default
spec:
   replicas: 1
   selector:
      matchLabels:
         app: nfs-client-provisioner
   strategy:
     type: Recreate
   template:
      metadata:
         labels:
            app: nfs-client-provisioner
      spec:
         serviceAccount: nfs-provisioner
         containers:
            -  name: nfs-client-provisioner
               image: quay.io/external_storage/nfs-client-provisioner:latest
               volumeMounts:
                 -  name: nfs-client-root
                    mountPath:  /persistentvolumes
               env:
                 -  name: PROVISIONER_NAME
                    value: fuseim.pri/ifs
                 -  name: NFS_SERVER
                    value: $NFS_SERVER_ADDR
                 -  name: NFS_PATH
                    value: $NFS_PATH
         volumes:
           - name: nfs-client-root
             nfs:
               server: $NFS_SERVER_ADDR
               path: $NFS_PATH
__EOF__
cat <<- __EOF__ | tee $HOME/k8s/nfs/nfs-sc.yaml &>/dev/null;
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: grafana-nfs
  namespace: default
provisioner: fuseim.pri/ifs
reclaimPolicy: Retain
__EOF__
kubectl apply -f $HOME/k8s/nfs/nfs-rbac.yaml
kubectl apply -f $HOME/k8s/nfs/nfs-sc.yaml
kubectl apply -f $HOME/k8s/nfs/nfs-deployment.yaml

附录一:NFS Server安装过程

该脚本接受4个参数:

参数1:父目录,必须存在,默认为"/mnt/vdb"

参数2:挂载的目录,位于父目录之下,必须为空,如果不存在则自动创建,默认为"nfs",在默认值情况下,挂载的目录全部路径为"/mnt/vdb/nfs"

参数3:选项,默认为rw,sync,root_squash

参数4:允许的访问来源,默认为本机所在子网段。

#!/bin/bash

# Get parameters

if test -n "$1"; then
   NFS_MOUNT_DIR=$1
else
   NFS_MOUNT_DIR="/mnt/vdb"
fi
if test -n "$2"; then
   NFS_DIR=$2
else
   NFS_DIR="nfs"
fi
if test -n "$3"; then
   NFS_OPTIONS=$3
else
   NFS_OPTIONS="rw,sync,root_squash"
fi
if test -n "$4"; then
   NFS_SOURCE=$4
else
   NFS_SOURCE=$(get_host_ip_addr)/24
fi
NFS_EXPORTS_FILE=/etc/exports

# Check the directories

if test ! -d $NFS_MOUNT_DIR; then
    echo "Mount Directory is not exist : $NFS_MOUNT_DIR"
    exit 1
fi
if test -d $NFS_MOUNT_DIR/$NFS_DIR ; then
    if [ "$(ls -A $NFS_MOUNT_DIR/$NFS_DIR)" ]; then
        echo "NFS directory is not empty : $NFS_MOUNT_DIR/$NFS_DIR"
        exit 1
    fi
else
    mkdir $NFS_MOUNT_DIR/$NFS_DIR
    chmod 766 $NFS_MOUNT_DIR/$NFS_DIR
fi

# Install packages and setup services

echo "Setup services ..."
ensure_package_installed rpcbind || error_exit "Failed to install rpcbind!"
ensure_package_installed nfs-utils  || error_exit "Failed to install nfs-utils!"
systemctl enable rpcbind || error_exit "Failed to enable rpcbind!"
systemctl enable nfs-server || error_exit "Failed to enable nfs-server!"
systemctl start rpcbind || error_exit "Failed to start rpcbind!"
systemctl start nfs-server || error_exit "Failed to start nfs-server!"

# Configure the export definition

echo "Setup exports ..."
EXPORT_DEFINITION="$NFS_MOUNT_DIR/$NFS_DIR $NFS_SOURCE($NFS_OPTIONS)"
echo "Export : $EXPORT_DEFINITION"
if test  -f $NFS_EXPORTS_FILE; then
   EXIST_LINE_NO=$(grep -n "^$NFS_MOUNT_DIR\/$NFS_DIR" $NFS_EXPORTS_FILE | cut -d ":" -f 1)
   if test -z $EXIST_LINE_NO; then
      echo $EXPORT_DEFINITION > $NFS_EXPORTS_FILE
   else
      sed -i "${EXIST_LINE_NO}c $EXPORT_DEFINITION" $NFS_EXPORTS_FILE
   fi
else
   echo $EXPORT_DEFINITION > $NFS_EXPORTS_FILE
fi

systemctl restart rpcbind || error_exit "Failed to start rpcbind!"
systemctl restart nfs-server || error_exit "Failed to start nfs-server!"

RESULT=$(showmount -e | egrep -n "^$NFS_MOUNT_DIR\/$NFS_DIR")
if test -n RESULT; then
   echo "NFS export $NFS_MOUNT_DIR/$NFS_DIR is configured successfully."
   exit 0
else
   echo "Error occurs, please check."
   exit 1
fi

##########
# Functions
##########
function get_redhat_release {
    echo $(cat /etc/redhat-release|sed -r 's/.* ([0-9]+)\..*/\1/')
}

function get_host_ip_addr {
    echo $(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/')
}

function ensure_package_installed {
    if test -z $(rpm -qa $1); then
        return yum install $1
    else 
        return 0
    fi
}

function error_exit {
  echo "$1" 1>&2
  exit 1
}

附录二 离线安装镜像

需要离线安装的镜像包括Calico 4个镜像(3.22.1)和nfs-client-provisioner镜像。

可参见Calico3.22.1离线镜像包和NFSProvision离线镜像包-kubernetes文档类资源-CSDN下载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CentOs Stream脚本安装单机版Kubernetes并配置Calico和NFS 的相关文章

  • 圆周率怎么计算来的?教你利用欧拉恒等式,生成圆周率万能公式!

    原文链接 xff1a http www twoeggz com news 4791962 html 在古代 xff0c 缺少数学技巧的情况下 xff0c 圆周率的计算是相当困难的 xff0c 我们国家伟大的数学家 xff0c 天文学家祖冲之
  • 影片avi转rmvb教程

    昨天被迫压制 MS IGLOO 正好学习了下影片avi转rmvb的技术 找来找去发现篇文章似乎不错 现在根据自己的操作过程 xff0c 加点操作心得再内 xff0c 保留一篇备用 xff01 首先还是要有专门压制的的软件 xff0c 之前我
  • 手机摄像头的等效焦距

    笔者随意拿出一张最近评测文章中的样张 xff0c EXIF信息就位于照片的下方 我们看到 xff0c 光圈 ISO感光度 曝光时间 曝光补偿这样的参数都比较好理解 xff0c 唯独这个焦距确实让不少人生疑 焦距 4mm 光圈 f 2 4 I
  • 关于3D打印文件格式:STL、OBJ、AMF、3MF的详解

    很多人对3D打印的数据格式颇有微词 xff0c 辛辛苦苦用三维软件设计好的作品 xff0c 一转换成3D打印格式 xff0c 基本就从白天鹅变成丑小鸭了 xff0c 既没有颜色 xff0c 数据也不完整 xff0c 形状重叠表面破损那是常有
  • 在线绘制函数图像和在线图标绘制网址

    经过寻找 xff0c 找到了几个在线绘制函数图像的网址 xff0c 可以不用matlab和geogebra软件绘制了 数学函数图像 xff1a 第一个 xff1a Desmos 首推 第二个 xff1a fooplot 可以绘制分段函数比如
  • geogebra中函数的定义域的输入

    ggb中函数的输入有如下几种方式 xff1a 一 如果if做法 1 区间函数 xff1a 做出函数在某区间上的图象 xff1a f x 61 if x gt 61 0 amp amp x lt 61 2 x 2 43 2x 1 2 分段函数
  • 升级Ubuntu内核

    自己下载deb或使用某些其他工具 xff0c 无脑dpkg deb会导致Depends libc6 gt 61 2 33 but 2 31 ubuntu9 2 is to be installed的错误 xff08 猜测该错误产生的原因是没
  • 在ROS的noetic版本中通过rosrun运行python文件

    xff08 1 xff09 不要将python文件放入scr目录中 xff0c 否则后续编译工作空间会报如图所示的错误 首先要在功能包文件夹 xff08 catkin ws src learnning topic xff09 中创建一个sc
  • linux音量调节

    转自 xff1a https www jianshu com p fc8c8cad67d6 一 alsa设置默认声卡 alsa设置默认声卡 理解和使用Alsa的配置文件 alsa的配置文件是alsa conf位于 usr share als
  • FutureTask实际应用案例

    GetResultTask java package com cwp data service service task import com cwp data intelligence common exception RRExcepti
  • 异常检测算法综述

    一 异常检测 随着人工智能的火热 xff0c 运维人员也开始考虑将算法引入运维领域 xff0c 对传统DevOps的核心功能进行优化改进 异常检测是运维不可或缺的重要要功能模块之一 xff0c 可以提升企业运维能力和效率 xff0c 释放运
  • 每日一书丨嵌入式C语言自我修养:从芯片、编译器到操作系统

    最近 xff0c 阅读了王工 xff08 王利涛 xff09 赠送的一本由他编著的书籍 嵌入式C语言自我修养 xff0c 感觉写的挺不错 今天分享一下这本书籍 嵌入式C语言自我修养 xff1a 从芯片 编译器到操作系统 从芯片 编译器到操作
  • JSP提交仍然停留在当前页面

    在C S结构中 xff0c 用户提交内容以后 xff0c 系统任停留在当前页面上 xff0c 直到服务返回处理成功或者失败的提示 而用户录入的信息 xff0c 除非程序清除 xff0c 否则不会自动消失 xff0c 方便用户修改 为了解决这
  • FreeRTOS Queue

    变量定义 span class token keyword typedef span span class token keyword void span span class token operator span QueueHandle
  • 专门讲解无人机航拍图像处理的书【包括图像拼接!!!】

    最近正式开始做课设啦 xff0c 博主在网上搜集到有专门的书讲解无人机航拍图像的处理 xff0c 包括图像拼接 xff01 xff01 xff01 更非常激动的是博主在图书馆把两本书都找到了 xff0c 俺滴学校i了i了 两本书如下所示 x
  • 1.2 向量与线性代数

    向量与线性代数 图形学基础向量向量点乘向量叉乘矩阵 图形学基础 基础数学 xff1a 线性代数 统计学 微积分基础物理 xff1a 其他课程 xff1a 信号处理 数学分析一点点 xff1a 美学课程 向量 方向长度单位向量向量加法 向量点
  • 2.1 变换

    矩阵变换 二维变换齐次坐标齐次坐标下的二维变换矩阵逆变换 xff08 逆矩阵 xff09 复合变换三维空间仿射变换 modeling and viewing 模型变换和视角变换 二维变换 尺度变换 Scale 镜像变换 切变变换 旋转变换
  • 2.2 变换(模型、视图、投影)

    变换 xff08 模型 视图 投影 xff09 三维变换观测变换 xff08 Viewing transformation xff09 视图 xff08 View xff09 定义相机如何将相机移动到约定俗成位置 投影 xff08 Proj
  • 四轴飞行器入门——基础知识

    引言 从2016年起 xff0c 细细数来入门无人机已经有两年时间 两年期间 xff0c 自己边学边摸索 xff0c 组装过机架四轴无人机 xff0c 也修改过开源飞控的代码 xff0c 但是因为种种原因 xff0c 始终没有写过相关博客记
  • Linux系统下搭建PX4/Pixhawk原生固件编译环境

    简介 PX4固件是Pixhawk飞行控制器的官方固件 xff0c Pixhawk官网也给出了Linux windows下搭建开发环境的方法 由于种种原因 xff0c 搭建开发环境时总会遇到各种各样的bug xff0c 致使PX4固件编译失败

随机推荐

  • main(int argc, char *argv[])

    这是UNIX和Linux中的标准主函数 argc 用来统计运行时发送给main函数的命令行参数的个数 argv 其中每个元素都是上述参数 以字符串形式存储 的首地址 argv 0 指向程序运行的全路径名 argv 1 指向程序名后的第一个参
  • 为PX4添加串口通讯模块(模块结构)

    主要讲模块的结构 不贴代码 从最外层开始 执行read uart main start dev ttyS1 read uart main int argc char argv 入口函数 判断任务进程read uart task是否存在 根据
  • C++抽象基类与虚基类(C++ primer)

    c 43 43 primer plus P508 xff0c 抽象基类 c 43 43 primer plus P556 xff0c 虚基类 抽象基类 xff08 abstract base class xff0c ABC xff09 抽象
  • MFC学习笔记(二)处理命令行选项

    目标 让应用程序处理这里所见的命令行标志 gt XXX exe c d 策略 一个MFC应用程序可以用CCommandLineInfo类的成员函数ParseParam 处理一些标准标 志 要添加我们自己的标志 xff0c 而仍然能够支持另外
  • C++ expection异常类、捕获所有异常(C++ primer,P639)

    expection类 头文件 lt expection gt stdexcept类 C 43 43 primer plus xff0c P632 包含以下异常 xff1a domain errorinvalid argumentlength
  • 5.1 运输层协议

    运输层协议 运输层的复用与常见端口常用端口 UDP协议特点UDP帧格式 TCP协议特点socket套接字可靠传输工作原理TCP帧首部重要字段 TCP可靠传输以字节为单位的滑动窗口选择超时重传时间选择确认SACK xff08 未经常使用P22
  • Linux上VScode + cmake + gcc开发环境搭建

    VScode 43 cmake 43 gcc 下载 安装vscode安装插件cmake文件结构vscode修改json文件编译 调试的过程 下载 安装 span class token comment cmake gcc 安装都很简单 sp
  • 软件测试面试04:实战项目介绍

    4 1 简单介绍下最近做过的项目 根据自己的项目整理完成 xff0c 要点 xff1a 1 xff09 项目背景 业务 需求 核心业务的流程 2 xff09 项目架构 xff0c B S还是C 5 xff0c 数据库用的什么 中间件用的什么
  • 一张图搞定SDF的概念

    本文仅代表个人理解 xff0c 谬误之处请指正 SDF Signed Distance Field 译为有向距离场 xff0c 有向 距离 场 这三个词非常精确的描述了 sdf 究竟是个什么东西 GPU Gems 3 中是这么描述 sdf
  • Ubuntu Windows双系统切换最简方法!!!

    安装完Ubuntu windows双系统后的第一个问题 xff1a 该怎么在两个系统间快速自由切换呢 xff1f 本文给出两种无需命令行的实用易上手方式 一 什么 xff0c 你要快快快快速切换 xff1f 这里直接给出答案 xff0c F
  • C++primer(第五版)习题答案

    前两章习题较简单 xff0c 这里就不作整理了 xff0c 直接从第三章开始 持续更新 xff1a Chapter 3 Strings Vectors and Arrays Exercise 3 1 part 1 include lt io
  • PX4源码地址和wiki

    源码 https github com 987419640 Firmware wiki https dev px4 io v1 9 0 zh concept architecture html
  • 视觉十四讲:第七讲_2D-2D:对极几何估计姿态

    1 对极几何 从2张图片中 得到若干个配对好的2d特征点 就可以运用对极几何来恢复出两帧之间的运动 设P的空间坐标为 P 61 X Y Z T 两个像素点 p 1 p 2 的像素坐标为 s 1 p 1 61 KP s 2 p 2 61 K
  • VINS_FUSION入门系列---GPS与VIO融合

    参考的博客 https blog csdn net subiluo article details 105429471 http www luyixian cn news show 313718 aspx state 状态量 位姿 速度 b
  • 几种常用加壳软件图文详解

    为了保护自己的软件不轻易被他人 借鉴 xff0c 有必要对软件进行一些加密保护 xff0c 而这方面目前己有成熟的专业加密软件可选择 但不要太依赖壳的保护 xff0c 大多数壳是可以被攻破的 xff0c 还是在自身保护上下些功夫 加密软件比
  • debian添加source源后update出现GPG错误

    错误如下 xff1a W GPG error http mirrors 163 com debian buster updates InRelease The following signatures couldn 39 t be veri
  • windows clang 编译Qt

    准备 xff1a qt everywhere src 5 15 0 zip jom 1 1 3 zip LLVM 10 0 0 win64 exe VS2019 xff1a 需要安装win10 SDK xff0c 也有自带的clang xf
  • docker 最新Dockerfile命令手册

    Dockerfile Reference Docker can build images automatically by reading the instructions from a Dockerfile A Dockerfile is
  • 单片机移植 - RTOS总结 -uC/OS-II ; FreeRTOS的区别

    RTOS总结 uC OS II FreeRTOS的区别 实时操作 xff08 RTOS xff09 系统有很多种 xff0c 分别为 Clinux C OS II eCos FreeRTOS mbed OS RTX Vxworks QNX
  • CentOs Stream脚本安装单机版Kubernetes并配置Calico和NFS

    随着Kubernetes和CentOs的不断升级 xff0c 在安装Kubernetes时 xff0c 网上其他的一些参考资料可能会遇到一些问题 本文以脚本方式列出了所有步骤 xff0c 这些步骤对于一台纯净的CentOs Stream服务