以前、s3fsでsamba共有するネタを書きました。

s3fsの場合、S3互換ということも有り、ある程度制限があるようです。

だったら、ネイティブ接続(SDK)が可能な rcloneだったら良い感じになるのではと思い、調査しました。

rcloneは、最新の v1.68.1 を使えば、OracleCloud Object Storageに完全対応しているようで安心ですな。

マウントするとなると、fuseを使うことになるので、dockerでやる時は、特権が必要になります。

で、今回も rclone でマウントしたオブジェクトストレージをsambaで共有して、Windows11とかで使ってみましょう。

使用するOSは、Oracle Linux 8.10 にします。たぶん、Ubuntuでも問題無いと思います。

で、今回も、Dockerを使います。


早速、Dockerを定義しましょう。

 

Dockerfile

FROM oraclelinux:8.10
EXPOSE 445/tcp
EXPOSE 139/tcp
EXPOSE 137/udp
EXPOSE 138/udp
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo
RUN dnf update -y && dnf install -y glibc-langpack-ja systemd vim python39 sudo curl unzip samba fuse3
RUN cd ;curl https://rclone.org/install.sh | bash
RUN pip3 install oci-cli
RUN echo 'export LANG=ja_JP.UTF-8' >> ~/.bashrc
RUN adduser hogeuser
RUN (echo hogepw ; echo hogepw) | smbpasswd -s -a hogeuser
RUN <<EOF
#
cat <<- _DOC_ > /usr/local/bin/smbdiskfree.sh
#!/bin/sh
echo 18014398000 18014398000
_DOC_
EOF
RUN chmod a+x /usr/local/bin/smbdiskfree.sh
RUN <<EOF
#
cat <<- _DOC_ > /etc/samba/smb.conf
[global]
   workgroup = WORKGROUP
   server string = Rclone server
   security = user
   hosts allow = 0.0.0.0/0
   load printers = no
   log file = /var/log/samba/log.%m
   max log size = 50
   dns proxy = no
   unix charset = UTF-8
   dos charset = cp932
   unix extensions = no
   wide links = Yes
   domain master = no
   local master = Yes
   os level = 35
   preferred master = Yes
[share]
        comment = Public Stuff
        path = /mnt/share/
        read only = No
        force create mode = 0666
        force directory mode = 0777
        guest ok = Yes
 
        dfree command = /usr/local/bin/smbdiskfree.sh
        dfree cache time = 60
_DOC_
EOF
RUN <<EOF
#
cat <<- _DOC_ > /root/start.sh
#!/bin/bash

if [ ! -e ~/.oci/config ]; then
    cd;
    oci setup config
fi
if [ ! -e ~/.config/rclone ]; then
    cd;
    rclone config
fi

# safty Exit
function exit_script(){
  echo "Caught SIGTERM"
  exit 0
}
trap exit_script SIGTERM
 
# rclone mount
mkdir /mnt/share
rclone mount rclonetest:hogeobs /mnt/share --allow-other --vfs-cache-mode full --vfs-cache-max-age 1h0m0s --cache-dir /tmp --daemon --uid 1000 --gid 1000 --umask 002 

# Start Samba
/usr/sbin/nmbd --no-process-group
/usr/sbin/smbd --no-process-group
 
