[Samba] Solution: Multiple Instancies of Samba on a single System

Gunther Hess ghess at elmos.de
Mon Feb 25 15:54:21 GMT 2002


Hi out there,
             i asked the question, how to establish multiple
Samba-instancies on a single system. Well, nobody made objections
that this should work and apparently it really works with the following
setup:

- Compilation (config.status):
  (nothing special about it, except that i enforce the existance
   of /etc/smb.conf for samba to work properly)

   ./configure  --prefix=/opt/samba-2.2.3a \
   --localstatedir=/var/samba --with-configdir=/etc \
   --with-automount --with-syslog --with-quotas --with-utmp \
   --with-msdfs --with-vfs --with-libsmbclient --with-acl-support

   /opt/samba-2.2.3a is a shared, readonly directory on a central
   server, while /etc and /var are local, writable directories
   on different samba-servers.

-  Startup/Setup
   - The attached Shell-Script "samba" is my startup/shutdown
     script for the servers.

     - /etc/smb.conf-<Server> - is the instance-configuration
 
     - <Server> == zerberos is my PDC, which has an alter-Ego
       /etc/nmb.conf (/etc/nmb.conf is symlinked to /etc/smb.conf-zerberos)

       This is due to the fact, that apparently a Samba-PDC does
       not work without a running nmbd, which processes the 
       logon-packets. But only one nmbd must run on a single system.

     - /etc/smb.conf is a symlink to /etc/smb.conf-zerberos too,
       which is required for smbpasswd to work properly, due to
       my specific compilation.

    ## And _never_ name your PDC with the domain-name!! 

- Instance-Setups (smb.conf-devil1):

  As already seen in the zerberos-configuration, two parameters are 
  important to split the working-directories:

   log file                = /var/samba/devil1/log/%M.%m
   lock directory          = /var/samba/devil1/locks

   (devil1 has an alter-ego named devil2, which shares his locks
    and logs, what is the reason for the "config file"-parameter
    in the attached file)

