需要解决的问题:

一台设备同时满足网心业务需求,也可以以root权限操作宿主机进行边缘配套业务

1.需要的设备

所有硬件按照网心官网配置
https://help.onethingcloud.com/1f8d/37ac

https://docs.qq.com/doc/DY3V2dWJUZXBBdkph?nlc=1

上方是非API版本,下方是API版本

2.配置宿主机环境

需要Ubuntu server22.04.5 或 Debian(debian没试过自行找老kernel) 准备好后谨慎update upgrade

下方为网心API docker 需要的环境,在官方未升级之前,必须按照下方环境配置,避免兼容性问题

模块

规格要求

CPU架构

x86、arm64

Linux内核

5.x,不能高于或低于该版本

Docker版本

建议为20.10.7

单带宽线路

≥30Mbps

网络模式

Host模式(宿主机自行拨号)

磁盘要求

≥100G

磁盘挂载

docker 内统一挂载开头路径为 /storage{num},{num}从1开始递增

端口

TCP:80 / 443 / 9999 / 18080

1.先安装Ubuntu serve 22.04 注意安装时候最好就把网络配置好,进入系统再去改的话会麻烦一点,Ubuntu应该在netplan里面修改,注意如果修改netplan则格式要正确,系统正常安装在系统盘,此时业务盘应为空闲,另外如果网络涉及到vlan等情况,需要在配置宿主机环境之前就把网络部分规划好,切记不可跳过规划直接操作

由于宿主机开启ufw可能影响业务跑量故设备处于暴露状态,SSH密钥应设置极为复杂,遵循密码异地双备份原则。

2.lsblk---观察块设备文件,应按照当时情况去判断块设备。

mywxserver@mywxserver:~$ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS

loop0 7:0 0 55.5M 1 loop /snap/core18/3084

loop1 7:1 0 63.9M 1 loop /snap/core20/2318

loop2 7:2 0 74M 1 loop /snap/core22/2955

loop3 7:3 0 25.2M 1 loop /snap/etcd/249

loop4 7:4 0 87M 1 loop /snap/lxd/29351

loop5 7:5 0 75.7M 1 loop /snap/powershell/405

loop6 7:6 0 38.8M 1 loop /snap/snapd/21759

sda 8:0 0 119.2G 0 disk

├─sda1 8:1 0 1G 0 part /boot/efi

├─sda2 8:2 0 2G 0 part /boot

└─sda3 8:3 0 116.2G 0 part

└─ubuntu--vg-ubuntu--lv 253:0 0 58.1G 0 lvm /

sdb 8:16 0 119.2G 0 disk

mywxserver@mywxserver:~$

3.sudo mkfs.ext4 /dev/sdb---如上结果,实验平台是sdb,那么格式化这个设备,如果是生产环境,那么应按照当时情况去执行对应命令

4.sudo mkdir -p /mnt/storage1---按照网心要求去创建storage注意从1开始递增,本实验平台只有一个业务盘,故只有storage1,实际需按照生产设备调整

5.sudo mount /dev/sdb /mnt/storage1---将刚才格式化的sdb挂载到刚才的storage1上面,生产环境应按照当时环境判断进行,一般生产环境不止一块数据盘

6.df -h---去看一下是否成功后进行下一步,如果有问题,应立即停止下面操作,寻找问题出在哪里,并解决

mywxserver@mywxserver:~$ df -h

Filesystem Size Used Avail Use% Mounted on

tmpfs 1.6G 1.9M 1.6G 1% /run

/dev/mapper/ubuntu--vg-ubuntu--lv 57G 7.5G 47G 14% /

tmpfs 7.8G 0 7.8G 0% /dev/shm

tmpfs 5.0M 0 5.0M 0% /run/lock

/dev/sda2 2.0G 134M 1.7G 8% /boot

/dev/sda1 1.1G 6.1M 1.1G 1% /boot/efi

tmpfs 1.6G 4.0K 1.6G 1% /run/user/1000

/dev/sdb 117G 24K 111G 1% /mnt/storage1

7.sudo blkid /dev/sdb---使用sudo权限拿到设备UUID

mywxserver@mywxserver:~$ sudo blkid /dev/sdb

/dev/sdb: UUID="52d14668-8ebe-44c7-aa6a-46da3e0b5357" BLOCK_SIZE="4096" TYPE="ext4"

