VPLC (VPLCnext) K8S
前序
在接触Virtual PLCnext Control的时候,我想过好几次如何将它运行在k8s上,由于对k8s的熟悉程度不够,跌跌撞撞尝试了很久,终于把vPLC部署在单机版的k8s上了。(此教程仅为demo阶段,此教程仅为demo阶段,此教程仅为demo阶段,仅供参考与交流)
- 环境:Ubuntu24.04 Preempt-RT
- 机器:i5-12459H
- 测试1:OPC-UA ✅
- 测试2:Profinet Master/device✅
- 测试3:PLCnext App✅
系统
这次用的操作系统是Ubuntu24.04,为了确保实时性,还需要打实时补丁。再安装好Ubuntu24.04之后,运行下列命令
sudo apt updatesudo apt-get install linux-realtimesudo nano /etc/default/grub# 注释hidden
# 设置timeout为10GRUB_DEFAULT=0
# GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`( . /etc/os-release; echo ${NAME:-Ubuntu} ) 2>/dev/null || echo Ubuntu`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""sudo update-grubsudo nano /boot/grub# 将linux-realtime改成默认启动,找到对应的启动项,将该启动项替换到export linux_gfx_mode后面if [ "${recordfail}" != 1 ]; thenif [ -e ${prefix}/gfxblacklist.txt ]; thenif [ ${grub_platform} != pc ]; thenset linux_gfx_mode=keepelif hwmatch ${prefix}/gfxblacklist.txt 3; thenif [ ${match} = 0 ]; thenset linux_gfx_mode=keepelseset linux_gfx_mode=textfielseset linux_gfx_mode=textfielseset linux_gfx_mode=keepfi
elseset linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Ubuntu, with Linux 6.8.1-1015-realtime' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.8.1-1015-realtime-advanced-d712360d-c47b-4226-a398-5ee5569a179c' {recordfailload_videogfxmode $linux_gfx_modeinsmod gzioif [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fiinsmod part_gptinsmod ext2set root='hd0,gpt2'if [ x$feature_platform_search_hint = xy ]; thensearch --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 d712360d-c47b-4226-a398-5ee5569a179celsesearch --no-floppy --fs-uuid --set=root d712360d-c47b-4226-a398-5ee5569a179cfiecho 'Loading Linux 6.8.1-1015-realtime ...'linux /boot/vmlinuz-6.8.1-1015-realtime root=UUID=d712360d-c47b-4226-a398-5ee5569a179c ro quiet splash $vt_handoffecho 'Loading initial ramdisk ...'initrd /boot/initrd.img-6.8.1-1015-realtime}
安装好后重启系统,确保是实时内核
root@plcnext-VMware-Virtual-Platform:/boot/grub# uname -a
Linux plcnext-VMware-Virtual-Platform 6.8.1-1015-realtime #16-Ubuntu SMP PREEMPT_RT Wed Jan 15 21:03:54 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
安装kubectl & kubeadm & kubelet
sudo apt-get update
sudo apt-get install containerd
sudo mkdir /etc/containerd sudo nano /etc/containerd/config.toml version = 2root = "/var/lib/containerd"state = "/run/containerd"disabled_plugins = []required_plugins = ["io.containerd.grpc.v1.cri"]oom_score = -999# Alibaba Cloud Vendor enhancement configuration# imports = ["/etc/containerd/alibabacloud.toml"][grpc]address = "/run/containerd/containerd.sock"max_recv_message_size = 16777216max_send_message_size = 16777216[debug]address = "/run/containerd/debug.sock"level = "info"[timeouts]"io.containerd.timeout.shim.cleanup" = "5s""io.containerd.timeout.shim.load" = "5s""io.containerd.timeout.shim.shutdown" = "3s""io.containerd.timeout.task.state" = "2s"[plugins][plugins."io.containerd.gc.v1.scheduler"]pause_threshold = 0.02deletion_threshold = 0mutation_threshold = 100schedule_delay = "0s"startup_delay = "100ms"[plugins."io.containerd.grpc.v1.cri"]sandbox_image = "registry-cn-shanghai.ack.aliyuncs.com/acs/pause:3.9"ignore_image_defined_volumes = true[plugins."io.containerd.grpc.v1.cri".containerd] snapshotter = "overlayfs"default_runtime_name = "runc"disable_snapshot_annotations = truediscard_unpacked_layers = false[plugins."io.containerd.grpc.v1.cri".containerd.runtimes][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]runtime_type = "io.containerd.runc.v2"privileged_without_host_devices = false[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]NoPivotRoot = falseNoNewKeyring = falseSystemdCgroup = true[plugins."io.containerd.grpc.v1.cri".cni]bin_dir = "/opt/cni/bin"conf_dir = "/etc/cni/net.d"max_conf_num = 1[plugins."io.containerd.grpc.v1.cri".registry]config_path = "/etc/containerd/cert.d"[plugins."io.containerd.internal.v1.opt"]path = "/opt/containerd"[plugins."io.containerd.internal.v1.restart"]interval = "10s"[plugins."io.containerd.metadata.v1.bolt"]content_sharing_policy = "shared"
sudo apt install curlcurl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpgecho 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.listsudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl sudo swapoff -a # off swap
sudo sed -i '/swap/d' /etc/fstab # off swap need reboot systemreboot
重启后,再执行
sudo su
bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOFsudo modprobe br-netfilter
kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
安装Flannel
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml# if download failed like ImagePullError, delete it and it will auto build again
# 如果下载失败了,删除pod后,会自动重新下载
kubectl get pods -n kube-flannel
kubectl delete pod kube-flannel-ds-<xxxx> -n kube-flannel
安装Multus
kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/master/deployments/multus-daemonset-thick.yml
确保都在运行
root@plcnext-virtual-machine:/home/plcnext/vplc_k8s# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-mz5xf 1/1 Running 5 (42d ago) 42d
kube-system kube-multus-ds-rk2w6 1/1 Running 0 19hkubectl get pods -n kube-system | grep multuskube-multus-ds-rk2w6 1/1 Running 0 19h
为vPLC创建Macvlan NIC
nano macvlan-net.yaml
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:name: macvlan-eth1annotations:k8s.v1.cni.cncf.io/resourceName: macvlan.network.k8s.io/eth1
spec:config: '{"cniVersion": "0.3.1","name": "macvlan-eth1","type": "macvlan","master": "ens33","mode": "bridge","ipam": {"type": "static","addresses": [{"address": "192.168.10.152/24","gateway": "192.168.10.1"}],"routes": [{"dst": "0.0.0.0/0","gw": "192.168.10.1"}],"dns": {"nameservers": ["8.8.8.8", "8.8.4.4"]}}}'
应用macvlan NIC
kubectl apply -f macvlan-net.yaml
检查是否正常工作
root@:kubectl get network-attachment-definitions.k8s.cni.cncf.io -ANAMESPACE NAME AGE
default macvlan-eth1 19hroot@: kubectl describe network-attachment-definitions.k8s.cni.cncf.io macvlan-eth1 -n defaultName: macvlan-eth1
Namespace: default
Labels: <none>
Annotations: k8s.v1.cni.cncf.io/resourceName: macvlan.network.k8s.io/eth1
API Version: k8s.cni.cncf.io/v1
Kind: NetworkAttachmentDefinition
Metadata:Creation Timestamp: 2025-05-13T05:19:50ZGeneration: 1Resource Version: 43216UID: e1babe8b-d9f0-4646-8013-9d57896444f3
Spec:Config: { "cniVersion": "0.3.1", "name": "macvlan-eth1", "type": "macvlan", "master": "ens33", "mode": "bridge", "ipam": { "type": "static", "addresses": [ { "address": "192.168.10.152/24", "gateway": "192.168.10.1" } ], "routes": [ { "dst": "0.0.0.0/0", "gw": "192.168.10.1" } ], "dns": { "nameservers": ["8.8.8.8", "8.8.4.4"] } } }
Events: <none>
创建VPLC pod yaml
nano pod.yaml
apiVersion: v1
kind: Pod
metadata:annotations:io.podman.annotations.ulimit: rtprio=-1:-1,nofile=1024:10024k8s.v1.cni.cncf.io/networks: |-[{"name": "macvlan-eth1","interface": "eth1" }]name: my-pod
spec:tolerations:- key: "node-role.kubernetes.io/control-plane"operator: "Exists"effect: "NoSchedule"containers:- env:- name: HOSTNAMEvalue: VL3-PLCNEXT-x86-64image: registry.k8s.io/vplcnextcontrol1000-x86-64:78name: vplcnextcontrol1000command: ["/usr/lib/systemd/systemd"]imagePullPolicy: NeversecurityContext:privileged: truevolumeMounts:- mountPath: /dev/fusename: fuse-device- mountPath: /opt/plcnext/config/name: env1-config-pvc- mountPath: /opt/plcnext/appsname: env1-apps-pvc- mountPath: /opt/plcnext/data/name: env1-data-pvc- mountPath: /opt/plcnext/projects/name: env1-projects-pvc- mountPath: /opt/plcnext/logsname: env1-logs-pvchostname: vl3-plcnext-x86volumes:- name: fuse-devicehostPath:path: /dev/fusetype: CharDevice- name: env1-config-pvcpersistentVolumeClaim:claimName: env1-config-pvc- name: env1-apps-pvcpersistentVolumeClaim:claimName: env1-apps-pvc- name: env1-data-pvcpersistentVolumeClaim:claimName: env1-data-pvc- name: env1-projects-pvcpersistentVolumeClaim:claimName: env1-projects-pvc- name: env1-logs-pvcpersistentVolumeClaim:claimName: env1-logs-pvc
更新vplc镜像到本地k8s.io
#load imagectr -n k8s.io images import vplcnextcontrol1000-x86-64-2025.0.0-25.0.0.78.tar# change tagctr -n k8s.io images tag \import-2025-05-14:vplcnextcontrol1000-x86-64 \registry.k8s.io/vplcnextcontrol1000-x86-64:78# delete old tagctr -n k8s.io images rm import-2025-05-14:vplcnextcontrol1000-x86-64
检查镜像
oot@plcnext-VMware-Virtual-Platform:/etc/cni/net.d# ctr -n=k8s.io images list
REF TYPE DIGEST SIZE PLATFORMS LABELS
ghcr.io/flannel-io/flannel-cni-plugin:v1.6.2-flannel1 application/vnd.oci.image.index.v1+json sha256:f1812994f0edbcb5bb5ccb63be2147ba6ad10e1faaa7ca9fcdad4f441739d84f 4.6 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x io.cri-containerd.image=managed
ghcr.io/flannel-io/flannel-cni-plugin@sha256:f1812994f0edbcb5bb5ccb63be2147ba6ad10e1faaa7ca9fcdad4f441739d84f application/vnd.oci.image.index.v1+json sha256:f1812994f0edbcb5bb5ccb63be2147ba6ad10e1faaa7ca9fcdad4f441739d84f 4.6 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x io.cri-containerd.image=managed
ghcr.io/flannel-io/flannel:v0.26.7 application/vnd.oci.image.index.v1+json sha256:7f471907fa940f944867270de4ed78121b8b4c5d564e17f940dc787cb16dea82 31.5 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x io.cri-containerd.image=managed
ghcr.io/flannel-io/flannel@sha256:7f471907fa940f944867270de4ed78121b8b4c5d564e17f940dc787cb16dea82 application/vnd.oci.image.index.v1+json sha256:7f471907fa940f944867270de4ed78121b8b4c5d564e17f940dc787cb16dea82 31.5 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x io.cri-containerd.image=managed
ghcr.io/k8snetworkplumbingwg/multus-cni:snapshot-thick application/vnd.docker.distribution.manifest.list.v2+json sha256:97792a778f41c6fcc31fc08615f2c0f5fd89ae4d9f402e78528c76ec5c2c5fd1 170.9 MiB linux/amd64,linux/arm/v7,linux/arm/v8,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
ghcr.io/k8snetworkplumbingwg/multus-cni@sha256:97792a778f41c6fcc31fc08615f2c0f5fd89ae4d9f402e78528c76ec5c2c5fd1 application/vnd.docker.distribution.manifest.list.v2+json sha256:97792a778f41c6fcc31fc08615f2c0f5fd89ae4d9f402e78528c76ec5c2c5fd1 170.9 MiB linux/amd64,linux/arm/v7,linux/arm/v8,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
registry-cn-shanghai.ack.aliyuncs.com/acs/pause:3.9 application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 314.0 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64 io.cri-containerd.image=managed,io.cri-containerd.pinned=pinned
registry-cn-shanghai.ack.aliyuncs.com/acs/pause@sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 314.0 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64 io.cri-containerd.image=managed,io.cri-containerd.pinned=pinned
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.10.1 application/vnd.docker.distribution.manifest.list.v2+json sha256:90d3eeb2e2108a14fe2ecbef1bc1b5607834335d99c842a377f338aade9da028 15.4 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/mips64le,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns@sha256:90d3eeb2e2108a14fe2ecbef1bc1b5607834335d99c842a377f338aade9da028 application/vnd.docker.distribution.manifest.list.v2+json sha256:90d3eeb2e2108a14fe2ecbef1bc1b5607834335d99c842a377f338aade9da028 15.4 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/mips64le,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.15-0 application/vnd.docker.distribution.manifest.list.v2+json sha256:d0e1bc44b9bc37d0b63612e1a11b43e07bc650ffc0545d58f7991607460974d4 54.3 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64 io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd@sha256:d0e1bc44b9bc37d0b63612e1a11b43e07bc650ffc0545d58f7991607460974d4 application/vnd.docker.distribution.manifest.list.v2+json sha256:d0e1bc44b9bc37d0b63612e1a11b43e07bc650ffc0545d58f7991607460974d4 54.3 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64 io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.28.15 application/vnd.docker.distribution.manifest.list.v2+json sha256:ad05900683464980ef45b957b8da61dc33eaefe4df2318abc7bfe9b13a46cbb8 32.8 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver@sha256:ad05900683464980ef45b957b8da61dc33eaefe4df2318abc7bfe9b13a46cbb8 application/vnd.docker.distribution.manifest.list.v2+json sha256:ad05900683464980ef45b957b8da61dc33eaefe4df2318abc7bfe9b13a46cbb8 32.8 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.28.15 application/vnd.docker.distribution.manifest.list.v2+json sha256:2d54389718888db44390e85df3201f356d213be2df06365e782ba2ab0154ee42 31.8 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager@sha256:2d54389718888db44390e85df3201f356d213be2df06365e782ba2ab0154ee42 application/vnd.docker.distribution.manifest.list.v2+json sha256:2d54389718888db44390e85df3201f356d213be2df06365e782ba2ab0154ee42 31.8 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.28.15 application/vnd.docker.distribution.manifest.list.v2+json sha256:6dd470206000214b25123febf230af297375469037dc18619fd75a5528cff215 27.0 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy@sha256:6dd470206000214b25123febf230af297375469037dc18619fd75a5528cff215 application/vnd.docker.distribution.manifest.list.v2+json sha256:6dd470206000214b25123febf230af297375469037dc18619fd75a5528cff215 27.0 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.28.15 application/vnd.docker.distribution.manifest.list.v2+json sha256:50bf0089b068e77c7b57d0c225840aa90b020d16bc9d76d8463fb34597e9509b 17.7 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler@sha256:50bf0089b068e77c7b57d0c225840aa90b020d16bc9d76d8463fb34597e9509b application/vnd.docker.distribution.manifest.list.v2+json sha256:50bf0089b068e77c7b57d0c225840aa90b020d16bc9d76d8463fb34597e9509b 17.7 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 314.0 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64 io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/pause@sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 314.0 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64 io.cri-containerd.image=managed
registry.k8s.io/vplcnextcontrol1000-x86-64:78 application/vnd.oci.image.manifest.v1+json sha256:f3f4c9ee6a734e4498b2216739c542cfe8b5981215421aab8007cbf840da7e59 224.7 MiB linux/amd64 io.cri-containerd.image=managed
sha256:10541d8af03f40fae257735edd69b6c5dd0084bb9796649409ac7b5660705148 application/vnd.docker.distribution.manifest.list.v2+json sha256:2d54389718888db44390e85df3201f356d213be2df06365e782ba2ab0154ee42 31.8 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
sha256:29bd7bbb1c041945b8111bf2ecb5d4e656d56bdc3db7d5119b52fa5797780552 application/vnd.oci.image.manifest.v1+json sha256:f3f4c9ee6a734e4498b2216739c542cfe8b5981215421aab8007cbf840da7e59 224.7 MiB linux/amd64 io.cri-containerd.image=managed
sha256:2e96e5913fc06e3d26915af3d0f2ca5048cc4b6327e661e80da792cbf8d8d9d4 application/vnd.docker.distribution.manifest.list.v2+json sha256:d0e1bc44b9bc37d0b63612e1a11b43e07bc650ffc0545d58f7991607460974d4 54.3 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64 io.cri-containerd.image=managed
sha256:55ce2385d9d8c6f720091c177fbe885a21c9dc07c9e480bfb4d94b3001f58182 application/vnd.oci.image.index.v1+json sha256:f1812994f0edbcb5bb5ccb63be2147ba6ad10e1faaa7ca9fcdad4f441739d84f 4.6 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x io.cri-containerd.image=managed
sha256:965b9dd4aa4c1b6b68a4c54a166692b4645b6e6f8a5937d8dc17736cb63f515e application/vnd.oci.image.index.v1+json sha256:7f471907fa940f944867270de4ed78121b8b4c5d564e17f940dc787cb16dea82 31.5 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x io.cri-containerd.image=managed
sha256:9d3465f8477c6b383762d90ec387c9d77da8a402a849265805f86feaa57aeeea application/vnd.docker.distribution.manifest.list.v2+json sha256:50bf0089b068e77c7b57d0c225840aa90b020d16bc9d76d8463fb34597e9509b 17.7 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
sha256:9dc6939e7c573673801790fcfad6f994282c216e005578f5836b5fafc6685fc2 application/vnd.docker.distribution.manifest.list.v2+json sha256:ad05900683464980ef45b957b8da61dc33eaefe4df2318abc7bfe9b13a46cbb8 32.8 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
sha256:ba6d7f8bc25be40b51dfeb5ddfda697527ba55073620c1c5fa04a5f0ae9e3816 application/vnd.docker.distribution.manifest.list.v2+json sha256:6dd470206000214b25123febf230af297375469037dc18619fd75a5528cff215 27.0 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
sha256:cd453b9857733f7230c435f941ae5b4ec835627732f18f9278f05375122c9bf5 application/vnd.docker.distribution.manifest.list.v2+json sha256:97792a778f41c6fcc31fc08615f2c0f5fd89ae4d9f402e78528c76ec5c2c5fd1 170.9 MiB linux/amd64,linux/arm/v7,linux/arm/v8,linux/arm64,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
sha256:e6f1816883972d4be47bd48879a08919b96afcd344132622e4d444987919323c application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 314.0 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64 io.cri-containerd.image=managed,io.cri-containerd.pinned=pinned
sha256:ead0a4a53df89fd173874b46093b6e62d8c72967bbf606d672c9e8c9b601a4fc application/vnd.docker.distribution.manifest.list.v2+json sha256:90d3eeb2e2108a14fe2ecbef1bc1b5607834335d99c842a377f338aade9da028 15.4 MiB linux/amd64,linux/arm/v7,linux/arm64,linux/mips64le,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
sha256:fcacad112e0df0b551f562f2ba6c6c94cd2a47c761c5a36eb525091fae2b721d application/vnd.docker.distribution.manifest.v2+json sha256:e17cd0e26a6fad98b670af17b41cbac8b17e997a2759e3cadb6816feef680b69 165.3 MiB linux/amd64 io.cri-containerd.image=managed
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/k8snetworkplumbingwg/multus-cni:snapshot-thick application/vnd.docker.distribution.manifest.v2+json sha256:e17cd0e26a6fad98b670af17b41cbac8b17e997a2759e3cadb6816feef680b69 165.3 MiB linux/amd64 io.cri-containerd.image=managed
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/k8snetworkplumbingwg/multus-cni@sha256:e17cd0e26a6fad98b670af17b41cbac8b17e997a2759e3cadb6816feef680b69 application/vnd.docker.distribution.manifest.v2+json sha256:e17cd0e26a6fad98b670af17b41cbac8b17e997a2759e3cadb6816feef680b69 165.3 MiB linux/amd64 io.cri-containerd.image=managed
创建持久卷
nano env1-vplc-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: env1-apps-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain hostPath:path: /mnt/data/env1-apps
---
apiVersion: v1
kind: PersistentVolume
metadata:name: env1-config-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain hostPath:path: /mnt/data/env1-config
---
apiVersion: v1
kind: PersistentVolume
metadata:name: env1-data-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain hostPath:path: /mnt/data/env1-data
---
apiVersion: v1
kind: PersistentVolume
metadata:name: env1-projects-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain hostPath:path: /mnt/data/env1-projects
---
apiVersion: v1
kind: PersistentVolume
metadata:name: env1-logs-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain hostPath:path: /mnt/data/env1-logs
nano env1-vplc-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: env1-apps-pvc
spec:volumeName: env1-apps-pvaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: env1-config-pvc
spec:volumeName: env1-config-pvaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: env1-data-pvc
spec:volumeName: env1-data-pvaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: env1-projects-pvc
spec:volumeName: env1-projects-pvaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: env1-logs-pvc
spec:volumeName: env1-logs-pvaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
# apply pv first, then apply pvckubectl apply -f env1-vplc-pv.yaml
kubectl apply -f env1-vplc-pvc.yamlmkdir /mnt/data
检查PV和PVC
root@plcnext-VMware-Virtual-Platform:/home/plcnext/vplc# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
env1-apps-pv 1Gi RWO Retain Bound default/env1-apps-pvc 67m
env1-config-pv 1Gi RWO Retain Bound default/env1-config-pvc 66m
env1-data-pv 1Gi RWO Retain Bound default/env1-data-pvc 66m
env1-logs-pv 1Gi RWO Retain Bound default/env1-logs-pvc 66m
env1-projects-pv 1Gi RWO Retain Bound default/env1-projects-pvc 66m
root@plcnext-VMware-Virtual-Platform:/home/plcnext/vplc# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
env1-apps-pvc Bound env1-apps-pv 1Gi RWO 67m
env1-config-pvc Bound env1-config-pv 1Gi RWO 66m
env1-data-pvc Bound env1-data-pv 1Gi RWO 66m
env1-logs-pvc Bound env1-logs-pv 1Gi RWO 66m
env1-projects-pvc Bound env1-projects-pv 1Gi RWO 66m
创建K8S容器
kubectl apply -f pod.yaml
kubectl exec -it my-pod -c vplcnextcontrol1000 -- bash
修改Network
默认有一个错误的ip地址和路由 192.168.1.10
& 192.168.1.1
.
这是由于VPLC的固件中 /usr/lib/systemd/network/80-wired.network
导致的
删除所有的192.168.1.* ,并修改79-if-1.network和79-if-2.network填写gateway和ipaddress
ip route del default via 192.168.1.1 dev eth0
ip route del default via 192.168.1.1 dev eth1
ip addr del 192.168.1.10/24 dev eth0
ip addr del 192.168.1.10/24 dev eth1
ip route del default via 192.168.10.1 dev eth1
ip route add default via 192.168.10.1 dev eth1 proto static metric 100systemctl restart arp-preinit.servicenano /etc/systemd/network/79-if-1.network
nano /etc/systemd/network/79-if-2.networksystemctl restart plcnext
拷贝文件
kubectl cp ./pack.zip default/my-pod:/opt/plcnextkubectl exec -it my-pod -c vplcnextcontrol1000 -- bashunzip pack.zipcd packcp -r apps config data projects ../chmod 777 -R /opt/plcnext/apps /opt/plcnext/config /opt/plcnext/data /opt/plcnext/projects
重启系统
systemctl restart plcnext
修正防火墙
systemctl restart firewall-preinit
systemctl restart firewall
systemctl restart plcnext
# now the firewall should work
修正Profinet Device设备
固件里默认NIC0是作为pn的NIC,但是现在NIC1才是macvlan设备,所以要设置为NIC1
nano /etc/plcnext/Device.redefine.acf.settings<EnvironmentVariable name="ARP_SETTING_PN_CONTROLLER_ADAPTER_INDEX" value="1" redefine="true" />
<EnvironmentVariable name="ARP_SETTING_PN_DEVICE_ADAPTER_INDEX" value="1" redefine="true" />change to =><EnvironmentVariable name="ARP_SETTING_PN_CONTROLLER_ADAPTER_INDEX" value="2" redefine="true" />
<EnvironmentVariable name="ARP_SETTING_PN_DEVICE_ADAPTER_INDEX" value="2" redefine="true" />nano /etc/plcnext/device/Io/PnS/PnS.target.config <Var name="InterfaceName">eth0</Var>change to =><Var name="InterfaceName">eth1</Var>systemctl restart plcnext# check wbm profinet
相关文章:
VPLC (VPLCnext) K8S
前序 在接触Virtual PLCnext Control的时候,我想过好几次如何将它运行在k8s上,由于对k8s的熟悉程度不够,跌跌撞撞尝试了很久,终于把vPLC部署在单机版的k8s上了。(此教程仅为demo阶段,此教程仅为demo阶段&a…...
鸿蒙App开发学习路径
以下是一份系统的鸿蒙(HarmonyOS)App开发学习路径,适合从零开始逐步掌握相关技能: 1. 基础知识储备 1.1 理解鸿蒙系统 鸿蒙核心特性:分布式能力、一次开发多端部署、原子化服务、ArkUI框架。与Android/iOS的区别&…...
【Java多态】:灵活编程的核心
🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:【Java】内容概括 【前言】 在Java面向对象编程的世界中,多(Polymorphism) 是一个核…...
k8s容器入门(1)有状态服务 vs 无状态服务 核心区别
本质区别 维度有状态服务 (Stateful)无状态服务 (Stateless)数据存储服务内部维护持久化数据不保存客户端会话数据请求关联性后续请求依赖之前请求的状态每个请求独立处理典型示例数据库/消息队列/文件存储Web API/计算服务/负载均衡 技术实现对比 #mermaid-svg-hoKO2gnZ8Gvms…...
BERT框架:自然语言处理的革命性突破
引言 在自然语言处理(NLP)领域,2018年Google推出的BERT(Bidirectional Encoder Representations from Transformers)框架无疑是一场革命。作为基于Transformer架构的双向编码器表示模型,BERT通过预训练学习…...
基于FPGA控制电容阵列与最小反射算法的差分探头优化设计
在现代高速数字系统测试中,差分探头的信号完整性直接影响测量精度。传统探头存在阻抗失配导致的信号反射问题,本文提出一种通过FPGA动态控制电容阵列,结合最小反射算法的优化方案,可实时调整探头等效容抗,将信号反射损…...
珠宝课程小程序源码介绍
这款珠宝课程小程序源码,基于ThinkPHPFastAdminUniApp开发,功能丰富且实用。ThinkPHP提供稳定高效的后台服务,保障数据安全与处理速度;FastAdmin助力快速搭建管理后台,提升开发效率;UniApp则让小程序能多端…...
DAY33
简单的神经网络 PyTorch和cuda的安装 查看显卡信息的命令行命令(cmd中使用) cuda的检查 简单神经网络的流程 1.数据预处理(归一化、转换成张量) 2.模型的定义 1.继承nn.Module类 2.定…...
AI相关的笔记
推荐视频: https://www.bilibili.com/video/BV1aeLqzUE6L/?share_sourcecopy_web&vd_source3d0a14a267c9cbda8f2a6184dd8c564d AI Agent AI Agent(人工智能代理) AI Agent 是一种具备自主决策和执行能力的智能程序,能够像…...
Python训练营---Day33
知识点回顾: PyTorch和cuda的安装查看显卡信息的命令行命令(cmd中使用)cuda的检查简单神经网络的流程 数据预处理(归一化、转换成张量)模型的定义 继承nn.Module类定义每一个层定义前向传播流程 定义损失函数和优化器定…...
window 显示驱动开发-指定 GDI 硬件加速渲染操作
调用 DxgkDdiRenderKm 函数时,操作系统指定要通过 pRenderKmArgs 参数执行的 GDI 硬件加速呈现操作的类型。 DirectX 图形内核子系统的显示端口驱动程序 (Dxgkrnl.sys) 将 pRenderKmArgs-pCommand> 成员设置为指向包含可变大小DXGK_RENDERKM_COMMAND结构数组的命…...
什么是VR展馆?VR展馆的实用价值有哪些?
VR展馆,重塑展览体验。在数字化时代浪潮的推动下,传统的实体展馆经历前所未有的变革。作为变革的先锋,VR展馆以无限的潜力,成为展览行业的新宠。 VR展馆,即虚拟现实展馆,是基于VR(Virtual Real…...
uniapp实现H5、APP、微信小程序播放.m3u8监控视频
目录 1.APP播放.m3u8监控视频 2.H5播放.m3u8监控视频 3.微信小程序播放.m3u8监控视频 最近在写一个uniapp实现h5、app、微信小程序兼容三端的播放监控视频功能,我原本以为一套代码多处运行,但事实并非如此,h5可以运行,微信小程…...
CAD如何导出PDF?PDF如何转CAD?详细教程来了
浩辰CAD看图王是一款功能强大的CAD图纸查看与编辑工具,其核心功能之一便是支持CAD与PDF格式的互转。下面是CAD看图王输出PDF和PDF转CAD功能的详细介绍及操作步骤: 一、输出PDF功能 看图王可以将CAD图纸转换为PDF格式,是文件在不同的设备上显…...
微信小程序学习基础:从入门到精通
文章目录 第一章:微信小程序概述1.1 什么是微信小程序1.2 小程序与原生APP、H5的区别1.3 小程序的发展历程与现状 第二章:开发环境搭建2.1 注册小程序账号2.2 安装开发者工具2.3 开发者工具界面介绍2.4 第一个小程序项目 第三章:小程序框架与…...
[免费]微信小程序宠物医院管理系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序宠物医院管理系统(uni-appSpringBoot后端Vue管理端),分享下哈。 项目视频演示 【免费】微信小程序宠物医院管理系统(uni-appSpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibi…...
乘最多水的容器 | 算法 | 给定一个整数数组。有n条垂线。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
在我们日常生活中,蓄水似乎是一个极为朴素的物理行为:两堵墙之间,注入水,看谁能装得更多。可如果换个角度,从算法的视角去看这个问题,它会变得怎样?你是否意识到,这样一个简单的问题…...
英伟达有意入股 PsiQuantum,释放战略转向量子计算的重要信号
内容来源:量子前哨(ID:Qforepost) 文丨浪味仙 排版丨浪味仙 行业动向:1800字丨5分钟阅读 “十五年太早,三十年又太晚,但如果说二十年,我想很多人都会相信。” emmmm,…...
【Ubuntu修改串口延时(Latency Timer)为1毫秒(设备拔插或系统重启后自动生效)】
Ubuntu修改串口延时Latency Timer为1毫秒-设备拔插或系统重启后自动生效 在Ubuntu系统中,串口设备的延时参数(latency_timer)可以通过udev规则永久修改。以下是完整步骤: 创建udev规则文件 sudo vim /etc/udev/rules.d/99-ftdi-low-latency.rules添加以…...
《量子计算实战》PDF下载
内容简介 在加密、科学建模、制造物流、金融建模和人工智能等领域,量子计算可以极大提升解决问题的效率。量子系统正变得越来越强大,逐渐可用于生产环境。本书介绍了量子计算的思路与应用,在简要说明与量子相关的科学原理之后,指…...
Win 系统 conda 如何配置镜像源
通过命令添加镜像源(推荐) 以 清华源 为例,依次执行以下命令: # 添加主镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main # 添加免费开源镜像源 conda config --add channels http…...
[密码学实战]使用C语言实现TCP服务端(二十九)
[密码学实战]使用C语言实现TCP服务端(二十九) 引言 TCP(传输控制协议)是互联网通信中最核心的协议之一,它提供可靠的、面向连接的数据传输服务。通过C语言的标准Socket API,开发者可以灵活地实现TCP客户端和服务端程序。本文将详细讲解TCP通信的原理,并提供完整的代码…...
打卡Day34
问题: 背景: 剩余时长 总时长 - 必须的计算时长(3秒)。记录间隔、记录次数和剩余时长的关系需要进一步分析。 数据观察: 当总epoch为20000时,不同记录间隔对应的记录次数和剩余时长如下: 记…...
谷歌开源医疗领域AI语言模型速递:medgemma-27b-text-it
一、模型概述 MedGemma 是由谷歌开发的一个医疗领域 AI 模型系列,基于 Gemma 3 架构,旨在加速医疗保健相关 AI 应用的开发。该模型系列包含两个主要变体:4B 多模态版本(支持文本和图像理解)以及 27B 纯文本版本&#…...
C++ JSON解析技术详解
一、JSON基础与解析流程 1.1 JSON数据结构 JSON包含两种核心结构(): 对象:{}包裹的键值对集合数组:[]包裹的值序列 1.2 解析流程 flowchart TDA[加载JSON数据] --> B{数据来源}B -->|字符串…...
多维应用场景的落地实践的智慧园区开源了
智慧园区场景视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界…...
第三次中医知识问答模型微调
本次参数 llamafactory-cli train \ --stage sft \ --do_train True \ --model_name_or_path /home/qhyz/zxy/LLaMA-Factory/model \ --preprocessing_num_workers 16 \ --finetuning_type lora \ --template deepseek3 \ --flash_attn fa2 \ --dataset_dir data \ --dataset …...
基于SpringBoot的美食分享平台设计与开发(Vue MySQL)
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
开闭原则 (Open/Closed Principle, OCP)
定义:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展 问题由来:任何软件都需要面临一个很重要的问题,即它们的需求会随时间的推移而发生变化。因为变化,升级和维护等原因&…...
在 “Linux 9“ 系统快速安装配置RabbitMQ
这是在 “Linux 9” 系统(如 RHEL 9、AlmaLinux 9、Rocky Linux 9)上安装和配置 RabbitMQ 的中文指南。 前提条件: 你拥有 sudo 权限。你的系统已连接到互联网。firewalld 是你当前活动的防火墙(在基于 RHEL 的系统上很常见&…...
【brpc】安装与使用
brpc安装与使用 1. brpc是什么2. 安装3. 类与接口介绍3.1 日志输出类与接口3.2 protobuf 类与接口3.3 服务端类与接口3.4 客户端类与接口 4. 使用4.1 同步调用4.2 异步调用 1. brpc是什么 brpc 是用 c语言编写的工业级 RPC 框架,常用于搜索、存储、机器学习、广告、…...
C++:关联容器set容器,multiset容器
set与map不一样之处在于set的键值和时值是一样的,且个元素的值不能重复,容器会根据键的大小默认按升序排序,set底层也是红黑树。 multiset则允许键重复。 例如: #include<iostream> #include<set> using namespace…...
Java 调用 GitLab API
前言: 上一篇我们使用了 webhook 的方式获取用户提交代码的信息,本篇我简单分享一下使用 GitLab API 来获取用户提交代码的信息。 业务分析: 我们需要统计每一个用户的提交代码的信息,那 GitLab 是否有这样的接口呢?…...
“智”斗秸秆焚烧,考拉悠然以科技之力筑牢生态安全防线
清晨,薄雾笼罩着辽阔的田野,农民们开始了一天的劳作。然而,随着收割季的到来,秸秆焚烧问题也逐渐浮现,成为威胁空气质量与生态安全的隐患。传统监管方式往往显得力不从心,效率低下的困境亟待突破。在此背景…...
数据库基础面试题(回答思路和面试建议)
以下是针对这些数据库基础问题的详细回答思路和面试回答建议,结合理论、应用场景和实际项目经验展开说明: 1. 数据库三大范式是什么?实际项目中是否需要严格遵循? 回答思路: 先解释三大范式(逐层递进&…...
数据库blog5_数据库软件架构介绍(以Mysql为例)
🌿软件的架构 🍂分类 软件架构总结为两种主要类型:一体式架构和分布式架构 ● 一体化架构 一体式架构是一种将所有功能集成到一个单一的、不可分割的应用程序中的架构模式。这种架构通常是一个大型的、复杂的单一应用程序,包含所…...
mysql可重复读隔离级别下的快照读和当前读
在MySQL的可重复读隔离级别下,快照读和当前读是两种不同的读取方式,它们的特点和应用场景有所不同。 快照读 定义:快照读是指在事务中读取数据时,读取的是事务开始时的历史版本数据,而非当前最新的数据。实现原理&…...
MySQL 单表与多表操作详解
🎈边走、边悟🎈迟早会好 目录 一、单表查询整合 (一)通用模板展示 (二)举例说明 1. 简单查询 2. 条件查询 3. 高级查询 (三)注意事项 (四)Mapper 简…...
Spring概念问题详解
一、Bean的生命周期 1.1 BeanDefinition Spring容器在进行实例化时,会将xml配置的<bean>的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean。 beanClassName:be…...
使用pm2 部署react+nextjs项目到服务器
记录一下 next.config.js中: output: standalone,package.json配置: "scripts": {"dev": "cross-env NODE_OPTIONS--inspect next dev","build": "next build","start": "cp -r .nex…...
JVM常量池(class文件常量池,运行时常量池,字符串常量池)
文章目录 问题JVM运行时数据区JVM中的常量池Class文件常量池运行时常量池字符串常量池创建了几个对象String的定义intern()问题 超过1W字深度剖析JVM常量池(全网最详细最有深度) - 跟着Mic学架构 - 博客园 问题 jdk1.8之后 元空间是独立存在的…...
Java 大视界 -- 基于 Java 的大数据分布式存储在视频会议系统海量视频数据存储与回放中的应用(263)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
光谱相机在地质勘测中的应用
一、矿物识别与蚀变带分析 光谱特征捕捉 通过可见光至近红外(400-1000nm)的高光谱分辨率(可达3.5nm),精确识别矿物的“光谱指纹”。例如: 铜矿:在400-500nm波段反射率显著低于围…...
深入解析Java泛型:从定义到实战应用
目录 🚀前言🤔泛型的定义🐧泛型类🌟泛型接口✍️泛型方法、通配符、上下限💯泛型方法💯 通配符与上下限⚙️通配符(Wildcard)⚙️泛型上下限⚙️应用场景 🦜泛型支持的类…...
数据结构:绪论之时间复杂度与空间复杂度
作者主页 失踪人口回归,陆续回三中。 开辟文章新专栏——数据结构,恳请各位大佬批评指正! 文章目录 作者主页 数据结构的基本知识数据:数据元素:数据对象:数据类型:数据结构:逻辑结…...
ARM Linux远程调试
准备 虚拟机既能ping通开发板,又能ping通外网,还要能ping通Windows主机(如果你有上位机通信(tftp、vsftp、ssh)的需求) VMware 添加网络适配器2用作桥接网卡,原有的网络适配器保持为NAT模式 打开虚拟网络编辑器,配置VMnet0为桥接模式,外部连接设置为Realtek PCIe G…...
PostgreSQL 14 pacemaker 高可用集群
核心架构原理 集群组成(典型三节点结构): [Node1] PostgreSQL Pacemaker Corosync pcsd [Node2] PostgreSQL Pacemaker Corosync pcsd [Node3] PostgreSQL Pacemaker Corosync pcsd ↕ ↕ ↕ ← Corosync 多…...
英语学习5.21
Far from sensible 表示“很不明智的”、“离明智相去甚远”。这是一个固定表达,结构是 far from adj.,意思是“根本不……”,常见例子: far from perfect(远非完美) far from acceptable(远…...
实现了TCP的单向通信
1. 客户端代码:Client.java package com.xie.javase.net1;import java.io.*; import java.net.*;public class Client {public static void main(String[] args) {Socket socket = null;BufferedWriter bw = null;try {// 1. 获取本机IP地址对象InetAddress localHost = Inet…...
华为云Flexus+DeepSeek征文 | 基于ModelArts Studio和Cherry Studio快速构建午餐管家助手
目录 一、前言 二、ModelArts Studio(MaaS)介绍与应用场景 2.1ModelArts Studio(MaaS)介绍 2.2 ModelArts Studio(MaaS)使用场景 2.3 开通MaaS服务 2.4 开通DeepSeek-V3商用服务 三、Cherry Studio简介和安…...