家用 All in One 服务器环境搭建 (四) - Linux 虚拟机和文件共享

date
Oct 19, 2022
slug
all-in-one-home-server-setup-linux-vm-and-file-share
status
Published
tags
Network
summary
N5095 这样的 CPU 只做一个软路由有点暴殄天物了, 于是可以在上面跑几个虚拟机当个 NAS 用, 在虚拟机中配置网络文件共享成功家庭存储中心
type
Post
前面的文章提到, 计划创建一个虚拟机, 将大部分存储空间分配给它, 并配置好网络共享, 把它当 NAS 用.
虚拟机系统的选择非常丰富, 有专门做 NAS 系统的 TrueNAS, 群晖等, 也可以用普通的 Linux 发行版比如 Ubuntu, Debian. 我刚开始用的是 Debian, 不过使用一段时间之后发现 Debian 11 的 OOM Killer 似乎有点问题, 在 PT 下载占用大量内存之后经常死机, 于是换成 Ubuntu Server 22.04 LTS, 此后一切正常. 当然个中问题我也没有深究, 大家可以根据自己的需要自行选择.

安装虚拟机

个人使用的是 Ubuntu Server 22.04 LTS, 日常使用非常稳定. Debian 11 可能是 OOM Killer 机制问题, 进行 PT 下载占用大量内存时经常导致系统假死, Ubuntu Server 没有出现过这种情况.
上传镜像文件, 创建虚拟机等步骤和前面安装 Openwrt 的步骤差不多, 这里不再赘述.
注意, 这里在分配磁盘空间时一定要留出一些余量. 给虚拟机分配磁盘空间实际上是在 PVE 系统里创建了一个虚拟磁盘文件, 这个文件的大小是比虚拟机里看到的要大一些的, 所以分配空间时不能一下子全部分配完. 如果磁盘空间紧张, 记得及时清理空间或者扩充容量.

网络共享

NFS

配置

安装软件包:
apt install nfs-kernel-server
这里假定需要共享的目录为 /var/nfs .
编辑 /etc/exports 文件设置共享. 可以配置的选项及其含义如下图:
notion image
上面几个选项含义如下:
  • rw | ro : 设置目录读写权限, 读写或只读
  • sync | async : 文件模式, 同步或异步. 前者内存中修改会实时写入到硬盘
  • no_root_squash | root_squash | all_squash : 客户端挂载目录后的权限限制. 其中 all_squash 选项将所有用户限制到配置时指定的权限
  • anonuid, anongid : 需要限制到的用户和组. 客户端挂载目录后对目录的操作将会被限制到指定的用户
注意: 建议使用 anonuid, anongid 两个选项指定用户, 而不是简单粗暴地将文件 owner 设置为 nobody:nogroup 并配置权限 777.
示例:
/data/share 192.168.1.0/24(rw,sync,all_squash,no_subtree_check,anonuid=1000,anongid=1000)
让修改生效:
exportfs -a
systemctl restart nfs-kernel-server
exportfs 命令的几个常用选项:
  • -a : 全部挂载/卸载
  • -r : 重新挂载
  • -v : 显示共享目录
  • -u : 卸载某个目录
可以使用 showmount 命令查看共享的 NFS 目录:
showmount -e {SERVER_IP}

挂载

Linux 平台需要安装相关软件:
apt install nfs-common
创建目标文件夹作为挂载点 (mount point), 这里假定为 /mnt/nfs . 使用 mount 命令挂载:
mount -t nfs {IP of NFS server}:{folder path on server} /mnt/data
可以将配置写入 /etc/fstab 文件实现开机挂载:
{IP of NFS server}:{folder path on server} /mnt/data nfs defaults 0 0
写入 /etc/fstab 文件后可以使用 /mount 命令挂载:
mount /mnt/data
# or
mount {IP of NFS server}:{folder path on server}
 
macOS 系统自带 NFS 支持, 挂载方式参考:
 
Windows 系统可以参考下面的 SMB 共享.

SMB

配置

首先安装相关软件:
apt install samba
创建共享使用的用户并设置密码:
smbpasswd -a <username>
此后可以使用该用户访问 SMB 共享的资源.
修改 /etc/samba/smb.conf 添加配置:
[movies]
  path = /home/ricky/pt/downloads
  available = yes
  valid users = ricky
  read only = no
  browsable = yes
  public = yes
  writable = yes
这里的 movies 就是以后要用的共享路径:
\\<ip-address>\<share-name>

使用

Windows 原生支持 SMB, Linux 和 macOS 对该协议也有不错的支持.
Linux 上首先需要安装软件:
apt install cifs-utils
创建目标目录作为挂载点, 假定为 /mnt/smb .
创建密码文件并写入 SMB 共享的帐号和密码:
username=your-username
password=your-password
修改 /etc/fstab 配置自动挂载:
//<smb-server>/<share-dir> /mnt/<mount-dir> cifs credentials=<path-to-credentials>,iocharset=utf8 0 0
使用 mount 命令尝试挂载:
mount /mnt/smb
 
macOS 可以在 Finder 中挂载, 具体步骤参考:
 
Windows 系统在文件管理器中就可以访问 SMB 共享. 打开文件管理器, 在地址栏输入 \\<ip-address>\<share-name 即可.
 
不过 Windows 不支持 Linux 上的文件权限管理和访问控制, 因此在 Linux 上创建 SMB 共享给 Widnows 使用可能带来一些文件权限方面的混乱.

WebDAV

配置

可以通过 Docker 安装 WebDAV 共享所需软件, 我用的是这个镜像:
该镜像通过 YAML 格式的配置文件来设置共享属性, 简单好用. 美中不足的是只提供 XML 格式的数据, 没有提供到 HTML 格式的转换, 因此无法直接在浏览器里访问.
如果你像我一样希望通过 Nginx 反向代理家里的所有网络服务, 可以参考这份 Nginx 配置:
此外, 社区有不少基于阿里网盘的二次开发, 其中包括基于阿里网盘搭建的 WebDAV 服务:

挂载

Linux, macOS 和 Windows 都可以很方便地挂在 WebDAV 共享, 此外很多软件也支持通过 WebDAV 协议进行数据传输和备份.
Linux 平台可以利用 davfs2 将 WebDAV 共享挂载为常规文件系统. 首先安装软件:
apt install davfs2
其次创建挂载点, 假定为 /mnt/webdav .
命令行直接挂载:
mount -t davfs -o noexec https://webdav.example.com/path /mnt/dav/
也可以将配置写入 /etc/fstab 来实现自动挂载.
编辑 /etc/davfs2/secrets 写入 WebDAV 共享帐号密码:
https://webdav.example/path davusername davpassword
编辑 /etc/fstab 写入配置信息:
https://webdav.example/path /mnt/webdav davfs rw,user,uid=username,noauto 0 0
配置完成后使用 mount 命令挂载:
mount /mnt/webdav
参考:
 
macOS 原生支持 WebDAV:
如果希望开机自动挂载 WebDAV 共享, 可以在 System Preferences - Login Items 添加挂载目录即可.
macOS 会自动创建 .DS_Store 文件存储桌面配置信息, 可以设置成禁止在网络位置创建 .DS_Store 提升性能:
defaults write com.apple.desktopservices DSDontWriteNetworkStores true
 
Windows 同样原生支持 WebDAV 共享:

© Richard Wang 2021 - 2023