金鱼哥RHCA回忆录:CL210执行镜像操作--在部署期间初始化实例+章节实验

举报
金鱼哥 发表于 2022/07/22 17:30:52 2022/07/22
【摘要】 第四章 执行镜像操作--在部署期间初始化实例+章节实验

🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥

🎈支持我:可点赞👍、可收藏⭐️、可留言📝


📜回顾CLOUD-INIT基础知识

为了避免镜像的激增,您可以只维护几个通用基本镜像,然后在部署期间执行特定于实例的定制。cloud-init是一组Python脚本和实用程序,用于执行实例的早期初始化。它的任务可能包括注入SSH密钥、配置网络设置和设置主机名。cloud-init设置实例所需的信息称为用户数据。用户数据支持几种格式,包括shell脚本、云配置格式、upstart作业、MIME多部分格式和include文件。这些都可以使用gzip进行压缩。


📑流行的cloud-init用户数据格式

shell脚本

cloud-init可以直接使用shell脚本作为用户数据,而不需要修改。如果您现有的强化或自定义是使用shell脚本执行的,那么这提供了一个简单的迁移路径。


cloud-config

云配置格式允许管理员使用简单的指令执行常见任务。云配置格式文件必须是有效的YAML,并具有# cloud-config头或Content-Type: text/cloud-config头文件用于MIME归档。它支持创建用户、组、文件和Yum存储库、安装包、确认SSH密钥和其他任务。


include

include文件包含一个url列表,每个url都指向支持的任何格式的用户数据。它必须有一个#include头或者Content-Type: text/x-include-url头用于MIME归档。


📜描述配置驱动

在Red Hat OpenStack平台中,cloud-init在实例启动期间运行,并从计算元数据API接收用户数据信息。OpenStack计算服务提供了–config-drive布尔值选项来自动生成一个小的ISO 9660或VFAT格式的镜像,其中包含特定于实例的用户数据。如果附加的项目网络没有启用DHCP,则此选项可以为实例提供静态网络配置信息。生成的镜像具有一个config-2的卷标,并在引导时附加到实例。

裸金属服务还支持–config-drive选项,但是这需要一个路径到包含您想要包含的文件的目录。Bare Metal服务创建一个gzip压缩的、使用base64编码的、带有config-2标签的ISO 9660镜像,其中包含目录中的文件。


📜描述元数据服务体系结构

随着Red Hat OpenStack Platform 13中OVN的引入,元数据架构发生了变化。元数据体系结构现在由元数据代理、Neutron OVN元数据代理和Nova元数据API组成。


📜描述cloud-init与计算元数据API的通信

运行在实例上的cloud-init通过两种方法之一被定向到元数据服务。在启用DHCP的项目网络上,DHCP响应包括169.254.169.254的静态路由。没有DHCP的项目网络在OVN路由器中包含一个静态路由。下面的列表描述了通信过程。

  1. 在实例部署期间,将选择一个compute节点作为部署目标。在目标计算节点上运行的neutron-ovn-metadata-agent负责管理网络名称空间(ovnmeta-xxx)、OVS接口和启动HAProxy进程。

  2. 如果实例网络的网络名称空间(ovnmeta-xxx)不存在,则neutron-ovn-metadata-agent会创建一个。

  3. 使用veth对将名称空间链接到OVS,并与IP地址相匹配,然后启动。

  4. neutron-ovn-metadata-agent启动一个HAProxy进程,该进程被称为该名称空间中的元数据代理。下面的输出显示了名称空间、连接名称空间到OVN的接口和HAProxy进程,它们都使用相同的标识符。

在这里插入图片描述

  1. 如果实例有DHCP提供的主机路由,那么从cloud-init发出的请求将直接发送到元数据代理;如果网络上没有启用DHCP,则由OVN路由器转发到元数据代理。

  2. 元数据代理流程侦听HTTP流量,然后将任何请求转发到neutron-ovn-metadata-agent代理通过/var/lib/neutron/metadata_proxy套接字。作为计算元数据API不能区分实例的IP地址,包含ID的元数据代理注入一个X-OVN-Network-ID头项目的网络。

在这里插入图片描述

  1. neutron-ovn-metada-agent将请求发送给计算元数据APl,并通过相同的路径将任何响应转发回实例。

在这里插入图片描述

图4.1: cloud-init与计算元数据API通信


📜描述CLOUD-INIT结构

cloud-init应用程序由用Python编写的模块组成。它还包括四个Systemd服务、配置文件和一些用于分发特定文件的模板。cloud-init的数据存储在/var/lib/cloud.下。这些文件都在一个安装了cloud-init包的实例中。下面描述这四个服务的功能。


