ホストOSにCentOS7を使用し、ゲストOSとしてWindows10をセットアップ(2018/03/22)

はじめに

ホストOSにCentOSを使用し、ゲストOSとしてWindows10(Pro)を作成する。 Windows10でTVキャプチャができるようにUSBパススルー(使用ハードは後述)を設定し、動画エンコードにIntelQSVが使用できるようGPUパススルーを設定する。また、Blu-ray Diskも使用できるようにしておく。なお、ローカルネットワーク上で動作させるので、セキュリティ関連のOS設定は最低限のみ。

参考:マシンスペック

CPU: Intel Core i5-8400 (CoffeeLake)
MEM: 16GB
SSD: 500GB (Crucial CT500MX)
HDD: 2TB
CD: Blu-ray (Pioneer BDR-TD05)
TVキャプチャ:PX-W3U4 ※外付けUSB

手順

CentOS7.4用のDVD作成(旧PC(Windows7)で作成)

今回はDVDでインストールするべく、古いWindowsマシンで、DVD作成を行った。 なおisoイメージはここにある。なお、使用したファイルはCentOS-7-x86_64-DVD-1708.iso

BIOSの設定確認

電源投入し、BIOS(正確にはUEFI)の設定を確認し、仮想化関連の設定が有効になっているか確認する。

今回使用したPCではすでに有効になっていた。確認した項目は以下。

CentOS7インストール(ポイントのみ)

  • DATE&TIMEでRegion:AsiaCity: Tokyoを選択
  • KEYBOADJapaneseを追加
  • SOFTWARE SELECTIONはデフォルトのMinimal Installのまま
  • INSTALLATION DESTINATION
    →ディスク選択
    →partitioning は /home は削除、swapはメモリと同じサイズの16GB、他を / に割り当てるにしておく (/boot はデフォルトのまま)
  • NETWORK&HOSTNAMEで以下を設定
    • Host name : localhost.localdomain (default)
    • IP Address: 192.168.10.20
    • Subnet Mask: 255.255.255.0
    • Default Route: 192.168.10.1
    • DNS: 192.168.10.1
  • Begin Installation 押下
  • 途中でrootユーザパスワード、ユーザ作成
    →一般ユーザは [x]Make this user admiistrator にチェックを入れておく
  • reboot

インストール後のOS設定(最低限)

rootにスイッチするユーザの限定

