基于Kubernetes部署free5gc核心网

说明:
本文仅适合个人对5gc核心网感兴趣测、研究使用。

操作系统版本:

# uname -r
5.4.0-177-generic
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.5 LTS
Release:        20.04
Codename:       focal

修改网卡名称为eth0:

原始网卡信息:

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:22:4f:60:78:54 brd ff:ff:ff:ff:ff:ff
    inet 10.121.218.48/24 brd 10.121.218.255 scope global dynamic ens5
       valid_lft 100654441sec preferred_lft 100654441sec
    inet6 fe80::222:4fff:fe60:7854/64 scope link
       valid_lft forever preferred_lft forever

修改网卡操作:

# vim /etc/default/grub
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
修改GRUB_CMDLINE_LINUX为  -->  GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
# update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.4.0-177-generic
Found initrd image: /boot/initrd.img-5.4.0-177-generic
done
# reboot
# vim /etc/netplan/00-installer-config.yaml
network:
  ethernets:
    eth0: #修改为eth0
      dhcp4: true
  version: 2
# netplan apply
如果网卡没有启动使用如下命令:
ip link set eth0 up

查看修改后网卡信息:

# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:22:4f:60:78:54 brd ff:ff:ff:ff:ff:ff
    inet 10.121.218.48/24 brd 10.121.218.255 scope global dynamic eth0
       valid_lft 100663242sec preferred_lft 100663242sec
    inet6 fe80::222:4fff:fe60:7854/64 scope link
       valid_lft forever preferred_lft forever

安装依赖安装包:

# apt update -y
# apt upgrade -y
# apt install -y curl wget apt-transport-https

安装gpt5g

# apt install gcc -y
# apt install make -y
# apt install git -y
# git clone -b v0.8.1 https://github.com/free5gc/gtp5g.git
# cd gtp5g/
# make
make -C /lib/modules/5.4.0-177-generic/build M=/root/gtp5g modules
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-177-generic'
  CC [M]  /root/gtp5g/src/gtp5g.o
  CC [M]  /root/gtp5g/src/log.o
  CC [M]  /root/gtp5g/src/util.o
  CC [M]  /root/gtp5g/src/gtpu/dev.o
  CC [M]  /root/gtp5g/src/gtpu/encap.o
  CC [M]  /root/gtp5g/src/gtpu/hash.o
  CC [M]  /root/gtp5g/src/gtpu/link.o
  CC [M]  /root/gtp5g/src/gtpu/net.o
  CC [M]  /root/gtp5g/src/gtpu/pktinfo.o
  CC [M]  /root/gtp5g/src/genl/genl.o
  CC [M]  /root/gtp5g/src/genl/genl_version.o
  CC [M]  /root/gtp5g/src/genl/genl_pdr.o
  CC [M]  /root/gtp5g/src/genl/genl_far.o
  CC [M]  /root/gtp5g/src/genl/genl_qer.o
  CC [M]  /root/gtp5g/src/genl/genl_urr.o
  CC [M]  /root/gtp5g/src/genl/genl_report.o
  CC [M]  /root/gtp5g/src/genl/genl_bar.o
  CC [M]  /root/gtp5g/src/pfcp/api_version.o
  CC [M]  /root/gtp5g/src/pfcp/pdr.o
  CC [M]  /root/gtp5g/src/pfcp/far.o
  CC [M]  /root/gtp5g/src/pfcp/qer.o
  CC [M]  /root/gtp5g/src/pfcp/urr.o
  CC [M]  /root/gtp5g/src/pfcp/bar.o
  CC [M]  /root/gtp5g/src/pfcp/seid.o
  CC [M]  /root/gtp5g/src/proc.o
  LD [M]  /root/gtp5g/gtp5g.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC [M]  /root/gtp5g/gtp5g.mod.o
  LD [M]  /root/gtp5g/gtp5g.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-177-generic'
# make install
cp gtp5g.ko /lib/modules/5.4.0-177-generic/kernel/drivers/net
modprobe udp_tunnel
/sbin/depmod -a
modprobe gtp5g
echo "gtp5g" >> /etc/modules

安装docker

# apt update
# apt install apt-transport-https ca-certificates curl software-properties-common -y
# 添加Docker的官方GPG密钥
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
# 添加Docker软件库
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 再次更新软件库索引
# apt update
# 安装Docker CE
# apt install docker-ce -y
# 启动Docker并设置开机启动
# systemctl start docker
# systemctl enable docker
# 验证Docker安装
# docker --version
Docker version 26.1.0, build 9714adc