And a final note:

  Both configurations bind to a single interface (32Bit Mask).

  The PDC also binds to the loopback-interface (for smbpasswd
  to work on this system. 

Hope that this helps others and sorry for this lengthly mail.

Regards
Gunther

P.S.: my `ps -axuww | fgrep samba` looks like this after /etc/init.d/samba start

root     22823  0.1  0.2 2488 1912 ?        S 23:44:43  0:00 nmbd -D -d 1 -H /etc/lmhosts -l /var/samba/nmb/log -s /etc/nmb.conf
root     22925  0.0  0.2 3472 1616 ?        S 23:46:22  0:00 smbd -D -d 1 -l /var/samba/devil1/log -s /etc/smb.conf-devil1
root     22848  0.0  0.2 3456 1664 ?        S 23:44:44  0:00 smbd -D -d 1 -l /var/samba/zerberos/log -s /etc/smb.conf-zerberos

Gunther Hess wrote:
> 
> Hi out there,
>              i intend to run multiple Instancies of Samba
> on a single, multi-homed, server, with each instance bound
> to a specific (logical) interface.
> 
> If this works, it would be fine to me.
> Mainly for administrative Reasons. (You won't believe,
> but from time to time it becomes necessary to restart
> some services, but restarting the entire server is a
> real mess)
> 
> Well here my questions:
> 
>  - Most important:
>    Can anyone out there tell me, that this is definitely impossible?
> 
>  - Most helpful:
>    Which settings must appear in the Configuration, to split the
>    working-directories? (locks, logs, private-dir and so on)
> 
>  - Very interesting:
>    Has anyone experience with such a configuration?
> 
> Thanks in advance
> Gunther
> --

-- 
Dr. Gunther Hess           Elmos Semiconductor AG
Tel.: ++49 +231 7549-520   Heinrich Hertz Str. 1
Fax:  ++49 +231 7549-109   D-44227 Dortmund
WWW: http://www.elmos.de   Opinions are strictly of my own
-------------- next part --------------
#! /bin/sh
# @(#) Start-Script for Samba
# @(#) $Id: samba,v 1.4 2002/02/25 22:15:33 root Exp root $

# Please send info on modifications to ghess at elmos.de

PRGBASE=/opt/samba-2.2.3a

# CNFBASE is a script-debugging-variable

CNFBASE=""

# if /usr ist not mounted, give up without comments

if [ ! -d /usr/bin ]
then                    # /usr not mounted
        exit
fi

# Gunther's universal Path

PATH="/root/bin:/etc:/usr/local/bin:/opt/bin"
PATH="/usr/ccs/bin:/usr/ucb:/usr/sbin:/usr/bin:/bin:/sbin:${PATH}"

# /usr/lib is o.k. for Solaris, but not for SunOS or Linux
# but with Samba it is not crucial

LD_LIBRARY_PATH=/usr/lib

export PATH LD_LIBRARY_PATH
#
# Add the Program-Base in front of the Path
#
if [ -d "$PRGBASE/bin" ]
then
  PATH="${PRGBASE}/bin:${PATH}"
fi
if [ -d "$PRGBASE/sbin" ]
then
  PATH="${PRGBASE}/sbin:${PATH}"
fi
if [ -d "$PRGBASE/lib" ]
then
  LD_LIBRARY_PATH="${PRGBASE}/lib:${LD_LIBRARY_PATH}"
fi
#
export PATH LD_LIBRARY_PATH
#
# Save the arguments
#
OPARG="${1-help}"
if [ $# -gt 0 ]
then
 shift
fi
SVARG="$*"
#
# Which servers do "exist" ?
#
SERVERS=""
for F in $CNFBASE/etc/smb.conf-*
do
  if [ -f "$F" ]
  then
    SVR="`echo $F | sed -e 's/.*\/etc\/smb.conf-//'`"
    if [ "$SERVERS" = "" -o "$SERVERS" = " " ]
    then
      SERVERS="$SVR"
    else
      SERVERS="$SERVERS $SVR"
    fi
  fi
done
if [ "$SERVERS" != "" -a "$SERVERS" != " " ]
then
  if [ -f $CNFBASE/etc/nmb.conf ]
  then
    SERVERS="nmb $SERVERS"
  fi
elif [ -f $CNFBASE/etc/smb.conf ]
then
  SERVERS=simple
fi

if [ "$SERVERS" = "" -o "$SERVERS" = " " ]
then
  echo "###"
  echo "### cannot start/stop samba without configuration file(s)"
  echo "### (no /etc/smb.conf and/or /etc/smb.conf-<server>)"
  echo "###"
  exit 1
fi

if [ "$SVARG" = "" -o "$SVARG" = " " ]
then
  SVARG="$SERVERS"
fi
echo "  OPARG=$OPARG"
echo "  SVARG=$SVARG"
echo "SERVERS=$SERVERS"

# Verify SVARG

set $SVARG
SVARG=""
while [ $# -gt 0 ]
do
  MATCH=false
  for SVR in $SERVERS 
  do
    if [ "$1" = "$SVR" ]
    then
      MATCH=true
      if [ "$SVARG" = "" -o "$SVARG" = " " ]
      then
        SVARG="$SVR"
      else
        SVARG="$SVARG $SVR"
      fi
      break
    fi
  done
  if [ "$MATCH" = "false" ]
  then
    echo "### Server $1 is not configured"
  fi
  shift
done

echo "  SVARG=$SVARG"

if [ "$SVARG" = "" -o "$SVRAG" = " " ]
then
  echo "###"
  echo "### no valid servers specified"
  echo "###"
  exit 1
fi

# Start/stop processes required for samba server

case "$OPARG" in

# Start Samba-Services

  start)
    for SVR in $SVARG
    do

      echo "#   starting Samba-Server $SVR"

      if [ "$SVR" = "simple" ]
      then
        for D in /var/samba \
                /var/samba/log /var/samba/locks /var/samba/private
        do
          mkdir -p $D
          chmod 755  $D
          chown 0 $D
          chgrp 0 $D
        done
        chmod 700 /var/samba/private
        if [ ! -f   /var/samba/private/smbpasswd ]
        then
          touch     /var/samba/private/smbpasswd
          chmod 700 /var/samba/private/smbpasswd
        fi

        rm -f /var/samba/locks/smbd.pid  /var/samba/locks/nmbd.pid 

        smbd -D -d 1 -l /var/samba/log -s $CNFBASE/etc/smb.conf 

        if [ -f "$CNFBASE/etc/lmhosts" ]
        then
          nmbd -D -d 1 -H $CNFBASE/etc/lmhosts -l /var/samba/log \
                  -s $CNFBASE/etc/smb.conf
        else
          nmbd -D -d 1 -l /var/samba/log -s $CNFBASE/etc/smb.conf
        fi

      else

        for D in /var/samba /var/samba/$SVR \
                /var/samba/$SVR/log /var/samba/$SVR/locks \
                /var/samba/$SVR/private
        do
          mkdir -p $D
          chmod 755  $D
          chown 0 $D
          chgrp 0 $D
        done
        chmod 700   /var/samba/$SVR/private
        if [ ! -f   /var/samba/$SVR/private/smbpasswd ]
        then
          touch     /var/samba/$SVR/private/smbpasswd
          chmod 700 /var/samba/$SVR/private/smbpasswd
        fi

        rm -f /var/samba/$SVR/locks/smbd.pid  /var/samba/$SVR/locks/nmbd.pid 

        if [ "$SVR" = "nmb" ]
        then
          if [ -f "$CNFBASE/etc/lmhosts" ]
          then
            nmbd -D -d 1 -H $CNFBASE/etc/lmhosts -l /var/samba/$SVR/log \
                    -s $CNFBASE/etc/nmb.conf
          else
            nmbd -D -d 1 -l /var/samba/$SVR/log -s $CNFBASE/etc/nmb.conf
          fi

        else

          smbd -D -d 1 -l /var/samba/$SVR/log -s $CNFBASE/etc/smb.conf-$SVR 

        fi
      fi
    done
  ;;

## Stop Samba-Services

  stop)
    for SVR in $SVARG
    do

      echo "#   stopping Samba-Server $SVR"

      if [ "$SVR" = "simple" ]
      then

        if [ -f     /var/samba/locks/smbd.pid ]
        then
          kill `cat /var/samba/locks/smbd.pid`
        fi

        if [ -f     /var/samba/locks/nmbd.pid ]
        then
          kill `cat /var/samba/locks/nmbd.pid`
        fi

        sleep 2

        rm -f /var/samba/locks/smbd.pid  /var/samba/locks/nmbd.pid

      else

        if [ -f     /var/samba/$SVR/locks/smbd.pid ]
        then
          kill `cat /var/samba/$SVR/locks/smbd.pid`
        fi

        if [ -f     /var/samba/$SVR/locks/nmbd.pid ]
        then
          kill `cat /var/samba/$SVR/locks/nmbd.pid`
        fi

        sleep 2

        rm -f /var/samba/$SVR/locks/smbd.pid  /var/samba/$SVR/locks/nmbd.pid 

      fi
    done
  ;;

## Help-Message

  *)
    echo "Usage: /etc/init.d/samba { start | stop } [server]*"
  ;;
