「VirtualBox」カテゴリーアーカイブ

VirtualBox 6.0.8にアップデート

VirtualBoxを5.2.30から6.0.8にアップデートした。

Ubuntu 16.04ゲストでGuestAdditionsをインストールすると、起動途中の壁紙が出たところで画面がちらついたまま安定せず、デスクトップが出てきません。設定のディスプレイで、3Dアクセラレーションを有効化をオフにしたら安定して使えるようになりました。

CentOS 7.6ゲストでは初めから3Dアクセラレーションはチェックされてなくて問題は起きませんでした。

なお、VirtualBox 6.0.4以前にUbuntuをインストールしようとすると、マウスカーソルが表示されなくなる問題が起きているそうです。以下のように設定のディスプレイでグラフィックコントローラーをVBoxVGAにして、システムのポインティングデバイスをUSBタブレットにすると回避できるそうです。

VirtualBox 6.0で作成した仮想マシンにCentOSをインストールしようとするとマウスカーソルが表示されない問題への対処

こちらで、VirtualBox 6.0.8にUbuntu 18.04をインストールしても、マウスカーソルは消えなかったです。でも、VirtualBoxを終了して、VMware Player 15.1.0を使ったときに問題が発生しました。VMware Player 15.1.0の画面をリサイズすると追随してくれなくて、右と下が切れてしまいます。位置もずれて強制的に終了するしかありません。

VirtualBox 6.0.8のUbuntu 18.04の設定で、ディスプレイのグラフィックスコントローラーをVMSVGAになっていたところを、VBoxVGAにしたところ、VMware Playerの変な挙動は直りました。VirtualBoxのグラフィックコントローラーのVMSVGAは、バグを持っている感じがします。

VirtualBox 6.0でNested Virtualization

VirtualBox 6.0 でAMDのCPU上でNested Virtualizationがサポートされました。なんと、Intel CPUではなくAMD CPUです。

何はともあれ、サポートされたことはめでたい。

Nested Virtualiztionというのは、ゲストOSの中でゲストOSを動かせるということです。これで、仮想環境の中でOpenStackなどの仮想化ソフトをテストすることができます。

VMware Playerでは、Intel CPUしかサポートされていないみたいなので、AMDの人には朗報ですね。

でも、フォーラムを見るとThreadripperでは動かないという報告もあるようです。まだ、出来たばかりでバグがあるということでしょう。

Intel CPU上でもサポートされるよう気長に待ちましょう。

VirtualBoxを5.2.18にアップデート

Windows 10 October 2018 Updateにしたら、VirtualBox 5.1.30のネットワークが動かなくなりました。そのため、VirtualBoxを5.2.18にアップデートしました。

無事ネットワークが動いて一安心。

Guest Additionsも再インストールしました。

ここで、CentOS 7は、yum clean all しないと、404 errorでyum updateできなかったです。

CentOSもUbuntuも最近のOSは、再起動すると更新プログラムを自動で見に行っているのですね。手動でyumやaptを動かそうとしてもエラーになって動かないです。便利だか不便だかわからないなと思いました。自動更新は止められるのでしょうけど、今後の課題です。

Windows 10をFall Creators UpdateにアップデートしたときのVMware PlayerとVirtualBox

Windows 10をFall Creators Updateにアップデートしました。

VMware Workstation Player 12.5.5のネットワークがつながらなくなりました。アプリと機能ー>プログラムと機能 から修復を選んで修復。その後、VMware Workstation Playerの設定画面のネットワークアダプタの設定で、VirtualBoxのアダプタを外すことでネットワークにつながりました。

VirtualBoxは動かなくなったので、古いものはアンインストールしてVirtualBoxをダウンロードしてインストールしました。最初5.2.0をインストールしたのですが、画面の大きさが1024x768の固定になってしまったので5.1.30に変えました。5.2系はまだインストールするには早いようです。

VirtualBoxの共有フォルダの自動マウント

VirtualBoxの共有フォルダを自動マウントしようとしたところ、以前とは少し違っていたので紹介します。

まず、VirtualBoxのメニューのデバイス、共有フォルダで設定をします。名前をshareとしました。自動マウントと永続化のチェックは入れておきます。

次に、Ubuntu 16.04 x64で手動でマウントするには以下のようにします。

