【基于各种多模态文件的在线预览系统】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/systemdata/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.1vers=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

  1. 浏览器打开 http://172.16.1.5/,登录 kodbox。
  2. 上传一张图片或一个文档。
  3. 去 Windows 的 E:\kodbox_data 看 —— 出现了对应文件(可能在子目录里,文件名是 hash)就说明整条链路完全打通:上传 → 存到宿主机 37T 盘 → 预览正常。

三个验证都过,你这套「kodbox 在线文档预览 + 宿主机 37T 存储」就正式完工了。

日常注意两点:① 访问始终用 http://172.16.1.5/(80 端口,别用 :7777,否则又丢端口没样式);② Windows Server(172.16.1.3)要保持开机,否则 kodbox 读不到文件。

验证 1 和 2 的结果发我确认下,有问题我接着帮你弄;没问题就大功告成了。

posted @ 2026-07-10 10:30  crockery  阅读(3)  评论(0)    收藏  举报