Virtual PLCnext Control 单机 Kubernetes 部署
Virtual PLCnext Control 单机 Kubernetes 部署
在 Ubuntu 24.04 单节点上用 kubeadm + containerd + Flannel + Multus + macvlan 运行 vPLCnext。
| 容器网卡 | CNI | 用途 |
|---|---|---|
| eth0 | macvlan(宿主机 ens33) | 现场网:WBM / OPC-UA / Profinet(固件默认 NIC0) |
| eth1 | Flannel | 集群网:Pod / Service / DNS;宿主机互通走 cni0 |
不要再改 Profinet 网卡序号(macvlan 已在 eth0)。
网络根因修复已包含在 04-import-image.sh 生成的 -nowired 镜像中。
本机实测参数
| 项 | 值 |
|---|---|
| 主机 | 192.168.77.148/24,网关 192.168.77.2,网卡 ens33 |
| K8s | v1.28.15,containerd 2.2.x |
| Pod | vplc |
| 现场 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 指向的 cni0:CNI0_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-wired(04-import-image.sh)
脚本会:
ctr -n k8s.io images import <tar>- 打基础标签
…:26.0.5.103 - 用 buildah 派生新镜像,只改网络单元:
- 重写
/usr/lib/systemd/network/80-wired.network(去掉写死的192.168.1.10) ln -sfn /dev/null /etc/systemd/network/80-wired.network
- 重写
- 不修改
Lm.config(需你进容器手动改,见下节) - 导入结果标签:
…:26.0.5.103-nowired(pod.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-wired→ commit 成新镜像标签 → 再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?
机制
- 原镜像
/usr/lib/systemd/network/80-wired.network给几乎所有以太口写死192.168.1.10。 - 固件
/usr/sbin/plcnext-functions里create_network_configuration读取当时网卡 IP,生成/etc/systemd/network/79-if-1/2.network。 - 禁用
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,这才是根因修复。
网络设计摘要
必要插件:
- Flannel(或其它集群 CNI)— Multus 不能单独用
- Multus — 多网卡
- 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.config 的 serverHostname 为 cni0(如 10.244.0.1),不要填容器 eth1 的 Pod IP。详见上文「手动修改 Lm.config」。
机器重启
| 组件 | 开机行为 |
|---|---|
containerd / kubelet | enabled 后自动起来 |
控制面 / 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-shim → Text file busy → Multus CrashLoop → 全节点 CNI 死锁。见 issue #1221、PR #1445。
另一类竞态: 若 00-multus.conf 尚未写好,kubelet 可能先走默认单网 CNI → Pod Running 但缺 secondary(厂商文档亦要求删 Pod 重建沙箱)。Deployment/StatefulSet 会自动重建;本仓库的 vplc 是裸 Pod,不会自愈。
根因修复(分层)
-
主修复:上游
install_multus(治Text file busy)
manifests/vendor/multus-daemonset-thick.yml已对齐上游 master:init 使用install_multus -d /host/opt/cni/bin -t thick(不再手写cp),terminationGracePeriodSeconds: 30。03-install-cni.sh会带上。 -
安全网:开机 recover(仅裸 Pod + 缺网卡)
不代替官方 Multus 修复;只处理「Running 但只有 Flannel、缺 macvlan」这类需重建沙箱的情况。- 脚本:
scripts/recover-after-boot.sh - 单元模板:
systemd/vplc-k8s-recover.service - 安装:
sudo ./scripts/install-recover-service.sh
- 脚本:
仍卡死时的手工恢复
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.yaml 的 image 字段。
排障
| 现象 | 处理 |
|---|---|
双网卡变成 192.168.1.10 | 确认 Pod 镜像是 -nowired;否则重跑 04 并重建 Pod |
| NAD not found in kube-system | default-network 写成 default/macvlan-eth0 |
| PVC Pending | PV/PVC 设 storageClassName: "" |
| CreateContainerError / import tag | 04 会保留 import 标签;必要时重跑 04 |
/opt/plcnext 几乎为空 | 删空 hostPath 后重跑 05 触发 seed |
外网访问不了 .150 | VMware 混杂模式、master: ens33、IP 冲突 |
宿主机 ping 不通 .150 | 正常;测 eth1 或换机器访问 |
| kubectl → localhost:8080 | 用 plcnext 用户,或 KUBECONFIG=/etc/kubernetes/admin.conf |
| License 连不上 | grep serverHostname …/Lm.config 应为 cni0 地址 |
04 报缺 buildah | sudo 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
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)