Samba

Michal Nováček, <xnovace1@fi.muni.cz>


Obsah


Co je vlastně Samba?

Samba je balíček aplikací, které dokáží komunikovat pomocí SMB (server message block) protokolu. Protokol SMB používají pro komunikaci mezi pracovními stanicemi a serverem Windows a OS/2. Protože UNIXové systémy používají ke stejnému účelu NFS, existuje pro ně implemetace SMB, která se jmenuje Samba a umožňuje oboustraně plnohodnotnou komunikaci se sítěmi SMB. Samba umožňuje (hlavně) následující věci:

Sambu tvoří dva démoni a to: [Zpátky navrch]

Distribuce Samby obsahuje následující programy:

[Zpátky navrch]

NetBIOS

NetBIOS (Network Basic Input/Output System) pochází od firmy IBM, která ho vymyslela v roce 1985 jako API (application programming interface) pro práci ve vlastních sítích, které poskytovalo základní funkce na propojení aplikací a sdílení dat s ostatními stanicemi. Ještě téhož roku IBM vydalo následovníka NetBEUI (NetBIOS Extended User Interface), který umožňoval 15 písmené názvy a až (255) uzlů na síti.

Protože TCP/IP používá k označování strojů číselné adresy a NetBIOS jenom jména, vznikly dva dokumenty RFC ( RFC 1000 /  1002), které popisují, jak by měl NetBIOS pracovat na TCP/UDP sítích. Tyto dokumenty popisují všechny implementace, včetně Samby a nativního protokolu Windows.

[Zpátky navrch]

Windows Internet Name Service (WINS)

WINS (The Windows Internet Name Service) je Microsoftí implementace NetBIOS nameserveru (NBNS). Jako takový má stejné charakteristiky jako NetBIOS. Je jednoduchý, což znamená, že lze mít pouze jednoduché názvy skupin a počítačů. Je dynamický: když se klient připojí do sítě, je po něm požadováno lokálním WINS serverem jeho síťové NetBIOS jméno, adresa a pracovní skupina. WINS klient vrací tyto informace na dotazy dokud klient tyto informace pravidleně obnovuje, z čehož WINS server usuzuje, že je stále připojen k síti. Aktivnímu serveru se říká primární WINS server. Lze nainstalovat i sekundární WINS server, který funguje zcela očekávatelným způsobem a to tak, že v případě nedostupnosti serveru primarního přebere jeho roli. To, který WINS server bude primární a který sekundární je statická informace a je potřeba ji nastavit na natvrdo na pracovních stanicích. Primární a sekundární server synchronizují záznamy periodicky. Samba může být primárním WINS serverem, ale ne sekundárním.

[Zpátky navrch]

Identifikace stroje NetBIOS jménem

V sítích NetBIOS, když se stanice připojí k síti, pokusí se o přihlášení svým jménem. Tomu se říká registrace. Dvě stanice nemůžou mít stejný jméno a ve stejné pracovní skupině, ze zřejmého důvodu --> nebylo by možné jednoznačně identifikovat stanice se stejnými názvy. Jsou dva různé přístupy, jak se toto řeší:

Proces registrace počítače po připojení do sítě NetBIOS:

[Zpátky navrch]

Pro překlad NetBIOS adres na IP adresy se používá jeden z následujících způsobů:

[Zpátky navrch]

Výkon serveru

There are major performance and scalability increases in Samba: the code has been reorganized and nmbd (the Samba name service daemon) heavily rewritten:

[Zpátky navrch]

Instalace

Sambu lze stáhnout z oficiálních stránek http://www.samba.org . Pro většinu běžných systémů (včetně FreeBSD) existují binární distribuce. Kompilace ze zdrojových souborů probíhá obvyklým způsobem, tedy:

 # cd $PREFIX
 # ./configure [volby]
 # make 
 # make install
         
Dostupné volby se získají parametrem --help. Za povšimnutí stojí následující: --with-ssl, --with-pam, --with-ldap, --with-quotas Konfigurační soubor smb.conf se po instalaci nachází v adresáři /etc/samba (linux) nebo /usr/local/etc (FreeBSD). Společně se Sambou se nainstaluje také SWAT (Samba WEB administration tool). Pokud chcete využívat tuto službu, je třeba přidat řádek :
 swat   901/tcp
         