安装minikube

# wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
# cp minikube-linux-amd64 /usr/local/bin/minikube
# chmod +x /usr/local/bin/minikube

启动minikube

使用普通账号操作:

$ sudo usermod -aG docker $USER && newgrp docker
$ minikube start --driver=docker --cpus=4 --memory=16g --disk-size=100g --cni=flannel
* minikube v1.33.0 on Ubuntu 20.04 (kvm/amd64)
* Using the docker driver based on user configuration
* Using Docker driver with root privileges
* Starting "minikube" primary control-plane node in "minikube" cluster
* Pulling base image v0.0.43 ...
* Downloading Kubernetes v1.30.0 preload ...
    > preloaded-images-k8s-v18-v1...:  342.90 MiB / 342.90 MiB  100.00% 16.34 M
    > index.docker.io/kicbase/sta...:  480.29 MiB / 480.29 MiB  100.00% 1.13 Mi
! minikube was unable to download gcr.io/k8s-minikube/kicbase:v0.0.43, but successfully downloaded docker.io/kicbase/stable:v0.0.43 as a fallback image
* Creating docker container (CPUs=4, Memory=16384MB) ...
* Preparing Kubernetes v1.30.0 on Docker 26.0.1 ...
  - Generating certificates and keys ...
  - Booting up control plane ...
  - Configuring RBAC rules ...
* Configuring Flannel (Container Networking Interface) ...
* Verifying Kubernetes components...
  - Using image gcr.io/k8s-minikube/storage-provisioner:v5
* Enabled addons: default-storageclass, storage-provisioner
* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

安装kubectl

# curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
# chmod +x kubectl
# mv kubectl /usr/local/bin/

安装helm

# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
# chmod 700 get_helm.sh
# ./get_helm.sh
Downloading https://get.helm.sh/helm-v3.14.4-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm

安装multus-cni

使用普通账户执行:

$ git clone https://github.com/k8snetworkplumbingwg/multus-cni.git
$ sudo cat /home/yan/multus-cni/deployments/multus-daemonset.yml | kubectl apply  -f -
[sudo] password for yan:
Sorry, try again.
[sudo] password for yan:
customresourcedefinition.apiextensions.k8s.io/network-attachment-definitions.k8s.cni.cncf.io created
clusterrole.rbac.authorization.k8s.io/multus created
clusterrolebinding.rbac.authorization.k8s.io/multus created
serviceaccount/multus created
configmap/multus-cni-config created
daemonset.apps/kube-multus-ds created

安装5GC

使用普通账户执行:

$ kubectl create ns free5gc
$ git clone https://github.com/Orange-OpenSource/towards5gs-helm.git
$ helm -n free5gc install free5gc-v1 /home/yan/towards5gs-helm/charts/free5gc --set global.n2network.masterIf=eth0,global.n4network.masterIf=eth0,global.n6network.masterIf=eth0,global.n9network.masterIf=eth0,global.n6network.subnetIP=10.244.0.0,global.n6network.gatewayIP=10.244.0.2,free5gc-upf.upf.n6if.ipAddress=10.244.0.20
NAME: free5gc-v1
LAST DEPLOYED: Fri Apr 26 09:15:45 2024
NAMESPACE: free5gc
STATUS: deployed
REVISION: 1
NOTES:
#
# Software Name : towards5gs-helm
# SPDX-FileCopyrightText: Copyright (c) 2021 Orange
# SPDX-License-Identifier: Apache-2.0
#
# This software is distributed under the Apache License 2.0,
# the text of which is available at https://github.com/Orange-OpenSource/towards5gs-helm/blob/main/LICENSE
# or see the "LICENSE" file for more details.
#
# Author: Abderaouf KHICHANE, Ilhem FAJJARI
# Software description: An open-source project providing Helm charts to deploy 5G components (Core + RAN) on top of Kubernetes
#
#
# Visit the project at https://github.com/Orange-OpenSource/towards5gs-helm
#

1. Get the list of created Pods by running:
  kubectl get pods --namespace free5gc -l "project="

