Fedora38にVirtualBoxをインストールする

Fedora38にVirtualBoxをインストールする

2023.07.08

バックグラウンド

私のコンピュータは Fedora38 システムを使用していますが、何らかの理由で他のオペレーティング システムを使用する必要があります。仮想マシンを介して他のシステムをインストールすることが最良の選択です。Linux システムでは、VirtualBox が比較的よく知られた仮想マシン ソフトウェアですが、VirtualBox Fedora システムのサポートは現在 Fedora36 のみをサポートしており、現在 Fedora はすでに Fedora38 バージョンをリリースしています。私のコンピュータは Fedora38 システムを使用しているので、かなり苦労しました。

環境

オペレーティング システム: Fedora Linux 38 (ワークステーション エディション)

CPU:第11世代インテル® Core™ i5-11300H × 8

ソフトウェアをダウンロードする

VirtualBox: VirtualBox 7.0.8

VirtualBox は Fedora システムの上位バージョンをサポートしなくなったため、一部の RMP ソースをインポートするのが面倒で、VirtualBox 公式 Web サイトでは「すべてのディストリビューション (EL6 でビルドされているため、最新のシステム ライブラリは必要ありません)」バージョンが提供されているため、このバージョンをインストールすることにしました。次の図に示すように、公式 Web サイトでダウンロード インターフェイスを見つけ、[すべてのディストリビューション] を選択し、マウスを右クリックして [名前を付けてリンクを保存] ボタンを選択します。
ここに画像の説明を挿入

ボタンをクリックすると、次の図に示すように、保存インターフェイスがポップアップ表示されます。
ここに画像の説明を挿入

名前を sh 接尾辞に変更します。パソコンに保存するとデフォルトの拡張子がtxtになっていて慣れないので変更しなくても大丈夫ですが、結局実行形式のプログラムなので拡張子shに変更しました。

インストール

ダウンロード後、実行権限を追加し、ダウンロードしたソフトウェアをrootユーザーで実行し、直接インストールします。

