Virtual PLCnext Control 单机 Kubernetes 部署

在 Ubuntu 24.04 单节点上用 kubeadm + containerd + Flannel + Multus + macvlan 运行 vPLCnext。

容器网卡CNI用途
eth0macvlan(宿主机 ens33现场网:WBM / OPC-UA / Profinet(固件默认 NIC0)
eth1Flannel集群网:Pod / Service / DNS;宿主机互通走 cni0

不要再改 Profinet 网卡序号(macvlan 已在 eth0)。
网络根因修复已包含在 04-import-image.sh 生成的 -nowired 镜像中。


本机实测参数

主机192.168.77.148/24,网关 192.168.77.2,网卡 ens33
K8sv1.28.15,containerd 2.2.x
Podvplc
现场 IP(macvlan)192.168.77.150/24
cni0(License / 宿主机互通)10.244.0.1/24
业务镜像registry.k8s.io/vplcnextcontrol1000-x86-64:26.0.5.103-nowired
数据hostPath /mnt/data/vplc-plcnext/opt/plcnext
kubectl get pod vplc -o wide
kubectl exec vplc -- ip -br a
kubectl exec vplc -- systemctl is-active plcnext nginx firewall

局域网访问 WBM:https://192.168.77.150/
(宿主机 ping 不通 macvlan IP 属正常;测宿主机↔容器请 ping 容器 eth1 / 走 cni0。)


目录

VirtualPLCK8s/
├── README.md
├── vplcnextcontrol1000-*.tar
├── manifests/
│   ├── vendor/kube-flannel.yml
│   ├── vendor/multus-daemonset-thick.yml
│   ├── macvlan-net.yaml
│   ├── flannel-nad.yaml
│   ├── pvc.yaml
│   └── pod.yaml          # image: …:26.0.5.103-nowired
├── scripts/
│   ├── 01-prepare-host.sh
│   ├── 02-install-k8s.sh
│   ├── 03-install-cni.sh
│   ├── 04-import-image.sh   # 导入 + 禁用 80-wired(不改 Lm.config)
│   ├── 05-deploy-vplc.sh
│   ├── recover-after-boot.sh
│   └── install-recover-service.sh
└── systemd/
    └── vplc-k8s-recover.service

vendor/kube-flannel.yml

apiVersion: v1
kind: Namespace
metadata:
  labels:
    k8s-app: flannel
    pod-security.kubernetes.io/enforce: privileged
  name: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: flannel
  name: flannel
  namespace: kube-flannel
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: flannel
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: flannel
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-flannel
---
apiVersion: v1
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "EnableNFTables": false,
      "Backend": {
        "Type": "vxlan"
      }
    }
kind: ConfigMap
metadata:
  labels:
    app: flannel
    k8s-app: flannel
    tier: node
  name: kube-flannel-cfg
  namespace: kube-flannel
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: flannel
    k8s-app: flannel
    tier: node
  name: kube-flannel-ds
  namespace: kube-flannel
spec:
  selector:
    matchLabels:
      app: flannel
      k8s-app: flannel
  template:
    metadata:
      labels:
        app: flannel
        k8s-app: flannel
        tier: node
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      containers:
      - args:
        - --ip-masq
        - --kube-subnet-mgr
        command:
        - /opt/bin/flanneld
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        image: ghcr.io/flannel-io/flannel:v0.26.7
        name: kube-flannel
        resources:
          requests:
            cpu: 100m
            memory: 50Mi
        securityContext:
          capabilities:
            add:
            - NET_ADMIN
            - NET_RAW
          privileged: false
        volumeMounts:
        - mountPath: /run/flannel
          name: run
        - mountPath: /etc/kube-flannel/
          name: flannel-cfg
        - mountPath: /run/xtables.lock
          name: xtables-lock
      hostNetwork: true
      initContainers:
      - args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        command:
        - cp
        image: ghcr.io/flannel-io/flannel-cni-plugin:v1.6.2-flannel1
        name: install-cni-plugin
        volumeMounts:
        - mountPath: /opt/cni/bin
          name: cni-plugin
      - args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        command:
        - cp
        image: ghcr.io/flannel-io/flannel:v0.26.7
        name: install-cni
        volumeMounts:
        - mountPath: /etc/cni/net.d
          name: cni
        - mountPath: /etc/kube-flannel/
          name: flannel-cfg
      priorityClassName: system-node-critical
      serviceAccountName: flannel
      tolerations:
      - effect: NoSchedule
        operator: Exists
      volumes:
      - hostPath:
          path: /run/flannel
        name: run
      - hostPath:
          path: /opt/cni/bin
        name: cni-plugin
      - hostPath:
          path: /etc/cni/net.d
        name: cni
      - configMap:
          name: kube-flannel-cfg
        name: flannel-cfg
      - hostPath:
          path: /run/xtables.lock
          type: FileOrCreate
        name: xtables-lock


vendor/multus-daemonset-thick.yml

# Note:
#   This deployment file is designed for 'quickstart' of multus, easy installation to test it,
#   hence this deployment yaml does not care about following things intentionally.
#     - various configuration options
#     - minor deployment scenario
#     - upgrade/update/uninstall scenario
#   Multus team understand users deployment scenarios are diverse, hence we do not cover
#   comprehensive deployment scenario. We expect that it is covered by each platform deployment.
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: network-attachment-definitions.k8s.cni.cncf.io
spec:
  group: k8s.cni.cncf.io
  scope: Namespaced
  names:
    plural: network-attachment-definitions
    singular: network-attachment-definition
    kind: NetworkAttachmentDefinition
    shortNames:
      - nad
      - net-attach-def
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          description: 'NetworkAttachmentDefinition is a CRD schema specified by the Network Plumbing
            Working Group to express the intent for attaching pods to one or more logical or physical
            networks. More information available at: https://github.com/k8snetworkplumbingwg/multi-net-spec'
          type: object
          properties:
            apiVersion:
              description: 'APIVersion defines the versioned schema of this represen
                tation of an object. Servers should convert recognized schemas to the
                latest internal value, and may reject unrecognized values. More info:
                https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
              type: string
            kind:
              description: 'Kind is a string value representing the REST resource this
                object represents. Servers may infer this from the endpoint the client
                submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
              type: string
            metadata:
              type: object
            spec:
              description: 'NetworkAttachmentDefinition spec defines the desired state of a network attachment'
              type: object
              properties:
                config:
                  description: 'NetworkAttachmentDefinition config is a JSON-formatted CNI configuration'
                  type: string
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: multus
rules:
  - apiGroups: ["k8s.cni.cncf.io"]
    resources:
      - '*'
    verbs:
      - '*'
  - apiGroups:
      - ""
    resources:
      - pods
      - pods/status
    verbs:
      - get
      - list
      - update
      - watch
  - apiGroups:
      - "resource.k8s.io"
    resources:
      - resourceclaims
      - resourceclaims/status
      - resourceslices
    verbs:
      - get
      - list
  - apiGroups:
      - ""
      - events.k8s.io
    resources:
      - events
    verbs:
      - create
      - patch
      - update
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: multus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: multus
subjects:
  - kind: ServiceAccount
    name: multus
    namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: multus
  namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: multus-daemon-config
  namespace: kube-system
  labels:
    tier: node
    app: multus
