Raspberry Pi’a Samba Sunucusu Kurmak ve Yapılandırmak

Samba[1], Linux ve Unix işletim sistemleri ile Windows NT ve Windows 9x işletim sistemleri arasındaki iletişimi sağlayan bir ağ sunucusu uygulamasıdır ve günümüzde çoğu Linux dağıtımında standart olmuş temel ağ hizmetleri arasında yer alır. Günümüzde bir PC’ye Linux kurduğunuzda büyük ihtimalle Samba uygulaması da varsayılan olarak kurulmuş olacaktır. Bunu ağdaki Windows makinelerin yazıcı ve klasör paylaşımlarına erişebiliyor olmanızdan anlayabilirsiniz. Samba ile klasörler, yazıcılar ve tarayıcılar Linux ve Windows makineler arasında paylaştırılabilir. Örneğin Raspberry Pi’a bağlı harici bir diske Windows yüklü bilgisayarınızdan, bu uygulama sayesinde erişebilirsiniz. Samba aynı zamanda içerisinde SMB protokolünü de barındırır. SMB ile Windows ağlarının çalışma gruplarına katılabilir, Windows’un WINS (Windows Naming Service) hizmeti sayesinde bir Windows Ağı içerisinde ulaşılabilir olabilirsiniz. Görüldüğü gibi Samba daha çok Windows bilgisayarların yer aldığı ağ ortamlarında ortaklaşmak için kullanılan bir uygulama ve araçlar topluluğudur.

Samba bir ağ iletişim protokolü olan SMB için yeniden yazılmış hem bir uygulama ve hem de Linux’ta çalışan bir ağ hizmetinin adıdır. Samba sadece dosya/yazıcı paylaşımı yapmaz. Windows’un ileri düzey ağ destekli yönetilebilirlik özelliklerinden birisi olan Active Directory’yi[2] de destekler. Bir Domain Controller[3]  olarak görev yapabilir veya bir Windows Domain’inin (Organizasyonel Yapı) parçası olabilir.

Samba’yı kurmak için, her zaman olduğu gibi Raspberry Pi’ı güncelledikten sonra Raspberry Pi OS deposundan Samba paketini indirip kuralım:

[email protected] ~ $ sudo apt update
[email protected] ~ $ sudo apt full-upgrade -y
[email protected] ~ $ sudo apt install samba smbclient -y

Samba’nın başarıyla kurulup kurulmadığını görmek için servis listesinden kontrol edebilirsiniz.

[email protected] ~ $ systemctl status smbd
[email protected] ~ $ systemctl status nmbd

Ekran çıktısında nmbd (name registration ve resolution request) hizmetinin de çalıştığı dikkatinizi çekmiştir. nmbd de Samba gibi bir ağ sunucu hizmetidir ve daha önce bahsettiğimiz WINS ile benzer bir görevi yerine getirerek, Windows Makine Adı’nı (Windows Host Name) IP adresine çevirir. Bunu Windows tabanlı yerel ağlarda Hostname<->IP dönüşümünü yapan bir ağ servisi olarak düşünebilirsiniz. Örneğin ağdaki bir Windows bilgisayar, hostname’i RASPBIAN olan bilgisayarının IP adresini soracak olursa, RASPBIAN isimli bilgisayarda çalışan nmbd sunucusu bu soruyu UDP protokolünü kullanarak kendi IP adresi ile cevaplar. Windows işletim sistemi ağ komşuları listesini oluşturmak için de bu hizmetten yararlanır.

smbd ise Samba’nın ana servisidir ve TCP/IP protokollerini kullanarak dosya ve yazıcı paylaşım işlemlerini yerine getirir. Bu nedenlerle nmbd hizmeti de smbd hizmeti ile aynı anda çalışmak zorundadır. smbd’yi yeniden başlatmanız gerektiğinde nmbd servisini de yeniden başlatmanız faydalıdır.

Samba İle bir dizin paylaştırmak

Samba’nın ana ayar dosyası smb.conf’tur. Bu dosya ile hangi dizinlerin paylaştırılacağını, paylaşılan dizinlerin ağda görünen adının ne olacağını, hangi izinlerle paylaştırılacağını (sadece okuma/hem okuma hem yazma gibi), hangi kullanıcıların paylaşımlara parola ile giriş yapacağı gibi birçok ayarlama yapılır. Şimdi nano editörü ile dosyanın içerisine bir göz atalım ve aşağıdaki örnekteki gibi bir tanımlama yapalım. Düzenlemeden önce her ihtimale karşı dosyanın orijinalinin bir yedeğini saklamak iyi bir olacaktır. Bunun için aynı dizine smb.conf.1 adında bir yedek alalım. Dosyadaki diğer seçenekleri değiştirmeye çoğu durumda gerek duyulmaz.

[email protected] ~ $ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.1
[email protected] ~ $ sudo nano /etc/samba/smb.conf
[global]
       log file = /var/log/samba/all.log
       max log size = 1000
       panic action = /usr/share/samba/panic-action %d
       map to guest = Bad User
       obey pam restrictions = Yes
       pam password change = Yes
       passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
       passwd program = /usr/bin/passwd %u
       security = USER
       idmap config * : backend = tdb
[Pi-Paylasim]
comment = Home paylasimi
path = /home/pi
browsable = yes
valid users = pi
writable = yes
read only = no

