※新ネタ あります
今回は、定番の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 s3sambacd s3samba
Dockerfile
FROM ubuntuRUN bashversion: "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 updateapt upgrade -yapt install language-pack-ja-base language-pack-ja net-tools iputils-ping traceroute dnsutils vim tzdata curl samba s3fs -ylocale-gen ja_JP.UTF-8echo "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/shecho 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 Exitfunction exit_script(){ echo "Caught SIGTERM" /etc/init.d/smbd stop /etc/init.d/nmbd stop exit 0}trap exit_script SIGTERM# S3fs mounts3fs 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 startwhile [ 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 fidone
この起動スクリプトに、s3fsで、マウントするコマンドを記載しておけば、Docker起動時にマウントされるわけですね。
さらに、周期的にチェックすることで、正常性確認も取れます。
このファイルに実行権を与えて下さいね。
exitして、イメージを保存しましょう。
docker stop s3samba-main-1
docker commit s3samba-main-1 s3samba-main
最後に、Dockefileとdocker-compose.ymlを修正します。
Dockerfile
FROM s3samba-mainENTRYPOINT [ "/root/start.sh" ]EXPOSE 445/tcpEXPOSE 139/tcpEXPOSE 137/udpEXPOSE 138/udpdocker-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: trueapiVersion: v1kind: PersistentVolumemetadata: name: sambalog-storagespec: capacity: storage: 10Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: fss.csi.oraclecloud.com volumeHandle: [FileStorage FileSystemのOCIID]:[MountTargetのIP]:[Exportパス]---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: sambalog-storage-pvcspec: accessModes: - ReadWriteMany storageClassName: "" resources: requests: storage: 10Gi volumeName: sambalog-storage---apiVersion: v1kind: Servicemetadata: 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/v1kind: Deploymentmetadata: labels: app: s3samba name: s3sambaspec: 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




