让Samba能够使用Spotlight

我已经让Samba上公开的存储设备可以通过Spotlight搜索,为此我写下了备忘录。

为什么要尝试运行Spotlight?
当试图在samba上运行TimeMachine时,发现它无法正常工作的原因似乎与Spotlight有关。为了验证这一点,尝试运行了它。下面的链接是关于这个混乱过程的记录。

 

首先

「Spotlightが動作した」と言うだけ1であり、それ以上の検証は行っていない。
筆者はJavaやelasticsearchでは ど素人 なので、elasticsearchやfscrawlerの設定には ほぼ確実に 不適切な所があると思われる2。ご指摘頂ければ幸いである。
elasticsearchへのアクセスにはパスワードすら設定できない。これはsamba4.1.13でパスワード等を指定する手段が無い為。おそらく近い将来のバージョンでサポートされると思われる。
以下の例では、sambaサーバ上の/share1, /share2と言うディレクトリを、それぞれShare1, Share2と言う名前で公開している。

环境

    • OS: FreeBSD 12.2-RELEASE-p11 amd64

 

    samba: 4.13.14

桑巴

对samba进行编译

ports/pkg 里的 samba 不支持 Spotlight。因此需要先将 ports 设置为支持 Spotlight,然后进行编译和安装。

# cd /usr/ports/net/samba413
# make config
      (SPOTLIGHTにチェックを入れる)
# make clean all deinstall reinstall

smb4.conf的配置文件

以下一种可能的中文表达方式:
最低限度的必要设置应该位于[全局]部分。

    # Spotlight
    spotlight backend = elasticsearch 
    elasticsearch:address = 127.0.0.1
    elasticsearch:port = 9200

添加一个支持Spotlight的卷,并附加上.

    spotlight=yes

只需要给它加上即可。
以下是参考笔者正在使用的smb4.conf的摘录。

smb4.conf的示例:smb4.conf
[全局]
工作组 = WORKGROUP
安全性 = 用户
服务器最小协议 = SMB2
服务器字符串 = <您的服务器>
服务器角色 = 独立服务器
DOS文件模式 = 是
存储DOS属性 = 是
映射存档 = 否
Unix扩展 = 否

# 禁止文件
删除禁止文件 = 是
禁止文件 = /._*/.DS_Store/

# Spotlight
Spotlight后端 = Elasticsearch
Elasticsearch:地址 = 127.0.0.1
Elasticsearch:端口 = 9200

# VFS
# 对于ZFS
vfs对象 = zfsacl catia fruit streams_xattr
# 对于UFS
# vfs对象 = acl_xattr catia fruit streams_xattr

# vfs_zfsacl
nfs4:chown = 是

# vfs_fruit
fruit:zero_file_id = 是
fruit:metadata = 流
fruit:veto_appledouble = 否
fruit:resource = xattr
fruit:model = PowerMac

# vfs_streams_xattr
streams_xattr:store_stream_type = 否
streams_xattr:prefix = user.

[共享1]
路径 = /share1
只读 = 否
有效用户 = <您的用户名>
可浏览 = 是
可写入 = 是
Spotlight = 是

[共享2]
路径 = /share2
只读 = 否
有效用户 = <您的用户名>
可浏览 = 是
可写入 = 是
Spotlight = 是

Elasticsearch: 弹性搜索

安装

# pkg install elasticsearch7 openjdk15

设定

Elasticsearch的配置
cluster.name: samba
node.name: node1
path.data: /var/db/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 127.0.0.1
http.port: 9200
xpack.ml.enabled: false
discovery.type: single-node
xpack.security.enabled: false
JVM的设置
####################################
## IMPORTANT: JVM heap size
####################################
       :
     (略)
       :
##
## -Xms4g
## -Xmx4g
##

要将以下内容更改为中文(如果将堆大小更改为2GB时),只需要一种选项:

-Xms2g
-Xmx2g
默认情况下,Elasticsearch会占用一半的物理内存。如果只用于Spotlight,2G字节左右就足够了。通过下面的脚本(esmem.py),可以检查Elasticsearch使用的堆内存比例,以确认分配量是否合理。
脚本: `esmem.py`esmem.py
#!/usr/bin/env python3

import requests
import json
import time

