当前位置: 首页 > news >正文

基于openEuler22.09部署OpenStack Yoga云平台(一)

OpenStack Yoga部署

安装OpenStack

一、基础准备

基于OpenStack经典的三节点环境进行部署,三个节点分别是控制节点(controller)、计算节点(compute)、存储节点(storage),其中存储节点一般只部署存储服务,在资源有限的情况下,可以不单独部署该节点,把存储节点上的服务部署到计算机节点即可。

首先准备三个openEuler22.09环境,节点规划如下:

虚拟机版本

主机名

IP地址

openEuler22.09

Controller

192.168.110.150

openEuler22.09

Compute

192.168.110.151

openEuler22.09

Storage

192.168.110.152

1.1yum源配置:

打开/etc/yum.repos.d/openEuler.repo文件,检查[EPOL]源是否存在,若不存在,则添加如下内容

[root@controller ~]# vi /etc/yum.repos.d/openEuler.repo

[EPOL]

name=EPOL

baseurl=https://archives.openeuler.openatom.cn/openEuler-22.09/EPOL/main/$basearch/

enabled=1

gpgcheck=1

gpgkey=https://archives.openeuler.openatom.cn/openEuler-22.09/OS/$basearch/RPM-GPG-KEY-openEuler

更新yum源

[root@controller ~]# yum update

若在更新yum源时出现如下图所示问题,则需要更新仓库URL

将 /etc/yum.repos.d/openEuler.repo文件下的URL地址替换成

https://archives.openeuler.openatom.cn/openEuler-22.09/

更换完成之后,保存退出。

1.2修改主机映射

修改每个节点的/etc/hosts文件,新增如下内容:

192.168.110.150 controller

192.168.110.151 compute

192.168.110.152 storage

1.3设置时间同步

(1)controller节点:

安装服务:

[root@controller ~]# dnf install chrony

修改/etc/chrony.conf配置文件,新增如下内容:

allow 192.168.110.0/24

#表示允许哪些IP从本节点同步时钟

重启服务

[root@controller ~]# systemctl restart chronyd

(2)其他节点:

安装服务:

[root@compute ~]# dnf install chrony

[root@storage ~]# dnf install chrony

修改/etc/chrony.conf配置文件,新增一行;同时把 pool pool.ntp.org iburst

 这一行注释掉,表示不从公网同步时钟。

server 192.168.110.150 iburst

表示从这个机器获取时间。

重启服务:

[root@compute ~]# systemctl restart chronyd

[root@storage ~]# systemctl restart chronyd

配置完成后,在其他非controller节点执行chronyc sources,返回结果类似如下内容,表示成功的从controller同步时钟

1.4安装数据库

数据库安装在控制节点,这里推荐使用MariaDB。

(1)安装软件包

[root@controller ~]# dnf install mysql-config mariadb mariadb-server python3-PyMySQL

(2)新增配置文件/etc/my.cnf.d/openstack.cnf,内容如下:

[mysqld]

bind-address = 192.168.110.150   #本机ip地址

default-storage-engine = innodb

innodb_file_per_table = on

max_connections = 4096

collation-server = utf8_general_ci

character-set-server = utf8

(3)启动服务器

[root@controller ~]# systemctl start mariadb

(4)初始化数据库

[root@controller ~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB

      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current

password for the root user. If you've just installed MariaDB, and

haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):  #这里输入密码,由于我们初始化DB,所以直接回车即可

OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody

can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] y

Enabled successfully!

Reloading privilege tables..

 ... Success!

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] y   #输入y,修改密码

New password:                   #密码一定要记住!!!

Re-enter new password:

Password updated successfully!

Reloading privilege tables..

 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone

to log into MariaDB without having to have a user account created for

them.  This is intended only for testing, and to make the installation

go a bit smoother.  You should remove them before moving into a

production environment.

Remove anonymous users? [Y/n] y     #输入y,删除匿名用户

 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This

ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] n     #输入y,关闭root远程登录权限

 ... skipping.

By default, MariaDB comes with a database named 'test' that anyone can

access.  This is also intended only for testing, and should be removed

before moving into a production environment.

Remove test database and access to it? [Y/n] y     #输入y,删除test数据库

 - Dropping test database...

 ... Success!

 - Removing privileges on test database...

 ... Success!

Reloading the privilege tables will ensure that all changes made so far

will take effect immediately.

Reload privilege tables now? [Y/n] y   #输入y,重新加载

 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB

installation should now be secure.

Thanks for using MariaDB!

(5)验证是否可以登录mariadb

[root@controller ~]# mysql -uroot -p

Enter password:

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 12

Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

1.5安装消息列队

消息列队安装在控制节点,这里推荐使用rabbitmq。

(1)安装软件包

[root@controller ~]# dnf install rabbitmq-server

(2)启动服务

[root@controller ~]# systemctl start rabbitmq-server

(3)配置OpenStack用户,RABBIT_PASS是OpenStack服务登录消息队里的密码,需要和后面各个服务的配置保持一致

[root@controller ~]# rabbitmqctl add_user openstack RABBIT_PASS

Adding user "openstack" ...

Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.

[root@controller ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"

Setting permissions for user "openstack" in vhost "/" ...

1.6安装缓存服务

缓存列队安装在控制节点,这里推荐使用Memcached。

(1)安装软件包

[root@controller ~]# dnf install memcached python3-memcached

(2)修改配置文件/etc/sysconfig/memcached,

PORT="11211"

USER="memcached"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS="-l 127.0.0.1,::1,controller"

(3)启动服务

[root@controller ~]# systemctl start memcached

二、部署服务

2.1Keystone

Keystone是OpenStack提供的鉴权服务,是整个OpenStack的入口,提供了租户隔离、用户认证、服务发现等功能,必须安装。

(1)创建keystone数据库并授权

MariaDB [(none)]> CREATE DATABASE keystone;

Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]>  GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \

    -> IDENTIFIED BY 'KEYSTONE_DBPASS';

Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]>  GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \

    -> IDENTIFIED BY 'KEYSTONE_DBPASS';

Query OK, 0 rows affected (0.001 sec)

#替换'KEYSTONE_DBPASS',为keystone数据库设置的密码

(2)安装软件包

[root@controller ~]# dnf install openstack-keystone httpd mod_wsgi

(3)配置keystone相关配置

[database]

connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

[token]

provider = fernet

#[database]部分,配置数据库入口

#[token]部分,配置token provider

(4)同步数据库

