Kubernetes 学习笔记以及 Kubernetes 集群 +KubeSphere 部署指南

kubernetes 学习笔记

Kubernetes 中的各种东西介绍

  1. Kubernetes API Server

    提供 Kubernetes 各类资源对象的增删改查的 HTTP Rset 接口,是整个系统的数据总线和数据中心,提供了集群管理的 REST API 接口,包括认证授权、数据校验以及集群状态变更、提供了其他模块之间的数据交互和通信的枢纽,是资源配额控制的入口,拥有完备的安全机制

  2. Kubernetes Controller Manager

    作为集群内部的管理控制中心,负责集群内的 Node 节点,Pod 副本、服务端点(Endpoint)、命名空间(NameSpace)、服务账号(ServiceAccount)、资源配额(ResourceQuota)的管理。当某个 Node 意外宕机时,Controller 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态

  3. Kubernetes Scheduler(调度器)

    Kubernetes Scheduler 的作用是根据特定的调度算法把 Pod 调度到指定的工作节点(Node)上,这一过程也叫绑定(Bind)。Scheduler 的输入为需要调度的 Pod 和可以被调度的节点的信息,输出为调度算法选择的 Node 节点,并将该 Pod 绑定到这个 Node 节点

  4. Etcd

    是 Kubernetes 集群中的一个十分重要的组件,用于保存集群中所有的网络配置和对象的状态信息

  5. Kubelet

    在 Kubunetes 集群中,每个 Node 节点都会启动 kubelet 进程,用来处理 Master 节点下发到本节点的任务,管理 Pod 和其中的容器。kubelet 会在 API Server 上注册节点信息,定期向 Master 汇报节点资源的使用情况,并通过 cAdvisor 监控容器和节点资源。可以把 kubelet 理解成是一个代理进程,是 Node节点上的 Pod 管家

    是一个 Kubernetes 的客户端工具,通常会在 Kubernetes 的 Master 节点的安装过程中被一同安装,在任意环境安装,只要能连接 Master 节点,就可以通过它来管理 Kubernetes 集群

  6. Kube-proxy

    它运行在所有的 Node 节点上,监听每个节点上 Kubernetes API 中定义的服务变化情况,并创建路由规则来进行服务负载均衡

  7. Pod

    是 Kubernetes 最基本的操作单元,一个 Pod 中可以包含一个或多个紧密相关的容器,一个 Pod 可以被一个容器化的环境看作应用层的逻辑宿主机。每个Pod 中运行着一个特殊的被称之为 Pause 的容器,其他容器则称为业务容器,业务容器共享 Pause 容器的网络栈和 Volume 挂载卷

  8. Service(服务)

    通常由一组 Pod 组成一个集群来提供服务,服务的特点:

    • 拥有一个指定的名字,比如 mysql-server
    • 拥有一个虚拟 IP 地址和端口号,销毁之前不会改变,只能内网访问
    • 能够提供某种远程服务能力
    • 被映射到了提供这种服务能力的一组容器应用上
  9. CoreDNS

CoreDNS 是模块化且可插拔的 DNS 服务器,每个插件都为 CoreDNS 添加了新功能。 可以通过维护 Corefile,即 CoreDNS 配置文件, 来定制其行为。 集群管理员可以修改 CoreDNS Corefile 的 ConfigMap,以更改服务发现的工作方式

  1. Cilium

    Cilium 是一款开源软件,用于透明地保护使用 Linux 容器管理平台(如 Docker 和 Kubernetes)部署的应用程序服务之间的网络连接

    Cilium 的基础是一种名为 eBPF 的新 Linux 内核技术,它支持在 Linux 本身内动态插入强大的安全可见性和控制逻辑。由于 eBPF 在 Linux 内核中运行,因此可以应用和更新 Cilium 安全策略,而无需对应用程序代码或容器配置进行任何更改

  2. kube-proxy

    Kubernetes 网络代理在每个节点上运行。网络代理反映了每个节点上 Kubernetes API 中定义的服务,并且可以执行简单的 TCP、UDP 和 SCTP 流转发,或者在一组后端进行 循环 TCP、UDP 和 SCTP 转发。 当前可通过 Docker-links-compatible 环境变量找到服务集群 IP 和端口, 这些环境变量指定了服务代理打开的端口。 有一个可选的插件,可以为这些集群 IP 提供集群 DNS。 用户必须使用 apiserver API 创建服务才能配置代理。

  3. kube-state-metrics

    kube-state-metrics是 Kubernetes 组织下的一个项目,根据 Kubernetes 原生资源的当前状态生成 Prometheus 格式的指标。它通过侦听 Kubernetes API 并收集有关资源和对象的信息来做到这一点,例如 Deployment、Pod、Service 和 StatefulSet。kube-state-metrics的文档中提供了完整的资源列表。

