ติดตั้ง samba แบบง่าย

เอามาจาก ThaiLinuxCafe - debian : ติดตั้ง samba อย่างง่าย

samba เป็นแพกเกจที่ใช้ทำไฟล์เซิร์ฟเวอร์ที่มีชื่อเสียงของลินุกซ์ สามารถใช้งานทดแทน Netware หรือ WindowsNT ได้ดีพอควร

โครงร่างคือ

ชื่อเซิร์ฟเวอร์
server1 : 192.168.1.5
แชร์ที่อ่านได้อย่างเดียว
//server1/app จะให้อยู่ที่ /samba/app (เพื่อเร่งความเร็วและป้องกันไวรัส)
แชร์ที่อ่าน/เขียนได้
//server1/data จะให้อยู่ที่ /samba/data
ชื่อ Workgroup
smbdomain
กรุ๊ปที่มีสิทธิ์ใช้งาน
smbgroup ให้มี gid=1001
ผู้ใช้ที่มีสิทธิ์ใช้งาน
user1, user2, user3, ... ให้มี uid=1101, 1102, 1103, ...
ผู้ควบคุมระบบ
smb-admin ให้มี uid=1100
เครื่องลูกข่าย
client01, client02, ... ให้มีไอพีเป็น 192.168.1.101, 192.168.1.102, ...

เริ่มด้วย

ที่เซิร์ฟเวอร์

ติดตั้ง samba

# aptitude install samba
Workgroup/Domain Name:
<<<--- smbdomain

Modify smb.conf to use WINS settings from DHCP?
<<<--- No

เพิ่มกรุ๊ปในการใช้งาน samba

# groupadd -g 1001 smbgroup

สร้างสคริปต์ในการเพิ่มผู้ใช้ ให้มีรหัสผ่านเดียวกัน (passwd กับ smbpasswd) ตั้งชื่อว่า d.addsmb

# vi /usr/local/bin/d.smbadd
#!/bin/bash
if [ ! $3 ]; then
  echo "Usage: $0 USERNAME UID PASSWORD"
  exit 1;
fi
GROUPNAME="smbgroup"
USERNAME=$1
USERID=$2
PASSWORD=$3
/usr/sbin/useradd -g $GROUPNAME -u $USERID -m $USERNAME
echo "$USERNAME:$PASS1" | /usr/sbin/chpasswd
(echo "$PASS1"; echo "$PASS1") | smbpasswd -a -s $USERNAME
echo "User: $USERNAME , uid: $USERID added."

เวลาเพิ่มผู้ใช้ก็สั่ง

# d.smbadd user1 1101 USER1-PASSWORD
...

ทำไปจนครบผู้ใช้

เพิ่มผู้ใช้ของ samba ที่เป็นผู้คุมระบบ ให้ชื่อว่า smb-admin

# d.smbadd smb-admin 1100 SMB-ADMIN-PASSWORD

สร้างไดเรกทอรีสำหรับแชร์ไฟล์ ตั้งชื่อว่า /samba

# mkdir -p /samba/app
# mkdir -p /samba/data

เปลี่ยนสิทธิ์การใช้งานไดเรกทอรี samba

# chown -R smb-admin:smbgroup /samba
# chmod 0750 /samba/app
# chmod 0770 /samba/data

ตั้งค่าการใช้งานให้ samba

# vi /etc/samba/smb.conf

เฉพาะค่าที่เราจะเปลี่ยนแปลง

[global]
    workgroup = smbdomain
    security = user
    unix charset = utf8
    display charset = utf8
    lock spin time = 15       ;; for dbase/foxpro record lock
    lock spin count = 30      ;; for dbase/foxpro record lock
    unix extensions = yes

[app]
    comment = Application Dir
    path = /samba/app
    valid users = @smbgroup
    admin users = smb-admin
    public = no
    create mask = 0750
    directory mask = 0750
    fake oplocks = yes        ;; increase speed
    writable = no

[data]
    comment = Data Dir
    path = /samba/data
    valid users = @smbgroup
    public = no
    create mask = 0770
    directory mask = 0770
    writable = yes

แก้ไขไฟล์ hosts ให้เครื่องลูกข่ายติดต่อได้

# vi /etc/hosts
192.168.1.1      server1.example.com     server1
192.168.1.101    client01.example.com    client01
192.168.1.102    client02.example.com    client02
192.168.1.103    client03.example.com    client03
...

