デュアルブートシステムのための実パーティションを用いた仮想Linux環境の構築

はじめに

ノートパソコンにLinuxをインストールするには,デュアルブートでネイティブのLinuxを使うか,Windows上の仮想環境で使うかという選択肢があります. しかし,デュアルブートでは,出張時などでノートパソコン1台しか使えない場合,ファイルのやりとりにUSBメモリやクラウドを利用しなければならないという問題があり,一方仮想環境ではパフォーマンスが出ないという問題があって,どちらも一長一短があります. また,実パーティションと仮想ディスクの両方をインストールすると,別々のLinux環境となり管理が面倒となります. そこで,普段はデュアルブートでネイティブのLinuxを使いながら,Windowsからのアクセスが必要となるときには,仮想環境からデュアルブートのLinuxという使い方をすれば,管理すべきLinux環境は一つとなりますので,かなり楽になります.

筆者は,以前coLinuxを使って,そのような環境を構築していました. (今となっては実用的な価値はもうありませんが,資料的価値として2010年にFedora 12とWindows XPについて書いたページをこのページに残しておきます.) しかし,現在coLinuxは更新されておらず,64bitやUEFIへの対応がなされていません. そこで,VirtualBoxを使って,デュアルブート用にインストールしたLinuxをブートする方法をまとめます.


仮想Linux環境の比較

coLinuxおよび,代表的な仮想PCであるVMware PlayerとVirtualBoxの比較を以下に示します. なお,他にも仮想PCとしてVirtual PCがありますが,筆者はこれを使ったことがありませんので省略します.

coLinux VMware Player VirtualBox
新しいディストリビュージョンへの対応
64bitへの対応 ×
Windowsにおけるサービス化
付属するドキュメント ×

上記のとおりVMware Playerにはドキュメントがほとんど付属していないため,込み入った設定を行う場合には有償のVMware Workstationが必要となります. そのため,このページの記述はVirtualBoxを対象とします.


想定する環境

また,インストールしたハードディスクは以下のパーティションに分割されているとします. なお,/dev/sda?という形式のパーティションの指定では問題ないですが,最近のディストリビュージョンのデフォルトであるUUIDの指定で仮想Linuxが認識して正常に動作するかどうか筆者は試していないので分かりません.

パーティション 使用状況
sda1 EFIシステムパーティション (ESP)
sda2 マイクロソフト予約パーティション (MSR)
sda3 WindowsでNTFSとして使用
sda4 リカバリー領域
sda5 Linuxで/にマウント
sda6 Linuxで/homeにマウント

管理者として行う作業

VirtualBoxのインストールとホストオンリーネットワークにおけるDHCPサーバの無効化

ネイティブLinuxをインストールしたら,Windowsを立ち上げて管理者権限を持つユーザでログオンし,VirtualBoxとExtension Packをhttp://www.virtualbox.orgからダウンロードして,Windowsにインストールします.

次に,VirtualBoxを立ち上げます. VirtualBoxのホストオンリーネットワークにおいてDHCPサーバが有効になっているとWindowsのネットワークの共有ができないので,以下のようにしてVirtualBoxのDHCPサーバを無効化します.

VirtualBoxのメニューの[ファイル]→[環境設定]を選び,左側のボックスで「ネットワーク」,右側のタブで「ホストオンリーネットワーク」を選ぶと,以下のウィンドウとなります.

ホストオンリーネットワークを選ぶ

"VirtualBox Host-Only Ethernet Adapter"をダブルクリックするか,右側のドライバーのアイコン(修正)をクリックして出てくる「ホストオンリーネットワーク詳細」のウィンドウにおいて「DHCPサーバ」のタブをクリックし,以下のように「サーバを有効化」のチェックボックスをオフにします.

ホストオンリーネットワークでDHCPサーバを無効化する

新規仮想マシンの作成

ここでは,新規仮想マシンをFedora 64という名前で作ったとします. 実メモリが8GBである場合,BIOS起動では4GBを仮想マシンに割り当てても問題ないですが,UEFI起動の場合は3GB程度にしておかないと仮想マシンがブラックアウトしたままで起動しません. このようにメモリを多く割り当てすぎた場合は,エラーメッセージも出ないので注意が必要です. あとで,実パーティションを追加するため,仮想ハードディスクなしで作成します.

