本章介绍如何通过 Samba/CIFS 共享导出 Ceph 集群中存储的数据,以便您可从 Windows* 客户端计算机轻松访问这些数据。另外还介绍了有助于您将 Ceph Samba 网关配置为加入到 Windows* 域中的 Active Directory 以进行用户身份验证和授权的信息。
由于客户端与存储区之间的额外网络跃点会导致协议开销增加并产生额外的延迟,因此与使用本机 Ceph 客户端相比,通过 Samba 网关访问 CephFS 可能会使应用性能大幅降低。
本机 CephFS 和 NFS 客户端不受通过 Samba 获取的文件锁定限制,反之亦然。如果通过其他方式访问 CephFS 支持的 Samba 共享路径,则依赖跨协议文件锁定的应用可能会出现数据损坏情况。
要配置和导出 Samba 共享,需要安装以下包: samba-ceph 和 samba-winbind。如尚未安装这些包,请运行以下命令进行安装:
cephadm@smb >
zypper install samba-ceph samba-winbind
在导出 Samba 共享的准备过程中,需要选择用于充当 Samba 网关的合适节点。该节点必须能访问 Ceph 客户端网络,同时要有足够的 CPU、内存和网络资源。
可以通过 CTDB 和 SUSE Linux Enterprise High Availability Extension 提供故障转移功能。有关 HA 设置的详细信息,请参见第 20.1.3 节 “高可用性配置”。
请确保集群中已存在一个正常工作的 CephFS。有关详细信息,请参见第 11 章 “安装 CephFS”。
在 Ceph 管理节点上创建一个特定于 Samba 网关的密钥环,并将其复制到 Samba 网关节点:
cephadm@adm >
ceph
auth get-or-create client.samba.gw mon 'allow r' \ osd 'allow *' mds 'allow *' -o ceph.client.samba.gw.keyringroot@master #
scp
ceph.client.samba.gw.keyring SAMBA_NODE:/etc/ceph/
将 SAMBA_NODE 替换为 Samba 网关节点的名称。
在 Samba 网关节点上执行以下步骤。将 Samba 连同 Ceph 集成包一起安装:
cephadm@smb >
sudo zypper in samba samba-ceph
将 /etc/samba/smb.conf
文件的默认内容替换为以下内容:
[global] netbios name = SAMBA-GW clustering = no idmap config * : backend = tdb2 passdb backend = tdbsam # disable print server load printers = no smbd: backgroundqueue = no [SHARE_NAME] path = / vfs objects = ceph ceph: config_file = /etc/ceph/ceph.conf ceph: user_id = samba.gw read only = no oplocks = no kernel share modes = no
oplocks
(也称为 SMB2+ 租用)可通过加速客户端缓存来提升性能,不过如果将其他 CephFS 客户端(例如内核 mount.cephfs
、FUSE 或 NFS Ganesha)与 Samba 一起部署,该机制目前并不安全。
如果所有 CephFS 文件系统路径访问都专由 Samba 处理,则可安全启用 oplocks
参数。
目前,在使用 CephFS vfs 扩展模块运行的共享中,需要禁用 kernel share modes
,文件处理工作才能正常进行。
由于 vfs_ceph
不需要文件系统装入,共享路径会解析为所挂接 Ceph 集群上的 Ceph 文件系统中的绝对路径。要实现成功的共享 I/O,路径的访问控制列表 (ACL) 需要允许给定 Samba 客户端的映射用户进行访问。您可以通过 CephFS 内核客户端暂时装入,并对共享路径使用 chmod
、chown
或 setfacl
实用程序来修改 ACL。例如,要允许所有用户进行访问,请运行以下命令:
root #
chmod 777 MOUNTED_SHARE_PATH
启动并启用 Samba 守护进程:
cephadm@smb >
sudo systemctl start smb.servicecephadm@smb >
sudo systemctl enable smb.servicecephadm@smb >
sudo systemctl start nmb.servicecephadm@smb >
sudo systemctl enable nmb.service
尽管多节点 Samba + CTDB 部署比单节点部署的高可用性更佳(请参见第 20 章 “通过 Samba 导出 Ceph 数据”),但它并不支持客户端透明故障转移。应用可能会在 Samba 网关节点发生故障时出现短暂的中断。
本节提供一个示例来说明如何设置 Samba 服务器的双节点高可用性配置。该设置需要 SUSE Linux Enterprise High Availability Extension。两个节点分别名为 earth
(192.168.1.1
) 和 mars
(192.168.1.2
)。
有关 SUSE Linux Enterprise High Availability Extension 的详细信息,请参见 https://www.suse.com/documentation/sle-ha-15/。
此外,使用两个浮动虚拟 IP 地址可让客户端连接到服务,不管该服务在哪个物理节点上运行均如此。192.168.1.10
用于通过 Hawk2 进行集群管理,192.168.2.1
专门用于 CIFS 导出。这样,以后便可更轻松地应用安全限制。
以下过程介绍示例安装。https://www.suse.com/documentation/sle-ha-15/book_sleha_quickstarts/data/art_sleha_install_quick.html 上提供了更多详细信息。
在管理节点上创建一个特定于 Samba 网关的密钥环,并将其复制到上述两个节点上:
cephadm@adm >
ceph
auth get-or-create client.samba.gw mon 'allow r' \ osd 'allow *' mds 'allow *' -o ceph.client.samba.gw.keyringroot@master #
scp
ceph.client.samba.gw.keyringearth
:/etc/ceph/root@master #
scp
ceph.client.samba.gw.keyringmars
:/etc/ceph/
准备好 earth
和 mars
,以托管 Samba 服务:
在继续下一步之前,请确保已安装以下包: ctdb、 tdb-tools 和 samba (smb 和 nmb 资源需要)。
cephadm@smb >
zypper
in ctdb tdb-tools samba samba-ceph
确保服务 ctdb
、smb
和 nmb
已停止且未启用:
cephadm@smb >
sudo systemctl disable ctdbcephadm@smb >
sudo systemctl disable smbcephadm@smb >
sudo systemctl disable nmbcephadm@smb >
sudo systemctl stop smbcephadm@smb >
sudo systemctl stop nmb
在所有节点上打开防火墙的端口 4379
。这是为了使 CTDB 能够与其他集群节点通讯。
在 earth
上创建 Samba 的配置文件。这些文件稍后将自动同步到 mars
。
在 /etc/ctdb/nodes
中插入包含集群中每个节点的所有私用 IP 地址的所有节点:
192.168.1.1 192.168.1.2
配置 Samba。在 /etc/samba/smb.conf
的 [global]
部分中添加以下行。使用所选的主机名取代“CTDB-SERVER”(集群中的所有节点将显示为一个此名称的大节点,以方便操作)。另外,添加一个共享定义,以 SHARE_NAME 为例:
[global] netbios name = SAMBA-HA-GW clustering = yes idmap config * : backend = tdb2 passdb backend = tdbsam ctdbd socket = /var/lib/ctdb/ctdb.socket # disable print server load printers = no smbd: backgroundqueue = no [SHARE_NAME] path = / vfs objects = ceph ceph: config_file = /etc/ceph/ceph.conf ceph: user_id = samba.gw read only = no oplocks = no kernel share modes = no
请注意,/etc/ctdb/nodes
和 /etc/samba/smb.conf
文件需要在所有 Samba 网关节点上都保持一致。
安装并引导 SUSE Linux Enterprise High Availability 集群。
在 earth
和 mars
上注册 SUSE Linux Enterprise High Availability Extension:
root@earth #
SUSEConnect
-r ACTIVATION_CODE -e E_MAIL
root@mars #
SUSEConnect
-r ACTIVATION_CODE -e E_MAIL
在两个节点上安装 ha-cluster-bootstrap :
root@earth #
zypper
in ha-cluster-bootstrap
root@mars #
zypper
in ha-cluster-bootstrap
在 earth
上初始化集群:
root@earth #
ha-cluster-init
让 mars
加入该集群:
root@mars #
ha-cluster-join
-c earth
检查集群的状态。您应该会看到两个节点都已添加到集群中:
root@earth #
crm
status 2 nodes configured 1 resource configured Online: [ earth mars ] Full list of resources: admin-ip (ocf::heartbeat:IPaddr2): Started earth
在 earth
上执行以下命令,以配置 CTDB 资源:
root@earth #
crm
configurecrm(live)configure#
primitive
ctdb ocf:heartbeat:CTDB params \ ctdb_manages_winbind="false" \ ctdb_manages_samba="false" \ ctdb_recovery_lock="!/usr/lib64/ctdb/ctdb_mutex_ceph_rados_helper ceph client.samba.gw cephfs_metadata ctdb-mutex" ctdb_socket="/var/lib/ctdb/ctdb.socket" \ op monitor interval="10" timeout="20" \ op start interval="0" timeout="200" \ op stop interval="0" timeout="100"crm(live)configure#
primitive
nmb systemd:nmb \ op start timeout="100" interval="0" \ op stop timeout="100" interval="0" \ op monitor interval="60" timeout="100"crm(live)configure#
primitive
smb systemd:smb \ op start timeout="100" interval="0" \ op stop timeout="100" interval="0" \ op monitor interval="60" timeout="100"crm(live)configure#
group
g-ctdb ctdb nmb smbcrm(live)configure#
clone
cl-ctdb g-ctdb meta interleave="true"crm(live)configure#
commit
配置选项 ctdb_recovery_lock
中的二进制文件 /usr/lib64/ctdb/ctdb_mutex_ceph_rados_helper
中按如下顺序包含以下参数:CLUSTER_NAME、CEPHX_USER、RADOS_POOL 和 RADOS_OBJECT。
可追加一个额外的锁定超时参数来覆盖所用的默认值(10 秒)。使用更高的值将会增加 CTDB 恢复主节点故障转移时间,然而使用更低的值可能会导致不正确地将恢复主节点检测为停用状态,以致触发摆动故障转移。
添加集群 IP 地址:
crm(live)configure#
primitive
ip ocf:heartbeat:IPaddr2 params ip=192.168.2.1 \ unique_clone_address="true" \ op monitor interval="60" \ meta resource-stickiness="0"crm(live)configure#
clone
cl-ip ip \ meta interleave="true" clone-node-max="2" globally-unique="true"crm(live)configure#
colocation
col-with-ctdb 0: cl-ip cl-ctdbcrm(live)configure#
order
o-with-ctdb 0: cl-ip cl-ctdbcrm(live)configure#
commit
如果 unique_clone_address
设置为 true
,IPaddr2 资源代理将向指定的地址添加一个克隆 ID,从而导致出现三个不同的 IP 地址。这些地址通常是不需要的,但有助于实现负载平衡。有关此主题的更多信息,请参见 https://www.suse.com/documentation/sle-ha-15/book_sleha_guide/data/cha_ha_lb.html。
检查结果:
root@earth #
crm
status Clone Set: base-clone [dlm] Started: [ factory-1 ] Stopped: [ factory-0 ] Clone Set: cl-ctdb [g-ctdb] Started: [ factory-1 ] Started: [ factory-0 ] Clone Set: cl-ip [ip] (unique) ip:0 (ocf:heartbeat:IPaddr2): Started factory-0 ip:1 (ocf:heartbeat:IPaddr2): Started factory-1
从客户端计算机进行测试。在 Linux 客户端上运行以下命令,以检查能否从系统复制文件以及将文件复制到系统:
root #
smbclient
//192.168.2.1/myshare
您可以将 Ceph Samba 网关配置为支持 Active Directory (AD) 的 Samba 域的成员。作为 Samba 域成员,您可以针对来自导出 CephFS 的文件和目录在本地访问列表 (ACL) 中使用域用户和组。
本节介绍在配置 Samba 自身之前,您需要执行的一些准备步骤。首先,您需要准备一个干净的环境,这样有助于防止混淆,并可确认以前所安装的 Samba 系统中的文件没有与新安装的域成员混用。
所有 Samba 网关节点的时钟都需要与 Active Directory 域控制器保持同步。时钟偏差可能会导致身份验证失败。
确认没有正在运行的 Samba 或名称缓存进程:
cephadm@smb >
ps ax | egrep "samba|smbd|nmbd|winbindd|nscd"
如果输出列出了任何 samba
、smbd
、nmbd
、winbindd
或 nscd
进程,请将其停止。
如果您之前在此主机上运行过 Samba 安装,请删除 /etc/samba/smb.conf
文件。另外,请删除所有 Samba 数据库文件(例如 *.tdb
和 *.ldb
文件)。要列出包含 Samba 数据库的目录,请运行以下命令:
cephadm@smb >
smbd -b | egrep "LOCKDIR|STATEDIR|CACHEDIR|PRIVATE_DIR"
Active Directory (AD) 使用 DNS 来查找域控制器 (DC) 和服务(例如 Kerberos)。因此,AD 域成员和服务器需要能够解析 AD DNS 区域。
确认已正确配置 DNS 且正向和反向查找均可正确解析,例如:
cephadm@adm >
nslookup DC1.domain.example.com
Server: 10.99.0.1
Address: 10.99.0.1#53
Name: DC1.domain.example.com
Address: 10.99.0.1
cephadm@adm >
10.99.0.1
Server: 10.99.0.1
Address: 10.99.0.1#53
1.0.99.10.in-addr.arpa name = DC1.domain.example.com.
AD 使用 SRV 记录查找服务(例如 Kerberos 和 LDAP)。要确认能否正确解析 SRV 记录,请使用 nslookup
交互外壳,例如:
cephadm@adm >
nslookup
Default Server: 10.99.0.1
Address: 10.99.0.1
> set type=SRV
> _ldap._tcp.domain.example.com.
Server: UnKnown
Address: 10.99.0.1
_ldap._tcp.domain.example.com SRV service location:
priority = 0
weight = 100
port = 389
svr hostname = dc1.domain.example.com
domain.example.com nameserver = dc1.domain.example.com
dc1.domain.example.com internet address = 10.99.0.1
Samba 支持 Heimdal 和 MIT Kerberos 后端。要对域成员配置 Kerberos,请在您的 /etc/krb5.conf
文件中进行以下设置:
[libdefaults] default_realm = DOMAIN.EXAMPLE.COM dns_lookup_realm = false dns_lookup_kdc = true
上面的示例为 DOMAIN.EXAMPLE.COM 领域配置了 Kerberos。我们不建议在 /etc/krb5.conf
文件中设置任何进一步的参数。如果您的 /etc/krb5.conf
中包含 include
行,则您必须删除此行,否则该文件将无法工作。
当您将主机加入域中时,Samba 会尝试在 AD DNS 区域中注册其主机名。为此,net
实用程序需要能够使用 DNS 或 /etc/hosts
文件中的正确条目来解析主机名。
要确认您的主机名解析正确,请使用 getent hosts
命令:
cephadm@adm >
getent hosts example-host
10.99.0.5 example-host.domain.example.com example-host
主机名和 FQDN 不得解析为 127.0.0.1 IP 地址或与域成员的 LAN 接口上所用 IP 地址不同的任何 IP 地址。如果未显示输出或主机解析为错误的 IP 地址,而您未在使用 DHCP,请在 /etc/hosts
文件中设置正确的条目:
127.0.0.1 localhost 10.99.0.5 example-host.samdom.example.com example-host
/etc/hosts
如果您在使用 DHCP,请检查 /etc/hosts
是否仅包含“127.0.0.1”行。如果仍然有问题,请联系 DHCP 服务器的管理员。
如果您需要添加计算机主机名的别名,请将别名添加到以计算机 IP 地址开头的行的末尾,切勿添加到“127.0.0.1”行。
本节介绍有关您需要在 Samba 配置文件 /etc/samba/smb.conf
中包含的特定配置选项的信息。
winbindd
中用于 ID 映射的后端 #如果您需要让您的用户使用不同的登录外壳和/或 Unix 主目录路径,或者让他们在任何地方都使用相同的 ID,您需要使用 winbind“ad”后端并将 RFC2307 属性添加到 AD 中。
创建用户或组时,系统不会自动添加 RFC2307 属性。
DC 上找到的 ID 号(3000000 范围内的编号)不是 RFC2307 属性,将不会在 Unix 域成员上使用。如果您需要在任何地方都使用相同的 ID 号,请将 uidNumber
和 gidNumber
属性添加到 AD 中,并在 Unix 域成员上使用 winbind“ad”后端。如果您决定将 uidNumber
和 gidNumber
属性添加到 AD 中,请不要使用 3000000 范围内的编号。
如果您的用户仅将 Samba AD DC 用于身份验证目的,而不会在其上存储数据或登录到其中,则您可使用 winbind“rid”后端。如此,系统会依据 Windows* RID 来计算用户和组 ID。如果您在每个 Unix 域成员上的 smb.conf
中都使用相同的 [global]
段落,您将会获得相同的 ID。如果您使用“rid”后端,则不需要向 AD 添加任何内容,系统将会忽略 RFC2307 属性。使用“rid”后端时,请在 smb.conf
中设置 template shell
和 template homedir
参数。它们是全局设置,会为所有用户设置相同的登录外壳和 Unix 主目录路径(RFC2307 属性则不同,可用来分别设置不同的 Unix 主目录路径和外壳)。
如果您需要让您的用户和组在任何地方都使用相同的 ID,但只需要为他们设置相同的登录外壳和相同的 Unix 主目录路径,还可使用另一种方法来设置 Samba。您可以通过使用 winbind“ad”后端并在 smb.conf
中使用模板行来实现此目的。使用此方法时,您仅需将 uidNumber
和 gidNumber
属性添加到 AD 中。
有关可用 ID 映射后端的详细信息,请参见下列相关手册页:man 8 idmap_ad
、man 8 idmap_rid
和 man 8 idmap_autorid
。
决定好使用哪个 winbind 后端后,您需要在 smb.conf
中设置 idmap config
选项来指定要使用的范围。默认情况下,Unix 域成员上有多个用户和组 ID 块:
ID 的情况下定位用户 | 范围 |
---|---|
0-999 | 本地系统用户和组。 |
从 1000 开始 | 本地 Unix 用户和组。 |
从 10000 开始 | DOMAIN 用户和组。 |
根据上述范围,您不应将“*”或“DOMAIN”范围设置为 999 以内,因为它们会与本地系统用户和组发生冲突。您还应为任何本地 Unix 用户和组留出余地,因此将 idmap config
范围设置为从 3000 开始是不错的折衷方法。
您需要确定“DOMAIN”可能会增长到多大,并决定是否打算建立任何受信任的域。然后,便可按如下所示来设置 idmap config
范围:
领域 | 范围 |
---|---|
* | 3000-7999 |
DOMAIN | 10000-999999 |
TRUSTED | 1000000-9999999 |
root
用户 #Samba 可让您将域帐户映射到本地帐户。通过此功能,您可以用不同于客户端上请求执行操作的帐户的用户身份在域成员的文件系统上执行文件操作。
将域管理员映射到本地 root
帐户属于可选操作。请仅在域管理员需要能够使用 root
权限在域成员上执行文件操作时配置该映射。请注意,将 Administrator 映射到 root
帐户后,其便不能以“Administrator”身份登录 Unix 域成员。
要将域管理员映射到本地 root
帐户,请执行以下步骤:
将以下参数添加到 smb.conf
文件的 [global]
段落:
username map = /etc/samba/user.map
创建包含以下内容的 /etc/samba/user.map
文件:
!root = DOMAIN\Administrator
使用“ad”ID 映射后端时,请不要为域管理员帐户设置 uidNumber
属性。如果为域管理员帐户设置了该属性,其值会覆盖 root
用户的本地 UID“0”,因而会导致映射失败。
有关详细信息,请参见 smb.conf
手册页 (man 5 smb.conf
) 中的 username map
参数。
要将主机加入 Active Directory,请运行以下命令:
cephadm@smb >
net ads join -U administrator
Enter administrator's password: PASSWORD
Using short domain name -- DOMAIN
Joined EXAMPLE-HOST to dns domain 'DOMAIN.example.com'
要使域用户和组可供本地系统使用,您需要启用名称服务开关 (NSS) 库。在 /etc/nsswitch.conf
文件中,将 winbind
条目追加到以下数据库:
passwd: files winbind group: files winbind
将 files
条目指定为这两个数据库的第一个源。这可让 NSS 在查询 winbind
服务之前,先从 /etc/passwd
和 /etc/group
文件中查找域用户和组。
不要将 winbind
条目添加到 NSS shadow
数据库中。这样做可能会导致 wbinfo
实用程序失败。
不要在本地 /etc/passwd
文件中使用与域中相同的用户名。
要让 Unix 域成员具备完整功能,您需要启用并启动以下三项服务:smbd
、nmbd
和 winbindd
。请通过使用以下命令启用并启动这些服务:
cephadm@smb >
sudo systemctl enable smbd.service && systemctl start smbd.servicecephadm@smb >
sudo systemctl enable nmbd.service && systemctl start nmbd.servicecephadm@smb >
sudo systemctl enable winbindd.service && systemctl start winbindd.service
nmbd
是可选服务
如果您不需要网络浏览,则无需在 Unix 域成员上启用并启动 nmbd
服务。
winbindd
连接性 #winbindd
Ping #
要验证 winbindd
服务能否连接到 AD 域控制器 (DC) 或主域控制器 (PDC),请输入以下命令:
cephadm@smb >
wbinfo --ping-dc
checking the NETLOGON for domain[DOMAIN] dc connection to "DC.DOMAIN.EXAMPLE.COM" succeeded
如果前一条命令失败,请确认 winbindd
服务正在运行且 smb.conf
文件设置正确。
您可以使用 libnss_winbind
库查找域用户和组。例如,要查找域用户“DOMAIN\demo01”,请运行以下命令:
cephadm@smb >
getent passwd DOMAIN\\demo01
DOMAIN\demo01:*:10000:10000:demo01:/home/demo01:/bin/bash
要查找域组“Domain Users”,请运行以下命令:
cephadm@smb >
getent group "DOMAIN\\Domain Users"
DOMAIN\domain users:x:10000:
借助名称服务开关 (NSS) 库,您可以在命令中使用域用户帐户和组。例如,要将文件的所有者设置为“demo01”域用户,并将组设置为“Domain Users”域组,请输入以下命令:
cephadm@smb >
chown "DOMAIN\\demo01:DOMAIN\\domain users" file.txt