while [ 1 ]
do
  /usr/bin/sleep 30
  STATUSSTR=\`pgrep -l nmbd\`
  if [ ! -n "\$STATUSSTR" ]; then
    break
  fi
  STATUSSTR=\`pgrep -l smbd\`
  if [ ! -n "\$STATUSSTR" ]; then
    break
  fi
  STATUSSTR=\`df | grep /mnt/share | grep /mnt/share\`
  if [ ! -n "\$STATUSSTR" ]; then
    break
  fi
done

_DOC_
EOF
RUN chmod a+x /root/start.sh
docker-compose.yml
 
services:
 main:
  build:
   context: .
  privileged: true
  command: /root/start.sh
  hostname: objrclone
  tty: true
  volumes:
   - ./oci:/root/.oci
   - ./rclone:/root/.config/

networks:
 app-tier:
  driver: host
 

rcloneは、OCIの認証を利用することになるので、認証情報を作成します。

oci/config

[DEFAULT]
user=ocid1.user.oc1..aaccaaaa4hogeojl4pjhogenlm7qvvbbaipmj7895mkhoge6ig5hoge7v87q
fingerprint=48:b7:78:09:7a:a7:b0:bb:ac:59:eb:ff:c0:ea:23:12
key_file=/root/.oci/oci_api_key.pem
tenancy=ocid1.tenancy.oc1..aaaaaaaacosd4hogejphogeehgpcihogeb56vpj6fv2vuvvvgeukjhhogebq
region=ap-tokyo-1

oci/oci_api_key.pem

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCosqid1yl2BjDY
~~~
fw0X5YxX4U5UZFh862lNSMk=
-----END PRIVATE KEY-----

 

rcloneの定義も必要です。

rclone/rclone/rclone.conf

[hogeobs]
type = oracleobjectstorage
provider = user_principal_auth
namespace = hogehogenames
compartment = ocid1.compartment.oc1..aaavvaaamgmw22eshogeqnkkirbhogeqpff4ihdgfhogejkv2sahogehogea
region = ap-tokyo-1


出来ましたー

後は、起動です。

docker compose up -d

ということで、簡単でしたね。

 

流石に、ちょっと説明が要りますよね。

OracleLinuxイメージに、sambaとfuse3とpythonとoci cliをセットアップしてます。

rcloneは、パッケージからインストールしても、OCIのオブジェクトストレージに対応していないバージョンとなるので、公式よりイントールしています。

rcloneでマウントしたとこをsambaで共有しているだけです。

マウント場所:/mnt/share 

マウントユーザー:hogeuser

マウントパスワード:hogepw

OCIリージョン:ap-tokyo-1

OCIテナンシ:ocid1.tenancy.oc1..aaaaaaaacosd4hogejphogeehgpcihogeb56vpj6fv2vuvvvgeukjhhogebq

OCI認証ネームスペース:hogehogenames

OCIコンパートメント:ocid1.compartment.oc1..aaavvaaamgmw22eshogeqnkkirbhogeqpff4ihdgfhogejkv2sahogehogea

OCI顧客秘密キー:oci_api_key.pem

OCIユーザー:ocid1.user.oc1..aaccaaaa4hogeojl4pjhogenlm7qvvbbaipmj7895mkhoge6ig5hoge7v87q

 

一応、OCIとrcloneの定義が無かった場合、setupを実行します。

色々と聞かれて面倒なので、事前に定義しています。

別のとこで作成してから、コピーしても問題無いです。

それと、顧客秘密キーは、APIキーは、必要になるので、OCIで事前に作成しておいて下さいませ。

OCI認証ネームスペースは、プロファイルでテナンシのとこに表示がある オブジェクト・ストレージ・ネームスペース です。


さてさて、この手のネタも、ここまでなら よくあるネタですね。

さらなら、進化系として、ActiveDirectoryに参加するパターンにしてみましょう。

ここからは、Dockerでないですけど、Docker化することも可能ですので、頑張って組み込んで下さい。

今回は、我が家にドメインが無いし、面倒なんでやりませんよ。

まず、追加パッケージです。

 

dnf install samba-client-libs samba-common samba-common-libs
dnf install krb5-workstation oddjob-mkhomedir samba-winbind samba-winbind-clients samba-winbind-krb5-locator krb5-workstation pam_krb5
dnf install authconfig

 

次にドメイン参加用の定義です。

サンプルは、HOGEHOGE.CO.JP ドメインにしときます。 

ドメインコントローラーは、2つで、dc1をプライマリと仮定しています。

 

/etc/krb5.conf
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
 
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log
 
[libdefaults]
 dns_lookup_realm = false
 dns_lookup_kdc = true
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
 default_realm = HOGEHOGE.CO.JP
 default_ccache_name = KEYRING:persistent:%{uid}
 
[realms]
HOGEHOGE.CO.JP = {
 kdc = dc1.hogehoge.co.jp
 kdc = dc2.hogehoge.co.jp
 admin_server = dc1.hogehoge.co.jp
 default_domain = hogehoge.co.jp
}
 
[domain_realm]
.hogehoge.co.jp = HOGEHOGE.CO.JP
hogehoge.co.jp = HOGEHOGE.CO.JP

 

次に、ドメイン参加用のSamba定義です。

/etc/samba/smb.conf

[global]
workgroup = HOGEHOGE
realm = HOGEHOGE.CO.JP
server string = OCI RClone Server
netbios name = HOGEHOGE
security = ads
idmap config * : range = 16777216-33554431
idmap config HOGEHOGE:backend = rid
idmap config HOGEHOGE:range = 10000-199999
idmap config TRUSTED:backend = rid
idmap config TRUSTED:range = 200000-299999
obey pam restrictions = yes
template homedir = /home/%D/%U
template shell = /bin/bash
kerberos method = secrets only
winbind use default domain = true
winbind offline logon = false
dos charset = CP932
unix charset = UTF-8
wins support = yes
load printers = no
disable spoolss = yes

[homes]
browseable = No
comment = Home Directories
valid users = %S, %D%w%S
read only = No
inherit acls = Yes

[share]
path = /mnt/share/
valid users = +%D%w"Domain Users" 
browsable = Yes
writable = Yes
read only = No
public = Yes
kernel oplocks = no
dfree command = /usr/local/bin/smbdiskfree.sh
dfree cache time = 60

 

とどめのドメイン参加です。

この作業には、ドメイン管理者が必要です。

kinit このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。
net ads join -S dc1.hogehoge.co.jp -U このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。
authconfig --enablekrb5 --enablewinbind --enablewinbindauth --enablemkhomedir --update

 

share 共有は、Domain Usersグループに解放しています。

なので、rcloneのマウントユーザーも合わせないと読み書き出来なくなってしまいます。

以下のコマンドで、Domain Usersグループのgidを調査して、rcloneのマウントグループに指定します。

wbinfo --sid-to-uid=`wbinfo --name-to-sid='Domain Users'`

同様にユーザーも指定しないといけないので、Domain Usersの適当なメンバーのユーザーをマウントユーザーに指定する必要があります。

wbinfo --sid-to-uid=`wbinfo --name-to-sid='user1'`

 

rclone mount の uidgid にwbinfoの結果を指定すればOkです。

 

どうですか、無限容量の共有が完成ですね。

でも、こんなのを解放すると、管理が大変になりそうです。

home共有は、無くても良いです

 

Joomla templates by a4joomla