| 在一般的局域网络中 (LAN) 如果都是 Windows 计算机,那么使用『网络上的芳邻』这个功能,就可以让不同的 Windows 计算机分享彼此的档案啰!那么万一这个 LAN 里面有个 Linux 主机时,我怎么让 Linux 也加入这个 Windows 计算机当中的『网络上的芳邻』呢?!也就是说,让 Windows 计算机可以透过『网络上的芳邻』来存取 Linux 主机上面的档案!呵呵!那就是 SAMBA 这个服务器的主要目的了!SAMBA 是很有用的一个服务器,他可以让您的 Linux 剎那间成为一个档案服务器 ( File Server ),并提供整个 LAN 里面的 Windows 很简单的就可以对 Linux 主机进行档案的存取动作。不仅如此, SAMBA 也可以让 Linux 上面的打印机成为打印机服务器 (Printer Server) ,鸟哥个人觉得, SAMBA 对于整个 LAN 的贡献真的是很大!那么就赶紧来玩一玩吧! ^_^ |
注:或许您会发现在 Windows 网络设定里面常常看到
NetBEUI 这个咚咚,那是什么呢?事实上,那个是 NetBIOS Extened User Interface
的简写,也是 IBM 在 NetBIOS 发展出来之后的改良版本。虽然这两者的技术不太相同,不过,我们只要知道一些简单的概念就可以了!所以,在这里我们不针对
NetBEUI 来介绍。