📑Cloud-Init服务

cloud-init-local.service

此服务在网络可用之前先运行,但在挂载根分区时运行读/写。理想情况下,该服务可以为实例提供网络配置信息。执行的命令是cloud-init init --local。


cloud-init.service

该服务在引导顺序中排名第二,并期望网络被确认。因为网络是可用的,所以这个阶段处理所有用户数据。所有模块列于cloud_init_modules在/etc/cloud/cloud.conf中执行。执行的命令是cloud-init init。


cloud-config.service

这个服务在cloud-init.service之后运行。所有模块列于cloud_init_modules在/etc/cloud/cloud.conf中执行。执行命令cloud-init modules --mode=config。


cloud-final.service

此服务根据cloud-config.service和rc-local.service尽可能地延迟运行。所有模块列于cloud_init_modules在/etc/cloud/cloud.conf中执行。执行命令cloud-init modules --mode = final。

您可以通过检查/var/log/下的日志文件来排除cloud-init故障。cloud-init.log文件包含这四个服务产生的信息。cloud-init-output.log文件可能存在,并包含每个模块产生的输出。可以手动运行上述服务中列出的任何命令来解决问题。

/etc/cloud/cloud.cfg文件是cloud-init的主要配置文件,但是可以通过将文件放在/etc/cloud/cloud.cfg.d下来包含其他配置文件。


📜课本练习

  • 创建一个云配置格式的用户数据文件。

  • 启动实例并验证是否应用了用户数据。

[student@workstation ~]$ lab customization-img-cloudinit setup 
Setting up workstation for exercise work:

 • Verifying project: finance..................................  SUCCESS
 • Creating user environment file: developer1-finance-rc.......  SUCCESS
 • Creating keypair: example-keypair...........................  SUCCESS
 . Creating flavor: default....................................  SUCCESS
 . Creating internal network: finance-network1.................  SUCCESS
 . Creating subnet: finance-subnet1............................  SUCCESS
 . Creating external network: provider-datacentre..............  SUCCESS
 . Creating router: finance-router1............................  SUCCESS
 • Creating secgroup rule: ssh.................................  SUCCESS
 • Checking fip availability: 1................................  SUCCESS
 • Adding yv alias:............................................  SUCCESS

📑1. 在cloud config格式创建/home/student/user-data文件。

[student@workstation ~]$ cat user-data 
#cloud-config

users:
  - name: cloud-admin
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHufCmzG95rJkXHZOe+7rHMaf3me7geAfdYAc2fuoKjSVoBni4aF4MYkSmb1UYyXjtQ++x2+i13+Osn9FJZmvda0maqT6DuIcpiAxldVrnNJFv5L1VFGiFDbUglThPc25Ytn7bWqg02pFJz4Nc9vN+PzVETevL8b0tMvWPQ44MRuXCCM+UaHO1mBD2pcEnpQ1R/MzYxTzzdvjP5iBn4GAp7KjUw/+FvBhlNiKsXJjQGl6MHbCZhtgsntJzl7tKGY4SgJXZaUD0TnpPeCBlEmWNUz4hAoVMfiiZA4fLAmJ7yZqwRcr4EVnqbmZC6CfIhVxb1J69UHhK62KS6513MP3v Generated-by-Nova

packages:
  - aide
  - nmap
  - socat
  - wireshark
[student@workstation ~]$ source .bashrc 
[student@workstation ~]$ cat .bashrc 
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
yv(){
python -c "import sys,yaml; yaml.load(sys.stdin.read());" < "${1}"
}

[student@workstation ~]$ yv user-data

📑2. 加载/home/student/developer1-finance-rc环境文件。使用以下属性启动实例:

在这里插入图片描述

