OpenStack镜像管理与制作

news2024/12/23 23:22:48

一、OpenStack镜像服务

1、什么是镜像

  • 镜像通常是指一系列文件或一个磁盘驱动器的精确副本
  • 虚拟机所使用的虚拟磁盘,实际上是一种特殊格式的镜像文件。
  • 云环境下尤其需要镜像。
  • 镜像就是一个模板,类似于VMware的虚拟机模板,其预先安装基本的操作系统和其他应用软件。
  • OpenStack中的镜像就是虚拟机镜像,是包含有可启动的操作系统的虚拟机实例磁盘的单个文件。

2、什么是镜像服务

  • 镜像服务就是用来管理镜像的,用途就是让用户能够发现、获取和保存镜像。
  • OpenStack中提供镜像服务的是Glance项目,其功能有:
  • 查询和获取镜像的元数据和镜像本身
  • 注册和上传虚拟机镜像,包括镜像的创建、下载和管理。
  • 维护镜像信息,包括镜像的元数据和镜像本身。
  • 支持多种方式存储镜像
  • 对虚拟机实例执行创建快照命令来创建新的镜像,或备份虚拟机实例的状态
  • Glance是关于镜像的中心,可以被终端用户或Nova计算服务访问,接受磁盘或镜像的API请求,定义镜像元数据的操作

3、Glance架构

Glance不负责实际存储,只实现镜像管理功能,功能单一,包含组件较少。

  1. 客户端:Glance服务的使用者
  2. glance-api:系统后台运行的服务进程,是Glance服务的入口,对外提供REST API,负责接受来自客户端的RESTful请求,响应镜像查询、获取和存储的调用
    1. 与镜像本身存取相关操作,glance-api会将请求转发给该镜像的存储后端,由后端提供相应操作。
    2. 与镜像的元数据相关操作,glance-api会直接操作数据库,存取镜像的元数据(大小、类型等信息)
  3. 数据库:Glance的数据库模块用于存储镜像的元数据,可以选用MySQL、MariaDB等
  4. 存储后端:Glance服务本身不存储镜像文件,而是将文件存放在后端存储系统中。例如:
    • 本地文件存储(或任何挂载到glance-api控制节点的文件系统):默认配置
    • 对象存储:Swift
    • RADOS块设备(RBD)
    • Sheepdog:一个分布式存储系统,为QEMU提供块存储服务,为支持互联网SCSI协议的客户端提供存储服务,同时支持RESTful接口的对象存储服务。
    • 块存储:Cinder
    • VMware数据存储

4、验证OpenStack的Glance服务

4.1、查看Glance配置文件

 [root@node-a ~]# cd /etc/glance
 [root@node-a glance]# ls
 glance-api.conf         # Glance API服务器配置文件          
 glance-registry.conf     
 metadefs       
 rootwrap.d
 glance-cache.conf       # 定义镜像缓存配置        
 glance-scrubber.conf    # 定义镜像删除相关配置
 policy.json             # 镜像服务的策略配置文件
 schema-image.json
 glance-image-import.conf  
 glance-swift.conf     
 rootwrap.conf

4.2、验证Glance服务

 # 查看当前运行的Glance服务
 [root@node-a glance]# systemctl status *glance*.service
 ● openstack-glance-api.service - OpenStack Image Service (code-named Glance) API server
    Loaded: loaded (/usr/lib/systemd/system/openstack-glance-api.service; enabled; vendor preset: disabled)
    Active: active (running) since Tue 2024-04-09 14:23:29 CST; 6 days ago
  ...
 ​
 ● openstack-glance-registry.service - OpenStack Image Service (code-named Glance) Registry server
    Loaded: loaded (/usr/lib/systemd/system/openstack-glance-registry.service; enabled; vendor preset: disabled)
    Active: active (running) since Tue 2024-04-09 14:23:29 CST; 6 days ago
 ...

Glance有两个子服务。glance-registry是系统后台 运行的Glance注册服务进程,负责处理与镜像源数据相关的RESTful请求。从Queens版本开始弃用,这里为了兼容早期版本。

4.3、使用镜像服务的API

请求一个admin项目作用域的令牌

