Udostępnianie zasobów dyskowych w sieci lokalnej
Ostatnia zmiana: 2016-02-21 14:16

Samba jest programem umożliwiającym dzielenie się zasobami dyskowymi w sieci lokalnej - czyli popularne "Otoczenie sieciowe" w systemach Windows. Współdzielić można dowolny katalog widoczny w systemie, nie jest konieczne posiadanie nośnika USB.

Założenie - w systemie jest katalog który chcemy udostępnić. Samba udostępnia katalog, nie interesuje jej czy w nim jest zamontowany jakiś nośnik czy jest to po prostu katalog w routerze.
Jeżeli chcemy udostępniać nośnik, należy go normalnie zamontować ręcznie lub automatycznie. System plików na nośniku (ext2/ext3/vfat/ntfs) nie ma znaczenia, ponieważ komputery korzystające z samby nie widzą systemu plików dysku tylko sieciowy system plików, W tym przykładzie udostępniamy katalog /mnt/sda1.

W OpenWrt występuje samba w wersji 3.6.x (w chwili pisana tego opisu). Jest to jedna z najnowszych wersji tego pakietu, ale na potrzeby OpenWrt została ona pozbawiona niektórych elementów (kerberos, Active Directory, printserwer) i została ograniczona tylko do mechanizmów udostępniania plików.

Instalacja



    # opkg update
    # opkg install samba36-server

Konfiguracja

Odbywa się poprzez edycję pliku /etc/config/samba. Poniżej zaprezentowano konfigurację udostępniającą dwa katalogi: jeden ogólnodostępny o nazwie publiczny udostępniający dane z katalogu /mnt/sda1/publiczny, drugi wymagający podania loginu i hasła (użytkownik malgosia w tym przykładzie) udostępniający katalog /mnt/sda1/prywatny pod nazwą prywatny.


    config samba
        option name openwrt
        option workgroup WORKGROUP
        option description 'OpenWrt serwer'
        option charset 'UTF-8'
        option 'homes' '0'

    config sambashare
        option name publiczny
        option path /mnt/sda1/publiczny
        option read_only no
        option create_mask 0700
        option dir_mask 0700
        option guest_ok yes
        
    config sambashare
        option name prywatny
        option path /mnt/sda1/prywatny
        option read_only no
        option create_mask 0700
        option dir_mask 0700
        option guest_ok no
        option users malgosia


Katalogi /mnt/sda1/publiczny i /mnt/sda1/prywatny muszą istnieć w systemie. Użytkownik (w tym przypadku malgosia) musi mieć prawa zapisu/odczytu do danego katalogu, więc należy je ustawić np. przez:


    # chmod 777 /mnt/sda1
    # chmod 777 /mnt/sda1/publiczny
    # chmod 777 /mnt/sda1/prywatny

Nowy użytkownik

Proces zakładania nowego użytkownika opisane jest w osobnym dokumencie. Dodatkowo należy utworzyć hasło tego użytkownika dla zasobów samby korzystając z innego programu: smbpasswd. Podsumowując: aby utworzyć użytkownika o nazwie malgosia należy wykonać to następującym poleceniami:


    # echo "malgosia:*:1000:65534:malgosia:/tmp:/bin/false" >> /etc/passwd
    # echo "malgosia:*:0:0:99999:7:::" >> /etc/shadow
    # touch /etc/samba/smbpasswd
    # smbpasswd -a malgosia


Nazwę użytkownika (malgosia) i hasło należy oczywiście zmienić stosownie do wymagań; jeżeli mamy kilku użytkowników należy liczbę 1000 zwiększać kolejno tak, aby przy każdym była unikalna wartość. Jeżeli podajemy inny numer grupy, należy także pamiętać o jej utworzeniu.

Należy się więc posłużyć poleceniem wspomnianym już poleceniem chmod


    # chmod 777 /mnt/sda1/prywatny

Nie wszystkie systemy plików umożliwiają przydzielanie uprawnień pod OpenWrt (fat/ntfs) więc trzeba je odpowiednio wcześniej zamontować, aby ten użytkownik miał odpowiednie prawa (patrz dokument o nośnikach).

Polskie znaki

Wspomniana konfiguracja obsługuje już polskie znaki. Jeżeli udostępniamy dysk to może być koniecznie odpowiednie zamontowanie nośnika, np. w przypadku stosowania nośnika z fat musi on być zamontowany z opcją utf8, czyli np.:


    # mount -t vfat -o utf8 /dev/sda1 /mnt/sda1

(patrz dokument o nośnikach).

Uruchomienie

Zostaje tylko włączenie samby


    # /etc/init.d/samba enable
    # /etc/init.d/samba start