r = requests.get(‘http://localhost:9200/_nodes/stats/jvm’)
j = json.loads(r.text)

for node in j[‘nodes’].items():
id, properties = node
timestamp = time.strftime(‘%Y-%m-%d %H:%M:%S %z’,
time.localtime(properties[‘timestamp’]/1000))
name = properties[‘name’]
total = properties[‘jvm’][‘mem’][‘heap_used_percent’]
percent = properties[‘jvm’][‘mem’][‘heap_used_percent’]
print(timestamp, name, percent, sep=’,’)
break

/etc/rc.conf
/etc/rc.conf配置文件

增加以下内容

# elasticsearch
elasticsearch_enable="YES"
elasticsearch_java_home="/usr/local/openjdk15"
开机
$ sudo service elasticsearch start
启动后的设置

经过以下的设定3,集群健康状态由黄色变为绿色。

# 新しく作られるインデックスのレプリカ数を 0 に設定する。
$ curl  -H "Content-Type: application/json" -XPUT localhost:9200/_template/template_1 -d '
{
    "template" : "*",
    "settings" : {
        "number_of_shards" : 1, "number_of_replicas" : 0
    }
}'

# 既にインデックスが存在する場合、レプリカ数を 0 に変更する。
$ curl -H "Content-Type: application/json" -XPUT localhost:9200/*/_settings -d '{"number_of_replicas":0}'

fscrawler的中文释义

安装

请从这里下载适当的包,并解压到合适的目录中。
这里以fscrawler-es7-2.9.zip为例,下载并解压到/usr/local/fscrawler-es7-2.9/目录下,然后在/usr/local/目录下创建一个指向fscrawler-es7-2.9的符号链接,命名为fscrawler。

$ cd /usr/local
$ sudo unzip <somewhere>/fscrawler-es7-2.9.zip
$ sudo ln -s fscrawler-es7-2.9 fscrawler

设定

运行时设置 shí

fscrawler的配置文件在运行时默认存放在执行用户的$HOME/.fscrawler/目录下,但在这里我们决定将其放置在/usr/local/fscrawler/config/目录下。

执行以下操作。

$ sudo JAVA_HOME=/usr/local/openjdk15 /usr/local/fscrawler/bin/fscrawler job_share1 --config_dir /usr/local/fscrawler/config/ 

生成后,编辑/usr/local/fscrawler/config/job_share1/_settings.yaml文件。

---
name: "job_share1"
fs:
  url: "/share1"
  update_rate: "15m"
  excludes:
  - "*/~*"
  - "*/*~"
  - "*/[.]*"
  json_support: false
  filename_as_id: false
  add_filesize: true
  remove_deleted: true
  add_as_inner_object: false
  store_source: false
  index_content: true
  attributes_support: false
  raw_metadata: false
  xml_support: false
  index_folders: true
  lang_detect: false
  continue_on_error: true
  ocr:
    language: "eng"
    enabled: true
    pdf_strategy: "ocr_and_text"
  follow_symlinks: false
elasticsearch:
  nodes:
  - url: "http://127.0.0.1:9200"
  bulk_size: 100
  flush_interval: "5s"
  byte_size: "10mb"
  ssl_verification: false

只有name(会话名称),url(要创建索引的路径),excludes(排除索引目标的路径),continue_on_error(错误发生时是否继续),ssl_verification(是否进行SSL证书验证)这些才有更改。

最开始,为了排除以dot开头的文件,将其设为”- “*/.*””,但这样不正确地运行。
正确的方法是将其设为”- “*/[.]*””。

与上述相同

$ sudo JAVA_HOME=/usr/local/openjdk15 /usr/local/fscrawler/bin/fscrawler job_share2 --config_dir /usr/local/fscrawler/config/ 

运行命令并适当编辑”/usr/local/fscrawler/config/job_share2/_settings.yaml”文件。

定时任务

在这里,我们决定使用cron定期运行fscrawler,尽管它也可以常驻在samba服务器上。

#!/bin/sh
export JAVA_HOME=/usr/local/openjdk15
export FS_JAVA_OPTS="-DLOG_DIR=/var/log/fscrawler"

args="--loop 1 --config_dir /usr/local/fscrawler/config"

OPTS=""
JOBS=""

for OPT in "$@"; do
    case $OPT in
        --*)
            OPTS="$OPTS $OPT"
            ;;
        *)
            JOBS="$JOBS $OPT"
            ;;
    esac
done

for job in $JOBS; do
    /usr/local/fscrawler/bin/fscrawler $job $OPTS $args
