コンピュータ/ソフトウェア関連Tips

Samba-serverセットアップメモ

作成日: Jul 20, 2014
カテゴリー: FreeBSD タグ: FreeBSD

FreeBSD 10.0 RELEASEにSamba-serverをセットアップしたときのメモです。

この記事は、FreeBSDセットアップメモの一部です。

前提

GEOM ELIで暗号化されたハードディスクをアタッチして、raidz1が構築されたストレージプールがあるという前提です。

$ zpool status
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME              STATE     READ WRITE CKSUM
        tank              ONLINE       0     0     0
          raidz1-0        ONLINE       0     0     0
            ada0.nop.eli  ONLINE       0     0     0
            ada1.nop.eli  ONLINE       0     0     0
            ada2.nop.eli  ONLINE       0     0     0
            ada3.nop.eli  ONLINE       0     0     0

$ zfs mount
tank                            /mnt/tank

インストールするSamba-serverの確認

Sambaは、2014年6月23日にの安定版の4.1.9がリリースされています。pkg searchコマンドでチェックします。

$ pkg search samba
cups-samba-6.0_7
samba-nsupdate-9.8.6_1
samba-virusfilter-0.1.3
samba36-3.6.24
samba36-libsmbclient-3.6.24_1
samba36-nmblookup-3.6.24
samba36-smbclient-3.6.24
samba4-4.0.19
samba41-4.1.9

Samba-serverのインストール

samba41-4.1.9をインストールします。

$ sudo pkg install samba41-4.1.9
You can use sasldb2 for authentication, to add users use:

        saslpasswd2 -c username

If you want to enable SMTP AUTH with the system Sendmail, read
Sendmail.README