Release notes (What's changed in this version):
- Fix TLS configuration for SBI communications
注意:
	此次的eth0为本机的网卡名。

安装UERANSIM

$ helm -n free5gc install ueransim /home/yan/towards5gs-helm/charts/ueransim --set global.n2network.masterIf=eth0,global.n3network.masterIf=eth0
NAME: ueransim
LAST DEPLOYED: Fri Apr 26 09:18:48 2024
NAMESPACE: free5gc
STATUS: deployed
REVISION: 1
NOTES:
#
# Software Name : towards5gs-helm
# SPDX-FileCopyrightText: Copyright (c) 2021 Orange
# SPDX-License-Identifier: Apache-2.0
#
# This software is distributed under the Apache License 2.0,
# the text of which is available at https://github.com/Orange-OpenSource/towards5gs-helm/blob/main/LICENSE
# or see the "LICENSE" file for more details.
#
# Author: Abderaouf KHICHANE, Ilhem FAJJARI
# Software description: An open-source project providing Helm charts to deploy 5G components (Core + RAN) on top of Kubernetes
#
#
# Visit the project at https://github.com/Orange-OpenSource/towards5gs-helm
#

1. Run UE connectivity test by running these commands:
  helm --namespace free5gc test ueransim

If you want to run connectivity tests manually, follow:

1. Get the UE Pod name by running:
  export POD_NAME=$(kubectl get pods --namespace free5gc -l "component=ue" -o jsonpath="{.items[0].metadata.name}")

2. Check that uesimtun0 interface has been created by running these commands:
  kubectl --namespace free5gc logs $POD_NAME
  kubectl --namespace free5gc exec -it $POD_NAME -- ip address

3. Try to access internet from the UE by running:
  kubectl --namespace free5gc exec -it $POD_NAME -- ping -I uesimtun0 www.google.com
  kubectl --namespace free5gc exec -it $POD_NAME -- curl --interface uesimtun0 www.google.com
  kubectl --namespace free5gc exec -it $POD_NAME -- traceroute -i uesimtun0 www.google.com

Release notes (What's changed in this version):
- add the release notes
- add an initContainer to wait for the AMF to be ready
- enhance the handling of k8s NGAP service and network parameters

查看所有pod:

$ kubectl get pod -A
NAMESPACE      NAME                                                    READY   STATUS    RESTARTS      AGE
free5gc        free5gc-v1-free5gc-amf-amf-7844db6fd-xqs4f              1/1     Running   0             20m
free5gc        free5gc-v1-free5gc-ausf-ausf-7dcf7948f-47shs            1/1     Running   0             20m
free5gc        free5gc-v1-free5gc-dbpython-dbpython-85b5c46c66-5524c   1/1     Running   0             20m
free5gc        free5gc-v1-free5gc-nrf-nrf-75b6dd6d97-dn9bn             1/1     Running   0             20m
free5gc        free5gc-v1-free5gc-nssf-nssf-58b865c889-xf969           1/1     Running   0             20m
free5gc        free5gc-v1-free5gc-pcf-pcf-fd4b45967-pt698              1/1     Running   0             20m
free5gc        free5gc-v1-free5gc-smf-smf-75b66b95f5-vr7fj             1/1     Running   0             20m
free5gc        free5gc-v1-free5gc-udm-udm-75fd9d5ccb-lv7tl             1/1     Running   0             20m
free5gc        free5gc-v1-free5gc-udr-udr-7bff444cb4-w7vz8             1/1     Running   0             20m
free5gc        free5gc-v1-free5gc-upf-upf-9867579cf-xrwz5              1/1     Running   0             20m
free5gc        free5gc-v1-free5gc-webui-webui-6497c44789-bwxxj         1/1     Running   0             20m
free5gc        mongodb-0                                               1/1     Running   0             20m
free5gc        ueransim-gnb-76545d6765-l6tmh                           1/1     Running   0             17m
free5gc        ueransim-ue-7cb978fd78-2dlhd                            1/1     Running   0             17m

启动Web界面

$ kubectl port-forward --namespace free5gc svc/webui-service 5000:5000
Forwarding from 127.0.0.1:5000 -> 5000
Forwarding from [::1]:5000 -> 5000

本地电脑操作:

C:\Users\ailink>ssh -L localhost:5000:localhost:5000 yan@10.121.218.48
The authenticity of host '10.121.218.48 (10.121.218.48)' can't be established.
ECDSA key fingerprint is SHA256:2aiuF/m8XpMHm9sGo/6KBMmM52iWFd4mChfUcXXFvzA.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.121.218.48' (ECDSA) to the list of known hosts.
yan@10.121.218.48's password:
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-177-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

  System information as of Fri 26 Apr 2024 09:52:03 AM UTC

  System load:                      0.27
  Usage of /:                       5.6% of 289.30GB
  Memory usage:                     7%
  Swap usage:                       0%
  Processes:                        371
  Users logged in:                  2
  IPv4 address for br-542cd42b44c7: 192.168.49.1
  IPv4 address for docker0:         172.17.0.1
  IPv4 address for eth0:            10.121.218.48


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status

New release '22.04.3 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Apr 26 08:31:48 2024 from 192.168.10.2

登陆5GCWeb界面,http://localhost:5000,用户名和秘密为admin/free5gc
在这里插入图片描述
在这里插入图片描述
本次安装到这里完毕,后续章节会补充UE和GNB接入操作。
参考网址:
链接: free5GC
链接: free5gc Helm chart

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/578157.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring boot3单模块项目工程搭建-上(个人开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 常规目录创建 common目录 exception.handle目录 result.handle目录 controller目录 service目录 mapper目录 entity目录 test目录 写在最后 写在前面 本文…

CSS学习(选择器、盒子模型)

1、CSS了解 CSS&#xff1a;层叠样式表&#xff0c;一种标记语言&#xff0c;用于给HTML结构设置样式。 样式&#xff1a;文字大小、背景颜色等 p标签内不能嵌套标题标签。 px是相对于分辨率而言的&#xff0c; em是相对于浏览器的默认字体&#xff0c; rem是相对于HTML根元…

更易使用,OceanBase开发者工具 ODC 4.2.4 版本升级

亲爱的朋友们&#xff0c;大家好&#xff01;我们的ODC&#xff08;OceanBase Developer Center &#xff09;再次迎来了重要的升级V 4.2.4&#xff0c;这次我们诚意满满&#xff0c;从五个方面为大家精心打造了一个更加易用、贴心&#xff0c;且功能更强的新版本&#xff0c;相…

如何写好代码?

文章目录 前言内容代码应当易于理解命名注释格式循环和逻辑设计函数设计类其它&#xff08;编程规范、静态检查工具&#xff09;重构 前言 在软件开发领域&#xff0c;写好代码是至关重要的一环。不论是在学校学习的学生&#xff0c;刚刚毕业的应届生&#xff0c;还是刚步入企…

JAVA SWING JTABLE表格,点击表头数据可以排序,且第一二行位置固定,不参与排序

对于JAVA SWING 界面开发&#xff0c;使用表格JTABLE开发过程中&#xff0c;一些情况下可能需要在点击表头时对数据进行排序处理。对于简单的排序处理&#xff0c;jtable的setAutoCreateRowSorter方法可满足&#xff0c;但是对于高要求的排序&#xff0c;则满足不了。 比如&am…

《html自用使用指南》--基于w3School实践

1.基础标签 文本输入时&#xff0c;在编辑器中的换行&#xff0c;多个空格&#xff0c;都被编辑器看作一个空格 <p> 这个段落 在源代码 中 包含 许多行 但是 浏览器 忽略了 它们。 </p>结果&#xff1a;这个段落 在源代码 中 包含 许多行 但是 浏览器…

惊!文件夹突变文件,揭秘背后原因及数据恢复秘籍

在使用电脑时&#xff0c;我们有时会遇到一些意想不到的问题。比如&#xff0c;你可能会突然发现&#xff0c;原本存储着大量重要资料的文件夹&#xff0c;竟然变成了一个无法打开的文件。这种情况听起来可能有些匪夷所思&#xff0c;但它确实存在&#xff0c;且给用户带来了巨…

微信收款码0.2费率开通

很多人想申请低手续费率的收款码不知从何下手&#xff0c;在参考了大量博客教学之后&#xff0c;终于搞懂了详细流程以及注意事项。在此记录一下。我申请的是一个只需要0.2%费率的微信收款码&#xff0c;申请时间是2022年2月12日。申请之前只需要准备营业执照和法人身份z&#…

用不了ChatGPT?快试试免费又强大的Anthropic Claude

一、Claude 简介 Anthropic 官方&#xff1a; https://www.anthropic.com/product Claude 是最近新开放的一款 AI 聊天机器人&#xff0c;是世界上最大的语言模型之一&#xff0c;比之前的一些模型如 GPT-3 要强大得多&#xff0c;因此 Claude 被认为是 ChatGPT 最有力的竞争…

25计算机考研院校数据分析 | 南京大学

南京大学&#xff08;Nanjing University&#xff09;&#xff0c;简称“南大”&#xff0c;是中华人民共和国教育部直属、中央直管副部级建制的全国重点大学&#xff0c;国家首批“双一流”、“211工程”、“985工程”重点建设高校&#xff0c;入选首批“珠峰计划”、“111计划…

Perfectly Clear Workbench for mac/win:让图像清晰不再是难题

在数字时代&#xff0c;图像处理已经成为我们日常生活和工作中的必备技能。无论是专业摄影师&#xff0c;还是业余爱好者&#xff0c;都渴望拥有一款能够轻松提升图像质量的软件。今天&#xff0c;我要向大家推荐一款卓越的图像清晰处理软件——Perfectly Clear Workbench&…

NAT网络地址转换实验(华为)

思科设备参考&#xff1a;NAT网络地址转换实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 NAT&#xff08;Network Address Translation&#xff09;&#xff0c;即网络地址转换技术&#xff0c;是一种在现代计算机网络中广泛应用的技术&#xff0c;主要用于有效管…

将游戏界面与注册/登录界面连接到一起

一、 导包 在注册页面中导入一个import subprocess包 二、 使用代码将其连接到一起 在循环中加入下面这一行代码&#xff0c;用来实现效果 subprocess.run(["python", "game代码.py"]

容器安全-镜像扫描

前言 容器镜像安全是云原生应用交付安全的重要一环&#xff0c;对上传的容器镜像进行及时安全扫描&#xff0c;并基于扫描结果选择阻断应用部署&#xff0c;可有效降低生产环境漏洞风险。容器安全面临的风险有&#xff1a;镜像风险、镜像仓库风险、编排工具风险&#xff0c;小…

【图解计算机网络】TCP协议三次握手与四次挥手

TCP协议三次握手与四次挥手 三次握手流程为什么是三次握手&#xff0c;而不是两次或四次四次挥手流程TIME_WAIT 为什么要等待 2MSL为什么握手是三次&#xff0c;挥手是四次&#xff1f; 三次握手流程 首先是客户端&#xff08;也就是我们的浏览器&#xff09;发送一个SYN标志位…

在Jupyter notebook中添加虚拟环境

通常我们打开Jupyter notebook&#xff0c;创建一个新文件&#xff0c;只有一个Python3&#xff0c;但是我们也会想使用自己创建的虚拟环境&#xff0c;很简单仅需几部即可将自己的conda环境添加到jupyter notebook中。 1. 创建并激活conda环境&#xff08;已有可跳过&#xf…

Datasophon1.2.1集成Dinky1.0.1

Dinky 下载地址: https://github.com/DataLinkDC/dinky/releases/tag/v1.0.1 Dinky 官网&#xff1a;https://www.dinky.org.cn/ 1.下载Dinky wget https://github.com/DataLinkDC/dinky/releases/download/v1.0.1/dinky-release-1.16-1.0.1.tar.gz mv dinky-release-1.16-1.…

selenium入门篇(环境搭建、八大定位)

背景 Web自动化测现状 1. 属于 E2E 测试 2. 过去通过点点点 3. 好的测试&#xff0c;还需要记录、调试网页的细节 一、selenium环境搭建 一键搭建 pip3 install webdriver-helper 安装后自动的完成&#xff1a; 1. 查看浏览器的版本号 2. 查询操作系统的类型 …

SOLIDWORKS Electrical 3D--精准的三维布线

相信很多工程师在实际生产的时候都会遇到线材长度不准确的问题&#xff0c;从而导致线材浪费甚至整根线材报废的问题&#xff0c;这基本都是由于人工测量长度所导致的&#xff0c;因此本次和大家简单介绍一下SOLIDWORKS Electrical 3D布线的功能&#xff0c;Electrical 3D布线能…

EasyV的可视化作品,没有对这行深入理解,搞不了如此漂亮。

EasyV是我非常佩服的一家可视化服务商&#xff0c;作品涉猎广泛&#xff0c;经典而大气&#xff0c;贝格前端工场的可视化业务与之相比&#xff0c;还是有一定差距&#xff0c;向行业头部企业学习&#xff0c;分享出来一些给大家看下。
最新文章