[root@node-a ~]# curl -i   -H "Content-Type: application/json"   -d '
 { "auth": {
     "identity": {          
       "methods": ["password"],
       "password": {      
         "user": {
           "name": "admin",
           "domain": { "id": "default" },
           "password": "admin账号的密码"
         }
       }
     },
     "scope": {                     
       "project": {                  
         "name": "admin",
         "domain": { "id": "default" }
       }
     }
   }
 }'   "http://localhost:5000/v3/auth/tokens" ;

导出环境变量OS_TOKEN,并将其设置为上述操作获取的令牌ID,尝试通过Images API v1获取当前镜像列表 

[root@node-a ~]# export OS_TOKEN="上述获取到的TOKEN"
 [root@node-a ~]# curl -s -H "X-Auth-Token: $OS_TOKEN"   http://localhost:9292/v1/images

v1无法使用,要求使用Image API v2

[root@node-a ~]# curl -s -H "X-Auth-Token: $OS_TOKEN"   http://localhost:9292/v2/images

通过认证令牌向本地运行的服务(端口9292)发起请求,获取关于镜像的信息,然后通过管道将这些信息传递给Python的json.tool模块,格式化输出JSON数据。 

[root@node-a ~]# curl -s -H "X-Auth-Token: $OS_TOKEN"   http://localhost:9292/v2/images | python -mjson.tool

二、管理OpenStack镜像

1、虚拟机镜像的磁盘格式和容器格式

1.1、虚拟机镜像的磁盘格式

磁盘格式说明
.raw无结构的磁盘格式
.vhdVHD磁盘格式。该格式通用于VMware、Xen、Microsoft、VirtualBox以及其他虚拟机实例管理程序
.vhdxVHDX磁盘格式。VHD格式的增强版本,支持更大的磁盘尺寸
.vmdk另一种比较通用的虚拟机实例磁盘格式
.vdi由VirtualBox虚拟机实例监控程序和QEMU仿真器支持的磁盘格式
.iso用于光盘(如CD-ROM)数据内容的档案格式
.ploop由Virtuozzo支持,用于运行OS容器的磁盘格式
.qcow2由QEMU仿真器支持,可动态扩展,支持写时复制(Copy on Write)的磁盘格式
.aki在Glance中存储的Amazon内核格式
.ari在Glance中存储的Amazon虚拟内存盘(Ramdisk)格式
.ami在Glance中存储的Amazon虚拟机实例格式

1.2、虚拟机镜像的容器格式

容器格式说明
.bare没有容器或元数据封头的镜像
.ovf开放虚拟化格式(Open Virtualization Format)
.ova开放虚拟化设备格式(Open Virtualization Appliance Format)
.aki在Glance中存储的Amazon内核格式
.ari在Glance中存储的Amazon虚拟内存盘(Ramdisk)格式
.ami在Glance中存储的Amazon机器格式
.docker在Glance中存储的容器文件系统的Docker的tar档案
.compressed未指定压缩文件的精确格式。特定的OpenStack服务可能支持特定的格式。可以假定任何使用这种压缩容器格式镜像创建的OpenStack服务能够使用这种镜像

2、镜像的状态

3、镜像的访问权限

  • Public(公共的):可以被所有的项目使用。
  • Private(私有的):只能被镜像所有者所在的项目使用。
  • Shared(共享的):一个非共有的镜像可以共享给其他项目。
  • Protected(受保护的):镜像不能被删除。

4、镜像的元数据

  • 镜像的元数据即镜像属性,提供关于由镜像服务所存储的虚拟磁盘的信息
  • 元数据作为与镜像数据关联的镜像记录的一部分由镜像服务存储。
  • 相关的OpenStack组件和驱动通过镜像元数据与镜像服务交互。
  • 元数据定义服务提供了一个通用的API来自定义可用的键值对元数据。

5、命令行的镜像管理方法

5.1、查看镜像(语法)

 # 查看已有的镜像列表,查询结果包括镜像的ID和名称,以及状态
 openstack image list
 # 查看镜像详细信息
 openstack image show 镜像名称或ID
 # 创建镜像
 openstack image create [选项] 镜像名称
 # 更改镜像
 openstack image set  [选项]  镜像名称
 # 取消镜像更改
 openstack image unset  [选项]  镜像名称
 # 删除镜像
 openstack image delete  <镜像名称或ID>
 # 将镜像与项目关联
 openstack image add project  [--project-domain 项目所属域]  镜像名或ID  项目名或ID
 # 将镜像与项目解除关联
 openstack image remove project  [--project-domain 项目所属域]  镜像名或ID  项目名或ID