[student@workstation ~(developer1-finance)]$ openstack server create --flavor default --key-name example-keypair --nic net-id=finance-network1 --security-group default --image rhel7 --user-data user-data --wait finance-admin1
+-----------------------------+------------------------------------------------------+
| Field                       | Value  
+-----------------------------+------------------------------------------------------+
| OS-DCF:diskConfig           | MANUAL  
| OS-EXT-AZ:availability_zone | nova 
| OS-EXT-STS:power_state      | Running 
| OS-EXT-STS:task_state       | None 
| OS-EXT-STS:vm_state         | active 
| OS-SRV-USG:launched_at      | 2020-10-22T15:02:48.000000
| OS-SRV-USG:terminated_at    | None
| accessIPv4                  | 
| accessIPv6                  |
| addresses                   | finance-network1=192.168.1.11
| adminPass                   | gK7yKVZqwrr8 
| config_drive                | 
| created                     | 2020-10-22T14:53:32Z
| flavor                      | default (e04380ed-b027-4a72-a697-4307bc014b6c)
| hostId                      | 3eb57302ddddc3af1fdc763eee541c699f0866f6458e3b5c9a722611         |
| id                          | 381b8bd4-3248-4384-abe2-8e2bb16bc832
| image                       | rhel7 (6b0128a9-4481-4ceb-b34e-ffe92e0dcfdd)
| key_name                    | example-keypair
| name                        | finance-admin1 
| progress                    | 0 
| project_id                  | 3c003f65d8d64914a053f178fbbf953c
| properties                  | 
| security_groups             | name='default'
| status                      | ACTIVE
| updated                     | 2020-10-22T15:02:48Z 
| user_id                     | e4035d555f6b88cf42ca4cacb9fa9999dca9787392222d2eb0875e4e34e6d76f |
| volumes_attached            |
+-----------------------------+------------------------------------------------------+

📑3. 列出可用的浮动IP地址,然后分配一个给finance-admin1。

[student@workstation ~(developer1-finance)]$ openstack floating ip list
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| ID                                   | Floating IP Address | Fixed IP Address | Port | Floating Network                     | Project                          |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| 20e6fda9-9284-4f6a-891e-0d8889c27098 | 172.25.250.101      | None             | None | fc5472ee-98d9-4f6b-9bc9-544ca18aefb3 | 3c003f65d8d64914a053f178fbbf953c |
| 93c41a42-3b3f-481e-9515-ab5098785d90 | 172.25.250.102      | None             | None | fc5472ee-98d9-4f6b-9bc9-544ca18aefb3 | 3c003f65d8d64914a053f178fbbf953c |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
[student@workstation ~(developer1-finance)]$ openstack server add floating ip finance-admin1 172.25.250.101

📑4. 验证cloud-init定制是否有效。通过检查/var/log/cloud-init日志文件来调试任何失败。

[student@workstation ~(developer1-finance)]$ ssh cloud-admin@172.25.250.101
Warning: Permanently added '172.25.250.101' (ECDSA) to the list of known hosts.
[cloud-admin@ finance-admin1~]$ rpm -qa | egrep 'aide|nmap|socat|wireshark'
socat-1.7.3.2-2.el7.x86_64
wireshark-1.10.14-14.el7.x86_64
aide-0.15.1-13.el7.x86_64
nmap-ncat-6.40-13.el7.x86_64
nmap-6.40-13.el7.x86_64

📑清除实验

[student@workstation ~]$ lab customization-img-cloudinit cleanup

📜章节实验

  • 使用diskimage-builder构建镜像。

  • 使用安装后脚本定制镜像。

  • 使用guestfish命令自定义镜像。

  • 将图像上传到OpenStack图像服务。

  • 使用自定义映像启动实例。

[student@workstation ~]$ lab customization-review setup 
Setting up workstation for lab exercise work:

 • Installing required packages on: workstation................  SUCCESS
 • Verifying project: production...............................  SUCCESS
 • Creating user environment file: operator1-production-rc.....  SUCCESS
 • Creating keypair: example-keypair...........................  SUCCESS
 . Creating flavor: default....................................  SUCCESS
 . Creating internal network: production-network1..............  SUCCESS
 . Creating subnet: production-subnet1.........................  SUCCESS
 . Creating external network: provider-datacentre..............  SUCCESS
 . Creating router: production-router1.........................  SUCCESS
 • Checking fip availability: 1................................  SUCCESS

📑1. 在工作站上,检索http://materials.example.com/osp-small.qcow2磁盘镜像并将其保存在/home/student/下。

[student@workstation ~]$ wget http://materials.example.com/osp-small.qcow2 -O osp-small.qcow2

📑2. 在/home/student/下创建要使用的/usr/share/diskimage-builder/elements目录的副本。

[student@workstation ~]$ cp -a /usr/share/diskimage-builder/elements .

📑3. 创建post-install.d目录下的rhe17元素。

[student@workstation ~]$ mkdir -p elements/rhel7/post-install.d

📑4. 在rhel7元素下post-install.d添加一个脚本,目录中启用httpd服务。

[student@workstation ~]$ mkdir -p elements/rhel7/post-install.d
[student@workstation ~]$ cd elements/rhel7/post-install.d/
[student@workstation post-install.d]$ vim 01-enable-services
[student@workstation post-install.d]$ chmod +x 01-enable-services 
[student@workstation post-install.d]$ cd

