ノートパソコンにLinuxをインストールするには,デュアルブートでネイティブのLinuxを使うか,Windows上の仮想環境で使うかという選択肢があります. しかし,デュアルブートでは,出張時などでノートパソコン1台しか使えない場合,ファイルのやりとりにUSBメモリやクラウドを利用しなければならないという問題があり,一方仮想環境ではパフォーマンスが出ないという問題があって,どちらも一長一短があります. また,実パーティションと仮想ディスクの両方をインストールすると,別々のLinux環境となり管理が面倒となります. そこで,普段はデュアルブートでネイティブのLinuxを使いながら,Windowsからのアクセスが必要となるときには,仮想環境からデュアルブートのLinuxという使い方をすれば,管理すべきLinux環境は一つとなりますので,かなり楽になります.
筆者は,以前coLinuxを使って,そのような環境を構築していました. しかし,現在coLinuxは更新されておらず,64bitやUEFIへの対応がなされていません. そこで,VirtualBoxを使って,デュアルブート用にインストールした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にマウント
ネイティブLinuxをインストールしたら,Windowsを立ち上げて管理者権限を持つユーザでログオンし,VirtualBoxとExtension Packをhttp://www.virtualbox.orgからダウンロードして,Windowsにインストールします.
次に,VirtualBoxを立ち上げます. VirtualBoxのホストオンリーネットワークにおいてDHCPサーバが有効になっているとWindowsのネットワークの共有ができないので,以下のようにしてVirtualBoxのDHCPサーバを無効化します.
VirtualBoxのメニューの[ファイル]→[環境設定]を選び,左側のボックスで「ネットワーク」,右側のタブで「ホストオンリーネットワーク」を選ぶと,以下のウィンドウとなります.
"VirtualBox Host-Only Ethernet Adapter"をダブルクリックするか,右側のドライバーのアイコン(修正)をクリックして出てくる「ホストオンリーネットワーク詳細」のウィンドウにおいて「DHCPサーバ」のタブをクリックし,以下のように「サーバを有効化」のチェックボックスをオフにします.
ここでは,新規仮想マシンをFedora 64という名前で作ったとします. 実メモリが8GBである場合,BIOS起動では4GBを仮想マシンに割り当てても問題ないですが,UEFI起動の場合は3GB程度にしておかないと仮想マシンがブラックアウトしたままで起動しません. このようにメモリを多く割り当てすぎた場合は,エラーメッセージも出ないので注意が必要です. あとで,実パーティションを追加するため,仮想ハードディスクなしで作成します.
Windowsが起動している状態で,VirtualBoxからWindowsのパーティションに書き込むとパーティションが破壊される可能性があります. そのため,EFIシステムパーティションとLinuxのパーティションのみが見えるvmdkイメージを作成します. ただし,パーティション番号を間違えてvmdkイメージを作成し仮想マシンを立ち上げると大変なことになるため,マニュアルの9.7 Advanced Storage Configurationをよく読んでから作業を行ってください.
また,VirtualBoxを停止せずにWindowsを停止した場合には仮想Linuxは休止状態になってしまい,続けてネイティブのLinuxを立ち上げるとLinuxで使用しているパーティションにトラブルが発生します. そのため,一緒にVirtualBox停止時に仮想LinuxをShutdownする設定をしておきます.
この文書で想定しているパーティションでは以下の手順となります.
set path=%path%;C:\Program Files\Oracle\VirtualBox;
VBoxManage list hostdrives
VBoxManage createmedium disk --filename rawdisk.vmdk --format=VMDK --variant RawDisk --property RawDrive=\\.\PhysicalDrive0 --property Partitions=1,5,6
VBoxManage setextradata "Fedora 64" GUI/DefaultCloseAction Shutdown
作成した仮想マシンの設定画面に入り,以下の作業を行います.
まず,EFIを有効化しないとブートできませんので,左側のボックスで「システム」を選び,EFIを有効化します. 次に,WindowsとLinuxのデュアルブートを行う場合,普通はハードウェアクロックにUTCを使わない設定にしますが,VirtualBoxの仮想マシンのデフォルトではハードウェアクロックにUTCを使う設定となっているため,「ハードウェアクロックをUTCにする」のチェックを外し,下記のようにします. 下記では,ついでに,レガシーデバイスを外すため,起動順序からフロッピーを外し,チップセットをICH9と変更しています.
次に,左側のボックスでストレージを選んで,IDEコントローラを削除し,SATAコントローラに対してハードディスクとCD-ROMの追加を行います. NVMe接続のSSDならば,VirtualBoxでもSSDはSATAコントローラではなくNVMeコントローラに接続します. CD-ROMは実際の接続に合わせてSATAコントローラに接続します. そして,ハードディスクの追加を選んで,「既存のディスクを選択」を選び,先ほど作成したrawdisk.vmdkを選びます. また,SATA/NVMeコントローラについては「ホストのI/Oキャッシュを使う」がデフォルトで無効になっていますが,この状態では仮想Linuxが不安定(特にUEFIブートでは起動できなくなることもある)となるので,「ホストの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 管理ツール」で「ローカルセキュリティポリシー」を管理者として起動し,以下のように左側のリストで「ネットワークマネージャーポリシー」を選びます.
上記の画面「識別されていないネットワーク」をダブルクリックし,場所の種類を以下のようにプライベートに変更します.
Windows用のXサーバとして,https://github.com/marchaesen/vcxsrvからvcxsrvの64bit版をダウンロードしてWindowsにインストールします.
そして,仮想LinuxからのXの接続を許可するため,C:\Program Files\VcXsrv\X0.hostsのファイルにWindowsから見たときのホスト名を追加します. DHCPサーバに伝えるホスト名がlinuxの場合,以下の行を追加します.
linux.mshome.net
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
ネイティブLinuxと仮想Linuxを同一パーティションで共存させる場合で仮想LinuxのネットワークにWindowsのネットワークの共有によるNAT接続を使う場合には,この2つでネットワークアドレスが異なるために固定IPを割り振ることができず,必然的にDHCPでアドレスを割り振ってもらうことになります. また,最近のLinuxではネットワークインターフェースにethXではなく,enpXsXのような名前を使っており,一般にネイティブLinuxと仮想Linuxでは名前が異なります.
これらの対策として,まず仮想Linuxを起動させてネットワークの設定でネットワークインターフェース名を確認し,名前が「有線接続1」のように日本語になっているのでネットワークインターフェース名 enpXsX に変更します. そして,このネットワークに対して以下のようにホスト名(ここではlinuxとします)を割り当てます.
nmcli connection modify enpXsX ipv4.dhcp-hostname linux ipv6.dhcp-hostname linux
こうしておくと,割り当てられるIPアドレスが何であってもホストのWindowsからはlinux.mshome.netで仮想Linuxにアクセスすることができます. ただし,Windowsホストの名前がwin11である場合,VirtualBox Host-Only NetworkのIPアドレスに対してwin11.mshome.netが登録されているため,仮想Linuxのホスト名はWindowsホストとバッティングしないように違う名前にする必要があります.
Administratorで行う作業は以上で終わりです. なお,ログオフする前には仮想Linuxを忘れずにシャットダウンする必要があります.
次は,普段使っているユーザでログオンします.
Windows 10 1607以降では,起動する度にネットワークの共有設定が働かなくなります. そこで,起動させたら上記のネットワークの共有設定を参考に接続の許可の無効化と有効化を行います. なお,レジストリをいじることになりますが,Microsoftのサポートページにこの問題の解決方法があります.
まず,仮想Linuxを立ち上げます. VirtualBoxは管理者権限で起動しないと実パーティションを操作できません. そのため,VirtualBoxではアイコンを右クリックして,「管理者として実行」を選びます. VirtualBoxではgrub2が起動しますので,Linuxの方を起動します. (実パーティションに対するvmdkイメージを間違いなく作成できていれば,VirtualBox上のgrub2からはWindowsが起動できないのでハードディスクが壊れる心配はないはずですが,設定ミスやバグなどの可能性もありますので,grub2でWindowsを優先起動させるべきではないでしょう.)
仮想Linuxが無事に起動したら,VcXsrvのXLaunchを立ち上げます.
以前のgnome-terminalでは,後から起動したSCIMやIBusとつなぐ方法がありましたが,今のgnome-terminalではそのようなメニューがなくなっており,さらにgnomeデスクトップ環境でないとgnome-terminalは立ち上げることができなくなっています.
そのため,WindowsでVcXsrvを起動して,SSH接続した環境から以下のようにxtermを立ち上げます.
xterm -display win11.mshome.net:0 &
このxtermの中で以下を実行します.
ibus-daemon -d --xim
export XMODIFIERS=@im=ibus
setenv XMODIFIERS @im=ibus
なお,gnome環境でのibusの状態の表示はgnomeによって行われるので,このようなgnomeを使わない接続では標準ではインストールされないibus-panelをインストールしておく必要があります.
上記の手順の後,新しいxtermを立ち上げれば,最初のxtermは閉じても構いません.
なお,自力でanthyなどに接続するemacsならば,日本語入力メソッドが立ち上がっていなくても漢字変換が行えます.
前述のように,外部から仮想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)
上記は22番ポートを使うSSHの例です. OKボタンを押すと以下の画面となります.
ここでもOKボタンを押して,次の画面でもOKボタンを押します. このように設定しておくことで,外部からWindowsホストにSSHで接続すると仮想linuxにログインできます. このディスティネーションNATはWindowsファイアウォールの前に働くので,Windowsファイアウォールのブロック設定を変更する必要はありません.
VirtualBoxではグラフィックスやサウンドなどの仮想デバイスが提供されますが,権限の問題のためVirtualBox内でログインしないとサウンドが有効にならないなど,このページで説明しているようなVcXsrvから使う場合にはあまりスマートとは言えません. そのため,以下ではハードディスク以外のデバイスに対するネットワークを用いたアクセス方法を考えます.
代表的なデバイスについては以下の方法によるネットワークを用いたアクセスが可能です.
本ページで対象としているFedoraでは,標準的なアプリケーションはPipeWireを用いるように設定されており,PipeWireはPulseAudioと互換性があるので,上記のようにWindows用のPulseAudioをインストールした後,スタートアップフォルダ内にpulseaudio.exeへのショートカットを作り,以下のようにプロパティにおけるリンク先の末尾に"-D --exit-idle-time=-1"を追加します.
あとは,仮想Linuxの端末において環境変数PULSE_SERVERの値にWindowsホストの名前あるいはIPアドレスを設定すれば,仮想LinuxでPipeWireに出力したサウンドがWindowsのドライバにより再生されます. Fedoraでpipewire-alsaがインストールされていれば,ALSAは直接ハードウェアを叩くのではなくPipeWireを呼び出すので,ALSAのサウンド出力もOKです.
上記の設定をaudaciousでのoggファイルの再生で試してみたところ,負荷がかかったときに通信エラーが発生することがあり,音楽再生などでサウンドサーバと通信し続ける用途には向いていないようです. そのため,このような目的ならばsambaによりファイルを共有して,Windows上のfoobar2000などを使う方が良いのではないかと思います.
前述のようにRPCポートマッパを使わないNFSv4ならば,以下の手順で仮想Linuxから外部のNFSサーバのディスクをマウントすることができます. ただし,高い負荷を掛けるとVirturlBoxが落ちることがありますので,注意が必要です.
/home 192.168.0.0/255.255.0.0(rw,insecure)
[General] Domain = example.org [Mapping] Nobody-User = nobody Nobody-Group = nobody
mount -t nfs4 -o proto=tcp nfsserver:/home /mnt
CIFS/SMBのマウントは以下のコマンドを実行して,SMBサーバのパスワードを入力することにより行ないます. SMBサーバ側の設定はWindowsホストからアクセス出来るようにしておけばOKです. (usernameとsmbserverは,それぞれユーザ名とサーバ名に書き換えてください.)
mount -t cifs -o user=username //smbserver/username /mnt
Last update: 2024.11.19