Yukarıdaki ayarlar ile “Pi-Paylasim” etiketi ile gösterilen ev dizini (/home/pi) ağa paylaştırılmıştır. browsable anahtarı true yapılarak dizinler içinde dolaşılmasına izin verilmiş, “read only = none” ile de paylaşımın yazılabilir olması sağlanmıştır. Yazılabilir olmasının anlamı, bu paylaşımdaki mevcut dosya ve dizinlerde değişiklik/ekleme/silme işlemlerinin yapılabileceğidir. “comment = Home paylasimi” seçeneği ile bu paylaşım için ağda görünecek bir açıklama tanımlanmıştır. “path = /home/pi” ise paylaştırılmak istenen dizinin patikasıdır. “valid users = pi” ile bu paylaşıma erişebilecek kullanıcılar tanımlanmıştır. Bu ayara göre “pi” adlı kullanıcı bu paylaşıma erişebilecektir. Tanımlamamızı Ctrl+O ile kaydedip Ctrl+X ile çıktıktan sonra testparm komutunu vererek smb.conf dosyasındaki ayarların doğruluğunu sınatabilirsiniz. Bu sınama yazım yanlışlıklarını, geçersiz veya çakışan seçenekleri içerir. Samba’nın mantıksal işlevleri açısından bir sınama gerçekleştirmez.

[email protected] ~ $ sudo testparm -s

Eğer seçenek ve değerlerde bir yazım hatası yapmış iseniz program sizi uyaracaktır. Aşağıdaki gibi -v (verbose) seçeneği eklediğinizde testparm’ın çıktısı smb.conf’ta yazılı olmayan varsayılan seçenekleri de barındırması itibarıyla iyi bir yapılandırma yedeği olarak da düşünülebilir.

[email protected]:~ $ testparm -v -s

Dizin paylaştırmayla ilgili dikkat edilmesi gereken önemli bir konu da, “pi” kullanıcısı için bağımsız bir Samba parolası oluşturulması gerektiğidir. Yani, hâlihazırdaki pi (raspbian) kullanıcısının parolası burada geçerli olamayacaktır. Samba, bu servisi kullananlar için parolaları kendi bağımsız veri tabanında saklar. Paylaşıma erişecek kullanıcı Raspberry Pi OS sisteminde de kayıtlı bir kullanıcı olmalıdır. Bu nedenle paylaşıma erişecek kullanıcının parolası smbpasswd komutu ile Samba parola veri tabanına eklenmelidir. Aksi takdirde ağ paylaşımına giriş yapılamayacaktır. Kısaca ilgili paylaşıma erişmek için sistemde tanımlı bir kullanıcının ismi kullanılır; fakat parolası samba’ya bağımsız olarak tanımlanır. Pi kullanıcısına samba parolası tanımlamak için aşağıdaki komutu kullanabilirsiniz:

[email protected] ~ $ sudo smbpasswd -a pi

Samba ile bir sistem dizinini paylaştırmak (/var/www/)

Yukarıdaki örnekte pi kullanıcısına ait bir dizini yine pi kullanıcısı ile samba kullanarak ağa paylaştırmıştık. Yani, dosya sistemi üzerindeki sahibi ile paylaşıma erişmeye yetki verdiğimiz kullanıcı aynı kullanıcılardı. Örneğin /var/www/html veya /var/logs gibi root (sistem yöneticisi) kullanıcısının sahibi olduğu dizinleri paylaştırmak için root izni gerekir. Aşağıdaki çıktıdan dizinlerin sahibinin root olduğunu görebilirsiniz:

[email protected] ~ $ ls -la /var/www/html/
drwxr-xr-x 2 root root 4096 Mar  6 02:59 
[email protected] ~ $ ls -la /var/log/
drwxr-xr-x  7 root root   4096 Mar  7 21:44 .

Bu dizinleri paylaştırabilmek için normalde root kullanıcısına bir samba parolası tanımlamak gerekir.

Raspberry Pi’da root kullanıcısı aktif kullanılan bir hesap olmadığından bu işi yine pi kullanicisi üzerinden gerçekleştirmek doğru bir yaklaşımdır. Dosya sistemi üzerinde farklı kullanıcılara ait olan dizinleri farklı samba kullanıcıları için paylaştırmak gerektiğinde smb.conf dosyasında force user ve force group seçenekleri kullanılır. force user seçeneği valid users seçeneğinden farklı olarak, dosya sistemi üzerinde farklı kullanıcılara ait ait dizin ve dosyaların istenilen bir samba kullanıcısı üzerinden paylaştırılmasını sağlar.

Daha basit bir ifade ile root kullanıcısının sahibi olduğu bir dizini pi kullanıcısı ile paylaştırmak için force user ve force grup seçeneklerinin kullanılmasına ihtiyaç vardır. Bu durumda valid user (paylaşıma giriş yapmaya yetkili) olan pi kullanıcısı, samba paylaşımına giriş yapabilir; fakat dosya sistemi düzeyindeki erişim izinleri için force user ile belirtilen kullanıcının yetkilerini kullanır. force group seçeneği de aynı işlemi dosyanın grup erişim izinleri için gerçekleştirir.

Aşağıdaki smb.conf girdisini inceleyin:

[email protected] ~ $ sudo nano /etc/samba/smb.conf
...
[www]
comment = Apache yayin dizini
path = /var/www/html
browsable = yes
read only = no
force user = root
force group = root

Yukarıdaki örnekte root kullanıcısının sahibi olduğu /var/www/html dizini ağa paylaştırılmıştır. Bu paylaşıma dosya sistemi düzeyinde erişmeye yetkili tek kullanıcı root olduğu için force user olarak root belirtilmiş, paylaşıma giriş yapmaya yetkili kullanıcı olarak da pi kullanıcısı tanımlanmıştır. Pi kullanıcısı paylaşım üzerinde yeni dosyalar oluşturduğunda dosyanın sahibi ve gurubu root, erişim izni de 755 olarak gerçekleşecektir. Tabi ki bu paylaşıma giriş yapabilmek için pi kullanıcısına bir samba parolası tanımlamayı da unutmamak gerekir. Ayarların gerçerli olması için samba servislerini veya Raspberry Pi’ı yeniden başlatabilirsiniz:

[email protected] ~ $ sudo smbpasswd -a pi

Create Mask ve Force Create Mode seçenekleri

