VirtualBox/在虚拟机中安装 Arch Linux
本文介绍如何在 VirtualBox 中安装 Arch linux。
在虚拟机的虚拟光驱里加载 Arch Linux 的安装镜像,然后按照安装指南里的步骤继续即可。
如果你想在 VirtualBox 里以 EFI 模式安装 Arch Linux,这需要在虚拟机的设置窗口里,先从左侧选择 System,再从右侧选择 Motherboard 标签页,最后勾选 Enable EFI (special OSes only) 选项。从安装镜像的启动菜单里选好 Arch Linux 的内核之后,这时启动过程要卡顿一两分钟,之后就能正常进入系统,稍安勿躁。
等系统和启动引导程序安装成功之后,VirtualBox 会首先尝试从 ESP 加载 /EFI/BOOT/BOOTX64.EFI。如果这个首选的文件加载失败,VirtualBox 会从 ESP 根目录尝试加载 EFI shell 脚本 startup.nsh。这样来说,为了能顺利进入系统,你需要从下面几种方案选一个:
- 每次都从 EFI shell 手动选择启动引导程序
- 把启动引导程序的 .EFI 文件移动到默认位置:
/EFI/BOOT/BOOTX64.EFI - 自己编写 ESP 分区的
/startup.nsh脚本,用这个脚本加载想使用的引导程序(例如\EFI\grub\grubx64.efi) - 从 ESP 分区的 startup.nsh 脚本直接启动到 Linux
虽然 VirtualBox 支持按 F2 进入自带的 VirtualBox Boot Manager 来管理 EFI 启动过程,但这部分功能还不完整而且有 bug。它还不能持久保存交互式设置的 EFI 变量。也就是说,开机时按下 F12 之后手动添加的、或者用 efibootmgr包 添加的 EFI 项目,重启后依然可以生效,但关机之后就会失效。
另见:UEFI VirtualBox installation boot problems.
VirtualBox 客体机插件为客体系统提供了必要的驱动与应用软件,其作用包括改善图像分辨率与鼠标支持等。在客体机的 Arch Linux 系统里:
- 若需要支持 X,安装 virtualbox-guest-utils包
- 若不需支持 X,安装 virtualbox-guest-utils-nox包
- 另一个安装方案是从宿主机(如果也是 Arch 系统)安装 virtualbox-guest-iso包,这个软件包里有供客体机安装插件的 ISO 文件。装好这个包之后,启动客体机,点击菜单项目 Devices -> Insert Guest Additions CD Image 即可加载安装镜像。
- 若要手动重新编译客体机的 VirtualBox 内核模块,以 root 权限运行
rcvboxadd setup即可。
客体机里运行的插件和主体机上的 VirtualBox 程序版本需要匹配。否则某些功能(比如剪贴板互通)可能会失效。如果你在客体机里升级系统(比如运行了 pacman -Syu),那么宿主机上的 VirtualBox 也要跟进更新到最新版。VirtualBox GUI 菜单里的 "Check for updates" 功能未必够用,可以去官网 VirtualBox.org 再看看。
若要开机自动加载模块,启用 vboxservice.service 服务即可。该服务还能起到将客户机时间与宿主机同步的功能。
若要手动加载模块,使用这个命令:
# modprobe -a vboxguest vboxsf vboxvideo
安装并加载了 VirtualBox 内核模块之后,如果你在虚拟机系统里使用 X,那么推荐启动这样一个客体机服务:服务的程序名字叫 VBoxClient,它与 X 窗口系统沟通来实现其功能。具体功能包括:
- 在宿主机与客体机之间互通剪贴板,实现鼠标拖拽文件
- 无缝窗口模式
- 宿主机的虚拟机窗口缩放之后,使客体机的显示分辨率与之自动匹配
- 检查宿主机的 VirtualBox 的版本
上述功能由专门的命令行参数来各自启用:
$ VBoxClient --clipboard --draganddrop --seamless --display --checkhostversion
为了方便,VBoxClient-all 这个 shell 脚本能取代上面这一整行命令。
virtualbox-guest-utils包 包提供了 XDG 自启动项目 /etc/xdg/autostart/vboxclient.desktop,这会在登录 X 时自动运行 VBoxClient-all。然而,如果你在用的桌面环境或窗口管理器不支持 XDG 自启动,那么你就需要手动配置。详见自动启动#桌面环境。
至此,你的 Arch Linux 应该能在虚拟机里正常运行了。需要指出的是,某些功能(如剪贴板互通)在 VirtualBox 里是默认禁用的。这需要在各个虚拟机的设置选项里手动开启(Settings > General > Advanced > Shared Clipboard)。
从 VirtualBox 选项里可以开启显卡加速。已知 GDM 显示管理器从 3.16 版本起会导致显卡加速失效。[1] 如果你遇到类似问题,可以换另一种显示管理器(比如 LightDM)试试看。[2] [3]
共享目录的设置在宿主机这边操作。启动 VirtualBox 的图形管理界面,在虚拟机的设置界面的 Shared Folders 标签页可以找到相关设置。可以设置的项目包括:目录在宿主机的位置 Folder Path,客户机挂载点的名字 Folder name,还有 Read-only,Auto-mount, Make permanent 等杂项。还有一种管理方法是使用 VBoxManage。详情可以参阅 VirtualBox 手册。
无论用哪一种方法来挂载共享目录,首先都要做些准备工作。
为了避免出现 /sbin/mount.vboxsf: mounting failed with the error: No such device 这种错误,首先要确保 vboxsf 内核模块已经加载。只要按照前面的步骤在加载客体机里加载内核模块,这一步应该没问题。
为了让挂载之后的目录能让 root 之外的用户也直接读写,还要:
- 安装 virtualbox-guest-utils包 软件包时会创建用户组
vboxsf(在前面的步骤就装过了) - 你的用户需要加入到
vboxsf用户组
在 Arch Linux 客体系统里挂载共享目录的命令是:
# mount -t vboxsf <共享目录的名字> <客户机系统的挂载点>
这个命令可以查看 vboxsf 的挂载参数:
# mount.vboxsf
假如用户不在 vboxsf 组里,用这个命令可以把挂载点的读写权限授权给他:
# mount -t vboxsf -o uid=1000,gid=1000 home /mnt/
其中 uid 和 gid 的值要与接受授权的用户的值相对应。用 id 命令可以为该用户找到这两个值。
vboxservice 服务才能生效为使用自动挂载功能,首先需要在 GUI 的管理界面里勾选自动挂载,或者为命令行工具 VBoxManage sharedfolder 加上参数 --automount。
此时,共享目录应该已经在 /media/sf_<共享目录的名字> 挂载上了。如果用户没有读写权限,确认一下该目录的权限是否是 755。如果是 750 的话,确保该目录属于 vboxsf 组。
可以用软链接把共享目录链接到方便的位置,这样就不必进入那么远的目录了:
$ ln -s /media/sf_共享目录的名字 ~/my_documents
fstab 可以用来挂载目录。然而,为了避免 Systemd 启动可能带来的问题,要在 /etc/fstab 配置里为共享目录加上挂载选项 noauto,x-systemd.automount。这样,共享目录会在开机后初次访问时挂载,而不是在系统启动过程里挂载。这可以避免 Systemd 在客体机插件加载之前就按 fstab 挂载目录而导致的出错。
sharedFolderName /path/to/mntPtOnGuestMachine vboxsf uid=user,gid=group,rw,dmode=700,fmode=600,noauto,x-systemd.automount
-
sharedFolderName: 在虚拟机设置界面 Settings > SharedFolders > Edit > FolderName 里所设置的值。这个值和宿主机里实际的目录名可以不相同。要查看虚拟机的设置,在宿主机的 VirtualBox GUI 管理界面选中虚拟机,然后点击工具栏的 Settings 按钮,再从弹出的对话框里选择 Shared Folders。 -
/path/to/mntPtOnGuestMachine: 如果这个路径在虚拟机里还不存在,那么需要在挂载之前手动创建(用 mkdir 就可以)。 -
dmode/fmode分别用来指定挂载共享目录之后,下面的子目录与文件的属性。
mount.vboxsf 尚不支持 nofail 挂载参数:
desktop /media/desktop vboxsf uid=user,gid=group,rw,dmode=700,fmode=600,nofail 0 0
在虚拟机设置的 Network 标签页 -> 右侧打开 Advanced 折叠 -> 单击 Port Forwarding 按钮,可以设置端口。
假如我们设置了将宿主机的 3022 端口转发到客体机的 22 端口。然后在宿主机执行:
user@host$ ssh -p 3022 $USER@localhost
即可 SSH 登录客体机。
配置好了端口转发,再装上 SSHFS,只要在宿主机运行这个命令就可以把客体机的目录挂载到宿主机:
user@host$ sshfs -p 3022 $USER@localhost:$HOME ~/shared_folder
这样也能实现互传文件。
在主机上的VirtualBox管理器中,将显示比例设置为2.00或3.00。
出现这一问题的原因是驱动程序缺失或有错。例如:[4] 或 [5]。试试从菜单项 Settings > Display 里关闭 3D 加速,并确认要用的 Xorg 驱动都已装好。
在某些窗口管理器(i3, awesome)下运行 VirtualBox 时,由于顶层状态栏(overlay bar)的问题,VirtualBox 的全屏模式会出现问题。试试在菜单项 "Guest Settings > User Interface > Mini ToolBar" 里禁用 "Show in Full-screen/Seamless" 有可能绕过这一问题。详情可见上游的问题汇报。
如果屏幕是在某个大小之后开始黑屏,例如大于 2048 像素宽度时,请尝试增加 Settings > Display > Screen > Video Memory。
在 VirtualBox 里运行时,Linux 内核的 AC97 声卡驱动偶尔会猜错时钟频率设定。这就会造成声音播放速度太慢 / 太快。在 /etc/modprobe.d 目录里创建一个内容如下的文件即可解决:
options snd-intel8x0 ac97_clock=48000
在某些情况下,音频可能会出现延迟性能问题(例如在在线视频流媒体中音频与视频不同步)。一个可能的解决方法是在VirtualBox中使用Intel HD音频控制器,并通过在客户操作系统的/etc/modprobe.d/ 目录下的文件中添加以下行来禁用其节能功能:
options snd_hda_intel power_save=0 power_save_controller=N
如果在安装 Arch 系统时,还没有启动至新安装到虚拟盘的系统,就用 pactrap 直接安装客体机插件,需要以 root 身份运行一次 umount -l /mnt/dev 然后再次运行 pactrap。否则新装的系统就不可用。
为了能在 Windows 宿主机上读取 RAW 格式的 VMDK 镜像,VirtualBox GUI 需要以管理员权限启动。
virtualbox-guest-utils包 包的版本5.2.16-2缺少文件VBoxEGL.so. 这导致Arch Linux虚拟机无法正常使用3D加速。请参阅 FS#49752.
为了解决这个问题,请按照FS#49752#comment152254中提供的补丁集进行修复。需要对补丁集进行一些修复,以使其适用于版本5.2.16-2。
See KDE#Cannot change screen resolution when running in a virtual machine.
如果您使用的是 plasma-desktop 最小安装,而不是 plasma (包含Wayland支持), 那么在启动Plasma-X11会话后,可能会出现黑屏但有光标的情况。
要解决此问题,请在VirtualBox窗口中多次调整虚拟机窗口大小,然后通过以下方式手动设置分辨率。
View -> Virtual Screen 1 -> Resize to 1024x768 (or other resolution you like)
Open in KDE launcher System Settings -> Startup and Shutdown -> Background Services, stop and unselect KScreen2 and save settings. Issue should go away forever