家庭服务器搭建完全指南第4篇:文件服务器搭建
Home Server Complete Guide Part 4: File Server Setup
前言:为什么选择文件服务器?
搭建家庭服务器最大的原因之一就是文件服务器。云服务虽然方便,但需要每月支付订阅费,而且存储容量有限。更重要的是,把重要数据存放在别人的服务器上可能会让人不安。
搭建自己的文件服务器可以摆脱这些担忧。一次性购买硬盘后,可以无限期使用,不需要额外费用,而且数据只存在于自己家中。让我们来建立一个可以安全保存家庭照片、视频、文档,并从任何地方访问的私有云吧。
本篇将以文件服务器的核心技术Samba和NFS为中心,讲解如何从各种设备访问文件,以及可靠的磁盘管理方法。
1. 文件共享协议对比
1.1 主要协议概述
通过网络共享文件的方法有多种。理解各自的特点并根据情况选择很重要。
| 协议 | 主要用途 | 优点 | 缺点 |
|---|---|---|---|
| Samba (SMB/CIFS) | 与Windows兼容 | 支持所有OS,设置简单 | 相对较慢 |
| NFS | Linux/Unix环境 | 速度快,开销低 | Windows支持有限 |
| SFTP | 安全文件传输 | 加密,防火墙友好 | 实时访问不便 |
| WebDAV | 基于Web的访问 | 随时随地可访问 | 性能受限 |
1.2 该选择哪个?
对于一般家庭环境,建议如下:
- 如果主要使用Windows PC:Samba是最佳选择。可以在资源管理器中直接作为网络驱动器连接。
- 如果只使用Linux或Mac:NFS更快更高效。
- 如果是混合环境:可以同时设置Samba和NFS。同一个文件夹可以通过两种协议共享。
- 如果需要外部访问:通过VPN访问内部网络,或使用SFTP更安全。
2. 搭建Samba文件服务器
2.1 安装Samba
Samba是在Linux上实现Windows文件共享协议(SMB)的软件。可以从Windows资源管理器直接访问,是最通用的方案。
# 安装Samba
sudo apt update
sudo apt install samba samba-common-bin
# 检查服务状态
sudo systemctl status smbd
# 检查版本
smbd --version
2.2 创建共享目录
创建要共享的目录并设置适当的权限。
# 创建共享目录
sudo mkdir -p /srv/samba/public
sudo mkdir -p /srv/samba/private
# 公开文件夹权限设置(所有用户可访问)
sudo chmod 777 /srv/samba/public
# 私有文件夹权限设置
sudo chmod 770 /srv/samba/private
sudo chown -R root:sambashare /srv/samba/private
2.3 创建Samba用户
Samba独立于系统账户管理自己的用户数据库。只有系统账户存在的用户才能注册为Samba账户。
# 如果没有系统用户,先创建
sudo useradd -M -s /usr/sbin/nologin sambauser
# 注册Samba用户并设置密码
sudo smbpasswd -a sambauser
# 启用用户
sudo smbpasswd -e sambauser
# 将用户添加到sambashare组
sudo usermod -aG sambashare sambauser
2.4 Samba配置
编辑Samba配置文件定义共享文件夹。
# 备份原有配置
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup
# 编辑配置文件
sudo nano /etc/samba/smb.conf
在配置文件末尾添加以下内容:
# 公开共享文件夹(允许访客访问)
[Public]
comment = Public Shared Folder
path = /srv/samba/public
browseable = yes
read only = no
guest ok = yes
create mask = 0666
directory mask = 0777
# 私有共享文件夹(需要认证)
[Private]
comment = Private Shared Folder
path = /srv/samba/private
browseable = yes
read only = no
guest ok = no
valid users = @sambashare
create mask = 0660
directory mask = 0770
# 用户主目录
[homes]
comment = Home Directories
browseable = no
read only = no
create mask = 0700
directory mask = 0700
valid users = %S
检查配置并重启服务:
# 检查配置语法
testparm
# 重启Samba服务
sudo systemctl restart smbd nmbd
# 设置开机自启
sudo systemctl enable smbd nmbd
2.5 防火墙设置
# 允许Samba端口
sudo ufw allow samba
# 或单独允许端口
sudo ufw allow 139/tcp
sudo ufw allow 445/tcp
sudo ufw allow 137/udp
sudo ufw allow 138/udp
3. 从客户端连接Samba
3.1 从Windows连接
方法1:在文件资源管理器中直接访问
- 打开文件资源管理器,在地址栏输入
\\192.168.1.100(服务器IP) - 显示共享文件夹列表
- 访问Private文件夹时输入用户名和密码
方法2:映射网络驱动器
- 在文件资源管理器中右键点击"此电脑"
- 选择"映射网络驱动器"
- 选择驱动器盘符(例如:Z:)
- 在文件夹中输入
\\192.168.1.100\Private - 勾选"使用其他凭据连接"
- 勾选"登录时重新连接"可自动挂载
3.2 从macOS连接
- 在Finder菜单中选择"前往" > "连接服务器"(Cmd+K)
- 在服务器地址中输入
smb://192.168.1.100 - 选择要连接的卷
- 输入用户名和密码
设置自动挂载:
- 系统偏好设置 > 用户与群组
- 选择当前用户 > 登录项
- 将已连接的网络驱动器添加到列表中
3.3 从Linux连接
临时挂载:
# 安装CIFS工具
sudo apt install cifs-utils
# 创建挂载点
sudo mkdir -p /mnt/samba
# 挂载(指定用户)
sudo mount -t cifs //192.168.1.100/Private /mnt/samba -o username=sambauser,password=yourpassword
# 或交互输入密码
sudo mount -t cifs //192.168.1.100/Private /mnt/samba -o username=sambauser
自动挂载(fstab):
# 创建凭据文件(为了安全)
sudo nano /etc/samba/credentials
# 内容
username=sambauser
password=yourpassword
# 设置权限
sudo chmod 600 /etc/samba/credentials
# 编辑fstab
sudo nano /etc/fstab
# 添加以下行
//192.168.1.100/Private /mnt/samba cifs credentials=/etc/samba/credentials,iocharset=utf8,uid=1000,gid=1000 0 0
# 测试挂载
sudo mount -a
4. 搭建NFS文件服务器
4.1 什么是NFS?
NFS(网络文件系统)是Unix/Linux环境中标准的网络文件系统。比Samba开销更低,是Linux间文件共享的最佳选择。
4.2 NFS服务器安装和配置
# 安装NFS服务器
sudo apt update
sudo apt install nfs-kernel-server
# 创建共享目录
sudo mkdir -p /srv/nfs/shared
sudo chown nobody:nogroup /srv/nfs/shared
sudo chmod 755 /srv/nfs/shared
配置NFS导出:
# 编辑exports文件
sudo nano /etc/exports
添加以下内容:
# 格式:共享路径 允许的IP(选项)
# 只允许特定IP段
/srv/nfs/shared 192.168.1.0/24(rw,sync,no_subtree_check)
# 只允许特定客户端
/srv/nfs/shared 192.168.1.50(rw,sync,no_subtree_check,no_root_squash)
# 只读共享
/srv/nfs/readonly 192.168.1.0/24(ro,sync,no_subtree_check)
主要选项说明:
rw:允许读写ro:只读sync:更改立即写入磁盘no_subtree_check:禁用子目录检查(提高性能)no_root_squash:将客户端的root映射为服务器的root
# 应用导出
sudo exportfs -a
# 查看当前导出列表
sudo exportfs -v
# 重启NFS服务
sudo systemctl restart nfs-kernel-server
# 设置开机自启
sudo systemctl enable nfs-kernel-server
4.3 防火墙设置
# 允许NFS端口
sudo ufw allow from 192.168.1.0/24 to any port nfs
# 或允许特定端口
sudo ufw allow 2049/tcp
sudo ufw allow 2049/udp
4.4 NFS客户端设置
# 安装NFS客户端
sudo apt install nfs-common
# 创建挂载点
sudo mkdir -p /mnt/nfs
# 临时挂载
sudo mount 192.168.1.100:/srv/nfs/shared /mnt/nfs
# 确认挂载
df -h | grep nfs
自动挂载(fstab):
# 编辑fstab
sudo nano /etc/fstab
# 添加以下行
192.168.1.100:/srv/nfs/shared /mnt/nfs nfs defaults,_netdev 0 0
# 测试挂载
sudo mount -a
5. 用户访问权限管理
5.1 Samba基于组的权限
有多个用户时,通过组来管理权限更方便。
# 创建组
sudo groupadd family
sudo groupadd work
# 将用户添加到组
sudo usermod -aG family user1
sudo usermod -aG family user2
sudo usermod -aG work user3
# 设置目录组所有权
sudo chown -R root:family /srv/samba/family
sudo chown -R root:work /srv/samba/work
# 设置组写入权限
sudo chmod -R 2770 /srv/samba/family
sudo chmod -R 2770 /srv/samba/work
在smb.conf中添加按组共享配置:
[Family]
comment = Family Shared Folder
path = /srv/samba/family
browseable = yes
read only = no
valid users = @family
create mask = 0660
directory mask = 0770
force group = family
[Work]
comment = Work Shared Folder
path = /srv/samba/work
browseable = yes
read only = no
valid users = @work
create mask = 0660
directory mask = 0770
force group = work
5.2 单个用户权限设置
# 只有特定用户可写
[Reports]
comment = Reports - Admin Write Only
path = /srv/samba/reports
browseable = yes
read only = yes
write list = admin
valid users = admin, user1, user2
6. 磁盘管理与RAID基础
6.1 检查磁盘状态
# 已连接的磁盘列表
lsblk
# 磁盘详细信息
sudo fdisk -l
# 磁盘使用量
df -h
# SMART状态检查(磁盘健康状态)
sudo apt install smartmontools
sudo smartctl -a /dev/sda
6.2 格式化和挂载新磁盘
# 创建磁盘分区
sudo fdisk /dev/sdb
# n: 新分区
# p: 主分区
# Enter: 使用默认值
# w: 保存
# 创建ext4文件系统
sudo mkfs.ext4 /dev/sdb1
# 创建挂载点
sudo mkdir -p /mnt/data
# 挂载
sudo mount /dev/sdb1 /mnt/data
# 查看UUID(用于fstab)
sudo blkid /dev/sdb1
# 在fstab中添加自动挂载
sudo nano /etc/fstab
# UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/data ext4 defaults 0 2
6.3 RAID基础概念
RAID(独立磁盘冗余阵列)是将多个磁盘组合在一起以提高性能或可靠性的技术。
| RAID级别 | 最少磁盘数 | 特点 | 容量效率 |
|---|---|---|---|
| RAID 0 | 2块 | 速度提升,无冗余 | 100% |
| RAID 1 | 2块 | 镜像,完全复制 | 50% |
| RAID 5 | 3块 | 分布式奇偶校验,允许1块故障 | (n-1)/n |
| RAID 6 | 4块 | 双重奇偶校验,允许2块故障 | (n-2)/n |
| RAID 10 | 4块 | 镜像+条带化组合 | 50% |
6.4 软件RAID配置(mdadm)
以配置RAID 1(镜像)为例:
# 安装mdadm
sudo apt install mdadm
# 创建RAID 1阵列(使用sdb和sdc)
sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
# 检查阵列状态
cat /proc/mdstat
sudo mdadm --detail /dev/md0
# 创建文件系统
sudo mkfs.ext4 /dev/md0
# 挂载
sudo mkdir -p /mnt/raid
sudo mount /dev/md0 /mnt/raid
# 保存mdadm配置
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u
# 添加到fstab
echo '/dev/md0 /mnt/raid ext4 defaults 0 2' | sudo tee -a /etc/fstab
重要:RAID不能替代备份。RAID只是对硬件故障的保护,如果误删文件或感染勒索软件,RAID也无法挽救。务必保持单独的备份。
7. 使用SFTP进行安全文件传输
7.1 SFTP设置
SFTP是基于SSH的安全文件传输协议。如果已安装SSH,无需额外安装即可使用。
# 创建SFTP专用用户
sudo useradd -m -s /usr/sbin/nologin sftpuser
sudo passwd sftpuser
# 设置SFTP专用目录
sudo mkdir -p /home/sftpuser/files
sudo chown root:root /home/sftpuser
sudo chmod 755 /home/sftpuser
sudo chown sftpuser:sftpuser /home/sftpuser/files
在SSH配置中设置SFTP chroot:
sudo nano /etc/ssh/sshd_config
在文件末尾添加:
Match User sftpuser
ChrootDirectory /home/sftpuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
# 重启SSH
sudo systemctl restart ssh
7.2 SFTP客户端连接
命令行:
# SFTP连接
sftp sftpuser@192.168.1.100
# 基本命令
ls # 远程目录列表
lls # 本地目录列表
cd files # 切换目录
put file.txt # 上传
get file.txt # 下载
bye # 退出
推荐GUI客户端:
- Windows:WinSCP、FileZilla
- macOS:Cyberduck、FileZilla
- Linux:FileZilla、Nautilus(内置)
8. 总结与下一步
本篇我们学习了如何将家庭服务器打造成功能完善的文件服务器。设置了Samba与Windows兼容的文件共享,通过NFS与Linux客户端快速连接,还学习了通过RAID确保数据可靠性的方法。
文件服务器搭建检查清单
- Samba是否正常安装和运行?
- Windows/Mac能否作为网络驱动器连接?
- 用户访问权限是否正确设置?
- NFS是否能在Linux客户端挂载?
- 防火墙是否允许必要的端口?
- 磁盘状态是否正常?(检查SMART)
- 是否有重要数据的备份计划?
性能优化技巧
- 千兆以太网:至少配置1Gbps网络环境。文件服务器90%的性能取决于网络。
- SSD缓存:常用文件放在SSD上,大容量存储使用HDD。
- 巨型帧:如果网络设备支持,将MTU设为9000可以提高大文件传输效率。
下一篇将介绍使用Docker部署各种服务。将讲解用Nextcloud创建私有云存储、用Plex或Jellyfin搭建媒体服务器等实用服务。