6、实操

6.1、获取镜像

FDO官网: Image resources — RDO (rdoproject.org)

OpenStack官网: CentOS Cloud images

6.2、查看镜像

普通云用户一般通过Web图形界面来使用镜像

  • 镜像列表-demo:

  • 镜像详细信息:

测试时使用命令行工具查看镜像:                                                

6.3、创建镜像

将下载的镜像通过xftp工具上传到虚拟机中的Downloads文件夹下:

本例下载的文件是CentOS-7-x86_64-GenericCloud-2003.qcow2.xz,这是一个.xz格式的压缩包,需要先解压缩才能使用。

 [root@node-a ~]# yum install xz     # 解压缩工具
 ​
 # 执行命令将下载的镜像压缩包解压缩
 [root@node-a ~]# xz -d /root/Downloads/CentOS-7-x86_64-GenericCloud-2003.qcow2.xz
 ​
 # 加载云管理员admin的环境脚本,以admin用户身份进行操作
 [root@node-a ~]# source keystonerc_admin
 ​
 # 向OpenStack云上传一个.qcow2格式的CentOS 7镜像并进行注册。
 [root@node-a ~(keystone_admin)]# openstack image create --disk-format qcow2 --container-format bare   --public --file ~/Downloads/CentOS-7-x86_64-GenericCloud-2003.qcow2 centos7
 ​
 # 查看镜像列表(可以看到新建成功
 [root@node-a ~(keystone_admin)]# openstack image list
 +--------------------------------------+---------+--------+
 | ID                                   | Name    | Status |
 +--------------------------------------+---------+--------+
 | c6cb27d8-4d93-427d-b67a-af6349dab979 | centos7 | active |
 | 3669a079-518f-4cb5-b1c1-677dad16096e | cirros  | active |
 | 190b8365-19bc-43a1-8314-e8139d5d8be6 | fedora  | active |
 +--------------------------------------+---------+--------+
 ​
 # 查看刚刚新建的centos7镜像的详细信息
 [root@node-a ~(keystone_admin)]# openstack image show centos7

6.4、管理镜像

Web图形界面管理镜像

  • 镜像管理操作界面:

  • 编辑镜像界面:

  • 编辑镜像的元数据界面:

命令行工具为镜像设置元数据

  • 创建镜像的openstack image create命令修改镜像的openstack image set命令中,通过--property选项以键值对的形式定义元数据。

 # 通过元数据设置将“fedora”镜像的架构(architecture)设置为x86_64、Hypervisor_type类型设置为qemu。
 [root@node-a ~(keystone_admin)]# openstack image set --property architecture=x86_64 --property hypervisor_type=qemu fedora
  • #OpenStack镜像通用的镜像元数据在/etc/glance/schema-image.json 配置文件中定义。

6.5、转换镜像格式

使用qemu-img工具的convert子命令将镜像从一种格式转换为另一种格式。

 # 格式
 qemu-img  convert  [-f 源格式] [-O 目标格式]  [-o 选项] 源文件路径 目标文件路径
# 将.raw格式的cirros镜像转换为.qcow2格式的镜像
[root@node-a ~]# qemu-img convert -f raw -O qcow2 ~/Downloads/cirros-0.5.1-x86_64-disk.img ~/Downloads/cirros-0.5.1-x86_64-disk.qcow2

三、基于预制镜像定制OpenStack镜像

1、cloud-init

  • cloud-init是一组Python脚本的集合,是一个能够定制云镜像的实用工具。
  • 通过修改/etc/cloud/cloud.cfg配置文件来实现
  • cloud-init一般会被包含在用于启动虚拟机实例的镜像文件中。
  • 基于镜像部署虚拟机实例,cloud-init会随虚拟机实例的启动自动启动,对虚拟机实例进行自定义的初始配置。
  • cloud-init目前支持Ubuntu、Fedora、Debian、RHEL、CentOS等主流的Linux操作系统发行版。