使用 Kubeadm 安装 Kubernetes 集群

Kubeadm 官方教程

  1. 前期准备(所有节点)

    安装 docker

    1
    2
    3
    yum -y install docker
    systemctl enable docker
    systemctl start docker

    禁用 SELinux

    1
    2
    sed -i 's/SELINUX=permissive/SELINUX=disabled' /etc/sysconfig/selinux
    setenforce 0

    安装 kubelet

    添加镜像 repo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    exclude=kubelet kubeadm kubectl
    EOF
    1
    2
    3
    sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    systemctl enable kubelet
    systemctl start kubelet

    禁用交换分区

    1
    2
    3
    4
    swapoff -a
    vim /etc/fstab
    #修改/etc/fstab文件,注释掉下面该行
    #/dev/mapper/centos-swap swap swap default 0 0

    修改防火墙规则

    1
    2
    iptables -P FORWARD ACCEPT 
    iptables-save

    配置转发

    1
    2
    3
    4
    5
    6
    7
    8
    9
    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    br_netfilter
    EOF

    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    sudo sysctl --system

    设置域名解析(否则后期 API-SERVER 会报错,也可以在 DNS 服务器上添加解析记录)

    1
    2
    3
    4
    5
    6
    7
    8
    cat >> /etc/hosts << EOF

    # K8S Cluster
    100.x.x.x m.x.yhsyc.club
    100.x.x.x s1.x.yhsyc.club
    100.x.x.x s2.x.yhsyc.club

    EOF
  2. 部署 Master 节点
    1
    kubeadm init --apiserver-advertise-address 100.88.1.99 --control-plane-endpoint m.x.yhsyc.club --pod-network-cidr 192.168.0.0/17 --service-cidr 192.168.128.0/18 --service-dns-domain x.yhsyc.club --node-name m.yhsyc.club

    这个过程中,kubeadm 完成了以下几个主要步骤:

    • 检查初始化节点所需要的先决条件,如果不满足,就给出错误提示
    • 生成 Kubernetes 集群的令牌
    • 生成自签名的 CA 和客户端证书
    • 自动创建 kubeconfig 配置文件,该文件是提供给 kubelet 连接 API Server 时使用的
    • 配置基于角色的访问控制,并且设置 Master 节点只允许控制组件服务
    • 创建其他的相关服务,例如 kube-proxy 和 kube-dns 等

    要注意init完成之后的提示信息,有操作指引,可以复制之后的指令直接加入 master

    1
    2
    3
    4
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    #如果不导入,那么会报证书问题
  3. 下载网络插件 Cilium
    1
    2
    3
    4
    curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz{,.sha256sum}
    sha256sum --check cilium-linux-amd64.tar.gz.sha256sum
    sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
    rm cilium-linux-amd64.tar.gz{,.sha256sum} -rf

    安装 Cilium

    1
    cilium install

    微信截图_20220309193213.png

    1
    2
    3
    # apply 安装 flannel 作为网络插件 
    # 这里我试了 flannel,网络容器起不起来,之后转用 cilium,发现是我内核版本太低导致装不上,但不确定 flannel 是不是也是
    #kubectl apply -f https://raw.githubusercontent.com/flannel-#io/flannel/master/Documentation/kube-flannel.yml
  4. 部署 Node 节点
    1
    2
    3
    token=$(kubeadm token list | grep authentication,signing | awk '{print $1}')
    kubeadm join --token $token <ip-address>
    --node-name s1.x.yhsyc.club # << 加这一行
    1
    2
    #示例
    kubeadm join m.x.yhsyc.club:6443 --token mdd3oz.l3ld96hi07nvfqyr --discovery-token-ca-cert-hash sha256:ed8f89b489a70a515a68182bf5b30ec2aaaf8cf336d1f2d8dfa2a307f0c40522 --node-name s1.x.yhsyc.club

    微信截图_20220311092742.png

  5. 如果部署过程中有什么不对的,可以重新部署 init
    1
    kubeadm reset
  6. 部署完成后可以通过下面指令来显示节点信息
    1
    kubectl get nodes

    微信截图_20220311092917.png

  7. 可以看一下 pod 服务都有什么,有没有状态不对的 pod
    1
    kubectl get pod -A

    到这里的话 K8S 集群就是可以开始工作的了

