※新ネタ あります
今回は、定番のS3互換 オブジェクトストレージをWindowsでマウントしてみます。
実は、オブジェクトストレージをNFSマウントする為に、OCIが提供している ストレージゲートウェイ ってのがあるんですが、こいつが、すげーダメなやつなんですね。
仕事で、無理やり使うことになったんですが、色々と工夫しないと、実務に耐えられません。
そもそもの要件が、Windowsのバックアップ用途だったんですが、SMBが使えないし、使う予定のCloudSyncが、UTF8の日本語ファイル名が使えないし、ファイル数が多いと開始すらしないしで、手間のかかるダメアプリでした。
おまけに、OracleLinux8に対応してないとか、OCI提供なのに、OCIのメール機能に転送出来ないとか、やる気無しアプリです。
まー、普通にNFSでフォルダ同期するだけならどうぞって感じです。
※世の為に、OCI提供のストレージゲートウェイは、EOSされました。
というこで、こんなアプリにたよらずとも、世には、s3fsという、すばらしいオープンソースがあるので、これと、rsyncを組み合わせてバックアップすれば良いと思います。
s3fsをOCIでマウントする方法は、公式ドキュメントもありますよ。
前置きは、ここまでで、本編に入りましょう。
オブジェクトストレージは、s3fsでマウントするとして、Windowsへの共有は、どうするかってとこですが、そりゃ sambaするしかないですよね。
s3fsをマウントした場所をsambaで共有するとかって大丈夫かと思いますが、やってみると、とりあえず問題無く出来ているので良しとしておきます。
でも、VisualStudioで、直接開くとおかしくなりました。
今回も、お得意のDockerで構築しますので、よろしくです。
当然ながら、Kubernetesクラスタ(OKE)でも使えるので、ご自由に。
mkdir -p s3samba
cd s3samba
Dockerfile
FROM ubuntu
RUN bash
version: "3"
services:
main:
build:
context: .
privileged: true
command: bash
hostname: main
tty: true
起動してベース環境を構築していきます。docker compose up -d
Shellに接続します。docker exec -it s3samba-main-1 bash
では、普通にUbuntuを構築していきます。apt update
apt upgrade -y
apt install language-pack-ja-base language-pack-ja net-tools iputils-ping traceroute dnsutils vim tzdata curl samba s3fs -y
locale-gen ja_JP.UTF-8
echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
OCIで、S3FSを使うには、顧客秘密キー なる物が必要となります。
これは、ご自身のプロファイルより作成出来るので、事前に作成しておいて下さい。
必要なのは、アクセス・キーと鍵文字列となります。
これを ~/.passwd-s3fs に記録しておきましょう。
echo "90399edf52dec7d5815f26d59c76edf7d8be048e:dQBe/q8Ijbvr8cUL7UBd2DbnNksnNZZTlW7e4YPbFS8=" > ~/.passwd-s3fs
chmod go-r ~/.passwd-s3fs
こんな感じで、[アクセスキー]:[鍵] といったファイルを作成します。
だいたい、こんな感じで、s3fsは、完了です。
次は、sambaですが、これは、色々なサイトで紹介されているでしょうから、適当に拾って来て下さい。
使う為には、対象ユーザーが必要ですから、最低限 ユーザーを作っておいて下さい。
OSのユーザーは、adduser [ユーザー] コマンドで作成します。
sambaのユーザーは、pdbedit -a [ユーザー] コマンドで作成します。
Windows ADを使いたい人は、LDAPを使って下さいな。
でも、s3fsでマウントした場所は、ACLが使えないので、あしからず
s3fsでマウントした場所を共有すると、容量がめちゃくちゃになります。
そもそも、無限なんで、意味無しですが、それを誤魔化す必要があるんですね。
/usr/local/bin/s3diskfree.sh
#!/bin/sh
echo 18014398000 18014398000
といった、ファイルを作成して、実行権を付けて下さい。
/etc/samba/smb.conf
~
[public]
comment = public
path = /mnt/public/
read only = No
force create mode = 0666
force directory mode = 0777
guest ok = Yes
allow insecure wide links = yes
dfree command = /usr/local/bin/s3diskfree.sh
dfree cache time = 60
smb.confにs3fsでマウントした場所の定義に追加しておいて下さい。
だいたい、こんな感じで、完了ですかね。
後は、起動フアイルを作成します。
/root/start.sh
#!/bin/bash
# safty Exit
function exit_script(){
echo "Caught SIGTERM"
/etc/init.d/smbd stop
/etc/init.d/nmbd stop
exit 0
}
trap exit_script SIGTERM
# S3fs mount
s3fs public /mnt/public -o passwd_file=/root/.passwd-s3fs -o allow_other -o url=https://fxfmsioydavc.compat.objectstorage.ap-osaka-1.oraclecloud.com -o use_path_request_style -o endpoint=ap-osaka-1
# Start Samba
/etc/init.d/nmbd start
/etc/init.d/smbd start
while [ 1 ]
do
/usr/bin/sleep 30
STATUSSTR=`/etc/init.d/nmbd status | grep running`
if [ ! -n "$STATUSSTR" ]; then
break
fi
STATUSSTR=`/etc/init.d/smbd status | grep running`
if [ ! -n "$STATUSSTR" ]; then
break
fi
STATUSSTR=`df | grep /mnt/public | grep /mnt/public`
if [ ! -n "$STATUSSTR" ]; then
break
fi
done
この起動スクリプトに、s3fsで、マウントするコマンドを記載しておけば、Docker起動時にマウントされるわけですね。
さらに、周期的にチェックすることで、正常性確認も取れます。
このファイルに実行権を与えて下さいね。
exitして、イメージを保存しましょう。
docker stop s3samba-main-1
docker commit s3samba-main-1 s3samba-main
最後に、Dockefileとdocker-compose.ymlを修正します。
Dockerfile
FROM s3samba-main
ENTRYPOINT [ "/root/start.sh" ]
EXPOSE 445/tcp
EXPOSE 139/tcp
EXPOSE 137/udp
EXPOSE 138/udp
docker-compose.yml
version:"3"
services:
main:
build:
context: .
ports:
- "0.0.0.0:445:445"
- "0.0.0.0:139:139"
- "0.0.0.0:138:138/udp"
- "0.0.0.0:137:137/udp"
privileged: true
command: /root/start.sh
hostname: s3samba
tty: true
apiVersion: v1
kind: PersistentVolume
metadata:
name: sambalog-storage
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
csi:
driver: fss.csi.oraclecloud.com
volumeHandle: [FileStorage FileSystemのOCIID]:[MountTargetのIP]:[Exportパス]
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sambalog-storage-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 10Gi
volumeName: sambalog-storage
---
apiVersion: v1
kind: Service
metadata:
labels:
app: s3sambe-service
name: s3sambe-svc
annotations:
oci.oraclecloud.com/load-balancer-type: "nlb"
oci-network-load-balancer.oraclecloud.com/backend-policy: "FIVE_TUPLE"
oci-network-load-balancer.oraclecloud.com/internal: "true"
spec:
selector:
app: s3samba
type: LoadBalancer
ports:
- name: microsoft-ds
port: 445
protocol: TCP
targetPort: 445
- name: netbios-ssn
port: 139
protocol: TCP
targetPort: 139
- name: netbios-dgm
port: 138
protocol: UDP
targetPort: 138
- name: netbios-ns
port: 137
protocol: UDP
targetPort: 137
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: s3samba
name: s3samba
spec:
replicas: 1
selector:
matchLabels:
app: s3samba
template:
metadata:
labels:
app: s3samba
spec:
containers:
- image: kix.ocir.io/[ネームスペース]/s3samba:1.0
imagePullPolicy: Always
name: s3samba
securityContext:
privileged: true
command: [ "/root/start.sh" ]
ports:
- name: microsoft-ds
protocol: TCP
containerPort: 445
- name: netbios-ssn
protocol: TCP
containerPort: 139
- name: netbios-dgm
protocol: UDP
containerPort: 138
- name: netbios-ns
protocol: UDP
containerPort: 137
volumeMounts:
- name: log
mountPath: /var/log/samba/
imagePullSecrets:
- name: danrepo
volumes:
- name: log
persistentVolumeClaim:
claimName: sambalog-storage-pvc