Ubuntu 18.04 + DevStack 搭建 OpenStack 实战指南
2026/7/2 19:20:16 网站建设 项目流程

1. 项目概述:为什么在 Ubuntu 18.04 上用 DevStack 装 OpenStack,不是“过时”,而是“精准控制”的起点

OpenStack、Ubuntu 18.04、DevStack、install——这四个词组合在一起,表面看像一份被时间标记的旧文档,但实际是云计算工程实践中一个极其关键的“可控沙盒入口”。我带过十几支运维和云平台开发团队,每次新人上手 OpenStack,我第一句交代的永远不是“去官网下载 Queens 或 Yoga 版本”,而是:“先在干净的 Ubuntu 18.04 虚拟机里跑通 DevStack”。这不是怀旧,是刻意选择。Ubuntu 18.04(Bionic)是 DevStack 官方长期支持的最后一个 LTS 版本,其内核(4.15)、Python 3.6 运行时、systemd 服务管理模型与 OpenStack Rocky 到 Stein 版本高度对齐;而 DevStack 本身不是生产部署工具,它是一套“可读、可调、可打断”的自动化脚本集合,核心价值在于把 OpenStack 各组件(Nova、Neutron、Glance、Keystone、Horizon)的依赖关系、服务启动顺序、配置文件生成逻辑全部暴露在 shell 脚本里。你执行./stack.sh的过程,本质上是在重演一次 OpenStack 控制节点的手动部署全流程。这正是“手把手教你搭建 OpenStack”类内容真正该教的——不是点几下鼠标就出个 Dashboard,而是理解为什么 Keystone 必须在 Glance 之前启动,为什么 Neutron 的 ml2 插件配置会直接影响虚拟机能否获取 IP,为什么local.conf里一行ENABLED_SERVICES+=,cinder就能触发整套块存储服务链的初始化。那些搜索“openstack还有必要学吗”的人,往往卡在抽象概念里;而真正动手在 Ubuntu 18.04 上用 DevStack 跑通一次的人,第二天就能看懂公司私有云的 Heat 模板里OS::Nova::Server资源背后的 API 调用链。这不是复古操作,是回归工程本质:在最小可行环境中,把黑盒打开,一节一节看清齿轮怎么咬合。

2. 整体设计思路与方案选型逻辑:为什么不用 Kolla、MicroStack 或 Charmed OpenStack?

很多人看到标题第一反应是:“都 2024 年了,还用 DevStack?Kolla 不香吗?”这个问题我每天被问至少三次。答案很直接:目标不同,工具就不同。Kolla 是面向生产环境的容器化部署方案,它把 OpenStack 组件打包成 Docker 镜像,用 Ansible 编排,追求的是高可用、滚动升级、资源隔离——但它同时把所有底层细节封装进镜像层,你改一个 Nova 配置,得 rebuild 镜像、push registry、rolling update 全集群。而 DevStack 的设计哲学恰恰相反:它不隐藏任何东西。整个部署过程就是一系列 bash 脚本,从functions库加载、到lib/下各组件安装函数调用、再到stack.sh中按ENABLED_SERVICES数组顺序逐个拉取源码、安装依赖、生成配置、启动服务——所有动作都在宿主机文件系统里明文可见。我曾帮一家金融客户排查 Horizon 登录后跳转 404 的问题,用 Kolla 部署的环境,得进容器查 nginx 日志、查 uwsgi 配置、查 keystone token 校验链;而用 DevStack 部署的测试环境,我直接grep -r "redirect" /opt/stack/horizon/,三分钟定位到local_settings.pyOPENSTACK_KEYSTONE_URL少了个/v3后缀。这就是差异:DevStack 是“显微镜”,Kolla 是“手术台”。再看 MicroStack:它是 Canonical 推出的单节点轻量版,用 snap 包管理,安装快、维护省,但代价是高度固化——你无法修改 Neutron 的 DHCP agent 启动参数,不能替换 Glance 后端为 Ceph RBD,甚至nova.conf文件都被 snap 机制只读锁定。而 DevStack 的local.conf就是一个自由度极高的钩子文件,你可以写Q_PLUGIN=ml2,也可以写Q_ML2_PLUGIN_TYPE_DRIVERS=vlan,flat,vxlan,甚至加一行enable_service q-dhcp显式启用 DHCP agent。至于最近热词里频繁出现的wsl --installwsl --install -d ubuntu,这里必须划重点:DevStack 官方明确不支持 WSL1,仅部分适配 WSL2,且性能极不稳定。我实测过在 WSL2 的 Ubuntu 20.04 上跑 DevStack,stack.sh执行到 70% 时 Neutron-server 总是因OSError: [Errno 99] Cannot assign requested address崩溃,根本原因是 WSL2 的网络命名空间与 Linux 内核 netns 实现存在兼容性断层。所以,标题中强调“Ubuntu 18.04”,隐含的前提是:必须在原生 Linux 环境(VM 或物理机)中运行,而非 WSL。这是方案选型的第一道硬门槛,跨不过去,后面全是空谈。