📑5. 导出以下环境变量,这些环境变量将由diskimage-builder生成。DB_NO_TMPFS变量是必需的,因为工作站有一个小的硬盘,在大多数情况下不需要它。

在这里插入图片描述

[student@workstation ~]$ export DIB_LOCAL_IMAGE=/home/student/osp-small.qcow2
[student@workstation ~]$ export DIB_YUM_REPO_CONF=/etc/yum.repos.d/openstack.repo
[student@workstation ~]$ export ELEMENTS_PATH=/home/student/elements
[student@workstation ~]$ export DIB_NO_TMPFS=1

📑6. 构建一个名为production-rhel-web.qcow2的Red Hat Enterprise Linux 7镜像。使用之前确定的diskimage-builder元素。在镜像中包含httpd包。当提示时,提供student的密码。

[student@workstation ~]$ disk-image-create vm rhel7 -t qcow2 -p httpd -o production-rhel-web.qcow2

📑7. 使用questfish命令向production-rhel-web.qcow2镜像添加自定义web index.html。在index.html中包含文本production-rhel-web。确保SELinux上下文为/var/ www/html/index.html是正确的。

[student@workstation ~]$ guestfish -i -a production-rhel-web.qcow2 

Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.

Type: 'help' for help on commands
      'man' to read the manual
      'quit' to quit the shell

Operating system: Red Hat Enterprise Linux Server 7.5 (Maipo)
/dev/sda1 mounted on /

><fs> touch /var/www/html/index.html
><fs> edit /var/www/html/index.html 
><fs> cat /var/www/html/index.html 
This instance uses the production-rhel-web image.
><fs>  command "systemctl is-enabled httpd"
enabled
><fs> selinux-relabel /etc/selinux/targeted/contexts/files/file_contexts /var/www
><fs> selinux-relabel /etc/selinux/targeted/contexts/files/file_contexts /var/www
><fs> exit

📑8. 作为operator1用户,使用production-rhel-web.qcow2镜像创建一个新的OpenStack镜像,名为production-rhel-web。最小磁盘需求为10 GiB,最小RAM需求为2 GiB。

[student@workstation ~(operator1-production)]$ openstack image create --disk-format qcow2 --min-disk 10 --min-ram 2048 --file ~/production-rhel-web.qcow2 production-rhel-web
+------------------+-----------------------------------------------------------------+
| Field            | Value 
+------------------+-----------------------------------------------------------------+
| checksum         | dd17daecd4493929bd9a5e75a721860b
| container_format | bare 
| created_at       | 2020-10-23T15:11:09Z
| disk_format      | qcow2
| file             | /v2/images/1c4481fe-5c1f-468a-b92e-4548a7d22307/file
| id               | 1c4481fe-5c1f-468a-b92e-4548a7d22307
| min_disk         | 10
| min_ram          | 2048
| name             | production-rhel-web
| owner            | 294ad7735e6646d7bb908e32de8582c3
| properties       | direct_url='rbd://fe8e3db0-d6c3-11e8-a76d-52540001fac8/images/1c4481fe-5c1f-468a-b92e-4548a7d22307/snap', locations='[{u'url': u'rbd://fe8e3db0-d6c3-11e8-a76d-52540001fac8/images/1c4481fe-5c1f-468a-b92e-4548a7d22307/snap', u'metadata': {}}]' |
| protected        | False
| schema           | /v2/schemas/image
| size             | 701169664
| status           | active
| tags             |
| updated_at       | 2020-10-23T15:11:49Z
| virtual_size     | None
| visibility       | shared
+------------------+-----------------------------------------------------------------+

📑9. 作为operator1用户,使用以下属性启动实例:

在这里插入图片描述

[student@workstation ~(operator1-production)]$  openstack server create --flavor default --key-name example-keypair --nic net-id=production-network1 --security-group default --image production-rhel-web --wait production-web1
+-----------------------------+------------------------------------------------------+
| Field                       | Value
+-----------------------------+------------------------------------------------------+
| OS-DCF:diskConfig           | MANUAL
| OS-EXT-AZ:availability_zone | nova
| OS-EXT-STS:power_state      | Running
| OS-EXT-STS:task_state       | None
| OS-EXT-STS:vm_state         | active
| OS-SRV-USG:launched_at      | 2020-10-23T15:25:17.000000
| OS-SRV-USG:terminated_at    | None
| accessIPv4                  |
| accessIPv6                  |
| addresses                   | production-network1=192.168.1.10
| adminPass                   | cTVM8Kw8hJSn
| config_drive                |
| created                     | 2020-10-23T15:22:03Z
| flavor                      | default (e04380ed-b027-4a72-a697-4307bc014b6c)
| hostId                      | 8fd3f499e7f709993ddc2c96e26a7d2baa3a0e86bf738c695624c601         |
| id                          | 9b9be0d8-1d17-49a9-a14b-f78b23ca4fd8
| image                       | production-rhel-web (1c4481fe-5c1f-468a-b92e-4548a7d22307)
| key_name                    | example-keypair
| name                        | production-web1
| progress                    | 0 
| project_id                  | 294ad7735e6646d7bb908e32de8582c3
| properties                  |
| security_groups             | name='default'
| status                      | ACTIVE
| updated                     | 2020-10-23T15:25:17Z
| user_id                     | ac8f19029cdf35fa7083687862bf1235d5a10f5b98632be09d323616c640985e |
| volumes_attached            |
+-----------------------------+------------------------------------------------------+