実パーティションのvmdkイメージの作成とVirtualBox停止時におけるshutdownの設定

Windowsが起動している状態で,VirtualBoxからWindowsのパーティションに書き込むとパーティションが破壊される可能性があります. そのため,EFIシステムパーティションとLinuxのパーティションのみが見えるvmdkイメージを作成します. ただし,パーティション番号を間違えてvmdkイメージを作成し仮想マシンを立ち上げると大変なことになるため,マニュアルの9.8 Advanced storage configurationをよく読んでから作業を行ってください.

また,VirtualBoxを停止せずにWindowsを停止した場合には仮想Linuxは休止状態になってしまい,続けてネイティブのLinuxを立ち上げるとLinuxで使用しているパーティションにトラブルが発生します. そのため,一緒にVirtualBox停止時に仮想LinuxをShutdownする設定をしておきます.

この文書で想定しているパーティションでは以下の手順となります.

  1. 管理者としてコマンドプロンプトを立ち上げ,以下のようにC:\Program Files\Oracle\VirtualBoxをpathに追加する.
              set path=%path%;C:\Program Files\Oracle\VirtualBox;
            
  2. 管理者のアカウント名がAdministratorであれば,仮想マシンの設定ファイルはC:\Users\Administrator\VirtualBox VMs\Fedora 64にあるので,cdで移動する.
  3. 以下のコマンドでパーティション情報を表示させる.
              VBoxManage internalcommands listpartitions -rawdisk \\.\PhysicalDrive0
            
  4. パーティション番号を確認した後,以下のコマンドでEFIシステムパーティションとLinuxの実パーティションのみが可視であるvmdkイメージ(rawdisk.vmdk)を作成する. (-partitionsの後に指定する数字はEFIシステムパーティションとLinuxで管理するパーティション番号のみとする)
              VBoxManage internalcommands createrawvmdk -filename rawdisk.vmdk -rawdisk \\.\PhysicalDrive0 -partitions 1,5,6
            
  5. 次に,以下のコマンドでVirtualBox停止時にShutdownする設定にします.
              VBoxManage setextradata "Fedora 64" GUI/DefaultCloseAction Shutdown
            

仮想マシンへの実パーティションのイメージの登録と設定変更

作成した仮想マシンの設定画面に入り,以下の作業を行います.

EFIの有効化とハードウェアクロックのUTCの無効化

まず,EFIを有効化しないとブートできませんので,左側のボックスで「システム」を選び,EFIを有効化します. 次に,WindowsとLinuxのデュアルブートを行う場合,普通はハードウェアクロックにUTCを使わない設定にしますが,VirtualBoxの仮想マシンのデフォルトではハードウェアクロックにUTCを使う設定となっているため,「ハードウェアクロックをUTCにする」のチェックを外し,下記のようにします. 下記では,ついでに,レガシーデバイスを外すため,起動順序からフロッピーを外し,チップセットをICH9と変更しています.

EFIを有効化する,UTCを使わない

実パーティションのイメージの登録とI/Oキャッシュの有効化

次に,左側のボックスでストレージを選んで,IDEコントローラを削除し,SATAコントローラに対してハードディスクとCD-ROMの追加を行います. ハードディスクの追加を選んで,「既存のディスクを選択」を選び,先ほど作成したrawdisk.vmdkを選びます. CD-ROMも同様に行います. また,SATAコントローラについては「ホストのI/Oキャッシュを使う」がデフォルトで無効になっていますが,この状態では仮想Linuxが不安定(特にUEFIブートでは起動できなくなることもある)となるので,「ホストのI/Oキャッシュを使う」に下記のようにチェックを付けて有効化します.

ホストのI/Oキャッシュを使う

ホストオンリーアダプタへの変更

初期状態では仮想マシンのネットワークがNATになっているので,作成した仮想マシンの設定においてネットワークアダプタ1を下記のようにホストオンリーアダプタに変更します.

ホストオンリーアダプタを使う

ネットワークの共有設定