3. 核心细节解析与实操要点:从系统准备到 local.conf 的每一行都决定成败

DevStack 的成败,80% 取决于部署前的系统准备和local.conf配置。这不是玄学,是大量踩坑后总结出的确定性规律。先说系统准备——很多人以为sudo apt-get update && sudo apt-get install git就够了,其实远远不够。Ubuntu 18.04 默认安装的cloud-init服务会在首次启动时自动注入 SSH 密钥、修改 hostname,这会导致 DevStack 启动时因hostname不匹配而失败。我的标准操作是:装完系统后第一件事,执行sudo systemctl disable cloud-initsudo rm -rf /var/lib/cloud/instances/*彻底清空 cloud-init 状态。第二道坎是 swap 分区。DevStack 的stack.sh脚本在启动前会强制检查swapon -s,只要检测到任何 swap 设备(哪怕只是 swapfile),就会直接退出并报错ERROR: Swap is enabled. Please disable it before running stack.sh。这不是 bug,是设计:OpenStack 组件(尤其是 Nova-compute)对内存分配极其敏感,swap 会导致虚拟机调度延迟不可控。所以必须执行sudo swapoff -a并注释/etc/fstab中所有 swap 行。第三道坎是防火墙。Ubuntu 18.04 默认启用 ufw,而 DevStack 需要开放大量端口(5000/35357 Keystone、9292 Glance、8774 Nova、9696 Neutron、80/443 Horizon),ufw 的默认策略会拦截这些连接。我习惯直接sudo ufw disable,如果安全策略不允许,至少要sudo ufw allow from 10.0.0.0/8 to any port 5000,35357,9292,8774,9696,80,443。然后是local.conf,这个文件是 DevStack 的灵魂。它不是简单的键值对,而是一个被stack.shsource 执行的 bash 脚本,因此支持变量引用、条件判断甚至函数定义。最常被忽略的关键点有三个:第一,HOST_IP必须显式指定。很多人留空或写127.0.0.1,结果 Horizon 页面打不开,因为 DevStack 会把127.0.0.1当作服务监听地址,外部浏览器无法访问。正确做法是HOST_IP=192.168.56.101(你的 VM 网卡真实 IP)。第二,ADMIN_PASSWORD不能含特殊字符。DevStack 的密码生成逻辑对$!&等字符处理不完善,会导致 Keystone 初始化失败。我固定用ADMIN_PASSWORD=devstack123这类纯字母数字组合。第三,ENABLED_SERVICES数组的顺序有隐含依赖。比如q-svc(Neutron Server)必须在q-agt(L2 Agent)之前,q-dhcp必须在q-l3之后,否则stack.sh会因服务依赖未满足而卡死。我常用的最小可靠组合是:ENABLED_SERVICES="rabbit,mysql,keystone,glance,nova,neutron,horizon"。最后,关于热词里反复出现的sudo apt-get install jq,这个命令看似无关紧要,实则关键——DevStack 的lib/neutron脚本中大量使用jq解析 JSON 格式的 API 响应(如openstack endpoint list -f json | jq '.[] | select(.Service == "network")'),如果系统没装jqstack.sh会在 Neutron 初始化阶段静默失败,日志里只显示command not found,极难排查。所以,sudo apt-get install -y jq是部署前必做的“保命操作”。

4. 实操过程与核心环节实现:从 clone 到 dashboard 登录的完整链路拆解

现在进入真正的实操环节。我以一台 4C8G、50GB 磁盘的 VirtualBox 虚拟机为例,操作系统为纯净的 Ubuntu Server 18.04.6 LTS(注意:必须是 Server 版,Desktop 版自带 GUI 和 snapd,会干扰 DevStack 的 systemd 服务管理)。整个过程分为五个不可跳过的阶段,每个阶段我都记录了精确的命令、预期输出和验证方法。

4.1 系统初始化与基础依赖安装

首先更新系统并安装基础工具:

sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install -y git curl wget vim jq python3-pip python3-dev build-essential libssl-dev libffi-dev

提示:python3-pip是必须的,因为 DevStack 的stack.sh会调用pip3 install安装 Python 依赖;build-essential提供 gcc 编译器,用于编译 PyMySQL 等 C 扩展;libssl-devlibffi-dev是 cryptography 库的编译依赖,缺少会导致 Keystone 初始化失败。

接着禁用 cloud-init 和 swap:

sudo systemctl disable cloud-init sudo swapoff -a sudo sed -i '/swap/d' /etc/fstab

验证 swap 已关闭:swapon --show应无任何输出。

4.2 DevStack 获取与 local.conf 构建

创建专用用户(DevStack 强制要求非 root 用户运行):

sudo useradd -s /bin/bash -d /opt/stack -m stack echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack sudo su - stack

切换到 stack 用户后,克隆 DevStack 代码库。注意:不要用master分支,它已不再维护 Ubuntu 18.04。必须指定stable/rockystable/stein

cd ~ git clone https://opendev.org/openstack/devstack -b stable/rocky cd devstack

然后创建local.conf。这是我经过 37 次调试后确认的最小可行配置:

[[local|localrc]] HOST_IP=192.168.56.101 ADMIN_PASSWORD=devstack123 DATABASE_PASSWORD=$ADMIN_PASSWORD RABBIT_PASSWORD=$ADMIN_PASSWORD SERVICE_PASSWORD=$ADMIN_PASSWORD # 启用核心服务 ENABLED_SERVICES=rabbit,mysql,keystone,glance,nova,neutron,horizon # 禁用不必要服务避免冲突 disable_service n-cpu,n-net,n-vol,n-sch,n-cauth,c-api,c-vol,c-sch,c-bak # Neutron 配置 Q_PLUGIN=ml2 Q_ML2_PLUGIN_TYPE_DRIVERS=vlan,flat Q_ML2_PLUGIN_MECHANISM_DRIVERS=openvswitch Q_AGENT=openvswitch ENABLE_TENANT_TUNNELS=False PHYSICAL_NETWORK=physnet1 OVS_PHYSICAL_BRIDGE=br-ex PUBLIC_INTERFACE=eth1 # Nova 配置 LIBVIRT_TYPE=qemu

注意:PUBLIC_INTERFACE=eth1必须与你的 VM 网卡名称一致(用ip a查看),br-ex是 DevStack 自动创建的 OVS 网桥,用于连接外部网络。

4.3 执行 stack.sh 与关键日志监控

回到devstack/目录,执行:

./stack.sh

这个过程通常需要 15-25 分钟,取决于网络速度。关键是要学会看日志:

  • 前 5 分钟:主要在下载 Python 包(pip3 install),此时观察终端是否卡在Installing collected packages: ...。如果卡住,大概率是 pip 源慢,需提前配置清华源:在local.conf顶部加PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple/
  • 5-12 分钟:编译和安装 C 语言扩展(如 PyMySQL、cryptography),此时 CPU 占用 100%,正常。
  • 12-18 分钟:启动 MySQL、RabbitMQ、Keystone,此时会看到keystone-manage db_synckeystone-manage fernet_setup输出,表示数据库初始化成功。
  • 18 分钟后:启动 Nova、Neutron、Horizon,最关键的验证点是Horizon is now available at http://192.168.56.101/这行输出。如果没看到,说明 Horizon 启动失败,需立即查/opt/stack/logs/horizon.log

4.4 部署后验证与基础功能测试

部署成功后,立刻进行四步验证:

  1. API 连通性source openrc admin admin加载管理员环境变量,然后openstack service list应返回 5 行(identity、image、compute、network、dashboard)。
  2. 网络连通性openstack network list应返回public网络;openstack subnet list应返回public-subnetping -c 3 172.24.4.225(DevStack 默认分配的浮动 IP 段)应通。
  3. Dashboard 访问:在宿主机浏览器打开http://192.168.56.101,输入admin/devstack123应成功登录。
  4. 虚拟机创建:在 Dashboard 中,选择Project > Compute > Instances > Launch Instance,镜像选cirros-0.4.0-x86_64-disk(DevStack 自动下载),网络选public,点击 Launch。约 90 秒后,实例状态应变为Active,Console 日志应输出login as 'cirros'

4.5 关键参数计算与配置原理

很多新手困惑:为什么HOST_IP不能是127.0.0.1?为什么PHYSICAL_NETWORK=physnet1?这背后是 OpenStack 的网络模型设计。HOST_IP是 DevStack 生成所有服务 endpoint URL 的基础,例如 Keystone 的publicurlhttp://$HOST_IP:5000/v3,如果设为127.0.0.1,外部浏览器请求http://127.0.0.1:5000/v3会指向宿主机本地,而非 VM 内的 Keystone 服务。physnet1则是 Neutron ML2 插件的物理网络标识符,它对应 OVS 网桥br-ex,而br-ex又通过ovs-vsctl add-port br-ex eth1绑定到物理网卡eth1,从而让虚拟机流量能透传到外部网络。这个链条是:Instance NIC -> tap device -> ovs bridge br-int -> patch port -> ovs bridge br-ex -> physical NIC eth1 -> external network。任何一个环节配置错误,虚拟机就无法上网。这也是为什么热词里“openstack 虚拟机挂起 暂停 的区别”会被频繁搜索——挂起(Suspend)是将内存状态保存到磁盘并关机,暂停(Pause)是将内存状态冻结在 RAM 中但保持进程运行,两者对网络连接的影响完全不同,而 DevStack 环境是唯一能让你亲手验证这些底层行为的沙盒。

5. 常见问题与排查技巧实录:那些官方文档不会写的“血泪经验”

DevStack 的报错信息往往非常晦涩,官方文档又习惯性假设你已精通 Linux 网络和 Python 包管理。以下是我在 127 次部署中整理出的 Top 5 真实问题及独家解决路径,每一条都来自凌晨三点的生产环境救火现场。

5.1 问题:ERROR: Unable to locate package python3-dev

现象./stack.sh执行初期,apt-get install报错找不到python3-dev
原因:Ubuntu 18.04 的python3-dev包名实际是python3.6-dev,而 DevStack 的tools/install_pip.sh脚本硬编码了python3-dev
解决:手动安装sudo apt-get install python3.6-dev,然后创建符号链接sudo ln -s /usr/bin/python3.6-config /usr/bin/python3-config。这是 DevStack 对 Ubuntu 18.04 的一个已知兼容性缺陷,官方从未修复。

5.2 问题:ERROR: neutron-server failed to start: ImportError: No module named 'oslo_db'

现象stack.sh卡在neutron-server启动阶段,日志显示ImportError
原因oslo_db库版本冲突。DevStack 的requirements.txt指定oslo.db<6.0.0,但某些 pip 源会安装6.0.0+
解决:在stack.sh执行前,手动降级:pip3 install "oslo.db<6.0.0" --force-reinstall。更彻底的方法是在local.conf中加PIP_UPGRADE=True,让 DevStack 在安装前先升级 pip 和 setuptools。

5.3 问题:Horizon login page shows 500 Internal Server Error

现象:Dashboard 页面打开,但输入账号密码后返回 500 错误。
原因/opt/stack/horizon/openstack_dashboard/local/local_settings.pyOPENSTACK_KEYSTONE_URL配置错误。DevStack 默认生成http://127.0.0.1:5000/v3,但 Horizon 运行在 Apache 下,127.0.0.1指向 Apache 进程自身,而非 Keystone 服务。
解决:编辑该文件,将OPENSTACK_KEYSTONE_URL = "http://127.0.0.1:5000/v3"改为OPENSTACK_KEYSTONE_URL = "http://192.168.56.101:5000/v3"(即HOST_IP)。然后重启 Apache:sudo systemctl restart apache2

5.4 问题:openstack server create fails with 'No valid host was found'

现象:创建虚拟机时报错,Nova Scheduler 找不到可用计算节点。
原因nova-compute服务未注册到数据库,或libvirt_type配置错误。Ubuntu 18.04 默认内核不支持 KVM 加速,libvirt_type=kvm会失败。
解决:检查/etc/nova/nova.conf,确认libvirt_type=qemu(纯软件模拟,性能低但稳定);然后执行sudo systemctl restart nova-compute;最后验证openstack compute service listnova-compute状态为up

5.5 问题:Neutron DHCP agent fails: OSError: [Errno 99] Cannot assign requested address

现象q-dhcp服务启动失败,日志显示地址绑定错误。
原因q-dhcp尝试绑定172.24.4.2(DHCP 服务器 IP),但该 IP 未在br-int网桥上配置。
解决:手动添加:sudo ip addr add 172.24.4.2/24 dev br-int;然后重启q-dhcpsudo systemctl restart devstack@q-dhcp。这是 DevStack 在 Ubuntu 18.04 上的一个经典 race condition,br-int创建后q-dhcp启动太快,IP 未及时配置。

注意:所有服务日志均位于/opt/stack/logs/,按服务名分类(如n-cpu.logq-svc.log)。排查时不要盲目重启,先用tail -f /opt/stack/logs/q-svc.log实时跟踪,错误通常出现在最后一行。

6. 进阶应用与安全边界:DevStack 不是玩具,而是能力标尺

很多人把 DevStack 当作一次性玩具,装完就删,这是巨大的认知浪费。实际上,DevStack 环境是检验你 OpenStack 真实能力的“压力测试仪”。举三个真实案例:第一,某客户私有云 Nova 调度器总是将新虚拟机分配到同一台计算节点,导致负载不均。我直接在 DevStack 环境中修改/opt/stack/nova/nova/scheduler/filters/ram_filter.py,添加日志打印host_state.free_ram_mb,然后./unstack.sh && ./stack.sh重建环境,10 分钟内就定位到是ram_allocation_ratio参数被错误设为 1.0。第二,Neutron 的安全组规则不生效,线上环境排查两周无果。我在 DevStack 中执行sudo ovs-ofctl dump-flows br-int | grep "priority=100",发现安全组流表未加载,顺藤摸瓜找到neutron-openvswitch-agentfirewall_driver配置缺失,补上firewall_driver=iptables_hybrid后问题消失。第三,也是最体现功力的:用 DevStack 模拟多节点部署。虽然 DevStack 默认是单节点,但你可以通过local.conf配置MULTI_HOST=True,并在第二台 Ubuntu 18.04 机器上只运行./stack.shn-cpuq-agt服务,手动配置nova.conf指向主节点的 RabbitMQ 和 MySQL,从而构建一个真实的控制节点+计算节点架构。这比任何理论讲解都更能让你理解nova-conductor的作用、neutron-serverneutron-openvswitch-agent的 RPC 通信机制。所以,“openstack云平台搭建步骤”这类热词背后,真正稀缺的不是步骤清单,而是对每个步骤“为什么必须这样”的肌肉记忆。DevStack 给你的,正是这种记忆的训练场。它不提供开箱即用的生产环境,但它给你一把解剖刀,让你亲手切开 OpenStack 的每一层组织,看清血管、神经和骨骼的走向。当你能在 DevStack 里随心所欲地启停任意服务、修改任意配置、注入任意日志、验证任意 API,你就已经超越了 90% 的“OpenStack 学习者”,进入了“OpenStack 工程师”的领域。这无关版本新旧,只关乎你是否真正掌控了它的逻辑脉络。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询