新ネタ あります

 

今回は、定番の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)でも使えるので、ご自由に。


まず、ベースとなる Dockerイメージを構築するのですが、Ubuntuイメージから構築します。
では、定番の2つのファイルを作って、起動しましょう。
コンテナは、s3samba としましょう。

mkdir -p s3samba
cd s3samba

Dockerfile

FROM ubuntu
RUN bash
 
docker-compose.yml

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
 
これで、普通に、Dockerとして、起動可能な物が完成です。簡単ですね。
一応、/var/log/samba/ にログが貯まるので、これは、外出しボリュームにした方が良いかもです。
 
これを、いつものように、OCI レジストリにPushすれば、Kubernetesクラスタ(OKE)でも利用可能です。
 
定義ファイルのサンプルを記載しておきますね。
ログは、FileStorageに出力するようにしています。先に、FileStorageを作成しておいて下さいね。
 
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
 
以上、OCIのオブジェクトストレージも、Windowsから、がんがん使っちゃいましょう。
 
Joomla templates by a4joomla