
想在国内快速搭建一个 OpenStack 私有云环境却卡在漫长的依赖下载和复杂的配置上很多开发者第一次尝试 OpenStack 时都会被其庞大的组件和繁琐的部署过程劝退。官方文档虽然详尽但在国内网络环境下光是下载镜像和依赖包就可能耗费数小时甚至因网络问题而失败。DevStack 作为 OpenStack 官方推荐的快速部署工具本应是解决这个痛点的利器。它通过一个脚本自动化完成从系统配置到服务启动的全过程。然而直接使用其官方仓库在国内往往会遇到git clone超时、pip install卡住、apt-get update缓慢等问题让“快速”变得名不副实。这篇文章要解决的正是这个核心矛盾如何在国内网络环境下真正实现 DevStack 的“快速”部署。我们将绕过所有常见的网络陷阱利用国内镜像源和预配置将原本可能耗时半天甚至更久的部署过程压缩到一小时内完成。这不是一篇泛泛而谈的概念介绍而是一份从零开始、步步排雷的实战指南。如果你正在为搭建 OpenStack 开发测试环境而头疼或者想快速验证某个 OpenStack 功能那么这篇文章将为你提供一条清晰的路径。1. DevStack 与 OpenStack为什么选择这条“捷径”在深入部署之前我们需要先理解 DevStack 的定位以及它为何适合国内开发者快速上手 OpenStack。OpenStack 是一个由众多独立服务如 Nova 计算、Neutron 网络、Cinder 块存储等组成的庞大 IaaS 云平台。生产环境部署通常需要专业的运维团队和复杂的编排工具如 Kolla-Ansible, OpenStack Helm。但对于开发者、测试人员或学生而言我们往往只需要一个功能完整、易于重置、用于学习和功能验证的环境。这就是 DevStack 存在的意义。DevStack 的核心价值在于“All-in-One”。它通过一个stack.sh脚本在单台机器上部署所有 OpenStack 服务。这听起来像是把大象塞进冰箱但它通过几个关键设计实现了可行性开发配置所有服务以开发模式screen会话运行配置相对精简资源消耗远低于生产环境。自动化从系统包安装、Python 虚拟环境创建、Git 克隆代码库到服务配置和启动全部自动化。可定制通过一个本地配置文件local.conf你可以灵活选择启用哪些组件、配置密码、网络等。然而DevStack 的“自动化”严重依赖从海外仓库拉取代码和依赖。对于国内用户这成了最大的障碍。常见的失败点包括Git 克隆 OpenStack 各组件仓库几十个速度极慢或失败。pip install从 PyPI 下载 Python 包超时。apt-get安装系统依赖缓慢。因此本文的“快速搭建”核心思路就是全面替换为国内镜像源并对关键步骤进行预缓存或加速。我们将把部署过程从一个充满不确定性的“黑盒”变成一个可控、可预期的流程。2. 环境准备打造一个“干净”的实验室一个稳定的基础系统是成功的一半。为了避免由残留配置引起的各种灵异问题强烈建议在一个全新的虚拟机或物理机中操作。2.1 系统选择与安装操作系统Ubuntu 22.04 LTS (Jammy Jellyfish)。这是目前 OpenStack 社区支持较好且稳定的版本。避免使用非 LTS 版本或过于陈旧的系统。安装方式建议使用 VMware Workstation、VirtualBox 或 KVM 创建虚拟机。物理机亦可。系统配置CPU至少 4 核。OpenStack 服务较多更多的核心有助于并行启动和运行。内存至少 8GB推荐 16GB 或以上。内存不足是 DevStack 启动失败或运行卡顿的常见原因。磁盘至少 100GB 可用空间。系统盘、镜像、实例磁盘都会占用空间。网络为虚拟机配置“桥接网络”Bridged或“NAT”模式。确保虚拟机可以访问互联网用于从国内镜像源下载。安装 Ubuntu 22.04 时注意在安装类型界面选择“最小化安装”以减少不必要的软件包。如果使用虚拟机务必安装 VMware Tools 或 VirtualBox Guest Additions 以提升体验。2.2 基础系统配置关键加速步骤系统安装完成后第一件事不是运行 DevStack而是更换软件源。这是后续所有操作快速进行的基础。备份原有源列表sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak替换为国内镜像源以阿里云镜像为例 使用sed命令一键替换或使用你喜欢的编辑器如vim或nano修改/etc/apt/sources.list文件。sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list也可以直接编辑文件将其内容替换为# 文件/etc/apt/sources.list deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse更新软件包列表sudo apt update sudo apt upgrade -y执行升级后如果内核有更新建议重启系统。安装基础工具sudo apt install -y git vim curl wget net-tools python3-pip配置 PIP 国内源创建或修改 PIP 配置文件。mkdir -p ~/.pip cat ~/.pip/pip.conf EOF [global] index-url https://pypi.tuna.tsinghua.edu.cn/simple extra-index-url https://mirrors.aliyun.com/pypi/simple/ trusted-host pypi.tuna.tsinghua.edu.cn mirrors.aliyun.com timeout 120 EOF这里配置了清华和阿里云的双源并增加了超时时间。3. 获取与配置 DevStack绕过 Git 克隆的坑传统的git clone https://opendev.org/openstack/devstack在国内速度很不稳定。我们可以使用 Gitee 等国内代码托管平台上的镜像。从 Gitee 克隆 DevStack# 进入用户主目录操作 cd ~ git clone https://gitee.com/mirrors/devstack.git cd devstack这一步通常很快。创建核心配置文件local.conf DevStack 的行为几乎完全由local.conf文件控制。我们在devstack目录下创建它。cat local.conf EOF [[local|localrc]] # 通用配置 ADMIN_PASSWORDsecretadmin # 管理员密码请修改为强密码 DATABASE_PASSWORD\$ADMIN_PASSWORD RABBIT_PASSWORD\$ADMIN_PASSWORD SERVICE_PASSWORD\$ADMIN_PASSWORD # 使用国内镜像源加速核心配置 GIT_BASEhttps://gitee.com # 将所有 OpenStack 组件的 Git 源指向 Gitee NOVNC_REPOhttps://gitee.com/mirrors/novnc.git SPICE_REPOhttps://gitee.com/mirrors/spice-html5.git # 启用基础服务 enable_service horizon # 启用 Web 控制台 enable_service key enable_service mysql enable_service rabbitmq # 网络配置使用 Neutron 而非旧的 nova-network disable_service n-net enable_service q-svc,q-agt,q-dhcp,q-l3,q-meta,neutron # 日志级别调整为 INFO避免 DEBUG 产生过多日志 LOGFILE/opt/stack/logs/stack.sh.log VERBOSETrue LOG_COLORFalse SYSLOGFalse LOGDAYS1 # 预下载镜像到国内源可选但能加速首次启动实例 # IMAGE_URLShttps://mirrors.tuna.tsinghua.edu.cn/centos-cloud/centos/images/CentOS-7-x86_64-GenericCloud-2009.qcow2 EOF这个配置文件做了几件关键事设置了统一的密码。GIT_BASEhttps://gitee.com这是最关键的加速配置它告诉 DevStack 所有 OpenStack 组件Nova, Neutron, Cinder 等都从 Gitee 镜像克隆速度极快。启用了 HorizonWeb 界面和 Neutron新一代网络服务。调整了日志配置避免磁盘被快速写满。4. 运行部署脚本监控与干预配置完成后就可以运行主部署脚本了。但不要简单地执行后就去喝茶需要观察其输出。开始部署./stack.sh脚本会开始执行输出大量信息。部署过程中的观察与应对阶段一安装系统依赖。脚本会调用apt-get install安装大量包。由于我们已经换源这一步通常很快。阶段二克隆 OpenStack 项目。你会看到一系列Cloning into ‘/opt/stack/xxx’...的信息。因为配置了 Gitee 源这里的速度会非常理想。如果某个仓库克隆失败偶尔会发生脚本可能会暂停。此时可以按CtrlC中断然后重新运行./stack.sh。DevStack 具有重试和继续执行的能力。阶段三创建虚拟环境与安装 Python 依赖。pip会从我们配置的国内源下载包速度有保障。如果遇到个别包安装失败通常是网络瞬时问题同样可以中断后重试。阶段四初始化数据库并启动服务。这一步基本是自动的你会看到各个服务n-api,q-svc等在screen会话中启动。整个部署过程在配置了国内源的良好网络下通常可以在 30 分钟到 1 小时内完成。如果遇到错误不要慌张仔细阅读错误信息。DevStack 的日志非常详细。5. 验证部署你的 OpenStack 真的跑起来了吗当脚本最终输出 “This is your host IP address: 192.168.x.x” 和 “Horizon is now available at http://192.168.x.x/dashboard” 以及 “The default users are: admin and demo” 时恭喜你部署成功了。但成功运行脚本不等于服务完全正常。我们需要进行多层验证基础服务检查# 查看所有运行在 screen 中的服务 sudo -H -u stack /opt/stack/devstack/stack-screenrc # 或者使用 screen 命令连接 screen -r stack在screen会话中你可以看到多个窗口每个窗口一个服务按CtrlA然后按数字键切换。检查是否有服务窗口显示错误或不断重启。使用 OpenStack 客户端验证 DevStack 会自动加载环境变量文件让我们使用 OpenStack 命令行客户端。# 加载管理员权限的环境变量 source ~/devstack/openrc admin admin # 列出所有 OpenStack 服务端点检查是否都正常注册 openstack endpoint list # 列出计算服务Nova状态 openstack compute service list # 列出网络代理Neutron状态 openstack network agent list所有服务的状态应该是up或active。登录 Dashboard 在宿主机浏览器中访问脚本输出的 Horizon 地址如http://你的虚拟机IP/dashboard。用户名admin密码secretadmin即你在local.conf中设置的ADMIN_PASSWORD 成功登录后浏览各个面板概览、实例、镜像、网络、卷确保没有报错信息。6. 创建第一个虚拟机完整的流程测试通过 Web 界面或命令行创建并启动一个虚拟机是检验 OpenStack 环境是否真正可用的终极测试。6.1 准备工作镜像、网络、密钥对在创建实例前需要准备三样东西操作系统镜像、虚拟网络和 SSH 密钥对。下载一个轻量级镜像使用国内源source ~/devstack/openrc admin admin # 使用 Cirros 镜像一个极小的测试用 Linux 镜像 wget -P /tmp https://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img # 将镜像上传到 OpenStack Glance 服务 openstack image create --file /tmp/cirros-0.6.2-x86_64-disk.img --disk-format qcow2 --container-format bare --public cirros-0.6.2 # 检查镜像列表 openstack image list检查默认网络DevStack 通常会创建一个名为private的私有网络和一个public的共享外部网络。检查它们openstack network list openstack subnet list如果网络不存在可能需要检查 Neutron 服务日志。创建 SSH 密钥对# 在本地创建密钥对如果已有 ~/.ssh/id_rsa.pub 可跳过 ssh-keygen -t rsa -N -f ~/.ssh/id_rsa # 将公钥添加到 OpenStack openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey openstack keypair list6.2 启动实例并验证连通性启动一个实例openstack server create --flavor m1.tiny --image cirros-0.6.2 --network private --key-name mykey my-first-instancem1.tiny是 DevStack 默认创建的最小规格1核512MB内存。查看实例状态openstack server list等待状态从BUILD变为ACTIVE。获取虚拟机的控制台日志或获取浮动 IP DevStack 默认可能不会自动分配浮动 IP公网IP。我们可以通过安全组规则先允许从宿主机直接访问私有 IP仅测试环境可以这样。首先找到实例的私有 IPopenstack server show my-first-instance -c addresses -f value在宿主机上尝试ping这个私有 IP需要确保宿主机和private网络在二层可达在 All-in-One 部署中通常可以。更规范的做法是创建一个浮动 IP 并关联# 创建一个浮动 IP openstack floating ip create public # 将浮动 IP 关联到实例 openstack server add floating ip my-first-instance 浮动IP地址然后就可以通过浮动 IP SSH 到 Cirros 实例了用户名cirros, 密码gocubsgo。7. 常见问题与排查思路即使按照上述步骤也可能遇到问题。以下是典型问题及解决方法。问题现象可能原因排查方式解决方案./stack.sh中途失败错误信息含git clone,Timeout,Could not resolve host网络连接问题或GIT_BASE配置未生效1. 检查local.conf中GIT_BASE设置。2. 手动ping gitee.com测试连通性。3. 查看失败日志的具体 URL。1. 确认local.conf格式正确[[localpip install阶段大量包下载失败或超时PIP 源配置未生效或网络问题1. 检查~/.pip/pip.conf文件内容和权限。2. 手动执行pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U测试。1. 确保pip.conf文件在正确位置且语法无误。2. 临时为stack.sh设置环境变量export PIP_INDEX_URLhttps://pypi.tuna.tsinghua.edu.cn/simple然后重新运行。服务启动失败日志中出现DBConnectionError或MySQL错误MySQL 数据库未启动或密码错误1.sudo systemctl status mysql或sudo service mysql status。2. 检查/opt/stack/logs/下mysql.log或相关服务日志。1. 尝试重启 MySQL:sudo service mysql restart。2. 检查local.conf中的密码配置并确认/etc/mysql下配置无误。有时需要彻底清理/opt/stack目录重试。Horizon 页面无法访问或登录后页面空白/报错Dashboard 服务 (horizon) 未正常运行或静态文件收集问题1.screen -r stack查看horizon窗口状态。2. 查看/opt/stack/logs/horizon.log。3. 浏览器开发者工具查看网络请求错误。1. 在screen的horizon窗口中尝试按CtrlC停止然后手动启动cd /opt/stack/horizon sudo -u stack ./manage.py runserver 0.0.0.0:80(不推荐长期用)。2. 更彻底的方法是重新收集静态文件cd /opt/stack/horizon sudo -u stack python3 manage.py collectstatic --noinput实例创建失败状态为ERROR计算节点 (nova-compute) 或网络节点 (neutron-agent) 问题资源不足1.openstack compute service list查看 nova 服务状态。2.openstack network agent list查看 neutron 代理状态。3. 查看/opt/stack/logs/nova-*.log和/opt/stack/logs/neutron-*.log中最近的错误。1. 确保screen中n-cpu和q-agt等服务窗口正常运行。2. 检查虚拟机资源是否充足内存、磁盘。3. 尝试重启相关服务在对应的screen窗口中按CtrlC然后按上箭头找回启动命令再回车。实例启动后无法获取 IP 或无法 Ping 通DHCP 服务 (q-dhcp) 故障或网络命名空间问题安全组规则禁止1.openstack subnet list查看子网详情确认 DHCP 已启用。2.sudo ip netns list查看网络命名空间sudo ip netns exec qdhcp-net-id ping instance-ip测试。3.openstack security group rule list default查看默认安全组规则。1. 检查screen中q-dhcp窗口日志。2. 为默认安全组添加允许 ICMP 和 SSH 的规则openstack security group rule create --proto icmp default和openstack security group rule create --proto tcp --dst-port 22 default。最重要的排查工具是日志。所有服务的日志都位于/opt/stack/logs/目录下。当遇到问题时首先查看相关日志文件的末尾几行。8. 最佳实践与进阶配置一个能跑起来的 DevStack 只是开始。要让这个环境更稳定、更适合开发测试还需要一些优化。8.1 性能与稳定性优化分配更多资源如果宿主机资源允许为虚拟机分配更多 CPU 核心和内存如 8核16GB能显著提升多实例运行的稳定性。使用外部数据库可选DevStack 默认使用预装的 MySQL。对于频繁重启栈的场景可以配置使用宿主机上独立的 MySQL 实例避免数据随栈销毁而丢失。配置本地镜像缓存将常用的云镜像如 CentOS, Ubuntu Cloud提前下载到本地 HTTP 服务器或 Swift 对象存储中并在local.conf中通过IMAGE_URLS指定可以极大加速实例创建。# 在 local.conf 中添加 # 假设你在本地搭建了镜像服务 # IMAGE_URLShttp://local-mirror/centos-7.qcow2,http://local-mirror/ubuntu-2004.qcow28.2 开发与调试技巧使用unstack.sh和clean.sh./unstack.sh停止所有 OpenStack 服务但保留代码和数据。适合日常下班前关闭环境节省资源。./clean.sh警告此操作会清除所有数据库和配置将环境恢复到运行stack.sh之前的状态。当环境严重混乱时使用。单独重启服务不需要重启整个栈。进入screen -r stack切换到对应服务窗口如n-api按CtrlC停止然后按上箭头调出启动命令再回车即可。修改代码实时生效DevStack 以开发模式运行大部分 Python 服务在代码修改后会自动重载。但像 Horizon (Django) 可能需要手动重启apache2或horizon服务。8.3 安全注意事项虽为测试环境也需警惕修改默认密码local.conf中的ADMIN_PASSWORD以及MYSQL_PASSWORD,RABBIT_PASSWORD等务必改为强密码不要使用secretadmin。限制访问范围DevStack 的 Horizon 和 API 端点默认监听在0.0.0.0。如果虚拟机有公网 IP应在宿主机的防火墙如ufw上限制只允许特定 IP 访问 80 (Horizon) 和 5000 (Keystone API) 等端口。sudo ufw allow from 192.168.1.0/24 to any port 80,5000 sudo ufw enable定期清理测试环境会创建大量实例、镜像、网络。定期使用openstack server list,openstack image list,openstack volume list查看并删除不再需要的资源释放磁盘空间。9. 总结从“能用”到“好用”通过本文的步骤你应该已经成功在国内网络环境下利用镜像源加速搭建起了一个可运行的 OpenStack 开发测试环境。这个过程的核心可以总结为三点源头加速系统性地将apt,pip,git的源替换为国内镜像这是解决速度问题的根本。配置导向深刻理解local.conf文件是 DevStack 的总开关通过它我们可以规避很多默认的“坑”比如指定组件仓库源、选择网络服务等。过程可控部署不是一蹴而就的需要观察日志、理解步骤、并在遇到问题时能有效排查screen和/opt/stack/logs/是你的好朋友。这个环境为你打开了 OpenStack 世界的大门。接下来你可以深入某个组件阅读/opt/stack/nova等目录下的代码结合日志理解其工作流程。尝试 API 开发使用openstack命令行或 Python SDK (openstacksdk) 编写自动化脚本管理资源。集成外部系统尝试将 Cinder 后端对接本地 Ceph或者研究 Neutron 的 OVS 或 Linux Bridge 插件。学习升级与运维虽然 DevStack 不适合生产但通过它理解各服务间的依赖和配置对理解生产部署大有裨益。最后记住 DevStack 的定位——快速、轻量、可丢弃的沙盒。不要指望用它来承载重要业务。当你想尝试一个破坏性操作或新版本时大胆地./clean.sh然后重新开始这往往是最高效的方式。