date
related_level
slug
type
relate_date
summary
status
tags
category
last_updated
Jan 3, 2026 10:59 PM
是否已更新
orginal_page
是否推荐
参考资料
DevStack — DevStack documentation
DevStack — DevStack documentation
DevStack is a series of extensible scripts used to quickly bring up a complete OpenStack environment based on the latest versions of everything from git master. It is used interactively as a development environment and as the basis for much of the OpenStack project’s functional testing.
其他可用项目:training-lab(不推荐,版本很久未更新)
- 需要 VirtualBox 和 Vagrant
- https://github.com/kris-at-occ/pike-coa-lab
- 和上面的应该是一个东西
注意,DevStack 仅用于测试而非持久化部署 OpenStack
- 重启后不会自动恢复服务,需要重新执行 stack.sh
DevStack 也可以适用于 LXC 容器单节点安装或者多节点部署
DevStack 网络架构简介
- DevStack 默认使用 Neutron 网络服务(包括 L3 路由和 OpenvSwitch)
- RHEL 安装 OVS 需要使用 openstack 相关库
- br-ex 网桥接口由 Neutron 管理(不连接物理网卡)
- 每个 project 具有独立子网网段(私有地址),通过浮动 IP(公共或者私有)暴露
- 子网内的虚拟机通过 IP 伪装访问外网
- DNS 解析依赖于主机 resolv.conf
可以通过设置 PUBLIC_INTERFACE 共享当前主机的网络接口
- OVS 和桥接之间存在相互作用,单网口不建议采用
PUBLIC_INTERFACE,否则系统重启后可能会导致无法连接
- 单网口设置样例
- 和当前宿主机共享一个网段,需要严格限制浮动 IP 网段范围避免冲突
PUBLIC_NETWORK_GATEWAY是当前服务器用来连接外部网络的网关Q_FLOATING_ALLOCATION_POOL是浮动 IP 地址范围,需要使用本地 DHCP 服务器未分配的 IP 地址段
私有网络地址配置:IPV4_ADDRS_SAFE_TO_USE, IPV6_ADDRS_SAFE_TO_USE
- 影响浮动 IP 和子网范围
FIXED_RANGE,SUBNETPOOL_PREFIX_V4FIXED_RANGE_V6,SUBNETPOOL_PREFIX_V6
安全组规则默认会阻止所有入站流量,PING 或者 SSH 到虚拟机需要添加规则
openstack security group rule create --proto icmp --dst-port 0 default
openstack security group rule create --proto tcp --dst-port 22 default
- 使用 Cloud-init 脚本运行 start.sh 安装 DevStack 最小化样例
- devstack 需要非 root 用户运行,创建了 stack 用户
vim cloud-config.yaml
最小化样例 local.conf 只包含以下内容
- 具体可见对应仓库的
stack.sh和stackrc,openrc配置 OpenDev: Free Software Needs Free Toolsdevstack
devstack
System for quickly installing an OpenStack cloud from upstream git for testing and development.
- 注意,地址范围不能和与主机上正在使用的任何网络地址重叠
- 默认安装以下核心组件
keystone,swift,glance,cinder,nova,placement,neutron,horizon- 未直接包含的组件可以通过插件机制来配置
- https://docs.openstack.org/devstack/latest/plugins.html
enable_plugin <NAME> <GITURL> [GITREF]
- 在宿主机上配置以下软件
- Rabbit
- MySQL
- Apache
local.conf 样例配置文件
local.conf 自定义安装阶段,安装服务及插件
定义安装阶段及组件配置
'[[' <phase> '|' <config-file-name> ']]'
<phase> 可以定义以下阶段
local在开始获取stackrc之前从local.conf中提取localrc
post-config在第 2 层服务配置完成后、启动之前运行
extra在服务启动后、任何extra.d文件运行前执行
post-extra在extra.d中的文件执行完毕后运行
test-config在 Tempest(OpenStack 集成测试套件)配置完成后运行
<config-file-name> 对应组件的配置文件名称
- 以 nova 为例
- 这里使用
$NOVA_CONF是因为 stack.sh 里source $TOP_DIR/lib/nova
- 自定义启用或禁用特定组件
enable_service q-svcdisable_service c-vol
自定义安装插件
- 在 local 阶段添加 enable_plugin
- 加载
ec2-api插件样例 enable_plugin ec2-api https://opendev.org/openstack/ec2-api
DevStack 自定义配置 local.conf 并安装运行
参考资料
假设有两个网口 ens18 和 ens19,ens18 用于 ssh 管理 devstack 主机,ens19 用于桥接 br-ex
- 单网口的话存在重启后无法从外部网络连接服务器的风险
nmcli device status
nmcli con show ens19
- 如 ens19 未创建连接
nmcli connection add type ethernet \ ifname ens19 \ con-name ens19 \ ipv4.method manual \ ipv4.addresses 192.168.1.79/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 8.8.8.8
- 以 RHEL 9 + devstack stable/2024.2 分支为例,建议在 RHEL 8 或 9 安装
RHEL 9 直接启用对应库即可
subscription-manager register- 已经注册 RHEL 跳过
subscription-manager repos --enable=rhel-9-for-x86_64-baseos-rpms \ --enable=rhel-9-for-x86_64-appstream-rpms \ --enable=rhel-9-for-x86_64-supplementary-rpms
subscription-manager repos --enable=codeready-builder-for-rhel-9-x86_64-rpms- 启用 CRB 库
dnf install https://trunk.rdoproject.org/rdo_release/rdo-release.el9s.rpm- 社区 RDO 库 RPM,会安装最新版本
目前 RHEL 10 缺失必要库需要手动编译,且 rabbitmq 异常无法解决
RHEL 10 手动编译安装并运行 ovs 和 ovn
安装编译相关依赖
sudo dnf install -y autoconf automake rpm-build rpmdevtools libtool make gcc gcc-c++ python3-devel python3-sphinx pkgconfig openssl-devel libcap-ng-devel kernel-devel graphviz groff libbpf-devel libxdp-devel numactl-devel selinux-policy-devel systemtap-sdt-devel postgresql-devel unbound unbound-devel
ovs(openvswitch) 捆绑到 Openstack 库,目前 RHEL 10 官方库还没有只能手动编译
git clone --depth 1 -b branch-3.6 https://github.com/openvswitch/ovs.git /opt/ovs
cd /opt/ovs
./boot.sh- 构筑 configure 脚本
./configure --enable-python- 配置
- 默认安装到
/usr/local
make
make check TESTSUITEFLAGS=-j4- 可选,4 线程运行所有单元测试
- 仅测试 2040-2050(测试之间没有相互依赖关系)
make check TESTSUITEFLAGS='2040-2050 -j4'
安装 ovs rpm 包并启用 openvswitch 服务
make rpm-fedora- 推荐
cd opt/ovs/rpm/rpmbuild/RPMSdnf install ./noarch/python3-openvswitch-<ovs_ver>-1.el10.noarch.rpmdnf install ./x86_64/openvswitch-<ovs_ver>-1.el10.x86_64.rpm
systemctl status openvswitch.service
systemctl enable --now openvswitch.service
其他:make install 安装二进制文件并通过 ovs-ctl 启用
make install
export PATH=$PATH:/usr/local/share/openvswitch/scripts
ovs-ctl start
手动编译 ovn(Open Virtual Network)
git clone --depth 1 -b branch-25.09 https://github.com/ovn-org/ovn.git /opt/ovn
cd /opt/ovn
./boot.sh- 构筑 configure 脚本
./configure --with-ovs-source=/opt/ovs- 配置之前需要先准备编译好的 ovs 模块
make
make check TESTSUITEFLAGS=-j4- 可选,4 线程运行所有单元测试
- 仅测试 2040-2050(测试之间没有相互依赖关系)
make check TESTSUITEFLAGS='2040-2050 -j4'
安装 ovs rpm 包并启用 ovn-northd 和 ovn-controller 服务
make rpm-fedora- 推荐
cd /opt/ovn/rpm/rpmbuild/RPMS/x86_64dnf install ./ovn-<ovn_ves>.el10.x86_64.rpmdnf install ./ovn-central-<ovn_ves>-1.el10.x86_64.rpmdnf install ./ovn-host-<ovn_ves>-1.el10.x86_64.rpm
- 创建路径
/var/run/ovn mkdir -p /var/run/ovn && chown stack:stack /var/run/ovnls -al /var/run/ovn
systemctl status ovn-northd ovn-controller
systemctl enable --now ovn-northd ovn-controller- 注意 ovs-contorller 可能会导致网络连接异常
- VM 上运行所有单元测试是均可以通过的,部分会被 skip
RHEL 10 的 rabbitmq 即使配置成功也会报错 invalid credentials 导致最终 api 503 异常
- 查看相关配置文件和连接完全正常,匪夷所思
rabbitmqctl list_usersrabbitmqctl list_permissions -p /rabbitmqctl authenticate_user stackrabbit "secretrabbit"- 正常
rabbitmqctl eval 'application:get_env(rabbit, loopback_users).'
前置准备:更新 repo 以及安装必要软件
sudo dnf update -qy
sudo dnf install -qy git curl python3 net-tools unzip
sudo dnf install -qy libvirt virt-install qemu-kvm- 需要额外安装 kvm 相关软件
sudo dnf install -qy memcached- keystone 组件需要
sudo dnf install -qy rsync-daemon- swift 组件需要
systemctl enable --now rsyncd
前置准备:开启 ip 转发
vim /etc/sysctl.d/99.ip_forward.conf
前置准备:添加 rabbitmq 库并安装配置
- 正常安装报错 rabbitmq-server 不存在
添加 GPG 密钥
rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc'
rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key'- erlang 库
rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key'- rabbitmq-server 库
添加 repo
- 注意仅提供 amd64 的 x86 版本 erlang
vim /etc/yum.repos.d/rabbitmq.repo
安装依赖和 rabbitmq-server
dnf update -qy
dnf install -y logrotate erlang
dnf install -y rabbitmq-server
rabbitmq-server 启动失败可能还需要配置 hostnamectl 的 dns 解析
hostnamectl- 查看当前 hostname
vim /etc/hosts127.0.0.1 <your_hostname><host_ip> <your_hostname>
配置 rabbitmq 禁用 loopback_users 限制
echo 'loopback_users = none' | sudo tee /etc/rabbitmq/rabbitmq.conf
前置准备:创建 stack 用户
useradd -s /bin/bash -d /home/stack -m stack
cat > /etc/sudoers.d/99-stack-user <<EOF stack ALL=(ALL) NOPASSWD:ALL Defaults:stack !requiretty EOF
chmod 0440 /etc/sudoers.d/99-stack-user
- 修改 pip 源
mkdir -p /home/stack/.pipcat > /home/stack/.pip/pip.conf <<EOF [global]index-url = https://pypi.tuna.tsinghua.edu.cn/simple EOF
mkdir -p /opt/stack/logs && chown -R stack:stack /opt/stack /home/stack
克隆 devstack 项目
sudo -u stack git clone --depth 1 -b stable/2024.2 https://opendev.org/openstack/devstack /home/stack/devstack
验证当前安装 devstack 环境
sudo su - stack -c "cd /home/stack/devstack && bash ./tools/info.sh"
其他:neutron 会关闭 firewalld 并启用 iptables
iptables -L -n -v- 检查现有规则
- 如果 SSH 是通过非默认 22 端口需要提前创建对应规则,否则后续无法连接
自定义 local.conf 安装配置文件
配置 DevStack Nova 基于 KVM 的嵌套虚拟化
确认当前 VM 是否已启用嵌套 KVM 虚拟化
cat /sys/module/kvm_intel/parameters/nested- Y 为已激活
- N 为未激活
- local.conf 的
[[local|localrc]]部分添加LIBVIRT_TYPE=kvm显式启用 KVM 而非 QEMU
- 可能会遇到一些 requirement 冲突,此时需要使用相同版本的 branch
sudo su - stack -c "vim /home/stack/devstack/local.conf"
- 安装 DevStack(花费时间较长)
sudo su - stack -c "cd /home/stack/devstack && bash ./stack.sh"
安装结束后的概要
安装成功后查看 DevStack 服务运行状态并测试 openstack cli
systemctl list-units --all 'devstack@*'
systemctl list-unit-files 'devstack@*'
source /home/stack/devstack/openrc admin admin- 默认用户为 admin 和 demo
openstack service list --long
- 卸载 DevStack 并清理安装
sudo su - stack -c "cd /home/stack/devstack && bash ./unstack.sh && bash ./clean.sh"
访问 DevStack horizon 面板
参考资料
DevStack 通过 iptables 而非 firewalld 管理防火墙,还需要放行对应端口
dnf install -qy iptables-services- 用于持久化 iptables 规则
iptables -L -n -v
- 放行端口
iptables -I INPUT -p tcp --dport 80 -j ACCEPTiptables -I INPUT -p tcp --dport 443 -j ACCEPTiptables -I INPUT -p tcp --dport 9696 -j ACCEPT- neutron 服务
iptables -I INPUT -p tcp --dport 6080 -j ACCEPT- horizon 终端控制台(VNC)
iptables -I INPUT -p tcp --dport 6082 -j ACCEPT- horizon 终端控制台(SPICE)
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT- swift 服务
- 允许已建立的连接转发
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
- 持久化规则
service iptables save
- 浏览器访问
http://<host_ip>/dashboard - 账户为 admin 或者 demo
- 密码为之前 local.conf 设置的
检查 DevStack 网络配置
source /home/stack/devstack/openrc admin admin
检查 ovn 和 ovs
ovn-nbctl show- OVN Northbound 数据库,定义逻辑网络和逻辑路由(上层逻辑网络配置)
ovn-nbctl lr-nat-list $(ovn-nbctl show | grep router1 | cut -d' ' -f2)- 查看路由规则
ovn-sbctl show- OVN Southbound 数据库,控制逻辑网络到物理网络的映射和下发状态
ovs-vsctl show- Open vSwitch(OVS) 的本地桥和端口配置
ovs-vsctl list-ports br-ex- 应该含有
ens19和patch-provnet-xxxx-to-br-int - 没有
ens19则手动创建桥接 ovs-vsctl --may-exist add-port br-ex ens19ip link show br-ex
检查 SNAT 是否已经 enable
openstack router show router1 | grep snat
检查 public 网络和 agent
openstack network show public | grep provider
openstack network agent list- 应该有 neutron-ovn-metadata-agent 和 ovn-controller
DevStack 命令行创建测试 VM 并 SSH 到 VM
source /home/stack/devstack/openrc demo demo- 以 demo 身份执行
- 测试 openstack cli
openstack network list
创建密钥对,浮动 IP
fip_id=$(openstack floating ip create public -c id -f value)openstack floating ip list
openstack keypair create --public-key ~/.ssh/id_rsa.pub test-keypairopenstack keypair list
创建实例并分配浮动 IP
image_id=$(openstack image list -c ID -c Name -f value | grep cirros | cut -d' ' -f1)- 默认配置了一个几十兆的 cirros 镜像用于测试
m_flavor=$(openstack flavor list -c Name -f value | head -n 1)- 选最小的即可
openstack server create --network private --key-name test-keypair test-server --flavor $m_flavor --image $image_id
openstack server add floating ip test-server ${fip_id}
openstack server list
配置 demo 项目安全组规则(ping 和 SSH)
openstack --os-project-name demo security group list
openstack security group rule create --proto icmp --dst-port 0 default
openstack security group rule create --proto tcp --dst-port 22 default
openstack --os-project-name demo security group rule list
通过 DevStack 跳板机 SSH 连接 VM 实例(仅允许 SSH 访问)
配置 DevStack 主机 stack 用户 ssh 登录
mkdir -p /home/stack/.ssh
cat ~/.ssh/id_rsa.pub > /home/stack/.ssh/authorized_keys
chown stack:stack -R /home/stack/.ssh
openstack server ssh test-server -- -l cirros -J username@hostnameusername和hostname为 devstack 主机的用户名和主机名- 这里为
stack@192.168.1.79
通过 VPN 工具创建到浮动 IP 网段范围的 SSH 隧道
dnf install -y sshuttle
- EPEL 替换清华源
sed -e 's!^metalink=!#metalink=!g' \ -e 's!^#baseurl=!baseurl=!g' \ -e 's!https\?://download\.fedoraproject\.org/pub/epel!https://mirrors.tuna.tsinghua.edu.cn/epel!g' \ -e 's!https\?://download\.example/pub/epel!https://mirrors.tuna.tsinghua.edu.cn/epel!g' \ -i /etc/yum.repos.d/epel{,-testing}.repo
sshuttle -r username@hostname:22 192.168.2.0/24username和hostname为 devstack 主机的用户名和主机名- 这里为
stack@192.168.1.79 192.168.2.0/24为之前创建的浮动 IP 范围
openstack server ssh test-server -- -l cirros
- Author:白鸟3
- URL:https://blog.kun2peng.top/operation/openstack_devstack
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