data:
  daemon-config.json: |
    {
        "chrootDir": "/hostroot",
        "cniVersion": "0.3.1",
        "logLevel": "verbose",
        "logToStderr": true,
        "cniConfigDir": "/host/etc/cni/net.d",
        "multusAutoconfigDir": "/host/etc/cni/net.d",
        "multusConfigFile": "auto",
        "socketDir": "/host/run/multus/"
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-multus-ds
  namespace: kube-system
  labels:
    tier: node
    app: multus
    name: multus
spec:
  selector:
    matchLabels:
      name: multus
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        tier: node
        app: multus
        name: multus
    spec:
      hostNetwork: true
      hostPID: true
      tolerations:
        - operator: Exists
          effect: NoSchedule
        - operator: Exists
          effect: NoExecute
      serviceAccountName: multus
      containers:
        - name: kube-multus
          image: ghcr.io/k8snetworkplumbingwg/multus-cni:snapshot-thick
          command: [ "/usr/src/multus-cni/bin/multus-daemon" ]
          resources:
            requests:
              cpu: "100m"
              memory: "50Mi"
            limits:
              cpu: "100m"
              memory: "50Mi"
          securityContext:
            privileged: true
          terminationMessagePolicy: FallbackToLogsOnError
          volumeMounts:
            - name: cni
              mountPath: /host/etc/cni/net.d
            # multus-daemon expects that cnibin path must be identical between pod and container host.
            # e.g. if the cni bin is in '/opt/cni/bin' on the container host side, then it should be mount to '/opt/cni/bin' in multus-daemon,
            # not to any other directory, like '/opt/bin' or '/usr/bin'.
            - name: cnibin
              mountPath: /opt/cni/bin
            - name: host-run
              mountPath: /host/run
            - name: host-var-lib-cni-multus
              mountPath: /var/lib/cni/multus
            - name: host-var-lib-kubelet
              mountPath: /var/lib/kubelet
              mountPropagation: HostToContainer
            - name: host-run-k8s-cni-cncf-io
              mountPath: /run/k8s.cni.cncf.io
            - name: host-run-netns
              mountPath: /run/netns
              mountPropagation: HostToContainer
            - name: multus-daemon-config
              mountPath: /etc/cni/net.d/multus.d
              readOnly: true
            - name: hostroot
              mountPath: /hostroot
              mountPropagation: HostToContainer
            - mountPath: /etc/cni/multus/net.d
              name: multus-conf-dir
          env:
            - name: MULTUS_NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
      initContainers:
        - name: install-multus-binary
          image: ghcr.io/k8snetworkplumbingwg/multus-cni:snapshot-thick
          command:
            - "/usr/src/multus-cni/bin/install_multus"
            - "-d"
            - "/host/opt/cni/bin"
            - "-t"
            - "thick"
          resources:
            requests:
              cpu: "10m"
              memory: "15Mi"
          securityContext:
            privileged: true
          terminationMessagePolicy: FallbackToLogsOnError
          volumeMounts:
            - name: cnibin
              mountPath: /host/opt/cni/bin
              mountPropagation: Bidirectional
      terminationGracePeriodSeconds: 30
      volumes:
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: cnibin
          hostPath:
            path: /opt/cni/bin
        - name: hostroot
          hostPath:
            path: /
        - name: multus-daemon-config
          configMap:
            name: multus-daemon-config
            items:
            - key: daemon-config.json
              path: daemon-config.json
        - name: host-run
          hostPath:
            path: /run
        - name: host-var-lib-cni-multus
          hostPath:
            path: /var/lib/cni/multus
        - name: host-var-lib-kubelet
          hostPath:
            path: /var/lib/kubelet
        - name: host-run-k8s-cni-cncf-io
          hostPath:
            path: /run/k8s.cni.cncf.io
        - name: host-run-netns
          hostPath:
            path: /run/netns/
        - name: multus-conf-dir
          hostPath:
            path: /etc/cni/multus/net.d


flannel-nad.yaml

apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: flannel-eth1
  namespace: default
spec:
  config: |-
    {
      "cniVersion": "0.3.1",
      "name": "flannel-eth1",
      "type": "flannel",
      "subnetFile": "/run/flannel/subnet.env",
      "dataDir": "/var/lib/cni/flannel",
      "delegate": {
        "type": "bridge",
        "bridge": "cni0",
        "isDefaultGateway": false,
        "forceAddress": false,
        "hairpinMode": true
      }
    }


macvlan-net.yaml

apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: macvlan-eth0
  namespace: default
spec:
  config: |-
    {
      "cniVersion": "0.3.1",
      "name": "macvlan-eth0",
      "type": "macvlan",
      "master": "ens33",
      "mode": "bridge",
      "ipam": {
        "type": "static",
        "addresses": [
          {
            "address": "192.168.77.150/24",
            "gateway": "192.168.77.2"
          }
        ],
        "routes": [
          {
            "dst": "0.0.0.0/0",
            "gw": "192.168.77.2"
          }
        ],
        "dns": {
          "nameservers": ["192.168.77.2", "8.8.8.8"]
        }
      }
    }


pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: vplc
  namespace: default
  annotations:
    io.podman.annotations.ulimit: rtprio=-1:-1,nofile=1024:10024
    v1.multus-cni.io/default-network: default/macvlan-eth0
    k8s.v1.cni.cncf.io/networks: |-
      [{
        "name": "flannel-eth1",
        "namespace": "default",
        "interface": "eth1"
      }]
spec:
  tolerations:
    - key: node-role.kubernetes.io/control-plane
      operator: Exists
      effect: NoSchedule
  hostname: vl3-plcnext-x86
  containers:
    - name: vplcnextcontrol1000
      image: registry.k8s.io/vplcnextcontrol1000-x86-64:26.0.5.103-nowired
      imagePullPolicy: Never
      command: ["/usr/lib/systemd/systemd"]
      env:
        - name: HOSTNAME
          value: VL3-PLCNEXT-x86-64
      securityContext:
        privileged: true
      volumeMounts:
        - name: fuse-device
          mountPath: /dev/fuse
        - name: plcnext-data
          mountPath: /opt/plcnext
  volumes:
    - name: fuse-device
      hostPath:
        path: /dev/fuse
        type: CharDevice
    - name: plcnext-data
      persistentVolumeClaim:
        claimName: vplc-plcnext-pvc

pvc.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: vplc-plcnext-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: ""
  hostPath:
    path: /mnt/data/vplc-plcnext
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: vplc-plcnext-pvc
  namespace: default
spec:
  storageClassName: ""
  volumeName: vplc-plcnext-pv
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi


scripts/01-prepare-hosst.sh

#!/usr/bin/env bash
set -euo pipefail
# Host prep for single-node kubeadm (run with sudo)

swapoff -a
sed -i.bak '/swap/d' /etc/fstab || true

modprobe overlay
modprobe br_netfilter
modprobe macvlan

cat >/etc/modules-load.d/k8s.conf <<EOM
overlay
br_netfilter
macvlan
EOM

cat >/etc/sysctl.d/k8s.conf <<EOM
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOM
sysctl --system

echo "Host prepare done."


scripts/02-install-k8s.sh

#!/usr/bin/env bash
set -euo pipefail
# Install containerd + kubeadm/kubelet/kubectl v1.28 and init single-node cluster

export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get install -y containerd curl apt-transport-https ca-certificates gpg

mkdir -p /etc/containerd
containerd config default >/etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# Prefer Aliyun pause if present in generated config (containerd v2 uses sandbox =)
sed -i "s|sandbox = 'registry.k8s.io/pause:.*'|sandbox = 'registry-cn-shanghai.ack.aliyuncs.com/acs/pause:3.9'|" /etc/containerd/config.toml || true
systemctl enable --now containerd

mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' >/etc/apt/sources.list.d/kubernetes.list
apt-get update -y
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

kubeadm init \
  --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
  --pod-network-cidr=10.244.0.0/16 \
  --cri-socket=unix:///run/containerd/containerd.sock

mkdir -p /home/plcnext/.kube
cp -i /etc/kubernetes/admin.conf /home/plcnext/.kube/config
chown plcnext:plcnext /home/plcnext/.kube/config

# Allow scheduling on control-plane
KUBECONFIG=/etc/kubernetes/admin.conf kubectl taint nodes --all node-role.kubernetes.io/control-plane- || true

echo "kubeadm init done. Use: export KUBECONFIG=\$HOME/.kube/config"


scripts/03-install-cni.sh

#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
export KUBECONFIG="${KUBECONFIG:-$HOME/.kube/config}"

kubectl apply -f "$ROOT/manifests/vendor/kube-flannel.yml"
kubectl -n kube-flannel rollout status ds/kube-flannel-ds --timeout=180s

kubectl apply -f "$ROOT/manifests/vendor/multus-daemonset-thick.yml"
kubectl -n kube-system rollout status ds/kube-multus-ds --timeout=180s

kubectl apply -f "$ROOT/manifests/macvlan-net.yaml"
kubectl apply -f "$ROOT/manifests/flannel-nad.yaml"
kubectl get network-attachment-definitions.k8s.cni.cncf.io -A


scripts/04-import-image.sh

#!/usr/bin/env bash
# Import vPLCnext OCI tar into containerd (k8s.io), then bake a -nowired image:
#   only disable 80-wired.network (do NOT touch Lm.config — edit that in the running pod).
#
# Why buildah (not editing "UpperDir" on disk)?
#   containerd stores images as content-addressed read-only layers under
#   /var/lib/containerd/.../snapshots. There is no per-image writable UpperDir.
#   UpperDir exists only for a *running/created container*. Editing layer blobs
#   in place breaks digests and shared layers. Proper way: open a working
#   container filesystem → change files → commit a NEW image tag → import back.
#   buildah does that; plain "ctr import" does not leave an editable tree.
#
# Output: registry.k8s.io/vplcnextcontrol1000-x86-64:<ver>-nowired
set -euo pipefail

ROOT="$(cd "$(dirname "$0")/.." && pwd)"
TAR="${1:-$ROOT/vplcnextcontrol1000-x86-64-2026.0.5_LTS-26.0.5.103.tar}"
BASE_TAG="${BASE_TAG:-registry.k8s.io/vplcnextcontrol1000-x86-64:26.0.5.103}"
PATCHED_TAG="${PATCHED_TAG:-${BASE_TAG}-nowired}"

if [[ ! -f "$TAR" ]]; then
  echo "ERROR: tar not found: $TAR" >&2
  exit 1
fi
command -v ctr >/dev/null || { echo "ERROR: ctr not found" >&2; exit 1; }
command -v buildah >/dev/null || {
  echo "ERROR: buildah not found. Install: sudo apt-get install -y buildah" >&2
  exit 1
}

echo "==> Importing $TAR into containerd (k8s.io)"
ctr -n k8s.io images import "$TAR"

echo "==> Resolving imported image ref"
IMPORTED=$(ctr -n k8s.io images ls -q | grep -E 'import-.*:vplcnextcontrol1000' | head -1 || true)
if [[ -n "${IMPORTED}" ]]; then
  ctr -n k8s.io images tag "$IMPORTED" "$BASE_TAG"
  ctr -n k8s.io images tag "$IMPORTED" "docker.io/library/${IMPORTED}" 2>/dev/null || \
    ctr -n k8s.io images tag "$IMPORTED" "docker.io/library/$(basename "$IMPORTED")" 2>/dev/null || true
else
  SRC=$(ctr -n k8s.io images ls -q | grep -i vplcnextcontrol | grep -v nowired | head -1)
  [[ -n "$SRC" ]] || { echo "ERROR: no vplcnext image after import" >&2; exit 1; }
  ctr -n k8s.io images tag "$SRC" "$BASE_TAG"
fi
echo "    Base tag: $BASE_TAG"

TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT

echo "==> Export base image for buildah"
ctr -n k8s.io images export "$TMPDIR/base.tar" "$BASE_TAG"

echo "==> buildah: disable 80-wired.network only"
buildah rm -a >/dev/null 2>&1 || true
buildah pull "docker-archive:$TMPDIR/base.tar" >/dev/null
BA_IMG=$(buildah images --format '{{.Name}}:{{.Tag}}' | grep -F 'vplcnextcontrol1000' | grep -v nowired | head -1 || true)
if [[ -z "$BA_IMG" || "$BA_IMG" == "<none>:<none>" ]]; then
  BA_IMG=$(buildah images --format '{{.ID}}' | head -1)
fi
CTR=$(buildah from "$BA_IMG")

buildah run "$CTR" -- bash -c '
set -e
cat > /usr/lib/systemd/network/80-wired.network << "WIRED"
# Neutralized for Kubernetes/Multus.
# Original assigned 192.168.1.10 to all ether ifaces and raced with CNI.
[Match]
Name=disabled-no-match-k8s-vplc
WIRED
mkdir -p /etc/systemd/network
ln -sfn /dev/null /etc/systemd/network/80-wired.network
ls -la /usr/lib/systemd/network/80-wired.network /etc/systemd/network/80-wired.network
cat /usr/lib/systemd/network/80-wired.network
'

echo "==> Commit patched image as $PATCHED_TAG"
buildah commit "$CTR" "$PATCHED_TAG"
buildah rm "$CTR" >/dev/null

echo "==> Import patched image into containerd"
buildah push "$PATCHED_TAG" "docker-archive:$TMPDIR/patched.tar"
ctr -n k8s.io images import "$TMPDIR/patched.tar"

if ! ctr -n k8s.io images ls -q | grep -qxF "$PATCHED_TAG"; then
  NW=$(ctr -n k8s.io images ls -q | grep nowired | head -1 || true)
  [[ -n "$NW" ]] && ctr -n k8s.io images tag "$NW" "$PATCHED_TAG"
fi

echo
echo "==> Done"
ctr -n k8s.io images ls | grep -iE 'vplcnext|nowired' || true
echo
echo "Use in pod.yaml: $PATCHED_TAG"
echo "Lm.config is NOT patched here — edit inside the running pod after deploy (see README)."


scripts/05-deploy-vplc.sh

#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
export KUBECONFIG="${KUBECONFIG:-$HOME/.kube/config}"
HOST_DIR=/mnt/data/vplc-plcnext
IMAGE="${IMAGE:-registry.k8s.io/vplcnextcontrol1000-x86-64:26.0.5.103-nowired}"

mkdir -p "$HOST_DIR"
if [[ ! -d "$HOST_DIR/apps" || ! -d "$HOST_DIR/projects" ]]; then
  echo "Seeding $HOST_DIR from image $IMAGE ..."
  rm -rf "${HOST_DIR:?}/"*
  ctr -n k8s.io run --rm \
    --mount type=bind,src="$HOST_DIR",dst=/mnt/out,options=rbind:rw \
    "$IMAGE" seed-opt \
    /bin/bash -c 'cp -a /opt/plcnext/. /mnt/out/'
fi

kubectl apply -f "$ROOT/manifests/pvc.yaml"
kubectl apply -f "$ROOT/manifests/pod.yaml"
kubectl wait --for=condition=Ready pod/vplc --timeout=180s
kubectl get pod vplc -o wide
echo "Check NICs (should NOT be 192.168.1.10):"
kubectl exec vplc -- ip -br a
kubectl exec vplc -- systemctl is-active plcnext nginx firewall || true
kubectl exec vplc -- grep serverHostname /opt/plcnext/config/System/Lm/Lm.config || true


install-recover-service.sh


#!/usr/bin/env bash
# Install systemd unit from this repo so Multus/vplc recover after reboot.
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
UNIT_SRC="$ROOT/systemd/vplc-k8s-recover.service"
UNIT_DST=/etc/systemd/system/vplc-k8s-recover.service

if [[ "$(id -u)" -ne 0 ]]; then
  echo "Run as root: sudo $0" >&2
  exit 1
fi

if [[ ! -f "$UNIT_SRC" ]]; then
  echo "Missing unit template: $UNIT_SRC" >&2
  exit 1
fi

chmod +x "$ROOT/scripts/recover-after-boot.sh"
install -m 644 "$UNIT_SRC" "$UNIT_DST"
systemctl daemon-reload
systemctl enable vplc-k8s-recover.service
echo "Installed $UNIT_DST and enabled vplc-k8s-recover.service"
systemctl status vplc-k8s-recover.service --no-pager || true


recover-after-boot.sh

#!/usr/bin/env bash
# Safety net for bare Pod vplc after reboot (not a substitute for Multus itself).
# Upstream thick Multus uses install_multus to avoid "Text file busy" (#1221 / PR #1445).
# This script only recreates vplc when macvlan/dual-NIC is missing (Broadcom-style race).
set -euo pipefail
export KUBECONFIG="${KUBECONFIG:-/home/plcnext/.kube/config}"
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
LOG=/var/log/vplc-k8s-recover.log

log() { echo "[$(date -Iseconds)] $*" | tee -a "$LOG" 2>/dev/null || echo "[$(date -Iseconds)] $*"; }

# Wait for API
for i in $(seq 1 60); do
  kubectl get --raw=/readyz >/dev/null 2>&1 && break
  sleep 5
done
kubectl wait --for=condition=Ready node --all --timeout=180s || true

# If Multus not Ready, free busy shim and restart DS pod
if ! kubectl get pods -n kube-system -l app=multus --no-headers 2>/dev/null | grep -qE '1/1[[:space:]]+Running'; then
  log "Multus not ready; refreshing multus-shim"
  mv -f /opt/cni/bin/multus-shim "/opt/cni/bin/multus-shim.bak.$(date +%s)" 2>/dev/null || true
  kubectl delete pod -n kube-system -l app=multus --force --grace-period=0 2>/dev/null || true
  kubectl -n kube-system rollout status ds/kube-multus-ds --timeout=180s || true
fi

# Wait Multus Running
for i in $(seq 1 36); do
  kubectl get pods -n kube-system -l app=multus --no-headers 2>/dev/null | grep -qE '1/1[[:space:]]+Running' && break
  sleep 5
done

# Recreate CoreDNS if stuck
kubectl get pods -n kube-system -l k8s-app=kube-dns --no-headers 2>/dev/null | grep -qv Running && \
  kubectl delete pod -n kube-system -l k8s-app=kube-dns --force --grace-period=0 2>/dev/null || true

# Always recreate vplc after boot so Multus annotations are applied when Multus is up
# (sandbox recreate during Multus-down leaves only Flannel on eth0)
if kubectl get pod vplc >/dev/null 2>&1; then
  # Check whether macvlan is present: expect 2 interfaces eth0+eth1 or annotation IPs
  ETH_COUNT=$(kubectl exec vplc -- ip -br a 2>/dev/null | grep -cE '^eth' || echo 0)
  HAS_MACVLAN=$(kubectl exec vplc -- ip -br a 2>/dev/null | grep -c '192.168.77.150' || echo 0)
  if [[ "$ETH_COUNT" -lt 2 || "$HAS_MACVLAN" -lt 1 ]]; then
    log "vplc network incomplete (eth=$ETH_COUNT macvlan=$HAS_MACVLAN); recreating"
    kubectl delete pod vplc --grace-period=30 --timeout=60s 2>/dev/null || \
      kubectl delete pod vplc --force --grace-period=0 2>/dev/null || true
    sleep 3
    kubectl apply -f "$ROOT/manifests/pod.yaml"
  else
    log "vplc network looks OK"
  fi
else
  log "vplc missing; applying manifest"
  kubectl apply -f "$ROOT/manifests/pod.yaml"
fi

kubectl wait --for=condition=Ready pod/vplc --timeout=180s || true
kubectl exec vplc -- ip -br a 2>/dev/null | tee -a "$LOG" || true
log "recover-after-boot done"


systemd/vplc-k8s-recover.service

[Unit]
Description=Recover Multus/vplc networking after boot
After=network-online.target kubelet.service
Wants=network-online.target
# Give kubelet time to start Multus DS; script itself waits for Ready

[Service]
Type=oneshot
User=root
Environment=KUBECONFIG=/home/plcnext/.kube/config
ExecStart=/home/plcnext/VirtualPLCK8s/scripts/recover-after-boot.sh
RemainAfterExit=yes
TimeoutStartSec=600

[Install]
WantedBy=multi-user.target


一键流程(新机器)

需 root/sudo。用户 plcnext 已配 ~/.kube/config

cd /home/plcnext/VirtualPLCK8s

sudo ./scripts/01-prepare-host.sh
sudo ./scripts/02-install-k8s.sh
# 之后用普通用户 plcnext(或 export KUBECONFIG=/etc/kubernetes/admin.conf)
sudo ./scripts/03-install-cni.sh

# 导入 tar,并自动打补丁生成 -nowired 镜像(需 buildah)
sudo apt-get install -y buildah   # 若尚未安装
sudo ./scripts/04-import-image.sh ./vplcnextcontrol1000-x86-64-2026.0.5_LTS-26.0.5.103.tar

sudo ./scripts/05-deploy-vplc.sh

# 开机后自动校验/修复 Multus 双网卡竞态
sudo ./scripts/install-recover-service.sh

# 部署后手动改 License 地址(见下文「手动修改 Lm.config」)

改现场 IP:编辑 manifests/macvlan-net.yaml 后重建 Pod。
改 License 指向的 cni0CNI0_IP=x.x.x.x sudo ./scripts/04-import-image.sh … 后重新 seed/部署。


步骤说明

1–3. 主机 / kubeadm / CNI

  • 关 swap,ip_forward,加载 overlay / br_netfilter / macvlan
  • containerd:SystemdCgroup=true;kubeadm --pod-network-cidr=10.244.0.0/16
  • 单节点去掉 control-plane taint
  • 安装 Flannel → Multus → 两个 NAD(见 manifests/
  • VMware:网卡混杂模式,否则 macvlan 不通

4. 导入镜像并禁用 80-wired04-import-image.sh

脚本会:

  1. ctr -n k8s.io images import <tar>
  2. 打基础标签 …:26.0.5.103
  3. buildah 派生新镜像,只改网络单元:
    • 重写 /usr/lib/systemd/network/80-wired.network(去掉写死的 192.168.1.10
    • ln -sfn /dev/null /etc/systemd/network/80-wired.network
  4. 不修改 Lm.config(需你进容器手动改,见下节)
  5. 导入结果标签:…:26.0.5.103-nowiredpod.yaml 已引用)
sudo apt-get install -y buildah   # 若尚未安装
sudo ./scripts/04-import-image.sh ./vplcnextcontrol1000-x86-64-2026.0.5_LTS-26.0.5.103.tar
为什么要用 buildah,不能直接改宿主机上的「镜像目录 / UpperDir」?

这是 containerd 和 podman 存储模型的差别:

podman(常见理解)containerd(kubeadm 默认)
镜像层也有 overlay,但是只读 content/var/lib/containerd/.../snapshots 里同样是按 digest 寻址的只读层
UpperDir只属于某个已创建的容器,不是「镜像本体」同样:只有创建容器后才有可写 upper;镜像本身没有可写 UpperDir
直接改磁盘上的层文件会破坏层 hash、与其它引用共享层冲突一样危险,且 ctr/kubelet 仍按旧 digest 校验

所以:

  • 导入镜像之后,宿主机上不会出现一份「打开就能改、改完所有新容器都生效」的镜像源码树。

  • ctr import 只是把层登记进 content store,没有「解压到某个目录随便改」的官方工作流。

  • buildah 做的事等价于:临时打开可写根文件系统 → 改 80-wiredcommit 成新镜像标签 → 再 ctr import 给 kubelet 用。这是正确、可重复的做法。

5. 部署 Pod(05-deploy-vplc.sh

  • /mnt/data/vplc-plcnext 为空:从 -nowired 镜像 seed 到 hostPath(整目录挂 /opt/plcnext 会遮住镜像内容,必须 seed)
  • apply PV/PVC + pod.yaml
  • 验证网卡不应再出现 192.168.1.10

6. 手动修改 Lm.config(必做一次)

License 指向宿主机 cni0(本机一般为 10.244.0.1),不要填容器 eth1 的 Pod IP。
该文件在 PVC 的 /opt/plcnext 下,改一次会持久化。

# 确认 cni0
ip -br addr show cni0

kubectl exec -it vplc -c vplcnextcontrol1000 -- bash
# 容器内:
# nano /opt/plcnext/config/System/Lm/Lm.config
# 将 serverHostname 改为例如 10.244.0.1
systemctl restart plcnext

或主机侧:

kubectl exec vplc -- sed -i \
  's/serverHostname" value="[^"]*"/serverHostname" value="10.244.0.1"/' \
  /opt/plcnext/config/System/Lm/Lm.config
kubectl exec vplc -- systemctl restart plcnext
kubectl exec vplc -- grep serverHostname /opt/plcnext/config/System/Lm/Lm.config

为什么必须改镜像里的 80-wired

机制

  1. 原镜像 /usr/lib/systemd/network/80-wired.network 给几乎所有以太口写死 192.168.1.10
  2. 固件 /usr/sbin/plcnext-functionscreate_network_configuration 读取当时网卡 IP,生成 /etc/systemd/network/79-if-1/2.network
  3. 禁用 80-wired:CNI 地址保留 → 自动生成的 79-if 就是正确的。无需再手改 79-if

为何 podman 好像「没这问题」?

对照机 192.168.10.149 上的 podman 容器同样有双网卡,镜像里 同样有 未改的 80-wired。差别是:

  • podman 同一容器停启,可写层里已有正确的 79-if,networkd 一上来就用 79-if,轮不到 80-wired
  • K8s 每次重建 Pod = 新容器/etc/systemd/network 清空,只剩镜像里的 80-wired → 先污染成 192.168.1.10 → 再被写进坏的 79-if

因此 K8s 上要在镜像源文件里禁用 80-wired,这才是根因修复。


网络设计摘要

必要插件:

  1. Flannel(或其它集群 CNI)— Multus 不能单独用
  2. Multus — 多网卡
  3. macvlan — 现场二层

Pod 注解(eth0 = macvlan):

v1.multus-cni.io/default-network: default/macvlan-eth0
k8s.v1.cni.cncf.io/networks: |
  [{"name": "flannel-eth1", "namespace": "default", "interface": "eth1"}]

default-network 必须带命名空间前缀 default/

License:容器访问宿主机 CodeMeter/LM 时,在 Pod 内手动改 Lm.configserverHostnamecni0(如 10.244.0.1),不要填容器 eth1 的 Pod IP。详见上文「手动修改 Lm.config」。


机器重启

组件开机行为
containerd / kubeletenabled 后自动起来
控制面 / Flannel / Multus / Pod vplc随 kubelet 拉起
/opt/plcnext(含你改过的 Lm.config)PVC/hostPath 保留
-nowired 镜像重启后网卡应仍正确,无需额外修网脚本
# 开机后等 1~2 分钟再查
kubectl get nodes
kubectl get pods -A
kubectl wait --for=condition=Ready pod/vplc --timeout=180s
kubectl exec vplc -- ip -br a

为什么拉 Pod 不会等 Multus?

Kubernetes 没有「Pod 依赖 Multus DaemonSet Ready」这种调度边;节点网络就绪靠 CNI 配置,不是 Pod 间依赖。这不是本仓库独有,Multus 社区也踩过同一坑。

官方预期模型: Multus 未就绪时,kubelet 的 CNI ADD 失败并重试,Pod 停在 ContainerCreating;Multus 起来后再建沙箱,注解里的多网卡一次挂全。

曾经的 thick 官方 bug(已修): 重启后 init 用裸 cp 覆盖忙着的 multus-shimText file busy → Multus CrashLoop → 全节点 CNI 死锁。见 issue #1221PR #1445

另一类竞态:00-multus.conf 尚未写好,kubelet 可能先走默认单网 CNI → Pod Running 但缺 secondary(厂商文档亦要求删 Pod 重建沙箱)。Deployment/StatefulSet 会自动重建;本仓库的 vplc裸 Pod,不会自愈。

Pod_vplc MultusDS Kubelet HostBoot Pod_vplc MultusDS Kubelet HostBoot install_multus then daemon may run with only default NIC alt [Multus not ready] [conf missing race] start createSandbox CNI fail retry ContainerCreating

根因修复(分层)

  1. 主修复:上游 install_multus(治 Text file busy
    manifests/vendor/multus-daemonset-thick.yml 已对齐上游 master:init 使用 install_multus -d /host/opt/cni/bin -t thick(不再手写 cp),terminationGracePeriodSeconds: 3003-install-cni.sh 会带上。

  2. 安全网:开机 recover(仅裸 Pod + 缺网卡)
    不代替官方 Multus 修复;只处理「Running 但只有 Flannel、缺 macvlan」这类需重建沙箱的情况。

仍卡死时的手工恢复

kubectl delete pod -n kube-system -l app=multus
kubectl -n kube-system rollout status ds/kube-multus-ds --timeout=120s
kubectl delete pod -n kube-system -l k8s-app=kube-dns
kubectl delete pod vplc
kubectl apply -f ~/VirtualPLCK8s/manifests/pod.yaml
# 或(需已 install-recover-service.sh):
sudo systemctl start vplc-k8s-recover.service

若又出现 192.168.1.10,确认 Pod 用的是 -nowired 镜像;否则重跑 04 并核对 pod.yamlimage 字段。


排障

现象处理
双网卡变成 192.168.1.10确认 Pod 镜像是 -nowired;否则重跑 04 并重建 Pod
NAD not found in kube-systemdefault-network 写成 default/macvlan-eth0
PVC PendingPV/PVC 设 storageClassName: ""
CreateContainerError / import tag04 会保留 import 标签;必要时重跑 04
/opt/plcnext 几乎为空删空 hostPath 后重跑 05 触发 seed
外网访问不了 .150VMware 混杂模式、master: ens33、IP 冲突
宿主机 ping 不通 .150正常;测 eth1 或换机器访问
kubectl → localhost:8080plcnext 用户,或 KUBECONFIG=/etc/kubernetes/admin.conf
License 连不上grep serverHostname …/Lm.config 应为 cni0 地址
04 报缺 buildahsudo apt-get install -y buildah
kubectl describe pod vplc
ip -br addr show cni0
ctr -n k8s.io images ls | grep vplc
kubectl exec vplc -- cat /usr/lib/systemd/network/80-wired.network
kubectl exec vplc -- grep serverHostname /opt/plcnext/config/System/Lm/Lm.config

Arp.log

09.09.26 02:05:02.868 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - SoftWdTimerCtx.Remove() on status Enabled
09.09.26 02:05:02.868 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - PriCtx.Timers.loPrioTimer.Remove() on status Enabled
09.09.26 02:05:02.868 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - PriCtx.Timers.miPrioTimer.Remove() on status Enabled
09.09.26 02:05:02.868 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - PriCtx.Timers.hiPrioTimer.Remove() on status Enabled
09.09.26 02:05:03.174 Arp.System.Acf.Internal.ApplicationBase                      INFO  - Application 'ExternalIoProcess' terminates.
09.09.26 02:05:03.175 Arp.System.Acf.Internal.ApplicationBase                      INFO  - Application 'MonitoringProcess' terminates.
09.09.26 02:05:03.176 Arp.System.Acf.Internal.ApplicationBase                      INFO  - Application 'PrivilegedProcess' terminates.
09.09.26 02:05:03.177 Arp.System.Acf.Internal.ApplicationBase                      INFO  - Application 'WbmProcess' terminates.
09.09.26 02:05:06.822 Arp.System.Acf.Internal.ApplicationBase                      INFO  - ArpVersion: 2026.0.5 LTS (26.0.5.103)
09.09.26 02:05:06.823 CommonRemoting                                               INFO  - [IpcRemotingBroker]: Starting IPC Remoting Broker
09.09.26 02:05:06.823 CommonRemoting                                               INFO  - Starting remoting server (version=4)
09.09.26 02:05:06.823 CommonRemoting                                               INFO  - Start listening on IPC *
09.09.26 02:05:06.823 CommonRemoting                                               INFO  - Start listening on TCP port 41120
09.09.26 02:05:06.823 CommonRemoting                                               INFO  - Start listening on IPC MainProcess
09.09.26 02:05:06.823 CommonRemoting                                               INFO  - Start listening on TCP port 41121
09.09.26 02:05:06.831 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Process 'MainProcess' started successfully with processId=2002.
09.09.26 02:05:06.856 Arp.System.Acf.Internal.ApplicationBase                      INFO  - ArpVersion: 2026.0.5 LTS (26.0.5.103)
09.09.26 02:05:06.857 Arp.System.Acf.Internal.ApplicationBase                      INFO  - ArpVersion: 2026.0.5 LTS (26.0.5.103)
09.09.26 02:05:06.857 Arp.System.Acf.Internal.ApplicationBase                      INFO  - ArpVersion: 2026.0.5 LTS (26.0.5.103)
09.09.26 02:05:06.857 CommonRemoting                                               INFO  - Starting remoting server (version=4)
09.09.26 02:05:06.857 CommonRemoting                                               INFO  - Start listening on IPC WbmProcess
09.09.26 02:05:06.857 CommonRemoting                                               INFO  - Starting remoting server (version=4)
09.09.26 02:05:06.857 CommonRemoting                                               INFO  - Start listening on IPC ExternalIoProcess
09.09.26 02:05:06.857 CommonRemoting                                               INFO  - Start listening on TCP port 41123
09.09.26 02:05:06.858 CommonRemoting                                               INFO  - Start listening on TCP port 41126
09.09.26 02:05:06.858 CommonRemoting                                               INFO  - Starting remoting server (version=4)
09.09.26 02:05:06.858 CommonRemoting                                               INFO  - Start listening on IPC MonitoringProcess
09.09.26 02:05:06.858 CommonRemoting                                               INFO  - Accepted connection #0: connectionId=7743571F0F7F, ipc://<unknown>
09.09.26 02:05:06.858 CommonRemoting                                               INFO  - Start listening on TCP port 41125
09.09.26 02:05:06.858 CommonRemoting                                               INFO  - Accepted connection #1: connectionId=7743571F2ABF, ipc://<unknown>
09.09.26 02:05:06.859 CommonRemoting                                               INFO  - Accepted connection #2: connectionId=7743571F53BF, ipc://<unknown>
09.09.26 02:05:06.860 CommonRemoting                                               INFO  - Accepted connection #3: connectionId=77435B1F0F7F, ipc://<unknown>
09.09.26 02:05:06.860 Arp.System.Acf.Internal.ApplicationBase                      INFO  - ArpVersion: 2026.0.5 LTS (26.0.5.103)
09.09.26 02:05:06.860 CommonRemoting                                               INFO  - Accepted connection #4: connectionId=77435B1F2ABF, ipc://<unknown>
09.09.26 02:05:06.860 CommonRemoting                                               INFO  - Starting remoting server (version=4)
09.09.26 02:05:06.860 CommonRemoting                                               INFO  - Start listening on IPC PrivilegedProcess
09.09.26 02:05:06.861 CommonRemoting                                               INFO  - Start listening on TCP port 41122
09.09.26 02:05:06.860 CommonRemoting                                               INFO  - Accepted connection #5: connectionId=77435B1F53BF, ipc://<unknown>
09.09.26 02:05:06.861 CommonRemoting                                               INFO  - Accepted connection #6: connectionId=7743571F7DCF, ipc://<unknown>
09.09.26 02:05:06.862 CommonRemoting                                               INFO  - Accepted connection #0: connectionId=7199A31F0F7F, ipc://<unknown>
09.09.26 02:05:06.862 CommonRemoting                                               INFO  - Accepted connection #7: connectionId=77435B1F7DCF, ipc://<unknown>
09.09.26 02:05:06.863 Arp.System.Acf.Internal.ApplicationBase                      INFO  - Application 'MonitoringProcess' was setup successfully.
09.09.26 02:05:06.863 CommonRemoting                                               INFO  - Accepted connection #0: connectionId=7D5BB71F0F7F, ipc://<unknown>
09.09.26 02:05:06.864 CommonRemoting                                               INFO  - Accepted connection #0: connectionId=7B284F1F0F7F, ipc://<unknown>
09.09.26 02:05:06.864 CommonRemoting                                               INFO  - Accepted connection #0: connectionId=73EB2B1F0F7F, ipc://<unknown>
09.09.26 02:05:06.865 Arp.System.Acf.Internal.ApplicationBase                      INFO  - Application 'ExternalIoProcess' was setup successfully.
09.09.26 02:05:06.865 Arp.System.Acf.Internal.ApplicationBase                      INFO  - Application 'WbmProcess' was setup successfully.
09.09.26 02:05:06.865 Arp.System.Acf.Internal.ApplicationBase                      INFO  - Application 'PrivilegedProcess' was setup successfully.
09.09.26 02:05:07.338 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Process 'ExternalIoProcess' started successfully with processId=2022.
09.09.26 02:05:07.339 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Process 'MonitoringProcess' started successfully with processId=2023.
09.09.26 02:05:07.341 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Process 'PrivilegedProcess' started successfully with processId=2024.
09.09.26 02:05:07.342 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Process 'WbmProcess' started successfully with processId=2025.
09.09.26 02:05:07.495 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Io.Profinet.Library' in process 'ExternalIoProcess' loaded.
09.09.26 02:05:07.501 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Domain.Library' in process 'ExternalIoProcess' loaded.
09.09.26 02:05:07.504 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Esm.Library' in process 'ExternalIoProcess' loaded.
09.09.26 02:05:07.514 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Gds.Library' in process 'ExternalIoProcess' loaded.
09.09.26 02:05:07.515 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.Logging.Library' in process 'ExternalIoProcess' loaded.
09.09.26 02:05:07.516 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.System.UmRscAuthorizator.Library' in process 'ExternalIoProcess' loaded.
09.09.26 02:05:07.516 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Base.Acf.Library' in process 'MainProcess' loaded.
09.09.26 02:05:07.533 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Domain.Library' in process 'MainProcess' loaded.
09.09.26 02:05:07.535 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Esm.Library' in process 'MainProcess' loaded.
09.09.26 02:05:07.544 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Gds.Library' in process 'MainProcess' loaded.
09.09.26 02:05:07.544 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.Logging.Library' in process 'MainProcess' loaded.
09.09.26 02:05:07.544 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.System.UmRscAuthorizator.Library' in process 'MainProcess' loaded.
09.09.26 02:05:07.563 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Domain.Library' in process 'MonitoringProcess' loaded.
09.09.26 02:05:07.565 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Esm.Library' in process 'MonitoringProcess' loaded.
09.09.26 02:05:07.573 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Gds.Library' in process 'MonitoringProcess' loaded.
09.09.26 02:05:07.574 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.Logging.Library' in process 'MonitoringProcess' loaded.
09.09.26 02:05:07.575 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.System.Monitoring.Library' in process 'MonitoringProcess' loaded.
09.09.26 02:05:07.575 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.System.UmRscAuthorizator.Library' in process 'MonitoringProcess' loaded.
09.09.26 02:05:07.581 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Device.HmiLed.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.594 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Device.Interface.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.595 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Hardware.DeviceHmi.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.595 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Hardware.IdentificationData.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.596 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Hardware.Nim.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.597 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Hardware.NvMemory.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.597 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Hardware.OsControl.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.598 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Hardware.RealTimeClock.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.598 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Hardware.ResourceMonitor.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.599 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Hardware.Sensors.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.601 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Backup.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.604 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Domain.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.618 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Eclr.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.620 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Esm.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.622 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Fbm.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.624 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Gds.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.625 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Meta.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.627 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Plm.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.630 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Retain.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.632 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.AlarmServer.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.640 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.DataLogger.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.642 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.Fwm.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.663 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.Grpc.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.663 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.LinuxSyslog.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.664 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.Logging.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.664 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.NmUtilities.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.665 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.NotificationLogger.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.666 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.SecurityStoreManager.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.666 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.Syslog.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.667 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.SystemEvents.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.668 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.Wcm.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.669 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.System.Commons.Services.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.669 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.System.RscGateway.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.670 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.System.Security.Services.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.671 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.System.Um.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.671 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.System.UmRscAuthorizator.Library' in process 'PrivilegedProcess' loaded.
09.09.26 02:05:07.689 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Domain.Library' in process 'WbmProcess' loaded.
09.09.26 02:05:07.691 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Esm.Library' in process 'WbmProcess' loaded.
09.09.26 02:05:07.700 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Plc.Gds.Library' in process 'WbmProcess' loaded.
09.09.26 02:05:07.701 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.Logging.Library' in process 'WbmProcess' loaded.
09.09.26 02:05:07.702 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.Services.Wbm.Library' in process 'WbmProcess' loaded.
09.09.26 02:05:07.703 Arp.System.Acf.Internal.Sm.ProcessesController               INFO  - Library 'Arp.System.UmRscAuthorizator.Library' in process 'WbmProcess' loaded.
09.09.26 02:05:07.703 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Io.PnC' in process 'ExternalIoProcess' created.
09.09.26 02:05:07.703 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Io.PnD' in process 'ExternalIoProcess' created.
09.09.26 02:05:07.703 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Io.PnS' in process 'ExternalIoProcess' created.
09.09.26 02:05:07.705 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.DomainProxy@ExternalIoProcess' in process 'ExternalIoProcess' created.
09.09.26 02:05:07.706 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.EsmProxy@ExternalIoProcess' in process 'ExternalIoProcess' created.
09.09.26 02:05:07.706 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.GdsProxy@ExternalIoProcess' in process 'ExternalIoProcess' created.
09.09.26 02:05:07.706 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.LogProvider@ExternalIoProcess' in process 'ExternalIoProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.UmRscAuthorizator@ExternalIoProcess' in process 'ExternalIoProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Base.Acf.Services' in process 'MainProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.DomainProxy' in process 'MainProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.EsmProxy' in process 'MainProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.GdsProxy' in process 'MainProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.LogProvider' in process 'MainProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.UmRscAuthorizator' in process 'MainProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.DomainProxy@MonitoringProcess' in process 'MonitoringProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.EsmProxy@MonitoringProcess' in process 'MonitoringProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.GdsProxy@MonitoringProcess' in process 'MonitoringProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.LogProvider@MonitoringProcess' in process 'MonitoringProcess' created.
09.09.26 02:05:07.707 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.Monitoring.Monitor' in process 'MonitoringProcess' created.
09.09.26 02:05:07.707 Arp.System.Monitoring.Commons.Helper.HelperEnvirons          INFO  - HelperEnvirons(name = Monitoring, useDbgCmd = true): constructing
09.09.26 02:05:07.708 Arp.System.Monitoring.Commons.Helper.RaiiDevice              WARN  - Open(/dev/pxc_generic_wdt_drv, 2): open returned -1, errno = 2:No such file or directory
09.09.26 02:05:07.708 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.Monitoring.Watchdog' in process 'MonitoringProcess' created.
09.09.26 02:05:07.708 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.UmRscAuthorizator@MonitoringProcess' in process 'MonitoringProcess' created.
09.09.26 02:05:07.708 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Device.HmiLed' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.708 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Device.Interface' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.708 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Hardware.DeviceHmi' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.708 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Hardware.IdentificationData' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.708 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Hardware.Nim' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.708 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Hardware.NvMemory' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.709 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Hardware.OsControl' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.709 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Hardware.RealTimeClock' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.709 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Hardware.ResourceMonitor' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.709 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Hardware.Sensors' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.709 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.Backup' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.709 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.Domain' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.709 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.DomainProxy@PrivilegedProcess' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.709 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.Eclr' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.709 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.Eclr.ArpDomain' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.709 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.EclrServices' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.711 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.Esm' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.711 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.EsmController' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.711 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.EsmProxy@PrivilegedProcess' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.711 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.Fbm' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.711 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.Gds' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.711 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.GdsProxy@PrivilegedProcess' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.711 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.Manager' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.Meta' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.MetaDomain' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.Plm' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.PlmShadowCopy' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.Retain' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.AlarmServer' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.DataLogger' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.Fwm' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.GrpcLocal' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.LinuxSyslog' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.LogManager' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.LogProvider@PrivilegedProcess' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.712 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.Logging' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.NmUtilities.NmPlcStateListener' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.NotificationLogger' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.SecurityStoreManager' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.Syslog' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.SystemEvents' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.Wcm' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.Commons.Services' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.Lm' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.RscGateway' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.Security.Services' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.Um' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.713 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.UmRscAuthorizator@PrivilegedProcess' in process 'PrivilegedProcess' created.
09.09.26 02:05:07.714 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.DomainProxy@WbmProcess' in process 'WbmProcess' created.
09.09.26 02:05:07.714 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.EsmProxy@WbmProcess' in process 'WbmProcess' created.
09.09.26 02:05:07.714 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Plc.GdsProxy@WbmProcess' in process 'WbmProcess' created.
09.09.26 02:05:07.714 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.LogProvider@WbmProcess' in process 'WbmProcess' created.
09.09.26 02:05:07.714 Arp.Services.Wbm.Internal.Modules.WbmModuleManager           INFO  - WBM Modules Manager
09.09.26 02:05:07.714 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.Services.Wbm' in process 'WbmProcess' created.
09.09.26 02:05:07.714 Arp.System.Acf.Internal.Sm.ComponentsController              INFO  - Component 'Arp.System.UmRscAuthorizator@WbmProcess' in process 'WbmProcess' created.
09.09.26 02:05:07.716 Arp.System.Monitoring.SystemWatchdogComponent                INFO  - starting SystemWatchdog on process: MonitoringProcess
09.09.26 02:05:07.717 Arp.System.Monitoring.Watchdog.Internal.HwWdDevAcc.HwWdDeviceAccess INFO  - HwWdDeviceAccess: working on soft-watchdog device
09.09.26 02:05:07.717 Arp.System.Monitoring.Watchdog.Internal.HwWdDevAcc.SoftWdDev INFO  - SetupSettings: trigger-cycle setup to: 1.000ms
09.09.26 02:05:07.717 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - SoftWdTimerCtx.Enable(firstWakeUpTimePoint = 1:37:33.778.000us)
09.09.26 02:05:07.717 Arp.System.Monitoring.Watchdog.Internal.HwWdDevAcc.SoftWdDev INFO  - wdt-device identity:   soft-wdt-device
09.09.26 02:05:07.717 Arp.System.Monitoring.Watchdog.Internal.HwWdDevAcc.SoftWdDev INFO  - wdt-device options:    0x0
09.09.26 02:05:07.717 Arp.System.Monitoring.Watchdog.Internal.HwWdDevAcc.SoftWdDev INFO  - wdt-device fw-version: 0
09.09.26 02:05:07.717 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - SoftWdTimerCtx.Remove() on status Enabled
09.09.26 02:05:07.718 CommonRemoting                                               INFO  - Accepted connection #1: connectionId=73EB2B1F274F, ipc://<unknown>
09.09.26 02:05:07.720 Arp.System.Monitoring.Monitor.Internal.MonitorSettings       WARN  - /etc/plcnext/device/Hardware/Sensors/Sensors.hw.settings not exists
09.09.26 02:05:07.720 Arp.System.Monitoring.Monitor.Internal.ContextTimers         INFO  - PriCtx.Timers::InitializeTimers: loPrioTimer(lvl=0, slp=IntervalSleeper     , pri= 1, aff=0, per= 200ms, fwd=   0ms)
09.09.26 02:05:07.720 Arp.System.Monitoring.Commons.Timing.DriverHrTimer           WARN  - Initialize(setMode = |HardIrq, setInterval = 400.000.000ns, setOffset = 0ns): driverAccess unavailable
09.09.26 02:05:07.720 Arp.System.Monitoring.Commons.Timing.DriverTimer             WARN  - Create(PriCtx.Timers.miPrioTimer): DriverHrTimer not ready
09.09.26 02:05:07.720 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - PriCtx.Timers.miPrioTimer.Remove() on status Disabled
09.09.26 02:05:07.720 Arp.System.Monitoring.Commons.Timing.Timer                   WARN  - PriCtx.Timers.miPrioTimer::CreateSleeper: sleeper DriverTimerSleeper not available, using fallback sleeper GriddedWakeUpSleeper
09.09.26 02:05:07.720 Arp.System.Monitoring.Monitor.Internal.ContextTimers         INFO  - PriCtx.Timers::InitializeTimers: miPrioTimer(lvl=1, slp=GriddedWakeUpSleeper, pri=50, aff=0, per= 400ms, fwd= 410ms)
09.09.26 02:05:07.720 Arp.System.Monitoring.Commons.Timing.DriverHrTimer           WARN  - Initialize(setMode = |HardIrq, setInterval = 400.000.000ns, setOffset = 0ns): driverAccess unavailable
09.09.26 02:05:07.720 Arp.System.Monitoring.Commons.Timing.DriverTimer             WARN  - Create(PriCtx.Timers.hiPrioTimer): DriverHrTimer not ready
09.09.26 02:05:07.720 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - PriCtx.Timers.hiPrioTimer.Remove() on status Disabled
09.09.26 02:05:07.720 Arp.System.Monitoring.Commons.Timing.Timer                   WARN  - PriCtx.Timers.hiPrioTimer::CreateSleeper: sleeper DriverTimerSleeper not available, using fallback sleeper GriddedWakeUpSleeper
09.09.26 02:05:07.721 Arp.System.Monitoring.Monitor.Internal.ContextTimers         INFO  - PriCtx.Timers::InitializeTimers: hiPrioTimer(lvl=2, slp=GriddedWakeUpSleeper, pri=98, aff=0, per= 800ms, fwd= 810ms)
09.09.26 02:05:07.721 Arp.System.Monitoring.Commons.Diagnostic.ArpProcesses        INFO  - FindArpProcesses: found 2022:ExternalIoProcess
09.09.26 02:05:07.721 Arp.System.Monitoring.Commons.Diagnostic.ArpProcesses        INFO  - FindArpProcesses: found 2002:MainProcess
09.09.26 02:05:07.721 Arp.System.Monitoring.Commons.Diagnostic.ArpProcesses        INFO  - FindArpProcesses: found 2023:MonitoringProcess
09.09.26 02:05:07.721 Arp.System.Monitoring.Commons.Diagnostic.ArpProcesses        INFO  - FindArpProcesses: found 2024:PrivilegedProcess
09.09.26 02:05:07.721 Arp.System.Monitoring.Commons.Diagnostic.ArpProcesses        INFO  - FindArpProcesses: found 2025:WbmProcess
09.09.26 02:05:07.722 Arp.System.Monitoring.Monitor.Internal.ProcessDiedMonitor    INFO  - StartCheck(threadPrio = 98): started
09.09.26 02:05:07.722 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - PriCtx.Timers.loPrioTimer.Enable(firstWakeUpTimePoint = 1:37:32.800.000us)
09.09.26 02:05:07.722 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - PriCtx.Timers.miPrioTimer.Enable(firstWakeUpTimePoint = 1:37:33.210.000us)
09.09.26 02:05:07.722 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - PriCtx.Timers.hiPrioTimer.Enable(firstWakeUpTimePoint = 1:37:33.610.000us)
09.09.26 02:05:07.730 CommonRemoting                                               INFO  - Accepted connection #2: connectionId=73EB2B1F4EAF, ipc://<unknown>
09.09.26 02:05:07.732 CommonRemoting                                               INFO  - Accepted connection #3: connectionId=73EB2B1F75CF, ipc://<unknown>
09.09.26 02:05:07.740 Arp.System.Monitoring.Commons.Timing.SleeperBase             INFO  - SoftWdTimerCtx.Enable(firstWakeUpTimePoint = 1:37:33.801.000us)
09.09.26 02:05:07.743 Arp.Hardware.Nim.NimComponent                                INFO  - Ethernet Device 1: public Name 'LAN 1', IP=192.168.77.150, subnet mask=255.255.255.0
09.09.26 02:05:07.743 Arp.Hardware.Nim.NimComponent                                INFO  - Ethernet Device 2: public Name 'LAN 2', IP=10.244.0.6, subnet mask=255.255.255.0
09.09.26 02:05:07.745 Arp.Hardware.Modules.RealTimeClock.VPLCNEXTCONTROL.RtcModule INFO  - RtcModule::SetupSettings() : Status check not supported, set to ok
09.09.26 02:05:07.746 Arp.Hardware.Modules.ResourceMonitor.Linux.Internal.CpuLoad  INFO  - Kernel does not have the "Precise Load Measurement" patches. Falling back to vanilla kernel load measurement.
09.09.26 02:05:07.750 CommonRemoting                                               INFO  - Accepted connection #1: connectionId=7199A31F2A7F, ipc://<unknown>
09.09.26 02:05:07.751 CommonRemoting                                               INFO  - Accepted connection #2: connectionId=7199A31F511F, ipc://<unknown>
09.09.26 02:05:07.754 CommonRemoting                                               INFO  - Accepted connection #3: connectionId=7199A31F7A2F, ipc://<unknown>
09.09.26 02:05:07.766 Arp.Plc.Eclr.Lib                                             INFO  - GetCurrentTimeZoneInfo: StandardName=UTC, DaylightName=UTC, after 1 trials!
09.09.26 02:05:07.778 Arp.Plc.Eclr.Internal.EclrDomain                             INFO  - EclrComponent eclr version 3.4.0.424
09.09.26 02:05:07.824 Arp.Plc.Domain.PlcManagerComponent                           INFO  - MemoryResources configured with memory lock option 'None'
09.09.26 02:05:07.827 Arp.Device.HmiLed.Internal.LedLogicModules.ProfinetLedLogic  INFO  - ProfinetLedLogic: PN-Ctrl at 1
09.09.26 02:05:07.827 Arp.Device.HmiLed.Internal.LedLogicModules.ProfinetLedLogic  INFO  - ProfinetLedLogic: PN-Dev at 1
09.09.26 02:05:07.832 Arp.Device.Interface.DeviceInterface                         WARN  - No internal INtpConfigService available
09.09.26 02:05:07.835 Arp.Device.Interface.Internal.MonitorThreads                 INFO  - RealTimeClock status ok
09.09.26 02:05:07.835 Arp.Device.Interface.Internal.MonitorThreads                 INFO  - HW Monitor active with prio 48
09.09.26 02:05:07.897 CommonRemoting                                               INFO  - Accepted connection #1: connectionId=7B284F1F2ABF, ipc://<unknown>
09.09.26 02:05:07.897 CommonRemoting                                               INFO  - Accepted connection #1: connectionId=7D5BB71F2ABF, ipc://<unknown>
09.09.26 02:05:07.903 Arp.Services.Wbm.Internal.Fcgi.FcgiDispatcher                INFO  - Handler with API ID _auth_api registered
09.09.26 02:05:07.903 Arp.Services.Wbm.Internal.Fcgi.FcgiDispatcher                INFO  - Handler with API ID arp_custom_api registered
09.09.26 02:05:07.903 Arp.Services.Wbm.Internal.Fcgi.FcgiDispatcher                INFO  - Handler with API ID arp_api registered
09.09.26 02:05:07.910 Arp.System.Um.UserManager                                    INFO  - UM ldap configuration not found, disable ldap support completely
09.09.26 02:05:07.958 Arp.System.Lm.Runtime.CodeMeter.Runtime.Network.RuntimeNetworkAccess INFO  - License server info: ipAddress='10.244.0.1', computerName='10.244.0.1', systemPlatform='Linux', systemVersion='Windows 95'.
09.09.26 02:05:08.234 Arp.System.Lm.Runtime.CodeMeter.Runtime.Network.RuntimeNetworkAccess INFO  - Container '3-6952037' found.
09.09.26 02:05:08.235 Arp.System.Lm.Internal.LicenseManager                        INFO  - License runtime version: 8.40.7109
09.09.26 02:05:08.795 Arp.Plc.Domain.Internal.Project.IntegrityCheck               INFO  - PLC Manager: Project integrity check configured with mode 'Error' and kind 'None'
09.09.26 02:05:08.796 Arp.Plc.Domain.Internal.Condition.SystemWatchdogConditionProvider INFO  - PlcAutoRestart after system watchdog is disabled
09.09.26 02:05:08.830 Arp.Plc.Domain.Internal.PlcManager                           INFO  - Plc state transition from 'None' to 'Ready'
09.09.26 02:05:08.830 Arp.Plc.Domain.Internal.Project.IntegrityCheck               WARN  - The integrity check is performed without signature verification!
09.09.26 02:05:08.840 Arp.Plc.Domain.Internal.Condition.LicenseCheckConditionProvider INFO  - A valid license has been found.
09.09.26 02:05:08.841 Arp.Plc.Domain.Internal.PlcManager                           INFO  - Plc state transition from 'Ready' to 'Ready|Loading'
09.09.26 02:05:08.846 Arp.Plc.Esm.Internal.EsmDomain                               INFO  - ESM configuration successfully loaded.
09.09.26 02:05:08.850 Arp.Plc.Gds.Internal.GdsDomain                               INFO  - GDS configuration successfully loaded.
09.09.26 02:05:08.852 Arp.Plc.Domain.Internal.Config.PlcProjectConfigManager       INFO  - Loading project ''
09.09.26 02:05:08.959 Arp.Plc.Gds.Internal.GdsDomain                               INFO  - GDS data connections successfully created.
09.09.26 02:05:08.960 Arp.Plc.Domain.Internal.PlcManager                           INFO  - Plc state transition from 'Ready|Loading' to 'Stop|Warm'
09.09.26 02:05:08.972 Arp.Services.Wcm.WebConfigurationManager                     INFO  - Identity Store HTTPS-self-signed was created/loaded successfully
09.09.26 02:05:08.973 Arp.Services.Wcm.WebConfigurationManager                     INFO  - Setuped self-signed Identity Store
09.09.26 02:05:08.980 Arp.Services.Wbm.Internal.Fcgi.FcgiDispatcher                INFO  - Handler with API ID arp_rsc registered
09.09.26 02:05:08.980 Arp.Services.Wbm.Internal.Fcgi.FcgiDispatcher                INFO  - Handler with API ID arp_internal_rsc registered
09.09.26 02:05:08.981 Arp.System.Nm.Internal.NotificationBroker.NotificationBroker INFO  - A subscriber subscribed to not registered notification name: App
09.09.26 02:05:08.981 Arp.System.Nm.Internal.NotificationBroker.NotificationBroker INFO  - A subscriber subscribed to not registered notification name: Arp.Services.Alarms.Log
09.09.26 02:05:08.983 Arp.Plc.Domain.Internal.Condition.PlcConditionManager        INFO  - Starting Plc is delayed by 'Arp.Services.SystemEvents' because of 'Complete system start'. Timeout is set to 0 milliseconds.
09.09.26 02:05:08.983 Arp.Plc.Domain.Internal.PlcManager                           INFO  - Plc state transition from 'Stop|Warm' to 'Stop|Warm|StartingDelayed'
09.09.26 02:05:08.984 Arp.Device.Interface.DeviceInterface                         INFO  - Thread DI.UpdateSystemVariables is running
09.09.26 02:05:08.984 Arp.Device.Interface.Internal.MonitorThreads                 INFO  - Thread DI.LowPrioMonitor is running
09.09.26 02:05:08.986 Arp.Services.Grpc.GrpcServerComponent                        INFO  - gRPC Server listening on unix:/run/plcnext/grpc.sock
09.09.26 02:05:09.019 Arp.Plc.Domain.Internal.Condition.PlcConditionManager        INFO  - Plc start delay condition 'Complete system start' expired after 36 ms
09.09.26 02:05:09.019 Arp.Plc.Domain.Internal.PlcManager                           INFO  - Plc state transition from 'Stop|Warm|StartingDelayed' to 'Stop|Starting|Warm'
09.09.26 02:05:09.066 Arp.Plc.Domain.Internal.PlcManager                           INFO  - Plc state transition from 'Stop|Starting|Warm' to 'Running'
09.09.26 02:05:09.071 Arp.System.Nm.Internal.NotificationBroker.NotificationBroker INFO  - A subscriber subscribed to not registered notification name: App
09.09.26 02:05:09.071 Arp.System.Nm.Internal.NotificationBroker.NotificationBroker INFO  - A subscriber subscribed to not registered notification name: Arp.Services.Alarms.Log
09.09.26 02:05:09.072 CommonRemoting                                               INFO  - Starting remoting server (version=4)
09.09.26 02:05:09.072 CommonRemoting                                               INFO  - Start listening on TCP port 41100
09.09.26 02:05:09.073 Arp.System.Acf.Internal.ApplicationBase                      INFO  - Application 'MainProcess' was setup successfully.

在这里插入图片描述


常用运维

# 进容器
kubectl exec -it vplc -c vplcnextcontrol1000 -- bash

kubectl exec vplc -- systemctl restart plcnext

# 重建 Pod(数据在 /mnt/data/vplc-plcnext)
kubectl delete pod vplc
kubectl apply -f manifests/pod.yaml

参考

  • Multus:https://github.com/k8snetworkplumbingwg/multus-cni
  • Flannel:https://github.com/flannel-io/flannel
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