openstack的使用——7. 共享文件系统manila服务

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 运行在 controller
  • manila-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       |
+--------------------------------------+-------------+------------------+--------------+--------+------------+----------------------------+------------+

🗑️ 删除授权:

bash 复制代码
manila 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 实践经验!

相关推荐
且从容.33 分钟前
ubuntu安装flink
linux·ubuntu·flink
数字新视界2 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落2 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨2 小时前
WSL2的安装与使用
linux·wsl
微小的鱼2 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng3 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮3 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
上火的金鱼妹3 小时前
k8s生产实际问题排查(网关,数据库读写等)
运维·服务器
孙克旭_4 小时前
k8s基础组件与创建资源
运维·docker·容器·kubernetes
jktantan4 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构