Fedora 29~31 Workstation 上怎么搞 VirtualBox 虚拟机?
题外话:别再用书名号《》把英文/外文著作名、歌曲名给括起来好吗? 求您了!
麦文学:别再用书名号《》把英文/外文著作名、歌曲名给括起来好吗? 求您了!zhuanlan.zhihu.com基本上只要会敲键盘, 会点鼠标, 您就可以在 Fedora 上安装虚拟机给自己玩。
当然, 中间会有一些坑。
第一步: 安装相关的依赖文件。
su -
dnf -y install @development-tools
dnf -y install kernel-headers kernel-devel dkms elfutils-libelf-devel qt5-qtx11extras
## Fedora 31/30/29/28 ##
dnf -y reinstall binutils gcc make patch libgomp glibc-headers glibc-devel kernel-headers kernel-devel dkms qt5-qtx11extras libxkbcommon
## CentOS/RHEL 8 ##
dnf -y reinstall binutils gcc make patch libgomp glibc-headers glibc-devel kernel-headers kernel-devel dkms
## CentOS/RHEL 7 ##
yum -y reinstall binutils gcc make patch libgomp glibc-headers glibc-devel kernel-headers kernel-devel dkms
** 注意 reinstall 有某种程度的破坏性
No match for argument: compat-libvpx5
Error: Unable to find a match: compat-libvpx5
# dnf install libvpx-utils* -y
Package libvpx-utils-1.8.2-2.fc32.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
第二步: 增加一个安装源
您可以生成、编辑、修改 /etc/yum.repos.d/virtualbox.repo, 它的内容如下
$ cat /etc/yum.repos.d/virtualbox.repo
[virtualbox]
name=Fedora - - VirtualBox
baseurl=http://download.virtualbox.org/virtualbox/rpm/fedora/29/$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://www.virtualbox.org/download/oracle_vbox.asc
简洁的方法是
cat <<EOF |tee /etc/yum.repos.d/virtualbox.repo
[virtualbox]
name=Fedora $releasever - $basearch - VirtualBox
baseurl=http://download.virtualbox.org/virtualbox/rpm/fedora/29/$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://www.virtualbox.org/download/oracle_vbox.asc
EOF
也可以酱紫
cd /etc/yum.repos.d/
wget http://download.virtualbox.org/virtualbox/rpm/fedora/virtualbox.repo
dnf update
yum update
第三步 引入/导入 GPG KEY
dnf search virtualbox
Fedora - - VirtualBox 159 B/s | 181 B 00:01
Fedora - - VirtualBox 835 B/s | 1.7 kB 00:02
Importing GPG key 。。。
From : https://www.virtualbox.org/download/oracle_vbox.asc
Is this ok [y/N]: y
第四步 才是安装 VIRTUAL BOX
dnf -y install VirtualBox-6.1
or
dnf -y install VirtualBox
Last metadata expiration check: 1:32:18 ago on Sun 28 Jun 2020 06:30:52 PM PDT.
Dependencies resolved.
=================================================================================================================================================================
Package Architecture Version Repository Size
=================================================================================================================================================================
Installing:
VirtualBox x86_64 6.1.10-4.fc31 rpmfusion-free-updates 21 M
Installing dependencies:
VirtualBox-kmodsrc noarch 6.1.10-4.fc31 rpmfusion-free-updates 861 k
VirtualBox-server x86_64 6.1.10-4.fc31 rpmfusion-free-updates 19 M
akmod-VirtualBox x86_64 6.1.10-1.fc31 rpmfusion-free-updates 21 k
akmods noarch 0.5.6-24.fc31 updates 23 k
Transaction Summary
=================================================================================================================================================================
Install 5 Packages
Total download size: 40 M
Installed size: 112 M
Downloading Packages:
(1/5): akmods-0.5.6-24.fc31.noarch.rpm 51 kB/s | 23 kB 00:00
(2/5): akmod-VirtualBox-6.1.10-1.fc31.x86_64.rpm 35 kB/s | 21 kB 00:00
(3/5): VirtualBox-kmodsrc-6.1.10-4.fc31.noarch.rpm 1.0 MB/s | 861 kB 00:00
(4/5): VirtualBox-server-6.1.10-4.fc31.x86_64.rpm 876 kB/s | 19 MB 00:22
(5/5): VirtualBox-6.1.10-4.fc31.x86_64.rpm 582 kB/s | 21 MB 00:36
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 1.1 MB/s | 40 MB 00:37
Running transaction check
Transaction check succeeded.
第五步 把自己/用户加入用户组
$ sudo usermod -a -G vboxusers $USER
$ newgrp vboxusers
$ id $USER
uid=1000(laomai) gid=1000(laomai) groups=1000(laomai),954(vboxusers)
第六步 试运行 VIRTUAL BOX. 为啥说试运行呢, 因为这里一般就会踩进坑了。
$ virtualbox
第七步 发现问题:
“There were problems setting up VirtualBox. To re-start the set-up process, run /sbin/vboxconfig as root. If your system is using EFI Secure Boot you may need to sign the kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load them. Please see your Linux system's documentation for more information.”
There were problems setting up VirtualBox. To re-start the set-up process, run
/sbin/vboxconfig as root. If your system is using EFI Secure Boot you may need to sign the
kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load
them. Please see your Linux system's documentation for more information.
大部分人可能会发现 VIRTUAL BOX 弹出这样的警告, 然后终止运行。
填坑:
为了让VirtualBox运行, 您可以简单地在电脑主板(硬件,启动后按 DEL 等)设置里禁用UEFI “安全启动”,回到主板 BIOS 设置里面关闭 SECURE BOOT,或者您需要做以下步骤。
创建个人公钥/私钥(RSA密钥对)来签署内核模块。选择将“密钥对”存储在 /root/module-signing/ 目录下。
su -
mkdir /root/module-signing
cd /root/module-signing
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=YOUR_NAME/"
chmod 600 MOK.priv
用 mokutil 工具导入或删除机器所有者密钥(MOK),即公钥,这会在机器硬件重启时注册。这一步的密码是一个临时密码,但是您最好使用最容易记的密码。
mokutil --import /root/module-signing/MOK.der
input password:
input password again:
重新启动机器。当启动加载器启动时,你应该看到一个屏幕,
要求你按一个按钮进入MOK管理器EFI实用程序。
在第一个菜单中选择Enroll MOK,然后继续,
然后选择Yes来注册密钥,并重新输入您自己选择过的“最容易记忆” 的密码。然后选择 "确定 "继续系统启动。未来的内核更新需要对更新后的内核重新签名,最好是做笔记或自己编个批处理,方便以后运行。
#!/bin/bash
for modfile in $(dirname $(modinfo -n vboxdrv))/*.ko; do
echo "Signing $modfile"
/usr/src/kernels/5.6.16-200.fc31.x86_64/scripts/sign-file sha256
/root/module-signing/MOK.priv
/root/module-signing/MOK.der "$modfile"
done
su -
cd /root/module-signing
chmod 700 /root/module-signing/sign-vbox-modules
./sign-vbox-modules
留意 “/scripts/sign-file” 所在的地方。 不同的 版本/DISTRO 会有不同的设置。
FEDORA 里面 “sign-file ” 是放在和 DEBIAN 不同的目录,这是复制粘贴的初学者(例如俺自己)容易被坑的地方。
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VirtualBox/"
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxnetadp)
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxnetflt)
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxpci)
sudo mokutil --import MOK.der
** FOR UBUNTU
/sbin/vboxconfig
dnf -y install mokutil
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VirtualBox/"
/usr/src/kernels/5.6.16-200.fc31.x86_64/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)
mokutil --import MOK.der
reboot
/usr/src/kernels/5.6.19-200.fc31.x86_64/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)
mokutil --import MOK.der
reboot
modprobe vboxdrv
基本上做完这一步, 就可以了。
/
随想、笔记及其他:
有时候坑是来自不同的 repo
Virtual Box repo 和 RPM Fusion repo 装出来的东西未必是一样的。 尽管俺用 RPM Fusion repo 也没问题。
modprobe vboxdrv
modprobe vboxnetadp
modprobe vboxnetflt
modprobe vboxpci
当安装了另一个内核时( 更新时经常发生 ),而这个内核还没有包含 vboxdrv 模块。所以必须重新编译安装这个模块到新内核上。始终要记得 EFI BIOS SECURE BOOT 这一茬, 要不就老老实实用证书签名, 要不就进入主板的设置关闭 SECURE BOOT 。
sudo /sbin/rcvboxdrv setup
OR
/sbin/rcvboxdrv setup
如果没有正确配置, 可能会得到类似这样的结果
# modprobe vboxdrv
modprobe: FATAL: Module vboxdrv not found in directory /lib/modules/5.8.0-0.rc3.1.fc33.x86_64
# modprobe vboxnetadp
modprobe: FATAL: Module vboxnetadp not found in directory /lib/modules/5.8.0-0.rc3.1.fc33.x86_64
# modprobe vboxnetflt
modprobe: FATAL: Module vboxnetflt not found in directory /lib/modules/5.8.0-0.rc3.1.fc33.x86_64
# modprobe vboxpci
modprobe: FATAL: Module vboxpci not found in directory /lib/modules/5.8.0-0.rc3.1.fc33.x86_64
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VirtualBox/"
export KBUILD_SIGN_PIN='YOUR_PASSWORD'
/usr/src/kernels/5.6.16-200.fc31.x86_64/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)
/usr/src/kernels/5.6.16-200.fc31.x86_64/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxnetadp)
/usr/src/kernels/5.6.16-200.fc31.x86_64/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxnetflt)
/usr/src/kernels/5.6.16-200.fc31.x86_64/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxpci)
mokutil --import MOK.der
**
/usr/src/kernels/$(uname -r)/scripts/sign-file --help
** 这两个是等效的
/usr/src/kernels/`uname -r`/scripts/sign-file --help
**注意这个撇号不一样
/usr/src/kernels/`uname -r`/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)
/usr/src/kernels/`uname -r`/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxnetadp)
/usr/src/kernels/`uname -r`/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxnetflt)
/usr/src/kernels/`uname -r`/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxpci)
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VirtualBox/"
export KBUILD_SIGN_PIN='YOUR_PASSWORD'
/usr/src/kernels/5.6.16-200.fc31.x86_64/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)
/usr/src/kernels/5.6.16-200.fc31.x86_64/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxnetadp)
/usr/src/kernels/5.6.16-200.fc31.x86_64/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxnetflt)
/usr/src/kernels/5.6.16-200.fc31.x86_64/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxpci)
mokutil --import MOK.der
sudo /sbin/vboxconfig
sudo /sbin/rcvboxdrv setup
/sbin/vboxconfig
/sbin/rcvboxdrv setup
# /usr/lib64/virtualbox/VBoxSysInfo.sh
Distribution: Fedora | Version: 32 | Kernel: Linux version 5.8.0-0.rc3.1.fc33.x86_64 (gcc (GCC) 10.1.1 20200618 (Red Hat 10.1.1-2), GNU ld version 2.34.0.20200522) #1 SMP Mon Jun 29 20:50:09 UTC 2020
# /usr/lib64/virtualbox/VBoxSysInfo.sh
Distribution: Fedora | Version: 32 | Kernel: Linux version 5.8.0-0.rc3.1.fc33.x86_64 (gcc (GCC) 10.1.1 20200618 (Red Hat 10.1.1-2), GNU ld version 2.34.0.20200522) #1 SMP Mon Jun 29 20:50:09 UTC 2020
# find / -name "vbox*" |grep drv
/etc/systemd/system/multi-user.target.wants/vboxdrv.service
/usr/lib/systemd/system/vboxdrv.service
/usr/lib/modules/5.7.0-0.rc3.20200501gitc45e8bccecaf.1.fc33.x86_64+debug/weak-updates/VirtualBox/vboxdrv.ko
/usr/lib/modules/5.7.0-0.rc6.20200519git642b151f45dd.1.fc33.x86_64/extra/VirtualBox/vboxdrv.ko
/usr/lib/modules/5.7.0-0.rc6.20200519git642b151f45dd.1.fc33.x86_64/weak-updates/VirtualBox/vboxdrv.ko
/usr/lib/modules/5.7.0-0.rc6.20200519git642b151f45dd.1.fc33.x86_64+debug/weak-updates/VirtualBox/vboxdrv.ko
rpm -qa kernel |sort -V |tail -n 1
uname -r
/usr/src/linux-headers-$(uname -r)/scripts/sign-file --help
/usr/src/linux-headers-`uname -r`/scripts/sign-file --help
**注意这个撇号不一样
/usr/src/kernels/$(uname -r)/scripts/sign-file --help
** 这两个是等效的
/usr/src/kernels/`uname -r`/scripts/sign-file --help
**注意这个撇号不一样
# /usr/src/kernels/`uname -r`/scripts/sign-file --help
/usr/src/kernels/5.8.0-0.rc3.1.fc33.x86_64/scripts/sign-file: invalid option -- '-'
Usage: scripts/sign-file [-dp] <hash algo> <key> <x509> <module> [<dest>]
scripts/sign-file -s <raw sig> <hash algo> <x509> <module> [<dest>]
KERN_DIR=/usr/src/kernels/`uname -r`
export KERN_DIR
KERN_DIR=/usr/src/kernels/`uname -r`-`uname -m`
题外话:
FC29 能正常安装 eclipse-cdt .
FC31 能正常使用 VirtualBox 6.1.
创建个人公钥/私钥(RSA密钥对)来签署内核模块。这是安装 NVIDIA 的私家显卡驱动也要做的事情, 特别是您忘记回到主板 BIOS 设置里面关闭 SECURE BOOT 的时候。 很多人包括俺自己安装不了 NVIDIA 的私家显卡驱动就是不愿意回到主板 BIOS 设置里面关闭 SECURE BOOT 。
麦文学:别再用书名号《》把英文/外文著作名、歌曲名给括起来好吗? 求您了!zhuanlan.zhihu.com【未完待续】