使用 NFS 作为 K8S 集群的存储

  1. 安装 NFS 服务器

    这里我用了一台 200 G SSD 的 Alpine 来作为 NFS 服务器

    1
    apk add nfs-utils

    安装完成之后在 /etc/exports 中加一行配置

    1
    2
    vim /etc/exports
    /data 100.x.x.0/24(rw,async,no_subtree_check,no_wdelay,crossmnt,no_root_squash,insecure_locks,sec=sys,anonuid=0,anongid=0)

    设置NFS服务开机自启并重启服务器

    1
    rc-update add nfs && reboot
  2. 在所有节点安装 nfs 客户端
    1
    2
    yum -y install nfs-utils
    systemctl start nfs && systemctl enable nfs
  3. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vi /etc/kubernetes/manifests/kube-apiserver.yaml

    #添加- --feature-gates=RemoveSelfLink=false
    #
    ...
    - command:
    - kube-apiserver
    - --advertise-address=192.168.5.11
    - --allow-privileged=true
    - --feature-gates=RemoveSelfLink=false
    ...
    #

    保存退出,kubernetes 会自动重建 apiserver,如果没有这一步的话后面创建 pod 会一直 pending,挂载失败

  4. 部署 nfs-client-provisioner(master)
    1
    2
    3
    4
    #从github上clone yaml
    git clone https://github.com/kubernetes-incubator/external-storage.git
    cp -R external-storage/nfs-client/deploy/ $HOME
    cd deploy

    创建权限 rbac.yaml

    1
    2
    3
    4
    5
    # Set the subject of the RBAC objects to the current namespace where the provisioner is being deployed
    NS=$(kubectl config get-contexts|grep -e "^\*" |awk '{print $5}')
    NAMESPACE=${NS:-default}
    sed -i'' "s/namespace:.*/namespace: $NAMESPACE/g" ./deploy/rbac.yaml ./deploy/deployment.yaml
    kubectl create -f deploy/rbac.yaml

    配置 deploy/class.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
    name: managed-nfs-storage
    provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
    parameters:
    archiveOnDelete: "false" # When set to "false" your PVs will not be archived
    # by the provisioner upon deletion of the PVC.

    修改 deployment.yaml 文件
    这里修改的参数包括 NFS 服务器所在的 IP 地址(192.168.5.11),以及 NFS 服务器共享的路径(/nfs/data/pv002),两处都需要修改为你实际的 NFS 服务器和共享目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    [root@master deploy]# cat deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nfs-client-provisioner
    labels:
    app: nfs-client-provisioner
    namespace: default
    spec:
    replicas: 1
    strategy:
    type: Recreate
    selector:
    matchLabels:
    app: nfs-client-provisioner
    template:
    metadata:
    labels:
    app: nfs-client-provisioner
    spec:
    serviceAccountName: nfs-client-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: 100.88.1.96
    - name: NFS_PATH
    value: /data
    volumes:
    - name: nfs-client-root
    nfs:
    server: 100.88.1.96
    path: /data

    应用 nfs

    1
    kubectl apply -f deploy/deployment.yaml -f deploy/class.yaml

    微信截图_20220310163620.png

  5. 测试环境

    部署测试 pod

    1
    kubectl create -f deploy/test-claim.yaml -f deploy/test-pod.yaml

    查看 pvc,pv 状态

    1
    kubectl get pvc,pv

    能看到下面就说明成了

    1
    2
    3
    4
    5
    6
    [root@master]# kubectl get pvc,pv
    NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    persistentvolumeclaim/test-claim Bound ingress-nginx-test-claim-pvc-efd702ba-102d-4d61-9a5f-6fc4805f12c0 1Mi RWX managed-nfs-storage 25m

    NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    persistentvolume/ingress-nginx-test-claim-pvc-efd702ba-102d-4d61-9a5f-6fc4805f12c0 1Mi RWX Delete Bound ingress-nginx/test-claim managed-nfs-storage 19m

    删除测试 pod

    1
    kubectl delete -f deploy/test-pod.yaml -f deploy/test-claim.yaml
  6. 设置默认 StorageClass(master 节点)
    1
    kubectl patch storageclass managed-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

