OpenStack Manila 共享文件系统实战:从部署到 NFS 挂载全指南
在云环境中,除了块存储(Cinder)和对象存储(Swift),共享文件系统(Shared File System)同样是关键基础设施。多个虚拟机需要同时读写同一份数据的场景(如 Web 集群、日志聚合、开发协作)中,传统块设备无法满足需求。
为此,OpenStack 提供了 Manila ------ 一个支持多协议、多后端的共享文件系统服务。它抽象了底层存储细节,通过统一 API 提供 NFS、CIFS/SMB、GlusterFS、CephFS 等协议的共享目录。
本文将手把手带你完成:
- Manila 控制节点与计算节点的完整部署
- 基于 LVM 的 NFS 后端配置
- 创建共享目录并授权访问
- 在控制节点挂载验证
实验环境说明
- 控制节点:
controller (192.168.200.150)- 计算节点:
compute (192.168.200.151)- 存储设备:
/dev/sda6(用于 LVM 卷组)- OpenStack 版本:Train 或以上
- 安全假设:所有节点互通,防火墙已放行相关端口(如 2049/NFS)
一、Manila 核心概念
1. 什么是 Manila?
Manila 是 OpenStack 的共享文件系统即服务(FaaS)组件,具有以下特点:
- ✅ 多协议支持:NFS v3/v4、CIFS/SMB、HDFS、GlusterFS、CephFS 等
- ✅ 多后端驱动:可对接 NetApp、EMC、华为、LVM、Generic 等
- ✅ 租户隔离:每个 Project 可独立管理自己的共享目录
- ✅ 灵活授权:基于 IP、用户、AD 域等控制访问权限
💡 典型应用场景:
- 多台 Web 服务器共享静态资源
- CI/CD 流水线中的构建缓存
- 数据分析集群的输入/输出目录
2. 架构组件
| 组件 | 作用 |
|---|---|
| manila-api | 接收 REST 请求,处理认证与路由 |
| manila-scheduler | 调度共享请求到合适的后端 |
| manila-share | 实际创建/管理共享目录(运行在存储节点) |
| Driver | 与具体存储系统交互(如 LVM + NFS) |
📌 在本实验中:
manila-api和manila-scheduler运行在 controllermanila-share运行在 compute(兼作存储节点)
二、Manila 服务部署
1. 控制节点安装与配置
(1)创建数据库与用户
bash
source /etc/keystone/admin-openrc.sh
# 创建数据库
mysql -uroot -p000000 -e "
CREATE DATABASE IF NOT EXISTS manila;
GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'localhost' IDENTIFIED BY '000000';
GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'%' IDENTIFIED BY '000000';
"
# 创建服务用户
openstack user create --domain default --password 000000 manila
openstack role add --project service --user manila admin
# 注册服务与端点
openstack service create --name manila --description "OpenStack Shared File Systems" share
openstack service create --name manilav2 --description "OpenStack Shared File Systems V2" sharev2
openstack endpoint create --region RegionOne share public http://controller:8786/v1/%$tenant_id$s
openstack endpoint create --region RegionOne share internal http://controller:8786/v1/%$tenant_id$s
openstack endpoint create --region RegionOne share admin http://controller:8786/v1/%$tenant_id$s
openstack endpoint create --region RegionOne sharev2 public http://controller:8786/v2/%$tenant_id$s
openstack endpoint create --region RegionOne sharev2 internal http://controller:8786/v2/%$tenant_id$s
openstack endpoint create --region RegionOne sharev2 admin http://controller:8786/v2/%$tenant_id$s
(2)安装软件包
bash
yum install -y openstack-manila python-manilaclient
(3)配置 /etc/manila/manila.conf
ini
[database]
connection = mysql+pymysql://manila:000000@controller/manila
[DEFAULT]
transport_url = rabbit://openstack:000000@controller
state_path = /var/lib/manila
default_share_type = default_share_type
share_name_template = share-%s
rootwrap_config = /etc/manila/rootwrap.conf
api_paste_config = /etc/manila/api-paste.ini
my_ip = 192.168.200.150
auth_strategy = keystone
[keystone_authtoken]
memcached_servers = controller:11211
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = manila
password = 000000
[oslo_concurrency]
lock_path = /var/lib/manila/manila
(4)同步数据库并启动服务
bash
su -s /bin/sh -c "manila-manage db sync" manila
systemctl enable openstack-manila-api.service openstack-manila-scheduler.service
systemctl restart openstack-manila-api.service openstack-manila-scheduler.service
2. 计算节点安装与配置(作为存储后端)
(1)安装依赖
bash
yum install -y openstack-manila-share python2-PyMySQL libtalloc python-manilaclient MySQL-python
yum install -y lvm2 nfs-utils nfs4-acl-tools targetcli
(2)配置 Manila
ini
[database]
connection = mysql+pymysql://manila:000000@controller/manila
[DEFAULT]
transport_url = rabbit://openstack:000000@controller
my_ip = 192.168.200.151
api_paste_config = /etc/manila/api-paste.ini
rootwrap_config = /etc/manila/rootwrap.conf
state_path = /var/lib/manila
auth_strategy = keystone
default_share_type = default_share_type
enabled_share_protocols = NFS,CIFS
[keystone_authtoken]
# ...(同控制节点,略)
[oslo_concurrency]
lock_path = /var/lib/manila/tmp
(3)初始化 LVM 存储
bash
mkdir -p /var/lib/manila
chown manila: /var/lib/manila
# 使用 /dev/sda6 创建卷组
pvcreate /dev/sda6
vgcreate manila-volumes /dev/sda6
(4)配置 LVM 后端
在 manila.conf 末尾添加:
ini
[DEFAULT]
enabled_share_backends = lvm
[lvm]
share_backend_name = LVM
share_driver = manila.share.drivers.lvm.LVMShareDriver
driver_handles_share_servers = False
lvm_share_volume_group = manila-volumes
lvm_share_export_ips = 192.168.200.151
🔑 关键参数解释:
driver_handles_share_servers = False:表示不创建隔离的 Share Server(简化模式,适合测试)lvm_share_export_ips:NFS 导出的 IP 地址(即 compute 节点 IP)
(5)启动服务
bash
systemctl enable lvm2-lvmetad.target target.service nfs-server
systemctl restart lvm2-lvmetad.service target.service openstack-manila-share
三、使用 Manila 共享服务
1. 创建共享类型(Share Type)
bash
source /etc/keystone/admin-openrc.sh
# 创建默认共享类型(不使用 share network)
manila type-create default_share_type False
输出:
+----------------------+--------------------------------------+
| Property | Value |
+----------------------+--------------------------------------+
| required_extra_specs | driver_handles_share_servers : False |
| Name | default_share_type |
| Visibility | public |
| is_default | YES |
| ID | 0b12fc7b-3745-4683-ae5c-4ac8ab86c3be |
+----------------------+--------------------------------------+
查看类型列表:
bash
manila type-list
2. 创建共享目录
bash
# 创建 2GB 的 NFS 共享目录
manila create NFS 2 --name share-test
等待状态变为 available:
bash
manila list
输出示例:
+--------------------------------------+------------+------+-------------+-----------+-----------+--------------------+-----------------------------+-------------------+
| ID | Name | Size | Share Proto | Status | Is Public | Share Type Name | Host | Availability Zone |
+--------------------------------------+------------+------+-------------+-----------+-----------+--------------------+-----------------------------+-------------------+
| 7abe166b-ea00-4a5e-b54d-0db4adda2cdc | share-test | 2 | NFS | available | False | default_share_type | compute@lvm#lvm-single-pool | nova |
+--------------------------------------+------------+------+-------------+-----------+-----------+--------------------+-----------------------------+-------------------+
3. 授权访问
允许 192.168.200.0/24 网段读写访问:
bash
manila access-allow share-test ip 192.168.200.0/24 --access-level rw
查看授权列表:
bash
manila access-list share-test
输出:
+--------------------------------------+-------------+------------------+--------------+--------+------------+----------------------------+------------+
| id | access_type | access_to | access_level | state | access_key | created_at | updated_at |
+--------------------------------------+-------------+------------------+--------------+--------+------------+----------------------------+------------+
| 5dc2d4de-9085-43f0-859b-d68ce2ad8f36 | ip | 192.168.200.0/24 | rw | active | None | 2023-04-10T13:29:11.000000 | None |
+--------------------------------------+-------------+------------------+--------------+--------+------------+----------------------------+------------+
🗑️ 删除授权:
bashmanila access-deny share-test
4. 挂载共享目录
(1)获取挂载路径
bash
manila show share-test | grep path
# 输出:path = 192.168.200.151:/var/lib/manila/mnt/share-67952ac5-8a18-4710-a324-8c2ed8254c6e
(2)在控制节点挂载
bash
mkdir -p /mnt/share-test
mount -t nfs 192.168.200.151:/var/lib/manila/mnt/share-67952ac5-8a18-4710-a324-8c2ed8254c6e /mnt/share-test
(3)验证挂载
bash
df -Th | grep nfs
输出:
192.168.200.151:/var/lib/manila/mnt/share-... nfs4 2.0G 6.0M 1.8G 1% /mnt/share-test
✅ 此时可在 /mnt/share-test 中读写文件,多台虚拟机可同时挂载实现共享!
四、总结与对比
| 服务 | 类型 | 协议 | 多挂载 | 典型用途 |
|---|---|---|---|---|
| Cinder | 块存储 | iSCSI, RBD | ❌(通常单挂载) | 数据库盘、系统盘 |
| Swift | 对象存储 | HTTP/REST | ✅(只读) | 镜像、备份、静态资源 |
| Manila | 文件存储 | NFS, CIFS | ✅(读写) | Web 共享、日志、协作 |
生产建议:
- 使用专用存储节点运行
manila-share- 为不同性能需求创建多个 Share Type(如 SSD-NFS、HDD-CIFS)
- 结合安全组/NFS export 限制访问源
- 监控 LVM 卷组剩余空间
Manila 填补了 OpenStack 在共享文件存储领域的空白,使云平台真正具备企业级存储能力。掌握它,你的私有云将更贴近真实业务需求!
欢迎在评论区分享你的 Manila 实践经验!