$ mkdir sharepoint
$ sudo mount -t vboxsf -ouid=hoge,gid=hoge share sharepoint

これを、Ubuntuの起動時に自動でマウントするには/etc/fstabに次のようなエントリーを加えます。
名前がhogeさんの場合です。

/etc/fstab

share	/home/hoge/sharepoint	vboxsf uid=hoge,gid=hoge,comment=systemd.automount	0	0

fstabの各項目の間はtabを使うといいです。

そして、/etc/modulesに次の項目を加えます。

/etc/modules

vboxsf

ここで、手動でマウントできるか確かめてみます。

$ sudo mount share

マウントできれば/etc/fstabの設定は大丈夫です。あとは再起動して自動でマウントできるか確かめます。/etc/modulesの設定を忘れるとUbuntuの起動が途中で止まってしまいます。

以前作ったときは、/etc/fstabにcomment=systemd.automountという設定は必要なかった気がします。systemdではこれがないといけないようです。

VirtualBoxのGuestAdditionsのサービスが起動してからでないとマウントできないからというのが理由だそうです。

Vagrantだと、Vagrantfile内でsynced_folderを設定すると自動でやってくれます。その辺が少し違っていますね。

参考にしたサイト
Virtualbox shared folder mount from fstab fails; works once bootup is complete
VirtualBoxの共有フォルダの自動マウント化

なお、共有フォルダの設定で自動マウントにすると/media/sf_(共有フォルダ名)でマウントされています。でも、所有者がrootグループがvboxsfになっていて使いにくいのですね。それで自分でマウントすることにしました。

そのあたりのことはこちらを参照ください。

VirtualBoxにおいて、ホストOSとゲストOS (CentOS) 間の共有フォルダを作成する方法

追記(2017/06/30)

共有フォルダの自動マウントで設定された/media/sf_(共有フォルダ名)は、vboxsfというグループに自分のユーザー名を加えると簡単に読み書き出ることがわかりました。

sudo gpasswd -a (ユーザー名) vboxsf

こうすれば、わざわざ自分でマウントする必要はなかったですかね。

Vagrantでprivate_networkを指定したときの仕組み

Vagrantでネットワークの設定は3つあります。このうち、private_networkを指定したときにVagrantは少し複雑な処理をしていました。

1つめのVagrantでpublic_networkを指定したときは、VirtualBoxのブリッジアダプターが使われ、外部のルーターなどからDHCPでIPアドレスをもらいます。

2つめのforwarded_portを指定したときは、VirtualBoxのNATが使われて、VirtualBox内蔵のネットワークからDHCPでIPアドレスをもらいます。

3つめのprivate_networkを指定したときは、VirtualBoxのホストオンリーアダプターという仮想ネットワークアダプターが使われます。この場合、上の2つとは少し違っていて、DHCPサーバーはデフォルトでは設定されていません。このことは、ホストの仮想ネットワークアダプターのプロパティからわかります。IPアドレスは、192.168.33.1というアドレスが設定されています。

このため、ゲストOSは192.168.33.x(xは2から254)というネットワークを自分で設定しないといけません。Vagrantではvagrant upのときに、ssh接続を使って/etc/network/interfacesに次のようなエントリーを書き込みます。

#VAGRANT-BEGIN
# The contents below are automatically generated by Vagrant. Do not modify.
auto enp0s8
iface enp0s8 inet static
      address 192.168.33.10
      netmask 255.255.255.0
#VAGRANT-END

これでIPアドレスが設定されて、ホストとゲストで通信ができるようになります。このような仕組みのため、vagrant upのときにvagrantというユーザーでSSHで接続できることと、ファイルに書き込む権限がいるためにスーパーユーザーになれることが条件になります。

Vagrantを使わずVirtualBoxのみでプライベートネットワークを組んだ時は、手作業でネットワークインターフェース、この場合はenp0s8の設定をする必要があります。

自分でvagrantboxを作ろうとして、わかったことでした。

VirtualBoxのCUIコンソールでクリップボードのコピーペースト

VirtualBoxのX Windows Systemを使わないCUI(Character User Interface)コンソールでクリップボードを使えるようにしました。

Vagrantで仮想マシンを作るとサーバー用のOSが立ち上がります。サーバー用のOSは、X Windowがインストールされていないのでコピーペーストができないことがあります。