[root@fedora 下载]# chmod +x VirtualBox-7.0.8-156879-Linux_amd64.sh 
[root@fedora 下载]# ./VirtualBox-7.0.8-156879-Linux_amd64.sh 
Verifying archive integrity...  100%   MD5 checksums are OK. All good.
Uncompressing VirtualBox for Linux installation  100%  
VirtualBox Version 7.0.8 r156879 (2023-04-17T17:29:53Z) installer
Removing previous installation of VirtualBox 7.0.6 r155176 from /opt/VirtualBox
Installing VirtualBox to /opt/VirtualBox
  warnings.warn(
/usr/lib/python3.11/site-packages/setuptools/command/easy_install.py:144: EasyInstallDeprecationWarning: easy_install command is deprecated. Use build and pip and other standards-based tools.
  warnings.warn(
zip_safe flag not set; analyzing archive contents...
vboxdrv.sh: failed: modprobe vboxdrv failed. Please use 'dmesg' to find out why.

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.

VirtualBox has been installed successfully.

ご覧のとおり、これは /opt/VirualBox ディレクトリにインストールされており、以前にインストールされたバージョンはインストール前にアンインストールされます (以前にバージョン 7.0.6 をインストールしたため)。ただし、modprobe vboxdrv の実行が失敗したこともわかり、後でプロンプトも表示されます。システムが EFI セキュア ブートを使用している場合は、カーネル モジュール (vboxdrv、vboxnetflt、vboxnetadp、vboxpci) に署名する必要がある場合があります。私のコンピュータだけが EFI セキュア ブートなので、このプロンプトが表示されます。解決策は 2 つあります。セキュア ブートをオフにするか、自己署名証明書を使用してロードするカーネル モジュールに署名します。カーネルモジュールの署名には触れたことがなかったので、挑戦してみたいと思います。

この時点で、VirtualBox アイコンはすでにコンピューター メニューに表示されており、開くこともできますが、仮想マシンは正常に実行できないため、上記のエラーを解決する必要があります。

自己署名証明書を使用してカーネル モジュールに署名する

ただ、残念ながらトスをしているときは記録するつもりはなかったので、具体的な手順は詳しく記録せず、写真も撮りませんでした。ただし、この記事を書いているときにインターネットからいくつかの情報を検索したところ、当時私があれこれ考えていた内容と非常によく似ていたため、内容の一部はインターネットから直接盗用したものです。セキュア ブート (セキュア ブート) をサポートするための Fedora での Nvidia ドライバー カーネル モジュールの完全自動署名 _mokutil_KylinDemons. ブログ - CSDN ブログこの記事には、より詳しい手順が記載されています。メインステップを盗みました。侵害がある場合は、私に連絡してください。削除します。

Mok ツールと鍵生成ツールをインストールする

dnf install mokutil openssl

自己署名証明書とキーを生成する

sudo openssl req -new -x509 -newkey rsa:2048 -keyout ~/my_private_key.key -outform DER -out ~/my_private_key.der -nodes -days 36500 -subj "/CN=Private Driver Signing"

自己署名キーをBIOSに登録する

インポート後、Linux カーネルは自己署名キーで署名されたソフトウェアを信頼します。コマンドは次のとおりです。

sudo mokutil --import ~/my_private_key.der

このコマンドを実行すると、コンソールでパスワードの設定を求められます。このパスワードは、自己署名自己署名キーのインポートと登録に使用されます。手順 6 で 1 回だけ使用されます。合理的に設定できます。8文字が推奨されます。

コンピュータを再起動します

sudo reboot

自己署名キーをインポートして登録する

再起動すると、システムが起動する前に青いインターフェイス ( 「MOK Manager」というタイトル) が表示されます。セキュア ブートで Ubuntu をインストールしたことがある方はご存知かもしれません。以下のオプションに従ってキーをインポートします。

注: 以下の手順は注意してください。手順を誤った場合は、手順 4 からやり直す必要があります。

  1. 以下の図に示すように、矢印キーを使用して「MOK の登録」を選択します。IOCに登録する

  2. 次の図に示すように、[続行] を選択します。

  3. 次の図に示すように、「はい」を選択します。

    はい

  4. このステップでは、次の図に示すように、以前に設定したパスワードを入力して Enter キーを押します (入力プロセス中にパスワードは表示されません)。

    パスワードを入力して Enter キーを押します

  5. 成功したら、次の図に示すように、[再起動] を選択します。

    リブート

  6. この時点で、コンピュータは再び再起動し、システムに入るのを待ちます。

自己署名証明書を使用して VirtualBox 関連のカーネル モジュールを登録する

VirtualBox をインストールすると、そのカーネル モジュールは通常、現在のカーネル バージョンが配置されているディレクトリにインストールされます。次のコマンドを使用して表示できます。

[root@fedora 下载]# ls -l /lib/modules/$(uname -r)/misc
总计 5220
-rw-r--r--. 1 root root 3950220 6月29日 21:25 vboxdrv.ko
-rw-r--r--. 1 root root 504708 6月29日 21:25 vboxnetadp.ko
-rw-r--r--. 1 root root 884388 6月29日 21:25 vboxnetflt.ko

カーネル モジュールを登録するコマンドは次のとおりです: /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 xxxx.priv xxx.der file_path vboxdrv.ko モジュールを登録するコマンドは次のとおりです。

/usr/src/kernels/6.3.11-200.fc38.x86_64/scripts/sign-file sha256 ~/my_private_key.key ~/my_private_key.der /lib/modules/6.3.11-200.fc38.x86_64/misc/vboxdrv.ko 

上記のパスは私のコンピュータ内のパスです。詳細については、お使いのカーネルのバージョンを参照してください。インターネットから a.sh という名前のスクリプトを見つけました。スクリプトの内容は次のとおりです。

[root@fedora zy]# cat a.sh 
#!/bin/bash

for modfile in $(dirname $(modinfo -n vboxdrv))/*.ko; do
  echo "Signing $modfile"
  /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 \
                                ~/my_private_key.priv \
                                ~/my_private_key.der "$modfile"
done

my_private_key.priv および my_private_key.der の名前とパスについては、自分で生成したものを参照してください。このスクリプトを実行すると、次の結果が表示されます。

[root@fedora 下载]# ./a.sh 
Signing /lib/modules/6.3.8-200.fc38.x86_64/misc/vboxdrv.ko
Signing /lib/modules/6.3.8-200.fc38.x86_64/misc/vboxnetadp.ko
Signing /lib/modules/6.3.8-200.fc38.x86_64/misc/vboxnetflt.ko

これは、virtualbox カーネル モジュールが正常に登録されたことを意味しており、この時点でカーネルはこれらの ko モジュールを信頼しており、これらのカーネル モジュールは正常にロードできます。次のコマンドを実行して、これらのカーネル モジュールをロードします。

[root@fedora 下载]# modprobe vboxdrv
[root@fedora 下载]# modprobe vboxnetadp
[root@fedora 下载]# modprobe vboxnetflt

この時点で、通常の状況では、VirtualBox は正常に使用できます。

再起動後に VirtualBox カーネル モジュールを自動的にロードする

modprobe によってロードされた上記のカーネルは、システムの再起動後に無効になり、これらのカーネル モジュールはシステムの再起動後に自動的にロードされません。システムの起動時に Linux カーネルにこれらのカーネル モジュールを自動的にロードさせる方法は数多くありますが、オペレーティング システムによっても異なる場合があります。私は /etc/modules-load.d/ ディレクトリに設定ファイルを作成する方法を使用しました。 modules.conf ファイルを自分で作成しました。ファイル名は他のものでも構いません。自分の好みに応じて名前を付けることができます。内容は各カーネル モジュールの名前です (実際には、これは modprobe コマンドに渡されるパラメータです)。内容は次のとおりです。

[root@fedora zy]# cat /etc/modules-load.d/modules.conf 
vboxdrv
vboxguest
vboxnetadp
vboxnetflt
vboxsf
vboxvideo

このようにして、システムの再起動後、Linux カーネルはこれらのカーネル モジュールを自動的にロードします。

遭遇した問題

仮想マシンを起動できません。20% で止まっています。

次の図に示すように、仮想マシンを構成した後、仮想マシンを起動できず、20% で停止します。
ここに画像の説明を挿入

ネット上で調べた理由としては、Intel プロセッサの背後に ibt 関数が追加されて競合が発生している可能性がありますが、どの世代の CPU から起動しているのかは不明であり、詳しくは調べていません。 grub のパラメータ ibt= off で完了します。/etc/default/grub の GRUB_CMDLINE_LINUX に ibt=off 設定を追加します。具体的な操作は次のとおりです。

[root@fedora 下载]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="resume=UUID=4219809e-7b8f-4f6a-bab6-1450bb3ecf7e rhgb quiet ibt=off"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

[root@fedora 下载]# cp /etc/default/grub /etc/default/grub.bak
[root@fedora 下载]# vi /etc/default/grub
[root@fedora 下载]# 
[root@fedora 下载]# ls /boot/grub2/
fonts/ grub.cfg grubenv  
[root@fedora 下载]# cat /proc/cmdline 
BOOT_IMAGE=(hd0,gpt2)/vmlinuz-6.3.11-200.fc38.x86_64 root=UUID=debb2e87-b92f-4f5c-a8b7-8ed0e0689167 ro resume=UUID=4219809e-7b8f-4f6a-bab6-1450bb3ecf7e rhgb quiet
[root@fedora 下载]# cp /boot/grub2/
fonts/ grub.cfg grubenv  
[root@fedora 下载]# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
[root@fedora 下载]# grub2-mk
grub2-mkconfig grub2-mkimage grub2-mknetdir grub2-mkrelpath grub2-mkstandalone  
grub2-mkfont grub2-mklayout grub2-mkpasswd-pbkdf2 grub2-mkrescue  
[root@fedora 下载]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Adding boot menu entry for UEFI Firmware Settings ...
done

オペレーティングシステムを再起動するだけです。

すでに VirtualBox をインストールし、しばらく使用していましたが、カーネルのバージョンをアップグレードした後、再び開くことができないことがわかりました。

VirtualBox ソフトウェアは正常に開くことができますが、仮想マシンを正常に実行できません。仮想マシンを実行すると、次のエラーが表示されます。
ここに画像の説明を挿入

通常の状況では、/sbin/vboxconfig を実行するだけで十分ですが、私のコンピュータでは、/sbin/vboxconfig を実行すると次のエラーが報告されます。

[root@fedora 下载]# /sbin/vboxconfig 
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: You must sign these kernel modules before using VirtualBox:
  vboxdrv vboxnetflt vboxnetadp
See the documentation for your Linux distribution..
vboxdrv.sh: Building VirtualBox kernel modules.

vboxdrv.sh: Signing VirtualBox kernel modules.
vboxdrv.sh: failed: modprobe vboxdrv failed. Please use 'dmesg' to find out why.

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.

私のコンピューターは EFI セキュア ブートであり、virtualbox の ko が署名されていないため、ドライバーをロードできないため、プロンプト情報はすでに明らかです。したがって、前の a.sh スクリプトを使用して再度実行し、VirtualBox のカーネル モジュールを再登録し、実行後に /sbin/vboxconfig コマンドの実行を続行しても、プロンプトは次のとおりです。

[root@fedora zy]# /sbin/vboxconfig
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: You must sign these kernel modules before using VirtualBox:
  vboxdrv vboxnetflt vboxnetadp
See the documentation for your Linux distribution..
vboxdrv.sh: Building VirtualBox kernel modules.
egrep: warning: egrep is obsolescent; using grep -E
vboxdrv.sh: failed: Look at /var/log/vbox-setup.log to find out what went wrong.

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.

少し混乱しています。何が起こっているのかわかりません。カーネル モジュールを再登録し、 /sbin/vboxconfig コマンドを再度実行しても、やはりエラーが表示され、無限ループに陥ります。考えた結果、/sbin/vboxconfig を実行し、a.sh を使用してカーネル モジュールを登録した後、/sbin/vboxconfig モジュールを実行するのではなく、modprobe コマンドを使用してカーネル モジュールをカーネルにロードする必要があることに気づきました。カーネルをアップグレードした後の正しい処理シーケンスは次のようになります。

[root@fedora zy]# /sbin/vboxconfig
[root@fedora zy]# ./a.sh
[root@fedora zy]# modprobe vboxdrv
[root@fedora zy]# modprobe vboxnetadp
[root@fedora zy]# modprobe vboxnetflt

それでおしまい。

では、/sbin/vboxconfig が実行されるたびに、次の内容が要求されるのはなぜでしょうか?

vboxdrv.sh: You must sign these kernel modules before using VirtualBox:
  vboxdrv vboxnetflt vboxnetadp

/sbin/vboxconfig コマンドを実行すると、VirtualBox の ko モジュールが再コンパイルされ、コンパイルされたファイルが以前に登録した ko ファイルと異なるため、再登録する必要があります。

modpreobe を実行すると、「キーがサービスによって拒否されました」エラーが表示される

modprobe vboxdrv コマンドを手動で実行すると、プロンプトは次のようになります。

[root@fedora 下载]# modprobe vboxdrv
modprobe: ERROR: could not insert 'vboxdrv': Key was rejected by service

カーネル モジュールは登録されていません。次に示すように、a.sh スクリプトで同様のコマンドを使用して再登録します。

[root@fedora 下载]# modprobe vboxdrv 
modprobe: ERROR: could not insert 'vboxdrv': Key was rejected by service
[root@fedora 下载]# modprobe vboxnetadp 
modprobe: ERROR: could not insert 'vboxnetadp': Key was rejected by service
[root@fedora 下载]# ./a.sh 
Signing /lib/modules/6.3.8-200.fc38.x86_64/misc/vboxdrv.ko
Signing /lib/modules/6.3.8-200.fc38.x86_64/misc/vboxnetadp.ko
Signing /lib/modules/6.3.8-200.fc38.x86_64/misc/vboxnetflt.ko
[root@fedora 下载]# modprobe vboxnetadp 

考えられる理由としては、/sbin/vboxconfig コマンドが複数回実行され、/sbin/vboxconfig コマンドが実行されるたびに新しい ko ファイルが再生成されるため、最初の vboxconfig コマンドの実行後に、生成された ko ファイルが/sbin/vboxconfig の後に、新しい ko ファイルが生成されますが、新しい ko ファイルは登録されていないため、modprode コマンドを実行するとエラーが報告されます。

/sbin/vboxconfig を実行するとエラーが報告され、読み取り専用メンバー「vm_flags」に値が割り当てられます。

/sbin/vboxconfig を実行すると、エラーが報告され、/var/log/vbox-setup.log ファイルを表示するように求められます。ファイルを開くと、次のような内容が表示されます。

[root@fedora VirtualBox]# vi /var/log/vbox-setup.log
/var/log/vbox-setup.log
In file included from /tmp/vbox.0/combined-os-specific.c:43:
/tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c: 在函数‘rtR0MemObjNativeLockUser’中: 
/tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c:1404:39: 错误:向只读成员‘vm_flags’赋值
 1404 | papVMAs[rc]->vm_flags |= VM_DONTCOPY | VM_LOCKED;
 | ^~
/tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c: 在函数‘rtR0MemObjNativeMapUser’中: 
/tmp/vbox.0/r0drv/linux/memobj-r0drv-linux.c:1876:35: 错误:向只读成员‘vm_flags’赋值
 1876 | vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
 | ^~
make[2]: *** [scripts/Makefile.build:252: /tmp/vbox.0/combined-os-specific.o] Error 1
make[2]: *** 正在等待未完成的任务....

# cmd_check_local_export /tmp/vbox.0/SUPDrvGip.o

./scripts/check-local-export /tmp/vbox.0/SUPDrvGip.o
# cmd_check_local_export /tmp/vbox.0/SUPDrv.o
 ./scripts/check-local-export /tmp/vbox.0/SUPDrv.o
# cmd_check_local_export /tmp/vbox.0/combined-agnostic2.o
 ./scripts/check-local-export /tmp/vbox.0/combined-agnostic2.o
# cmd_check_local_export /tmp/vbox.0/combined-agnostic1.o
 ./scripts/check-local-export /tmp/vbox.0/combined-agnostic1.o
make[1]: *** [Makefile:2037: /tmp/vbox.0] Error 2
make: *** [/tmp/vbox.0/Makefile-footer.gmk:133: vboxdrv] Error 2

これは私が VirtualBox7.0.6 でコンパイルしたものですが、おそらくこのバージョンのコードは新しいコンパイラではコンパイルできないため、バージョン 7.0.8 に戻すことができます。

感想

Linux の調子が悪いのか、VirtualBox が Linux をサポートしていないのかはわかりませんが、特に問題が発生したときは、非常に面倒だといつも感じています。カーネルをアップグレードしたら、/sbin/vboxconfig コマンドを再実行して VirtualBox カーネルを再コンパイルする必要があります。

参考文献

カーネルモジュールの操作

virtualbox - カーネルモジュールに署名する方法Ubuntu 18.04 - 初心者向けチュートリアル

linux – 仮想ボックスモジュール(vboxdrv、vboxnetflt、vboxnetadp、vboxpci)に署名するCentos 8 - コードログ

virtualbox7.0.8 を使用して仮想マシンを起動すると、Manjaro カーネル linux6.1 が 20% でスタックする_kingzhaooc のブログ - CSDN ブログ

https://github.com/LCTT/TranslateProject/blob/master/published/201311/How%20to%20add%20kernel%20boot%20parameters%20via%20GRUB%20on%20Linux.md

セキュア ブート (セキュア ブート) をサポートするための Fedora での NVIDIA ドライバー カーネル モジュールの完全自動署名_mokutil_KylinDemons. のブログ-CSDN ブログ

カーネルモジュールの操作 :: Fedora Docs

おすすめ

転載: blog.csdn.net/EmptyStupid/article/details/131618367