# vi /etc/pam.d/su
auth            required        pam_wheel.so use_uid ※先頭のコメント(#)を外す

FW確認&SELinux無効化

# systemctl status firewalld
# getenforce
 ※一先ず、無効化せず、すすめる。(後述:無効化せずOK)

SSH設定

rootログイン禁止など

# vi /etc/ssh/sshd_config
※以下の設定に変更
PermitRootLogin no
PermitEmptyPasswords no
PasswordAuthentication yes

# systemctl restart sshd

Firewalldの確認

# firewall-cmd --list-all

→servicesにsshが含まれること

システム最新化

# yum -y update

リポジトリ追加

# yum -y install yum-plugin-priorities
# sed -i -e "s/\]$/\]\npriority=1/g" /etc/yum.repos.d/CentOS-Base.repo
# yum -y install epel-release
# sed -i -e "s/\]$/\]\npriority=5/g" /etc/yum.repos.d/epel.repo
# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/epel.repo
# yum -y install centos-release-scl-rh centos-release-scl
# sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl.repo
# sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-SCLo-scl.repo
# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
# yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/remi-safe.repo
# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/remi-safe.repo

vimインストール

# yum -y install vim-enhanced

NTP(chrony)設定

# yum -y install chrony
# vim /etc/chrony.conf
※以下の部分を変更
server ntp.nict.jp iburst
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
allow 192.168.10.0/24

# systemctl start chronyd
# systemctl enable chronyd
# firewall-cmd --add-service=ntp --permanent
# firewall-cmd --reload
# chronyc sources

増設HDDのフォーマット&マウント

# fdisk -l ※デバイス名確認
# fdisk /dev/sdb
    →m
    →d (delete a partition) ※すでにパーティションが合ったので、一旦削除
    →n (add a new partition)
    →p
    →1
    →First sector , Last sector はデフォルトのままで最大サイズになる(Enter x 2)
    →p (print the partition table) ※確認のため
    →w (write table to disk and exit)
# fdisk -l
# mkfs -t xfs /dev/sdb1  ※ファイルシステムは CentOS7のデフォルトに合わせた
# df -h
# mkdir /export1
# mount /dev/sdb1 /export1 ※手動マウント
# df -h
# blkid /dev/sdb1 ※UUID確認
# vim /etc/fstab ※以下の行を追加
UUID=96db3ebe-0474-4fa8-a051-4b029419f15f   /export1    xfs defaults0 0

# reboot  ※ 自動マウントを確認するため

samba設定

追加ディスクをホストOS、ゲストOSの双方で参照できるようにホストOS上でsambaを稼働させる。

# yum -y install samba samba-client
# vim /etc/samba.smb.conf
以下のdiff結果を参考に追記
# diff smb.conf.original smb.conf
7c7,11
<    workgroup = SAMBA
---
>    workgroup = WORKGROUP
>    unix charset = UTF-8
>    dos charset = CP932
>
>    hosts allow = 127. 192.168.10.
10a15,16
>
>    map to guest = Bad User
16a23
>
36a44,54
>
> [share]
>    path = /export1/share
>    public = yes
>    writable = yes
>    guest ok = yes
>    guest only = yes
>    create mode = 0777
>    directory mode = 0777
>    printable = no
>

# systemctl restart smb nmb
# systemctl enable smb nmb
# firewall-cmd --list-all
    ※ sambaがない場合、以下で追加する
# firewall-cmd --add-service=samba --permanent 
# firewall-cmd --reload

    ※SELinuxを有効にしている場合、以下を実施する
# setsebool -P samba_enable_home_dirs on
# restorecon -Rv /export1/share
# setsebool -P allow_smbd_anon_write 1
# chcon -R -t samba_share_t /export1/share

仮想化環境セットアップ

インストール

# yum -y install qemu-kvm libvirt virt-install bridge-utils
# systemctl start libvirtd
# systemctl enable libvirtd

bridge設定

注意一度インタフェースに設定されているIPアドレスを削除するため、ssh接続している端末は切れるので、コンソールから実行する必要がある。

# nmcli c add type bridge autoconnect yes con-name br0 ifname br0``
# nmcli c modify br0 ipv4.addresses 192.168.10.20/24 ipv4.method manual
# nmcli c modify br0 ipv4.gateway 192.168.10.1
# nmcli c modify br0 ipv4.dns 192.168.10.1
# nmcli c delete enp0s31f6  ★注意★ネットワークが切れる!!コンソールで実施する!!
# nmcli c add type bridge-slave autoconnect yes con-name enp0s31f6 ifname enp0s31f6 master br0 
# reboot

# ip a ※IPアドレス確認

SPICEサーバインストール

# yum -y install spice-server spice-protocol
# firewall-cmd --add-port=5900/tcp --permanent
# firewall-cmd --reload

補足MacOSのクライアントはここからダウンロードした物を使う(bundleをダウンロード)

UEFI起動設定(OVMFインストール)

# vi /etc/yum.repos.d/kraxel.repo
下記内容を追記(新規作成)
--
[qemu-firmware-jenkins]
name=firmware for qemu, built by jenkins, fresh from git repos
baseurl=https://www.kraxel.org/repos/jenkins/
enabled=0
gpgcheck=0
--

# yum --enablerepo=qemu-firmware-jenkins -y install OVMF
# vi /etc/libvirt/qemu.conf
    →今回は677行目付近のnvramをコメント外すだけ
# /usr/libexec/qemu-kvm -version
# yum -y install centos-release-qemu-ev
# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-QEMU-EV.repo
# yum --enablerepo=centos-qemu-ev -y install qemu-kvm-ev
# systemctl restart libvirtd
# /usr/libexec/qemu-kvm -version

IOMMU 有効化

# vi /etc/default/grub
    →CMDLINEの最後に intel_iommu=on を追加
# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
    ※ 補足 ※
    ※ BIOSの場合はこっち→grub2-mkconfig -o /boot/grub2/grub.cfg
    ※ 不明の場合は両方実行しておけば間違いない
# reboot
# dmesg | grep -E "DMAR|IOMMU”
    →IOMMUが複数行出てくること

KVMをネストする(必須ではない)

# vi /etc/modprobe.d/kvm-nested.conf
下記行追加(新規ファイル)
--
options kvm_intel nested=1
--
# cat /sys/module/kvm_intel/parameters/nested
# modprobe -r kvm_intel
# modprobe kvm_intel
# cat /sys/module/kvm_intel/parameters/nested
→ Y になってる

Intel UHD Graphics パススルー

参考:仮想マシンゲストでIntel QSV(2016年版) - えぬえす工房

Intel HD Graphicsデバイス名確認

# lspci -nnk
00:02.0 VGA compatible controller [0300]: Intel Corporation Device [8086:3e92]
Subsystem: ASRock Incorporation Device [1849:3e92]

→[8086:3e92]という文字列の部分を確認(次で使う)
→また、先頭の 00:02.0 もゲストOS作成時に使う

/etc/modprobe.d/igd.conf の修正

# vim /etc/modprobe.d/igd.conf
以下を追記(新規ファイル)
--
blacklist i915
options vfio-pci ids=8086:3e92
--

→8086:3e92は前項で確認した文字列

/etc/default/grub の修正

# vim /etc/default/grub
→ GRUB_CMDLINE_LINUXの最後にvideo=vesafb:offを追加
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on video=vesafb:off"

grub更新

# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
    ※ 補足 ※
    ※ BIOSの場合はこっち→grub2-mkconfig -o /boot/grub2/grub.cfg
    ※ 不明の場合は両方実行しておけば間違いない

/etc/modules-load.d/vfio-pci.confの編集

# echo 'vfio-pci' > /etc/modules-load.d/vfio-pci.conf

再起動

# reboot

Windows10のゲストOS作成

ゲストOSとして、メモリ:8GB, ディスク:256GB, IntelUHDグラフィックデバイスをパススルーとして扱う。また、SPICEアクセス用のパスワードは1234とする。

# virt-install \
--name Win10 \
--ram 8192 \
--disk path=/var/kvm/images/Win10.img,size=256 \
--vcpus=4 \
--os-type windows \
--os-variant=win10 \
--network bridge=br0 \
--graphics spice,listen=0.0.0.0,password=1234,keymap=ja \
--video qxl \
--cdrom /export1/isos/Win10_1709_Japanese_x64.iso \
--boot uefi \
--host-device 00:02.0 \
--features kvm_hidden=on \
--machine q35

上記コマンド実行後SPICEクライアントでspice://192.168.10.20:5900にアクセスし、Windows10のインストールを行う。(Windows10のインストールは省略、IPアドレス設定、リモートデスクトップの有効化ぐらいは実施しておいたほうがよい)なお、Windows10のインストール終了後はWindowsをシャットダウンさせる。

CPUモード変更

# virsh edit Win10
以下のように変更
--
<cpu mode='host-passthrough' check='none'>
  <topology sockets='1' cores='4' threads='1'/>
</cpu>
--

Blu-ray用パススルー

参考:

# lsscsi
[0:0:0:0]    disk    ATA      CT500MX500SSD1   010   /dev/sda
[1:0:0:0]    disk    ATA      WDC WD20EARS-00M AB51  /dev/sdb
[4:0:0:0]    cd/dvd  PIONEER  BD-RW   BDR-TD05 1.02  /dev/sr0

先頭に表示される[4:0:0:0]を元にXMLを修正する

# virsh edit Win10
以下を追記
--
<controller type='scsi' index='0' model='virtio-scsi'/>
<hostdev mode='subsystem' type='scsi' managed='no'>
  <source>
    <adapter name='scsi_host4'/>
    <address bus='0' target='0' unit='0'/>
  </source>
  <readonly/>
  <address type='drive' controller='0' bus='0' target='0' unit='2'/>
</hostdev>
--

USBパススルー

参考

# lspci -D | grep USB
0000:00:14.0 USB controller: Intel Corporation 200 Series PCH USB 3.0 xHCI Controller

# virsh edit Win10
--
<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x00' slot='0x14' function='0x0'/>
  </source>
</hostdev>
--

Windows10へ virtioドライバインストール

# wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

# virsh edit Win10
→cdrom で指定していた Windows10のインストールディスクを上記ダウンロードしたファイル名に変更

# virsh start Win10

Windows10が起動した後、Windows上で以下を実施

  • 「スタート」右クリック⇒「デバイスマネージャー」⇒「ほかのデバイス
  • PCIシンプル通信コントローラー」を右クリック⇒「ドライバーソフトウェアの更新」⇒「コンピューターを参照してドライバーソフトウェアを検索」⇒「参照」ボタン押下⇒CDドライブを選択して「次へ」でデバイスドライバをインストールして「VirtIO-Serial Driverを」を追加する
  • SCSIコントローラー」を右クリック⇒「ドライバーソフトウェアの更新」⇒「コンピューターを参照してドライバーソフトウェアを検索」⇒「参照」ボタン押下⇒CDドライブを選択して「次へ」⇒「このドライバーソフトウェアをインストールします」でデバイスドライバをインストールして「Red Hat VirtIO SCSI controller」を追加する

Windows Intel driver更新

ここから最新ドライバをダウンロードし、Windows上でインストール

Windows10のEthernetドライバもvirtioにする

Windowsはシャットダウン状態にし、ホストOSで以下の作業で以下を実施

# virsh edit Win10
--
<interface type='bridge'>
  <mac address='52:54:00:f5:2b:1e'/>
  <source bridge='br0'/>
  <model type='virtio'/> ← 行追加
  <model type='rtl8139'/> ← 行削除
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
--

# virsh start Win10

Windows10が起動した後、Windows上で以下を実施

  • 「スタート」右クリック⇒「デバイスマネージャー」⇒「ほかのデバイス」⇒「イーサネットコントローラー」を右クリック⇒「ドライバーソフトウェアの更新」⇒「コンピューターを参照してドライバーソフトウェアを検索」⇒「参照」ボタン押下⇒CDドライブを選択して「次へ」でデバイスドライバをインストールして「Red Hat VirtIO Ethernet Adapter」を追加する

おわりに

ゲストOS上でTV録画、エンコードができることは確認済み。