虚拟机virt-manager-2:host与guest文件共享

由于虚拟机的客户机在理论上与主机是完全隔离的,所以,虽然安全性很高,但客户机与主机之间如果需要交换或者共享文件,就需要一些额外的设置和操作才能实现。您可以参考下面介绍的三个方案来解决。

约定:

下面的阐述中,主机=host,虚拟机=客户机=guest,不再另行说明。另外,虚拟机均为kvm的.qcow2虚拟机,vmware等其它类型未测试。

Y 驿窗注:客户机不分Linux和Windows

本文涉及的三个方案,均不限制客户机的类型,即客户机可以是Linux,也可以是Windows。

方案一、命令行操作

如果从极限安全的角度考虑,可以使用virt-copy-in和virt-copy-out这两个命令,无论guest是Linux还是windows,都可以使用。并且,命令运行时,guest是关机的状态,相对安全性更好一些。

想使用virt-copy-in/out命令,需要host上安装一个工具libguestfs-tools,在主机的命令行终端中运行下面的命令:

sudo apt install libguestfs-tools

此工具安装好以后,假设virt-manager虚拟机文件(.qcow2)保存在主机的pool目录,文件名为debian12.qcow2;且该目录中有一个video.mp4需要拷贝到虚拟机中,那么打开主机命令行终端,把目录切换到debian12.qcow2文件所在的pool目录,再执行下面的命令:

virt-copy-in -a ./debian12.qcow2 ./video.mp4 /home/

上面的命令中:

  1. -a表示通过虚拟机的文件名来指定虚拟机,本例文件名是debian12.qcow2;

  2. ./表示当前目录;

  3. video.mp4表示要被拷贝的文件,

  4. /home/表示要拷贝到的目标目录是虚拟机的/home/目录。

  5. 整条命令的意思就是把video.mp4文件拷贝到同目录中虚拟机里面去(虚拟机是debian12.qcow2)。

如果把上面的命令写成下面的样子,则表示从虚拟机里面拷贝一个到主机的当前目录(虚拟机为debian12.qcow2,video.mp4文件在虚拟机的/home/目录中):

virt-copy-out -a ./debian12.qcow2 /home/video.mp4 .

该命令的意思是把虚拟机中的文件拷贝出来到主机中。

下面命令会把win10虚拟机中C:\001\目录中的video.mp4拷贝到主机当前目录:

virt-copy-out -a ./win10.qcow2 /001/video.mp4 .

上面命令中,./表示主机当前目录;/001/表示win10虚拟机中C:\001\目录;

virt-copy-in和virt-copy-out这两个命令不仅可以对文件进行操作,也可以对目录进行操作。例如下面的命令表示把虚拟机中的/home目录整体拷贝到主机的当前目录:

virt-copy-out -a ./debian12.qcow2 /home .

上面命令中:

  1. ./表示主机当前目录;

  2. /home表示虚拟机里面的/home目录;

  3. 命令最后面的那个.表示主机当前目录。

virt-copy-in和virt-copy-out命令方式不需要网络支持,所以不受防火墙影响。

方案二、FTP操作

如果不想使用命令行,可以考虑SSH+FileZilla工具。FileZilla是比较流行的FTP软件,ftp协议可以使用加密的SFTP。

和上面的命令行方案相比,SSH+FileZilla方案的特点是操作时guest必须为开机运行的状态;并且,guest和host分别需要配置好SSH相关的参数设置。

FileZilla支持断点续传,所以,如果在数据传输过程中需要重启电脑,可以在FileZilla中暂停传输过程,等电脑重启后继续之前的传输过程:FileZilla>编辑>设置>传输>对已存在文件的操作,下载和上传都选择继续文件传输。 在列队的文件框中,右键点击服务器,取消勾选处理队列即可暂停。

Y 驿窗注:

由于FTP方式与前面的命令行方式分别要求guest处于开机和关机的状态,所以两种方式正好互补,建议都进行了解并保存记录,以备不时之需。

此方案对于虚拟机是Linux guest和虚拟机是windows guest两种情况来说,操作基本没有差异,且都需要在guest中配置和启用SSHD服务。

此方案安全性不如前面介绍的命令行方式,但可以避免每一次都输入命令,适合懒得输入命令且对安全性没有极限要求的人群。

这个方案需要做下面几件事:

  1. guest安装ssh-server,并配置sshd以备ssh密钥连接

  2. host通过ssh-keygen生成公钥和私钥

  3. host通过ssh-copy-id把公钥上传到guest

  4. host安装FileZilla

  5. host运行FileZilla,配置好后连接guest,与guest互传文件

