前言:为什么选择文件服务器?

搭建家庭服务器最大的原因之一就是文件服务器。云服务虽然方便,但需要每月支付订阅费,而且存储容量有限。更重要的是,把重要数据存放在别人的服务器上可能会让人不安。

搭建自己的文件服务器可以摆脱这些担忧。一次性购买硬盘后,可以无限期使用,不需要额外费用,而且数据只存在于自己家中。让我们来建立一个可以安全保存家庭照片、视频、文档,并从任何地方访问的私有云吧。

本篇将以文件服务器的核心技术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:在文件资源管理器中直接访问

  1. 打开文件资源管理器,在地址栏输入\\192.168.1.100(服务器IP)
  2. 显示共享文件夹列表
  3. 访问Private文件夹时输入用户名和密码

方法2:映射网络驱动器

  1. 在文件资源管理器中右键点击"此电脑"
  2. 选择"映射网络驱动器"
  3. 选择驱动器盘符(例如:Z:)
  4. 在文件夹中输入\\192.168.1.100\Private
  5. 勾选"使用其他凭据连接"
  6. 勾选"登录时重新连接"可自动挂载

3.2 从macOS连接

  1. 在Finder菜单中选择"前往" > "连接服务器"(Cmd+K)
  2. 在服务器地址中输入smb://192.168.1.100
  3. 选择要连接的卷
  4. 输入用户名和密码

设置自动挂载:

  1. 系统偏好设置 > 用户与群组
  2. 选择当前用户 > 登录项
  3. 将已连接的网络驱动器添加到列表中

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搭建媒体服务器等实用服务。