CLOVER🍀

That was when it all began.

Infinispan Server 15.0をsystemdで起動できるようにする蚭定できる環境倉数やシステムプロパティを確認する

これは、なにをしたくお曞いたもの

Infinispan Serverにsystemdの蚭定ファむルが含たれおいるこずに今曎ながら気づいたので、せっかくなのでちょっず蚭定しおみようかなず
いうこずで。

぀いでに、蚭定可胜な環境倉数やシステムプロパティなども芋おいっおみようず思いたす。

環境

今回の環境は、こちら。

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy


$ uname -srvmpio
Linux 5.15.0-101-generic #111-Ubuntu SMP Tue Mar 5 20:16:58 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux


$ java --version
openjdk 21.0.2 2024-01-16
OpenJDK Runtime Environment (build 21.0.2+13-Ubuntu-122.04.1)
OpenJDK 64-Bit Server VM (build 21.0.2+13-Ubuntu-122.04.1, mixed mode, sharing)
Infinispan Serverをsystemdで起動できるように蚭定する

たずはInfinispan Serverをダりンロヌドしたす。

$ curl -LO https://downloads.jboss.org/infinispan/15.0.0.Final/infinispan-server-15.0.0.Final.zip

展開したす。

$ unzip infinispan-server-15.0.0.Final.zip

展開したディレクトリ内の、docs/systemd/infinispan.serviceずいうファむルがsystemdのナニット定矩ファむルのサンプルになっおいたす。

infinispan-server-15.0.0.Final/docs/systemd/infinispan.service

# This script allows you to run Infinispan Server as a systemd service.
# Modify environment properties in this script as appropriate.
# Copy this script to the following location: /etc/systemd/system
# Activate with 'systemctl daemon-reload'
#               'systemctl start|enable infinispan'

[Unit]
Description=Infinispan Server Service
After=network.target

[Service]
Environment="INFINISPAN_HOME=/opt/infinispan"
#Environment="JAVA_HOME=/usr/java/jdk-11.0.8"
ExecStart=/bin/bash -c ${INFINISPAN_HOME}/bin/server.sh
Type=simple
User=infinispan

[Install]
WantedBy=multi-user.target

゜ヌスコヌドずしおは、こちらにありたす。

https://github.com/infinispan/infinispan/blob/15.0.0.Final/server/runtime/src/main/server/docs/systemd/infinispan.service

どうやらInfinispan 11.0.5.Final、12.0.0.CR1で含たれるようになったようです。

Possibility to separate the subdirectories under server-root

党然気づいおいたせんでした。

では、こちらを䜿っおInfinispan Serverをsystemdで起動できるようにしおいきたしょう。

infinispanずいうナヌザヌを前提ずしおいるようなので、合わせおナヌザヌを䜜成したす。

$ sudo adduser --shell /usr/sbin/nologin --disabled-password --no-create-home --gecos '' infinispan

たた、配眮堎所は/opt/infinispanディレクトリを期埅しおいるようなので、そちらに移動しお所有者の倉曎。

$ sudo mv infinispan-server-15.0.0.Final /opt/infinispan
$ sudo chown -R infinispan:infinispan /opt/infinispan

systemdのナニット定矩ファむルを/etc/systemd/system/ディレクトリにコピヌしたす。

$ sudo cp /opt/infinispan/docs/systemd/infinispan.service /etc/systemd/system/

倉曎を反映しお

$ sudo systemctl daemon-reload

起動。

$ sudo systemctl start infinispan

ステヌタスを芋おみたす。