Create mask ve force create mode seçenekleri ile paylaşıma karşılık gelen dosya sistemi üzerinde oluşturulan dosya ve dizinlerin erişim izinlerinin yeniden tanımlanmasını sağlar. Create mask ile verilen izin And(ve) mantıksal işlemine tabi tutulurken force create mode seçeneği ile verilen izin Or (veya) mantıksal işlemine tabi tutulur. Örneğin 744 (rwx-r—r–) iznine sahip bir dosya için create mask = 711 ve force create mode = 722 değeri tanımlanırsa dosyanın yeni erişim izni 722 (rwx–w–w) olur. Burada yapılan and ve or işlemini aşağıdaki tablodan daha rahat anlayabilirsiniz:

Orijinal erişim izniSahibi (ikilik)Grubu (ikilik)Diğerleri (ikilik)
744111100100
create mask (oluşturma maskesi) ‘in orijinal izin ile AND işlemine tabi tutulması
744111100100
AND
711111001001
SONUÇ
700111000000
force create mode‘un create mask’e uygulanması
700111000000
OR
722111010010
OR İŞLEMİNİN SONUCU
722111010010

Yukarıdaki örneğin smb.conf dosyasına uygulanması aşağıdaki gibidir:

.
.
.
[www]
comment = Apache yayin dizini
path = /var/www/html
browsable = yes
read only = no
valid users = pi
force user = root
force group = root
create mask = 711
force create mode = 722

Erişim izinlerini daha rahat anlamak için şu yöntemi kullanabilirsiniz. Erişim izninden çıkartmak istediğiniz bit’ler için,  create mask değerinin ilgili bit’lerine (r/w/x) 0 değerini, erişim iznine eklemek istediğiniz bit’ler için force create mode değerinin ilgili bit’lerine 1 değerini verin.

Samba kullanıcısı eklemek ve silmek

smbpasswd komutu ile sistemde var olan kullanıcının samba parolası oluşturabilirsiniz.

[email protected] ~ $ sudo smbpasswd -a pi

Pi kullanıcısının samba paylaşımlarına erişimini tamamen kaldırmak için ise şu komu kullanılır:

[email protected] ~ $ sudo smbpasswd -x pi

Kullanıcıyı silmek yerine devre dışı bırakmak için -d (disabled) seçeneğinden yararlanılır. Bu durumda ilgili kullanıcı paylaşımlar üzerinde oturum açamaz:

[email protected] ~ $ sudo smbpasswd -d pi

Devre dışı bırakılan kullanıcıyı tekrar etkinleştirmek için ise -e (enabled) seçeneği kullanılır.

[email protected] ~ $ sudo smbpasswd -e pi

Ayarları ve parola tanımlamayı gerçekleştirdikten sonra samba servisini yeniden başlatarak ayarların geçerli olmasını sağlayabilirsiniz. samba normal şartlarda dakikada bir kere mevcut güncel konfigürasyonu diskten okur ve uygular.

[email protected] ~ $ sudo systemctl restart smbd

Samba kullanıcısının parolasını değiştirmek

Kurulum aşamasında, pi kullanıcısına Samba parolası tanımladığımız komutu parolayı değiştirmek için de kullanabilirsiniz.

[email protected] ~ $ sudo smbpasswd -a pi

Yeri gelmişken bu durumla ilgili ek bir bilgi vermek istiyorum. Bir Windows bilgisayarından samba paylaşımına kullanıcı adı ve parola ile bir kere giriş yapıp oturum açtıktan sonra smbpasswd komutu ile kullanıcının parolasını değiştirirseniz, yeni parolanın Windows tarafında hemen geçerli olmadığını, eski parola ile giriş yapılmış paylaşımların içerisinde gezinebildiğinizi fark edebilirsiniz.

Eğer Windows tarafında paylaşıma giriş yaparken parola hatırlama işaret kutusunu seçmediyseniz genellikle Windows’u yeniden başlattığınızda yeni parolanız kullanılır duruma gelir, bu zamana kadar Windows ilgili Samba paylaşımını daha önce açtığı oturum üzerinden yürütmeye devam eder. Böyle bir durumda aşağıdaki adımları gerçekleştirerek güncellenen parolanın Windows’u yeniden başlatmaya gerek kalmadan kullanılabilir olmasını sağlayabilirsiniz. Bunun için ilk olarak hem Windows hem de Raspberry Pi OS tarafında hâlihazırda açılmış olan aktif oturumların kapatılması için şu adımları takip etmelisiniz:

  • Öncelikle Windows bilgisayarında hâlihazırda paylaşımların açık pencereleri varsa kapatın.
  • Başlat->Çalıştır (Windows+R) a giderek net use * /d komutunu verin. Bu komut ile hâlihazırdaki paylaşımların oturum bağlantıları kapanacaktır.

Açık netbios bağlantılarının kapatılması

  • Aynı oturumların Raspberry Pi OS tarafında da kapanması için sudo systemctl restart smbd komutunu verin ve Samba servisini yeniden başlatın:

Samba paylaşımına Windows üzerinden erişmek

Paylaşımı kullanmaya başlamak için bir Windows bilgisayarın ağ komşuları aracılığı ile (Windows’un ağ bulma hizmetnin açık olması gerekir) veya doğrudan Raspberry Pi’ın samba adresini yazarak da bağlanabilirsiniz. Windows’un “Bilgisayarım” (explorer) penceresini açarak adres çubuğuna şunu yazın:

\2.168.0.101

Windows’un, Windows Explorer adlı bu dosya yöneticisi ile kopyalama, yazma, değiştirme ve silme gibi temel dosya işlemlerini (paylaşımın izinleri çerçevesinde) gerçekleştirebilirsiniz.

Adres çubuğuna Raspberry Pi’ın IP adresini yazmalısınız. Baştaki \\ (iki adet ters bölü) karakterler kritik öneme sahiptir ve 192.168.0.101 IP adresli bilgisayarın Samba servisine bağlanılacağı anlamına gelen protokol tanımlayıcısıdır.

Samba komut satırı araçları ile hâkimiyetinizi artırın

