【基于各种多模态文件的在线预览系统】3、本地磁盘挂载虚拟机
本地cenos7下的/home映射:
现在的问题:kodbox 默认把文件存在 data/ 目录,而它在 / 根分区(只有 50G,已用 10.7G)。你的 /home 是独立的 500G 分区(还剩 440G),所以要把存储挪过去。
推荐做法:绑定挂载(bind mount)
把 /home 上的目录"映射"到原来的 data 路径。这样:
- kodbox 完全无感,照常往
data/读写,但文件实际落在/home的大盘上; - 路径还在站点目录内,不破坏宝塔的「防跨站攻击(open_basedir)」保护;
- 配
/etc/fstab后开机自动生效。
(为什么不用软链接?软链接会让路径指到站点外的
/home,而 open_basedir 会拦住 PHP 访问/home,得额外关保护;bind mount 没这问题,更省心。)
执行命令(现在没数据,直接做最安全)
# 0. 先在宝塔把 kodbox 站点停一下(可选,更稳),或确认现在没人用
# 1. 把现有 data 整个搬到 /home(连隐藏文件一起,改名最干净)
mv /www/wwwroot/file-viewer/data /home/kodbox_data
# 2. 在原位置重建一个空目录作为"挂载点"
mkdir /www/wwwroot/file-viewer/data
# 3. 绑定挂载:让 /home/kodbox_data 出现在 data 路径上
mount --bind /home/kodbox_data /www/wwwroot/file-viewer/data
# 4. 属主改回 www
chown -R www:www /home/kodbox_data /www/wwwroot/file-viewer/data
# 5. 写入开机自动挂载(否则重启后失效)
echo "/home/kodbox_data /www/wwwroot/file-viewer/data none bind 0 0" >> /etc/fstab
# 6. 验证:这一行应显示 /home 的容量(440G 左右)
df -h /www/wwwroot/file-viewer/data
第 6 步如果 df 显示的可用空间变成 440G,就成功了。然后在宝塔把站点启动回来,刷新 kodbox 页面照常使用。
关于"文件内容的调度"
你不用手动管。kodbox 的存储机制是:
- 物理文件:按内容存到
data/files/下(同样内容会去重),你不用关心具体怎么排布; - 目录结构 / 文件名 / 权限:记录在 MySQL 数据库里(元数据)。
所以你只要把 data/ 这个物理存储目录指到大盘(上面做的事),所有上传、预览、增删改名都自动用 500G 空间了,kodbox 自己调度,无需配置。
如果你更想用 kodbox 界面里设置(第二张图那个选目录的弹窗)
那个是 kodbox 内部的存储/挂载设置,但它能访问的路径同样受 open_basedir 限制,指到 /home 还是会被拦。所以最干净的还是上面的 bind mount 系统层方案——一次搞定、永久有效、界面里啥都不用改。
要不要我把上面 6 条命令 + 重启站点整理成一个可直接粘贴的小脚本?跑完 df -h 把结果发我确认就行。
winserver2019的本地硬盘映射:
很好的思路!既然宿主机(Windows Server 2019 @ 172.16.1.3)有几十 TB,把它的存储挂给 CentOS 用是合理的。
先给结论:用 SMB/CIFS,不要用 WebDAV。 原因——Windows↔Linux 之间 SMB 是原生协议,Windows 自带、稳定、速度快、好认证;WebDAV 要在 Windows 上装 IIS 的 WebDAV 角色,Linux 端用 davfs2 挂,慢且容易出锁文件/缓存问题,不划算。
提醒一个权衡:网络存储(SMB)比本地盘慢,而且依赖宿主机开机 + 网络通。如果你的
/home那 440G 已经够用,其实本地 bind mount 更简单更快。要 TB 级才值得走 SMB。下面按 SMB 给你完整方案。
一、Windows Server 2019(172.16.1.3)端
1. 建存储文件夹 在 E 盘建个目录,例如 E:\kodbox_data。
2. 建一个专用账号(别用 Administrator) 计算机管理 → 本地用户和组 → 用户 → 新建用户 kodbox,设密码,去掉"下次登录改密码"。
3. 共享该文件夹 右键 E:\kodbox_data → 属性 → 共享 → 高级共享 → 勾选"共享此文件夹",共享名 kodbox_data → 权限 → 添加 kodbox 用户给 完全控制。 再到 安全(NTFS) 选项卡 → 编辑 → 添加 kodbox → 给 修改/写入 权限。
4. 放行防火墙 确保"文件和打印机共享(SMB-In)"在防火墙里允许(端口 445)。桥接网络下 CentOS 要能 ping 通 172.16.1.3。
共享路径就是:\\172.16.1.3\kodbox_data
二、CentOS 7 端
1. 装 cifs 工具
yum install -y cifs-utils
2. 建凭据文件(避免密码明文写在 fstab)
cat > /etc/kodbox-smb.cred <<'EOF'
username=kodbox
password=这里填kodbox账号的密码
domain=WORKGROUP
EOF
chmod 600 /etc/kodbox-smb.cred
3. 查 www 用户的 uid/gid(挂载要用)
id www
记下 uid= 和 gid=(宝塔的 www 通常是 1000)。
4. 只把"文件存储目录"挂到共享(关键!)
⚠️ 别挂整个
data/。kodbox 的data/system、data/temp放网络盘会有锁/性能问题。只把存放用户文件的data/files指向共享,系统数据和临时目录留在本地。
cd /www/wwwroot/file-viewer/data
# 备份现有 files(刚装基本是空的)
mv files files.bak
mkdir files
# 挂载共享到 data/files(把下面 uid/gid 换成上一步 id www 的数字)
mount -t cifs //172.16.1.3/kodbox_data /www/wwwroot/file-viewer/data/files \
-o credentials=/etc/kodbox-smb.cred,uid=1000,gid=1000,file_mode=0644,dir_mode=0755,vers=3.0,iocharset=utf8
# 把原内容拷进去
cp -a files.bak/. files/ 2>/dev/null
rm -rf files.bak
# 验证:这一行应显示几十 TB 的容量
df -h /www/wwwroot/file-viewer/data/files
5. 配置开机自动挂载 编辑 /etc/fstab,加一行(uid/gid 同样换成数字):
//172.16.1.3/kodbox_data /www/wwwroot/file-viewer/data/files cifs credentials=/etc/kodbox-smb.cred,uid=1000,gid=1000,file_mode=0644,dir_mode=0755,vers=3.0,iocharset=utf8,_netdev 0 0
_netdev表示等网络就绪再挂,避免开机卡住。
三、几个要点
- open_basedir 不用关:挂载点
data/files还在站点目录内,宝塔的防跨站保护不受影响。 - uid/gid 必须对:CIFS 上的文件属主由挂载参数
uid/gid决定(Windows 没有 Linux 属主概念),设成 www 的 uid 才能让 PHP 读写。 - SMB 版本:Server 2019 支持 SMB3,用
vers=3.0;若挂载报错可试vers=3.1.1或vers=2.1。 - 中文文件名:加了
iocharset=utf8,避免乱码。 - 依赖宿主机:Windows 关机或网络断开时,kodbox 的文件会读不到。生产建议宿主机常开。
挂好后回宝塔启动/刷新 kodbox,上传一个文件,去 Windows 的 E:\kodbox_data 里看是不是出现了 —— 出现就成功了。
几个问题一起出现,逐个解决。最核心的是 mount error(13): Permission denied = SMB 认证失败。
问题 1:凭据文件密码是空的 ❌
你创建凭据时 password= 后面什么都没填:
password= ← 空的
空密码 Windows 默认拒绝网络登录,必然 Permission denied。
→ 编辑 /etc/kodbox-smb.cred,把 Windows 上 kodbox 账号的真实密码填上(用宝塔文件管理器或 vi 改):
username=kodbox
password=这里填真实密码
domain=WORKGROUP
问题 2:uid 用错了
你 id www 显示的是 uid=1001, gid=1001,但挂载命令里写的是 uid=1000,gid=1000。要改成 1001,否则即使挂上文件属主也不对、PHP 还是没法写。
问题 3:先确认 Windows 端真的配好了
Permission denied 也可能是 Windows 那边没配好。请确认第一部分都做了:
E:\kodbox_data文件夹已建- 本地用户
kodbox已建并设了密码 - 文件夹「共享权限」和「安全(NTFS)」都给了
kodbox写权限 - 防火墙放行了文件共享(445)
问题 4:那条 fstab 是用来"写入文件"的,不是直接执行
最后你把 //172.16.1.3/... 整行当命令运行了,所以报"没有那个文件或目录"。那行是要加到 /etc/fstab 文件里的,等手动挂载成功后再加(见下)。
正确的排查 + 挂载顺序
第 1 步:先验证账号密码和共享名对不对(最快定位 13 错误)
ping -c 3 172.16.1.3
yum install -y samba-client
smbclient -L //172.16.1.3 -U kodbox
输入密码后,能列出 kodbox_data 共享 → 说明账号/密码/共享都 OK,可以挂载。 如果这里就报登录失败 → 是 Windows 端账号或权限问题,回问题 3 检查。
第 2 步:填好密码后,手动挂载(uid 改 1001)
umount /www/wwwroot/file-viewer/data/files 2>/dev/null
mount -t cifs //172.16.1.3/kodbox_data /www/wwwroot/file-viewer/data/files \
-o credentials=/etc/kodbox-smb.cred,uid=1001,gid=1001,file_mode=0644,dir_mode=0755,vers=3.0,iocharset=utf8
- 还报 13 → 把
vers=3.0换成vers=2.1再试,或vers=3.1.1。 - 成功的话:
df -h /www/wwwroot/file-viewer/data/files # 应显示几十 TB
第 3 步:挂载成功后,再写入 fstab(编辑文件,不是执行) 用宝塔文件管理器打开 /etc/fstab,在末尾新增一行(uid 用 1001):
//172.16.1.3/kodbox_data /www/wwwroot/file-viewer/data/files cifs credentials=/etc/kodbox-smb.cred,uid=1001,gid=1001,file_mode=0644,dir_mode=0755,vers=3.0,iocharset=utf8,_netdev 0 0
另外:你截图里 kodbox 自带的「存储类型」有 WebDAV/FTP/S3/MinIO —— 那是 kodbox 应用层直接接外部存储的功能,但都需要 Windows 先跑一个对应的服务端(WebDAV 要装 IIS WebDAV、FTP 要开 FTP 服务)。相比之下,我们走的 CIFS 系统挂载对 kodbox 完全透明、最省事,所以建议先把 CIFS 搞通。
先做第 1 步的 smbclient -L,把输出发我 —— 它能直接告诉我是"密码/账号问题"还是"Windows 共享没配好"。
是的,挂载成功了! 🎉
df -h 那行已经清楚显示:
//172.16.1.3/kodbox_data 37T 307G 37T 1% /www/wwwroot/file-viewer/data/files
kodbox 的文件存储目录现在指向宿主机的 37TB 空间了。smbclient 也成功列出了 kodbox_data 共享(最后那个 SMB1 workgroup 报错是无害的,只是枚举工作组的多余动作,忽略)。
你截图里 fstab 也已经把那行加好了,开机自动挂载也具备了。剩下做 3 个验证就彻底收工:
验证 1:确认 www 用户能写(权限闭环)
sudo -u www touch /www/wwwroot/file-viewer/data/files/_writetest.txt && echo "写入成功"
-
显示「写入成功」→ 去 Windows 的
E:\kodbox_data里能看到
_writetest.txt,说明读写权限全通。然后删掉它:
rm -f /www/wwwroot/file-viewer/data/files/_writetest.txt -
如果报权限错 → 是 Windows 那边
kodbox用户的 NTFS/共享权限只给了读,回去给它「修改/写入」权限。
验证 2:确认 fstab 不会让开机卡住(重要)
刚才是手动挂的,得确认 fstab 那行语法没问题,否则重启可能出问题:
umount /www/wwwroot/file-viewer/data/files
mount -a
df -h | grep kodbox_data
mount -a后再次出现那 37T 的行 → fstab 正确,重启无忧。- 如果
mount -a报错 → 把错误发我,八成是 fstab 那行有个小笔误。
验证 3:实际跑一遍 kodbox
- 浏览器打开
http://172.16.1.5/,登录 kodbox。 - 上传一张图片或一个文档。
- 去 Windows 的
E:\kodbox_data看 —— 出现了对应文件(可能在子目录里,文件名是 hash)就说明整条链路完全打通:上传 → 存到宿主机 37T 盘 → 预览正常。
三个验证都过,你这套「kodbox 在线文档预览 + 宿主机 37T 存储」就正式完工了。
日常注意两点:① 访问始终用
http://172.16.1.5/(80 端口,别用 :7777,否则又丢端口没样式);② Windows Server(172.16.1.3)要保持开机,否则 kodbox 读不到文件。
验证 1 和 2 的结果发我确认下,有问题我接着帮你弄;没问题就大功告成了。

浙公网安备 33010602011771号