B.12. ゲストが Unable to Start with Error: warning: could not open /dev/net/tun
- 現象
- ホストシステムに
type='ethernet'
(generic ethernet とも呼ばれる)インターフェイスを設定した後は、ゲスト仮想マシンは起動しません。以下のメッセージと同様に、libvirtd.log
、/var/log/libvirt/qemu/name_of_guest.log
、またはその両方にエラーが表示されます。warning: could not open /dev/net/tun: no virtual network emulation qemu-kvm: -netdev tap,script=/etc/my-qemu-ifup,id=hostnet0: Device 'tap' could not be initialized
- 調査
- QEMU とそのゲストの潜在的なセキュリティー上の欠陥に対してホスト保護のレベルを減らす必要があるため、汎用イーサネットインターフェイスタイプ(
<interface type='ethernet'>
)の使用は推奨されません。ただし、このタイプのインターフェイスを使用して、libvirt で直接サポートされていないその他の機能を利用する必要がある場合があります。たとえば、openvswitch は libvirt-0.9.11 まで libvirt ではサポートされていませんでした。そのため、古いバージョンの libvirt では、<interface type='ethernet'>
がゲストを openvswitch ブリッジに接続する唯一の方法でした。ただし、ホストシステムに他の変更を加えずに<interface type='ethernet'>
インターフェイスを設定すると、ゲスト仮想マシンは正常に起動しません。この障害の原因は、このタイプのインターフェイスでは、QEMU によって呼び出されるスクリプトが tap デバイスを操作する必要があることです。ただし、type='ethernet'
が設定されている場合は、QEMU のロックダウンを試み、libvirt と SELinux がこれを防ぐためにいくつかのチェックが行われています。(通常は、libvirt はすべての tap デバイスの作成と操作を実行し、タップデバイスのオープンファイル記述子を QEMU に渡します。) - 解決方法
- 一般的なイーサネットインターフェイスと互換性を持つようにホストシステムを再設定します。
手順B.4 一般的なイーサネットインターフェイスを使用するようにホストシステムを再設定する
/etc/selinux/config
でSELINUX=permissive
を設定して、SELinux を Permissive に設定します。# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=permissive # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
- root シェルから、setenforce permissive コマンドを実行します。
/etc/libvirt/qemu.conf
で、以下の行を追加または編集します。clear_emulator_capabilities = 0
user = "root"
group = "root"
cgroup_device_acl = [ "/dev/null", "/dev/full", "/dev/zero", "/dev/random", "/dev/urandom", "/dev/ptmx", "/dev/kvm", "/dev/kqemu", "/dev/rtc", "/dev/hpet", "/dev/net/tun",
libvirtd
を再起動します。
重要これらの手順はそれぞれ、QEMU ゲストドメインに対するホストのセキュリティー保護を大幅に減らすため、<interface type='ethernet'>
を使用する代わりにこの設定を使用する必要があります。
注記
SELinux の詳細は、『Red Hat Enterprise Linux 6 Security-Enhanced Linux User Guide』 を参照してください。