VMware/Installing Arch as a guest (简体中文)
这篇文章是关于如何在VMware产品,比如Player (Plus),Fusion或Workstation中安装ArchLinux。
Contents
编译进内核的驱动程序(模块)
-
vmw_balloon
- 物理内存管理驱动。它可以像一个气球一样被“吹大”,从监视器处夺走物理内存的使用权;也可以“放气”,允许物理内存被虚拟机使用。还支持将反分配状态(deallocated)的虚拟机原本所占的内存释放回主机,而无需彻底停用虚拟机。 -
vmw_pvscsi
- VMware 平行虚拟化 SCSI(PVSCSI)的主机总线适配器(HBA)。 -
vmw_vmci
- 虚拟机通信接口(VMCI)。VMCI 虚拟设备的作用是使虚拟环境间的主机-客机高速通信。 -
vmwgfx
- 这是 VMware SVGA2 虚拟显卡的 DRM 驱动,作用是 3D 加速。支持 |KMS。 -
vmxnet3
- VMware 的 vmxnet3 虚拟网卡所需模块。 - 从 Linux 内核 4.0 起,open-vm-tools 包含了一个基于 FUSE 实现的 HGFS 文件系统。用于主机-客机间共享目录。
如果你在某种监视器(比如 VMware vSphere Hypervisor)上运行 Arch Linux,那么下面这些模块也是需要的:
-
vsock
- 虚拟套接字协议。其作用是允许虚拟机,主机或监视器间像 TCP/IP 协议一样通信。 -
vmw_vsock_vmci_transport
- 基于 VMCI 实现的虚拟套接字。
VMware Tools 与 Open-VM-Tools 方案对比
2007 年,VMware 将 VMware Tools 中的大部分代码以 LGPL 协议发布,这就是 Open-VM-Tools。官方的 VMware Tools 不再单独向 Arch Linux 提供。
以往,VMware Tools 方案所提供的网络与储存驱动是最好的,而且还带有时间同步等功能。然而网络与 SCSI 驱动这部分代码已经早就合入 Linux 内核了。VMware Tools 的优势只剩下 Unity mode 等附加功能。
VMware Tools 与 Open-VM-Tools 两个方案都需要额外安装软件包 xf86-video-vmware。
Open-VM-Tools
实用工具
open-vm-tools 软件包里包括如下工具:
-
vmtoolsd
- 负责汇报虚拟机状态的服务。 -
vmware-checkvm
- 用于检测虚拟机中是否在运行着某程序的工具。 -
vmware-toolbox-cmd
- 用于收集宿主系统信息的工具。 -
vmware-user-suid-wrapper
- 用于实现宿主 / 客机系统间共享剪贴板。 -
vmware-vmblock-fuse
- 文件系统。基于 FUSE (Filesystem in Userspace) 实现了宿主 / 客机之间拖拽文件。 -
vmware-xferlogs
- 向虚拟机的日志文件输出日志与调试信息。 -
vmhgfs-fuse
- 挂载 HGFS 共享目录的工具。
内核模块
open-vm-tools-dkmsAUR 软件包里包含了如下内核模块:
-
vmhgfs
- 旧有的 HGFS 驱动。这是传统的宿主机-客机间共享目录的方案。 -
vmxnet
- 旧有的 VMXNET 网卡驱动。
安装
安装 open-vm-tools 软件包。
Open-VM-Tools 会从文件 /etc/arch-release
读取系统版本信息,但这个文件是空的。需要做如下的操作来满足它:
# cat /proc/version > /etc/arch-release
多用户目标
本小节的操作步骤可以帮你将系统启动至 multi-user.target
。如果你想要启动至 graphical.target
那么请跳过本小节。
启动服务 vmtoolsd.service
。如果需要的话,也可以设置成开机自动启动。
图形界面目标
如果你希望启动至 graphical.target
,那么按照如下步骤配置:
# 将 vmware-vmblock-fuse.service 设置成开机自启动 systemctl enable vmware-vmblock-fuse.service
如果你还安装了 open-vm-tools-dkmsAUR,那么你还需要将 dkms.service
这个 Systemd 服务也设置成开机自启动。这个服务会在每次内核更新之后自动重新编译内核模块。
如果不能正常工作,可以试试手动安装 gtkmm 。
在窗口大小变动后自动重设分辨率
按照这里:[1] 的步骤,在登录到 X 会话之后,启动 /usr/bin/vmware-user-suid-wrapper
。
官方的 VMware Tools
模块
-
vmblock
- 文件系统驱动。支持在主机-客机间拖拽文件。已被vmware-vmblock-fuse
(取代)。 -
vmci
- 主机-客机间的高性能通信接口。 -
vmmon
- 虚拟机监视器。 -
vmnet
- 网络驱动。 -
vsock
- VMCI 套接字。
fuse
)。
}}
安装(从客户机)
安装依赖项:base-devel(用于编译模块),net-tools(提供 ifconfig
供安装程序调用)和 linux-headers (提供内核头文件)。
然后创建 init 目录,满足安装程序:
# for x in {0..6}; do mkdir -p /etc/init.d/rc$x.d; done
挂载安装程序:
# mount /dev/cdrom /mnt
解压(以 /root
为例):
# tar xf /mnt/VMwareTools*.tar.gz -C /root
开始安装
# perl /root/vmware-tools-distrib/vmware-install.pl
若安装时出现如下的错误,都可以安全忽略:
- VMNEXT 3 虚拟网卡
- “Warning: This script could not find mkinitrd or update-initramfs and cannot remake the initrd file!”
- 在系统中找不到 Fuse 组件
从 open-vm-tools 中拷贝并启用 vmware-vmblock-fuse
服务:
# pacman -S asp # asp checkout open-vm-tools # cp open-vm-tools/trunk/vmware-* /usr/lib/systemd/system # systemctl enable vmware-vmblock-fuse.service
重新启动虚拟机:
# systemctl reboot
登录并启动 VMware Tools:
# /etc/init.d/rc6.d/K99vmware-tools start
Xorg 配置
需要安装以下依赖:xf86-input-vmmouse,xf86-video-vmware,以及 mesa。
如果能启动至 graphical.target
那么已经接近成功了。接下来 /etc/xdg/autostart/vmware-user.desktop
会自动启动,并负责完成在虚拟机里运行 X 的必要配置。
然而如果你先启动至了 multi-user.target
,或者你的环境不太常规(比如用了多个显示器),那么你需要手动启动 vmtoolsd.service
服务。并且为了让 X server 拥有 root 权限来加载驱动,还需要编辑下面的配置:
/etc/X11/Xwrapper.config
needs_root_rights=yes
提示与技巧
通过 vmhgfs-fuse
共享目录
在菜单中选择 Edit virtual machine settings > Options > Shared Folders > Always enabled,即可建立共享目录。
在客机里运行如下命令可以列出共享目录:
$ vmware-hgfsclient
然后以如下方式挂载:
# mkdir <shared folders root directory> # vmhgfs-fuse -o allow_other -o auto_unmount .host:/<shared_folder> <shared folders root directory>
欲了解 vmhgfs-fuse
的其他挂载参数,可以用 -h
参数调用:
# vmhgfs-fuse -h
fstab
每个共享目录的挂载都需要写如下的一行配置:
/etc/fstab
.host:/<shared_folder> /home/user1/shares fuse.vmhgfs-fuse defaults 0 0
然后创建并挂载目录:
# mkdir /home/user1/shares # mount /home/user1/shares
Systemd
可以把挂载目录的命令写成 Systemd .service
:
/etc/systemd/system/<shared folders root directory>-<shared_folder>.service
[Unit] Description=Load VMware shared folders Requires=vmware-vmblock-fuse.service After=vmware-vmblock-fuse.service ConditionPathExists=.host:/<shared_folder> ConditionVirtualization=vmware [Service] Type=oneshot RemainAfterExit=yes ExecStart= ExecStart=/usr/bin/vmhgfs-fuse -o allow_other -o auto_unmount .host:/<shared_folder> <shared folders root directory> [Install] WantedBy=multi-user.target
如果客机里的 <shared folders root directory>
目录还不存在,你需要手动提前创建:
# mkdir -p <shared folders root directory>
然后激活 <shared folders root directory>-<shared_folder>.service
这个挂载服务。
删掉 <shared_folder> 的部分可以一次性挂载所有共享目录。
3D加速
3D加速功能如果在创建客户机时没有选择, 可以勾选: 编辑虚拟机设置 > 硬件 > 显示器 > 加速3D图形.
OpenGL 与 GLSL 支持
用户可以自行更新实现 OpenGL 的 GLSL 内核模块,覆盖 Arch 自带的版本。
本文成文时,OpenGL 3.3 和 GLSL 3.30 都得到了支持。参阅 https://bbs.archlinux.org/viewtopic.php?id=202713 可以了解更多细节。
时间同步
为虚拟机配置时间同步很重要,因为虚拟机比物理机更容易出现时间波动现象。主要原因就在于 CPU 是被共用的。
有两种方案可以实现实现同步:同步到宿主机,或是外部服务器。
与宿主机同步时间
保证 vmtoolsd.service
服务处于运行状态,然后用如下的命令启用时间同步功能:
# vmware-toolbox-cmd timesync enable
宿主系统休眠后,用如下的命令来使客机间同步时间:
# hwclock --hctosys --localtime
与外部服务器同步时间
参阅 NTP。
性能优化
下面这些技巧可以帮你改善虚拟机性能。
平行虚拟化 SCSI 驱动
VMware 平行虚拟化 SCSI (PVSCSI) 驱动 是为 VMware ESXi 设计的 SCSI 驱动。可以明显提升吞吐量,降低 CPU 消耗。
在虚拟机设置的 SCSI 适配器类型里可以找到 VMware 平行虚拟化
选项。
如果你在虚拟机设置里找不到这些选项,可以用这个办法:首先确保将 PVSCSI 模块添加进内核的内存盘镜像。具体的做法是修改mkinitcpio.conf
文件:
cat /etc/mkinitcpio.conf
... MODULES="... vmw_pvscsi" ...
然后重建内存盘镜像:
# mkinitcpio -p linux
将虚拟机关机,在虚拟机的 .vmx
配置文件里用如下的方法指定 SCSI 驱动:
scsi0.virtualDev = "pvscsi"
平行虚拟化网络驱动
VMware 虚拟机提供了 多种网络适配方案。默认的网卡适配器一般是e1000
,它能模拟 Intel 82545EM 千兆以太网卡。该网卡可以被常见的操作系统(含 Arch)直接支持。
若要 提升性能,并引入更多高级功能(比如多队列支持),可以考虑使用 VMware 原生的 vmxnet3
网络适配器。
正常安装的 Arch 就包含有 vmxnet3
内核模块。该模块可以通过 mkinitcpio 来启用(或者被自动加载。可以用 lsmod | grep vmxnet3
命令来验证加载成功),然后关闭虚拟机,并如下修改 .vmx 文件:
ethernet0.virtualDev = "vmxnet3"
指定更换网卡驱动之后,你还要更新网络与 dhcpcd 的设置来真正使用新网卡:
# dhcpcd new_interface_name # systemctl enable dhcpcd@new_interface_name.service
运行 ip link
命令可以找到新网卡的名字。
虚拟机设置
按照 Vmware KB1008885 给出的如下优化方法,可以减少硬盘 I/O 操作数量,但代价是提升宿主机内存占用:
mainMem.useNamedFile = "FALSE" MemTrimRate = "0" prefvmx.useRecommendedLockedMemSize = "TRUE" MemAllowAutoScaleDown = "FALSE" sched.mem.pshare.enable = "FALSE"
- mainMem.useNamedFile: 把这个参数的值设为 "FALSE" 可以让 VMware 不再创建 .vmem 文件。这样有助于减少虚拟机关机时的硬盘操作,但这么做只对 Windows 宿主系统有效。如果你的宿主系统是 Linux,建议用这个配置:mainmem.backing = "swap"。
- MemTrimRate: 这项优化会使客机释放的内存在宿主机得不到释放。
- prefvmx.useRecommendedLockedMemSize: 很遗憾,这项优化没给出什么解释。貌似会阻止宿主系统把客机系统的部分内存进行内存换页。
- MemAllowAutoScaleDown: 阻止 VMware 在申请不到内存的时候自动调整虚拟机的内存大小。
- sched.mem.pshare.enable: 如果同时有多台虚拟机运行,VMware 会尝试找到它们之间相同的内存页,并且在共享这些页。但这是个 I/O 消耗很大的操作。
下面这些配置可以在 VMware Workstation 的配置对话框里调整 (Edit -> Preferences... -> Memory/Priority)。
prefvmx.minVmMemPct = "100" mainMem.partialLazySave = "FALSE" mainMem.partialLazyRestore = "FALSE"
- prefvmx.minVmMemPct: 指定虚拟机的内存应该有多大的部分来自物理内存,单位是百分比。如果这个值设得较低,那么虚拟机可见的内存总量是可以超过物理机的物理内存的。但这就会带来大量的硬盘读写。如果你的物理内存够大的话,这个值应该维持在 100。
- mainMem.partialLazySave and mainMem.partialLazyRestore: 这两项参数的优化是为了阻止虚拟机出于休眠的目的来创建不完整内存快照。如此优化之后,虚拟机的休眠操作耗时会稍长些,但相应地也会减少硬盘读写。
故障排除
声音问题
如果虚拟机发出了恼人的巨响,那有可能是 PC 扬声器的原因。在客户机系统里禁用 PC 扬声器即可解决:
# echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf
鼠标问题
虚拟机可能会出现下列鼠标问题:
- 自动获取/失去焦点的功能可能会在鼠标箭头移入窗口时失效
- 按键无响应
- 卡顿、延迟
- 在个别软件中点击无响应
- 箭头在移入/移出虚拟机时跳跃
- 箭头会跳跃到从虚拟机移出的位置
可以先删掉软件包 xf86-input-vmmouse 试试看。
为解决鼠标箭头跳跃到从虚拟机移出的位置的问题,可以试试在 .vmx
配置文件里写入这些:
~/vmware/<Virtual Machine name>/<Virtual Machine name>.vmx
mouse.vusb.enable = "TRUE" mouse.vusb.useBasicMouse = "FALSE"
VMware 还会为游戏做自动的鼠标优化。如果这一优化产生了问题,可以在这里将其禁用:Edit > Preferences > Input > Optimize mouse for games: Never
再者,尝试在 60-libinput.conf
里禁用 catchall
事件也可能有用:
/usr/share/X11/xorg.conf.d/60-libinput.conf
#Section "InputClass" # Identifier "libinput pointer catchall" # MatchIsPointer "on" # MatchDevicePath "/dev/input/event*" # Driver "libinput" #EndSection
启动故障
启动速度慢
如果 VMware 开启了内存热扩容功能,那么有可能会出现如下错误:
- add_memory failed
- acpi_memory_enable_device() error
若要禁用内存热扩容功能,可以在 .vmx
配置文件里写入 mem.hotadd = "FALSE"
。
~/vmware/<Virtual Machine name>/<Virtual Machine name>.vmx
mem.hotadd = "FALSE"
关机/重启时卡住不动
试着降低 vmtoolsd 服务的超时阈值(默认是 90 秒):
/etc/systemd/system/vmtoolsd.service.d/timeout.conf
[Service] TimeoutStopSec=1
窗口分辨率自动适配
自动适配的意思是,当你在宿主机里缩放 VMware 窗口之后,Arch 作为客户机系统,应该自动根据主系统窗口的新尺寸来调整分辨率。
方案 1
确保在设置里开启了自动适配。
VMware Worksation 的这一设置位于:View -> Autosize -> Autofit Guest
方案 2
分辨率自动适配的功能依赖 gtkmm 和 gtk2 软件包。确保客户机里装上这两个包。如果你没安装 X,或者你使用的桌面环境不依赖 GTK(比如 KDE),那么你需要手动安装这两个包。
方案 3
通过 mkinitcpio.conf 加载以下模块:
/etc/mkinitcpio.conf
MODULES="vsock vmw_vsock_vmci_transport vmw_balloon vmw_vmci vmwgfx"
然后运行:
# mkinitcpio -p linux
再重启试试看。
拖拽与复制粘贴
拖拽与复制粘贴功能依赖 open-vm-tools 和 gtkmm 这两个包。
/etc/xdg/autostart/vmware-user.desktop
服务可能会在登录时调用程序 vmware-user-suid-wrapper,该程序需要依赖 gtkmm,但这一依赖关系未被明确声明。此问题在 FS#43159 有详述。
在 VMware Workstation 11 版上运行共享 VM
Workstation 11 有个 bug:当 Arch 客户机以共享 VM 模式运行,且启动了 vmtoolsd 服务时,vmware-hostd 会崩溃。open-vm-tools 有个补丁来绕过这一问题。
This is probably only happens to open-vm-tools. Since the vmhgfs module belongs to open-vm-tools-dkmsAUR which belongs to AUR repositiory, therefore would not get's updated automatically by the pacman -Syu
command. Always update the open-vm-tools-dkmsAUR manually before the system upgrade.
If you happened to get in to this situation, you need to remove the automount for shared file system, upgrade and do a mkinitcpio -p linux
.