8.sudo cp /etc/fstab /etc/fstab.bak---将fstab进行备份,以免出现问题

9.sudo vim /etc/fstab---以sudo权限去编辑fstab

10.UUID=你的UUID /mnt/storage1 ext4 defaults 0 2---注意!在末尾“行”按照实际内容添加对应UUID另外此文件若出现问题则无法开机,完成后应不保存,反而复制所有内容给AI进行核查,以避免格式问题等因素。

# /etc/fstab: static file system information.

#

# Use 'blkid' to print the universally unique identifier for a

# device; this may be used with UUID= as a more robust way to name devices

# that works even if disks are added and removed. See fstab(5).

#

# <file system> <mount point> <type> <options> <dump> <pass>

# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation

/dev/disk/by-id/dm-uuid-LVM-BBHyuZC06AyOibyd22IvoLRobfNLC10qRkVeJIRxj7OBSyp79tJNKOOZzEeACMND / ext4 defaults 0 1

# /boot was on /dev/sda2 during curtin installation

/dev/disk/by-uuid/80a6e9ab-1cd5-43e7-8aff-f79441a5b52f /boot ext4 defaults 0 1

# /boot/efi was on /dev/sda1 during curtin installation

/dev/disk/by-uuid/422C-97BA /boot/efi vfat defaults 0 1

/swap.img none swap sw 0 0

UUID=52d14668-8ebe-44c7-aa6a-46da3e0b5357 /mnt/storage1 ext4 defaults 0 2

11.sudo systemctl daemon-reload---将systemd重新装填

12.sudo mount -a---立即检查是否有挂载错误,如果有,必须立即回滚!

13.sudo reboot---配置完成后立即重启主机,重启后验证生产环境下所有盘符对应设备,如果无误,则可以进行下一步

14.在完成网络以及盘符配置后,可以检查一下ipv6模块,以下内容摘自网心官方,遇到ipv6问题必须解决否则无法启动容器

如果跑ipv6,宿主机需要开启ipv6相关内核功能,必须具备ip6table_mangle 模块

IPV6 相关内核功能是否开启检查方式如下:

1、ipv6 是否开启 cat /proc/sys/net/ipv6/conf/all/disable_ipv6 ,输出为1 ,需要开启v6 sysctl -w net.ipv6.conf.all.disable_ipv6=0

2、内核是否具有ipv6模块:lsmod | grep ipv6

3、是否启用IPv6的Netfilter功能: cat /proc/net/ip6_tables_names 输出需要包含 mangle 字段,若没有该字段,需要查看 系统是否具备 ip6table_mangle 模块,若无输出 ,则表示没有 ip6table_mangle 模块,需要检查内核是否编译 ip6table_mangle 支持,查看方式如下:

方式一、zcat /proc/config.gz | grep CONFIG_IP6TABLE_MANGLE 若输出 CONFIG_IP6TABLE_MANGLE=y 或 =m,则内核支持该模块(y 表示内置,m 表示可加载模块)

方式二、cat /boot/config-$(uname -r) | grep CONFIG_IP6TABLE_MANGLE,输出同上

如果内核支持,但模块未加载,sudo modprobe ip6table_mangle 可手动加载,若内核没启用,需要重新编译内核,配置选项 CONFIG_IP6TABLE_MANGLE=y 或 =m

跑v6资源如果不按照上面提示配置,会影响结算收益统计

4、最新版本已经去掉cgroup2 版本支持,如果有cgroup2版本,请降级为cgroup1,否则会影响计费结算

15.stat -fc %T /sys/fs/cgroup/---查看当前Control Groups版本信息如果为cgroup2则进行下面步骤

16.sudo cp /etc/default/grub /etc/default/grub.bak---由于必须使用cgroup1所以,在设置之前先备份文件

17.sudo vim /etc/default/grub---打开grub

18.GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=0 systemd.legacy_systemd_cgroup_controller=1 cgroup_enable=memory swapaccount=1"
(注意,将此值写入原来的GRUB_CMDLINE_LINUX_DEFAULT,但是写入之前要看一下当前情况)

19.sudo update-grub---更新grub

20.reboot---重启后再次验证cgroup是否修改成功

21.stat -fc %T /sys/fs/cgroup/---验证结果是否为tmpfs

22.dpkg -l | grep -E '^ii\s+linux-(generic|image-generic|headers-generic)'---查看这三个包的状态确认核心版本,如果没有问题则执行下一步