NOTE: This port has been compiled with a default pwcheck_method of
      auxprop.  If you want to authenticate your user by /etc/passwd,
      PAM or LDAP, install ports/security/cyrus-sasl2-saslauthd and
      set sasl_pwcheck_method to saslauthd after installing the
      Cyrus-IMAPd 2.X port.  You should also check the
      /usr/local/lib/sasl2/*.conf files for the correct
      pwcheck_method.
      If you want to use GSSAPI mechanism, install
      ports/security/cyrus-sasl2-gssapi.
      If you want to use LDAP auxprop plugin, install
      ports/security/cyrus-sasl2-ldapdb.
************************************************************

The OpenLDAP client package has been successfully installed.

Edit
  /usr/local/etc/openldap/ldap.conf
to change the system-wide client defaults.

Try `man ldap.conf' and visit the OpenLDAP FAQ-O-Matic at
  http://www.OpenLDAP.org/faq/index.cgi?file=3
for more information.

************************************************************

============================================================================
You might want to consider increasing the kern.maxfiles tunable if you plan
to use this library for applications that need to monitor activity of a lot
of files.

For a typical desktop, add the following line to /boot/loader.conf, then
reboot the system:

    kern.maxfiles="25000"
=============================================================================
===============================================================================

Gamin will only provide realtime notification of changes for at most n files,
where n is the minimum value between (kern.maxfiles * 0.7) and
(kern.maxfilesperproc - 200). Beyond that limit, files will be polled.

If you often open several large folders with Nautilus, you might want to
increase the kern.maxfiles tunable (you do not need to set
kern.maxfilesperproc, since it is computed at boot time from kern.maxfiles).

For a typical desktop, add the following line to /boot/loader.conf, then
reboot the system:

    kern.maxfiles="25000"

The behavior of gamin can be controlled via the various gaminrc files.
See http://www.gnome.org/~veillard/gamin/config.html on how to create
these files.  In particular, if you find gam_server is taking up too much
CPU time polling for changes, something like the following may help
in one of the gaminrc files:

# reduce polling frequency to once per 10 seconds
# for UFS file systems in order to lower CPU load
fsset ufs poll 10

===============================================================================

===============================================================================

How to start: http://wiki.samba.org/index.php/Samba4/HOWTO

* Your configuration is: /usr/local/etc/smb4.conf

* All the relevant databases are under: /var/db/samba4

* All the logs are under: /var/log/samba4

* Provisioning script is: /usr/local/bin/samba-tool

You will need to specify location of the 'nsupdate' command in the
smb4.conf file:

      nsupdate command = /usr/local/bin/samba-nsupdate -g

For additional documentation check: http://wiki.samba.org/index.php/Samba4

Bug reports should go to the: https://bugzilla.samba.org/

===============================================================================

Samba設定ファイルの作成

$ sudo vi /usr/local/etc/smb4.conf

中身は、http://www.kishiro.com/FreeBSD/samba4.htmlhttps://forums.freebsd.org/viewtopic.php?&t=35851を参考にして、

[global]
workgroup = WORKGROUP
server string = FreeBSD
security = user
hosts allow = 192.168.
guest ok = no
unix charset = UTF-8
dos charset = CP932
max protocol = SMB2
netbios name = *****  ← ここを設定すること。
create mask = 600
directory mask = 700
printing = bsd
unix extensions = no
nt acl support = yes
inherit acls = no
map acl inherit = yes

[share]
comment = Shared Directories
path = /mnt/tank
browseable = yes
writable = yes
vfs objects = zfsacl
nfs4:mode = special
nfs4:acedup = merge
nfs4:chown = yes

max protocol = SMB2が無いと、Windows 8マシンから接続できませんでした。

https://forums.freebsd.org/viewtopic.php?&t=35851の設定を追加せずにファイルを書き込んだら、以下のようなエラーが多量に/var/log/messagesに記録されてました。(コンソールにも表示されてました)。

Jul 20 21:31:00 myhostname smbd[974]: [2014/07/20 21:31:00.390302,  0] ../source3/modules/vfs_posixacl.c:171(smb_ace_to_internal)
Jul 20 21:31:00 myhostname smbd[974]:   unknown tag type 64

設定ファイルのパーミッションを変更します。(参考: http://bakuretsu.atso-net.jp/bakuretsu/freebsd/samba36.html)

$ sudo chmod 700 /usr/local/etc/smb4.conf

Sambaユーザー用のディレクトリ作成

/mnt/tankに、hoge用のディレクトリを作成します。

$ sudo mkdir /mnt/tank/*****
$ sudo chown *****:***** /mnt/tank/*****

Samba用アカウントの作成

pdbeditコマンドで、Sambaアカウントを作成します。下記の例では、ユーザー名は*****で、このユーザーは、Samba-serverを動作させるマシン自体のアカウントとして存在しているという前提です。

$ sudo pdbedit -a -u *****
new password:
retype new password:
Unix username:        *****
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21
Primary Group SID:    S-1-5-21
Full Name:            hoge
Home Directory:       \\foobar\*****
HomeDir Drive:
Logon Script:
Profile Path:         \\foobar\*****\profile
Domain:               FREEBSD
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          日, 00  1月 1900 00:00:00 JST
Kickoff time:         日, 00  1月 1900 00:00:00 JST
Password last set:    日, 20  7月 2014 04:56:42 JST
Password can change:  日, 20  7月 2014 04:56:42 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Samba関連デーモンの設定

/etc/rc.confに以下を追加します。

nmbd_enable="YES"
smbd_enable="YES"
winbindd_enable="YES"

Samba-serverの起動/停止/再起動

マシン起動時にSamba-serverを起動するようにしていても、

  1. GEOM ELIにて暗号化されたハードディスクのアタッチ。
  2. raidz1ストレージプールのマウント。

をしてからSamba-serverを再起動しなければならなかったので、自動起動はせずに、上記アタッチとマウントをするスクリプトにて、Samba-serverを起動することにしました。まずは、手動にて、実行してみます。

$ sudo /usr/local/etc/rc.d/samba_server onestart
Performing sanity check on Samba configuration: OK
Starting nmbd.
Starting smbd.
Starting winbindd.

Samba-serverを停止する場合は、

$ sudo /usr/local/etc/rc.d/samba_server onestop

Samba-serverを再起動する場合は、onestopしてからonestartです。

GEOM ELI暗号化ディスクをアタッチするスクリプトの修正

ストレージプールのマウントとSamba-serverの起動まで行うように修正しました。

#!/usr/local/bin/bash
# Filename: /usr/local/bin/attach_disks.sh
# This script has two functions:
#  1. Attach the geli encrypted disks, mount zfs pool,
#     and start the Samba-server.
#  2. Detach the geli encrypted disks.
devicePrefix="/dev/ada"
deviceSuffix=".nop"
indexStart=0
indexEnd=3
keyFile="/root/.geli/geli.key"
zfsPoolName="tank"
function attach() {
  echo "Enter geli passphrase. Your entry would NOT be echobacked."
  stty -echo
  read passphrase
  stty echo
  for no in $(seq ${indexStart} ${indexEnd}); do
    drive=${devicePrefix}${no}${deviceSuffix}
    if [ -e ${drive}.eli ]; then
      echo "${drive}: Already attached."
    else
      echo "${drive}: Attaching ..."
      echo ${passphrase}|/sbin/geli attach -k ${keyFile} -j - ${drive}
    fi
  done
  # Mount the ZFS pool
  echo "Mounting zpool \"${zfsPoolName}\"."
  zfs mount tank
  # Onestart the Samba server
  echo "Starting samba server."
  /usr/local/etc/rc.d/samba_server onestart
}

function detach() {
  for no in $(seq ${indexStart} ${indexEnd}); do
    drive=${devicePrefix}${no}${deviceSuffix}.eli
    if [ -e ${drive} ]; then
      echo "${drive}: Detaching ..."
      /sbin/geli detach ${drive}
    else
      echo "${drive}: Not attached."
    fi
  done
}

if [ $# -eq 0 ]; then
  attach
elif [ $1 == "-r" ]; then
  detach
fi

echo "Following is a result of \"ls ${devicePrefix}*.eli\" command."
ls ${devicePrefix}*.eli
echo "Follwoing is a result of \"zpool list\" command."
zpool list
echo "Following is a result of disk free of \"${zfsPoolName}\"."
df -h|grep -e 'Filesystem' -e "^${zfsPoolName}"

(スクリプトは、初出時バージョンに修正を加えています。)