Udostępnianie zasobów dyskowych w sieci lokalnej
Ostatnia zmiana: 2024-02-18 15:13

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 tylko te z 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 najpierw 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, choć należy pamiętać o ew. problemach z uprawnieniami plików. W tym przykładzie udostępniamy katalog /mnt/sda1.

W OpenWrt występuje samba w wersji 3.6; od wydania OpenWrt 19.07 dostępna jest także pełna wersja samby w wersji 4.9 oraz "zamiennik" samby - program ksmbd. Obie wersje samby są znacząco duże, więc do instalacji niezbędny jest extroot lub dużo wolnej ilości pamięci flash.

Samba 3.6

Samba 3.6 na potrzeby OpenWrt została ona pozbawiona niektórych elementów (np. kerberos, Active Directory, printserwer) i została ograniczona tylko do mechanizmów udostępniania plików.

Instalacja



    # opkg update
    # opkg install samba36-server

Jeżeli używamy LuCI to można zainstalować także odpowiednią aplikację:


    # opkg install luci-app-samba

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

W ostatnich wydaniach OpenWrt pojawił się pakiet automatyzujący tą czynność:


    # opkg install samba36-hotplug

Jeżeli z jakiegoś powodu nie interesuje nas sposób lub opcje jakie robi automat, można posłużyć się własnym skryptem.
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

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 mało 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.

Samba 4.9

Instalacja



    # opkg update
    # opkg install samba4-server

Jeżeli używamy LuCI to można zainstalować także odpowiednią aplikację:


    # opkg install luci-app-samba4

Konfiguracja

Plik konfiguracyjny znajduje się w /etc/config/samba4 i ma podobną składnię jak dla samby w wersji 3.6. Posiada inny (pełny) plik z szablonem konfiguracji umieszczonym w /etc/samba/smb.conf.template.

ksmbd

Program ksmbd (dawniej: smbd/cifsd) zależy od specjalnego modułu kernela. Przeznaczony jest tylko do udostępniania plików, ale jego zaletą jest minimalna wielkość i kompatybilność ze współczesnymi systemami Windows. Dodatkowo można zainstalować program wsdd2 który służy do "rozgłaszania" usługi w sieci:

Instalacja



    # opkg update
    # opkg install ksmbd-server wsdd2

Jeżeli używamy LuCI to można zainstalować także odpowiednią aplikację:


    # opkg install luci-app-ksmbd

Konfiguracja

Plik konfiguracyjny znajduje się w /etc/config/ksmbd i składniowo jest "prawie" zgodny z plikami od samby 3.6 oraz 4.9, choć ma inne nazwy sekcji. Szablon konfiguracji można znaleźć w pliku /etc/ksmbd/smb.conf.template. 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 globals
        option workgroup 'WORKGROUP'
        option description 'Ksmbd on OpenWrt'

    config share
        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 share
        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

Aby móc dodawać nowych użytkowników należy posłużyć się programem smbuseradd który jest zawarty w pakiecie ksmbd-utils


    # opkg install ksmbd-utils

Dodawanie nowego użytkownika:


    # ksmbd.adduser -a malgosia
    New password:
    Retype new password:
    [smbuseradd/6608]: INFO: User 'malgosia' added


Ksmbd domyślnie nasłuchuje tylko na interfejsie LAN. Jeżeli chcemy żeby nasłuchiwała też na innych sieciach należy jawnie podać wszystkie sieci, np:


    # uci set ksmbd.@globals[0].interface="lan wg0"
    # uci commit

Uruchomienie



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

Montowanie udostępnionych zasobów

Zakładamy że jakiś komputer o adresie IP 192.168.1.100 udostępnia zasoby samby pod nazwami publiczny - dostępny bez logowania oraz prywatny - wymagający podania użytkownika i hasła. Aby zamontować takie zasoby na routerze z OpenWrt nie trzeba konfigurować serwera samby, wystarczy tylko klient:


    # opkg update
    # opkg install kmod-fs-cifs cifsmount
    # mkdir -p /mnt/publiczny
    # mkdir -p /mnt/prywatny

A następnie ręcznie lub przez wpisanie do pliku /etc/rc.local montujemy zasoby:


    # mount -t cifs //192.168.1.100/prywatny /mnt/prywatny -o username=login,password=hasło,vers=3.11
    # mount -t cifs //192.168.1.100/publiczny /mnt/publiczny -o guest,vers=3.11