「Windowsの設定」で「ネットワークとインターネット」を選び,「アダプターのオプションを変更する」をクリックします. するとネットワークインターフェースの一覧が表示されるので,仮想Linuxから外部への出口となるインターフェースを決め,それをダブルクリックしてプロパティをクリックし,「共有」のタブを選びます. 以下の画面はWi-Fiを選んだ場合です. 「このコンピューターのインターネット接続をとおしての接続を許可する」にチェックを付け,下のネットワーク接続に「VirtualBox Host-Only Network」を選択します. その下のチェックボックスの「ほかのユーザーに対する共有インターネットの制御や無効化の可否」は意味が分かりにくい表現ですが,これは外部から仮想LinuxへのアクセスのためのディスティネーションNAT (DNAT)のことであり,必要ならばチェックを付けて設定ボタンで設定し,必要なければチェックを外しておきます. このDNATの設定は,仮想Linuxが起動してDHCPから割り振られるIPアドレスが確定してから,このように行います.

ネットワークの共有

このようにするとVirtualBox Host-Only NetworkのIPアドレスが192.168.137.1に変更され,仮想Linuxからの接続に対してWindowsがSNAT+DHCPサーバ+Dynamic DNSとして動作します.

識別されていないネットワークの設定変更

Windows Vista以降ではネットワーク・インターフェースに,プライベート・ネットワークとパブリック・ネットワークの属性が導入されました. デフォルト・ゲートウェイが設定されていない仮想Linuxのネットワーク・インターフェースは「識別されていないネットワーク」となり,デフォルトではパブリック・ネットワークとなります. すると,ファイアウォールでパブリック・ネットワークからのアクセスが遮断されるので,仮想LinuxからWindowsへの通信が難しくなっています. そのため,スタートメニューの「Windows 管理ツール」で「ローカルセキュリティポリシー」を管理者として起動し,以下のように左側のリストで「ネットワークマネージャーポリシー」を選びます.

ローカルセキュリティポリシーのネットワークマネージャーポリシー

上記の画面「識別されていないネットワーク」をダブルクリックし,場所の種類を以下のようにプライベートに変更します.

識別されていないネットワークをプライベートにする

VcXsrvのインストール

Windows用のXサーバとして,https://sourceforge.net/project/vcxsrv/からvcxsrvの64bit版をダウンロードしてWindowsにインストールします.

そして,仮想LinuxからのXの接続を許可するため,C:\Program Files\VcXsrv\X0.hostsのファイルにWindowsから見たときのホスト名を追加します. DHCPサーバに伝えるホスト名がlinuxの場合,以下の行となります.

      linux.mshome.net
    

PulseAudioのインストール

Windows用のPulseAudioのzipファイルをhttp://www.freedesktop.org/wiki/Software/PulseAudio/Ports/Windows/Supportからダウンロードして,C:\Program Files (x86)などの適当なところに展開したあと,展開したフォルダ内のetc\pulseaudioにあるdefault.paを以下の内容に書き換えます.

      load-module module-waveout sink_name=output source_name=input
      load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16
      load-module module-esound-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16
    

Linuxのネットワーク設定ファイルの変更

ネイティブLinuxと仮想Linuxを同一パーティションで共存させる場合で仮想LinuxのネットワークにWindowsのネットワークの共有によるNAT接続を使う場合には,この2つでネットワークアドレスが異なるために固定IPを割り振ることができず,必然的にDHCPでアドレスを割り振ってもらうことになります. また,最近のLinuxではネットワークインターフェースにethXではなく,enpXsXのような名前を使っており,一般にネイティブLinuxと仮想Linuxでは名前が異なります.

これらの対策として,まず仮想Linuxを起動させてコンソール内でrootとしてログインし,まず,ifconfig コマンドでカーネルが認識しているネットワーク名とMACアドレス(ether:の後に表示されます)を確認します. Fedoraでネットワークアダプタの設定をしているのは,/etc/sysconfig/network-scriptsにあるifcfg-enpXsXであり,ネイティブLinuxで使われる設定ファイルがそこにあるので,ifcfg-以下を先ほど確認したネットワーク名にファイル名を変えてコピーし,以下の2行を修正します. (HWADDRとNAMEには,それぞれ実際のNICのMACアドレスとネットワーク名が入ります.)

      HWADDR=01:23:45:67:89:AB
      NAME=enpXsX
    

さらにUUIDの行をコメントアウトし,DHCPサーバに伝えるホスト名(ここではlinuxとします)をDHCP_HOSTNAMEで指定して,次のように書き換えます.

      #UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      DHCP_HOSTNAME=linux
    