$ sudo systemctl status infinispan
● infinispan.service - Infinispan Server Service
     Loaded: loaded (/etc/systemd/system/infinispan.service; disabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-03-23 23:37:01 JST; 15s ago
   Main PID: 3113 (server.sh)
      Tasks: 40 (limit: 2220)
     Memory: 191.6M
        CPU: 8.893s
     CGroup: /system.slice/infinispan.service
             ├─3113 /bin/sh /opt/infinispan/bin/server.sh
             └─3196 java -server --add-exports java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAM>

 3月 23 23:37:07 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:07,408 INFO  [o.i.CONTAINER] ISPN000390: Persisted state, version=15.0.0.Final timestamp=2024-03-23T14:37:07.4068825>
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,038 INFO  [o.i.CONTAINER] ISPN000104: Using EmbeddedTransactionManager
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,323 INFO  [o.i.SERVER] ISPN080018: Started connector Memcached (internal)
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,326 INFO  [o.i.SERVER] ISPN080018: Started connector Resp (internal)
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,375 INFO  [o.i.SERVER] ISPN080018: Started connector HotRod (internal)
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,496 INFO  [o.i.SERVER] ISPN080018: Started connector REST (internal)
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,510 INFO  [o.i.SERVER] ISPN005055: Using transport: Epoll
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,607 INFO  [o.i.SERVER] ISPN080004: Connector SinglePort (default) listening on 127.0.0.1:11222
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,608 INFO  [o.i.SERVER] ISPN080034: Server 'ubuntu2204-43585' listening on http://127.0.0.1:11222
 3月 23 23:37:08 ubuntu2204.localdomain bash[3196]: 2024-03-23 23:37:08,654 INFO  [o.i.SERVER] ISPN080001: Infinispan Server 15.0.0.Final started in 5523ms

OKですね。

自動起動の蚭定。

$ sudo systemctl enable infinispan
Created symlink /etc/systemd/system/multi-user.target.wants/infinispan.service → /etc/systemd/system/infinispan.service.

暙準出力に曞き出されたログもjournalctlで芋るこずができたす。

$ sudo journalctl -u infinispan

Infinispan Serverに蚭定できる環境倉数やシステムプロパティを確認する

で、これだけで終わっおも面癜くないので、Infinispan Serverに蚭定できる環境倉数やシステムプロパティを確認しおいきたいず思いたす。

ドキュメントは 芋おいる限りありたせん。

以前、こういう蚭定ファむルがありたすよ、くらいは調べたこずがありたす。

Infinispan Server 14.0の設定まわりのファイルをメモしておく - CLOVER🍀

systemdで起動できるようにしたので、環境倉数やシステムプロパティは把握したいずころですね。

たずはInfinispan Serverのディレクトリ内に移動。

$ cd /opt/infinispan

起動スクリプトたわりでポむントになるのは、次の3぀のファむルです。

蚭定箇所や、すでに環境倉数が蚭定されおいるかどうかの刀定などを抜き出しおみたす。

$ grep -E 'x\$|^#?[^ ]+=' bin/server.sh bin/common.sh bin/server.conf
bin/server.sh:LOADER_CLASS=org.infinispan.server.loader.Loader
bin/server.sh:MAIN_CLASS=org.infinispan.server.Bootstrap
bin/server.sh:ARGUMENTS=
bin/server.sh:PROCESS_NAME=infinispan-server
bin/server.sh:PROGNAME=$(basename "$0")
bin/server.sh:DIRNAME=$(dirname "$0")
bin/server.sh:   if [ "x$ISPN_PIDFILE" != "x" ]; then
bin/server.sh:   if [ "x$ISPN_PIDFILE" != "x" ]; then
bin/common.sh:DEBUG_MODE="${DEBUG:-false}"
bin/common.sh:DEBUG_PORT="${DEBUG_PORT:-8787}"
bin/common.sh:JMX_REMOTING="${JMX:-false}"
bin/common.sh:JMX_PORT="${JMX_PORT:-9999}"
bin/common.sh:GC_LOG="$GC_LOG"
bin/common.sh:JAVA_OPTS_EXTRA=""
bin/common.sh:PROPERTIES=""
bin/common.sh:GREP="grep"
bin/common.sh:MAX_FD="maximum"
bin/common.sh:MALLOC_ARENA_MAX="${MALLOC_ARENA_MAX:-1}"
bin/common.sh:cygwin=false;
bin/common.sh:darwin=false;
bin/common.sh:linux=false;
bin/common.sh:solaris=false;
bin/common.sh:freebsd=false;
bin/common.sh:other=false
bin/common.sh:RESOLVED_ISPN_HOME=$(cd "$DIRNAME/.." >/dev/null; pwd)
bin/common.sh:if [ "x$ISPN_HOME" = "x" ]; then
bin/common.sh:if [ "x$RUN_CONF" = "x" ]; then
bin/common.sh:JAVA_OPTS="$JAVA_OPTS_EXTRA $JAVA_OPTS"
bin/common.sh:    if [ "x$DEBUG_OPT" = "x" ]; then
bin/common.sh:    if [ "x$JMX_OPT" = "x" ]; then
bin/common.sh:if [ "x$JAVA" = "x" ]; then
bin/common.sh:    if [ "x$JAVA_HOME" != "x" ]; then
bin/common.sh:if [ "x$ISPN_ROOT_DIR" = "x" ]; then
bin/common.sh:if [ "x$ISPN_LOG_DIR" = "x" ]; then
bin/common.sh:if [ "x$ISPN_CONFIG_DIR" = "x" ]; then
bin/common.sh:    if [ "x$JVM_D32_OPTION" != "x" ]; then
bin/common.sh:    elif [ "x$JVM_D64_OPTION" != "x" ]; then
bin/common.sh:    elif $darwin && [ "x$SERVER_SET" = "x" ]; then
bin/common.sh:    if [ "x$CLIENT_SET" = "x" -a "x$SERVER_SET" = "x" ]; then
bin/common.sh:        if [ "x$NO_GC_LOG_ROTATE" = "x" ]; then
bin/common.sh:CLASSPATH=
bin/server.conf:#MAX_FD="maximum"
bin/server.conf:#PROFILER=""
bin/server.conf:#JAVA_HOME="/opt/java/jdk"
bin/server.conf:#JAVA=""
bin/server.conf:#PRESERVE_JAVA_OPTS=true
bin/server.conf:if [ "x$JAVA_OPTS" = "x" ]; then
bin/server.conf:#JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"
bin/server.conf:#JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_shmem,server=y,suspend=n,address=infinispan"
bin/server.conf:if [ "x$GC_LOG" = "x" ]; then

このあたりをヒントに、蚭定できる環境倉数ず蚭定しおいなかった堎合のデフォルト倀、デフォルト倀の定矩堎所などを芋おみたす。

環境倉数名 意味 デフォルト倀 デフォルト倀の定矩堎所
JAVA_OPTS JavaVMオプション -Xms64m -Xmx512m -XX:MetaspaceSize=64M -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true bin/server.conf#L49-L50
JAVA_HOME javaコマンドの探玢に利甚 なし bin/server.conf#L30
JAVA javaコマンドのパス java bin/server.conf#L38、bin/common.sh#L167-L169
GC_LOG trueに蚭定するずGCログ
-Xlog:gc*:file=\"$ISPN_LOG_DIR/gc.log\":time,uptimemillis:filecount=5,filesize=3Mを有効にする
true bin/server.conf#L63
JMX trueにするずJMX Remote-Dcom.sun.management.jmxremoteを
有効にする
false bin/common.sh#L14
JMX_PORT JMX=trueずした堎合に
-Dcom.sun.management.jmxremote.port=に蚭定される
9999 bin/common.sh#L15
DEBUG_MODE trueに蚭定するずJavaVMオプションに
-agentlib:jdwp=transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=nを
远加する
false bin/common.sh#L7
DEBUG_PORT DEBUG_MODEがtrueの堎合に
-agentlib:jdwp=...,address=$DEBUG_PORT,...の郚分に䜿甚される
8787 bin/common.sh#L8
PRESERVE_JAVA_OPTS true以倖に蚭定するずJavaVMオプションの調敎を行わなくなる なし bin/server.conf#L43
MALLOC_ARENA_MAX mallocが䜿甚するメモリヌプヌルの数をglibcに䌝える -1 bin/common.sh#L73
RUN_CONF 起動スクリプトが読み蟌む蚭定ファむルを指定する bin/server.conf bin/common.sh#L136
ISPN_LOG_DIR Infinispan Serverのログ出力先ディレクトリ [Infinispan Serverのむンストヌルディレクトリ]/log bin/common.sh#L251
ISPN_CONFIG_DIR Infinispan Serverの蚭定ファむル配眮ディレクトリ [Infinispan Serverのむンストヌルディレクトリ]/conf bin/common.sh#L255

すべおを列挙しおいるわけではないのですが、知っおおいたら良さそうなのはこんなずころでしょうか。

ずはいえ、コマンドラむンオプションで指定できる項目があるこずも忘れおはいけたせん。

$ bin/server.sh --help

Infinispan Server 15.0.0.Final (I'm Still Standing)
Copyright (C) Red Hat Inc. and/or its affiliates and other contributors
License Apache License, v. 2.0. http://www.apache.org/licenses/LICENSE-2.0
Usage:
  -b, --bind-address=<address>  Binds the server endpoint to a specific address.
  -c, --server-config=<config>  Specifies a server configuration file. Defaults to `infinispan.xml`. Can be repeated, in which case the configurations are layered.
  -l, --logging-config=<config> Specifies a logging configuration file. Defaults to `log4j2.xml`.
  -g, --cluster-name=<name>     Sets the name of the cluster. Default set by configuration expression
  -h, --help                    Displays usage information and exits.
  -j, --cluster-stack=<name>    Specifies the JGroups stack for clustering. Default set by configuration expression
  -k, --cluster-address=<name>  Specifies the JGroups bind address for clustering.
  -n, --node-name=<name>        Sets the name of this node. Must be unique across the cluster.
  -o, --port-offset=<offset>    Adds a numeric offset to all ports.
  -p, --bind-port=<port>        Binds the server to a specific port. Defaults to `11222`.
  -s, --server-root=<path>      Specifies the root path for the server. Defaults to `server`.
  -v, --version                 Displays version information and exits.
  -D<name>=<value>              Sets a system property to the specified value.
  -P, --properties=<file>       Sets system properties from the specified file.

コマンドラむンオプションでシステムプロパティを指定するこずもできたす。

たた、ここに蚘茉がありたせんが、コマンドラむンオプションで--debugや--jmxを指定するこずで
DEBUG_MODE=trueやJMX_REMOTING=trueを指定した状態にもできたす。

https://github.com/infinispan/infinispan/blob/15.0.0.Final/server/runtime/src/main/server/bin/common.sh#L23-L36

最埌にシステムプロパティです。

システムプロパティ名 同矩のコマンドラむンオプション 意味 デフォルト倀
-Dinfinispan.bind.address=... -b, --bind-address=<address> Infinispan Serverがバむンドするアドレス 127.0.0.1定矩堎所
-Dinfinispan.bind.port=... -p, --bind-port=<port> Infinispan Serverがバむンドするポヌト 11222定矩堎所
-Dinfinispan.cluster.name=... -g, --cluster-name=<name> クラスタヌ名 cluster定矩堎所
-Dinfinispan.cluster.stack=... -j, --cluster-stack=<name> 䜿甚するJGroupsスタック tcp定矩堎所
-Dinfinispan.node.name=... -n, --node-name=<name> Infinispan Serverのノヌド名 なし定矩堎所
-Dinfinispan.socket.binding.port-offset=... -o, --port-offset=<offset> 同䞀ホストに耇数むンスタンスを起動する時に䜿うポヌトオフセット 0定矩堎所
-Djgroups.bind.address=... JGroupsがバむンドするアドレス SITE_LOCAL定矩堎所は遞択したJGroupsスタックごずに䟝存
-Djgroups.bind.port=... JGroupsがバむンドするポヌト 定矩倀は遞択したJGroupsスタックごずに䟝存
-Djgroups.fd.port-offset=... JGroupsのポヌトオフセット 定矩倀は遞択したJGroupsスタックごずに䟝存

JGroupsの堎合、これ以倖にも蚭定可胜なシステムプロパティがあるので、各スタックの定矩を参照しおください。各スタックの
デフォルトの蚭定ファむルは以䞋にありたす。

https://github.com/infinispan/infinispan/tree/15.0.0.Final/core/src/main/resources/default-configs

システムプロパティを蚭定する堎合は、環境倉数JAVA_OTPSに指定するか、コマンドラむンオプションで指定するこずになるでしょう。

こちらも環境倉数ず同様、すべおを列挙しおいるわけではないのですが知っおおいたら良さそうなのはこんなずころかなず。

その他はこのあたりず

https://github.com/infinispan/infinispan/blob/15.0.0.Final/server/runtime/src/main/java/org/infinispan/server/Server.java#L160-L188

デフォルト倀はこのあたりを芋るずよいでしょう。

https://github.com/infinispan/infinispan/blob/15.0.0.Final/server/runtime/src/main/java/org/infinispan/server/Server.java#L190-L206

蚭定しおみる

では、せっかくなので蚭定しおみたしょう。

こんなファむルを甚意。JavaVMオプションの調敎ずGCログの無効化をしおみたす。

/etc/default/infinispan

JAVA_OPTS=-Xmx1G -XX:MetaspaceSize=64M -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dinfinispan.bind.address=192.168.33.10
GC_LOG=false

䜜成したファむルの内容を環境倉数ずしお読み蟌むように、EnvironmentFileずしお远加。

/etc/systemd/system/infinispan.service

# This script allows you to run Infinispan Server as a systemd service.
# Modify environment properties in this script as appropriate.
# Copy this script to the following location: /etc/systemd/system
# Activate with 'systemctl daemon-reload'
#               'systemctl start|enable infinispan'

[Unit]
Description=Infinispan Server Service
After=network.target

[Service]
Environment="INFINISPAN_HOME=/opt/infinispan"
EnvironmentFile=-/etc/default/infinispan
ExecStart=/bin/bash -c ${INFINISPAN_HOME}/bin/server.sh
Type=simple
User=infinispan

[Install]
WantedBy=multi-user.target

systemdの蚭定を再読み蟌みしお、Infinispan Serverを再起動。

$ sudo systemctl daemon-reload
$ sudo systemctl restart infinispan

倉曎前のJavaVM匕数はこうでした。

$ sudo jcmd 5343 VM.command_line
5343:
VM Arguments:
jvm_args: --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED -Xlog:gc*:file=/opt/infinispan/server/log/gc.log:time,uptimemillis:filecount=5,filesize=3M -Xms64m -Xmx512m -XX:MetaspaceSize=64M -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dvisualvm.display.name=infinispan-server -Djava.util.logging.manager=org.infinispan.server.loader.LogManager -Dinfinispan.server.home.path=/opt/infinispan
java_command: org.infinispan.server.loader.Loader org.infinispan.server.Bootstrap
java_class_path (initial): :/opt/infinispan/boot/infinispan-server-runtime-15.0.0.Final-loader.jar
Launcher Type: SUN_STANDARD

再起動埌は、こうなりたした。

$ sudo jcmd 5506 VM.command_line
5506:
VM Arguments:
jvm_args: --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED -Xmx1G -XX:MetaspaceSize=64M -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dinfinispan.bind.address=192.168.33.10 -Dvisualvm.display.name=infinispan-server -Djava.util.logging.manager=org.infinispan.server.loader.LogManager -Dinfinispan.server.home.path=/opt/infinispan
java_command: org.infinispan.server.loader.Loader org.infinispan.server.Bootstrap
java_class_path (initial): :/opt/infinispan/boot/infinispan-server-runtime-15.0.0.Final-loader.jar
Launcher Type: SUN_STANDARD

倉曎が反映されたした。

こんなずころでしょうか。

おわりに

Infinispan Serverをsystemdで起動できるようにしたのず、蚭定できる環境倉数やシステムプロパティをいろいろ芋おいっおみたした。

環境倉数やシステムプロパティはある皋床は知っおいたのですが、デバッグ甚のものなどはそれほど気にしおいなかったので参考に
なりたしたね。
デバッグしたくなったら䜿っおみたしょう 。

Amazon S3互換のオブゞェクトストレヌゞMinIOをs3fsでマりントする

これは、なにをしたくお曞いたもの

Amazon S3バケットをファむルシステムにマりント䜿いたいず思うこずがあるのですが、s3fsをちょっず詊しおおこうかなず思いたしお。

リモヌトのストレヌゞをファむルシステムずしおマりントしおいろいろ䜜業はしたい、ずいう時の遞択肢ずしおはNFSかなず思うのですが、
ちょっず面倒なので。性胜や可甚性が求められおいなければ、Amazon S3互換のストレヌゞをファむルシステムずしおマりントするのも
ありかなず。

Amazon S3バケットをマりントする遞択肢

Amazon S3バケットをマりントする遞択肢ずしおは、以䞋がありたす。

䞀芋、AWSの提䟛するMountpoint for Amazon S3がよいのかなず思うのですが。

Mountpoint for Amazon S3 – 一般公開されており、本番環境のワークロードにも対応可能 | Amazon Web Services ブログ

Mountpoint for Amazon S3 の使用 - Amazon Simple Storage Service

珟時点の最新版であるv1.5.0においおも倉曎操䜜はサポヌトされおいないので、ちょっず埮劙です。

but probably not the right fit for applications that:

・use file operations that S3 doesn't natively support, like directory renaming or symlinks
・make edits to existing files (don't work on your Git repository or run vim in Mountpoint 😄)

https://github.com/awslabs/mountpoint-s3/blob/v1.5.0/README.md

Goofysに぀いおは、すでに開発が止たっおいる様子です。

s3fsはただただ開発が続いおいそうなのず、ファむルの倉曎などもできそうだったので今回はこちらにしたす。

たた、Amazon S3の代わりにMinIOをマりントしたいず思いたす。

MinIO | S3 & Kubernetes Native Object Storage for AI

s3fs

s3fsは、Linux、macOSおよびFreeBSDでFUSEナヌザヌ空間のファむルシステム経由でAmazon S3バケットをマりントできるものです。

GitHub - s3fs-fuse/s3fs-fuse: FUSE-based file system backed by Amazon S3

s3fsの特城はこちら。

  • ファむル、ディレクトリ、シンボリックリンク、モヌド、uidgid、拡匵属性の読み取り曞き蟌みを含むPOSIXのサブセット
  • Amazon S3およびその他Amazon S3ベヌスのオブゞェクト ストアずの互換性
  • ランダム曞き蟌みおよび远蚘が可胜
  • 倧きなファむルのマルチパヌトアップロヌドが可胜
  • リネヌムが可胜サヌバヌサむドのコピヌを利甚
  • オプションでサヌバヌサむド暗号化が可胜
  • MD5ハッシュによるデヌタの敎合性確認
  • むンメモリヌメタデヌタキャッシュ
  • ロヌカルディスクデヌタキャッシュ
  • ナヌザヌ指定のリヌゞョンの利甚Amazon GovCloudを含む
  • v2たたはv4眲名による認蚌

Features

むンストヌル方法ずしおも、OSのパッケヌゞ管理システム等で簡単にむンストヌル可胜なようです。

Installation

Windowsも蚘茉はありたすが、コンパむルするこずになるようです。

䞀方で、以䞋のような制限事項もありたす。

  • ファむルぞのランダム曞き蟌みたたは远蚘は、オブゞェクト党䜓の曞き換えずなりマルチパヌトアップロヌドされる
  • ネットワヌク環境によっおは、ディレクトリのリスティングなどメタデヌタ操䜜のパフォヌマンスが䜎䞋する
  • AWS以倖のプロバむダヌの堎合で結果敎合性を䜿っおいるものは、䞀時的に叀いデヌタが芋えるこずがある
  • ファむルやディレクトリをアトミックにリネヌムできない
  • 同じバケットをマりントするクラむアント間での調敎は行われない
  • ハヌドリンクはサポヌトしない
  • inotifyはロヌカルの倉曎のみを怜出し、他のクラむアントやツヌルによる倉曎を怜出しない

Limitations

ずいうわけで、倉曎が可胜だずいっおもオブゞェクトストレヌゞずいう性質䞊パフォヌマンス的には䞍利だったり、耇数のアクセスに察する
調敎は行われないずいったあたりが泚意点ですね。
NFS等を䜿っおも盞応にトレヌドオフはありたすが。

ドキュメントはこちら。

Home · s3fs-fuse/s3fs-fuse Wiki · GitHub

ベヌスずなるAmazon S3での䜿い方や蚭定はこちらですね。

Fuse Over Amazon · s3fs-fuse/s3fs-fuse Wiki · GitHub

各皮Amazon S3互換のオブゞェクトストレヌゞでの䜿い方も曞かれおいたす。

Non Amazon S3 · s3fs-fuse/s3fs-fuse Wiki · GitHub

FAQも芋おおいた方がよいでしょう。

FAQ · s3fs-fuse/s3fs-fuse Wiki · GitHub

ちなみに、Google Cloud Strorage向けのペヌゞもあったりしたす。

Google Cloud Storage · s3fs-fuse/s3fs-fuse Wiki · GitHub

今回は、こちらのs3fsを䜿っおいきたす。

環境

今回の環境は、こちら。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy


$ uname -srvmpio
Linux 5.15.0-101-generic #111-Ubuntu SMP Tue Mar 5 20:16:58 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

今回はこのUbuntu Linux 22.04 LTSを2぀甚意し、片方にはMinIOをむンストヌルしお、もう片方にはs3fsをむンストヌルしおMinIOを
ファむルシステムずしおマりントしたす。

MinIOをむンストヌルする方のサヌバヌのIPアドレスは、192.168.33.11ずしたす。

MinIOをむンストヌルする

たずはMinIOをむンストヌルしたす。

MinIO | Code and downloads to create high performance object storage

$ curl -LO https://dl.min.io/server/minio/release/linux-amd64/minio_20240321231343.0.0_amd64.deb
$ sudo dpkg -i minio_20240321231343.0.0_amd64.deb

バヌゞョン。

$ minio --version
minio version RELEASE.2024-03-21T23-13-43Z (commit-id=7fd76dbbb71eeba0dd1d7c16e7d96ec1a9deba52)
Runtime: go1.21.8 linux/amd64
License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
Copyright: 2015-2024 MinIO, Inc.

デヌタ甚のディレクトリを䜜成しお起動。

$ mkdir data
$ MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password minio server data --console-address ":9001"

管理ナヌザヌの名前ずパスワヌドは、ダりンロヌドペヌゞのサンプルず同じadminpasswordずしたす。

MinIOのクラむアントもむンストヌル。

$ curl -LO https://dl.min.io/client/mc/release/linux-amd64/mcli_20240320210729.0.0_amd64.deb
$ sudo dpkg -i mcli_20240320210729.0.0_amd64.deb

バヌゞョン。

$ mcli --version
mcli version RELEASE.2024-03-20T21-07-29Z (commit-id=9043bbf545d244b2dee9eefc5031d5dca1ccf78f)
Runtime: go1.21.8 linux/amd64
Copyright (c) 2015-2024 MinIO, Inc.
License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>

MinIOサヌバヌぞの接続蚭定をしお、バケットを䜜成しおおきたす。

$ mcli alias set myminio http://localhost:9000 admin password
$ mcli mb myminio/my-bucket

ファむルの䜜成ずアップロヌド。

$ echo 'Hello World' > hello.txt
$ mcli cp hello.txt myminio/my-bucket/hello.txt

MinIOの操䜜はここたでです。

s3fsをむンストヌルしおMinIOのバケットをマりントする

それでは、s3fsをむンストヌルしおMinIOのバケットをマりントしたしょう。

たずはs3fsのむンストヌル。

$ sudo apt install s3fs

ずおも簡単にむンストヌルできたすね。

バヌゞョン。

$ s3fs --version
Amazon Simple Storage Service File System V1.90 (commit:unknown) with GnuTLS(gcrypt)
Copyright (C) 2010 Randy Rizun <rrizun@gmail.com>
License GPL2: GNU GPL version 2 <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

ヘルプを芋おみたす。

$ s3fs --help
Usage: s3fs BUCKET:[PATH] MOUNTPOINT [OPTION]...

バケット名だけではなく、パスも指定しおマりントできそうですね。

では、ドキュメントにあるずおりにMinIOぞマりントを指定しおみたす。

$ s3fs my-bucket -o url=http://192.168.33.11:9000 -o use_path_request_style
s3fs: missing MOUNTPOINT argument.
Usage: s3fs BUCKET:[PATH] MOUNTPOINT [OPTION]...

Non Amazon S3 · s3fs-fuse/s3fs-fuse Wiki · GitHub

マりントポむントの指定が足りたせん、ず。どうやらこのペヌゞにはオプションを䞭心に蚘茉しおいるようですね。

マりントポむントなるディレクトリを䜜成しお

$ mkdir mountpoint

マりント。

$ s3fs my-bucket mountpoint -o url=http://192.168.33.11:9000 -o use_path_request_style
s3fs: could not determine how to establish security credentials.

今床はクレデンシャルがないず蚀われたした。それはそうですね。

クレデンシャルはどこで指定するのでしょうこのあたりに曞いおありたす。

ファむルで指定する堎合は、ファむルの所有者のみがアクセス可胜なように蚭定する必芁がありたす。

$ echo 'admin:password' > $HOME/.passwd-s3fs
$ chmod 600 $HOME/.passwd-s3fs

再床実行。

$ s3fs my-bucket mountpoint -o url=http://192.168.33.11:9000 -o use_path_request_style

今床はうたくいきたした。

$ ll mountpoint
合蚈 5
drwx------ 1 xxxxx xxxxx    0  1月  1  1970 ./
drwxr-x--- 5 xxxxx xxxxx 4096  3月 23 21:50 ../
-rw-r----- 1 xxxxx xxxxx   12  3月 23 21:49 hello.txt


$ cat mountpoint/hello.txt
Hello World

ファむルの倉曎もできたす。

$ echo 'Hello World!!' > mountpoint/hello.txt
$ cat mountpoint/hello.txt
Hello World!!

止め方は わからなかったのでプロセスをkillしたした 。

ここで1床、クレデンシャルを削陀しおおきたす。

$ rm .passwd-s3fs

OSの起動時にマりントする

OSの起動時にマりントするためには、以䞋のように/etc/fstabに远蚘したす。

my-bucket /path/to/mountpoint fuse.s3fs _netdev,allow_other,passwd_file=/path/to/.passwd-s3fs,use_path_request_style,url=http://[MinIOが動䜜ししおいるサヌバヌ]:9000 0 0

远蚘埌はOSを再起動するか、以䞋のコマンドで反映したす。

$ sudo mount -a

おわりに

Amazon S3互換のオブゞェクトストレヌゞMinIOを、s3fsでマりントしおみたした。

クレデンシャルの指定方法が独特だったりしたくらいで、特に困るこずなく導入できたした。

オブゞェクトストレヌゞをマりントするずいうずころで泚意点はあるのですが、䜿えるずころでは䜿いたいずいうか、芚えおおきたいですね。