在 Proxmox VE (PVE) 环境中,文件传输的操作取决于你的目标是 LXC 容器还是 KVM 虚拟机。因为 LXC 共享宿主机内核,而 KVM 是完全隔离的硬件虚拟化,所以两者的处理方式完全不同。

以下是针对不同场景的操作指南:


1. LXC 容器与宿主机之间 (最简单)

PVE 提供了专门的 pct 命令来处理 LXC 的文件传输,非常高效。

从宿主机复制到 LXC

# 格式:pct push <vmid> <宿主机路径> <容器内路径>
pct push 100 /root/test.txt /root/test.txt

从 LXC 复制到宿主机

# 格式:pct pull <vmid> <容器内路径> <宿主机路径>
pct pull 100 /root/test.txt /tmp/test.txt
小技巧:由于 LXC 的根文件系统直接挂载在宿主机上,你也可以直接进入 /var/lib/lxc/<vmid>/rootfs/ 目录进行传统的 cp 操作,但使用 pct 命令更安全,能避免权限管理上的麻烦。

2. KVM 虚拟机与宿主机之间

KVM 是隔离的镜像文件(如 .qcow2 或 .raw),宿主机无法直接像访问文件夹那样访问它。

方法 A:通过网络 (推荐)

这是最通用、最稳妥的方法。只要虚拟机开启了 SSH 服务:

# 从宿主机传到 VM
scp /path/to/file root@<VM_IP>:/root/

# 从 VM 传回宿主机
scp root@<VM_IP>:/path/to/file /local/path/

方法 B:使用 virt-copy 工具 (离线状态)

如果你不想通过网络,或者 VM 没开机,可以安装 libguestfs-tools:

# 安装工具
apt update && apt install libguestfs-tools -y

# 复制文件进去
virt-copy-in -d <VM_ID> /local/file /remote/directory/

注意:使用此类工具时,建议虚拟机处于关闭状态以防磁盘损坏。


3. 跨实体复制 (LXC ↔ KVM, LXC ↔ LXC)

在这种情况下,没有直接的单条命令可以“一键直达”,通常有两条路径:

路径一:以宿主机为中转站 (最常用)

  1. 从 A 拉取到 PVE 宿主机:pct pull (如果是 LXC) 或 scp (如果是 KVM)。
  2. 从 PVE 宿主机推送到 B:pct push (如果是 LXC) 或 scp (如果是 KVM)。

路径二:直接网络传输 (最快)

如果两个虚拟机/容器都在同一个网段,直接在它们之间互传即可:

# 在源机器执行
scp /path/to/file user@dest_ip:/path/

总结表

场景推荐命令备注
宿主机 → LXCpct push <ID> <src> <dest>极快,无需网络配置
LXC → 宿主机pct pull <ID> <src> <dest>极快
宿主机 ↔ KVMscp 或 rsync需要 VM 开启网络和 SSH
LXC ↔ KVMscp (直连) 或 宿主机中转建议走内部虚拟网桥速度极快

安全提醒:在执行 pct push 或 cp 操作到容器内部后,记得检查目标文件的 所有者 (chown),确保容器内的服务(如 www-data 或 mysql)有权限读取它。