do /etc/services (pokud tam už takový není). Pokud chcete startovat SWAT z (x)inetd démona, záznam může vypadat třeba takhle

[Zpátky navrch]

Spouštění

[Zpátky navrch]

Konfigurace

Konfigurační soubor je obvykle v adresáři /etc/samba (linux) nebo /usr/local/etc (FreeBSD). Zde je jeho okomentovaná ukázka, umožňující mountování UNIXových domovských adresářů uživatelů, upload a sdílení tiskové fronty LPD.

Internacionalizace

Protože UNIXové systémy používaji znakovou sadu ISO8859--2 narozdíl od Windows, které používají WIN--1250, je třeba zajistit správné ukládání jmen na discích. Slouží k tomu konfigurační volby client code page a character set

Samba má dokonce podporu pro překlad asijských a japonských jazyků na normaální znaky.

příklad konfiguračního souboru

[global]
   workgroup = XP
   netbios name = bedrich
   netbios alias = beda bedrichus
   # uzitecne %: %L -- NetBIOS jmeno serveru
   #             %v -- verze Samby
   #             %m, %I -- NetBIOS/IP adresa klienta
   #             %T -- čas a datum
   server string = Samba %v na serveru %L
     
   #sitova zarizeni na kterych bude samba naslouchat       
   spinterfaces = 172.16.43.1 147.251.60.201
   hosts allow = 147.251.60. 147.251.62 172.

   security = USER
   map to guest = Bad Password

   log file = /var/log/samba/log.%m
   max log size = 500
   character set = ISO8859-2

   printing = bsd
   print command = lpr -r -h -P %p %s
   load printers = yes
   logfile = /var/log/samba/samba-log.%m
   lock directory = /var/lock/samba

   #preklada netbios adresy na ip tak, ze se pta dns
   dns proxy = yes 
   local master = yes
   domain master = no
   hide unreadable = yes
   socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

[homes]
   comment = Home Directories
   read only = no
   browseable = no

[upload]
   comment = upload z windows na sambu
   path = /home/ftp/upload
   browseable = yes
   writeable = yes
   guest account = ftp
   guest ok = yes

[printers]
   comment = DeskJet690C (707)
   security = server
   path = /var/spool/lpd/dj690-sit
   printer name = lp

   browseable = yes
   guest ok = yes
   create mode = 0700

   writable = yes
   public = yes
   printable = yes


   valid user = svatoslava, kvetomila
        
[Zpátky navrch]

Testování konfigurace

Jestli běží na počítači Samba server ozkoušíme následujícím příkazem:

# smbclient -U% -L localhost
Added interface ip=172.16.43.1 bcast=172.16.43.255 nmask=255.255.255.0
Added interface ip=147.251.60.68 bcast=147.251.60.255 nmask=255.255.255.0
Domain=[SIMPLE] OS=[Unix] Server=[Samba 2.0.5a]

Sharename      Type      Comment
---------      ----      -------
homes          Disk      Home Directories
upload         Disk      upload z windows na sambu
test           Disk      For testing only, please
IPC$           IPC       IPC Service (Samba
2.0.5a)

Server                   Comment
---------                ------
BEDRICH                  Samba 2.0.5a

Workgroup                Master
---------                -------
XP                       BEDRICH

# testparm
Load smb config files from /usr/local/samba/lib/smb.conf
...
load printers: Yes
printcap name: /etc/printcap
Default service parameters:
guest account: ftp
min print space: 0
print command: lpr -r -P%p %s
lpq command: lpq -P%p
lprm command: lprm -P%p %j
lppause command:
lpresume command:
 Service parameters [printers]:
 path: /tmp
 print ok: Yes
 read only: true
 public: true

# testprns lp /etc/printcap
Looking for printer lp in printcap file /etc/printcap
Printer name lp is valid.

      

[Zpátky navrch]

Odkazy

Understanding the network neighborhood
Linux + Samba -- priklad z firemni praxe
O'Reilly -- Using Samba
[Zpátky navrch]

SWAT inetd:
wait   stream  tcp  nowait.400  root  /usr/local/samba/bin/swat  swat
      
