📝 Writing docs.

This commit is contained in:
Zhang Peng 2018-09-28 16:59:55 +08:00
parent bf3e20511a
commit 8598e62f2d

View File

@ -1,64 +1,202 @@
--- ---
title: samba 使用详解 title: samba 使用详解
date: 2018/03/01 date: 2018/09/28
categories: categories:
- linux - linux
tags: tags:
- linux - linux
- windows - windows
--- ---
<!-- TOC -->
- [samba](#samba)
- [安装](#%E5%AE%89%E8%A3%85)
- [配置](#%E9%85%8D%E7%BD%AE)
- [默认配置](#%E9%BB%98%E8%AE%A4%E9%85%8D%E7%BD%AE)
- [配置说明](#%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E)
- [全局参数 [global]](#%E5%85%A8%E5%B1%80%E5%8F%82%E6%95%B0-global)
- [共享参数 [共享名]](#%E5%85%B1%E4%BA%AB%E5%8F%82%E6%95%B0-%E5%85%B1%E4%BA%AB%E5%90%8D)
- [配置samba服务](#%E9%85%8D%E7%BD%AEsamba%E6%9C%8D%E5%8A%A1)
- [服务规划](#%E6%9C%8D%E5%8A%A1%E8%A7%84%E5%88%92)
- [创建文件夹和用户](#%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9%E5%92%8C%E7%94%A8%E6%88%B7)
- [启动 samba 服务](#%E5%90%AF%E5%8A%A8-samba-%E6%9C%8D%E5%8A%A1)
- [FAQ](#faq)
- [资料](#%E8%B5%84%E6%96%99)
<!-- /TOC -->
# samba 使用详解 # samba 使用详解
samba 使得在 Linux 和 Windows 系统中进行文件共享、打印机共享更容易实现。 > samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的一个免费软件。
>
> samba 提供了在不同计算机(即使操作系统不同)上共享服务的能力。
>
> 关键词:`samba`, `selinux`
## 安装 <!-- TOC depthFrom:2 depthTo:3 -->
**查看是否已安装:** - [1. 安装配置 samba](#1-安装配置-samba)
- [1.1. 查看是否已经安装 samba](#11-查看是否已经安装-samba)
- [1.2. 安装 samba 工具](#12-安装-samba-工具)
- [1.3. 配置 samba](#13-配置-samba)
- [1.4. 创建 samba 用户](#14-创建-samba-用户)
- [1.5. 启动 samba 服务](#15-启动-samba-服务)
- [1.6. 为 samba 添加防火墙规则](#16-为-samba-添加防火墙规则)
- [1.7. 测试 samba 服务](#17-测试-samba-服务)
- [1.8. 访问 samba 服务共享的目录](#18-访问-samba-服务共享的目录)
- [2. 配置说明](#2-配置说明)
- [2.1. samba 默认配置](#21-samba-默认配置)
- [2.2. 全局参数 [global]](#22-全局参数-global)
- [2.3. 共享参数 [共享名]](#23-共享参数-共享名)
- [3. 常见问题](#3-常见问题)
- [3.1. 你可能没有权限访问网络资源](#31-你可能没有权限访问网络资源)
- [4. 参考资料](#4-参考资料)
* CentOS`rpm -qa | grep samba` <!-- /TOC -->
* Ubuntu`dpkg -l | grep samba`
**安装:** ## 1. 安装配置 samba
* CentOS 6`yum install -y samba samba-client samba-common` 本文将以一个完整的示例来展示如何配置 samba 来实现 Linux 和 Windows 的文件共享。
* Ubuntu`sudo apt-get install -y samba samba-client` 目标:假设希望共享 Linux 服务器上的 /fs 目录。
## 配置 ### 1.1. 查看是否已经安装 samba
### 默认配置 - CentOS`rpm -qa | grep samba`
- Ubuntu`dpkg -l | grep samba`
### 1.2. 安装 samba 工具
- CentOS`yum install -y samba samba-client samba-common`
- Ubuntu`sudo apt-get install -y samba samba-client`
### 1.3. 配置 samba
samba 服务的配置文件是 `/etc/samba/smb.conf`,如果没有则 samba 无法启动。 samba 服务的配置文件是 `/etc/samba/smb.conf`,如果没有则 samba 无法启动。
执行以下命令,编辑配置文件:
```sh
vim /etc/samba/smb.conf
```
修改配置如下:
```ini
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
[homes]
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
inherit acls = Yes
[printers]
comment = All Printers
path = /var/tmp
printable = Yes
create mask = 0600
browseable = No
[print$]
comment = Printer Drivers
path = /var/lib/samba/drivers
write list = @printadmin root
force group = @printadmin
create mask = 0664
directory mask = 0775
[fs]
comment = share folder
path = /fs
browseable = yes
writable = yes
read only = no
guest ok = yes
create mask = 0777
directory mask = 0777
public = yes
valid users = root
```
> 说明:
>
> - 我在这里添加了一个 **[fs]** 标签,这就是共享区域的配置。
> - 这里设置 `path` 属性为 `/fs`,意味着准备共享 `/fs` 目录,需要根据实际需要设置路径。`/fs` 目录的权限要设置为 **777**`chmod 777 /fs`。
> - `browseable`、`writable` 等属性就比较容易理解了,即配置共享目录的访问权限。
> - `valid users` 属性指定允许访问的用户,需要注意的是指定的用户必须是 Linux 机器上实际存在的用户。
### 1.4. 创建 samba 用户
创建的 samba 用户必须是 Linux 机器上实际存在的用户。
```sh
$ sudo smbpasswd -a root
New SMB password:
Retype new SMB password:
Added user root.
```
根据提示输入 samba 用户的密码。当 samba 服务成功安装、启动后,通过 Windows 系统访问机器共享目录时,就要输入这里配置的用户名、密码。
### 1.5. 启动 samba 服务
CentOS 6
```sh
$ sudo service samba restart # 重启 samba
$ sudo service smb restart # 重启 samba
```
CentOS 7
```sh
$ sudo systemctl start smb.service # 启动 samba
$ sudo systemctl restart smb.service # 重启 samba
$ sudo systemctl enable smb.service # 设置开机自动启动
$ sudo systemctl status smb.service # 查询 samba 状态
```
Ubuntu 16.04.3
```
$ sudo service smbd restart
```
### 1.6. 为 samba 添加防火墙规则
```
$ sudo firewall-cmd --permanent --zone=public --add-service=samba
$ sudo firewall-cmd --reload
```
### 1.7. 测试 samba 服务
```
$ smbclient //localhost/fs -U root
```
输入 samba 用户的密码,如果成功,就会进入 `smb: \>`
### 1.8. 访问 samba 服务共享的目录
Windows
访问:`\\<你的ip>\<你的共享路径>`
![](http://oyz7npk35.bkt.clouddn.com/images/20180920180928161334.png)
Mac
与 Windows 类似,直接在 Finder 中访问 `smb://<你的ip>/<你的共享路径>` 即可。
## 2. 配置说明
### 2.1. samba 默认配置
你可以从 [这里](https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default;hb=HEAD) 获取到默认配置文件: 你可以从 [这里](https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default;hb=HEAD) 获取到默认配置文件:
``` ```
cp /etc/samba/smb.conf /etc/samba/smb.conf.bak $ cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
wget "https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default;hb=HEAD" -O /etc/samba/smb.conf $ wget "https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default;hb=HEAD" -O /etc/samba/smb.conf
``` ```
smb.conf 内容如下: smb.conf 默认内容如下:
``` ```ini
[global] [global]
workgroup = SAMBA workgroup = SAMBA
security = user security = user
@ -92,11 +230,9 @@ smb.conf 内容如下:
directory mask = 0775 directory mask = 0775
``` ```
### 配置说明 ### 2.2. 全局参数 [global]
#### 全局参数 [global] ```ini
```
[global] [global]
config file = /usr/local/samba/lib/smb.conf.%m config file = /usr/local/samba/lib/smb.conf.%m
@ -217,48 +353,48 @@ printing = cups
说明设置Samba共享打印机的类型。现在支持的打印系统有bsd, sysv, plp, lprng, aix, hpux, qnx 说明设置Samba共享打印机的类型。现在支持的打印系统有bsd, sysv, plp, lprng, aix, hpux, qnx
``` ```
#### 共享参数 [共享名] ### 2.3. 共享参数 [共享名]
``` ```ini
[共享名] [共享名]
comment = 任意字符串 comment = 任意字符串
说明comment是对该共享的描述可以是任意字符串。 说明comment是对该共享的描述可以是任意字符串。
path = 共享目录路径 path = 共享目录路径
说明path用来指定共享目录的路径。可以用%u、%m这样的宏来代替路径里的unix用户和客户机的Netbios名用宏表示主要用于[homes]共享域。例如如果我们不打算用home段做为客户的共享而是在/home/share/下为每个Linux用户以他的用户名建个目录作为他的共享目录这样path就可以写成path = /home/share/%u; 。用户在连接到这共享时具体的路径会被他的用户名代替要注意这个用户名路径一定要存在否则客户机在访问时会找不到网络路径。同样如果我们不是以用户来划分目录而是以客户机来划分目录为网络上每台可以访问samba的机器都各自建个以它的netbios名的路径作为不同机器的共享资源就可以这样写path = /home/share/%m 。 说明path用来指定共享目录的路径。可以用%u、%m这样的宏来代替路径里的unix用户和客户机的Netbios名用宏表示主要用于[homes]共享域。例如如果我们不打算用home段做为客户的共享而是在/home/share/下为每个Linux用户以他的用户名建个目录作为他的共享目录这样path就可以写成path = /home/share/%u; 。用户在连接到这共享时具体的路径会被他的用户名代替要注意这个用户名路径一定要存在否则客户机在访问时会找不到网络路径。同样如果我们不是以用户来划分目录而是以客户机来划分目录为网络上每台可以访问samba的机器都各自建个以它的netbios名的路径作为不同机器的共享资源就可以这样写path = /home/share/%m 。
browseable = yes/no browseable = yes/no
说明browseable用来指定该共享是否可以浏览。 说明browseable用来指定该共享是否可以浏览。
writable = yes/no writable = yes/no
说明writable用来指定该共享路径是否可写。 说明writable用来指定该共享路径是否可写。
available = yes/no available = yes/no
说明available用来指定该共享资源是否可用。 说明available用来指定该共享资源是否可用。
admin users = 该共享的管理者 admin users = 该共享的管理者
说明admin users用来指定该共享的管理员对该共享具有完全控制权限。在samba 3.0中如果用户验证方式设置成“security=share”时此项无效。 说明admin users用来指定该共享的管理员对该共享具有完全控制权限。在samba 3.0中如果用户验证方式设置成“security=share”时此项无效。
例如admin users =bobyuanjane多个用户中间用逗号隔开 例如admin users =bobyuanjane多个用户中间用逗号隔开
valid users = 允许访问该共享的用户 valid users = 允许访问该共享的用户
说明valid users用来指定允许访问该共享资源的用户。 说明valid users用来指定允许访问该共享资源的用户。
例如valid users = bobyuan@bob@tech多个用户或者组中间用逗号隔开如果要加入一个组就用“@+组名”表示。) 例如valid users = bobyuan@bob@tech多个用户或者组中间用逗号隔开如果要加入一个组就用“@+组名”表示。)
invalid users = 禁止访问该共享的用户 invalid users = 禁止访问该共享的用户
说明invalid users用来指定不允许访问该共享资源的用户。 说明invalid users用来指定不允许访问该共享资源的用户。
例如invalid users = root@bob多个用户或者组中间用逗号隔开。 例如invalid users = root@bob多个用户或者组中间用逗号隔开。
write list = 允许写入该共享的用户 write list = 允许写入该共享的用户
说明write list用来指定可以在该共享下写入文件的用户。 说明write list用来指定可以在该共享下写入文件的用户。
例如write list = bobyuan@bob 例如write list = bobyuan@bob
public = yes/no public = yes/no
说明public用来指定该共享是否允许guest账户访问。 说明public用来指定该共享是否允许guest账户访问。
guest ok = yes/no guest ok = yes/no
说明意义同“public”。 说明意义同“public”。
几个特殊共享: 几个特殊共享:
[homes] [homes]
comment = Home Directories comment = Home Directories
@ -266,7 +402,7 @@ browseable = no
writable = yes writable = yes
valid users = %S valid users = %S
; valid users = MYDOMAIN\%S ; valid users = MYDOMAIN\%S
[printers] [printers]
comment = All Printers comment = All Printers
path = /var/spool/samba path = /var/spool/samba
@ -274,183 +410,54 @@ browseable = no
guest ok = no guest ok = no
writable = no writable = no
printable = yes printable = yes
[netlogon] [netlogon]
comment = Network Logon Service comment = Network Logon Service
path = /var/lib/samba/netlogon path = /var/lib/samba/netlogon
guest ok = yes guest ok = yes
writable = no writable = no
share modes = no share modes = no
[Profiles] [Profiles]
path = /var/lib/samba/profiles path = /var/lib/samba/profiles
browseable = no browseable = no
guest ok = yes guest ok = yes
``` ```
### 配置samba服务 ## 3. 常见问题
#### 服务规划 ### 3.1. 你可能没有权限访问网络资源
系统分区时,单独划分一个/storage的分区分区下有logger和shared两个文件夹; 问题现象:
logger文件夹/storage/logger下对应的管理员账号为logadmin用户账号为loguser;
shared文件夹/storage/shared下对应的管理员账号为admin用户账户号为shared;
#### 创建文件夹和用户 - 出现 **NT_STATUS_ACCESS_DENIED** 错误
- Windows 下成功登陆 samba 后,点击共享目录仍然提示——你可能没有权限访问网络资源。
创建文件夹 解决步骤:
``` 1. 检查是否配置了防火墙规则
# 创建文件夹
[root@Linuxidc-Server storage]# cd /storage ```sh
[root@Linuxidc-Server storage]# mkdir logger shared # 一种方法是强行关闭防火墙
[root@Linuxidc-Server storage]# ls $ sudo service iptables stop
total 0
drwxr-xr-x. 2 root root 6 Aug 3 10:12 logger # 另一种方法是配置防火墙规则
drwxr-xr-x. 2 root root 6 Aug 3 10:12 shared $ sudo firewall-cmd --permanent --zone=public --add-service=samba
$ sudo firewall-cmd --reload
``` ```
创建用户 2. 关闭 selinux
``` ```sh
# 创建用户 # 将 /etc/selinux/config 文件中的 SELINUX 设为 disabled
[root@Linuxidc-Server storage]# useradd -s /sbin/nologin logadmin $ sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@Linuxidc-Server storage]# useradd -s /sbin/nologin admin
[root@Linuxidc-Server storage]# useradd -g admin -s /sbin/nologin shared # 重启生效
[root@Linuxidc-Server storage]# cat /etc/passwd $ reboot
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:997:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
logadmin:x:1000:1000::/home/logadmin:/sbin/nologin
loguser:x:1001:1000::/home/loguser:/sbin/nologin
admin:x:1002:1002::/home/admin:/sbin/nologin
shared:x:1003:1002::/home/shared:/sbin/nologin
``` ```
建立samba用户 ## 4. 参考资料
``` - http://blog.51cto.com/yuanbin/115761
[root@Linuxidc-Server storage]# smbpasswd -a logadmin - https://www.jianshu.com/p/750be209a6f0
New SMB password: - https://github.com/judasn/Linux-Tutorial/blob/master/markdown-file/Samba.md
Retype new SMB password:
Added user logadmin.
[root@Linuxidc-Server storage]# smbpasswd -a loguser
New SMB password:
Retype new SMB password:
Added user loguser.
[root@Linuxidc-Server storage]# smbpasswd -a admin
New SMB password:
Retype new SMB password:
Added user admin.
[root@Linuxidc-Server storage]# smbpasswd -a shared
New SMB password:
Retype new SMB password:
Added user shared.
```
更改目录属性
```
[root@Linuxidc-Server storage]# chown logadmin.logadmin logger
[root@Linuxidc-Server storage]# chown admin.admin shared
[root@Linuxidc-Server storage]# chmod -R 777 logger
[root@Linuxidc-Server storage]# chmod -R 777 shared
```
#### 启动 samba 服务
1. 配置
以下就是一个可用的 `/etc/samba/smb.conf` 配置
```
#============================ Global Definitions ==============================
[global]
workgroup = MYGROUP
server string = Samba Server
security = share
passdb backend = tdbsam
load printers = yes
cups options = raw
#============================ Share Definitions ==============================
[homes]
comment = Home Directories
browseable = no
writable = yes
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes
[public]
comment = public stuffs
path = /home/public
writable = yes
printable = no
browseable = yes
read only = no
public = yes
guest ok = yes
```
2. 启动服务
* CentOS 6、Ubuntu 启动方式
执行以下命令:
```
sudo service samba restart # 启动 samba
```
* CentOS 7 启动方式
```
systemctl start smb.service # 启动 samba
systemctl enable smb.service # 激活
systemctl status smb.service # 查询 samba 状态(启动 samba 前后可以用查询验证)
```
* 脚本命令启动方式
```
/etc/init.d/smb restart
```
## FAQ
如果在 windows 访问 samba 路径,执行写操作时,出现 `目标文件夹访问被拒绝` 错误。
解决方法:为共享的目录分配写权限
例:将 samba 共享路径 `/home/public` 设为可读可写可执行
```
chmod -r 777 /home/public
```
## 资料
http://blog.51cto.com/yuanbin/115761