23.sudo apt-mark hold linux-generic linux-image-generic linux-headers-generic---执行hold锁住这三个包,注意以后谨慎upgrade生产环境中升级行为必须谨慎!!!

24.apt-mark showhold---马上验证这三个包是否被锁定,如果没有锁,则解决此问题

25.apt list --upgradable 2>/dev/null | grep -E 'linux-(generic|image-generic|headers-generic)'---验证这三个包是否是在升级列表中,如果没有输出则正确

26.uname -r---再次确认kernel版本如果没有问题,则宿主机环境准备完毕(网络另算)

3.docker配置

1.for pkg in docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc; do

if dpkg-query -W -f='${Status}' "$pkg" 2>/dev/null | grep -q 'install ok installed'; then

sudo apt-get remove -y "$pkg"

fi

done---移除可能存在的docker版本,存在则删除,不存在则跳过

2.(cd ~)(mkdir mytools)(cd mytools)---分别去home后建立mytools然后进到mytools里面把配套的工具放在里面

3.sudo dpkg -i *.deb---直接在mytools目录用dpkg把包安装上

4.sudo usermod -aG docker $USER---当前用户加入docker组

5.newgrp docker---在当前终端生效

6.sudo apt-mark hold docker-ce docker-ce-cli containerd.io---把三个包锁住

7.apt-mark showhold---验证是否锁定

8.(./env_check_x86)---复制命令直接去check环境观察是否有问题,有问题去解决,没有问题则下一步,注:check工具只能作为参考,具体问题具体判断程序记得chmod + x

9.docker pull images-cluster.snodehub.com/wxedge-v4/wxedge:latest---顺手把镜像拉下来,不知道官方什么时候更新,最好每次部署都去拉新版本,不要自己下好留着

4.业务配置(500043为商户号)

1.sudo mkdir -p /usr/local/wxedge---V4 的"身份+配置"目录,放系统盘

2.sudo touch /usr/local/wxedge/run_params.yaml---去创建对应的yaml文件,或把yaml文件拉进去

3.sudo cp ~/mytools/run_params.yaml /usr/local/wxedge/---把tools里面的yaml文件拷贝过来

4.sudo modprobe iptable_mangle---加载模块

5.sudo modprobe ip6table_mangle---加载模块

6.echo -e "iptable_mangle\nip6table_mangle" | sudo tee /etc/modules-load.d/wxedge-netfilter.conf---开机自动加载模块

7.docker run -d --privileged --name=wxedge --network=host --restart=unless-stopped -v /usr/local/wxedge:/app_config -v /mnt/storage1:/storage1 images-cluster.snodehub.com/wxedge-v4/wxedge:latest---run起容器,但是需要按照情况来配置

8.docker run -d --privileged --name=wxedge --network=host --restart=unless-stopped -v /usr/local/wxedge:/app_config -v /mnt/storage1:/storage1 -v /mnt/storage2:/storage2 -v /mnt/storage3:/storage3 -v /mnt/storage4:/storage4 -v /mnt/storage5:/storage5 images-cluster.snodehub.com/wxedge-v4/wxedge:latest---如果是多盘的话根据情况去run多盘,如果不是的话此条忽略即可

9.docker ps---去看一下是否存在docker容器进程

10.curl http://127.0.0.1:18080/v1.0/devices/get_base_info---验证是否成功后重启

5.离开前的检查

# ① 模块持久化文件(必须两行都在;重启后靠它自动加载)

cat /etc/modules-load.d/wxedge-netfilter.conf

# ② docker 开机自启(正常输出 enabled;否则 sudo systemctl enable docker)

systemctl is-enabled docker

# ③ 容器重启策略(正常输出 unless-stopped)

docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' wxedge

# ④ 容器状态(应 Up;若之前手动 stop 过 → docker start wxedge)

docker ps --filter name=wxedge

# ⑤ 缓存盘挂载(重启后靠 fstab 自动挂)

findmnt /mnt/storage1

额外注意,此配置没有涉及到网络配置,网络直接承接host,具体网络情况应由现场情况进行判断,在host层面设置好网络。所有配置完毕后,必须多次重启,确定没有任何问题后才可以离开,并且需要留出大概半天或1天时间观察实际业务是否按照预想中运行,确认无误后方可离开机器!!!