vagrant sshを動かす端末がMSYS2だと左上のアイコンをクリックするか上部のウィンドウを右クリックして編集、貼り付けを選ぶとコピーペーストできます。

でも、VirtualBox単独でコンソールが立ち上がったときコピーペーストしようとしてもできないです。

コピーペーストの準備にはこちらのサイトを参考にしました。Xvfbという画面を持たないXサーバーを使って、xselで共有できるのですね。いままで、コピーペーストするだけでX Windowをインストールしたり立ち上げないといけないと思っていたので感心しました。こちらの通りにやると、pbcopyとpbpasteというコマンドがUbuntu 16.04 x64でも使えるようになります。この2つのコマンドはMac OS Xのコマンドのようです。

VirtualBox の Windows と Linux (CUI) でクリップボードでテキスト共有

コンソールの中でviを使ったとき、コピーペーストするにはもう一工夫必要でした。viの中では、:r! 外部コマンドを打つとコマンドの実行結果が入力されるのですが、上で設定したpbpasteを実行しようとしてもエラー127のcommand not foundになってしまいます。

そのため、環境変数BASH_ENVの設定と、.bashenvの設定が必要でした。

こちらを参考にしました。

Use of alias for Vim external command

設定が完了するとviでコピーペーストができるようになります。

NASにVirtualBoxをインストールして古いOSを使う

最近のNAS(Network Attached Storage)は、高機能化していて仮想化環境も扱えるようになっています。NASとは、ネットワーク越しに使えるハードディスクです。

そこで、昔のPCをそのままディスクイメージに変換して使う方法が、紹介されています。

“昔のPC”をNASに保存、さらにリモートでも使用可能に!

記事では、ASUSTORのNASにVirtualBoxを導入して、Windows 7のPCをNASに移行する方法が詳しく説明されています。

移行したWindows 7を使う方法は2つあって、1つはリモートデスクトップを使う方法です。

もう1つは、ASUSTORのNASのHDMI端子を使ってディスプレイに出力できるそうです。

調べてみると、サポートされるモデルは、AS31/32/50/51/61/62/70だそうです。メモリーはなるべくたくさんないといけないので、AS50/51シリーズ以上の機種で、メモリーを増設して使わないといけません。最大で8GBだそうなので、仮想化されるOSは、1つか2つが精いっぱいではないでしょうか。

少しお値段が張るのがネックですかね。

ティックレスLinuxカーネルと準仮想化クロック

ゲストOSの時計の遅れにはティックレスLinuxカーネルが関係していた

このところVirtualBoxを契機として、準仮想化クロックについて調べてきました。
ところが、SUSEのマニュアルがゲストOSでNTPを使わないことを推奨していることの理由がどうしてもわかりませんでした。
昔QEMUにかかわったとき、Linuxの割り込み頻度が1000Hzから250Hzに変わったことを思い出しました。

すると、こんな記事が見つかりました。

仮想化しても時刻ずれが発生しないCentOS6

最近のLinuxカーネルはティックレスになっていて、仮想化しても時刻がずれないというのです。そこで、ティックレスカーネルについて調べてみました。

Linuxの割り込み頻度の変遷

VMwareのサイトにLinuxの割り込み頻度の変遷がまとめられています。

Linuxの2.4ではHZ=100Hzだったのが、2.6ではHZ=1000Hzに変わり、2.6.14以降はHZ=250Hzになっています。

ティックレスカーネルのサポートはLinux 2.6.18より始まっています。

ティックレスカーネルのしくみ

昔はPIT(Programmable Interval Timer)を使って定期的に割り込みをかけていました。100Hzなら10msに一度カーネルに割り込みが発生するようにプログラムします。割り込みが発生したら10msたったとして時計を進めていたわけです。

Linuxの割り込み頻度は、多いほうが時計の精度が高いように思います。しかし割り込みの時間内に処理が終わらず次の割り込みが起こってしまうと割り込みが失われた状態になり時計が狂ってきます。

仮想化環境で時計の狂いが大きかったのはこれが大きな原因です。

ティックレスカーネルは時間を決めて定期的に割り込みをかけることをやめてしまうものです。その代わり1度きりのone shot timerというタイマーを使って割り込みまでの時間を設定して割り込みをかけます。動いているプロセスが少ないときは長い時間割り込まないようにします。動いているときは、定期的に割り込みます。