Odpowiednie montowanie zasobów można też wyklikać korzystając z gui LuCI (po instalacji pakietu luci-app-samba).

Wolne miejsce na dysku (opcjonalnie)

W przypadku systemów Windows samba może niewłaściwie podawać ilość wolnego miejsca (podaje ilość wolnego flash a nie extroota). Rozwiązanie problemu: http://eko.one.pl/forum/viewtopic.php?pid=19831 .
Jeżeli samba podaje jako wolne miejsce np. 14MB lub 61MB to przyczyną może też być po prostu brak zamontowanego nośnika w katalogu który udostępnia samba - zwłaszcza występuje to w gargoyle, jeżeli dysk uległ odmontowaniu.

Automatyczne udostępnianie podłączonych dysków

Jeżeli podłączony dysk automatycznie jest montowany (patrz poradnik o montowaniu zasobów) można pokusić się o automatycznie udostępnianie takiego dysku. W tym celu należy normalnie skonfigurować sambę, a później utworzyć plik /etc/hotplug.d/block/99-samba o zawartości:


    #!/bin/sh
    case $DEVICENAME in
        mtdblock*);;
        sd[a-z][0-9]*)
        case $ACTION in
        add)
            grep -q /dev/$DEVICENAME /proc/mounts || exit 0
            DIR=$(awk '/^\/dev\/'$DEVICENAME'/ {print $2}' /proc/mounts)
            i=$(uci show samba|awk 'NF{p=$0}END{print p}'|sed -e "s/^.*\[\\(.*\)\].*$/\1/")
            while [ "$i" -ge 0 ]; do
                sharepath=$(uci get samba.@sambashare[$i].path)
                [ "$sharepath" = "$DIR" ] && {
                    uci delete samba.@sambashare[$i]
                }
                i=$(( i-1 ))
            done

            uci add samba sambashare
            uci set samba.@sambashare[-1].name="$DEVICENAME" 
            uci set samba.@sambashare[-1].path="$DIR"
            uci set samba.@sambashare[-1].read_only=no
            uci set samba.@sambashare[-1].guest_ok=yes
            /etc/init.d/samba restart
            uci revert samba
            ;;
        remove)
            i=$(uci show samba|awk 'NF{p=$0}END{print p}'|sed -e "s/^.*\[\\(.*\)\].*$/\1/")
            while [ "$i" -ge 0 ]; do
                sharepath=$(uci get samba.@sambashare[$i].path)
                d=$(uci get samba.@sambashare[$i].name)
                if [ ! -e "$sharepath" -o "$d" = "$DEVICENAME" ]; then
                    uci delete samba.@sambashare[$i]
                fi
                i=$((i-1))
            done
            /etc/init.d/samba restart
            uci revert samba
        ;;
        esac
        ;;
    esac

Podłączony nośnik jest automatycznie dodawany do konfigu samby i jest ona restartowana. Wszystko odbywa się dynamicznie, nie jest konfig zapisywany do pliku, więc nie ma problemu po restarcie routera.

Uwagi dla użytkowników Windows Vista i 7 (opcjonalnie)

W starszych wersjach samby, Windows Vista może mieć problem z dostaniem się do tak przygotowanych zasobów. Wynikało to ze starej wersji samby która nie obsługuje uwierzytelniania NTLMv2, które z kolei jest domyślnym i jednym w Vista. Nowsza nie powinna mieć tego problemu. Jeżeli jednak coś takiego wystąpi, należy to zmienić:

Windows Vista Business, Ultimate
- uruchom secpol.msc
- wybierz "Local Policies > Security Options"
- otwórz "Network security: LAN Manager authentication level"
- zaznacz "Send LM & NTLM - use NTLMv2 security if negotiated" zamiast "Send NTLMv2 response only"

Windows Vista Home, Premium
- uruchom regedit
- znajdź klucz "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\"
- ustaw "LMCompatibilityLevel" na "1" co oznacza "używaj NTLMv2 jeżeli jest dostępne lub starszej wersji jeżeli nie"
Patrz także: forum eko.one.pl

Zakończenie

Jeżeli nastąpi zmiana w loginie/haśle na sambie, trzeba zresetować pamięć haseł w Windows (XP, Vista) - w przeciwnym wypadku można otrzymać komunikat "Nie dostępny" lub podobne. Aby zresetować pamięć haseł należy wykonać polecenie "net use * /del /yes"

Samba jest wygodnym (w przypadku Windowsa) sposobem wymiany plików pomiędzy urządzeniami. Jednakże jest bardzo słabo wydajna (dla przypomnienia - procesory stosowane w tanich ruterach mają częstotliwość procesora ok 400MHz!) i może to być wąskim gardłem. Szybszym rozwiązaniem jest użycie ftp.