Samba kurulumu sırasında yüklediğimiz paketlerden biri olan samba-common-bin içerisinde birçok aracı bulunduran faydalı bir pakettir. Bu bölümde paylaşım sistemimiz üzerindeki hâkimiyetimizi artıran ve muhtemel sorunların nasıl çözülebileceği ile ilgili bazı pratik bilgiler ve araçların kullanımından bahsedilecektir.

Smbclient aracı ile paylaşımları listelemek

Samba paketlerini kurarken, smbclient paketini de dâhil ettiğimiz dikkatinizi çekmiştir. Smbclient aracı Samba paylaşımlarını listelemek ve aynı zamanda test etmek için Samba geliştiricileri tarafından yazılmış Samba ile tam uyumlu bir istemcidir.

Eğer Windows’u istemci olarak kullanıyorsanız Samba paylaşımlarına erişirken manasız sorunlar yaşayabilirsiniz. Bazen bunun nedeni Windows ile Samba arasındaki, nedeni çok da belli olmayan uyumsuzluklardan kaynaklanır. Samba’nın kullandığı smb protokolü Microsoft’un kapalı kaynak kodlu bir protokolüdür ve gerekli detaylar Samba geliştiricileri tarafından ağ ve veri paketi analizi ile tersine mühendislik yöntemleri ile elde edilmektedir. Bu nedenle Samba programına dâhil edilmemiş bazı özellikler Windows istemcilerinin tutarsız çalışmasına neden olabilir. Size tavsiyem paylaşımlarınızı yapılandırdıktan sonra smbclient ile test edip her şey yolunda gittiğinde Windows istemciyi yeniden başlatın (restart) ve yapılandırmanın başarıyla gerçekleşip gerçekleşmediğini sınayın. Aksi takdirde Samba’yı Windows istemcileri ile konuştururken saçınızı başınızı yolabilirsiniz. Smbclient aracının kullanım örnekleri ilerleyen başlıklarda yer almaktadır.

Smbclient birçok seçeneğe sahip bir araçtır. Tüm seçenekler hakkında bilgi almak için man komutu ile yardım sayfalarına göz atabilirsiniz.

[email protected] ~ $ man smbclient

Smbclient ‘ın en çok kullanılan seçeneği olan –L (list) ile paylaşımları listelenecek bilgisayarın adresi argüman olarak verilmektedir. Aşağıdaki örnek ile IP adresi 192.168.0.101 olan bir bilgisayarın Samba paylaşımları listelenmektedir:

[email protected] ~ $ smbclient -L 192.168.0.101

Bir samba paylaşımına gö zatmak için aşağıdaki komutu çalıştırdığınızda, komut sizi smb moduna düşürür ve smb> komut istemcisi belirir. Burada ls, cd, del, mkdir, put ve get gibi temel dosya komutlarını kullanabilirsiniz. Kullanılacak tüm komutları görmek için man smbclient komutu ile smbclient’in yardım sayfasını açın ve operations başlığına göz atın.

Paylaşımına göz atılacak bilgisayarın IP adresinin önüne // işaretlerini eklemek gerekir. Aşağıdaki örnekteki ls komutu ile paylaşımdaki dosyalar listelenmekte, pwd komutu ile içinde bulunulan paylaşımın patikası görüntülenmekte ve exit komut ile smb modundan çıkılmaktadır.

[email protected] ~ $ smbclient //192.168.0.101/logs
smb: \> ls
  .                                 D        0  Sun Mar  6 02:35:04 2016
  ..                                D        0  Sun Mar  6 02:35:04 2016
  bootstrap.log                       N   292042  Fri Feb 26 03:02:10 2016
  kern.log                            N    64972  Sun Mar  6 02:51:19 2016
  alternatives.log                    N    18284  Sun Mar  6 01:41:56 2016
  debug                               N     3051  Sun Mar  6 02:51:18 2016
  auth.log                            N    34911  Sun Mar  6 22:40:59 2016 
  dmesg                               N       31  Fri Feb 26 03:00:11 2016
  dpkg.log                            N   297614  Sun Mar  6 02:36:44 2016
  lastlog                             N   292292  Sun Mar  6 22:01:52 2016
  faillog                             N    24024  Fri Feb 26 03:13:05 2016
  daemon.log                          N    51212  Sun Mar  6 03:06:44 2016
  syslog                              N   121859  Sun Mar  6 22:17:02 2016
                59413 blocks of size 131072. 49368 blocks available
smb: \> pwd
Current directory is \2.168.0.110\logs\
smb: \> exit

Sadece belli bir kullanıcının erişimine izin verdiğiniz bir paylaşımın içeriğini listelemek için ise aşağıdaki komutu kullanabilirsiniz. –U (user) seçeneği ile belirttiğiniz kullanıcının samba parolasını girmeniz istenecek ve smb komut satırı açılacaktır.

[email protected] ~ $ smbclient -U root –L 192.168.0.101/logs

Yukarıdaki kullanıma ek olarak parolayı da smbclient’a argüman olarak verebilirsiniz. Bunun için aşağıdaki gibi kullanıcı adı ve parola arasına % (yüzde) işaretini ekleyin:

[email protected] ~ $ smbclient –U root%parola -L 192.168.0.101/logs

Bu kitabı yazdığım sırada Pardus Topluluk ve Pardus Kurumsal dağıtımlarındaki bir lokalizasyon hatasından dolayı smbclient programına verdiğimiz kullanıcı adı olan pi argümanı NT_STATUS_LOGON_FAILURE hatasına neden oluyordu. Bu hatayı gidermek için smbclient’in önüne LC_LOCAL=C ortam değişkenini koymak gerekiyor. Bunu fark etmemi sağlayan,  LKD’nin Linux-Sunucu listesinden Sn. Doruk Fişek’e teşekkür ederim. Komut örneği şu şekildedir:

LC_LOCAL=C smbclient //192.168.0.101/logs –U root

HATIRLATMA