時間があらかじめ決まっていないので、カーネルがsleepしてどれくらい時間がかかったかを毎度ハードウェアをチェックする必要があります。それをクロックソースと呼んでいます。

クロックソースとして代表的なものが、TSC(Time Stamp Counter)、ACPI PM(ACPI Power Management timer)、HPET(High Precision Event Timer)などがあります。

ティックレスカーネルの適用状況

Linuxのディストリビューションがティックレスカーネルを採用した時期はまちまちです。以下にまとめてみました。

ディストリビューション バージョン 時期
Red Hat Enterprise Linux 6 2010-11-09
CentOS 6 2011-07-10
Fedora 7 x86 2007-05-31
Fedora 8 x86_64 2007-11-8
Ubuntu 7.10 2007-10-18
SUSE Linux Enterprise Server 12 2014-10-28

UbuntuとFedoraが同時期で、Red HatとCentOSが次で、SUSEの順番です。

使っている人が多いと思われるCentOSは6からのサポートです。最近になって時計の話題を見かけることが少なくなったことはこのためだと思われます。

また、Ubuntuの方が時計が正確だという報告があったのですがティックレスカーネルの採用時期が早かったためでしょう。

SUSEは本当に最近のサポートですね。

ティックレスカーネルと準仮想化クロックと組み合わせると

ティックレスカーネルになってクロックソースを指定できるようになりました。最近のディストリビューションでは準仮想化クロックを採用しているところばかりです。準仮想化クロックといってもこれまで調べたようにその中身はTSCを使っています。ゲストOSの時計が正確になったのは、CPUの周波数の変化によってTSCの周波数が変化しなくなっていることも大きいと思います。

Linuxカーネルの進化とCPUの進化によって時計の正確さが増したということでしょう。

VirtualBoxのゲストの時計の補正を停止する方法

ゲストの時計の補正を止める

VirtualBoxは、準仮想化インターフェースが”なし”のとき、ゲストOSとホストOSの時計は同期しています。でも、何かのときにゲストとホストの時計の同期を止めたいことがあると思います。

こちらを参考に紹介します。ゲストOSがWindowsの場合が載っています。

なお、TSCTiedToExecutionというのはTSCに関する別の設定ですので今回は設定しません。

VirtualBoxがホストの時計をゲストに供給するのを止める

時計の補正を止めたいゲストOSをシャットダウンします。

設定でシステム―>アクセラレーション―>準仮想化インターフェースで”なし”を選びます。

Legacyを選んでも”なし”と同じです。他を選ぶと自動的に補正されなくなります。

VirtualBoxのインストールされているフォルダに行きます。

cd "C:\Program Files\Oracle\VirtualBox"

次のコマンドでゲストOSのリストを見ることができます。

C:\Program Files\Oracle\VirtualBox> VBoxManage list vms

その名前を使って次のようにするとゲストがホストの時計を参照することを止めることができます。"Guest Name"というのは自分の設定したいゲストの名前です。

C:\Program Files\Oracle\VirtualBox> VBoxManage setextradata "Guest Name" "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" "1"

このコマンドで、ゲストOSのところにある設定ファイル"Guest Name".vboxに設定が書き込まれます。

この後で、ゲストOSを再起動するとゲストOSの時計ががホストに同期するのは停止されます。

GuestAdditionsの時計の同期を止める

上記だけでも時計が同期しなくなります。
ゲストOS上でも、Guest Additionsが同期しようとしていますので、念のためそれを止める方法です。

ゲストOSがUbuntu 12.04 x64の場合です。

現在動いているVBoxServiceを止めます。

sudo service vboxadd-service stop

タイマーの同期をとめたままGuest Additionsを動かします。

sudo /usr/sbin/VBoxService --disable-timesync

これでゲストとホストの時計の同期は止まるはずです。この方法だと、ゲストOSを再起動するとまた--disable-timesyncなしでサービスが動きます。

ゲストとホストの時計の同期を再開する

VBoxManageの最後の"1"をなくして実行することで設定のエントリーをなくすことができます。"0"とすることでも再開できます。

C:\Program Files\Oracle\VirtualBox> VBoxManage setextradata "Guest Name" "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled"

ゲストの実行中でもコマンドを実行できますが、再起動しないと有効になりません。