[Samba] でSpotlightを使えるようにした

SambaでSpotlightを使えるようにした
https://qiita.com/ftns/items/b023160d5a759eec2b77

前提

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

環境

OS: FreeBSD 12.2-RELEASE-p11 amd64
samba: 4.13.14

samba
sambaのコンパイル

ports/pkg の sambaは、Spotlight非対応である。よってportsをSpotlight対応に設定した上で、コンパイル&インストールする必要がある。

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

smb4.conf

最低限必要な設定は、[global]セクションに
[global]

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

を追加し、Spotlightをサポートするボリュームに、
[Share]

spotlight=yes

を加えれば良い。
参考までに筆者が運用しているsmb4.confの抜粋を以下の折りたたみ部分に示す。

smb4.confの例

elasticsearch
インストール

# pkg install elasticsearch7 openjdk15

設定
elasticsearch本体の設定
/usr/local/etc/elasticsearch/elasticsearch.yml

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の設定
/usr/local/etc/elasticsearch/jvm.options

####################################
## IMPORTANT: JVM heap size
####################################
:
(略)
:
##
## -Xms4g
## -Xmx4g
##

を、以下のように変更(heap sizeを2GByteにする場合)

-Xms2g
-Xmx2g

elasticsearchは、デフォルトでは物理メモリの半分を確保してしまう。Spotlightのみに使うなら、2Gbyte程度で十分である。
以下のscript(esmem.py)でelasticsearchが消費しているheapの割合を調べられるので、割り当て量が妥当か確認できる。

スクリプト: esmem.py

/etc/rc.conf

以下を追加

# elasticsearch
elasticsearch_enable=”YES”
elasticsearch_java_home=”/usr/local/openjdk15″

起動

$ sudo service elasticsearch start

起動後の設定

以下の設定により、クラスタヘルスが yellow → greenとなった。

# 新しく作られるインデックスのレプリカ数を 0 に設定する。
$ curl -H “Content-Type: application/json” -XPUT localhost:9200/_templadte/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
インストール

こちらから適切なパッケージをダウンロードし、適当なディレクトリに展開する。
ここでは例として、/usr/local/fscrawler-es7-2.7/に展開し、/usr/local/fscrawler -> fscrawler-es7-2.7と言うシンボリックリンクを張っておく。

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

設定
実行時の設定

fscrawlerの実行時の設定ファイルは、実行ユーザの$HOME/.fscrawler/以下に置かれる。

ここでは /usr/local/fscrawler/config/以下に置く事とする。

$ sudo JAVA_HOME=/usr/local/openjdk15 /usr/local/fscrawler/bin/fscrawler job_share –config_dir /usr/local/fscrawler/config/

上を実行すると、/usr/local/fscrawler/config/job_share/_settings.yaml が生成されるので、これを編集する。
/usr/local/fscrawler/config/job_share/_settings.yaml


name: “job_share”
fs:
url: “/share”
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(インデックスを作る対象のpath), excludes(インデックス対象から除外するpath), continue_on_error(エラー発生時に続けるか), ssl_verification(SSL証明書の検証を行うか)のみである。
cron

fscrawlerはsambaサーバ上に常駐させる事もできるが、ここではcronで定期的に動作させる事にする。
/usr/local/sbin/fscrawler.sh

#!/bin/sh
export JAVA_HOME=/usr/local/openjdk15
args=”$@ –silent –loop 1 –config_dir /usr/local/fscrawler/config”
jobs=”job_share”

for job in $jobs; do
/usr/local/fscrawler/bin/fscrawler $job $args
done

/etc/cron.d/fscrawler.cron

# fscrawler
#%M %H %d %m %w user command
0 4 * * 1-6 root /usr/local/sbin/fscrawler.sh
0 4 * * 0 root /usr/local/sbin/fscrawler.sh –restart

その他

fscrawlerにインデックスを作らせたくないディレクトリには、.fscrawlerignore と言うファイルを作っておく。

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

なお上記設定では、.(dot)で始まるか、~(tilde)が先頭か最後に付いているファイル・ディレクトリを無視するように設定している。
参考

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のドキュメント

 

コメント