SWAT xinetd:
service swat
{
         socket_type          = stream
         wait                 = no
         only_from            = localhost
         user                 = root
         server               = /usr/local/sbin/swat
         log_on_failure      += USERID
}
      
/etc/rc.d/init.d/smbd
#!/bin/sh
#
# chkconfig: - 91 35
# description: Starts and stops the Samba smbd and nmbd daemons \
#	       used to provide SMB network services.
#
# pidfile: /var/run/samba/smbd.pid
# pidfile: /var/run/samba/nmbd.pid
# config:  /etc/samba/smb.conf


# Source function library.
if [ -f /etc/init.d/functions ] ; then
  . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
  . /etc/rc.d/init.d/functions
else
  exit 0
fi

# Avoid using root's TMPDIR
unset TMPDIR

# Source networking configuration.
. /etc/sysconfig/network

if [ -f /etc/sysconfig/samba ]; then
   . /etc/sysconfig/samba
fi

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# Check that smb.conf exists.
[ -f /etc/samba/smb.conf ] || exit 0

# Check that we can write to it... so non-root users stop here
[ -w /etc/samba/smb.conf ] || exit 0


RETVAL=0


start() {
        KIND="SMB"
	echo -n $"Starting $KIND services: "
	daemon smbd $SMBDOPTIONS
	RETVAL=$?
	echo
        KIND="NMB"
	echo -n $"Starting $KIND services: "
	daemon nmbd $NMBDOPTIONS
	RETVAL2=$?
	echo
	[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smb || \
	   RETVAL=1
	return $RETVAL
}	

stop() {
        KIND="SMB"
	echo -n $"Shutting down $KIND services: "
	killproc smbd
	RETVAL=$?
	echo
	KIND="NMB"
	echo -n $"Shutting down $KIND services: "
	killproc nmbd
	RETVAL2=$?
	[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && rm -f /var/lock/subsys/smb
	echo ""
	return $RETVAL
}	

restart() {
	stop
	start
}	

reload() {
        echo -n $"Reloading smb.conf file: "
	killproc smbd -HUP
	RETVAL=$?
	echo
	return $RETVAL
}	

rhstatus() {
	status smbd
	status nmbd
}	

case "$1" in
  start)
  	start
	;;
  stop)
  	stop
	;;
  restart)
  	restart
	;;
  reload)
  	reload
	;;
  status)
  	rhstatus
	;;
  condrestart)
  	[ -f /var/lock/subsys/smb ] && restart || :
	;;
  *)
	echo $"Usage: $0 {start|stop|restart|reload|status|condrestart}"
	exit 1
esac

exit $?
      
/usr/local/etc/rc.d/smbd
#!/bin/sh

rc_file=${0##*/}

if ! PREFIX=$(expr $0 : "\(/.*\)/etc/rc\.d/${rc_file}\$"); then
        echo "${rc_file}: Cannot determine PREFIX." >&2
        echo "Please use the complete pathname." >&2
        exit 64
fi

smbspool=/var/spool/samba
pidfiledir=/var/run
smbd=${PREFIX}/sbin/smbd
nmbd=${PREFIX}/sbin/nmbd

# start
if [ "x$1" = "x" -o "x$1" = "xstart" ]; then
	if [ -f $smbd ]; then
		if [ -d $smbspool ]; then
			rm -f $smbspool/*
		fi
		echo -n ' Samba'
		$smbd -D
		$nmbd -D
	fi

# stop
elif [ "x$1" = "xstop" ]; then
	kill `cat $pidfiledir/smbd.pid`
	kill `cat $pidfiledir/nmbd.pid`
fi

      
SMB xinetd:
service netbios-ssn
{
         socket_type          = stream
         protocol             = tcp
         wait                 = no
         user                 = root
         group                = root
         server               = /usr/local/sbin/smbd
}
      
NMB xinetd:
service netbios-ns
{
         socket_type          = dgram
         protocol             = udp
         wait                 = yes
         user                 = root
         group                = root
         server               = /usr/local/sbin/nmbd
}
      
N/SMB inetd:
 netbios-ssn stream tcp nowait root /usr/local/samba/bin/smbd smbd
 netbios-ns  dgram  udp wait   root /usr/local/samba/bin/nmbd nmbd