OpenStack Yoga版安装笔记(十二)nova安装(下)

5、Install and configure controller node for Ubuntu

注意安装版本为:nova 25.2.2.dev5

5.1 Prerequisites

在安装和配置compute service之前,需要先创建数据库、服务凭证(用户名/密码)、服务API端点。

1、Create the database:

复制代码
root@controller:~# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 31
Server version: 10.6.18-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04

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)]> 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.000 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
    ->   IDENTIFIED BY 'openstack';
Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
    ->   IDENTIFIED BY 'openstack';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
    ->   IDENTIFIED BY 'openstack';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
    ->   IDENTIFIED BY 'openstack';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' \
    ->   IDENTIFIED BY 'openstack';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \
    ->   IDENTIFIED BY 'openstack';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> quit
Bye
root@controller:~# 

2、Configure User and Endpoints

复制代码
root@controller:~# . admin-openrc 
root@controller ~(admin/amdin)# openstack user create --domain default --password-prompt nova
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 107cee2c7dc34407bd41bea2e8ae4b2c |
| name                | nova                             |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
root@controller ~(admin/amdin)# openstack role add --project service --user nova admin
root@controller ~(admin/amdin)# openstack service create --name nova \
>   --description "OpenStack Compute" compute
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Compute                |
| enabled     | True                             |
| id          | 1b8f162ebcf848ee8bd69bc6b36a8dff |
| name        | nova                             |
| type        | compute                          |
+-------------+----------------------------------+
root@controller ~(admin/amdin)# openstack endpoint create --region RegionOne \
>   compute public http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 56f7de504b8c46a8bf49ca95bb82b20a |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 1b8f162ebcf848ee8bd69bc6b36a8dff |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+
root@controller ~(admin/amdin)# openstack endpoint create --region RegionOne \
>   compute internal http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 92a7d9dd7cce4678b280d143514bbed4 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 1b8f162ebcf848ee8bd69bc6b36a8dff |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+
root@controller ~(admin/amdin)# openstack endpoint create --region RegionOne \
>   compute admin http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 9f112fb3f16441fc8f4314608aaad122 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 1b8f162ebcf848ee8bd69bc6b36a8dff |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+
root@controller ~(admin/amdin)# 

5.2 Install and configure components

1、安装软件包

复制代码
root@controller:~# apt install nova-api nova-conductor nova-novncproxy nova-scheduler

2、Edit the /etc/nova/nova.conf file

复制代码
root@controller:~# vi /etc/nova/nova.conf