相关设置与操作方法,请参考附录中SSH相关章节。

此方式因使用了网络,所以会受防火墙影响。防火墙设置很简单,后面会提供。

方案三、共享文件夹

除了上面两种方式,您还可以通过共享文件夹的方式来实现guest与host的文件交换,此方式同样需要在guest和host中做一些配置,但安全性相对不如前面的方式。

共享文件夹方式主要是使用virtio-fs。

具体配置如下:

1. 客户机为Linux:

这里是针对虚拟机为Linux系统的情况。

关闭guest电源,打开virt-manager虚拟机的界面,切换到 详情>内存,勾选Enable shared memory。点击 应用 按钮。

详情页左侧底部点击 添加硬件>文件系统,驱动程序选择virtiofs源路径选择host上准备共享的目录;目标路径用来指定共享名称,比如可以填写hostshare。点击 完成 按钮。

运行此虚拟机,在虚拟机中创建一个用于挂载主机上共享文件夹的目录,比如

mkdir /home/peter/host

这表示在虚拟机的/home/peter/目录中创建了一个host目录。

接下来,把主机上的共享目录持载到虚拟机上这个host目录即可:

sudo mount -t virtiofs hostshare /home/peter/host

好了,您已经可以在host和guest之间通过共享目录来交换文件了。

2. 客户机为Windows:

这里是针对虚拟机为Windows系统的情况。

关闭guest电源,打开virt-manager虚拟机的界面,切换到 详情>内存,勾选Enable shared memory。点击 应用 按钮。

详情页左侧底部点击 添加硬件>文件系统,驱动程序选择virtiofs源路径选择host上准备共享的目录;目标路径用来指定共享名称,比如可以填写hostshare。点击 完成 按钮。

下载两个文件,这两个文件需要在windows虚拟机里安装:

运行windows虚拟机,在虚拟机中安装上面两个文件。安装好以后,重启虚拟机,找到服务>VirtioFsSvc服务,启动此服务,并设置为开机自动启动。(我的电脑 右键>管理>服务与应用)

接下来,你可以打开 我的电脑,其中有C盘,也有我们刚才设置的共享目录(默认通常是Z盘)

好了,您已经可以在host和guest之间通过共享目录来交换文件了。

此方式与防火墙设置无关。

总结

上面介绍了三种host与guest文件共享的方案,驿窗推荐方案一结合方案二使用。方案二要使用到SSH相关的技术,与SSH相关的说明,请参考附录中SSH相关内容。

从通用性角度看,使用filezilla通过FTP方式互传文件的方案二,更具有普遍性。它除了可以在电脑上的host与guest之间互传文件,也可以在电脑与安卓手机与平板之间互传文件,还可以在不同的电脑之间互传文件,有点一招鲜吃遍天的意思。

SSH

下面介绍关于SSH的内容。

SSH的主要用途是在不同电脑之间进行加密通信,比如远程登录服务器。SSH的全称是Secure Shell,是一种远程加密通信协议。

现在的Linux发行版,基本上都是使用OpenSSH(OpenBSD Secure Shell)。OpenSSH使用SSH协议来实现不同计算机之间的远程加密通信。使用SSH协议的远程通信程序很多,本文只涉及OpenSSH(Debian环境)。

OpenSSH分为两个部分,一个是客户端,叫openssh-client;另一个是服务端,叫openssh-server。

通常,两台计算机远程通信时,主动发起通信的一端,就是客户端,使用的配置文件是/etc/ssh/ssh_config;接收通信的另一端,就是服务端,使用的配置文件是/etc/ssh/sshd_config。

我们仍以远程登录服务器为例,那个被远程登录的服务器,就是服务端,需要运行sshd这个服务,通过安装openssh-server并配置sshd_config来实现;而远程操作时直接使用的电脑,就是客户端,需要运行ssh-agent这个服务,通过安装openssh-client并配置ssh_config来实现。

默认情况下,Debian系统会自带客户端,不带服务端。不过没关系,二者都可以随时手动安装:

sudo apt install openssh-client
sudo apt install openssh-server

在安装之前,我们也可以用下面的命令检查系统上是否已经启用客户端/服务端:

ps -e | grep ssh

上面命令回车后的输出结果可能是下面这样的:

../_images/16kvm2-ssh-ps.png

终端中执行命令:ps -e | grep ssh

上面截图中:

  • 607 ?那一行右面的sshd表示服务端已经启用;

  • 828 ?那一行右面的ssh-agent表示客户端已经启用。

未完稿

最近一次更新:2024年04月12日