[root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone

(5)初始化Fernet密钥仓库

[root@controller ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone

[root@controller ~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

(6)启动服务

[root@controller ~]# keystone-manage bootstrap --bootstrap-password ADMIN_PASS \

> --bootstrap-admin-url http://controller:5000/v3/ \

> --bootstrap-internal-url http://controller:5000/v3/ \

> --bootstrap-public-url http://controller:5000/v3/ \

> --bootstrap-region-id RegionOne

#ADMIN_PASS为admin用户设置的密码

(7)配置Apache HTTP Server

打开httpd.conf并配置(/etc/httpd/conf/httpd.conf)

#修改以下项,如果没有则新添加

ServerName controller

创建软链接

[root@controller ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

(8)启动Apache HTTP服务

[root@controller ~]# systemctl enable httpd

Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

[root@controller ~]# systemctl start httpd

(9)创建环境变量配置

[root@controller ~]# cat << EOF >> ~/.admin-openrc

export OS_PROJECT_DOMAIN_NAME=Default

export OS_USER_DOMAIN_NAME=Default

export OS_PROJECT_NAME=admin

export OS_USERNAME=admin

export OS_PASSWORD=ADMIN_PASS

export OS_AUTH_URL=http://controller:5000/v3

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2

EOF

#替换ADMIN_PASS为admin用户的密码

(10)依次创建domain,projects,users,roles

安装python3-openstackclient

[root@controller ~]# dnf install python3-openstackclient

导入环境变量

[root@controller ~]# source ~/.admin-openrc

创建protect service,其中domain default在keystone-manage bootstrap时已创建

[root@controller ~]# openstack domain create --description "An Example Domain" example

[root@controller ~]# openstack project create --domain default --description "Service Project" service

创建(non-admin)project myproject,user myuser和role myrole,为myproject和myuser添加角色myrole

[root@controller ~]# openstack project create --domain default --description "Demo Project" myproject

[root@controller ~]# openstack user create --domain default --password-prompt myuser

[root@controller ~]# openstack role create myrole

[root@controller ~]# openstack role add --project myproject --user myuser myrole

验证

取消临时环境变量OS_AUTH_URL和OS_PASSWORD:

[root@controller ~]# source ~/.admin-openrc

[root@controller ~]# unset OS_AUTH_URL OS_PASSWORD

为admin用户请求token:

[root@controller ~]# openstack --os-auth-url http://controller:5000/v3 \

> --os-project-domain-name Default --os-user-domain-name Default \

> --os-project-name admin --os-username admin token issue

为myuser用户请求token:

[root@controller ~]# openstack --os-auth-url http://controller:5000/v3 \

> --os-project-domain-name Default --os-user-domain-name Default \

> --os-project-name myproject --os-username myuser token issue

2.2Glance

Glance是OpenStack提供的镜像服务,负责虚拟机、裸机镜像的上传与下载,必须安装

Controller节点

(1)创建glance数据库并授权:

MariaDB [(none)]> CREATE DATABASE glance;

Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \

    -> IDENTIFIED BY 'GLANCE_PASS';

Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \

    -> IDENTIFIED BY 'GLANCE_DBPASS';

Query OK, 0 rows affected (0.001 sec)

#替换GLANCE_PASS为glance数据库设置密码

(2)初始化glance资源对象

导入环境变量

[root@controller ~]# source ~/.admin-openrc

创建用户时,命令行会提示输入密码,请输入自定义的密码,下文涉及到GLANCE_PASS的地方替换成该密码即可。

[root@controller ~]# openstack user create --domain default --password-prompt glance

User Password:

Repeat User Password:

(3)添加glance用户到service project并指定admin角色:

[root@controller ~]# openstack role add --project service --user glance admin

(4)创建glance服务实体:

[root@controller ~]# openstack service create --name glance --description "OpenStack Image" image

(5)创建glance API服务:

[root@controller ~]# openstack endpoint create --region RegionOne image public http://controller:9292

[root@controller ~]# openstack endpoint create --region RegionOne image internal http://controller:9292

[root@controller ~]# openstack endpoint create --region RegionOne image admin http://controller:9292

(6)安装软件包

[root@controller ~]# dnf install openstack-glance

(7)修改glance配置文件

[database]

connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance

[keystone_authtoken]

www_authenticate_uri  = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = glance

password = GLANCE_PASS

[paste_deploy]

flavor = keystone

[glance_store]

stores = file,http

default_store = file

filesystem_store_datadir = /var/lib/glance/images/

#[database]部分,配置数据库入口

#[keystone_authtoken] [paste_deploy]部分,配置身份认证服务入口

#[glance_store]部分,配置本地文件系统存储和镜像文件的位置

(8)同步数据库

[root@controller ~]# su -s /bin/sh -c "glance-manage db_sync" glance

(9)启动服务

[root@controller ~]# systemctl enable openstack-glance-api.service

Created symlink /etc/systemd/system/multi-user.target.wants/openstack-glance-api.service → /usr/lib/systemd/system/openstack-glance-api.service.

[root@controller ~]# systemctl start openstack-glance-api.service

(10)验证

导入环境变量

[root@controller ~]#  source ~/.admin-openrc

下载镜像

X86镜像下载:

[root@controller ~]# wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img

Arm镜像下载:

[root@controller ~]# wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-aarch64-disk.img

向Image服务上传镜像

[root@controller ~]# openstack image create --disk-format qcow2 --container-format bare \

                    --file cirros-0.4.0-x86_64-disk.img --public cirros

确认镜像上传并验证属性

[root@controller ~]# openstack image list

2.3Placement

Placement是OpenStack提供的资源调度组件,一般不面向用户,由Nova等组件调用,安装在控制节点。

安装、配置placement服务前,需要先创建相应的数据库、服务凭证和API endpoints。

(1)创建数据库

使用root用户访问数据库服务:

[root@controller ~]# mysql -uroot -p

创建placement数据库并授权

MariaDB [(none)]> CREATE DATABASE placement;

Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]>  GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' \

    ->   IDENTIFIED BY 'PLACEMENT_PASS';

Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]>  GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' \

    ->   IDENTIFIED BY 'PLACEMENT_DBPASS';

Query OK, 0 rows affected (0.001 sec)

#替换PLACEMENT_DBPASS为placement数据库访问密码

(2)配置用户和Endpoints

Source admin凭证,以获取admin命令行权限:

[root@controller ~]# source ~/.admin-openrc

创建placement用户并设置用户密码

[root@controller ~]# openstack user create --domain default --password-prompt placement

User Password:

Repeat User Password:

添加placement用户到service project并指定admin角色

[root@controller ~]# openstack role add --project service --user placement admin

创建placement服务实体

[root@controller ~]# openstack service create --name placement \

  --description "Placement API" placement

创建placement API服务endpoints

[root@controller ~]# openstack endpoint create --region RegionOne \

  placement public http://controller:8778

[root@controller ~]# openstack endpoint create --region RegionOne \

  placement internal http://controller:8778

[root@controller ~]# openstack endpoint create --region RegionOne \

  placement admin http://controller:8778

(3)安装及配置组件

安装软件包

[root@controller ~]# dnf install openstack-placement-api

编辑/etc/placement/placement.conf配置文件,完成如下操作:

在[placement_database]部分,配置数据库入口:

[placement_database]

connection = mysql+pymysql://placement:PLACEMENT_DBPASS@controller/placement

在[api]和[keystone_authtoken]部分,配置身份认证服务入口

[api]

auth_strategy = keystone

[keystone_authtoken]

auth_url = http://controller:5000/v3

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = placement

password = PLACEMENT_PASS

数据库同步,填充placement数据库

[root@controller ~]# su -s /bin/sh -c "placement-manage db sync" placement

(4)重启服务

[root@controller ~]# systemctl restart httpd

(5)验证

Source admin凭证,以获取admin命令行权限

[root@controller ~]# source ~/.admin-openrc

执行状态检查

[root@controller ~]# placement-status upgrade check

这里可以看到Policy File JSON to YAML Migration 的结果为Failure。这是因为在placement中,JSON格式的Policy文件从Wallaby版本开始已处于deprecated状态。可以参考提示,使用oslopolicy-convert-json-to-yaml工具将现有的JSON格式Policy文件转化为YAML格式。

[root@controller ~]# oslopolicy-convert-json-to-yaml  --namespace placement \

> --policy-file /etc/placement/policy.json \

>  --output-file /etc/placement/policy.yaml

[root@controller ~]# mv /etc/placement/policy.json{,.bak}

注:当前环境中此问题可忽略,不影响运行

针对placement API运行命令

安装osc-placement插件

[root@controller ~]# dnf install python3-osc-placement

列出可用的资源类别及特性:

[root@controller ~]# openstack --os-placement-api-version 1.2 resource class list --sort-column name

[root@controller ~]# openstack --os-placement-api-version 1.6 trait list --sort-column name

2.4Nova

Nova是OpenStack的计算服务,负责虚拟机的创建、发送等功能。

Controller节点

在控制节点执行以下操作

(1)创建数据库

使用root用户访问数据库服务

[root@controller ~]# mysql -u root -p

创建nova_api、nova和nova_cell0数据库

MariaDB [(none)]> CREATE DATABASE nova_api;

Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> CREATE DATABASE nova;

Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> CREATE DATABASE nova_cell0;

Query OK, 1 row affected (0.001 sec)

授权数据库访问

MariaDB [(none)]>  GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \

    ->   IDENTIFIED BY 'NOVA_DBPASS';

Query OK, 0 rows affected (0.003 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \

    ->   IDENTIFIED BY 'NOVA_DBPASS';

Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \

    ->   IDENTIFIED BY 'NOVA_DBPASS';

Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]>  GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \

    ->   IDENTIFIED BY 'NOVA_DBPASS';

Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' \

    ->   IDENTIFIED BY 'NOVA_DBPASS';

Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]>  GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \

    ->   IDENTIFIED BY 'NOVA_DBPASS';

Query OK, 0 rows affected (0.001 sec)

(2)配置用户和endpoints

Source admin凭证,以获取admin命令行权限

[root@controller ~]# source ~/.admin-openrc

创建nova用户并设置用户密码

[root@controller ~]# openstack user create --domain default --password-prompt nova

User Password:

Repeat User Password:

添加nova用户到service project并指定admin角色

[root@controller ~]# openstack role add --project service --user nova admin

创建nova服务实体

[root@controller ~]# openstack service create --name nova \

  --description "OpenStack Compute" compute

创建Nova API服务endpoints

[root@controller ~]# openstack endpoint create --region RegionOne \

  compute public http://controller:8774/v2.1

[root@controller ~]# openstack endpoint create --region RegionOne \

  compute internal http://controller:8774/v2.1

[root@controller ~]# openstack endpoint create --region RegionOne \

  compute admin http://controller:8774/v2.1

(3)安装及配置组件

安装软件包

[root@controller ~]# dnf install openstack-nova-api openstack-nova-conductor \

  openstack-nova-novncproxy openstack-nova-scheduler

编辑/etc/nova/nova.conf配置文件,完成如下操作:

在[default]部分,启用计算和元数据的API,配置RebbitMQ消息队列入口,使用controller节点管理ip配置my_ip,显示定义log_dir:

[DEFAULT]

enabled_apis = osapi_compute,metadata

transport_url = rabbit://openstack:RABBIT_PASS@controller:5672/

my_ip = 192.168.110.150

log_dir = /var/log/nova

在[api_database]和[database]部分,配置数据库入口:

[api_database]

connection = mysql+pymysql://nova:RABBIT_DBPASS@controller/nova_api

[database]

connection = mysql+pymysql://nova:RABBIT_DBPASS@controller/nova

在[api]和[keystone_authtoken]部分,配置身份认证服务入口:

[api]

auth_strategy = keystone

[keystone_authtoken]

auth_url = http://controller:5000/v3

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = nova

password = NOVA_PASS

在[vnc]部分,启用并配置远程控制台入口:

[vnc]

enabled = true

server_listen = $my_ip

server_proxyclient_address = $my_ip

在[glance]部分,配置镜像服务API的地址:

[glance]

api_servers = http://controller:9292

在[oslo_concurrency]部分,配置lock path:

[oslo_concurrency]

lock_path = /var/lib/nova/tmp

在[placement]部分,配置placement服务的入口:

[placement]

region_name = RegionOne

project_domain_name = Default

project_name = service

auth_type = password

user_domain_name = Default

auth_url = http://controller:5000/v3

username = placement

password = PLACEMENT_PASS

数据库同步:

同步nova_api数据库:

[root@controller ~]# su -s /bin/sh -c "nova-manage api_db sync" nova

注册cell0数据库;

[root@controller ~]# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova

创建cell1 cell:

[root@controller ~]# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova

同步nova数据库:

[root@controller ~]# su -s /bin/sh -c "nova-manage db sync" nova

验证cell0和cell1注册正确:

[root@controller ~]# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova

(4)启动服务

[root@controller ~]# systemctl enable \

> openstack-nova-api.service \

> openstack-nova-scheduler.service \

>  openstack-nova-conductor.service \

>  openstack-nova-novncproxy.service

[root@controller ~]# systemctl start \

>  openstack-nova-api.service \

>  openstack-nova-scheduler.service \

>  openstack-nova-conductor.service \

>   openstack-nova-novncproxy.service

Compute节点

在计算节点执行以下操作

(1)安装软件包

[root@compute ~]# dnf install openstack-nova-compute

(2)编辑/etc/nova/nova.conf配置文件

在[default]部分,启用计算和元数据的API,配置RabbitMQ消息队列入口,使用Compute节点管理ip配置my_ip,显式定义compute_driver、instances_path、log_dir:

[DEFAULT]

enabled_apis = osapi_compute,metadata

transport_url = rabbit://openstack:RABBIT_PASS@controller:5672/

my_ip = 192.168.110.151

compute_driver = libvirt.LibvirtDriver

instances_path = /var/lib/nova/instances

log_dir = /var/log/nova

在[api]和[keystone_authtoken]部分,配置身份认证服务入口:

[api]

auth_strategy = keystone

[keystone_authtoken]

auth_url = http://controller:5000/v3

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = nova

password = NOVA_PASS

在[vnc]部分,启用并配置远程控制台入口:

[vnc]

enabled = true

server_listen = $my_ip

server_proxyclient_address = $my_ip

novncproxy_base_url = http://controller:6080/vnc_auto.html

在[glance]部分,配置镜像服务API的地址;

[glance]

api_servers = http://controller:9292

在[oslo_concurrency]部分,配置lock path:

[oslo_concurrency]

lock_path = /var/lib/nova/tmp

[plancement]部分,配置placement服务的入口:

[placement]

region_name = RegionOne

project_domain_name = Default

project_name = service

auth_type = password

user_domain_name = Default

auth_url = http://controller:5000/v3

username = placement

password = PLACEMENT_PASS

确认计算节点是否支持虚拟机硬件加速(X86_64)

处理器为X86_64架构时,可通过运行如下命令确认是否支持硬件加速:

[root@compute ~]# egrep -c '(vmx|svm)' /proc/cpuinfo

0

如果返回值为0,则不支持硬件加速,需要配置libvirt使用QEMU而不是默认的KVM。编辑/etc/nova/nova.conf的[libvirt]部分:

[libvirt]

virt_type = qemu

如果返回值为1或更大的值,则支持硬件加速,不需要进行额外的配置

(4)确认计算节点是否支持虚拟机硬件加速(arm64)

处理器为arm64架构时,可通过运行如下命令确认是否支持硬件加速:

[root@compute ~]# virt-host-validate

显示FAIL时,表示不支持硬件加速,需要配置libvirt使用QEMU而不是默认的KVM:

编辑/etc/nova/nova.conf的[libvirt]部分:

[libvirt]

virt_type = qemu

显示PASS时,表示支持硬件加速,不需要进行额外的配置

(5)配置qemu(仅arm64)

仅当处理器为arm64架构时需要执行此操作

编辑/etc/libvirt/qemu.conf:

nvram = ["/usr/share/AAVMF/AAVMF_CODE.fd: \

         /usr/share/AAVMF/AAVMF_VARS.fd", \

         "/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw: \

         /usr/share/edk2/aarch64/vars-template-pflash.raw"]

编辑/etc/qemu/firmware/edk2-aarch64.json

{

    "description": "UEFI firmware for ARM64 virtual machines",

    "interface-types": [

        "uefi"

    ],

    "mapping": {

        "device": "flash",

        "executable": {

            "filename": "/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw",

            "format": "raw"

        },

        "nvram-template": {

            "filename": "/usr/share/edk2/aarch64/vars-template-pflash.raw",

            "format": "raw"

        }

    },

    "targets": [

        {

            "architecture": "aarch64",

            "machines": [

                "virt-*"

            ]

        }

    ],

    "features": [

    ],

    "tags": [

    ]

}

(6)启动服务

[root@compute ~]# systemctl enable libvirtd.service openstack-nova-compute.service

Created symlink /etc/systemd/system/multi-user.target.wants/openstack-nova-compute.service → /usr/lib/systemd/system/openstack-nova-compute.service.

[root@compute ~]# systemctl start libvirtd.service openstack-nova-compute.service

Controller节点

在控制节点执行以下操作

(1)添加计算节点到OpenStack集群

Source admin凭证,以获取admin命令行权限:

[root@controller ~]# source ~/.admin-openrc

确认nova-compute服务已识别到数据库中

[root@controller ~]# openstack compute service list --service nova-compute

发现计算节点,将计算节点添加到cell数据库:

[root@controller ~]# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova

验证

列出服务组件,验证每个流程都成功起动和注册:

[root@controller ~]# openstack compute service list

列出身份服务中的API端点,验证与身份服务的连接;

[root@controller ~]# openstack catalog list

列出镜像服务中的镜像,验证与镜像服务的连接:

[root@controller ~]# openstack image list

检查cells是否运作成功,以及其他必要条件是否已具备

[root@controller ~]# nova-status upgrade check

2.5 Neutron

Neutron 是 OpenStack 中的网络服务组件,负责为 OpenStack 环境提供网络连接和 IP 地址管理。它允许用户创建和管理虚拟网络、子网、路由器、安全组等网络资源,从而为虚拟机(VM)提供网络功能。

Controller节点

(1)创建keystone数据库并赋权

MariaDB [(none)]>  CREATE DATABASE neutron;

Query OK, 1 row affected (0.008 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'NEUTRON_DBPASS';

Query OK, 0 rows affected (0.012 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS';

Query OK, 0 rows affected (0.001 sec)

(2)设置环境变量

[root@controller ~]# source ~/.admin-openrc

(3)创建用户和服务,并记住创建neutron用户时输入的密码,用于配置NEUTRON_PASS:

[root@controller ~]#  openstack user create --domain default --password-prompt neutron

User Password:

Repeat User Password:

[root@controller ~]#  openstack role add --project service --user neutron admin

[root@controller ~]# openstack service create --name neutron --description "OpenStack Networking" network

(4)部署Neutron API服务

[root@controller ~]# openstack endpoint create --region RegionOne network public http://controller:9696

[root@controller ~]# openstack endpoint create --region RegionOne network internal http://controller:9696

[root@controller ~]# openstack endpoint create --region RegionOne network admin http://controller:9696

(5)安装软件包

[root@controller ~]# dnf install -y openstack-neutron openstack-neutron-linuxbridge ebtables ipset openstack-neutron-ml2

(6)配置Neutron

[database]

connection = mysql+pymysql://neutron:NEUTRON_PASS@controller/neutron

[DEFAULT]

core_plugin = ml2

service_plugins = router

allow_overlapping_ips = true

transport_url = rabbit://openstack:RABBIT_PASS@controller

auth_strategy = keystone

notify_nova_on_port_status_changes = true

notify_nova_on_port_data_changes = true

[keystone_authtoken]

www_authenticate_uri = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = neutron

password = NEUTRON_PASS

[nova]

auth_url = http://controller:5000

auth_type = password

project_domain_name = Default

user_domain_name = Default

region_name = RegionOne

project_name = service

username = nova

password = NOVA_PASS

[oslo_concurrency]

lock_path = /var/lib/neutron/tmp

配置ML2,ML2,具体配置可以根据需求自行修改,这里使用的是provider network + linuxbridge**

修改/etc/neutron/plugins/ml2/ml2_conf.ini

[ml2]

type_drivers = flat,vlan,vxlan

tenant_network_types = vxlan

mechanism_drivers = linuxbridge,l2population

extension_drivers = port_security

[ml2_type_flat]

flat_networks = provider

[ml2_type_vxlan]

vni_ranges = 1:1000

[securitygroup]

enable_ipset = true

修改/etc/neutron/plugins/ml2/linuxbridge_agent.ini

[linux_bridge]

physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME

[vxlan]

enable_vxlan = true

local_ip = OVERLAY_INTERFACE_IP_ADDRESS

l2_population = true

[securitygroup]

enable_security_group = true

firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

配置Layer-3代理

修改/etc/neutron/l3_agent.ini

[DEFAULT]

interface_driver = linuxbridge

配置DHCP代理 修改/etc/neutron/dhcp_agent.ini

[DEFAULT]

interface_driver = linuxbridge

dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq

enable_isolated_metadata = true

配置metadata代理

修改/etc/neutron/metadata_agent.ini

[DEFAULT]

nova_metadata_host = controller

metadata_proxy_shared_secret = METADATA_SECRET

配置nova服务使用neutron,修改/etc/nova/nova.conf

[neutron]

auth_url = http://controller:5000

auth_type = password

project_domain_name = default

user_domain_name = default

region_name = RegionOne

project_name = service

username = neutron

password = Ywj035916!

service_metadata_proxy = true

metadata_proxy_shared_secret = METADATA_SECRET

创建/etc/neutron/plugin.ini的符号链接

[root@controller ~]# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

(7)同步数据库

[root@controller ~]# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron

(8)重启nova API服务

[root@controller ~]# systemctl restart openstack-nova-api

(9)启动网络连接

[root@controller ~]# systemctl enable neutron-server.service neutron-linuxbridge-agent.service \

> neutron-dhcp-agent.service neutron-metadata-agent.service neutron-l3-agent.service

[root@controller ~]# systemctl start neutron-server.service neutron-linuxbridge-agent.service \

> neutron-dhcp-agent.service neutron-metadata-agent.service neutron-l3-agent.service

Compute节点

(1)安装软件包

[root@compute ~]# dnf install openstack-neutron-linuxbridge ebtables ipset -y

(2)配置Neutron

修改/etc/neutron/neutron.conf

[DEFAULT]

transport_url = rabbit://openstack:RABBIT_PASS@controller

auth_strategy = keystone

[keystone_authtoken]

www_authenticate_uri = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = neutron

password = NEUTRON_PASS

[oslo_concurrency]

lock_path = /var/lib/neutron/tmp

修改/etc/neutron/plugins/ml2/linuxbridge_agent.ini

[linux_bridge]

physical_interface_mappings = provider:ens33

[vxlan]

enable_vxlan = true

local_ip = 192.168.110.151

l2_population = true

[securitygroup]

enable_security_group = true

firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

配置nova compute服务使用neutron,修改/etc/nova/nova.conf

[neutron]

auth_url = http://controller:5000

auth_type = password

project_domain_name = default

user_domain_name = default

region_name = RegionOne

project_name = service

username = neutron

password = NEUTRON_PASS

(3)重启nova-compute服务

[root@compute ~]# systemctl restart openstack-nova-compute.service

(4)启动Neutron linuxbridge agent服务

[root@compute ~]# systemctl enable neutron-linuxbridge-agent

Created symlink /etc/systemd/system/multi-user.target.wants/neutron-linuxbridge-agent.service → /usr/lib/systemd/system/neutron-linuxbridge-agent.service.

[root@compute ~]# systemctl start neutron-linuxbridge-agent

2.6 Cinder

"Cinder" 是 OpenStack 项目中的一个核心组件,负责块存储(Block Storage)服务。它是 OpenStack 的存储服务模块,允许用户创建和管理持久化的块存储卷(volumes),这些卷可以附加到虚拟机(VMs)上,作为虚拟机的存储设备

Controller节点

(1)创建cinder数据库

MariaDB [(none)]> CREATE DATABASE cinder;

Query OK, 1 row affected (0.003 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'CINDER_DBPASS';

Query OK, 0 rows affected (0.017 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'CINDER_DBPASS';

Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> exit

(2)初始化Keystone资源对象

[root@controller ~]# source ~/.admin-openrc

[root@controller ~]# openstack user create --domain default --password-prompt cinder

User Password:

Repeat User Password:

[root@controller ~]# openstack role add --project service --user cinder admin

[root@controller ~]# openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3

[root@controller ~]# openstack endpoint create --region RegionOne volumev3 public http://controller:8776/v3/%\(project_id\)s

[root@controller ~]# openstack endpoint create --region RegionOne volumev3 internal http://controller:8776/v3/%\(project_id\)s

[root@controller ~]# openstack endpoint create --region RegionOne volumev3 admin http://controller:8776/v3/%\(project_id\)s

(3)安装软件包

[root@controller ~]# dnf install openstack-cinder-api openstack-cinder-scheduler

(4)修改cinder配置文件/etc/cinder/cinder.conf

[DEFAULT]

transport_url = rabbit://openstack:RABBIT_PASS@controller

auth_strategy = keystone

my_ip = 192.168.110.150

[database]

connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder

[keystone_authtoken]

www_authenticate_uri = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = cinder

password = CINDER_PASS

[oslo_concurrency]

lock_path = /var/lib/cinder/tmp

(5)数据库同步

[root@controller ~]# su -s /bin/sh -c "cinder-manage db sync" cinder

(6)修改nova配置/etc/nova/nova.conf

[cinder]

os_region_name = RegionOne

(7)启动服务

[root@controller ~]# systemctl restart openstack-nova-api

[root@controller ~]# systemctl start openstack-cinder-api openstack-cinder-scheduler

Storage节点

Storage节点要提前准备至少一块硬盘,作为cinder的存储后端

下文默认storage节点已经存在一块未使用的硬盘,设备名称为/dev/sdb

(1)安装软件包

[root@storage ~]# dnf install lvm2 device-mapper-persistent-data scsi-target-utils rpcbind nfs-utils openstack-cinder-volume openstack-cinder-backup

(2)配置lvm卷组

[root@storage ~]# pvcreate /dev/sdb

[root@storage ~]# vgcreate cinder-volumes /dev/sdb

(3)修改cinder配置/etc/cinder/cinder.conf

[DEFAULT]

transport_url = rabbit://openstack:RABBIT_PASS@controller

auth_strategy = keystone

my_ip = 192.168.110.152

enabled_backends = lvm

glance_api_servers = http://controller:9292

[keystone_authtoken]

www_authenticate_uri = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = default

user_domain_name = default

project_name = service

username = cinder

password = CINDER_PASS

[database]

connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder

[lvm]

volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver

volume_group = cinder-volumes

target_protocol = iscsi

target_helper = lioadm

[oslo_concurrency]

lock_path = /var/lib/cinder/tmp

(4)启动服务

[root@controller ~]# systemctl restart openstack-nova-api

[root@controller ~]# systemctl start openstack-cinder-api openstack-cinder-schedulr

(5)验证

Controller节点

[root@controller ~]# source ~/.admin-openrc

[root@controller ~]# openstack volume service list

创建一个卷来验证配置是否正确

[root@controller ~]# openstack volume create --size 1 test-volume

[root@controller ~]# openstack volume list

2.7 Horizon

orizon是OpenStack提供的前端页面,可以让用户通过网页鼠标的操作来控制OpenStack集群,而不用繁琐的CLI命令行。Horizon一般部署在控制节点。

(1)安装软件包

[root@controller ~]#  dnf install openstack-dashboard

(2)修改配置文件/etc/openstack-dashboard/local_settings

OPENSTACK_HOST = "controller"

ALLOWED_HOSTS = ['*', ]

OPENSTACK_KEYSTONE_URL =  "http://controller:5000/v3"

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

CACHES = {

'default': {

    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',

    'LOCATION': 'controller:11211',

    }

}

OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True

OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"

OPENSTACK_KEYSTONE_DEFAULT_ROLE = "member"

WEBROOT = '/dashboard'

POLICY_FILES_PATH = "/etc/openstack-dashboard"

OPENSTACK_API_VERSIONS = {

    "identity": 3,

    "image": 2,

    "volume": 3,

}

重启服务

[root@controller ~]# systemctl restart httpd

相关文章:

基于openEuler22.09部署OpenStack Yoga云平台(一)

OpenStack Yoga部署 安装OpenStack 一、基础准备 基于OpenStack经典的三节点环境进行部署&#xff0c;三个节点分别是控制节点&#xff08;controller&#xff09;、计算节点&#xff08;compute&#xff09;、存储节点&#xff08;storage&#xff09;&#xff0c;其中存储…...

信息安全管理:通用安全管理checklist

通用安全管理checklist是对信息安全管理调查问卷的一个补充&#xff0c;将以前没有包含的检查点纳入进来&#xff0c;算是对这个系列的一个拾遗与结尾。内容包含安全策略与计划、组织和人员安全、安全工程管理、安全产品管理与符合性五部分。 一、安全策略与安全计划 ▼▼安全…...

硬件设计-硬件 EMC 设计规范

目录 引言&#xff1a; 常见原因 总体概念及考虑 布局 屏蔽 滤波 引言&#xff1a; 本规范只简绍 EMC 的主要原则与结论&#xff0c;为硬件工程师们在开发设计中抛砖引玉。 电磁干扰的三要素是干扰源、干扰传输途径、干扰接收器。EMC 就围绕这些 问题进行研究。最基本的…...

【C++】数据结构 单链表的实现(企业存储用户数据的实现)

本篇博客给大家带来的是用C语言来实现数据结构的单链表&#xff08;企业存储用户数据的实现&#xff09; &#x1f41f;&#x1f41f;文章专栏&#xff1a;C &#x1f680;&#x1f680;若有问题评论区下讨论&#xff0c;我会及时回答 ❤❤欢迎大家点赞、收藏、分享 你们的支持…...

【Vue3+ts入门小试牛刀】

Vue 3是一个流行的JavaScript框架&#xff0c;它提供了创建交互式用户界面的工具。Vite是一个现代化的构建工具&#xff0c;用于快速构建Vue应用。TypeScript是一种类型安全的JavaScript的超集&#xff0c;它可以帮助我们在开发过程中减少错误。 下面是一个使用Vue 3、Vite和T…...

AI发展新态势:从技术突破到安全隐忧

AI安全的新挑战 近期AI领域出现了令人担忧的新发现。根据最新研究,AI模型已经开始展现出策略性欺骗的倾向。具体表现在以下几个方面: 策略性欺骗行为的出现 在实验中发现,当研究人员试图让AI执行一些"反Anthropic"的操作时(如获取模型权限和外部服务器访问),模…...

肝功能不正常可以过教师入职体检吗?

如何看肝功能报告单 转氨酶正常等于肝功能正常吗?要想看懂肝功能报告单就要看懂各指标含义。 1、总胆红素TbiL正常值是 1.7-17.1μmol/L 急性黄疸型肝炎活动性肝炎肝坏死、肝癌、胰头癌都异常偏高。 2、直接胆红素 DbiL正常值是 0-6.84μmol/L 结石病、肝癌、胰头癌与这项…...

二百八十二、ClickHouse——删除Linux中的ClickHouse

一、目的 由于ClickHosue的库表发生变化&#xff0c;需要删除原有的表结构数据&#xff0c;才能直接把脚本里文件重新安装 二、删除步骤 1、关闭ClickHouse服务 systemctl stop clickhouse-server 2、卸载ClickHouse软件包 sudo yum remove clickhouse-server clickhouse…...

Disruptor 高性能环形消息框架

官方文档&#xff1a;Disruptor 1. 简介 Disruptor是一个高性能的互进程&#xff08;Inter-process&#xff09;和多线程&#xff08;Multi-threaded&#xff09;消息处理库&#xff0c;由LMAX交易所开发&#xff0c;用于在Java虚拟机&#xff08;JVM&#xff09;上实现高性能…...

青少年编程与数学 02-005 移动Web编程基础 05课题、rem布局与媒体查询

青少年编程与数学 02-005 移动Web编程基础 05课题、rem布局与媒体查询 一、rem单位1. 定义和计算2. 应用场景3. 优点4. 缺点5. 实现响应式布局的方案 二、媒体查询基本语法常用媒体类型常用表达式示例 三、less基本语法主要特性编译和使用总结 四、less嵌套1. 使用媒体查询2. 嵌…...

SuperMap iClient3D for Cesium等高线标注

kele 前言 在三维地形分析中&#xff0c;等高线分析是一种非常重要的分析方法&#xff0c;它能直观的表达出地形的高低起伏特征&#xff0c;在三维系统中受到广泛应用。在SuperMap iClient3D for Cesium中&#xff0c;等高线分析是前端GPU分析&#xff0c;能够分析并渲染出等高…...

HTTP状态码

1xx 信息响应类 表示接收到请求并继续处理。 100 Continue - 客户端应继续发送请求。101 Switching Protocols - 客户端请求服务器切换协议版本。 2xx 成功响应类 表示操作成功被接收、理解并处理。 200 OK - 请求成功&#xff0c;服务器已将所请求的资源返回给客户端。201…...

纯div+css+js弹出窗

目的&#xff1a;实现弹出窗、仅关闭弹窗之后才能操作。自适应宽度与高度、当文本内容太多时、添加滚动条效果。 效果图 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport"…...

python如何使用RSA加密,避免明文密码

如果在python脚本中出现明文密码&#xff0c;就不符合安全的需求&#xff0c;而md5加密又不够安全&#xff0c;推荐RSA加密&#xff0c;原理不多说&#xff0c;直接说怎么弄 首先执行这个函数&#xff0c;生成公钥和私钥并写入文件 #pip3 install pycryptodome from Crypto i…...

easegen将教材批量生成可控ppt课件方案设计

之前客户提出过一个需求&#xff0c;就是希望可以将一本教材&#xff0c;快速的转换为教学ppt&#xff0c;虽然通过人工程序脚本的方式&#xff0c;已经实现了该功能&#xff0c;但是因为没有做到通用&#xff0c;每次都需要修改脚本&#xff0c;无法让客户自行完成所有流程&am…...

通过远程控制软件实现企业高效协作

在这个信息技术迅猛发展的时代&#xff0c;远程办公已经成为一种趋势&#xff0c;而远程控制软件则是连接分散团队的重要工具。技术的革新不仅推动了远程控制软件的广泛应用&#xff0c;也为现代办公带来了高效的协作体验。本文将探讨远程控制软件的发展&#xff0c;并以RayLin…...

交换机与路由器的区别

交换机和路由器是网络中的两种关键设备&#xff0c;它们各自承担不同的功能&#xff0c;主要区别体现在以下几个方面&#xff1a; 一、工作层次与功能 交换机&#xff1a; 工作层次&#xff1a;交换机主要工作在OSI模型的第二层&#xff0c;即数据链路层。 功能&#xff1a;交…...

每天40分玩转Django:Django国际化

Django国际化 一、今日学习内容概述 学习模块重要程度主要内容国际化基础⭐⭐⭐⭐⭐基本概念、配置设置字符串翻译⭐⭐⭐⭐⭐翻译标记、消息文件模板国际化⭐⭐⭐⭐模板标签、过滤器动态内容翻译⭐⭐⭐⭐模型字段、表单翻译 二、国际化基础配置 # settings.py# 启用国际化 …...

游戏开发-UE4高清虚幻引擎教程

简介 Unreal Engine 4 相关教程&#xff0c;涵盖美术流程、独立游戏制作编程、虚拟现实实战、高级材质系统、蓝图可视化编程及进阶、RPG 游戏与特效开发、VR 交互虚拟漫游等方面。包含大量视频教程、工程文件及源码&#xff0c;如 UE4 零基础美术教程中有火焰材质等案例及模型…...

信号与系统基础知识3:小波变换

信号与系统基础知识3&#xff1a;小波变换 一、本文内容与前置知识点1. 本文内容2. 前置知识点 二、小波变换介绍1. 一个变化忽快忽慢的信号&#xff08;1&#xff09;DFT的频谱数据信息&#xff08;2&#xff09;DFT的漏掉的频谱数据信息 2. 小波变换-时域和频域之间的妥协&am…...

memory泄露分析方法(Binder,Window,View篇)

View泄露&#xff1a;从Hprof找大量重复的view&#xff0c;点击查看text文案如果相同则找产品他们确认是否合理 window泄露&#xff1a;代码或dumpsys window来监测是否有大量同名window&#xff0c;不能用windowtoken来辨别是否重复window&#xff0c;每个window token都不一样…...

如何阻止盗版软件在互联网上传播

阻止公司软件的盗版传播是一项复杂但重要的任务&#xff0c;可以通过技术、法律和管理手段相结合来实现。以下是一些有效的措施&#xff1a; 1. 技术措施 1.1 软件保护 使用软件加密&#xff1a;采用强大的代码混淆、加密技术和反篡改机制。硬件绑定&#xff1a;将软件激活与…...

设计模式--装饰器模式【结构型模式】

设计模式的分类 我们都知道有 23 种设计模式&#xff0c;这 23 种设计模式可分为如下三类&#xff1a; 创建型模式&#xff08;5 种&#xff09;&#xff1a;单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式&#xff08;7 种&#xff09;&#xff1…...

CTFHUB-web进阶-php

我们用蚁剑中的这个插件来做这些关卡 一.LD_PRELOAD 发现这里有一句话木马&#xff0c;并且把ant给了我们&#xff0c;我们直接连接蚁剑 右键 选择模式&#xff0c;都可以试一下&#xff0c;这里第一个就可以 点击开始 我们进入到目录&#xff0c;刷新一下&#xff0c;会有一个…...

谷歌开发者工具 - 网络篇

Chrome DevTools - Network网络篇 一、官网二、主要用途三、网络篇1.网络工具栏&#xff08;1&#xff09;网络活动&#xff08;2&#xff09;保留日志&#xff08;3&#xff09;网络状况&#xff08;4&#xff09;网络设置 2.搜索和过滤&#xff08;1&#xff09;搜索&#xf…...

量子退火与机器学习(1):少量数据求解未知QUBO矩阵,以少见多

文章目录 前言ー、复习QUBO&#xff1a;中药配伍的复杂性1.QUBO 的介入&#xff1a;寻找最佳药材组合 二、难题&#xff1a;QUBO矩阵未知的问题1.为什么这么难&#xff1f; 三、稀疏建模(Sparse Modeling)1. 欠定系统中的稀疏解2. L1和L2的选择&#xff1a; 三、压缩感知算法(C…...

JDK高频面试题(包重点)

一、什么是JDK JDK&#xff08;Java Development Kit&#xff09;即 Java 开发工具包&#xff0c;是 Java 编程的基础与核心&#xff0c;由 Sun Microsystems&#xff08;现归属于 Oracle 公司 &#xff09;开发&#xff0c;主要作用如下&#xff1a; 1、提供编译环境 它包含了…...

本地部署 LLaMA-Factory

本地部署 LLaMA-Factory 1. 本地部署 LLaMA-Factory2. 下载模型3. 微调模型3-1. 下载数据集3-2. 配置参数3-3. 启动微调3-4. 模型评估3-5. 模型对话3-6. 导出模型3-7. 使用 vllm 推理 1. 本地部署 LLaMA-Factory 下载代码&#xff0c; git clone https://github.com/hiyouga/…...

内置ALC的前置放大器D2538A/D3308

一、概述 D2538A/D3308是芯谷科技推出的带有ALC&#xff08;自动电平控制&#xff09;的前置音频放大器芯片&#xff0c;最初产品为单声道/立体声收录机及盒式录音机而开发&#xff0c;作为录音/回放的磁头放大器使用&#xff1b;由于产品的高增益、低噪声及ALC外部可调的特性&…...

20241227解决使用向日葵远程工具连接ubuntu20.04.5出现黑屏的问题

20241227解决使用向日葵远程工具连接ubuntu20.04.5出现黑屏的问题 2024/12/27 14:40 参考资料&#xff1a; 百度&#xff1a;先日葵 https://sunlogin.oray.com/ 贝锐向日葵 百度&#xff1a;向日葵 连接 ubuntu22.04.5 黑屏 https://blog.csdn.net/catssi/article/details/139…...

Thinkphp 使用workerman消息实现消息推送完整示例

1.版本说明&#xff1a;ThinkPHP6.0 、PHP8.0 2.实现原理 应用场景&#xff0c;监听用户登陆&#xff0c;修改用户登陆状态&#xff0c;通过心跳时间计算用户是否下线&#xff0c;其他应用场景自行修改逻辑即可。 第一步&#xff1a;安装workerman composer require topthin…...

Word论文交叉引用一键上标

Word论文交叉引用一键上标 1.进入Microsoft word使用CtrlH快捷键或单击替换按钮 2.在查找内容中输入[^#] 3.鼠标点击&#xff0c;标签为“替换为&#xff1a;”的文本框&#xff0c;注意光标一定要打在图红色方框圈中的文本框中&#xff01; 4.点击格式选择字体 5.勾选上标…...

使用vue3搭建前端模拟增删改查

主要工具 vue3 element-plus axios mockjs 使用mockjs模拟数据 import Mock from "mockjs"; // 内存模拟数据 const arr []; for (let i 0; i < 10; i) {arr.push({id: Mock.mock("id"),name: Mock.mock("cname"),place: Mock.mock("c…...

Stream API 的设计融合了多个经典设计模式

Stream API 的设计融合了多个经典设计模式&#xff1a; 1. 策略模式&#xff08;Strategy Pattern&#xff09; 策略模式定义了一个算法的家族&#xff0c;将每个算法封装起来&#xff0c;并使它们可以互换。Stream API 中的每个操作&#xff08;如 filter(), map()&#xff…...

京东零售数据可视化平台产品实践与思考

导读 本次分享题目为京东零售数据可视化平台产品实践与思考。 主要包括以下四个部分&#xff1a; 1. 平台产品能力介绍 2. 业务赋能案例分享 3. 平台建设挑战与展望 作者&#xff1a;梁臣 京东 数据产品架构师 01平台产品能力介绍 1. 产品矩阵 数据可视化产品是一种利用…...

mysql高频面试题

1. mysql里的索引类型 2. 聚簇索引和非聚簇索引的区别 聚簇索引适合场景: 主键、唯一性要求高的字段。需要对数据进行范围查询时。对数据的读取频繁,并且数据行的插入和删除较少时。非聚簇索引适合场景: 较多的查询条件,或者需要基于某些非主键字段进行查询时。需要创建多个…...

MySQL中Performance Schema库的详解(下)

昨天说了关于SQL语句相关的&#xff0c;今天来说说性能相关的&#xff0c;如果没有看过上篇请点传送门https://blog.csdn.net/2301_80479959/article/details/144693574?fromshareblogdetail&sharetypeblogdetail&sharerId144693574&sharereferPC&sharesource…...

算法day_7 算法练习

这是我在2024年12月25日的算法练习&#xff0c;加油&#xff01;(▽) 题目一 &#x1f4aa; 1337. 矩阵中战斗力最弱的 K 行 已解答 | 简单 题目描述 &#x1f4dd; 给你一个大小为 m * n 的矩阵 mat&#xff0c;矩阵由若干军人和平民组成&#xff0c;分别用 1 和 0 表示。…...

一文详解MacOS+CLion——构建libtorch机器学习开发环境

对于希望在本地环境中进行深度学习开发的开发者来说&#xff0c;配置合适的工具链是至关重要的一步。本文旨在帮助您在 macOS 操作系统上&#xff0c;利用 CLion IDE 和 PyTorch 的 C依赖库——libtorch&#xff0c;快速搭建起一个高效的开发环境。这里我们将一步步地讲解如何下…...

CSS系列(39)-- Shapes详解

前端技术探索系列&#xff1a;CSS Shapes详解 ✨ 致读者&#xff1a;探索形状布局的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Shapes&#xff0c;这个强大的形状布局特性。 基础形状 &#x1f680; 圆形与椭圆 /* 基础圆形 */ .circle {widt…...

kafka的备份策略:从备份到恢复

文章目录 一、全量备份二、增量备份三、全量恢复四、增量恢复 前言&#xff1a;Kafka的备份的单元是partition&#xff0c;也就是每个partition都都会有leader partiton和follow partiton。其中leader partition是用来进行和producer进行写交互&#xff0c;follow从leader副本进…...

Android着色器SweepGradient渐变圆环,Kotlin

Android着色器SweepGradient渐变圆环&#xff0c;Kotlin import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.graphics.SweepGradient import android…...

SQL 实战:聚合函数高级用法 – 多层分组与动态统计

在数据分析中&#xff0c;聚合函数如 COUNT()、SUM()、AVG()、MAX()、MIN() 等是最常用的工具之一。它们允许我们对大量数据进行汇总和统计。然而&#xff0c;随着业务需求的复杂化&#xff0c;我们常常需要进行更复杂的统计操作&#xff0c;例如多层次的分组统计、动态分组等。…...

从零创建一个 Django 项目

1. 准备环境 在开始之前&#xff0c;确保你的开发环境满足以下要求&#xff1a; 安装了 Python (推荐 3.8 或更高版本)。安装 pip 包管理工具。如果要使用 MySQL 或 PostgreSQL&#xff0c;确保对应的数据库已安装。 创建虚拟环境 在项目目录中创建并激活虚拟环境&#xff…...

Spring Boot 3.4新特性:RestClient和RestTemplate的重大更新详解

本文将深入探讨Spring Boot 3.4版本中关于RestClient和RestTemplate的重要更新。。 1. 背景介绍 在Spring生态系统中&#xff0c;HTTP客户端一直是一个重要的组件。从最早的RestTemplate&#xff0c;到WebClient&#xff0c;再到现在的RestClient&#xff0c;每一次演进都带来…...

ANSYS EMC Plus:谐振腔中的天线

概述 本博客说明了如何使用 EMA3D 和 MHARNESS 模拟工具来模拟腔内天线产生的电场。下面简要概述了完成模拟所需的步骤&#xff0c;视频链接中提供了完整的演示。 步骤1&#xff1a;定义模拟域 准备模拟的第一步是定义模拟域。该域应包含所有需要分析的几何图形。在此演示中…...

lv_ffmpeg学习及播放rtsp

lvgl8.3有ffmpeg支持 FFmpeg support typedef struct {lv_img_t img;lv_timer_t * timer;lv_img_dsc_t imgdsc;bool auto_restart;struct ffmpeg_context_s * ffmpeg_ctx; } lv_ffmpeg_player_t;typedef enum {LV_FFMPEG_PLAYER_CMD_START,LV_FFMPEG_PLAYER_CMD_STOP,LV_FFMP…...

Java前端基础—HTML

Java前端基础—HTML 目录 Java前端基础—HTML1.简介2.基础语法2.1HTML页面固定结构2.2标题标签2.3段落标签2.4换行标签2.5水平线标签2.6文本标签2.7图片标签2.8音频标签2.9视频标签2.10链接标签2.11列表标签2.12表格标签2.13表单标签2.14语义标签 1.简介 1.网页组成&#xff1…...

salesforce 控制 Experience Cloud 站点用户可以看到哪些用户

在 Salesforce 的 Experience Cloud 中&#xff0c;您可以通过多种方式控制站点用户&#xff08;如社区用户&#xff09;之间的可见性。这包括用户之间的信息可见性以及他们可以访问的其他用户数据。以下是几种方法和设置&#xff0c;用于实现对 Experience Cloud 站点用户可见…...

C语言实现尼科彻斯定理

1.题目&#xff1a; 2.分析 【1】怎么输出连续奇数&#xff1a;下面是输出m个连续奇数的代码 #include<stdio.h>int main(){int m,x;scanf("%d",&m);for(int i0;i<m:i){printf("%d",x);xx2;}return 0; } 【2】啥叫尼科彻斯定理&#xff1f;…...