こうしておくと,割り当てられるIPアドレスが何であってもホストのWindowsからはlinux.mshome.netで仮想Linuxにアクセスすることができます. ただし,Windowsホストの名前がwin10である場合,VirtualBox Host-Only NetworkのIPアドレスに対してwin10.mshome.netが登録されているため,仮想Linuxのホスト名はWindowsホストとバッティングしないように違う名前にする必要があります.

Administratorで行う作業は以上で終わりです. なお,ログオフする前には仮想Linuxを忘れずにシャットダウンする必要があります.


一般ユーザで行う作業

次は,普段使っているユーザでログオンします.

ネットワークの共有の解除と再設定

Windows 10 1607以降では,起動する度にネットワークの共有設定が働かなくなります. そこで,起動させたら上記のネットワークの共有設定を参考に接続の許可の無効化と有効化を行います. なお,レジストリをいじることになりますが,Microsoftのサポートページにこの問題の解決方法があります.

仮想Linuxの起動

まず,仮想Linuxを立ち上げます. VirtualBoxは管理者権限で起動しないと実パーティションを操作できません. そのため,VirtualBoxではアイコンを右クリックして,「管理者として実行」を選びます. VirtualBoxではgrub2が起動しますので,Linuxの方を起動します. (実パーティションに対するvmdkイメージを間違いなく作成できていれば,VirtualBox上のgrub2からはWindowsが起動できないのでハードディスクが壊れる心配はないはずですが,設定ミスやバグなどの可能性もありますので,grub2でWindowsを優先起動させるべきではないでしょう.)

VcXsrvの設定

仮想Linuxが無事に起動したら,VcXsrvのXLaunchを立ち上げます. Windowsのホスト名がwin10で,仮想LinuxがWindowsのDHCPサーバに伝えるホスト名をlinuxとした時のXLaunchの設定画面のスクリーンショットを以下に示します.

  1. Windows自身をX Window Managerとして使うため,Multiple windowsを選びます.
    Multiple windowsを選ぶ
  2. VcXsrvと共に起動するプログラムを設定するため,Start a programを選びます.
    Start a programを選ぶ
  3. Multiple windowsではXIMが起動されないため,最初に立ち上げた端末では漢字変換を行うことができません. そのため,Xの出力先をwin10.mshome.net:0に指定して最初はxtermを起動し,接続先をlinux.mshome.netとします. スクリーンショットでは入れていませんが,Login as userにユーザ名を入力する方が良いでしょう.
    linux.mshome.netでxterm -display win10.mshome.net:0を起動する
  4. 次の設定画面は特に変更しなくてもよいですが,X論理フォント名(X Logical Font Description)で指定されるレガシーなフォントを用いているアプリケーションを使う場合には,VcXsrvに含まれているフォントでは足りなくなる場合があるので,仮想LinuxでX Font Serverを立ち上げておき,ここで,Additional parameters for VcXsrvに"-fp tcp/linux.mshome.net:7100"と指定する必要があります.
    必要ならフォントサーバを指定する
  5. 次の設定画面では[Save configuration]で,設定ファイルをデスクトップに保存しておくと便利です.
    設定ファイルをデスクトップに保存する

漢字変換について

以前のgnome-terminalでは,後から起動したSCIMやIBusとつなぐ方法がありましたが,今のgnome-terminalやmate-terminalではそのようなメニューがなくなっています. また,gnomeデスクトップ環境でないとgnome-terminalは立ち上げることができなくなっています. そのため,xtermの中で以下を実行してから,mate-terminalを立ち上げます.

  1. まず,IBusを立ち上げます.
            ibus-daemon -d --xim
          
  2. XIMを使うアプリケーションのため,以下のように環境変数を設定します.

上記の手順の後,mate-terminalを立ち上げれば,xtermは閉じても構いません.

なお,自力でanthyなどに接続するemacsならば,日本語入力メソッドが立ち上がっていなくても漢字変換が行えます.

外部からの仮想Linuxへのアクセスについて

前述のように,外部から仮想Linuxへアクセスすることができます. それには,仮想Linuxが起動してDHCPで割り振られるIPアドレスが確定した後,ネットワークの共有設定に示す仮想Linuxから外部への出口となるインターフェースのプロパティで,「ネットワークのほかのユーザーに,共有インターネット接続の制御や無効化を許可する」の下の設定ボタンをクリックします. すると,以下の画面となります.

ポートフォワードのリスト