เริ่มการทำงาน samba ใหม่

# /etc/init.d/samba restart

----------

ส่วนของเครื่องลูกข่าย

เรียกใช้งานจากลินุกซ์

ติดตั้ง smbclient

# aptitude install smbclient smbfs

สร้างจุดเมานท์

# mkdir -p /mnt/app
# mkdir -p /mnt/data

แก้ไขข้อมูล hosts ให้เหมือนกับที่เครื่อง server1

# vi /etc/hosts
192.168.1.1      server1.example.com     server1
192.168.1.101    client01.example.com    client01
192.168.1.102    client02.example.com    client02
192.168.1.103    client03.example.com    client03
...

ทำการเมานท์

  • การเมานท์แบบ cifs จะทำให้การแสดงชื่อไฟล์เป็นภาษาไทยได้อย่างถูกต้อง ล็อคเรคอร์ดได้ แต่ช้ามาก และข้อมูลถูกอ่านจากแคช ทำให้ไม่ค่อยเป็นข้อมูลปัจจุบันจริง ๆ
    $ sudo mount -t cifs \
      -o username=user1,password=PASSWORD,iocharset=utf8 \
      //server1/app /mnt/app
    $ sudo mount -t cifs \
      -o username=user1,password=PASSWORD,iocharset=utf8 \
      //server1/data /mnt/data
    
  • หรือเมานท์แบบ smbfs จะทำให้การทำงานเร็ว แต่ล็อคเรคอร์ดไม่ได้ และข้อมูลถูกอ่านจากการทำงานปัจจุบันจริง ๆ ทำให้ข้อมูลสดกว่า
    $ sudo mkdir -p /mnt/smbfs/app
    $ sudo mkdir -p /mnt/smbfs/data
    $ sudo mount -t smbfs \
      -o username=user1,password=PASSWORD,uid=1101,gid=1001 \
      //server1/app /mnt/smbfs/app
    $ sudo mount -t smbfs \
      -o username=user1,password=PASSWORD,uid=1101,gid=1001 \
      //server1/data /mnt/smbfs/data
    

เราสามารถใช้งานไฟล์เซิร์ฟเวอร์ server1 ได้จากจุดเมานท์ /mnt/app และ /mnt/data ตามต้องการ (ถ้าจะเขียนลง /mnt/app ให้ใช้ชื่อเป็น smb-admin จึงจะสามารถเขียนได้)

*****
update 50-10-20
ตอนที่ทดลองนี้ cifs บนเดเบียน sid (samba-3.0.26a-1) แก้ปัญหาเรื่องแคชไม่ตรง และล๊อกเรคคอร์ดช้าได้แล้ว
โดยการแก้ไขไฟล์ smb.ini ในหมวด share ให้มีพารามิเตอร์คือ

[data]
    ...
    strict locking = yes
    oplocks = yes
    level2 oplocks = no
    ...

และเมานต์ด้วยพารามิเตอร์ directio เช่น

$ sudo mount -t cifs //server1/data /mnt/data \
  -o username=USER,password=PASSWORD,iocharset=utf8,directio

จะสามารถล๊อกเรคคอร์ดได้ตรงและแก้ปัญหาแคชไฟล์ได้แล้วครับ
*****
----------

เรียกใช้งานจาก Windows98/Me

ที่เครื่อง client01 ติดตั้งโดย

Start -> Control Panel -> Network
[TAB] Configuration :
    TCP/IP -> การ์ดไดรเวอร์ : Properties
        [TAB] DNS Configuration :
            Enable DNS
            DNS Server Search Order : 192.168.1.5
            Domain Suffix Search Order : server1.example.com
        [TAB] IP Address
            Specify an IP address : 192.168.1.101
            Subnet Mask : 255.255.255.0
[TAB]Identification : Workgroup = smbdomain

เรียกใช้งานโดย

คลิกขวา Network Neighbourhood
Map Network Drive
    Drive : I:
    Path  : \\server1\app

Comments

สร้างสคริปต์ในการเพิ่มผู้ใช้ ให้มีรหัสผ่านเดียวกัน (passwd กับ smbpasswd) ตั้งชื่อว่า d.addsmb

# vi /usr/local/bin/d.addsmb
แต่เวลาเพิ่มผู้ใช้ก็สั่ง

# d.smbadd user1 1101 USER1-PASSWORD

ไม่ได้ครับ