📑10. 列出可用的浮动IP地址,然后分配一个给production-web1

[student@workstation ~(operator1-production)]$ openstack floating ip list
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| ID                                   | Floating IP Address | Fixed IP Address | Port | Floating Network                     | Project                          |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| d0ae4d18-0444-487e-a42f-9904c368ac89 | 172.25.250.107      | None             | None | fc5472ee-98d9-4f6b-9bc9-544ca18aefb3 | 294ad7735e6646d7bb908e32de8582c3 |
| f3a78fe1-ed50-4cf7-86f4-e5145c3a21ad | 172.25.250.112      | None             | None | fc5472ee-98d9-4f6b-9bc9-544ca18aefb3 | 294ad7735e6646d7bb908e32de8582c3 |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
[student@workstation ~(operator1-production)]$ openstack server add floating ip production-web1 172.25.250.107

📑11. 使用ssh命令登录到production-web1实例。验证httpd包已安装,httpd服务已启用并正在运行。

[student@workstation ~(operator1-production)]$ ssh cloud-user@172.25.250.107
[cloud-user@production-web1 ~]$ 
[cloud-user@production-web1 ~]$ rpm -q httpd
httpd-2.4.6-80.el7_5.1.x86_64
[cloud-user@production-web1 ~]$ systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-10-23 12:46:42 EDT; 7h ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 880 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─880 /usr/sbin/httpd -DFOREGROUND
           ├─895 /usr/sbin/httpd -DFOREGROUND
           ├─897 /usr/sbin/httpd -DFOREGROUND
           ├─900 /usr/sbin/httpd -DFOREGROUND
           ├─901 /usr/sbin/httpd -DFOREGROUND
           └─902 /usr/sbin/httpd -DFOREGROUND

Oct 23 12:46:12 localhost systemd[1]: Starting The Apache HTTP Server...
Oct 23 12:46:35 localhost httpd[880]: AH00558: httpd: Could not reliably determine the server's ...sage
Oct 23 12:46:43 localhost systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
[cloud-user@production-web1 ~]$ exit
logout
Connection to 172.25.250.107 closed.

📑12. 从workstation确认从production-web1中显示的定制web页面包含文本production-rhel-web。

[student@workstation ~(operator1-production)]$ curl http://172.25.250.107
This instance uses the production-rhel-web image.

📑评分脚本

[student@workstation ~]$ lab customization-review grade
Grading the student's work on workstation:

 . Retrieving instance floating IP: ...........................  PASS
 . Checking instance image: ...................................  PASS
 . Checking whether httpd is installed: .......................  PASS
 . Checking whether httpd is enabled: .........................  PASS
 . Checking whether httpd is active: ..........................  PASS
 . Checking for custom site index page: .......................  PASS

Overall lab grade..............................................  PASS

📑清除实验

[student@workstation ~]$ lab customization-review cleanup

💡总结

  • 与定制现有镜像相比,构建镜像的优点和缺点,例如满足组织安全标准(包括第三方代理)和添加操作员帐户。

  • 何时使用guestfish和virt-customize工具。当您需要执行诸如磁盘分区之类的低级任务时,请使用guestfish。对所有常见的定制任务(如设置密码和安装包)使用virt-customize。

  • 使用这些工具对镜像进行更改会影响SELinux文件上下文,因为chroot环境中不直接支持SELinux。

  • 要避免镜像扩展,请使用较小的镜像集,并根据需要使用clound-init或配置管理系统执行每个实例定制。

RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。

以上就是【金鱼哥】对 第四章 执行镜像操作–在部署期间初始化实例+章节实验 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

💾红帽认证专栏系列:
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章收录在RHCA专栏:RHCA 回忆录

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。

如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。