| [root@test
root]# rpm -qa | grep samba
samba-common-2.2.7a-8.9.0 redhat-config-samba-1.0.4-1 samba-2.2.7a-8.9.0 samba-client-2.2.7a-8.9.0 注意一下,上面显示的例子是 Red Hat 9 的档案,其中那个 redhat-config-samba 是 Red Hat 额外提供的设定功能,可以不用安装他啦! |
| [root@test
root]# wget http://ftp.nsysu.edu.tw/Unix/Samba/samba-2.2.8a.tar.gz
注:上面的网址只是一个范例,请自行到中山大学下载! [root@test root]# cd /usr/local/src [root@test src]# tar -zxvf /root/samba-2.2.8a.tar.gz 这个时候会有一个目录跑出来: /usr/local/src/samba-2.2.8a [root@test src]# cd samba-2.2.8a #(在这个目录中察看一下 README 喔!) [root@test samba-2.2.8a]# cd source [root@test source]# ./configure --prefix=/usr/local/samba \ > --with-automount --with-smbmount --with-pam \ > --with-mmap --with-quotas --with-libsmbclient 还是要重复的给他强调一下: 1. 请先以 ./configure --help 察看一下 configure 的一些相关的参数用法 2. 如果发生任何错误,请不要往下进行 make 的动作,因为还是不对的! 3. 万一发生任何错误时,通常是由于一些函式库找不到的缘故,请参考此目录 下的 config.log 这个档案的内容,里面会记录一些错误的历程。 [root@test source]# make #(开始进行编译!) 这个过程会花一些时间,因为他会将原始码 (source code) 以您刚刚的设定 并以 gcc 这个 compiler 来进行编译喔!所以会花一些时间的啦! [root@test source]# make install 将刚刚编译完成的可执行 binary 档案安装到 /usr/local/samba 里面去! 在这个例子当中,未来您在设定 SAMBA 时,必需要到 /usr/local/samba 当中喔! |
| [root@test
root]# cp /etc/samba/smb.conf /etc/samba/smb.conf.bak.raw
[root@test root]# vi /etc/samba/smb.conf # 这个档案本身就是很详细的说明档,限于篇幅,我们没有将批注的部分写下来, # 这里的目的是想让大家了解 smb.conf 的内容规划咯! [global] workgroup = birdhouse server string = Linux Samba Server netbios name = birdlinux client code page = 950 printcap name = /etc/printcap load printers = yes printing = lprng log file = /var/log/samba/log.%m max log size = 500 # 那个 500 数字是 Kb 喔! security = user encrypt passwords = yes smb passwd file = /etc/samba/smbpasswd socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 # 上面的几行当中,注意 [global] ,由 [global] 到底下的 [Webpage] 之间的设定 # 都是 [global] 的设定项目!而 [global] 的主要内容都是与主机的设定有关! # 比较重要的有底下几个设定值: # workgroup 工作群组:同一个局域网络内,要具有相同的 workgroup # netbios name 主机名称:这个主机名称就是 netbios 的名字!请注意,如果你 # 没有设定 netbios name 的话,预设的 NetBIOS name 会以 # HOSTNAME 来替代! # server string 这个是主机的说明,随便写写没关系! # security 这个重要,是用来规定 SAMBA 主机的安全登入项目,有底下几种: # share :不进行安全登入,亦即没有设定账号与密码 # user :设定主机的密码文件作为登入的验证档案,这与底下的 # smb passwd file 有关喔! # domain :就是让您的 SAMBA 作为 PDC 啰! # log file 登录文件放置的目录所在喔! # 其它相关的几个设定项目请参考 man 5 smb.conf 我们底下也会列出几个常用的 # 设定项目说~ [Webpage] comment = My Home Page path = /var/www/html read only = no public = yes writable = yes create mode = 0664 directory mode = 0775 # 这个部分则是针对每个分享的目录或者是装置进行权限方面的规定了! # 几个简单的设定项目有: # comment :这个目录的说明! # path :这个项目真正的 Linux 档案系统里面的目录,请看底下的说明 # read only:是否只读? # public :是否让所有可以登入的使用者看到这个项目? # writable :是否可以写入?!这里需要注意一下喔!那个 read only 与 writable # 不是两个蛮相似的设定值吗?如果 writable 在这里设定为 no ,亦即 # 不可写入,那跟 read only 不就互相抵触了?!那个才是正确的设定? # 答案是:最后出现的那个设定值为主要的设定! # create mode 与 directory mode 都与权限有关的咯! |
| [homes]
valid users = %S .... |
| [root@test
root]# vi /etc/samba/lmhosts
127.0.0.1 localhost 192.168.0.100 birdhome 192.168.0.110 birdbrother1 192.168.0.120 birdbrother2 |
| [root@test
root]# cd /etc/samba
[root@test samba]# cp smb.conf smb.conf.bak # 玩服务器最重要的一个概念就是『有备无患』啊! # 所以,先将重要的数据给他备份下来! ^_^ [root@test samsa]# vi smb.conf # 底下的设定为最基础的设定值!最重要的地方在于 security = share 的地方! [global] workgroup = birdhouse netbios name = birdhome server string = Bird's testing SAMBA Server client code page = 950 # 这个 client code page 的设定有趣的很!因为 SAMBA 支持多语系的编码, # 我们习惯的编码为 cp590 亦即是 code page 950 这个编码,所以, # 想要让您的 SAMBA 可以正确的在 Windows 上面显示出中文,就得加入 # client code page = 950 喔! (如果没有设定,那么默认值是 850 呢!) # 如果 max log size = 0 的话,那表示登录档档案大小没有限制! log file = /var/log/samba/log.%m max log size = 0 security = share socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 interfaces = 192.168.0.100 dns proxy = no [tmp] comment = Temporary file space path = /tmp # 真正的开放出来的路径在这里! read only = no public = yes # 上面两个设定在告诉大家,不但可以存取(read only = no) # 也可以让大家查询(public = yes)! [root@test samba]# grep -v '^#' smb.conf |grep -v '^;'|grep -v '^$' # 这个动作在确认一下上面的设定是否相同,因为有时候可能会忘记将某个 # 设定给批注掉呢! ^_^ |
| [root@test
samba]# testparm
Load smb config files from /etc/samba/smb.conf Processing section "[tmp]" Loaded services file OK. Press enter to see a dump of your service definitions <==这里按下 Enter # Global parameters [global] client code page = 950 code page directory = /usr/share/samba/codepages workgroup = birdhouse netbios name = birdhome netbios aliases = netbios scope = server string = Bird's test SAMBA Server interfaces = 192.168.0.100 bind interfaces only = No security = SHARE encrypt passwords = No ..... [tmp] comment = Temporary file space path = /tmp read only = No guest ok = Yes # 你应该会看到如上的画面,这个 testparm 可以用来察看所有 SAMBA 的属性, # 这些属性很多都是默认值!如果没有 smb.conf 里面设定时,就是默认值, [root@test samba]# /etc/rc.d/init.d/smb restart Shutting down SMB services: [ OK ] Shutting down NMB services: [ OK ] Starting SMB services: [ OK ] Starting NMB services: [ OK ] # 请注意,上面 /etc/rc.d/init.d/smb 这个档名是 Red Hat 的设定值, # 很多其它的套件不见得是使用这个档名的!例如 OpenLinux 使用 samba 这个, # 所以请您务必使用 RPM 的相关指令来检验一下文件名称,或者使用 # <tab> 按键来让系统自动补齐文件名,就可以知道是什么档名啰! # 另外,如前所说的, SAMBA 会启用两个 daemons ,所以这里显示两个 OK! [root@test samba]# netstat -tlunp | grep ':13' tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 4307/smbd udp 0 0 192.168.0.100:137 0.0.0.0:* 4311/nmbd udp 0 0 0.0.0.0:137 0.0.0.0:* 4311/nmbd udp 0 0 192.168.0.100:138 0.0.0.0:* 4311/nmbd udp 0 0 0.0.0.0:138 0.0.0.0:* 4311/nmbd # 如果看到这样,呵呵!就应该没有问题啦! |
| [root@test
root]# smbclient -L //birdhome
added interface ip=192.168.0.100 bcast=192.168.0.255 nmask=255.255.255.0 Password: <==这里按 Enter Domain=[birdhouse] OS=[Unix] Server=[Samba 2.2.7a-security-rollup-fix]
Sharename Type
Comment
Server
Comment
Workgroup
Master
|
不过,需要特别留意的仅是 Linux 的档案权限与
SAMBA 设定的权限关系!这个问题我们会在安全性与问题克服里面进行详细的说明喔!
(注:这个问题最常发生在使用者身上,因为『即使
SAMBA 主机设定您可以无限制的使用某个目录下的档案,但是是否能够使用,仍然得视登入
SAMBA 的该使用者对于 Linux 的档案系统是否有存取的权限』喔!)
| [root@test
samsa]# vi smb.conf
[global] # 底下为一般设定项目(主机名称、工作群组等) workgroup = birdhouse netbios name = birdhome server string = Bird's testing SAMBA Server client code page = 950 # 与安全有关的登入信息项目,这个 security = user 一定要设定, # 而密码需加密,此外,密码档案放置在 /etc/samba/smbpasswd 里面, # 这个档案需要自行设定起来喔!等一下会介绍! security = user encrypt passwords = yes smb passwd file = /etc/samba/smbpasswd # 一些与安全性有关的设定,其中, hosts allow 较为有趣一点! # 当您设定了 hosts allow 之后,未在 hosts allow 里面规定的 IP # 将无法登入 Linux 的 SAMBA 主机喔!特别留意吶!如果您想要完全开放 IP, # 或者使用防火墙管理,那就不要设定 hosts allow 了! hosts allow = 192.168.0. 127. log file = /var/log/samba/%m.log max log size = 0 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 interfaces = 192.168.0.100 dns proxy = no # 底下则设定每个使用者的家目录! [homes] comment = Home Directories browseable = no writable = yes valid users = %S create mode = 0664 directory mode = 0775 # create mode 指的是新建立档案的权限,而 directory mode 则是新建目录的权限 # 至于 valid users 则是有权限进入者,这里设定为 %S 喔!所以, # 每个使用者就可以进入自己的家目录了! [public] comment = Public Stuff path = /home/public public = yes writable = yes [root@test samba]# grep -v '^#' smb.conf |grep -v '^;'|grep -v '^$' # 这个动作在确认一下上面的设定是否相同,因为有时候可能会忘记将某个 # 设定给批注掉呢! ^_^ [root@test samba]# mkdir -p /home/public # 上面既然有提到要开放 /home/public ,当然,这个目录就必须要存在啊! |
| 0. 根据 smb.conf
的设定,建立一个密码文件!
如果您是第一次建立 SAMBA 的使用者,才需要进行这个动作: 因为我们在 smb.conf 里面设定密码 smb passwd file = /etc/samba/smbpasswd [root@test root]# cd /etc/samba [root@test samba]# touch smbpasswd [root@test samba]# chown root:root smbpasswd; chmod 600 smbpasswd # 请注意, smbpasswd 这个档案记录了能够使用 SAMBA 服务器的使用者账号 # 与密码,所以当然只有 root 才能够进行读写了!特别留意其权限啊! 1. 开始建立密码: [root@test samba]# smbpasswd -a bird New SMB password: <==在这里输入 bird 的密码 Retype new SMB password: <==再输入一遍 bird 的密码 Added user test. # 请特别留意, SAMBA 的密码是放在 /etc/samba/smbpasswd 这个档案内,当然, # 您可以更改这个档名 (在 smb.conf 里面改),但是, Linux 系统的账号密码 # 是放在 /etc/shadow ,这也就是说, SAMBA 服务器的密码与 Linux 底下的 # 账号密码并不一定要相同的!至于 smbpasswd 的使用大致上有几个参数: 2. smbpasswd 之语法解释 语法:smbpasswd [-adem] username 参数: : 如果都没有加上任何一个参数,亦即『smbpasswd bird』时,这表示: 修改 SAMBA 密码文件(/etc/samba/smbpasswd)里面的 bird 这个账号的密码! 也就是说,密码文件里面已经存在一个 bird 的账号了! -a : 在 smbpasswd 密码文件里面新增一个使用者 -d : 让在 smbpasswd 密码文件里面的某个账号的使用者暂时无法使用 SAMBA 当多了 -d 的参数时,在 smbpasswd 里面某个字段会多出一个 D 的参数, 代表该账号目前无法使用喔! -e : 与 -d 参数相反,让某个账号恢复使用! -m : 该 username 为机器代码(Machine Account),这个与 domain model 有关! 范例: [root@test samba]# more smbpasswd bird:1001:01FC5A6BE7BC6929AAD3B435B51404EE:0CB6948805F797BF2A82807973B89537:[UX ]:LCT-3F1ECFE6: [root@vbird samba]# smbpasswd -d bird Disabled user bird. [root@vbird samba]# more smbpasswd bird:1001:01FC5A6BE7BC6929AAD3B435B51404EE:0CB6948805F797BF2A82807973B89537:[DUX ]:LCT-3F1ED105: # 特别留意,当使用 -d 之后,该账号会在密码档案里面的中括号之特殊字段中, # 多出一个 D 的参数,让该账号暂时无法使用喔! |
| [root@test
samba]# testparm
[root@test samba]# /etc/rc.d/init.d/smb restart [root@test samba]# smbclient -L //127.0.0.1 added interface ip=192.168.0.100 bcast=192.168.0.255 nmask=255.255.255.0 Password: <==直接按 Enter Anonymousloginsuccessful Domain=[BIRDHOUSE] OS=[Unix] Server=[Samba 2.2.7a-security-rollup-fix] Sharename Type Comment --------- ---- ------- public Disk Pulic Stuff IPC$ IPC IPC Service (Bird's testing SAMBA Server) ADMIN$ Disk IPC Service (Bird's testing SAMBA Server) ...(略)... # 注意看上面,因为我们没有在 smbclient 指定登入者,所以登入 # 后的身份会被指名为匿名者 anonymous 喔!由于我们有开放 public 给大家 # 浏览,所以还是看的到咚咚的!(注:我有省略一些输出!) [root@test samba]# smbclient -L //127.0.0.1 -U bird added interface ip=192.168.0.100 bcast=192.168.0.255 nmask=255.255.255.0 Password: <==这里请务必输入正确的 bird 的 SAMBA 密码! Domain=[BIRDHOUSE] OS=[Unix] Server=[Samba 2.2.7a-security-rollup-fix] Sharename Type Comment --------- ---- ------- public Disk Pulic Stuff IPC$ IPC IPC Service (Bird's testing SAMBA Server) ADMIN$ Disk IPC Service (Bird's testing SAMBA Server) bird Disk Home Directories ...(略)... # 仔细分辨一下上下两个不同点。在多加了 -U username (-U bird 那个地方) # 由于登入者的身份变成 bird 了,因此我们就可以看到 bird 的家目录了! # 也就是粗体字那一行啊!这样可以清楚的知道了?! |
| [root@test
samsa]# vi smb.conf
[global] #1.底下为一般设定项目(主机名称、工作群组等) workgroup = birdhouse netbios name = birdhome server string = Bird's testing SAMBA Server client code page = 950 #2.密码与登录文件相关的信息! security = user encrypt passwords = yes smb passwd file = /etc/samba/smbpasswd log file = /var/log/samba/%m.log max log size = 0 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 #3.其它与 domain 有关的参数 os level = 64 preferred master = yes domain master = yes local master = yes domain logons = yes logon script = startup.bat ; logon script = %U.bat logon path = \\%L\Profiles\%U wins support = yes dns proxy = no time server = yes # 在上面的设定当中,都是与 domain model 有关的参数 # os level 表示与其它主机相比,这部 SAMBA 机器的管理等级,设高一点 # domain logons 表示这部 SAMBA 主机可以提供 Widnows 登入的服务 (PDC) # logon script 表示当使用者登入之后,要到哪里去执行他的 profile 设定档, # 我这里将每个使用者登入时,都要去执行 startup.bat 这个档案, # 这个档案放置的地方其实就是底下 [netlogon] 的 path # 设定的目录,请特别留意 domain 与 netlogon 的关系! # 底下则设定每个使用者的家目录! [homes] comment = Home Directories browseable = no writable = yes valid users = %S create mode = 0664 directory mode = 0775 # 有特定账号者可以使用底下这个设定 [netlogon] comment = Network Logon Service path = /home/samba/netlogon writable = no write list = bird root follow symlinks = yes guest ok = yes # 没有特定账号者,例如 Windows 98 的使用者,会使用底下的路径! [Profiles] path = /home/samba/profiles read only = no create mask = 0600 directory mask = 0700 browseable = no [tmp] comment = Temporary file space path = /tmp read only = no public = yes [root@test samba]# grep -v '^#' smb.conf |grep -v '^;'|grep -v '^$' # 这个动作在确认一下上面的设定是否相同,因为有时候可能会忘记将某个 # 设定给批注掉呢! ^_^ [root@test samba]# testparm | more [root@test samba]# /etc/rc.d/init.d/smb restart |
| [root@test
root]# mkdir /home/samba
[root@test root]# mkdir /home/samba/netlogon [root@test root]# mkdir /home/samba/profiles [root@test root]# cd /home/samba/netlogon [root@test netlogon]# vi startup.tmp net time \\birdhome /set /yes net use U: \\birdhome\homes net use T: \\birdhome\tmp # net 是 Windows NT 网域的相关指令用法: # net time :表示目前 (client) 使用的时间要与 \\server (在这里是 birdhome) # 同步的意思!有时候因为 Server 与 Client 不同步,某些程序 # 会有问题! # net use [device:] [directory] # device: 那个 device 是 Windows 的磁盘槽啦! # directory 是 SAMBA 主机相对的目录! # 在我这个案例当中,每个使用者登入之后,他会在档案总管当中, # 发现有个 U 槽,而且内容是 \\birdhome\homes 相同; # 发现有个 T 槽,内容则是 /tmp 喔! # 特别留意, startup.bat 必须要是 DOS 的格式,所以在 Linux 上编辑时, # 还要加上一些特殊的转换动作! [root@test netlogon]# cat -A startup.tmp | tr '$' '\r' > startup.bat [root@test netlogon]# cat -A startup.bat net time \\birdhome /set /yes^M$ net use U: \\birdhome\homes^M$ net use T: \\birdhome\tmp^M$ # 看到了吗?!每一行的最后面要加上有 ^M 这个 Windows 的杰作才可以! # 除此之外,我们还要将原先在 bird2000 上的 bird 这个使用的个人设定值 # 给他复制过来 SAMBA 主机上面喔!在 Windows 2000 预设的情况下, bird # 这个人的设定值会是在: C:\Documents and Settings\bird # 请将这个 bird 目录完整的给他复制到 /home/profiles/bird 当中,也就是说, # 在 SAMBA 主机内的 /home/profiles/bird 里面就有原先 Windows 2000 内的 开始 Application Data Favorites My Documents .... # 等等的档案数据喔!然后这样做: [root@test netlogon]# cd /home/samba/profiles [root@test profiles]# chown bird -R bird/ # 这个时候您应该已经将原先 Windows 的 bird 这个人的设定值给他复制到 # /home/samba/profiles/bird 当中了才对! |
| [root@test
root]# groupadd smbmachine
# VBird 有时候会有点龟毛,既然我的 /etc/passwd 里面会有 SAMBA 用的机器码, # 那么我就将这几个机器代码归类在特定的 group 之内,那就自订一个名为 # smbmachine 的 Machine group 好了! ^_^ [root@test root]# useradd -g smbmachine -d /dev/null -s /bin/false bird2000$ [root@test root]# useradd -g smbmachine -d /dev/null -s /bin/false bird98$ [root@test root]# smbpasswd -a -m bird2000$ [root@test root]# smbpasswd -a -m bird98$ # 注意啊!多了一个 -m 的参数,这个参数代表后面接的为 Machine account , # 而不是一般设定的 User account 喔! [root@test root]# usradd bird [root@test root]# smbpasswd -a bird # 假设 bird 这个使用者还没有被建立,那么您应该这样建立他! [root@test root]# smbpasswd -a root # 记得要将 root 的身份设进去 smbpasswd 里面喔! # 不过,只要在 Windows 2000 的登入设定完成之后,就可以将 root 取消掉了! |