Kullanımda olan samba paylaşımlarını görme

Raspberry Pi’ı bir samba sunucusu haline getirip dizinleri paylaştırdıktan sonra kullanıcıların hangi dizin ve dosyalar üzerinde çalıştıklarını görmek isteyebilirsiniz. smbstatus komutu bu iş için kullanılır. smbstatus ile aynı zamanda Samba sunucunuzun paylaştırılan dizinlerini de görebilirsiniz. Komutun kullanımı şu şekildedir:

[email protected] ~ $ sudo smbstatus
Samba version 4.1.17-Debian
PID     Username      Group         Machine
-------------------------------------------------------------------
5706      pi            pi            10.1.1.1     (ipv4:10.1.1.1:45418)
4182      po            po            10.1.1.250   (ipv4:10.1.1.250:49244)
Service      pid     machine       Connected at
-------------------------------------------------------
logs         5706   10.1.1.1      Wed Apr 13 19:39:46 2016
pi           4182   10.1.1.250    Wed Apr 13 19:12:16 2016
IPC$         5706   10.1.1.1      Wed Apr 13 19:39:46 2016
www          4182   10.1.1.250    Wed Apr 13 19:12:08 2016
Locked files:
Pid          Uid        DenyMode   Access      R/W        Oplock           SharePath   Name   Time
-------------------------------------------------------------------------------------
4182         1000       DENY_NONE  0x100081    RDONLY     NONE             /home/pi   dev   Wed Apr 13 19:12:17 2016
4182         0          DENY_NONE  0x100081    RDONLY     NONE             /var/www/html   . Wed Apr 13 19:12:08 2016
4182         1000       DENY_NONE  0x100081    RDONLY     NONE             /home/pi   . Wed Apr 13 19:12:15 2016
4182         1000       DENY_NONE  0x100080    RDONLY     NONE             /home/pi   . Wed Apr 13 19:35:00 2016
4182         1000       DENY_NONE  0x100081    RDONLY     NONE             /home/pi   dev/sharedmem   Wed Apr 13 19:12:34 2016

Yukarıdaki listeden sırasıyla, hangi samba kullanıcılarının ağdaki hangi bilgisayardan hangi paylaşımlar üzerinde oturum açtığını görebilirsiniz. Listenin sonunda aktif olarak kullanımda olan dizinler ve en son kullanılma zamanları da listelenmektedir.

Raspberry Pi’a bağladığınız paylaşımlar varsa, paylaşım konumunu ve bağlanan dizini df komutu ile görüntüleyebilirsiniz. –h  (human readable) seçeneği boyutların GB (giga byte) cinsinden görüntülenmesini sağlar:

[email protected] ~ $ df -h
Filesystem                         Size  Used Avail Use% Mounted on
/dev/root                           15G  1.3G   13G  10% /
devtmpfs                           460M     0  460M   0% /dev
tmpfs                              464M     0  464M   0% /dev/shm
tmpfs                              464M  6.2M  458M   2% /run
tmpfs                              5.0M  4.0K  5.0M   1% /run/lock
tmpfs                              464M     0  464M   0% /sys/fs/cgroup
/dev/mmcblk0p1                      42M   22M   20M  53% /boot
tmpfs                               93M     0   93M   0% /run/user/1000
//192.168.0.155/disk/Backup/       3.6T  3.4T  261G  93% /home/pi/samba

Ağdaki tüm samba paylaşımlarını listelemek

smbtree adlı araç ile ağdaki tüm paylaşımları pratik bir şekilde listeletebilirsiniz:

[email protected] ~ $ smbtree
Enter pi's password:
WORKGROUP
                \\PIMEDIA                       pimedia server
                \\PIMEDIA\IPC$                  IPC Service (pimedia server)
                \\PIMEDIA\www                   www
                \\PIMEDIA\DEPO5                 Depo 5
                \\PIMEDIA\FILMLER               Filmler (readonly)
                \\PIMEDIA\Home                  Ev dizinim
                \\MAKET                 Maket Samba Server
                \\MAKET\www             Apache public directory
                \\MAKET\logs            System logs
                \\MAKET\pi              Pis home
                \\MAKET\IPC$            IPC Service (Maket Samba Server)

Bir samba paylaşımını bir Raspberry Pi dizinine bağlamak

Samba paylaşımlarını smbclient arabirimi aracılığı ile kullanmanın yanında sistemdeki bir dizine bağlayarak da kullanabilirsiniz. Bunun avantajı bağladığınız paylaşım yerel bir Linux dizini halini alır ve kopyalama/değiştirme/silme işlemlerini sıradan bir Linux dizininde yapıyormuş gibi gerçekleştirebilirsiniz. Bir samba paylaşımını yerel bir dizine bağlamadan önce ilgili dizini oluşturmak gerekir:

[email protected] ~ $ mkdir sambatest
[email protected] ~ $ sudo mount -t cifs -o username=pi,uid=pi //192.168.0.101/logs sambatest/
Password for pi@//192.168.0.101/www:  *********
[email protected] ~ $ cd sambatest
[email protected] sambatest $ ls
alternatives.log    dbconfig-common  messages        proftpd
alternatives.log.1  debug            messages.1      regen_ssh_keys.log
apache2             debug.1          messages.2.gz   samba

Yukarıdaki mount komutu ile 192.168.0.101 IP adresli samba sunucusu üzerindeki logs adlı paylaşım, yereldeki sambatest adlı dizine bağlanmış, ardından ls komutu ile paylaşımdaki dosyalar listelenmiştir. Bu dizin üzerinde yaptığınız değişikler aslında samba sunucusunun sağlamış olduğu paylaşım üzerinde gerçekleşir. –o yani options seçeneği ile belirttiğimiz username gibi password argümanını da kullanabilirsiniz. uid seçeneği ise paylaşım üzerine yazma yapılırken kullanılacak olan hesap kimliğidir (.bash_history dosyasına çalıştırılan komutun tamamı kaydedilir). Son durumda komut aşağıdaki gibi olabilir:

[email protected] ~ $ sudo mount -t cifs -o username=pi,password=parola,uid=pi //192.168.0.101/logs sambatest/

Bu dizinin bağlantısını kesmek istediğinizde is umount komutundan faydalanabilirsiniz:

[email protected] ~ $ cd ..
[email protected] ~ $ sudo umount smbtest

Bu başlıktaki örneklerde; ilgili samba paylaşımını Linux dizinine bağlarken dosya sistemi tipi olarak cifs belirttik. CIFS, yeni Windows sürümleri tarafından Samba protokolü yerine desteklenen protokolün adıdır. Linux’un CIFS desteğine sahip olmaması durumunda şu komut ile kolayca yükleyebilirsiniz: sudo apt install cifs-utils

CIFS Hakkkında

Samba paylaşımını açılışta otomatik bağlamak

Eğer yerel dosya sistemine uzak bir samba paylaşımını bağladıysanız sistemi yeniden başlattığınızda artık bağlı olmadığını görürsünüz. Sistemin her açılışında bu bağlantıların otomatik olarak yapmasını sağlamak için aşağıdaki iki yöntemden birini kullanabilirsiniz.

İlk akla gelen ve alışılagelmiş yöntem olan fstab (/etc/fstab) yani file system table yapılandırma dosyasını kullanmaktır. fstab dosyası açılışta otomatik olarak bağlanacak disk bölümlerinin tanımlandığı bir sistem dosyasıdır. Herhangi bir zamanda da bu dosyanın içerdiği tanımlar icra ettirilebilir. Bunun için sudo mount –all komutundan faydalanabilirsiniz. Uzak bir samba paylaşımını açılışta otomatik olarak bağlamak için fstab dosyasına aşağıdaki gibi bir satır ekleyin:

[email protected] ~ $ sudo nano /etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p6  /boot           vfat    defaults          0       2
/dev/mmcblk0p7  /               ext4    defaults,noatime  0       1
//192.168.0.101/depo6 /media/depo6 cifs username=pi,password=parola,sec=ntlm 0 0

Dosyanın sonundaki yapılandırma satırı ile; 192.168.0.101 ip adresli samba sunucusundaki depo6 adındaki paylaşıma, pi kullanıcı adı ve gizli parolası ile erişilerek /media/depo6 dizinine bağlanıyor.

Açılışta samba dizini bağlamanın bir diğer yolu da cronjob’ı kullanmaktır. Aşağıdaki gibi @reboot anahtar kelimesini içeren bir crontab satırı ile her açılışta ilgili samba paylaşımının yerel dizine bağlanmasını sağlayabilirsiniz (sudo komutu nedeniyle, bu crontab girdisi root kullanıcısının cronjob listesine eklenmiştir):

