Ubuntu 16.02LTSにSamba4.5.5をインストールする

最新版のSambaソースをダウンロードして、Ubuntu16.02LTSでビルド、インストールしたときの備忘録。

Download Samba

Build Samba from Source

Sambaをコンパイルするまえにライブラリなどをインストールしておく(Debian/Ubuntu)

Samba Dependencies Required to Build Samba

ケルベロスのインストールのときに確認パネルが表示されるので、大文字でHOGE.COMなどのドメイン名をリアムとしておく。

apt-get install acl attr autoconf bison build-essential debhelper dnsutils docbook-xml docbook-xsl flex gdb krb5-user libacl1-dev libaio-dev libattr1-dev libblkid-dev libbsd-dev libcap-dev libcups2-dev libgnutls28-dev libjson-perl libldap2-dev libncurses5-dev libpam0g-dev libparse-yapp-perl libpopt-dev libreadline-dev perl perl-modules pkg-config python-all-dev python-dev python-dnspython python-crypto xsltproc zlib1g-dev

ちなみに、--sysconfdirには、/etcを指定すると、そのディレクトリにsambaフォルダが作成される。

> tar xvfz samba-4.5.5.tar.gz
> cd samba-4.5.5
> ./configure --enable-fhs --prefix=/usr/local/samba --sysconfdir=/etc --without-ad-dc
> make
> sudo make install

完了すると、デフォルトだと、/usr/local/samba以下にビルドした一式がインストールされる。ツール類は、/usr/local/samba/binに、デーモンは/usr/local/samba/sbin
にインストールされる。

confファイルや起動シェルなどはインストールされないので、インストール環境に合せたサンプルをpackagingサブフォルダから選ぶ。

Sambaの仮設定

プロセスが正常に起動するか確認するため、最小限の設定をしておく。
/etc/samba/smb.confに設定を記述する。

[global]
security = user 

init起動シェルの作成

systemdフォルダ以下にある*.serviceファイルのサンプルを使って、systemctlで稼働させたかったが、うまく動作しなかった。そのため、従来のinitスクリプトを使う。内部的には、initシェルとsystemdプロセスが連動しているので、systemdコマンドが使用できる。

なお、systemdに関する説明は、以下を参照した。

Linuxの自動起動の解説

Linux自動起動の設定方法

systemd入門

nmbdシェルを以下に示す。このファイルを/etc/init.dに配置する。

#!/bin/sh

### BEGIN INIT INFO
# Provides:          nmbd
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# X-Start-Before:    smbd
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: start Samba NetBIOS nameserver (nmbd)
### END INIT INFO


NMBDPID=/usr/local/samba/var/run/samba/nmbd.pid

# clear conflicting settings from the environment
unset TMPDIR

# See if the daemons are there
test -x /usr/local/samba/sbin/nmbd || exit 0

. /lib/lsb/init-functions

case $1 in
        start)
                if init_is_upstart; then
                        exit 1
                fi
                SERVER_ROLE=`samba-tool testparm --parameter-name="server role"  2>/dev/null | tail -1`
                if [ "$SERVER_ROLE" = "active directory domain controller" ]; then
                    exit 0
                fi

                if [ -n `which testparm` ]
                then
                        NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' 2>/dev/null`
                fi
                if [ "$NMBD_DISABLED" != Yes ]; then
                        log_daemon_msg "Starting NetBIOS name server" nmbd
                        # Make sure we have our PIDDIR, even if it's on a tmpfs
                        #install -o root -g root -m 755 -d $PIDDIR

                        if ! start-stop-daemon --pidfile $NMBDPID --start --quiet --oknodo --exec /usr/local/samba/sbin/nmbd -- -D
                        then
                                log_end_msg 1
                                exit 1
                        fi
                        log_end_msg 0
                fi

                ;;
        stop)
                if init_is_upstart; then
                        exit 0
                fi

                log_daemon_msg "Stopping NetBIOS name server" nmbd

                start-stop-daemon --stop --quiet --pidfile $NMBDPID
                # Wait a little and remove stale PID file
                sleep 1
                if [ -f $NMBDPID ] && ! ps h `cat $NMBDPID` > /dev/null
                then
                        # Stale PID file (nmbd was succesfully stopped),
                        # remove it (should be removed by nmbd itself IMHO.)
                        rm -f $NMBDPID
                fi

                log_end_msg 0

                ;;
        restart|force-reload)
                if init_is_upstart; then
                        exit 1
                fi
                $0 stop
                sleep 1
                $0 start
                ;;
        status)
                status_of_proc -p $NMBDPID /usr/local/samba/sbin/nmbd nmbd
                exit $?
                ;;
        *)
                echo "Usage: /etc/init.d/nmbd {start|stop|restart|force-reload|status}"
                exit 1
                ;;