安装 Prometheus 和 Grafana

建议不要在完全翻墙的环境下去拉镜像,很有可能拉不成功,有时候拉失败,要考虑一下是不是网络环境的问题

GitHub link : Prometheus and Grafana

快速安装

1
2
kubectl apply \
--filename https://raw.githubusercontent.com/giantswarm/prometheus/master/manifests-all.yaml

安装KubeSphere

GitHub link : KubeSphere

最小化快速部署
1
2
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/kubesphere-installer.yaml
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/cluster-configuration.yaml
查看部署进度及日志
1
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

微信截图_20220310201916.png

部署完成后可执行如下命令查看控制台的服务端口,使用 IP:consolePort(default: 30880) 访问 KubeSphere UI 界面,默认的集群管理员账号为 admin/P@88w0rd

1
kubectl get svc/ks-console -n kubesphere-system

微信截图_20220323214439.png

在安装前或者安装后开启插件

  1. 编辑你的 cluster-configuration.yaml
  2. 找到你要启用的插件 将 enable 后的 false 改为 true,保存退出
  3. 重新应用一下该文件,搞定

示例:

1
2
3
4
5
6
7
8
9
vi cluster-configuration.yaml
/openpitrix #搜索openpitrix插件

openpitrix:
store:
enabled: true # 将“false”更改为“true”

:wq #保存退出
kubectl apply -f cluster-configuration.yaml

可以查看安装进度

1
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

Openssh 配置 root 账号登录

alpine-iso 启动虚拟机后

1
setup-alpine

配置 alpine 并将 alpine 系统写入到选择的磁盘中

官方镜像默认 openssh 不让用 root 账号登陆,需要修改配置文件并重启 sshd

1
vi /etc/ssh/sshd_config
1
2
3
4
5
/PermitRootLogin
A
#PermitRootLogin prohibit-password
改为PermitRootLogin yes
:wq
1
rc-service sshd restart

这样就可以用root账号密码通过ssh登录了