2、实例快照

  • 快照(Snapshots)是一种基于时间点的数据备份技术,能够记录某一个时刻的数据信息并将其保存,以便在需要时将数据恢复到之前时间点的状态
  • OpenStack中为虚拟机实例生成的快照抓取实例正在运行的磁盘的状态,其实是一个完整的镜像,由Glance镜像服务管理。

3、基于预制镜像定制镜像的方法

四、使用自动化工具制作OpenStack镜像

1、Diskimage-builder工具

  • Diskimage-builder简称DIB,是OpenStack的官方项目。
  • DIB主要用于构建适用于OpenStack平台的操作系统镜像。
  • Diskimage-builder的镜像生成原理
    • 将最初启动虚拟机实例时安装操作系统完成后的镜像保存为基础镜像。
    • 将该基础镜像挂载到本地。
    • chroot到根分区。
    • 根据不同的定制需要增加不同的模块。

    • 安装完成后保存为特定格式的镜像文件。

  • 使用Diskimage-builder首次制作某操作系统镜像时需要从网上下载该操作系统的基础镜像文件,后面再制作同一版本的镜像时,可直接使用镜像缓存文件。

2、其他自动化镜像生成工具

  • Oz:自动化生成虚拟机镜像文件的命令行工具。
  • Packer:从单个源配置构建多种平台的虚拟机镜像的工具。
  • image-bootstrap:生成可启动的虚拟机镜像的命令行工具。
  • imagefactory:可以自动构建、转换和上传镜像到不同的云提供商的新型工具。
  • KIWI:操作系统镜像构建器,支持多种Linux硬件平台、虚拟化和云系统的操作系统镜像构建。
  • virt-builder:快速构建虚拟机镜像的工具。

3、实操

3.1、安装Diskimage-builder

[root@node-a ~]# python							# 1、检查python环境
Python 2.7.5 (default, Nov 14 2023, 16:14:06) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
[root@node-a ~]# pip -y install epel-release	# 2、安装epel扩展源
[root@node-a ~]# yum -y install python-pip		# 3、安装pip工具
[root@node-a ~]# yum -y install qemu-img kpartx	# 4、安装支持环境
[root@node-a ~]# pip install --upgrade "pip < 20.0"	# 5、升级pip工具
[root@node-a ~]# pip install  "diskimage-builder==2.2.0"	# 6、安装Diskimage-builder
[root@node-a ~]# disk-image-create --version	# 检查是否安装完成,输出版本
2.2.0

