目标:

实时共享,即主机修改一个文件并关闭,在虚机打开可以看到更改。虚机继续改并关闭,主机打开可以看到更改。这样做目的是,我打算在虚机A做开发环境,在虚机b做服务运行环境,2个虚机共享宿主的一个项目目录

步骤:

  1. 实时共享目录的3种方案:virtio-fs或者9pfs或者NFS 。我的虚机是主流发行版,不支持9p (mount -t 9p报错 ) ,需要编译内核。我的qemu从apt 下载,不支持virtio-fs (缺少virtiofsd命令 ),需要重新编译。所以我选择最简单的NFS
  2. 主机
sudo apt-get install nfs-kernel-server
vi /etc/exports
/opt/wode(主机的共享目录)  (主机和虚机的网段)20.0.0.0/24(rw,sync,no_root_squash)
systemctl start nfs-server
sudo exportfs

3  以桥接启动一台虚机

4 . 虚机

mkdir 挂载点

mount -t nfs -o nolock 主机IP:/共享目录   挂载点


补充:挂载img和qcow2

这些文件不能实时共享目录,只是异步的。

windows和linux互传数据时,先挂到win后挂linux,因为先挂linux并传入数据后,再挂windows又会要求对新磁盘格式化。

linux和linux互传数据时,如果先挂高版本linux并格式化写入数据,再挂非常低版本时,也会要求格式化,见解决

windows挂载步骤:

仅当第一次挂载磁盘时需要设置:磁盘管理 - 右键新建卷 - 在弹窗中格式化并设置卷标,以后开机自动挂载了卷标。

linux的挂载步骤:qcow2

1.查看模块是否加载 sudo lsmod |grep nbd

2.没有就加载 sudo modprobe nbd max_part=16

3.文件转设备: sudo qemu-nbd -c /dev/nbd0 data.qcow2 

4.查看子设备名:lsblk

5.挂载子设备: sudo mount /dev/nbd0p1 /mnt/jdk

6.使用完了清除: sudo umount /dev/nbd0p1

sudo qemu-nbd -d /dev/nbd0

sudo modprobe -r nbd

linux挂载步骤:img

1.查看设备名:losetup -f

2.文件转设备:sudo losetup -P /dev/loop1  data.img

3.查看子设备名: lsblk

4.挂载 mount /dev/loop1p1  /mount-point

5.用完清理: umount 然后 losetup -d /dev/loop1

补充:扩容qcow2

qemu-img resize  abc.qcow2  +1G

fdisk -l 显示容量增加,但是挂载后,df -h 显示容量没变。

这时需要:resize2fs abc.qcow2  然后再挂载,df -h 查看真的扩容了

我在宿主机执行这个命令,报错:

resize2fs: 超级块中的幻数有错 尝试打开 abc.qcow2 时
找不到有效的文件系统超级块。

我懒,所以进入虚拟机执行:

e2fsck -f /dev/sdb
resize2fs /dev/sdb
mount /dev/sdb /abc
df -h /abc 扩容成功

以上只适用普通分区的设备,如果设备被装上操作系统,OS有可能在安装时对分区做了特殊处理,比如逻辑卷。则扩容qcow2需要注意

补充:缩容qcow2

比如容量10个G,实际使用7个G的qcow2文件,在里面删除了很多文件后,该qcow2文件仍然占用7G的磁盘空间。

这时,可以进入该挂载目录,写入0到一个文件占满空间,dd if=/dev/zero of=./junk,这个命令会持续运行直到10G,其实只要观察qcow2文件大小超过7G就可以终止命令,用ctrl+ c ,然后删除它 rm junk ,然后卸载该qcow2文件。复制一份,新文件就比7G小很多

// 参数是大写o
qemu-img convert -O qcow2 old.qcow2 new.qcow2