esac

exit 0
-------------- next part --------------
# $Id: smb.conf-zerberos,v 1.35 2002/01/09 19:36:56 ghess Exp $

[global]
   workgroup               = devil
   log file                = /var/samba/zerberos/log/%M.%m
   max log size            = 2500
;  socket options          = TCP_NODELAY
;  keep alive              = 10
   log level               = 1
   syslog                  = 1
   utmp                    = true
   utmp directory          = /var/adm
   lock directory          = /var/samba/zerberos/locks
   time server             = yes

   bind interfaces only    = true
   interfaces              = 127.0.0.1/8 \
			     192.168.18.19/32

   netbios name            = zerberos

   load printers           = false
   encrypt passwords       = Yes
   smb passwd file         = /var/samba/zerberos/private/smbpasswd
   security                = user

;  I would prefer, that this machine is not a domain-master-browser,
;  but it has to, since othewise it would not be accepted by some
;  windows clients as the PDC. So sorry. GHess 11-Jan-2002

   os level                = 64
   local master            = yes
   domain master           = yes
   domain admin group      = +winadmin
   preferred master        = yes

;  Nevertheless, we try to move (keep) the wins server to the real
;  fileserver with samba-2.2.2. GHess 11-Jan-2002

   wins server             = samba1
   wins support            = no
   wins proxy              = no

   default case            = lower
   preserve case           = false
   short preserve case     = false
   mangle case             = no
   case sensitive          = no