esac
exit 0

smbdシェルを以下に示す。このファイルを/etc/init.dに配置する。

#!/bin/sh

### BEGIN INIT INFO
# Provides:          smbd
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Should-Start:      slapd cups
# Should-Stop:       slapd cups
# Short-Description: start Samba SMB/CIFS daemon (smbd)
### END INIT INFO


SMBDPID=/usr/local/samba/var/run/samba/smbd.pid

# clear conflicting settings from the environment
unset TMPDIR

# See if the daemons are there
test -x /usr/local/samba/sbin/smbd || exit 0

. /lib/lsb/init-functions

case $1 in
        start)
                if init_is_upstart; then
                        exit 1
                fi
                SERVER_ROLE=`samba-tool testparm --parameter-name="server role"  2>/dev/null | tail -1`
                if [ "$SERVER_ROLE" = "active directory domain controller" ]; then
                    exit 0
                fi

                log_daemon_msg "Starting SMB/CIFS daemon" smbd

                if ! start-stop-daemon --pidfile $SMBDPID --start --quiet --oknodo --exec /usr/local/samba/sbin/smbd -- -D; then
                        log_end_msg 1
                        exit 1
                fi

                log_end_msg 0
                ;;
        stop)
                if init_is_upstart; then
                        exit 0
                fi

                log_daemon_msg "Stopping SMB/CIFS daemon" smbd

                start-stop-daemon --stop --quiet --pidfile $SMBDPID
                # Wait a little and remove stale PID file
                sleep 1
                if [ -f $SMBDPID ] && ! ps h `cat $SMBDPID` > /dev/null
                then
                        # Stale PID file, remove it (should be removed by
                        # smbd itself IMHO).
                        rm -f $SMBDPID
                fi

                log_end_msg 0

                ;;
        reload)
                log_daemon_msg "Reloading /etc/samba/smb.conf" smbd

                start-stop-daemon --stop --quiet --signal HUP --pidfile $SMBDPID

                log_end_msg 0
                ;;
        restart|force-reload)
                if init_is_upstart; then
                        exit 1
                fi
                $0 stop
                sleep 1
                $0 start
                ;;
        status)
                status_of_proc -p $SMBDPID /usr/local/samba/sbin/smbd smbd
                exit $?
                ;;
        *)
                echo "Usage: /etc/init.d/smbd {start|stop|reload|restart|force-reload|status}"
                exit 1
                ;;
esac

exit 0

シェルを配置したら、systemdのサービスを更新する。

> sudo systemctl daemon-reload

サービスが起動できるか確認する

> sudo service nmbd start
> sudo systemctl status nmbd
● nmbd.service - LSB: start Samba NetBIOS nameserver (nmbd)
   Loaded: loaded (/etc/init.d/nmbd; bad; vendor preset: enabled)
   Active: active (running) since 日 2017-02-19 09:42:46 JST; 17s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 11941 ExecStart=/etc/init.d/nmbd start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nmbd.service
           └─11954 /usr/local/samba/sbin/nmbd -D
> sudo service smbd start
> sudo systemctl status smbd
● smbd.service - LSB: start Samba SMB/CIFS daemon (smbd)
   Loaded: loaded (/etc/init.d/smbd; bad; vendor preset: enabled)
   Active: active (running) since 日 2017-02-19 09:44:06 JST; 9s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 12074 ExecStart=/etc/init.d/smbd start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/smbd.service
           ├─12086 /usr/local/samba/sbin/smbd -D
           ├─12087 /usr/local/samba/sbin/smbd -D
           ├─12088 /usr/local/samba/sbin/smbd -D
           └─12090 /usr/local/samba/sbin/smbd -D

ちゃんと停止するか確認

> sudo service smbd stop
> sudo service nmbd stop
> sudo systemctl status nmbd
● nmbd.service - LSB: start Samba NetBIOS nameserver (nmbd)
   Loaded: loaded (/etc/init.d/nmbd; bad; vendor preset: enabled)
   Active: inactive (dead) since 日 2017-02-19 09:47:27 JST; 14s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 12336 ExecStop=/etc/init.d/nmbd stop (code=exited, status=0/SUCCESS)
  Process: 11941 ExecStart=/etc/init.d/nmbd start (code=exited, status=0/SUCCESS)

> sudo systemctl status smbd
● smbd.service - LSB: start Samba SMB/CIFS daemon (smbd)
   Loaded: loaded (/etc/init.d/smbd; bad; vendor preset: enabled)
   Active: inactive (dead) since 日 2017-02-19 09:47:33 JST; 35s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 12386 ExecStop=/etc/init.d/smbd stop (code=exited, status=0/SUCCESS)
  Process: 12074 ExecStart=/etc/init.d/smbd start (code=exited, status=0/SUCCESS)