done
在fscrawler.sh中,通过环境变量FS_JAVA_OPTS设置将日志保存在/var/log/fscrawler目录下,然而在fscrawler-es7-2.7中,由cron定时执行时,日志无法正常保存。升级到fscrawler-es7-2.9版本后问题得到解决。
# fscrawler
#%M %H  %d  %m  %w  user  command
0   4	*   *   1-6 root  /usr/local/sbin/fscrawler.sh --silent job_share1 job_share2
0   4	*   *   0   root  /usr/local/sbin/fscrawler.sh --silent --restart job_share1 job_share2
其他

在您不希望 Fscrawler 创建索引的目录中,需要创建一个名为 “.fscrawlerignore” 的文件。

$ cd somewhere-you-want-to-hide-from-spotlight
$ touch .fscrawlerignore

在上述设置中,已经设定忽略以点(dot)开头或以波浪号(tilde)开头或结尾的文件和目录。

整理日志4

在上述设置中,Elasticsearch将在/var/log/elasticsearch目录下创建日志文件。特别是samba-YYYY-MM-DD-1.{json,log}.gz文件每天都会被创建。同样,fscrawler也会在/var/log/fscrawler目录下创建documents-YYYY-MM-DD.log.gz和fscrawler-YYYY-MM-DD-[0-9]+.log.gz文件。

我希望删除这些旧文件,但是在Unix中使用的newsyslog和logrotate无法实现。因此我用Python编写了一个简单的脚本,并在cron中运行它。

脚本:/usr/local/sbin/elasticlog.py/usr/local/sbin/elasticlog.py
#!/usr/bin/env python3
#
# Elasticsearch的日志清理工具
# 用法:
# elasticlog.py [-d <天数>] <路径>
#
# 日志文件名称
# samba-%Y-%m-%d-1.{log,json}.gz

from datetime import datetime, date, timedelta
import argparse
import os
import re
import sys

parser = argparse.ArgumentParser()
parser.add_argument(“-d”, “–days”, help=”文件过期天数”, type=int, default=7)
parser.add_argument(“path”, help=”日志文件路径”, type=str, default=’.’)
parser.add_argument(“-n”, “–dry_run”, help=”仅检查文件,不删除”, action=”store_true”)
args = parser.parse_args()

if not os.path.isdir(args.path):
print(args.path, “不是一个目录”, file=sys.stderr)
exit(1)

if re.match(r’.*/$’, args.path):
p = args.path
else:
p = args.path+’/’

reg = re.compile(‘(^[A-Za-z][A-Za-z0-9]*)\-([0-9]{4}\-[0-9]{2}\-[0-9]{2})’)
lastdays = timedelta(days=args.days)
today = date.today()

for f in os.scandir(path=p):
m = reg.match(f.name)
if m:
fdate = date.fromisoformat((m.group(2)))

if (today-fdate) > lastdays:
if args.dry_run:
print(“rm”, p+f.name, file=sys.stderr)
else:
try:
os.unlink(p+f.name)
except (IsADirectoryError, FileNotFoundError, PermissionError) as f:
print(f, file=sys.stderr)
else:
if args.dry_run:
print(f.name, “比”, args.days, “天新”, file=sys.stderr)

exit(0)

cron设置

/etc/cron.d/elasticlog.cron
# elasticlog.cron

#%M %H %d %m %U 用户 命令
0 11 * * * root /usr/local/sbin/elasticlog.py /var/log/elasticsearch
5 11 * * * root /usr/local/sbin/elasticlog.py /var/log/fscrawler

似乎还有一种使用elasticsearch本体的方法,但是由于不太了解所以没有使用。

请参考

Samba with macOS Spotlight on FreeBSD with Elasticsearch
このページを元に調べた

Spotlight – SambaWiki
Samba projectによるSpotlight解説

Elasticsearchリファレンス [5.4] | Elastic
古いバージョン向けの日本語ドキュメント

Elasticsearch Guide [7.16] | Elastic
英語ドキュメントは、最新版が公開されている

Welcome to FSCrawler’s documentation! — FSCrawler 2.9-SNAPSHOT documentation
FSCrawlerのドキュメント

实际上,Spotlight的工作速度与Mac本身相比稍慢一些… ↩是elasticsearch术语是数据库领域的,这也是难以理解的部分之一。 ↩

参考了“当Elasticsearch在一个节点上的条件是黄色时,应该如何修复”的方法。 ↩

这里所说的日志是指Unix文化中的日志(在/var/log/目录下生成的文件)。与数据库文化中的(事务)日志不同,需要注意。 ↩

广告
将在 10 秒后关闭
bannerAds