3.2、使用Diskimage-builder自动构建Ubuntu操作系统镜像

  • 设置相关的环境变量

    [root@node-a ~]# export DIB_DEV_USER_USERNAME=ubuntu      #初始用户名
    [root@node-a ~]# export DIB_DEV_USER_PASSWORD=ubuntu      #初始用户密码
    [root@node-a ~]# export DIB_DEV_USER_PWDLESS_SUDO=YES   #为用户启用无密码sudo
    [root@node-a ~]# export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, OpenStack"     #cloud-init的源是ConfigDrive和OpenStack
  • 构建镜像

    [root@node-a ~]# disk-image-create -a amd64 -t qcow2 -o ubuntu.qcow2 ubuntu vm  cloud-init-datasources devuser
    ...
    2024-04-16 17:12:19.949 INFO diskimage_builder.block_device.blockdevice [-] Removing temporary dir [/tmp
    Converting image using qemu-img convert
    Image file ubuntu.qcow2 created...	# 创建完成
    ...
  • 检查所生成的镜像文件

    [root@node-a ~]# ls ubuntu.qcow2 -l
    -rw-r--r-- 1 root root 537329664 Apr 16 17:13 ubuntu.qcow2
  • 开始测试,将该镜像上传到OpenStack云中并查看

    [root@node-a ~]# source keystonerc_demo
    [root@node-a ~(keystone_demo)]# openstack image create --disk-format qcow2 --file ubuntu.qcow2 ubuntu
    ...
    # 查看,可以发现上传镜像成功
    [root@node-a ~(keystone_demo)]# openstack image list
    +--------------------------------------+---------+--------+
    | ID                                   | Name    | Status |
    +--------------------------------------+---------+--------+
    | c6cb27d8-4d93-427d-b67a-af6349dab979 | centos7 | active |
    | 3669a079-518f-4cb5-b1c1-677dad16096e | cirros  | active |
    | 190b8365-19bc-43a1-8314-e8139d5d8be6 | fedora  | active |
    | bfe8eb08-3da7-4af7-a7ed-b13fa2978e90 | ubuntu  | active |
    +--------------------------------------+---------+--------+

五、手动创建OpenStack镜像

手动制作镜像是最符合实际使用需求的,需要定制什么样的镜像都可以由自己来决定,只是过程比较烦琐。这种方式仅适合开发人员,或小规模的应用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五步教你正确申请免费SSL证书

在当今数字化时代&#xff0c;保护网站数据安全和提升用户信任至关重要&#xff0c;而实现这一目标的有效途径之一便是为网站部署SSL&#xff08;Secure Sockets Layer&#xff09;证书。SSL证书能够加密网站与用户之间的通信&#xff0c;确保敏感信息不被第三方窃取。幸运的是…

1.8.5 卷积神经网络近年来在结构设计上的主要发展和变迁——Inception-v4 和 Inception-ResNet

1.8.5 卷积神经网络近年来在结构设计上的主要发展和变迁——Inception-v4 和 Inception-ResNet 前情回顾&#xff1a; 1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet 1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet 1.8.3 卷积神经网络近…

一篇安装配置ubuntu22.04(步骤详细,配置成功)

一篇配置ubuntu22.04(步骤详细&#xff0c;配置成功) 官网下载相应的镜像 vitualbox安装ubuntu 新建虚拟机 第一步 第二步 第三步、按需分配内存、处理器个数、磁盘大小 第四步、一直下一步直至完成 配置虚拟机网络 第一步、先停止虚拟机 第二步、设置虚拟机网络 正常启…

浅谈Java JVM

Java虚拟机&#xff08;Java Virtual Machine&#xff0c;简称JVM&#xff09;是Java语言的核心组成部分&#xff0c;它是一个抽象的计算机&#xff0c;负责执行Java字节码指令。JVM是Java平台无关性的基石&#xff0c;它为Java代码提供了一个标准的运行环境&#xff0c;使Java…

stable diffusion--小白学习步骤

1.看一下Unet网络的讲解_哔哩哔哩_bilibili&#xff0c;了解Unet网络 2.看一下【生成式AI】Diffusion Model 原理剖析 (1/4)_哔哩哔哩_bilibili&#xff0c;起码要看前3/6个视频 3.看一下超详细的扩散模型&#xff08;Diffusion Models&#xff09;原理代码 - 知乎 (zhihu.co…

关于Ubuntu Server root用户的坑

1 ubuntu server root 用户 ubuntu server 安装过程中会有这个界面&#xff0c;这个界面会比较烦人&#xff0c;让你必须创建一个非root用户&#xff0c;然后只能用这个用户登录&#xff0c;登录上去之后又没有root权限。 输入上一步创建的用户名和密码 登录成功之后&#xff0…

VS Code 前端个人常用扩展分享

这里总结一下 VS Code 里自己开发常用的一些扩展&#xff0c;分三类&#xff1a;基础的&#xff0c;进阶的&#xff0c;工作相关的 一、基础类 首先就是代码拼写检查&#xff0c;引入&#xff0c;辅助开发的一些扩展 语言包 Chinese (Simplified) (简体中文) Language Pack…

重生奇迹mu恶魔来袭副本

在游戏重生奇迹mu中&#xff0c;恶魔来袭副本是玩家能够组队通过的副本。但是因为手游组队的不方便性&#xff0c;部分玩家对其还是非常苦手。而今天&#xff0c;我们就给大家讲解一下这个游戏的双人通关攻略。 1、挂机找怪手动输出 (1)对于普通剧情副本而言&#xff0c;挂机…

HA-Maleimide-HA马来酰亚胺修饰透明质酸 水凝胶递送药物

HA-Maleimide-HA马来酰亚胺修饰透明质酸 水凝胶递送药物 【中文名称】马来酰亚胺修饰透明质酸 【英文名称】HA-Maleimide 【分 子 量】3k/5k/7k/10k/50k/100k/200k/300k/500k/1000k...... 【结 构 式】 【品 牌】碳水科技&#xff08;Tanshtech&#xff09; 【纯 度…

模型微调与迁移学习:实现领域适应性评估

源自&#xff1a;大数据AI人工智能 作者&#xff1a;禅与计算机程序设计艺术 1. 背景介绍 1.1 机器学习的挑战 在机器学习领域&#xff0c;我们通常面临着许多挑战&#xff0c;如数据量不足、数据不平衡、模型泛化能力不足等。为了解决这些问题&#xff0c;研究人员提出了许…

【结构型模式】组合模式

一、组合模式概述 组合模式的定义与意图&#xff1a;将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。&#xff08;对象结构型&#xff09; 组合模式分析&#xff1a; 1.当容器对象的某一个方法被调用时&#xff0c;将遍…

鸿蒙入门02-首次安装和配置

注&#xff1a;还没有安装编辑器&#xff08; deveco studio &#xff09;的小伙伴请看鸿蒙入门01-下载和安装-CSDN博客 首次安装配置 编辑器&#xff08; deveco studio &#xff09;安装完毕以后需要进入配置界面进行相关配置配置完毕以后才可以正常使用 环境配置&#xf…

js处理给标题添加搜索词高亮,标题不包含内容包含的拼接内容包含字样

项目场景&#xff1a; 在项目中我们经常会写搜索&#xff0c;搜索后显示的数据要么标题包含搜索词要么内容包含搜索词&#xff0c;所以我们需要写出下面的效果! 问题描述 数据是后台给的&#xff0c;标题内容是文字样式&#xff0c;所以我们需要在请求完数据后&#xff0c;给…

Hyper-v 新建 Windows 虚拟机卡在“Press any key to boot from CD or DVD...,无法按下任何按键

Hyper-v 新建 Windows 虚拟机卡在“Press any key to boot from CD or DVD…&#xff0c;无法按下任何按键 在显示这个界面之后点击启动&#xff0c;之后立刻狂按F2&#xff0c; 然后就能进去了

Jenkins打包app并通过openssh上传到服务器

1、下载安装openssh 网上很多教程&#xff0c;包括开端口的&#xff0c;可以搜下 2、配置openssh根目录 进入C:\ProgramData\ssh打开文件sshd_config&#xff0c;添加配置ChrootDirectory D:\wxs\soft&#xff0c;想改端口的也在这个文件 3、安装Jenkins 参考上一篇 4、新…

Covalent Network(CQT)宣布推出面向 Cronos 生态的捐赠计划与 API 积分,为 Web3 创新赋能

为了促进 Web3 领域的创新&#xff0c;Covalent Network&#xff08;CQT&#xff09;宣布将其捐赠计划向 Cronos 生态系统中的开发者拓展。这一战略性举措&#xff0c;旨在通过向 Cronos 网络中基于 Covalent Network&#xff08;CQT&#xff09;API 构建的项目提供支持和资源&…

jenkins通过pipeline部署springboot项目

部署方案&#xff1a; 1、springboot项目不保存部署的pipeline或dockerfile构建脚本等与部署相关的问文件&#xff0c;业务项目只需关心业务&#xff0c;能够正常构建为jar包即可 2、新建一个代码仓库&#xff0c;用于保存项目需要构建的Jenkinsfile 3、jenkins配置pipeline地址…

一文了解OCI标准、runC、docker、contianerd、CRI的关系

docker和contanerd都是流行的容器运行时&#xff08;container runtime&#xff09;&#xff1b;想讲清楚他们两之间的关系&#xff0c;让我们先从runC和OCI规范说起。 一、OCI标准和runC 1、OCI&#xff08;open container initiative&#xff09; OCI是容器标准化组织为了…

【C++】力扣OJ题:构建杨辉三角

Hello everybody!今天给大家介绍一道我认为比较经典的编程练习题&#xff0c;之所以介绍它是因为这道题涉及到二维数组的构建&#xff0c;如果用C语言动态构建二维数组是比较麻烦的&#xff0c;而用C中STL的vector<vector<int>>,就可以立马构建出来&#xff0c;这也…

【前端】2. HTML综合案例

1. 展示简历信息 代码如下&#xff1a;可自行发挥 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>个…