ขออภัยครับ สะเพร่ามากไปหน่อย ชื่อไฟล์ต้องเป็น d.smbadd ครับ
ที่ถูกคือ

# vi /usr/local/bin/d.smbadd

ครับ
ขอบคุณมากครับที่ท้วงมา เดี๋ยวผมกลับไปแก้บทความให้ถูกต้องเลย

อยากได้วิธี config samba แบบ 1 share แต่ user มี 3 group
group 1 read/write
group 2,3 read only
ครับ

ขออภัยนะครับ ค้นวิธีที่ถูกต้องให้ไม่ทันแล้ว (จะไป ตปท.หลายวันครับ)
ที่ผมเคยลักไก่ใช้คือ

...
[data]
    ...
    writable = no
    admin users = @group1 
    valid users = @group2,@group3
    ...

น่าจะพอใช้งานไปได้ครับ
แต่เขาว่าพารามิเตอร์ admin users มันอันตรายไปหน่อย น่าจะเป็นแบบนี้มากกว่า

...
[data]
    ...
    valid users = @group1,@group2,@group3
    write list = @group1
    ...

เดี๋ยวรอผู้รู้ท่านอื่นมาตอบอีกทีนะครับ

Permission ควรกำหนดแบบไหนครับ
มาติดที่การกำหนด Permission ครับ
ยังไงก็เข้าไม่ได้

ถ้าป็นขั้นตอนก็จะดีครับ
**ลองกับCentOs ผ่านแล้วครับแต่ debian ยังไม่ผ่านครับ

สวัสดีครับ

พอดีผมทำตามขั้นตอนทุกอย่างแล้วน่ะครับ แต่ผมเข้าที่ \\192.168.1.20 ผมจะเห็น folder app , data แต่พอดับเบิ้ลคลิกเข้าไปอันไดอันหนึ่งมันดันถามหา userกับ pass อีกอ่ะครับ แต่ใส่ไปก็เข้าไม่ได้ คือผมใช้ clients เป็น windows 7 อ่ะครับ พี ๆ ท่านไหนใช้กับ windows 7 ได้ บ้างตรับ

ผมได้ข้ามขั้นตอนข้างล่างนี้ไปน่ะครับ เพราะ windows7 หาไม่เจอ
====================
[TAB] Configuration :
TCP/IP -> การ์ดไดรเวอร์ : Properties
[TAB] DNS Configuration :
Enable DNS
DNS Server Search Order : 192.168.1.5
Domain Suffix Search Order : server1.example.com
[TAB] IP Address
Specify an IP address : 192.168.1.101
Subnet Mask : 255.255.255.0
[TAB]Identification : Workgroup = smbdomain
====================================================

ขอบคุณครับ

ลองตั้งค่าใน Windows 7 ให้ WINS เป็นไอพีของเซิร์ฟเวอร์ดูนะครับ

Start -> Computer ->
คลิกขวา Network -> Properties ->
Local Area Connection -> Properties ->
เลือก Internet Protocol Version 4 (TCP/IPv4) -> Properties ->
Advances -> [TAB] WINS -> Add

samba รุ่นตั้งแต่ 3.5 เป็นต้นมา ไม่อนุญาตให้ใช้ symlinks ในการโยงไดเรคทอรี่ไปที่อื่น
สามารถแก้ไขได้ 2 วิธี คือ

  • แก้ smb.conf ดังนี้
    ...
    [global]
        unix extensions = no
    
    ...
    [share2]
        ...
        wide links = yes
        follow symlinks = yes    #default
    ...

    วิธีนี้มีข้อเสียคือ permission ของผู้ใช้และกลุ่ม จะเพี้ยน อาจมีปัญหาในการเขียนไฟล์

  • ใช้การ mount แบบ bind แทนการใช้ symbolic links
    เช่นเดิมเคยโยงว่า
    # ln -sf /samba/share1/dir1 /samba/share2/dir1

    ให้เปลี่ยนเป็น

    # mkdir /samba/share2/dir1
    # mount -o bind /samba/share1/dir1 /samba/share2/dir1

    เป็นต้น

    เราสามารถทำให้เป็นอัตโนมัติได้ด้วยการนำไปใส่ไว้ใน smb.conf ดังนี้

    ...
    [share2]
        ...
        root preexec = sh -c "mount -o bind /samba/share1/dir1 /samba/share2/dir1"
    ...
    

จบแล้ว

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้