Go 学习笔记

  1. Go 代码在发布之前,要 go fmt 转化成标准化代码格式,而避免了大家为了各种标准格式产生争议

  2. 一个 go 程序有一个 main 包

  3. 左大括号 { 必须和方法声明放在同一行,这是编译器的强制规定

  4. GO 语言中不存在类型继承

  5. 函数也可以是一个确定的类型,就是以函数作为返回类型。这种类型的声明要写在函数名和可选的参数列表之后,例如:

    1
    func FunctionName (a typea, b typeb) typeFunc
  6. 一个函数可以拥有多返回值,返回类型之间需要使用逗号分割,并使用小括号 () 将它们括起来,如:

    1
    func FunctionName (a typea, b typeb) (t1 type1, t2 type2)
  7. 由于 Go 语言不存在隐式类型转换,因此所有的转换都必须显式说明,就像调用一个函数一样(类型在这里的作用可以看作是一种函数):

    1
    valueOfTypeB = typeB(valueOfTypeA)

    类型 B 的值 = 类型 B(类型 A 的值)

    示例:

    1
    2
    a := 5.0
    b := int(a)

    但这只能在定义正确的情况下转换成功,例如从一个取值范围较小的类型转换到一个取值范围较大的类型(例如将 int16 转换为 int32)。当从一个取值范围较大的转换到取值范围较小的类型时(例如将 int32 转换为 int16 或将 float32 转换为 int),会发生精度丢失(截断)的情况。当编译器捕捉到非法的类型转换时会引发编译时错误,否则将引发运行时错误。

    具有相同底层类型的变量之间可以相互转换:

    1
    2
    3
    var a IZ = 5
    c := int(a)
    d := IZ(c)

    golang中printf的用法

CentOS 的防火墙控制及指令

CentOS 7 关闭 SELinux 以及防火墙指令

暂时禁用 SELinux

1
setenforce 0

彻底禁用 SELinux

1
2
3
4
vim /etc/selinux/config
#将其中的 SELINUX=enforcing
#修改为 SELINUX=disabled
reboot
  1. 查看已开放端口

    1
    firewall-cmd --list-ports
  2. 开放单个端口(开放后需要重启防火墙以生效)

    1
    firewall-cmd --zone=public --add-port=8080/tcp --permanent

    (–permanent 为永久生效,不加为单次有效(重启失效))

  3. 开放多个端口(开放后需要重启防火墙以生效)

    1
    firewall-cmd --zone=public --add-port=30000-59999/tcp --permanent
  4. 关闭端口(关闭后需要重启防火墙以生效)

    1
    firewall-cmd --zone=public --remove-port=8080/tcp --permanent
  5. 查看端口是否打开

    1
    firewall-cmd --zone= public --query-port=80/tcp
  6. 查看防火墙状态

    1
    2
    3
    firewall-cmd --state
    #or
    systemctl status firewalld
  7. 开关防火墙

    1
    2
    systemctl start firewalld
    systemctl stop firewalld
  8. 重启防火墙

    1
    2
    3
    firewall-cmd --reload
    #or
    systemctl restart firewalld
  9. 设置防火墙开机状态

    1
    2
    3
    4
    #开机自启防火墙
    systemctl enable firewalld
    #开机默认关闭
    systemctl disable firewalld
  10. 查看防火墙设置开机自启是否成功

    1
    systemctl is-enabled firewalld; echo $?

Linux 下 Docker 和 Docker-compose 环境搭建

Linux 下 Docker 和 Docker-compose 环境的搭建

  1. 安装 docker-ce

    1
    curl -SsL get.docker.com | sh
  2. 安装 python-pip

    1
    yum install python3-pip
  3. 更新 pip

    1
    pip3 install --upgrade pip
  4. 安装 docker-compose

    1
    pip install docker-compose

    检查 docker-compose 版本

    1
    docker-compose version

    微信截图_20220228134909.png

属于是站在巨人的肩上摘苹果了

Linux 环境下 jdk/jre 的安装配置过程

Linux 环境下 jdk/jre 的安装配置过程

CentOS 7 示例

  1. 下载解压 jdk 包

    openjdk

    1
    2
    3
    4
    5
    # 在 /usr/local 目录下安装jdk
    cd /usr/local
    wget https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_linux-x64_bin.tar.gz
    tar -zxvf jdk-17.0.2.tar.gz
    mv jdk-17.0.2 java
  2. 添加环境变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #进入 profile 文件,按 i 进入编辑模式
    vim /etc/profile
    #在文件最下方添加 G A
    export JAVA_HOME=/usr/local/java
    export PATH=$PATH:$JAVA_HOME/bin;
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    #:wq 保存并退出 vim
    #重新加载当前 bash 的环境变量
    source /etc/profile
    java -version

    微信截图_20220228133240.png

搞定, JDK 环境有了

密钥管理器 bitwarden 私有托管服务器搭建

bitwarden

Why I use it?

日益增多的账号给我带来了烦恼,我总是用固定的几个密码组合,虽然不至于让我丢失账号密码,但是密码安全性也摆在那里,如果有一个密码被泄露了,那么其它使用相同密码的平台的我的账号也会遭殃,而且作为半个偏运维人员,我总是有着很多很多密码,所以为了我的密码强度以及安全性,我决定用开源的bitwarden,我先说一下我对几个平台的看法,

1password 要收费(学生党的话还是尽量把钱花在刀刃上),其他都好

lastpass 曾经出过安全事故,但感觉也不错

Keepass 网络功能需要配合网盘

bitwarden 开源,可自建后台,速度快体积小免费插件多

比较吸引我的还是bitwarden,开源,又可以自部署平台,完全可以信任了,用的人也多,生态也不错。

bitwarden后台官方部署教程

前期准备

  1. 一台 Linux 虚拟机 我用的 CentOS7

  2. 装上 Docker 和 Docker-Compose

    1
    curl -sSL https://get.docker.com/ | bash -x
    1
    pip install docker-compose
  3. 找个地方放 bitwarden.sh

  4. 申请installation id/key

  5. 配置好域名解析,申请 SSL 证书(如果需要的话)

  6. (optional) 创建 Bitwarden 的 User 和目录(可以省略, 我直接省略了)

开始安装

  1. 下载安装脚本

    1
    curl -Lso bitwarden.sh https://go.btwrdn.co/bw-sh && chmod 700 bitwarden.sh
  2. 安装

    1
    ./bitwarden.sh install

    引导做得很完善,记得每一步都要输入正确, 不然就得把 /bitwarden 目录删掉重来了

  3. (optional) 如果使用自己已有的 SSL 证书,要把证书,私钥,中间证书都放到 ./bitwarden/ssl/your.domain

  4. 第一次启动

    1
    ./bitwarden.sh start

​ 会开始拉取 docker 镜像,网不好就需要一会儿

​ 装好了之后,在各个 APP 和浏览器中配置好 Server URL 就可以开始使用了,稳的一批

在 PVE 中导入 Mikrotik RouterOS 并保留授权

a6i6g-6j9kh.png

  1. 准备工作

    首先把 ROS 镜像放到 PVE 宿主机上面去。什么格式都行啦,.vmdk .img .ovf 都可以直接导

  2. 导入
    1
    find / -name <yourTarget>

    cd 到放镜像的文件夹

    然后开导

    ovf 格式:(ovf 格式的话不需要事先添加虚拟机)

    1
    qm importovf <要创建的虚拟机 ID > RouterOS.ovf <存储 (local、local-lvm)> --format qcow2

    vmdk 格式:(要事先创建一个虚拟机,要注意用 IDE 磁盘管理

    1
    qm importdisk <已有的虚拟机 ID > RouterOS.vmdk <存储 (local、local-lvm)>

    实例:

    1
    qm importdisk 233 ./RouterOS.vmdk local-lvm

    233 是虚拟机的 id

  3. 保留授权码

    进入宿主机 ssh、VNC or telnet 你钟意就行

    1
    vi /etc/pve/qemu-server/233.conf

    然后在 ide: local:233/vm-233-disk-0.qcow2 后添加以下内容,vi 的话使用命令 A

    1
    ,model=VMware%20Virtual%20IDE%20Hard%20Drive,serial=00000000000000000001

    微信截图_20220222201405.png

注意事项:磁盘管理一定要用 IDE,否则会保留授权码失败或丢虚拟磁盘

微信图片_20220222201333.png

都搞定了就直接开机就能用了,起飞~

Manjaro 当作主力机的使用体验

acisj-8wm4w.png

经过7个月的使用,manjaro 系统终于被我玩坏了,因为我的强制掉电操作,它的 KDE 桌面挂掉了,但是还是可以进入 tty2 等 terminal,所幸数据都还在,我直接全部 ftp 到我的群晖里面,然后重装成 Windows11 了。那么我要总结一下讲 manjaro 作为我的笔记本系统的使用感受。

最最最大的好处就是它是 Linux 内核系统,我可以随心所欲地用 Linux 的终端做很多事情,也方便了我的 Linux 操作系统课程的学习。

我挺自豪的,拜托,笔记本装 manjaro 系统来作为日常使用超酷的好嘛

Manjaro 的优点

  1. 它是 Arch Linux(这是最重要的,直接是生产环境)
  2. 超级方便的包管理工具 yay
  3. KDE 可以非常地个性化,定制自己喜欢的主题
  4. 组件化更加地突出了,它是高效率的生产工具
  5. 相比其他 Arch Linux 的发行版,它的驱动最完整(但没有我的指纹输入的驱动,虽然可以自己写,但是我是懒鬼)
  6. 因为是 Linux,可以直接当路由来用,非常完整的网络内核,可以做到很多事情,起隧道,非常全的协议连接,也可以保存我所有的本地网络
  7. 玩不了什么游戏,虽然可以 CrossOver 装上很多 windows 上的东西,但是毕竟在装在虚拟机里面跑,性能就摆在那里,打个炉石动画都比 Mac mini 慢很多(当然啦,暴雪直接就有 Mac 版)。Value 家的东西全都有 Linux 发行版,比如 CSGO。

Manjaro 的缺点

  1. 没有所有方便日常生活的工具,比如没有 Office,微软家的东西基本都没有,wechat要通过 wine 或者 crossover 去安装运行,经常因为运行库的问题而运行不了,QQ 的体验更加差劲,这里就要表扬 tg,直接做了 arch 版本,可以在 snapstore 里面直接安装。非常方便
  2. KDE 经常崩溃或者某些组件挂掉,对 AMD 显卡驱动兼容不友好,某些动画经常鬼畜
  3. 经常要去找答案,经常要折腾,日常升级就要去 Github 看 issue,等半天别人解决得了自己也不一定能解决得了,肯定是有解决方法的,但是要整多久就不一定了,我觉得这是它作为主力机来说最大的缺点,就是它不稳定,如果你不更新的话又不能体验到新的东西,而且有时候更新是为了 fix bug,反而更新之后直接挂了,这很不合理

没有什么缺点了,它除了要折腾,什么都好,如果说有一天,大家都用 Linux 作为日常主力机,所有软件产商都发行 Linux 的软件包版本,那么我肯定会把 Linux当作主力机,但是现在看来,这不是很可能,现在体验感生态最好的应该还是 Apple 家,我年底也应该就冲个 M2 or M1 MAX 了。因为我换回 Windows 之后,我马上理解到了,日常使用起来舒服顺手,马上进入工作状态,才是一个该被装在笔记本里面的系统,而 Linux 现在的状态,就应该就是拿来当作服务器里的生产工具,它非常好用非常高效率,也非常稳定。希望 Arch Linux 可以发展到那个高度吧。我先滚回 Windows 的舒适圈了。

crontab 的基本使用

crontab 的基本使用

用 crontab 肯定要写好 crontab 啦

Linux 格式的 crontab

1
2
3
4
5
6
7
8
*    *    *    *    *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

后面加上要做的事情,指令,比如说 每隔一分钟输出当前时间到 txt 文件中

1
*/1 * * * * date >> /home/sunnyrian/crontab.txt

我们把它写在一个 X.sh 中,然后添加到当前用户的 crontab 定时任务中,那么就会从下一分钟每间隔一分钟执行一次了

1
crontab X.sh

查看当前用户的定时任务

1
crontab -l

remove 去除当前用户的定时任务

1
crontab -r

测试一个 crontab 文件有没有写法错误

1
crontab -T <X.sh>

2022-02-07_19-13.png

这样就可以快速设置好定时任务啦