既に設定されている9個のルールはいずれもTCPであり,名称が番号だけで分かりにくいですが以下の内容です.

名称 ポート番号 サービス
1700 21 FTP
1701 23 Telnet
1702 25 SMTP
1703 110 POP3
1704 220 IMAP3
1705 143 IMAP
1706 80 HTTP
1707 443 HTTPs
1708 3389 リモートデスクトップ (RDP)

この画面で追加ボタンをクリックすると出てくる画面で以下のように設定します. 2段目の入力欄にはlinux.mshome.netのように名前を入れてもうまく動かないので,仮想linuxのIPアドレスを入力します.(以下の例では192.168.137.10)

SSHのポートフォワードの設定

上記は22番ポートを使うSSHの例です. OKボタンを押すと以下の画面となります.

ポートフォワードにSSHが追加

ここでもOKボタンを押して,次の画面でもOKボタンを押します. このように設定しておくことで,外部からWin10にSSHで接続すると仮想linuxにログインできます. このディスティネーションNATはWindowsファイアウォールの前に働くので,Windowsファイアウォールのブロック設定を変更する必要はありません.


PulseAudioを用いたサウンド出力

VirtualBoxではグラフィックスやサウンドなどの仮想デバイスが提供されますが,権限の問題のためVirtualBox内でログインしないとサウンドが有効にならないなど,このページで説明しているようなVcXsrvから使う場合にはあまりスマートとは言えません. そのため,以下ではハードディスク以外のデバイスに対するネットワークを用いたアクセス方法を考えます.

代表的なデバイスについては以下の方法によるネットワークを用いたアクセスが可能です.

とここまではいいのですが,サウンド機能についてはほとんど全てのパソコンに標準で搭載されているにも関わらず,UNIXでは現在サウンドの通信方法の標準化が行われているところなので,仮想Linuxの個々のアプリケーションがどの通信プロトコルを使っているかで大きく異なり,標準的な方法はありません. サウンドサーバによって異なる転送方法については,http://colinux.wikia.com/Sound_support_in_Colinuxにまとめられています.

本ページで対象としているFedoraでは,標準的なアプリケーションはPulseAudioを用いるように設定されているので,上記のようにWindows用のPulseAudioをインストールした後,スタートアップフォルダ内にpulseaudio.exeへのショートカットを作り,以下のようにプロパティにおけるリンク先の末尾に"-D --exit-idle-time=-1"を追加します.

pulseaudio.exeへのショートカットのオプションに-D --exit-idle-time=-1を指定する

あとは,仮想Linuxの端末において環境変数PULSE_SERVERの値にWindowsホストの名前あるいはIPアドレスを設定すれば,仮想LinuxでPulseAudioに出力したサウンドがWindowsのドライバにより再生されます. Fedoraでalsa-plugins-pulseaudioがインストールされていれば,ALSAは直接ハードウェアを叩くのではなくPulseAudioを呼び出すので,ALSAのサウンド出力もOKです. また,上記のdefault.paから分かるようにEsounDの出力にも対応しているので,環境変数ESPEAKERに同様にWindowsホストの名前あるいはIPアドレスを設定すれば,EsounDに出力したサウンドもWindowsのドライバにより再生されます.

上記の設定をaudaciousでのoggファイルの再生で試してみたところ,負荷がかかったときに通信エラーが発生することがあり,音楽再生などでサウンドサーバと通信し続ける用途には向いていないようです. そのため,このような目的ならばsambaによりファイルを共有して,Windows上のfoobar2000などを使う方が良いのではないかと思います.


外部のサーバのディスクのマウント

NFSv4のマウント

前述のようにRPCポートマッパを使わないNFSv4ならば,以下の手順で仮想Linuxから外部のNFSサーバのディスクをマウントすることができます. ただし,高い負荷を掛けるとVirturlBoxが落ちることがありますので,注意が必要です.

CIFS/SMBのマウント

CIFS/SMBのマウントは以下のコマンドを実行して,SMBサーバのパスワードを入力することにより行ないます. SMBサーバ側の設定はWindowsホストからアクセス出来るようにしておけばOKです. (usernameとsmbserverは,それぞれユーザ名とサーバ名に書き換えてください.)

      mount -t cifs -o user=username //smbserver/username /mnt
    

Last update: 2019.8.16

[機械力学研究室ホームページに戻る]   [田村のホームページに戻る]