[api_database]
# connection = sqlite:var/lib/nova/nova_api.sqlite
connection = mysql+pymysql://nova:openstack@controller/nova_api
...
[database]
# connection = sqlite:var/lib/nova/nova.sqlite
connection = mysql+pymysql://nova:openstack@controller/nova
...
[DEFAULT] 
transport_url = rabbit://openstack:openstack@controller:5672/
...
[api]
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 = nova
password = openstack
...
[service_user]
send_service_user_token = true
auth_url = https://controller/identity
auth_strategy = keystone
auth_type = password
project_domain_name = Default
project_name = service
user_domain_name = Default
username = nova
password = openstack
...
[DEFAULT]
my_ip = 10.0.20.11
...
[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 = openstack
service_metadata_proxy = true
metadata_proxy_shared_secret = openstack
...
[vnc]
enabled = true
server_listen = $my_ip
server_proxyclient_address = $my_ip
...
[glance]
api_servers = http://controller:9292
...
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
...
[DEFAULT]
# log_dir = /var/log/nova
...
[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 = openstack

3、Populate the nova-api database:

复制代码
root@controller:~# su -s /bin/sh -c "nova-manage api_db sync" nova
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
2024-08-03 09:56:33.424 12329 INFO alembic.runtime.migration [-] Context impl MySQLImpl.
2024-08-03 09:56:33.425 12329 INFO alembic.runtime.migration [-] Will assume non-transactional DDL.
2024-08-03 09:56:33.432 12329 INFO alembic.runtime.migration [-] Running upgrade  -> d67eeaabee36, Initial version
2024-08-03 09:56:33.631 12329 INFO alembic.runtime.migration [-] Running upgrade d67eeaabee36 -> b30f573d3377, Remove unused build_requests columns
root@controller:~# 

4、Register the cell0 database:

复制代码
root@controller:~# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
root@controller:~# 

5、Create the cell1 cell:

复制代码
root@controller:~# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
--transport-url not provided in the command line, using the value [DEFAULT]/transport_url from the configuration file
--database_connection not provided in the command line, using the value [database]/connection from the configuration file
8b1967df-7901-42b3-8b03-fc4e884f490d
root@controller:~# 

6、Populate the nova database:

复制代码
root@controller:~# su -s /bin/sh -c "nova-manage db sync" nova
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
2024-08-03 10:06:03.073 14092 INFO alembic.runtime.migration [req-2c88e019-957e-4116-8e7c-29dd6243047c - - - - -] Context impl MySQLImpl.
2024-08-03 10:06:03.073 14092 INFO alembic.runtime.migration [req-2c88e019-957e-4116-8e7c-29dd6243047c - - - - -] Will assume non-transactional DDL.
2024-08-03 10:06:03.080 14092 INFO alembic.runtime.migration [req-2c88e019-957e-4116-8e7c-29dd6243047c - - - - -] Running upgrade  -> 8f2f1571d55b, Initial version
2024-08-03 10:06:03.879 14092 INFO alembic.runtime.migration [req-2c88e019-957e-4116-8e7c-29dd6243047c - - - - -] Running upgrade 8f2f1571d55b -> 16f1fbcab42b, Resolve shadow table diffs
2024-08-03 10:06:03.899 14092 INFO alembic.runtime.migration [req-2c88e019-957e-4116-8e7c-29dd6243047c - - - - -] Context impl MySQLImpl.
2024-08-03 10:06:03.899 14092 INFO alembic.runtime.migration [req-2c88e019-957e-4116-8e7c-29dd6243047c - - - - -] Will assume non-transactional DDL.
2024-08-03 10:06:03.905 14092 INFO alembic.runtime.migration [req-2c88e019-957e-4116-8e7c-29dd6243047c - - - - -] Running upgrade  -> 8f2f1571d55b, Initial version
2024-08-03 10:06:04.629 14092 INFO alembic.runtime.migration [req-2c88e019-957e-4116-8e7c-29dd6243047c - - - - -] Running upgrade 8f2f1571d55b -> 16f1fbcab42b, Resolve shadow table diffs
root@controller:~# 

7、Verify nova cell0 and cell1 are registered correctly:

复制代码
root@controller:~# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+
|  Name |                 UUID                 |              Transport URL               |               Database Connection               | Disabled |
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 |                  none:/                  | mysql+pymysql://nova:****@controller/nova_cell0 |  False   |
| cell1 | 8b1967df-7901-42b3-8b03-fc4e884f490d | rabbit://openstack:****@controller:5672/ |    mysql+pymysql://nova:****@controller/nova    |  False   |
+-------+--------------------------------------+------------------------------------------+-------------------------------------------------+----------+
root@controller:~# 

5.3 Finalize installation

Restart the Compute services:

复制代码
root@controller:~# service nova-api restart
root@controller:~# service nova-scheduler restart
root@controller:~# service nova-conductor restart
root@controller:~# service nova-novncproxy restart
root@controller:~# 
root@controller:~# systemctl  | grep nova
  nova-api.service                                                                                 loaded active running   OpenStack Compute API
  nova-conductor.service                                                                           loaded active running   OpenStack Compute Conductor
  nova-novncproxy.service                                                                          loaded active running   OpenStack Compute novncproxy
  nova-scheduler.service                                                                           loaded active running   OpenStack Compute Scheduler
root@controller:~# 

6、Install and configure a compute node for Ubuntu

计算服务(Compute Service)支持多种hypervisor来部署实例或虚拟机。为了简化配置,这里使用Quick EMUlator(QEMU)hypervisor,并在支持虚拟机硬件加速的计算节点上结合了基于内核的虚拟机(KVM)扩展。在不支持硬件加速的传统硬件上,可以使用通用的QEMU hypervisor。另外可以通过简单修改这里的配置,增加额外的计算节点,从而水平扩展计算环境。

6.1 Install and configure components

复制代码
root@compute1:~# apt install nova-compute

6.2 Edit the /etc/nova/nova.conf file

复制代码
root@compute1:~# vi /etc/nova/nova.conf 

[DEFAULT]

transport_url = rabbit://openstack:openstack@controller
...
[api]
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 = nova
password = openstack
...
[service_user]
send_service_user_token = true
auth_url = https://controller/identity
auth_strategy = keystone
auth_type = password
project_domain_name = Default
project_name = service
user_domain_name = Default
username = nova
password = openstack
...
[DEFAULT]
my_ip = 10.0.20.11
...
[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 = openstack
...
[glance]
api_servers = http://controller:9292
...
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
...
[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 = openstack

6.3 Finalize installation

1、检查计算节点(compute node)是否支持硬件虚拟化,返回1或者大于1,则支持;返回0则不支持:

复制代码
root@compute1:~# egrep -c '(vmx|svm)' /proc/cpuinfo
8

2、重启compute service:

复制代码
root@compute1:~# service nova-compute restart

root@compute1:~# systemctl status nova-compute
● nova-compute.service - OpenStack Compute
     Loaded: loaded (/lib/systemd/system/nova-compute.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-08-03 12:09:38 UTC; 1min 13s ago
   Main PID: 1167 (nova-compute)
      Tasks: 23 (limit: 4514)
     Memory: 122.8M
        CPU: 1.924s
     CGroup: /system.slice/nova-compute.service
             └─1167 /usr/bin/python3 /usr/bin/nova-compute --config-file=/etc/nova/nova.conf --config-file=/etc/nova/nova-compute.conf --log-file=/var
/log/nova/nova-compute.log

Aug 03 12:09:38 compute1 systemd[1]: Started OpenStack Compute.
Aug 03 12:09:38 compute1 nova-compute[1167]: Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urlli
b3. This warning can usually be ignored if the caller is only importing and not executing nova code.
root@compute1:~# 

6.4 Add the compute node to the cell database

1、以admin的凭证获取admin-only openstack CLI,查看数据库是否有compute host:

复制代码
root@controller ~(admin/amdin)# cat 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=openstack
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export PS1='\u@\h \W(admin/amdin)\$ '
root@controller ~(admin/amdin)# 
root@controller:~# . admin-openrc 
root@controller ~(admin/amdin)# openstack compute service list --service nova-compute
+--------------------------------------+--------------+----------+------+---------+-------+----------------------------+
| ID                                   | Binary       | Host     | Zone | Status  | State | Updated At                 |
+--------------------------------------+--------------+----------+------+---------+-------+----------------------------+
| c04e53a4-fdb8-4915-9b1a-f5d195e753c4 | nova-compute | compute1 | nova | enabled | up    | 2024-08-03T12:14:15.000000 |
+--------------------------------------+--------------+----------+------+---------+-------+----------------------------+

2、Discover compute hosts:

复制代码
root@controller:~# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting computes from cell 'cell1': 8b1967df-7901-42b3-8b03-fc4e884f490d
Checking host mapping for compute host 'compute1': 205c89e0-fb82-4def-a0f6-bfe4b120ab79
Creating host mapping for compute host 'compute1': 205c89e0-fb82-4def-a0f6-bfe4b120ab79
Found 1 unmapped computes in cell: 8b1967df-7901-42b3-8b03-fc4e884f490d
root@controller:~# 

root@controller:~# nova-manage cell_v2 list_hosts --cell_uuid 8b1967df-7901-42b3-8b03-fc4e884f490d
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
+-----------+--------------------------------------+----------+
| Cell Name |              Cell UUID               | Hostname |
+-----------+--------------------------------------+----------+
|   cell1   | 8b1967df-7901-42b3-8b03-fc4e884f490d | compute1 |
+-----------+--------------------------------------+----------+
root@controller:~# 
root@controller:~# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting computes from cell 'cell1': 8b1967df-7901-42b3-8b03-fc4e884f490d
Found 0 unmapped computes in cell: 8b1967df-7901-42b3-8b03-fc4e884f490d
root@controller:~# 
root@controller:~# nova-manage cell_v2 list_hosts --cell_uuid 8b1967df-7901-42b3-8b03-fc4e884f490d
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
+-----------+--------------------------------------+----------+
| Cell Name |              Cell UUID               | Hostname |
+-----------+--------------------------------------+----------+
|   cell1   | 8b1967df-7901-42b3-8b03-fc4e884f490d | compute1 |
+-----------+--------------------------------------+----------+
root@controller:~#

当您添加新的计算节点时,您必须在控制节点上运行 nova-manage cell_v2 discover_hosts 命令来注册这些新的计算节点。

7、Verify operation

1、Source the admin credentials to gain access to admin-only CLI commands:

复制代码
root@controller:~# . admin-openrc 
root@controller ~(admin/amdin)# 

2、List service components to verify successful launch and registration of each process:

复制代码
root@controller ~(admin/amdin)# openstack compute service list

+--------------------------------------+----------------+------------+----------+---------+-------+----------------------------+
| ID                                   | Binary         | Host       | Zone     | Status  | State | Updated At                 |
+--------------------------------------+----------------+------------+----------+---------+-------+----------------------------+
| b935d869-0102-45c0-8b24-e338c5606890 | nova-scheduler | controller | internal | enabled | up    | 2024-08-03T12:36:55.000000 |
| e4929b42-af08-449f-b703-c0fc36c4220b | nova-conductor | controller | internal | enabled | up    | 2024-08-03T12:37:02.000000 |
| c04e53a4-fdb8-4915-9b1a-f5d195e753c4 | nova-compute   | compute1   | nova     | enabled | up    | 2024-08-03T12:36:56.000000 |
+--------------------------------------+----------------+------------+----------+---------+-------+----------------------------+

3、List API endpoints in the Identity service to verify connectivity with the Identity service:

复制代码
root@controller ~(admin/amdin)# openstack catalog list
+-----------+-----------+-----------------------------------------+
| Name      | Type      | Endpoints                               |
+-----------+-----------+-----------------------------------------+
| nova      | compute   | RegionOne                               |
|           |           |   public: http://controller:8774/v2.1   |
|           |           | RegionOne                               |
|           |           |   internal: http://controller:8774/v2.1 |
|           |           | RegionOne                               |
|           |           |   admin: http://controller:8774/v2.1    |
|           |           |                                         |
| placement | placement | RegionOne                               |
|           |           |   internal: http://controller:8778      |
|           |           | RegionOne                               |
|           |           |   admin: http://controller:8778         |
|           |           | RegionOne                               |
|           |           |   public: http://controller:8778        |
|           |           |                                         |
| keystone  | identity  | RegionOne                               |
|           |           |   admin: http://controller:5000/v3/     |
|           |           | RegionOne                               |
|           |           |   internal: http://controller:5000/v3/  |
|           |           | RegionOne                               |
|           |           |   public: http://controller:5000/v3/    |
|           |           |                                         |
| glance    | image     | RegionOne                               |
|           |           |   admin: http://controller:9292         |
|           |           | RegionOne                               |
|           |           |   internal: http://controller:9292      |
|           |           | RegionOne                               |
|           |           |   public: http://controller:9292        |
|           |           |                                         |
+-----------+-----------+-----------------------------------------+
root@controller ~(admin/amdin)# 

4、List images in the Image service to verify connectivity with the Image service:

复制代码
root@controller ~(admin/amdin)# openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 429decdd-9230-49c0-b735-70364c226eb5 | cirros | active |
+--------------------------------------+--------+--------+

5、Check the cells and placement API are working successfully and that other necessary prerequisites are in place:

复制代码
root@controller ~(admin/amdin)# nova-status upgrade check
Modules with known eventlet monkey patching issues were imported prior to eventlet monkey patching: urllib3. This warning can usually be ignored if the caller is only importing and not executing nova code.
+-------------------------------------------+
| Upgrade Check Results                     |
+-------------------------------------------+
| Check: Cells v2                           |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
| Check: Placement API                      |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
| Check: Cinder API                         |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
| Check: Policy Scope-based Defaults        |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
| Check: Policy File JSON to YAML Migration |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
| Check: Older than N-1 computes            |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
| Check: hw_machine_type unset              |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
| Check: Service User Token Configuration   |
| Result: Success                           |
| Details: None                             |
+-------------------------------------------+
root@controller ~(admin/amdin)#

8、关闭虚机,拍摄快照

关闭controller node和compute node虚机,拍摄快照(可参考之前的章节)。

相关推荐
czhc11400756631 分钟前
Linux 76 rsync
linux·运维·python
蓝易云1 小时前
Qt框架中connect()方法的ConnectionType参数使用说明 点击改变文章字体大小
linux·前端·后端
花落已飘2 小时前
多线程 vs 异步
linux·网络·系统架构
PanZonghui2 小时前
Centos项目部署之Nginx部署项目
linux·nginx
码出钞能力3 小时前
linux内核模块的查看
linux·运维·服务器
果子⌂3 小时前
OpenStack入门体验
openstack
星辰云-3 小时前
# Linux Centos系统硬盘分区扩容
linux·运维·centos·磁盘扩容
致***锌3 小时前
期权标准化合约是什么?
笔记
聽雨2373 小时前
02每日简报20250704
linux·科技·金融·生活·社交电子·娱乐·媒体
Maki Winster4 小时前
Peek-Ubuntu上Gif录制工具-24.04LTS可装
linux·ubuntu·peek