[email protected] ~ $ sudo crontab -e
@reboot (sleep 30 && sudo /bin/mount -t cifs -o username=pi,password=gizli,uid=pi //192.168.0.101/depo6 /media/depo6/)

Yukarıdaki crontab satırında yer alan && karakterleri ardışık komut çalıştırmak içindir. sleep 30 ile samba dizinin bağlanması 30 saniye geciktirilmiştir. Bunun amacı Raspberry Pi açılır açılmaz tüm servis ve çekirdek modüllerinin hazır olamaması ihtimali karşıdır. Raspberry Pi açıldığı ilk anda ağ işlevleri hemen etkinleşemezse (örneğin DHCP sunucusundan IP yapılandırması tahsis edilmesinin beklenmesi veya açılış sürecini geciktiren diğer servisler)  ağ paylaşımını bağlama da mümkün olmaz. Bunun için yukarıdaki örnekte bağlama işlemi açılışın ardından 30 sn. gecikmeli olarak yerine getirilir. && karakterleri ile istenilen sayıda komut sıralı olarak çalıştırılabilir. Bunun için crontab satırında her bir komut/görevin arasına && eklenmesi komutların sıralı olarak çalıştırılmasını sağlar.

Samba ile Hata Ayıklamak

Samba ile dizin paylaştırırken veya paylaşılmış dizinleri bağlarken zor zamanlar yaşayabilirsiniz. Samba tek başına, dizin ve yazıcı paylaştırmanın dışında birçok yeteneğe sahiptir ve bu yetenekler onun sürekli güncellenen ve adapte edilen bir yapıya sahip olmasına neden olmaktadır. Yeteneklerine bağlı olarak çok fazla özelliği olan bu servis kapalı kaynak kodlu bir yapı temel alınarak geliştirilmekte ve Microsoft’un Active Directory adıyla piyasaya sunduğu, oldukça karmaşık yönetimsel görevleri farklı işletim sistemleri üzerinde icra ettirmeyi sağlayan bir alt yapıya da destek vermektedir. Tüm bu geliştirme süreci ve özellikleri nedeniyle Samba yapılandırması bazen zorluklar içerebilmektedir.

Smbclient aracının hata ayıklama özelliğini kullanmak

Samba sahip olduğu günlük detay seviyesi ile güçlü bir hata tespit imkânı sunar. Bunun için smbclient aracının hata ayıklama (debug) kipini etkinleştirmek için -d seçeneği kullanılabilir. Varsayılan değeri 0 olan bu seçenek 1’den 10’a kadar artan detay seviyelerinde çeşitli hata ayıklama bilgilerini ekrana basar.

Aşağıdaki kullanımda;  192.168.1.242 bilgisayarı üzerinde paylaştırılmış olan deneme adlı paylaşıma pi kullanıcısı ve parolası ile bağlanılmaya çalışılır ve bu sırada bağlantı süreci hakkında kullanıcıyı bilgilendirici mesajlar da ekrana basılır. Bu bilgilerin detay seviyesini artırmak için daha büyük bir değerde -d argümanı kullanabilirsiniz.

[email protected]:~ $ smbclient -U pi%parola //192.168.1.242/deneme -d 2

Samba’nın yapılandırma ayarlarını gerçekleştirirken yapacağınız denemelerde smbclient aracını kullanmanızı tavsiye ederim. Özellikle -d seçeneğine vereceğiniz detay düzeyi ile ekrana olası sorunları çözümleyebileceğiniz canlı mesajlar basar. Diğer taraftan smbclient aracı Samba servisi ile kullandığı protokol ve yapılandırma özellikleri açısından en uyumlu araçtır.

Samba sunucusunu hata ayıklamak üzere yapılandırmak

Sunucu kaynaklı sorunların teşhis edilmesinde ise Samba’nın yapılandırma dosyası olan smb.conf’un log (günlük kaydı) seçenekleri faydalı olur. smb.conf aracılığı ile hata ayıklama etkinleştirildiğinde; Samba sunucusu belirtilen detay seviyesine göre birçok bilgiyi canlı olarak günlük dosyasına yazar. Günlük dosyasına kaydedilen bilgileri canlı olarak izlemek içi ise tail aracı çok kullanışlıdır. Samba’nın varsayılan günlük kaydı detay seviyesi olan 0’ı değiştirmek için smb.conf dosyasında aşağıdaki değişiklikleri yapabilirsiniz. Değişikliklerin özeti şu şekildedir:

  1. Varsayılan olarak log file = /var/log/samba/log.%m olan seçenek ile her Samba istemcisinin günlük kaydı ayrı bir dosyada (ağdaki bilgisayar adı ile) tutulur. Bunun yerine, tüm günlük kayıtlarını tek bir noktadan takip etmek için dosya yolunu şu şekilde değiştirin: log file = /var/log/samba/all.log
  2. Varsayılan log level (günlük detay seviyesi) 0’dır. Yani, sadece servisin başlaması ve çalışması sırasındaki kritik bilgiler raporlanır. Bunun yerine log level = 1 passdb:1 auth:1 yazarak hata ayıklamayı daha fazla bilgi verecek şekilde yapılandırabilirsiniz. Günlüğe yazılan bilgiler sorunu çözmek için yeterli değilse günlük detay seviyesi log level’ı artırarak samba (smbd ve nmbd) sunucusunu yeniden başlatın ve smb.conf’ta yapılan bu değişikliğin etkin olmasını sağlayın. Ardından tail ile izlemeye devam edin. log level seçeneğine geçirilen passdb ve auth alt seçenekleri ise parola veri tabanı ve sambanın kimlik doğrulama alt sınıfı için ayrı bir günlük detay seviyesi tanımlar. 1 numaralı seviye sorunların ne olduğu ile ilgili bilgi sunarken 3 ve üzeri seviyeler daha çok yazılım geliştiricilerini ilgilendirebilecek düzeyde detaylıdır [4].

Yukardıdaki bilgiler ışığında; smb.conf dosyasını nano editörü ile açın ve log file ile log level seçeneklerini düzenleyerek kaydedin. Daha sonra smbd ve nmbd sunucularını yeniden başlatın ve tail aracı ile günlük dosyasını izlemeye başlayın. Diğer taraftan da daha önce anlatılan smbclient aracı ile bu dizini görüntülemeye çalışın ve tail’in çıktısını izleyin. Bağlantının neden gerçekleşmediği ile ilgili detaylı açıklamalar bu çıktıya yansıtılacaktır.

[email protected]:~ $ sudo nano /etc/samba/smb.conf
[email protected]:~ $ sudo systemctl restart smbd
[email protected]:~ $ tail -f /var/log/samba/all.log

Varsayılan karakter setinden (tr_TR.UTF-8) kaynaklanan sorunlar

Eğer Raspberry Pi’ınızın varsayılan dil karakter kümesi Türkçe olarak ayarlanmış ise; Makine adı (hostname) veya kullanıcı adında yer alan özel karakterlerden kaynaklanan erişim sorunları yaşayabilirsiniz. Bu durumda smbclient aracı hata ayıklama kipinde iken NT_STATUS_ACCESS_DENIED, Samba sunucusu da NT_STATUS_NO_SUCH_USER hata kodunu üretebilir. Çok da anlamlı olmayan bu sorunu çözmek için varsayılan dil seçeneğini en_US.UTF-8 olarak ayarlayın veya bilgisayar adında ve kullanıcı adında i harfinin yer almamasını sağlayın. Varsayılan dil seçeneğini görmek için locale aracını, bu seçeneği değiştirmek için ise raspi-config aracını kullanabilirsiniz.

[email protected]:~ $ locale
LANG=tr_TR.UTF-8

Bilgisayar adından (hostname) kaynaklanan sorunlar

Raspberry Pi’ın bilgisayar adında i harfi geçmemesini ve 15 karakterden uzun olmamasını sağlayın. Ayrıca bilgisayar adında rakamlar ve – (tire), _ (alt tire) karakterlerinin haricinde (özellikle Türkçe karakterler) karakterler yer almaması da ağ işlevlerinin sorunsuz çalışması için önemlidir. Mevcut bilgisayar adını aşağıdaki komutlar ile görüntüleyebilirsiniz. Değiştirmek için raspi-config aracından faydalanabilirsiniz.

[email protected]:~ $ hostname
raspberry
[email protected]:~ $ hostnamectl
   Static hostname: raspberry
         Icon name: computer
        Machine ID: 0eaa6972f4134846b81631e78977d2ab
           Boot ID: dc4b2f3143dd4527b5ecee8650da4464
  Operating System: Raspberry Pi OS GNU/Linux 9 (stretch)
            Kernel: Linux 4.14.30-v7+
      Architecture: arm

Samba kullanıcılarının görüntülenmesi

smbpasswd aracı ile eklemiş olduğunuz samba kullanıcılarını görmek için pdbedit (password database edit) programından faydalanabilirsiniz:

[email protected] ~ $ sudo pdbedit -L -v
Unix username:        pi
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-3215754514-2638367816-4287260134-1000
Primary Group SID:    S-1-5-21-3215754514-2638367816-4287260134-513
Full Name:
Home Directory:       \\raspberrypi1\pi
HomeDir Drive:
Logon Script:
Profile Path:         \\raspberrypi1\pi\profile
Domain:               RASPBERRYPi
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          never
Kickoff time:         never
Password last set:    Prş, 29 Tem 2019 21:47:04 +03
Password can change:  Prş, 29 Tem 2019 21:47:04 +0
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Samba sunucu rolü ve güvenlik düzeyi

Samba’nın yapılandırma dosyası olan smb.conf’un en önemli yapılandırma seçeneği security’dir. Security seçeneğinin sahip olacağı değere göre Samba’nın sunucu rolü (server role) de belirlenir. Eğer geçerli bir kullanıcı adı ve parola ile bir erişimi yapılandırmak istiyorsanız; smb.conf dosyasında security = user tanımının yer almasını sağlayın. Eğer server role tanımlı değilse zaten otomatik olarak ROLE_STANDALONE olarak tanımlanacaktır. Bu durumu görmek için sunucuyu (smbd, nmbd) yeniden başlattıktan sonra testparm aracını kullanabilirsiniz:

[email protected]:~ $ sudo systemctl restart smbd
[email protected]:~ $ sudo systemctl restart nmbd
[email protected]:~ $ testparm -s

user=security olarak ayarlanıp, paylaşımlar üzerinde valid users ile kullanıcı izinleri tanımlandığında; bu duruma zıtlık oluşturan global kesimdeki seçeneklerden birisi de valid users = %S tanımıdır. Bu tanımda kullanılan %S seçeneği sistemde tanımlı kullanıcıların ev dizinlerine erişebilmeleri için kullanıcı adı yerine geçer. Eğer paylaşım tanımlarınızda valid users seçeneğini kullanıyorsanız, global kesimdeki valid users = %S tanımını kaldırın. Aşağıda bu duruma uygun örnek bir yapılandırma yer almaktadır:

# Global parameters
[global]
        log file = /var/log/samba/%m.log
        max log size = 1000
        panic action = /usr/share/samba/panic-action %d
        map to guest = Bad User
        obey pam restrictions = Yes
        pam password change = Yes
        passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
        passwd program = /usr/bin/passwd %u
        security = USER
        idmap config * : backend = tdb
[abc]
        comment = abc ev dizini
        path = /home/abc
        read only = No
        writable = Yes
        valid users = abc

Windows’ta samba oturumlarının açık kalması

Samba paylaşımını Windows bilgisayarı üzerinden kullandığınızda Windows’un oturum hatırlama özelliği size sorun yaşatabilir. Windows ile bir paylaşım üzerinde başarılı şekilde oturum açtıktan sonra; örneğin paylaşıma erişilecek kullanıcıyı (valid users) veya bu kullanıcının parolasını değiştirdiğinizde Windows bir süre daha eski oturuma ait kullanıcıyı ve parolasını kullanmaya devam etmek ister. Böyle olduğunda ise paylaşıma erişilemediğini söyleyen bir hata iletisi alırsınız. Windows’un hâlihazırda aktif tuttuğu samba oturumlarını görüntüleyip silebileceğiniz net adında bir komut satırı aracı vardır. Net aracına use seçeneğini geçtiğinizde açık samba oturumlarını listeler. * /delete argümanı ile de açık tüm oturumları temizleyebilirsiniz. Windows komut istemini açmak için başlat menüsüne tıklatarak cmd yazın ve Enter’a basın. Komutların kullanımı aşağıda yer almaktadır:

Microsoft Windows [Version 10.0.15063]
(c) 2017 Microsoft Corporation. Tüm hakları saklıdır.
C:\Users\Tankado> net use

Yeni bağlantılar anımsanmayacak.
Durum        Yerel     Uzak                      Ağ
-------------------------------------------------------------------------------
\2.168.1.242\screenshots                Microsoft Windows Network
Komut başarıyla tamamlandı.
C:\Users\Tankado> net use * /delete
Şu uzak bağlantılarınız var:
                    \2.168.1.242\screenshots
Devam edildiğinde bağlantılar iptal edilecek.
Bu işleme devam etmek istiyor musunuz? (E/H) [H]: e
Komut başarıyla tamamlandı.

Samba sunucusunu sistemden kaldırmak

Samba’yı kullanmayacaksanız sistemden kaldırmanızda fayda vardır. Böylece hem olası güvenlik açıklarını peşin olarak bertaraf etmiş olursunuz hem de CPU’nun güç ve enerji tüketimini azaltarak Raspberry Pi’ın daha performanslı çalışmasına katkıda bulunmuş olursunuz. Sambayı sistemden kaldırmak için şu komutları verin:

[email protected] ~ $ sudo apt remove samba
[email protected] ~ $ sudo apt remove samba-common-bin
[email protected] ~ $ sudo apt autoremove

Bu komutlar sadece samba’nın çalıştırılabilir (binary) dosyalarını sistemden kaldırır. Samba’nın yapılandırma (/etc/samba/smb.conf) ve log dosyaları sistemden kaldırılmaz. Onları da tamamen silmek isterseniz şu komutları kullanabilirsiniz:

[email protected] ~ $ sudo apt purge samba
[email protected] ~ $ sudo rm –rf /var/log/samba/

[1]https://tr.wikipedia.org/wiki/Samba_(yazılım), https://wiki.samba.org/index.php/Main_Page

[2] https://en.wikipedia.org/wiki/Active_Directory

[3] https://en.wikipedia.org/wiki/Domain_controller

[4] Log levels: https://www.samba.org/~ab/output/htmldocs/manpages-3/smb.conf.5.html#LOGLEVEL

Yazar: Özgür Koca

Yazar - Tankado.com

“Raspberry Pi’a Samba Sunucusu Kurmak ve Yapılandırmak” için bir yorum

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.