• [技术干货] openEuler操作系统安装
    openEuler[1] 是一个开源、免费的 Linux 发行版平台,通过开放的社区形式与全球的开发者共同构建一 个开放、 多元和架构包容的软件生态体系。同时,openEuler 也是一个创新的平台,鼓励任何人在该平台上提出新想法、开拓新思路、实践新方案。【学习目标】openEuler 原生系统的启动和安装参与贡献 openEuler【环境准备】工欲善其事,必先利其器。首先,我们需要做一些 openEuler 安装的环境准备。1. 操作系统:Windows 10 (64位)使用我们最常用的操作系统,为安装 openEuler 的相关工具提供基础运行环境。2. 虚拟机:Oracle VM VirtualBoxVirtualBox 是由 Oracle 开发的一款针对 x86 硬件的虚拟机,为 openEuler 提供了安装、运行、配置等环境。在 VirtualBox 官网 [2] 下载 Windows 版本 的 VirtualBox,本文主要以 6.1.12 platform 为例来介绍 openEuler 的安装过程。3. openEuler 镜像:openEuler-20.03-LTS-x86_64-dvd.isoopenEuler 镜像提供了完整的 openEuler ,目前架构支持 X86_64 和 aarch64。在 openEuler 开源社区获取 openEuler 镜像 repo 源 [3],选择 openEuler-20.03-LTS-x86_64-dvd.iso[4] 下载。【安装体验】万事俱备,只欠东风。在环境和工具准备完毕后,我们就可以进入正题 ——openEuler 的安装。1. openEuler 的安装模式openEuler 提供了 2 种安装模式,以应对不同的场景需求:文本模式:适用于服务器场景。图形模式:适用于服务器和 PC 场景,有一定的软硬件约束,需要提供显卡和图形驱动的支持。接下来,将主要介绍在图形模式下安装 openEuler 的过程。在此之前,我们需要先安装 Virtual Box 虚拟机,来运行 openEuler 所需的安装环境。2. Virtual Box VM 安装\1) 建立 openEuler 的启动项打开下载完成的 Oracle VM VirtualBox,新建 openEuler 启动环境。在 工具 选项卡中,点击 新建 按钮,选择新建虚拟电脑;设置 openEuler 名称、VM 目录及 Windows 版本,由于系统版本默认是 Windows 7,我们需要手动选择 Windows 10(64-bit)。\2) 分配内存VirtualBox 会视当前设备的配置而自动建议分配内存大小,一般使用建议的内存分配大小,后面也可以根据实际使用情况来手动调整。\3) 新建虚拟硬盘勾选 现在创建虚拟硬盘选项来新建虚拟硬盘,文件类型选择 VDI(VirtualBox 磁盘映像);分配模式选择 动态分配;文件位置和大小选择默认即可。openEuler 启动环境新建完成后,还需要对虚拟机的启动项进行一些基本的设置。\4) 基本设置存储:引用 openEuler 的 ISO 镜像。系统 - 主板 - 启动顺序:确保第一顺序设置为 光驱 ,防止引用到硬盘上其他 ISO。到这里,Virtual Box 虚拟机环境和 openEuler 启动项的设置基本完成,部分偏好设置可根据自身的情况进行调整,点击右侧的启动按钮,就可以进入 openEuler 的安装阶段。3. openEuler 安装\1) 选择启动盘点击文件夹图标,注册/新建一个 ISO 镜像引用,然后选择下载好的 openEuler ISO 镜像,点击启动。\2) 安装 openEuler 20.03-LTS选择 Install openEuler 20.03-LTS,按下回车键进行安装。其中,Test media 是用来进行文件完整性校验,防止 ISO 文件内容的缺失,通常情况下,选择直接安装即可。首先来到 openEuler 欢迎界面,这里的语言选择指的是安装过程中的语言环境,选择简体中文的语言环境,点击继续。然后进入安装信息摘要界面,针对 OS 环境进行一些配置:本地化:语言代表着安装完成后的 OS 语言环境;时间和日期代表着时区,默认是上海。软件:安装源代表着光驱内的我们下载的 ISO 镜像,可以作为自动安装介质使用;软件选择代表着当前环境附加的功能,一般我们选择默认的最小安装,来保证拥有基本的核心功能。系统:安装位置代表着 openEuler 的安装磁盘对应位置,确认好磁盘,点击完成将自动分区;网络和主机名代表着网络的连接,我们需要确保以太网处于连接状态。安装信息确认后,我们点击开始安装,可以看到 openEuler 的安装进度。在等待安装时,我们还能够设置 Root 密码,将在后续的系统登录中使用到,密码规范需要三种以上的字符类型,设置完毕后点击完成,当看到界面中的红色警告消失,说明密码设置成功。在安装完成之后,需要重新启动系统。我们关闭电源,依次打开启动项 - 设置 - 系统 - 主板 - 启动顺序,将硬盘提升到第一启动顺序,同时也可以删除 ISO 镜像引用。再次启动系统,在短暂的进程等待后,输入 Root 密码,我们就可以进入并使用 openEuler 了。由此可见,openEuler 的图形模式安装简单快速,易于上手。4. openEuler 的启动流程学习了 openEuler 的安装,我们再了解一下 openEuler 的启动模式和流程。针对不同的架构,openEuler 提供的启动模式也不同。X86 架构包含 Legacy 和 UEFI 模式,而 ARM 架构目前只包含 UEFI 模式。上文中的安装启动流程,就是采用的 Legacy 模式。经 BootLoader 最终到硬盘引导的 GURB2, GURB2 引导内核 Kernel - initrd - systemd 进程,最后启动 openEuler 社区目前维护的程序 ANACONDA。5. openEuler 自动化安装除了图形安装模式,openEuler 社区还提供了文本模式的 自动化安装,以及各类虚拟机配置,方便 DIY 爱好者使用。openEuler 支持 pxe 自动化安装部署,具体流程如下图所示,环境除了物理 / 虚拟机和 ISO 镜像外,还需要用来存放 kickstart 文件 的 httpd 和 提供 vmlinuz 与 initrd 文件的 tftp 服务器,以及 kickstart 的自定义安装配置。\1) 安装之前,需要确保 http 服务器的防火墙处于关闭状态,使用防火墙关闭指令:iptables -F\2) httpd 的安装与服务启动# dnf install httpd -y# systemctl start httpd# systemctl enable httpd\3) tftp 的安装与配置# dnf install tftp-server -y# vim /etc/xinetd.d/tftpservice tftp{socket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /var/lib/tftpbootdisable = noper_source = 11cps = 100 2flags = IPv4}# systemctl start tftp# systemctl enable tftp# systemctl start xinetd# systemctl status xinetd# systemctl enable xinetd\4) 安装源的制作# mount openEuler-20.03-LTS-aarch64-dvd.iso /mnt# cp -r /mnt/* /var/www/html/openEuler/\5) openEuler-ks.cfg 的设置和修改,kickstart 配置文件可根据实际需求进行额外的更改#vim /var/www/html/ks/openEuler-ks.cfg====================================***以下内容根据实际需求进行修改***#version=DEVELignoredisk --only-use=sdaautopart --type=lvm# Partition clearing informationclearpart --none --initlabel# Use graphical installgraphical# Keyboard layoutskeyboard --vckeymap=cn --xlayouts='cn'# System languagelang zh_CN.UTF-8#Use http installation sourceurl --url=//192.168.122.1/openEuler/%post#enable kdumpsed -i "s/ ro / ro crashkernel=1024M,high /" /boot/efi/EFI/openEuler/grub.cfg%end...6)kickstart 自定义安装配置a. 获取 ks 配置文件手动安装完成之后,在 /root 目录下会自动生成 anaconda-ks.cfg 文件b. 指定 ks 文件启动参数添加:inst.ks=[http|ftp|nfs]://path\7) 修改 pxe 配置文件 grub.cfg,以下配置内容可供参考# cp -r /mnt/images/pxeboot/* /var/lib/tftpboot/# cp /mnt/EFI/BOOT/grubaa64.efi /var/lib/tftpboot/# cp /mnt/EFI/BOOT/grub.cfg /var/lib/tftpboot/# ls /var/lib/tftpboot/grubaa64.efi grub.cfg initrd.img TRANS.TBL vmlinuz# vim /var/lib/tftpboot/grub.cfgset default="1" 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} load_videoset gfxpayload=keepinsmod gzioinsmod part_gptinsmod ext2 set timeout=60 ### BEGIN /etc/grub.d/10_linux ###menuentry 'Install openEuler 20.03 LTS' --class red --class gnu-linux --class gnu --class os { set root=(tftp,192.168.1.1) linux /vmlinuz ro inst.geoloc=0 console=ttyAMA0 console=tty0 rd.iscsi.waitnet=0 inst.ks=http://192.168.122.1/ks/openEuler-ks.cfg initrd /initrd.img}\8) DHCP 的配置(可以使用 dnsmasq 代替 )# dnf install dhcp -y## DHCP Server Configuration file.# see /usr/share/doc/dhcp-server/dhcpd.conf.example# see dhcpd.conf(5) man page## vim /etc/dhcp/dhcpd.confddns-update-style interim;ignore client-updates;filename "grubaa64.efi";    # pxelinux 启动文件位置;next-server 192.168.122.1;  # (重要)TFTP Server 的IP地址;subnet 192.168.122.0 netmask 255.255.255.0 {option routers 192.168.111.1; # 网关地址option subnet-mask 255.255.255.0; # 子网掩码range dynamic-bootp 192.168.122.50 192.168.122.200; # 动态ip范围default-lease-time 21600;max-lease-time 43200;}# systemctl start dhcpd# systemctl enable dhcpd\9) 在 Start boot option 界面按下 F2 选择从网络 pxe 启动,开始自动化安装openEuler 提供的文本模式下 pxe 自动化安装,充分满足了 DIY 爱好者的需求,同时还提供了简易快速,便于上手的图形安装模式,以此来面向不同场景和人群。在了解 openEuler 安装、启动流程后,跟着文中的步骤,一起来体验开放多元的 openEuler!【参与贡献 openEuler】1. 关于 openEuleropenEuler 的愿景:通过社区合作,打造创新平台,构建支持多处理器架构、统一和开放的操作系统 openEuler,推动软硬件生态繁荣发展。目前 openEuler 正处于升级 SIG 的阶段,对以下模块感兴趣的朋友可以一起参与进来:anaconda/lorax/pykickstart/python-blivetgrub2/syslinuxyum/dnf也可以在码云 gitee 的 openEuler 社区 [5] 中贡献力量:Fork the projectCheckout the branchCommit your codePull request参考资料
  • [技术干货] 欧拉操作系统
    “欧拉+鸿蒙”是华为着力打造的两个系统,是华为的“铸魂”工程。鸿蒙服务于智能终端、物联网和工业终端。欧拉不仅服务鲲鹏,也支持X86、定位于面向服务器、边缘计算、云、嵌入式设备等领域的操作系统,2019年,华为把自己在服务器操作系统上积累了10余年的能力开放出来,欧拉操作系统正式开源。2021年11月,华为宣布捐赠欧拉系统,将全量代码等捐赠给开放原子开源基金会。2022年4月15日,欧拉捐赠后首个社区共建版本openEuler 22.03 LTS正式发布,这也是首个支持数字基础设施全场景的长周期版本,同时已有8家欧拉生态伙伴宣布即将推出基于openEuler 22.03 LTS的商业发行版。欧拉在政府、运营商、金融、能源、交通、互联网等行业已规模应用,累计超过130万套。2022年,欧拉在行业应用将新增200万套,未来,将有更快的增长和突破。01欧拉操作系统概述欧拉操作系统(openEuler,简称“欧拉”)是面向数字基础设施的操作系统,支持服务器、云计算、边缘计算、嵌入式等四大应用场景,支持多样性计算,致力于提供安全、稳定、易用的操作系统。欧拉作为一个操作系统发行版平台,每两年推出一个LTS版本。该版本为企业级用户提供了一个安全稳定可靠的操作系统。欧拉也是一个技术孵化器。通过每半年发布一次的创新版,快速集成openEuler以及其他社区的最新技术成果,将社区验证成熟的特性逐步汇合到发行版中。这些新特性以单个开源项目的方式存在于社区,方便开发者获得源代码,也方便其他开源社区使用。根据《中国服务器操作系统市场研究报告》,2021年欧拉在政府、运营商行业实现新增市场份额第一,在金融行业市场增速第一。02欧拉产业链欧拉产业链包括欧拉共建者和欧拉下游厂商。欧拉共建者包括处理器多样算力厂商、操作系统厂商、行业ISV厂商等,下游应用厂商包括运营商、金融、政府等主体。欧拉发展迅速,下游应用广泛,产业供应链具有较强的安全性。截至目前,欧拉开源社区已经汇聚了330多家企业伙伴,包括芯片厂商、整机厂商、操作系统厂商、应用软件厂商等,吸引近万名开发者,成立近百个特别兴趣小组,全球下载量超过47万,PR合入超过5.5万。支持主流的芯片厂商包括Avago、Emulex、Intel、鲲鹏、龙芯、Mellanox、NVIDIA、飞腾、Qlogic、树莓派、RISC-V、兆芯、申威等;整机厂商包括百信、新华三、湘江鲲鹏、四川虹信、黄河科技、联想、宝德、曙光、清华同方、长江计算、超聚变、神州云科等。共建厂商:OSV厂商,麒麟信安、中科创达等;ISV厂商,润和软件、青云信息、拓维信息、东方通、创意信息、软通动力等;芯片厂商,龙芯中科等。随着openEuler 22.03 LTS版本的发布,麒麟软件、统信软件、麒麟信安、SUSE、超聚变、新华三、$中科创达(SZ300496)$ 、科东软件等伙伴,也宣布即将推出基于openEuler 22.03 LTS的商业发行版,将社区创新成果应用到各行各业,转化为数字经济发展的原动力。03欧拉四大场景的不同镜像创新针对4大场景提供不同系统镜像,做到统一内核、统一构建、统一SDK、统一联接和统一开发工具。1.服务器场景openEuler22.03LTSServer新文件系统EulerFS:面向非易失性内存的新文件系统,采用软更新、目录双视图等技术减少文件元数据同步时间,提升文件读写性能。内存分级扩展etMem:新增用户态swap功能,策略配置淘汰的冷内存交换到用户态存储,用户无感知,性能优于内核态swap。内存RAS增强:内存可靠性分级技术,可以指定内核、关键进程等对内存故障敏感的数据优先使用高可靠内存,降低宕机率,提升可靠性(技术预览特性)。2.云计算场景openEuler22.03LTSCloud容器操作系统KubeOS:云原生场景,实现OS容器化部署、运维,提供与业务容器一致的基于K8s的管理体验。安全容器方案:iSulad+shimv2+StratoVirt安全容器方案,相比传统Docker+Qemu方案,底噪和启动时间优化40%。双平面部署工具eggo:ARM/x86双平面混合集群OS高效一键式安装,百节点部署时间<15min。3.边缘计算场景openEuler22.03LTSEdge提供统一的跨边云的协同框架(KubeEdge+),实现边云之间的应用管理与部署,跨边云的通信,以及跨边云的南向外设管理等基础能力。可应用智能制造、城市交通、高速收费稽查、智慧加油站、医疗影像识别、智慧园区等广泛的边云协同场景。4.嵌入式场景openEuler22.03LTSEmbedded轻量化能力:开放yocto小型化构建裁剪框架,支撑OS镜像轻量化定制,提供OS镜像<5M,以及<5S快速启动等能力。多硬件支持:新增支持树莓派作为嵌入式场景通用硬件。软实时内核:基于Linux5.10内核提供软实时能力,软实时中断响应时延微秒级。混合关键性部署:实现SOC内实时和非实时多平面混合部署,并支持Zephyr实时内核。分布式软总线基础能力:集成鸿蒙的分布式软总线,实现欧拉嵌入式设备之间互联互通。嵌入式软件包支持:新增80+嵌入式领域常用软件包的构建。嵌入式系统可广泛应用于航空航天、工业控制、电信设备、汽车及医疗等领域;随着5G、AI新型技术的成熟,还可应用于物联网IoT设备,边缘智能计算设备等。目前欧拉已成为数字基础设施的开源操作系统,支持多样性设备且覆盖全场景应用。而欧拉与鸿蒙在能力和生态进一步打通后形成互补,可以更充分地服务数字全场景。承诺不做欧拉商业发行版的华为未来将不遗余力地携手助力合作伙伴,在商业推广与开源建设方面一同走向全球市场作者:红旗招展666 链接:cid:link_0 来源:雪球 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 风险提示:本文所提到的观点仅代表个人的意见,所涉及标的不作推荐,据此买卖,风险自负。
  • [技术干货] 欧拉版本关键特性集成Kubernetes 1.20
    下载地址:cid:link_3 最新版ISO下载地址:cid:link_0 文档地址:cid:link_521.03 版本关键特性集成Kubernetes 1.20用于自动部署,扩展和管理容器化应用程序的云原生操作系统它更多特性,请参考Kubernetes 1.20官方发行说明。自动上线和回滚,Kubernetes 会自动将应用或其配置的更改后的实例上线,同时监视应用程序运行状况,失败就会回滚之前所作更改。 服务发现和负载均衡,服务发现和基于容器IP和DNS名称的负载均衡机支持。 存储编排,支持多种存储后端的自动挂载,如本地存储、NFS、iSCSI、Gluster、Ceph等网络存储系统。 水平扩展,支持命令行、UI手动操作扩展,以及基于 CPU 使用情况自动扩展方式。参考文章连接:cid:link_1一、安装及配置安装操作系统的过程省略…以下操作在主节点上完成:安装软件:[root@openeuler ~]# dnf install -y kubernetes-kubeadm kubernetes-kubelet kubernetes-master启动kubelet服务:[root@openeuler ~]# swapoff -a [root@openeuler ~]# systemctl stop firewalld && systemctl disable firewalld [root@openeuler ~]# systemctl enable docker && systemctl start docker [root@openeuler ~]# systemctl enable kubelet.service && systemctl start kubelet.service初始化主节点:[root@openeuler ~]# kubeadm init --apiserver-advertise-address=192.168.128.132 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.2 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16 [init] Using Kubernetes version: v1.20.2 [preflight] Running pre-flight checks [WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ [WARNING Hostname]: hostname "openeuler" could not be reached [WARNING Hostname]: hostname "openeuler": lookup openeuler on 192.168.128.2:53: server misbehaving [preflight] Pulling images required for setting up a Kubernetes cluster [preflight] This might take a minute or two, depending on the speed of your internet connection [preflight] You can also perform this action in beforehand using 'kubeadm config images pull' [certs] Using certificateDir folder "/etc/kubernetes/pki" [certs] Generating "ca" certificate and key [certs] Generating "apiserver" certificate and key [certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local openeuler] and IPs [10.1.0.1 192.168.128.132] [certs] Generating "apiserver-kubelet-client" certificate and key [certs] Generating "front-proxy-ca" certificate and key [certs] Generating "front-proxy-client" certificate and key [certs] Generating "etcd/ca" certificate and key [certs] Generating "etcd/server" certificate and key [certs] etcd/server serving cert is signed for DNS names [localhost openeuler] and IPs [192.168.128.132 127.0.0.1 ::1] [certs] Generating "etcd/peer" certificate and key [certs] etcd/peer serving cert is signed for DNS names [localhost openeuler] and IPs [192.168.128.132 127.0.0.1 ::1] [certs] Generating "etcd/healthcheck-client" certificate and key [certs] Generating "apiserver-etcd-client" certificate and key [certs] Generating "sa" key and public key [kubeconfig] Using kubeconfig folder "/etc/kubernetes" [kubeconfig] Writing "admin.conf" kubeconfig file [kubeconfig] Writing "kubelet.conf" kubeconfig file [kubeconfig] Writing "controller-manager.conf" kubeconfig file [kubeconfig] Writing "scheduler.conf" kubeconfig file [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Starting the kubelet [control-plane] Using manifest folder "/etc/kubernetes/manifests" [control-plane] Creating static Pod manifest for "kube-apiserver" [control-plane] Creating static Pod manifest for "kube-controller-manager" [control-plane] Creating static Pod manifest for "kube-scheduler" [etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests" [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s [apiclient] All control plane components are healthy after 9.002950 seconds [upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace [kubelet] Creating a ConfigMap "kubelet-config-1.20" in namespace kube-system with the configuration for the kubelets in the cluster [upload-certs] Skipping phase. Please see --upload-certs [mark-control-plane] Marking the node openeuler as control-plane by adding the labels "node-role.kubernetes.io/master=''" and "node-role.kubernetes.io/control-plane='' (deprecated)" [mark-control-plane] Marking the node openeuler as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule] [bootstrap-token] Using token: gnvwps.ydjc5gxisxxvztua [bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles [bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes [bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials [bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token [bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster [bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace [kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key [addons] Applied essential addon: CoreDNS [addons] Applied essential addon: kube-proxy Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.128.132:6443 --token gnvwps.ydjc5gxisxxvztua \ --discovery-token-ca-cert-hash sha256:adc61edc9452c6c44abaf9f62b976ec8c9109d2635c234c0a212e0f2f0381026创建普通用户kubeuser:[root@openeuler ~]# groupadd kubeuser [root@openeuler ~]# useradd -d /home/kubeuser -m -g kubeuser kubeuser [root@openeuler ~]# passwd kubeuser Changing password for user kubeuser. (pass:kubepass)添加sudo权限 /etc/sudoers%kubeuser ALL=(ALL) ALL su - kubeuser执行以下命令 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc查看master状态:export KUBECONFIG=/etc/kubernetes/admin.conf [kubeuser@openeuler ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION openeuler NotReady control-plane,master 4h34m v1.20.2查看kubelet服务状态:[root@k8sslave1 ~]# journalctl -u kubelet -f Sep 16 14:07:21 k8sslave1 kubelet[8548]: : [failed to find plugin "flannel" in path [/opt/cni/bin] failed to find plugin "portmap" in path [/opt/cni/bin]] Sep 16 14:07:21 k8sslave1 kubelet[8548]: W0916 14:07:21.033280 8548 cni.go:239] Unable to update cni config: no valid networks found in /etc/cni/net.d Sep 16 14:07:22 k8sslave1 kubelet[8548]: E0916 14:07:22.858257 8548 kubelet.go:2163] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized解决方法:[root@k8sslave2 ~]# dnf install -y containernetworking-plugins containernetworking-plugins-devel Last metadata expiration check: 0:06:18 ago on Thu 16 Sep 2021 01:49:56 PM CST. Dependencies resolved. ============================================================================================================================================================================== Package Architecture Version Repository Size ============================================================================================================================================================================== Installing: containernetworking-plugins x86_64 0.8.2-4.git485be65.oe1 OS 17 M containernetworking-plugins-devel noarch 0.8.2-4.git485be65.oe1 everything 84 k Transaction Summary ============================================================================================================================================================================== Install 2 Packages [root@openeuler ~]# mkdir -p /opt/cni/bin [root@openeuler ~]# cp /usr/libexec/cni/* /opt/cni/bin/ [root@openeuler ~]# systemctl restart kubelet 以下是在slave节点上执行:安装软件:[root@k8sslave2 ~]# dnf install -y kubernetes-kubeadm kubernetes-kubelet kubernetes-node containernetworking-plugins containernetworking-plugins-devel启动kubelet服务:[root@k8sslave2 ~]# mkdir -p /opt/cni/bin [root@k8sslave2 ~]# cp /usr/libexec/cni/* /opt/cni/bin/ [root@k8sslave2 ~]# swapoff -a [root@k8sslave2 ~]# systemctl stop firewalld && systemctl disable firewalld [root@k8sslave2 ~]# systemctl enable docker && systemctl start docker [root@k8sslave2 ~]# systemctl enable kubelet.service && systemctl start kubelet.service [root@k8sslave2 ~]# kubeadm join 192.168.128.132:6443 --token gnvwps.ydjc5gxisxxvztua \ --discovery-token-ca-cert-hash sha256:adc61edc9452c6c44abaf9f62b976ec8c9109d2635c234c0a212e0f2f0381026在主节点查看所有节点状态:(如下状态均为Ready表示节点安装正常)[kubeuser@openeuler ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8sslave2 Ready <none> 137m v1.20.2 openeuler Ready control-plane,master 4h51m v1.20.2二、部署应用部署应用的关键是打通网络, 参考文章:cid:link_2引用一段介绍如下: k8s要靠CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannet,callco,canel,kube-router。 这些插件使用的解决方案都如下: 1)虚拟网桥,虚拟网卡,多个容器共用一个虚拟网卡进行通信; 2)多路复用:MacVLAN,多个容器共用一个物理网卡进行通信; 3)硬件交换:SR-LOV,一个物理网卡可以虚拟出多个接口,这个性能最好。 本例使用flannet网络插件,其他插件不在本文讨论范围: 修改docker镜像(所有节点安装)[root@openeuler ~]# vi /etc/docker/deamon.json { "registry-mirrors": ["http://hub-mirror.c.163.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn"] } [root@openeuler ~]# docker pull lizhenliang/flannel:v0.11.0-amd64也可以使用配置文件来完成安装: 配置文件下载连接:cid:link_4[kubeuser@openeuler ~]$ kubectl apply -f kube-flannel.yml在主节点上部署nginx[kubeuser@openeuler ~]$ kubectl create deployment nginx --image=nginx [kubeuser@openeuler ~]$ kubectl expose deployment nginx --port=80 --type=NodePort [kubeuser@openeuler ~]$ kubectl get pod,svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 5h4m service/nginx NodePort 10.1.106.205 <none> 80:32108/TCP 131m [kubeuser@openeuler ~]$ kubectl scale deployment nginx --replicas=3 [kubeuser@openeuler ~]$ kubectl get pod,svc NAME READY STATUS RESTARTS AGE pod/nginx-6799fc88d8-q56d8 1/1 Running 0 119m pod/nginx-6799fc88d8-sntzg 1/1 Running 0 106m pod/nginx-6799fc88d8-zf4kr 1/1 Running 0 106m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 5h4m service/nginx NodePort 10.1.106.205 <none> 80:32108/TCP 131m分别访问主节点和从节点的32108端口即可访问到nginx集群。
  • [技术干货] 离线部署k8s集群
    离线部署k8s集群集群配置CPU鲲鹏920系统openEuler 22.03 LTS aarch64master-ip192.168.1.111node1-ip192.168.1.112node2-ip192.168.1.113k8s1.23.6docker19.03.11路径规划vim/opt/vimtar/opt/tarntpd/opt/ntpdsocat/opt/socatconntrack/opt/conntrackdocker/opt/dockerimages/opt/imageskubectl/kubeadm/kubelet/opt/k8scni/opt/cnicritest/opt/critestcalico/opt/calicodashboard/opt/dashboard准备离线包rpm包vimyum install -y --downloadonly --downloaddir=/opt/vim vimtaryum install -y --downloadonly --downloaddir=/opt/tar tarntpdyum install -y --downloadonly --downloaddir=/opt/ntpd ntpdsocatyum install -y --downloadonly --downloaddir=/opt/socat socatconntrackyum install -y --downloadonly --downloaddir=/opt/conntrack conntrack二进制包dockercd /opt/docker && wget https://download.docker.com/linux/static/stable/aarch64/docker-19.03.11.tgzkubectl/kubeadm/kubeletcd /opt/k8s curl -LO https://dl.k8s.io/release/v1.23.6/bin/linux/arm64/kubectl curl -LO https://dl.k8s.io/release/v1.23.6/bin/linux/arm64/kubeadm curl -LO https://dl.k8s.io/release/v1.23.6/bin/linux/arm64/kubeletcnicd /opt/cni && wget https://github.com/containernetworking/plugins/releases/download/v0.9.1/cni-plugins-linux-arm64-v0.9.1.tgzcritestcd /opt/critest && wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.22.0/critest-v1.22.0-linux-arm64.tar.gzetcdcd /opt/etcd && wget https://github.com/etcd-io/etcd/releases/download/v3.5.5/etcd-v3.5.5-linux-arm64.tar.gzdocker镜像控制平面镜像kubeadm config images list kubeadm config images pullcalico镜像cd /opt/calico && curl https://docs.projectcalico.org/manifests/calico.yaml -O cat calico.yaml \ | grep image: \ | awk '{print "docker pull " $2}' \ | shdashboard镜像docker pull kubernetesui/dashboard:v2.5.1 docker pull kubernetesui/metrics-scraper:v1.0.7导出docker save -o /opt/images/k8s.gcr.io.kube-apiserver.v1.23.6.tar k8s.gcr.io/kube-apiserver:v1.23.6 docker save -o /opt/images/k8s.gcr.io.kube-proxy.v1.23.6.tar k8s.gcr.io/kube-proxy:v1.23.6 docker save -o /opt/images/k8s.gcr.io.kube-controller-manager.v1.23.6.tar k8s.gcr.io/kube-controller-manager:v1.23.6 docker save -o /opt/images/k8s.gcr.io.kube-scheduler.v1.23.6.tar k8s.gcr.io/kube-scheduler:v1.23.6 docker save -o /opt/images/k8s.gcr.io.etcd.v3.5.1-0.tar k8s.gcr.io/etcd:3.5.1-0 docker save -o /opt/images/k8s.gcr.io.coredns.coredns.v1.8.6.tar k8s.gcr.io/coredns/coredns:v1.8.6 docker save -o /opt/images/k8s.gcr.io.pause.v3.6.tar k8s.gcr.io/pause:3.6 docker save -o /opt/images/calico.kube-controllers.v3.24.5.tar calico/kube-controllers:v3.24.5 docker save -o /opt/images/calico.cni-v3.24.5.tar calico/cni:v3.24.5 docker save -o /opt/images/calico.node-v3.24.5.tar calico/node:v3.24.5 docker save -o /opt/images/dashboard.tar kubernetesui/dashboard:v2.5.1 docker save -o /opt/images/metrics-scraper.tar kubernetesui/metrics-scraper:v1.0.7配置文件dashboard.ymlcd /opt/dashboard && wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml -O dashboard-v2.5.1.yaml上传离线包master/node上传scp/ftp等rpmrpm -ivh *.rpmdocker镜像docker load -i /opt/images/k8s.gcr.io.kube-apiserver.v1.23.6.tar docker load -i /opt/images/k8s.gcr.io.kube-controller-manager.v1.23.6.tar docker load -i /opt/images/k8s.gcr.io.kube-proxy.v1.23.6.tar docker load -i /opt/images/k8s.gcr.io.kube-scheduler.v1.23.6.tar docker load -i /opt/images/k8s.gcr.io.coredns.coredns.v1.8.6.tar docker load -i /opt/images/k8s.gcr.io.etcd.v3.5.1-0.tar docker load -i /opt/images/k8s.gcr.io.pause.v3.6.tar docker load -i /opt/images/calico.kube-controllers.v3.24.5.tar docker load -i /opt/images/calico.cni-v3.24.5.tar docker load -i /opt/images/calico.node-v3.24.5.tar docker load -i /opt/images/dashboard.tar docker load -i /opt/images/metrics-scraper.tarhostnamemaster设置hostnamectl set-hostname masternode1设置hostnamectl set-hostname node1node2设置hostnamectl set-hostname node2hostsmaster/node设置cat >> /etc/hosts << EOF 192.168.1.111 master 192.168.1.112 node1 192.168.1.113 node2 EOF免密master生成密钥ssh-keygen t rsa将密钥分发给nodessh-copy-id node1 ssh-copy-id node2防火墙master/node关闭防火墙systemctl stop firewalld取消开机自启动防火墙systemctl disable firewalld查看防火墙状态systemctl status firewalldSELinuxmaster/node临时关闭SELinuxsetenforce 0 永久关闭SELinuxsed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux查看SELinux状态getenforceSwapmaster/node临时关闭Swapswapoff -a永久关闭Swapsed -ri 's/.*swap.*/#&/' /etc/fstab 查看SELinux状态free将桥接的 IPv4 流量传递到 iptables 的链master/node设置modprobe br_netfilter lsmod | grep br_netfilter touch /etc/resolv.conf cat <<EOF | tee /etc/modules-load.d/k8s.conf br_netfilter EOF cat <<EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system查看配置cat /etc/sysctl.conf若有内容,替换原有内容sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.conf sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.conf sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g" /etc/sysctl.conf sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g" /etc/sysctl.conf sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g" /etc/sysctl.conf sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g" /etc/sysctl.conf若无内容,向其追加echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf使其生效sysctl -p时间同步master/node自启动ntpdsystemctl enable ntpdmaster修改配置cat >> /etc/ntp.conf << EOF # 允许局域网网段内所有client连接到这台服务器同步时间.但是拒绝让他们修改服务器上的时间和远程登录 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap # 指定ntp服务器的地址 # 将当前主机作为时间服务器 server 127.127.1.0 # 时间服务器层级 0-15 0表示顶级 10通常用于给局域网主机提供时间服务 fudge 127.127.1.0 stratum 10 EOF重启systemctl restart ntpdnode修改配置cat >> /etc/ntp.conf << EOF server 192.168.1.111 profer EOF重启systemctl restart ntpd手动同步时间ntpdate -u 192.168.1.111自动同步时间 crontab -e*/5 * * * * /usr/sbin/ntpdate -u 192.168.1.111 >/dev/null 2>&1重启crond服务systemctl restart crond验证ntpq -pdockermaster/node解压cd /opt/docker && tar -zxf docker-19.03.11.tgz cp docker/* /usr/bin/创建docker.servicecat <<EOF | tee /usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker # 开启远程连接 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock ExecReload=/bin/kill -s HUP $MAINPID # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity # Uncomment TasksMax if your systemd version supports it. # Only systemd 226 and above support this version. #TasksMax=infinity TimeoutStartSec=0 # set delegate yes so that systemd does not reset the cgroups of docker containers Delegate=yes # kill only the docker process, not all processes in the cgroup KillMode=process # restart the docker process if it exits prematurely Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target EOF配置 cgroup 驱动程序cat <<EOF | tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] } EOF启动并设置开启自启systemctl daemon-reload systemctl enable docker systemctl start dockercnimaster/node解压cd /opt/cni && tar -zxf cni-plugins-linux-arm64-v0.9.1.tgz -C /usr/bincritestmaster/node解压cd /opt/critest && tar -zxf critest-v1.22.0-linux-arm64.tar.gz -C /usr/bin bashk8smaster/node赋予可执行权限cd /opt/k8s && chmod +x ./* && cp ./* /usr/bin/kubelet系统服务cat <<EOF | tee /etc/systemd/system/kubelet.service [Unit] Description=kubelet: The Kubernetes Node Agent Documentation=https://kubernetes.io/docs/ Wants=network-online.target After=network-online.target [Service] ExecStart=/usr/bin/kubelet Restart=always StartLimitInterval=0 RestartSec=10 [Install] WantedBy=multi-user.targetkubeadm配置文件mkdir -p /etc/systemd/system/kubelet.service.d cat <<EOF | tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env EnvironmentFile=-/etc/sysconfig/kubelet ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS EOF自启动kubeletsystemctl enable --now kubeletmaster集群初始化kubeadm init \ --apiserver-advertise-address=192.168.1.111 \ --kubernetes-version v1.23.6 \ --service-cidr=10.96.0.0/16 \ --pod-network-cidr=192.168.0.0/16复制文件夹mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config设置环境变量sed -i '$a # kubeconfig\nexport KUBECONFIG=/etc/kubernetes/admin.conf' /etc/profile && source /etc/profilenode复制文件夹mkdir -p $HOME/.kube cp -i /etc/kubernetes/kubelet.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config设置环境变量sed -i '$a # kubeconfig\nexport KUBECONFIG=/etc/kubernetes/kubelet.conf' /etc/profile && source /etc/profilemaster部署一个pod网络(calico)kubectl apply -f calico.yaml kubectl get pods -Anode加入集群(以终端输出为准,不可复制)Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.4.45:6443 --token jokbeq.logz5fixljdrna6r \ --discovery-token-ca-cert-hash sha256:16ba5133d2ca72714c4a7dd864a5906baa427dc53d8eb7cf6d890388300a052a # token过期怎么办 kubeadm token create --print-join-command kubeadm join 192.168.4.45:6443 --token l7smzu.ujy68m80prq526nh --discovery-token-ca-cert-hash sha256:16ba5133d2ca72714c4a7dd864a5906baa427dc53d8eb7cf6d890388300a052a master验证节点纳管kubectl get nodes给节点打标签kubectl label node node1 node-role.kubernetes.io/worker='' kubectl label node node2 node-role.kubernetes.io/worker=''dashboard部署master修改dashboard-v2.5.1.yaml文件:kubernetes-dashboard的Service,目标行前后如下(更改处见注释)--- kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: ports: - port: 443 targetPort: 8443 nodePort: 30001 # 新增 nodePort: 30001 向外暴露端口 selector: k8s-app: kubernetes-dashboard type: NodePort # 新增 type: NodePort 暴露到外部访问 ---修改dashboard-v2.5.1.yaml文件:kubernetes-dashboard的Deployment,目标行前后如下(更改处见注释)kind: Deployment apiVersion: apps/v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: kubernetes-dashboard template: metadata: labels: k8s-app: kubernetes-dashboard spec: securityContext: seccompProfile: type: RuntimeDefault containers: - name: kubernetes-dashboard image: kubernetesui/dashboard:v2.5.1 imagePullPolicy: Never # 修改 imagePullPolicy: Never 从本地拉取镜像 ports: - containerPort: 8443 protocol: TCP修改dashboard-v2.5.1.yaml文件:dashboard-metrics-scraper的Deployment,目标行前后如下(更改处见注释)apiVersion: apps/v1 metadata: labels: k8s-app: dashboard-metrics-scraper name: dashboard-metrics-scraper namespace: kubernetes-dashboard spec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: dashboard-metrics-scraper template: metadata: labels: k8s-app: dashboard-metrics-scraper spec: securityContext: seccompProfile: type: RuntimeDefault containers: - name: dashboard-metrics-scraper image: kubernetesui/metrics-scraper:v1.0.7 imagePullPolicy: Never # 新增 imagePullPolicy: Never 从本地拉取镜像 ports: - containerPort: 8000 protocol: TCP livenessProbe: httpGet: scheme: HTTP path: / port: 8000 initialDelaySeconds: 30 timeoutSeconds: 30 volumeMounts: - mountPath: /tmp创建 dashboard 相关的 namespace/service/deployment/pod等kubectl apply -f dashboard-v2.5.1.yaml 个人PC浏览器访问 kubernetes-dashboard地址https://192.168.1.111:30001master创建 ServiceAccount 并绑定默认 cluster-admin 管理员集群角色# 创建用户 kubectl create serviceaccount dashboard-admin -n kube-system # 用户授权 kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin # 获取用户 Token kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')参考链接官方社区-openEuler搭建k8s集群openEuler搭建k8s集群集群内网时间同步离线搭建k8s集群
  • [技术干货] Shell脚本基础概念
    一、Shell脚本基础概念1.1 什么是shell?shell英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的shell命令就包括ls、cd、pwd等等。shell是站在内核的基础上编写的一个应用程序,它连接了用户和Linux内核,从而让用户能够更加便捷、高效、安全的使用linux内核,这其实就是shell的本质。使用专业术语的说法来解释,Shell其实是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。1.2 什么是shell脚本shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。1.3 shell脚本的意义我们在1.2中也解释道shell脚本其实就是shell命令组成的文件,shell脚本可以记录命令执行的过程和执行逻辑,以便以后重复执行,还可以批量、定时处理主机,方便管理员进行设置或者管理。二、创建一个简单的Shell脚本2.1 创建一个shell脚本文件在创建shell脚本时,我们默认新建一个以.sh/.script结尾的文件,主要是为了让程序员更加快捷的辨认出该文件是一个shell脚本文件。我们创建一个test.sh的shell脚本文件,其中具体内容为下:#!/bin/bash``echo` `hello" # ”开头的就是注释,单行注释<<EOF … EOF 或 :<<! … ! :多行注释#!/bin/bash : 主要用于指定解释器Linux中提供的shell解释器有:/bin/sh/bin/bash/usr/bin/sh/usr/bin/bash2.2 运行一个Shell脚本我们根据脚本文件是否具有可执行权限,将运行一个shell脚本的方法分为两大类。2.2.1 脚本文件无执行权限这种情况下我们有三种方式来运行脚本:手动在环境中开启指定解释器:sh test.sh直接在当前环境中运行的shell中运行脚本:. test.sh直接在当前环境中运行的shell中运行脚本:source test.sh2.2.2 脚本文件有执行权限在这一部分由于我们假设脚本文件有可执行器权限,所以我们使用chmod +x test.sh为我们的test.sh文件增加了可执行权限。我们知道当一个文件具有可执行权限时我们可以使用该文件的路径名直接运行该文件,有两种方式可以运行脚本:1.绝对路径名运行脚本文件绝对路径就是从根目录下开始记录文件路径名,是文件在计算机上真正存在的路径。(如果不知道你的文件路径名,可以在当前位置的shell中使用pwd查询当前所在位置)2../相对路径名的格式运行脚本文件相对路径是指以当前的文件作为起点,相较于当前目录的位置而被指向并且加以引用的文件资源。比如我们知道test.sh文件的绝对路径为/home/westos/Desktop/textcpp/test.sh,那么当我们在testcpp文件夹中时,test.sh文件的相对路径为test.sh。又因为.代表当前所在位置,故而为其实./test.sh其实就是该文件的绝对路径,只是表示的方式不同。三、基本语法3.1 变量变量名其实就是一片内存区域的地址或者可以说是寻址符号,有了变量我们就可以使用一串固定的字符来表示不固定的目标。3.1.1 变量类型在shell中会同时存在三种类型变量。局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行3.1.2 变量操作创建普通变量:name=“test”,组要注意的是等号两边不能有空格。创建局部变量:local name=“test”,使用local修饰的变量在函数体外无法访问,只能在函数体中使用。创建只读变量:name=“only_read” -> readonly name,这种变量不可以被修改。使用变量:echo $name或者echo ${name}删除变量:unset name,删除之后的变量无法被访问,需要注意无法删除只读变量。3.1.3 字符串变量3.1.3.1 字符串变量的创建使用单引号创建:var='test'。 这种方式创建的变量只能原样输出,变量无效,我们可以借用c中的“字符串常量”的定义理解这种特性。除此以外,单引号中不能出现单独的单引号,转义也是不可以的。使用双引号创建:var="my name is ${name}",这种方式创建的字符串变量有效,也可以出现转义符。3.1.3.2 拼接字符串字面量拼接 str01="1""2"或者str01="1"'2',这样就将1和2两个字符拼接在了一起。需要注意的是两个串之间不可以有空格。变量拼接 str03=${part01}${part02}或str04=${part01}"end"或str05="${part01} ${part02}"这三种方式都可以拼接字符串变量。命令拼接 str02= date“end”,这里的date是一个shell命令,需要使用引用,具体如下:str02=```date`````"end"3.1.3.3 获取字符串长度1.使用wc -L命令wc -L可以获取到当前行的长度,因此对于单独行的字符串可以用这个简单的方法获取,另外wc -l则是获取当前字符串内容的行数。echo` `"abc"` `|``wc` `-L2.使用expr length可以获取string的长度expr` `length ${<!--{C}-->str}3.awk获取域的个数但是如果大于10个字符的长度时是否存在问题需要后面确认echo` `"abc"` `|``awk` `-F ``""` `'{print NF}'4.通过awk+length的方式获取字符串长度echo` `“Alex”|``awk` `'{print length($0)}'5.通过echo ${#name}的方式name=Alex``echo` `${``#name}3.1.3.4 提取子字符串1.如下方式:代码意义${varible##*string}从左向右截取最后一个string后的字符串${varible#*string}从左向右截取第一个string后的字符串${varible%%string*}从右向左截取最后一个string后的字符串${varible%string*}从右向左截取第一个string后的字符串例,如下代码:$ MYVAR=foodforthought.jpg``$ ``echo` `${MYVAR``##*fo}运行结果为rthought.jpg2.使用${varible:n1:n2}截取变量varible从n1到n2之间的字符串,可以根据特定字符偏移和长度,来选择特定子字符串,如下代码:$ EXCLAIM=cowabunga``$ ``echo` `${EXCLAIM:0:3}运行结果最终显示cow。3.1.4 数组如果说变量是存储单个变量的内存空间,那么数组就是多个变量的集合,它存储多个元素在一片连续的内存空间中。在bash中,只支持一维数组,不支持多维数组。3.1.3.1 数组定义与引用定义一个数组方式如下:数组名=(元素1 元素2 元素3 ... 元素n)指定数组对应下标的元素进行赋值:数组名[下标]=值同时指定多个数组元素进行赋值:数组名=([下标1]=值1 [下标2]=值2 ... [下标n]=值n)引用数组对应下标的元素:${数组名[下标]}3.1.3.2 遍历数组元素使用for(或while循环)循环遍历数组元素:#!/bin/bash``a=(1 2 3 4 5 6)``for``((i=0; i<10; i++))``do`` ``echo` `"a[$i]=${a[$i]}"``done除此以外我们还可以使用${a[*]}或者${a[@]}来遍历数组元素,具体代码如下:#!/bin/bash``a=(1 2 3 4 5 6)``echo` `${a[*]}``echo` `${a[@]}3.1.3.3 获取数组长度我们可以使用#来获取数组长度,需要注意的是在shell脚本中我们越界访问数组时是不会报错的。#!/bin/bash``a=(1 2 3 4 5 6)``echo` `${a[*]}``echo` `"a len: ${#a[*]}"我们先使用其获取数组中的元素后使用#获取元素个数即可。3.1.3.4 合并数组我们可以如下进行拼接:#!/bin/bash``a=(1 2 3 4 5 6)``b=(``"hello"` `"zhaixue.cc"``)``c=(${a[*]} ${b[*]})这样我们就将两个数组拼接起来了。3.1.3.5 删除数组元素如果我们想要删除某个数组元素,具体代码如下:#!/bin/bash``a=(1 2 3 4 5 6)``echo` `${a[*]}``echo` `"a len: ${#a[*]}"``unset` `a[5]``echo` `${a[*]}``echo` `"a len: ${#a[*]}"执行结果如下:我们如果要删除整个数组,可以执行unset a,举例代码如下:#!/bin/bash``a=(1 2 3 4 5 6)``echo` `${a[*]}``echo` `"a len: ${#a[*]}"``unset` `a``echo` `${a[*]}``echo` `"a len: ${#a[*]}"3.1.5 变量传参相关的变量含义为:变量含义$0代表执行的文件名$1代表传入的第1个参数$n代表传入的第n个参数$#参数个数$*以一个单字符串显示所有向脚本传递的参数。$@与$相同,但是使用时加引号,并在引号中返回*每个参数$$脚本运行的当前进程号$!后台运行的最后一个进程的ID$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。3.2 运算符原生的bash并不支持简单的数学运算,通常要通过其它命令来实现。3.2.1 算数运算符以下表格中的a和b都是变量。运算shell中格式加法expr $a + $b减法expr $a - $b乘法expr $a \* $b除法expr $b / $a取余expr $b % $a赋值a=$b相等[ $a == $b ]不相等[ $a != $b ]需注意:条件表法式需要放在方括号之间,并且要有空格。使用expr进行计算时需要使用反引号,为了让读者更容易理解,给出下列示例代码。#!/bin/bash``a=10``b=20` `val=```expr` `$a + $b```echo` `"a + b : $val"3.2.2 关系运算符关系运算符只支持数字,不支持字符串,除非字符串的值是数字。运算shell中的实现主要符号检测两个数是否相等[ $a -eq $b ]-eq检测两个数是否不相等[ $a -ne $b ]-ne检测左边的数是否大于右边的[ $a -gt $b ]-gt检测左边的数是否小于右边的[ $a -lt $b ]-lt检测左边的数是否大于等于右边的[ $a -ge $b ]-ge检测左边的数是否小于等于右边的[ $a -le $b ]-le举例代码如下:#!/bin/bash``a=1``b=2` `if` `[ $a != $b ]``then`` ``echo` `"$a != $b : a 不等于 b"``else`` ``echo` `"$a == $b: a 等于 b"执行结果如下:3.2.3 布尔运算符具体如下:运算shell中的实现主要符号非运算[ ! false ]!或运算[ $a -lt 20 -o $b -gt 100 ]-o与运算[ $a -lt 20 -a $b -gt 100 ]-a3.2.4 逻辑运算符具体如下:运算shell中的实现主要符号逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]]&&逻辑的 OR[[ $a -lt 100 `布尔运算符和逻辑运算符的区别:语法上,逻辑运算需要双括弧,布尔运算只需要单大括弧功能上,逻辑运算具有特殊的短路功能,即是在AND运算中第一个表达式为false时则不执行第二个表达式,在OR运算中第一个表达式为true时不执行第二个表达式。3.2.5 字符串运算符下表列出了常用的字符串运算符:运算shell中的实现主要符号检测两个字符串是否相等[ $a = $b ]=检测两个字符串是否不相等[ $a != $b ]!=检测字符串长度是否为0[ -z $a ]-z检测字符串长度是否不为 0[ -n “$a” ]-n检测字符串是否为空[ $a ]$3.2.6 文件测试运算符主要用于检测unix文件的各种属性:运算shell中的实现主要符号检测文件是否是块设备文件[ -b $file ]-b file检测文件是否是字符设备文件[ -c $file ]-c file检测文件是否是目录[ -d $file ]-d file检测文件是否是普通文件(既不是目录,也不是设备文件)[ -f $file ] 返回 true-f file检测文件是否设置了 SGID 位[ -g $file ]-g file检测文件是否设置了粘着位(Sticky Bit)[ -k $file ]-k file检测文件是否是有名管道[ -p $file ]-p file检测文件是否设置了 SUID 位[ -u $file ]-u file检测文件是否可读[ -r $file ]-r file检测文件是否可写[ -w $file ]-w file检测文件是否可执行[ -x $file ]-x file检测文件是否为空(文件大小是否大于0)[ -s $file ]-s file检测文件(包括目录)是否存在[ -e $file ]-e file举例如下:#!/bin/bash``file``=``"/home/westos/Desktop/textcpp/test.sh"``if` `[ -r $``file` `]``then`` ``echo` `"文件可读"``else`` ``echo` `"文件不可读"``fi
  • [问题求助] 昇腾推理基础镜像的CentOS版本支持openEuler吗?
    昇腾推理基础镜像的CentOS版本支持openEuler吗?https://ascendhub.huawei.com/#/detail/ascend-infer
  • [分享交流] openeuler相比于其他操作系统的优势有哪些?
    openeuler相比于其他操作系统的优势有哪些?
  • [openEuler] openEuler 制作驱动镜像文件
    随着板卡芯片不断更新,操作系统中的驱动可能不支持新的芯片,所以需要升级驱动。在所有的硬件中,raid卡驱动是一种比较特殊的驱动,如果操作系统不支持raid卡,在安装系统过程中就无法识别raid卡下的硬盘,导致系统无法正常安装。这种情况下,我们可以通过制作raid卡驱动镜像文件,辅助升级系统驱动,达到安装系统的目的。本文主要以raid卡驱动megaraid_sas为例。1. 安装依赖软件包dnf install -y tar rpm-build createrepo genisoimage2. 下载驱动包,进行解压wget cid:link_0tar -xf MR_LINUX_DRIVER_7.22-07.722.02.00-2.tgz3. 进入源码包目录,安装驱动源码包cd kmod_srpm/rpm -ivh kmod-megaraid_sas-07.722.02.00-2.src.rpm4. 查看 megaraid_sas.spec 文件ls -l /root/rpmbuild/SPECS/megaraid_sas.spec5. 编译spec文件,生成驱动rpm包    【注意:编译环境和架构要求和待安装操作系统相同】rpmbuild -ba /root/rpmbuild/SPECS/megaraid_sas.spec6. 创建制作目录,将编译好的驱动软件包复制到目录下  mkdir -p driver/rpms/aarch64       cp /root/rpmbuild/RPMS/aarch64/kmod-megaraid_sas-07.722.02.00-2.aarch64.rpm driver/rpms/aarch64/       cp /root/rpmbuild/RPMS/aarch64/kmod-megaraid_sas-07.722.02.00-2.aarch64.rpm driver7. 创建rhdd3文件echo "Driver Update Disk version 3" > driver/rhdd3 8. 使用createrepo命令创建repodatacreaterepo --pretty driver/rpms/aarch64/createrepo --pretty driver9. 制作驱动镜像文件mkisofs -R -V "Driver" -o megaraid_sas.iso driver10. 验证驱动镜像文件      驱动镜像文件可以被正常挂载识别            
  • [问题求助] 华为云鲲鹏openEuler 20.03安装kubesphere,出现exec /shell-operator: exec format error
    华为云鲲鹏openEuler 20.03安装kubesphere,之前已安装好kubernetes,现在在 Kubernetes 上最小化安装 KubeSphere,出现exec /shell-operator: exec format error,看样子,好像是下载了x86的文件?怎么解决[root@master01 ~]# kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/cluster-configuration.yamlcustomresourcedefinition.apiextensions.k8s.io/clusterconfigurations.installer.kubesphere.io creatednamespace/kubesphere-system createdserviceaccount/ks-installer createdclusterrole.rbac.authorization.k8s.io/ks-installer createdclusterrolebinding.rbac.authorization.k8s.io/ks-installer createddeployment.apps/ks-installer created[root@master01 ~]# kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -fError from server (BadRequest): container "installer" in pod "ks-installer-85dcfff87d-c9jbv" is waiting to start: ContainerCreating[root@master01 ~]# kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -fexec /shell-operator: exec format error
  • [问题求助] 华为云鲲鹏openEuler 20.03上部署的kubernetes,容器pull的是x86还是arm?
    是i↵我想知道,在华为云鲲鹏openEuler 20.03上部署的kubernetes,pull获取k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2,如何自动根据节点判断下载arm还是x86容器?如果是x86的,应该不能在arm上运行吧?
  • [问题求助] 华为云鲲鹏openEuler 20.03上安装Harbor v2.x,在哪里找到harbor-offline-installer-v2.x.tgz
    我想在华为云鲲鹏openEuler 20.03上安装Harbor v2.x,在哪里找到harbor-offline-installer-v2.x.tgz?目前搜到的是1.9.x版,要修改一系列参数,适配性不是很好,求助
  • [技术干货] 基于openEuler的docker-engine(CE)适配安装与使用
    openEuler系统自带的mainline源所包含的docker包为docker-engine,而社区最新已经用docker-ce将其替代。如果使用docker官方源安装docker-ce,会导致安装报错,编译依赖关系不满足(containerd.io包缺少container-selinux >= 2.74, openEuler上为2.73版本),且按照网上多种方法安装,均或多或少存在各种问题。对于openEuler上适配安装docker-ce问题,我们这里提供以下方法:1、使能mainline源、centos7的extras源(x86_64)、docker官方源docker-ce-stable​可以配置阿里centos7源wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo并修改Centos-7.repo将其中$releasever替换为7,$basearch替换为x86_64解释:之所以用到centos7的extras源的x86_64版本,是因为openEuler官方提供的container-selinux版本为2.73版本( < 2.74 ),不满足安装要求。而centos7官方只有x86_64的源,不过container-selinux是noarch类型的包,因此是可以兼容安装在aarch64上的。​添加docker-ce-stable源yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo注意,并不需要安装官方指导中要求的去安装yum-utils,因为openEuler集成了yum-utils的高级版本dnf-plugin-core,兼容之前的yum-utils。可以参考:cid:link_0​2、yum install -y docker-ce --nobest解释:之所以使用--nobest,是因为正常安装最新版本会报缺少pythoncoreutils-python包,因此使用--nobest来自动安装满足依赖的版本。安装结果如下:3、systemctl start docker​4、测试容器正常运行(运行正常将打印"Hello-world")​5、配置国内镜像(需科学上网或改用墙内镜像,否则默认拉取的镜像地址不可访问)改用墙内镜像:vim /etc/docker/daemon.json​systemctl restart docker6、尝试拉取nginx镜像:docker pull nginx​7、删除所有镜像docker rmi -f $(docker images -qa) 
  • [问题求助] open Euler下isula容器网络配置,crictl runp pod-config.json找不到文件
    open Euler下isula容器网络配置,crictl runp pod-config.json失败 显示load podSandboxConfig: config at pod-config.json not foundpod-config.json文件在根目录下/CRI/pod-config.json 内容为 { "metadata": { "name": "nginx-sandbox", "namespace": "default", "attempt": 1, "uid": "hdishd83djaidwnduwk28bcsb" }, "log_directory": "/tmp", "linux": { } }daemon.json位置在/etc/isulad/ 配置内容为:{ "group": "isulad", "default-runtime": "lcr", "graph": "/var/lib/isulad", "state": "/var/run/isulad", "engine": "lcr", "log-level": "ERROR", "pidfile": "/var/run/isulad.pid", "log-opts": { "log-file-mode": "0600", "log-path": "/var/lib/isulad", "max-file": "1", "max-size": "30KB" }, "log-driver": "stdout", "hook-spec": "/etc/default/isulad/hooks/default.json", "start-timeout": "2m", "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], "registry-mirrors": [ ], "insecure-registries": [ ], "pod-sandbox-image": "", "image-opt-timeout": "5m", "image-server-sock-addr": "unix:///var/run/isulad/isula_image.sock", "native.umask": "secure", "network-plugin": "", "cni-bin-dir": "", "cni-conf-dir": "", "image-layer-check": false, "use-decrypted-key": true, "insecure-skip-verify-enforce": false }
  • [问题求助] Open Euler安装isula后,配置cni文件过程中,crictl runp pod-config.json 失败,检查isula状态出错
    用过sudo yum install -y iSulad 安装的isula在跟华为论坛帖子配置cni过程中,crictl runp pod-config.json 失败,报错:load podSandboxConfig: config at pod-config.json not found通过systemctl status isulad检查i酥啦状态,发现报错:isulad[4268]: isulad 20221030202454.588 ERROR src/connect/client/grpc/grpc_isula_image_client.cc:run:137 - error_code: 14: failed to connect to all addresses早重新安装isula后直接检查状态仍然报错,求助
  • [openEuler] 使用9560-8i raid卡 安装 openEuler 20.03LTS SP3
    环境信息服务器型号:Taishan200 2280操作系统版本:openEuler 20.03LTS SP3架构:aarch64RAID卡型号: 9560-8i(SAS3908)磁盘阵列卡驱动更新流程1. 构建megaraid_sas驱动镜像文件驱动镜像文件构建方式请参考《openEuler 制作驱动镜像文件》2. 在服务器上挂载系统镜像文件3. 启动服务器,在进入安装选择界面时,选择”Install openEuler 20.03-LTS-SP3”,键盘按“e”进入grub配置界面,修改grub配置,添加“linux dd”,然后使用ctrl+x进入安装4. 进入dd交互模式,弹出系统镜像文件,插入驱动镜像文件5. 更新驱动,先输入”r”刷新镜像文件信息,输入“1”回车,可看到挂载的驱动镜像6. 升级驱动输入“1”回车选择驱动,再输入“c”回车升级驱动7. 升级完成后,弹出驱动镜像文件,挂载系统镜像文件,继续安装系统先输入”r”刷新镜像文件信息,出现系统镜像文件信息后,输入”c”继续安装系统8. 进行系统安装配置,选择硬盘、配置网络9. 完成配置后安装系统10. 重启进入openEuler 20.03LTS SP3
总条数:113 到第
上滑加载中