;  apparently it is better to disable oplocks, with 2.2.2 too.
;  GHess 11-Jan-2002

   oplocks                 = false

;  Es wird ein spezielle NIS-MAp f?r die Heimatverzeichnisse verwendet
   nis homedir             = true
   homedir map             = auto.devil

;  Dies ist der Anmelde-Server!
   domain logons           = yes

;  Derzeit genau Ein Logon-Script unter netlogon zu finden
   logon script            = %M.bat

;  Die Profiles liegen in den PC-Heimatverzeichnissen
;  W95, WfW use logon home
;  all use the sharename as Home-Directory
   logon drive             = Z:
   logon home              = \\%N\%U\profiles\%a
;  logon path is used by NT
   logon path              = \\%N\%U\profiles\%a

;  Der netlogon-Dienst muss fuer jedermann lesbar sein

[netlogon]
   comment                 = Network Logon Scripts
   path                    = /var/samba/netlogon
   guest ok                = Yes
   writable                = no
   browseable              = yes
   root preexec            = /var/samba/etc/mklogon.sh %U %M %a %N
   root preexec close      = true
   write list              = @winadmin
-------------- next part --------------
# $Id: smb.conf-devil1,v 1.31 2002/01/02 21:34:52 root Exp $
[global]
   config file             = /var/samba/etc/smb.conf-%L

   workgroup               = devil
   log file                = /var/samba/devil1/log/%M.%m
   max log size            = 2500
   socket options          = TCP_NODELAY
   keep alive              = 10
   log level               = 1
   syslog                  = yes
   utmp                    = true
   utmp directory          = /var/adm
   lock directory          = /var/samba/devil1/locks
   time server             = yes
   host msdfs              = true

   bind interfaces only    = true
   interfaces              = 192.168.18.20/32

   netbios name            = devil1
   netbios aliases         = devil2

   load printers           = false
   encrypt passwords       = Yes
   smb passwd file         = /var/samba/devil1/private/smbpasswd
   password server         = zerberos
   security                = server
   map to guest            = nobody

   os level                = 64
   local master            = yes
   domain master           = no
   domain admin group      = +winadmin
   preferred master        = yes
   wins server             = samba1
   wins support            = no
   wins proxy              = no

   default case            = lower
   preserve case           = false
   short preserve case     = false
   mangle case             = no
   case sensitive          = no

#==================== spezielle Shares des Servers ===========================

[homes]
   comment              = %u PC-Heimatverzeichnis
   path                 = /pchome/%u
   browseable           = yes
   read only            = no
   security mask           = 03777
   directory security mask = 03777
   inherit permissions     = true
   invalid users           = root

[common]
   comment             = Produktions Common Tree
   path                = /common
   read only           = no
   public              = no
   browseable          = yes
   security mask           = 03777
   directory security mask = 03777
   inherit permissions     = true
   invalid users           = root



More information about the samba mailing list