mirror of
https://github.com/vagrant-libvirt/vagrant-libvirt.git
synced 2025-02-25 18:55:27 -06:00
Added TPM Device support
Added TPM device support to include switching out the TPM device on reboot if necessary. The following options were added: * tpm_model - Defaults to 'tpm-tis' * tpm_type - Defaults to 'passthrough' * tpm_path - Must be specified, other options are ignored if this is not specified. Most users will set this to /dev/tpm0. For additional information on using a TPM with Libvirt see the following: * http://wiki.qemu.org/Features/TPM * https://libvirt.org/formatdomain.html#elementsTpm
This commit is contained in:
parent
9d331d2ed6
commit
ecb1339312
33
README.md
33
README.md
@ -211,7 +211,9 @@ end
|
|||||||
* `nic_adapter_count` - Defaults to '8'. Only use case for increasing this count is for VMs that virtualize switches such as Cumulus Linux. Max value for Cumulus Linux VMs is 33.
|
* `nic_adapter_count` - Defaults to '8'. Only use case for increasing this count is for VMs that virtualize switches such as Cumulus Linux. Max value for Cumulus Linux VMs is 33.
|
||||||
* `uuid` - Force a domain UUID. Defaults to autogenerated value by libvirt if not set.
|
* `uuid` - Force a domain UUID. Defaults to autogenerated value by libvirt if not set.
|
||||||
* `suspend_mode` - What is done on vagrant suspend. Possible values: 'pause', 'managedsave'. Pause mode executes a la `virsh suspend`, which just pauses execution of a VM, not freeing resources. Managed save mode does a la `virsh managedsave` which frees resources suspending a domain.
|
* `suspend_mode` - What is done on vagrant suspend. Possible values: 'pause', 'managedsave'. Pause mode executes a la `virsh suspend`, which just pauses execution of a VM, not freeing resources. Managed save mode does a la `virsh managedsave` which frees resources suspending a domain.
|
||||||
|
* `tpm_model` - The model of the TPM to which you wish to connect.
|
||||||
|
* `tpm_type` - The type of TPM device to which you are connecting.
|
||||||
|
* `tpm_path` - The path to the TPM device on the host system.
|
||||||
|
|
||||||
|
|
||||||
Specific domain settings can be set for each domain separately in multi-VM
|
Specific domain settings can be set for each domain separately in multi-VM
|
||||||
@ -268,6 +270,9 @@ On vagrant reload the following domain specific attributes are updated in define
|
|||||||
* `keymap` - Updated.
|
* `keymap` - Updated.
|
||||||
* `video_type` - Updated.
|
* `video_type` - Updated.
|
||||||
* `video_vram` - Updated.
|
* `video_vram` - Updated.
|
||||||
|
* `tpm_model` - Updated.
|
||||||
|
* `tpm_type` - Updated.
|
||||||
|
* `tpm_path` - Updated.
|
||||||
|
|
||||||
|
|
||||||
## Networks
|
## Networks
|
||||||
@ -653,6 +658,32 @@ Vagrant.configure("2") do |config|
|
|||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## TPM Devices
|
||||||
|
|
||||||
|
Modern versions of Libvirt support connecting to TPM devices on the host
|
||||||
|
system. This allows you to enable Trusted Boot Extensions, among other
|
||||||
|
features, on your guest VMs.
|
||||||
|
|
||||||
|
In general, you will only need to modify the `tpm_path` variable in your guest
|
||||||
|
configuration. However, advanced usage, such as the application of a Software
|
||||||
|
TPM, may require modifying the `tpm_model` and `tpm_type` variables.
|
||||||
|
|
||||||
|
The TPM options will only be used if you specify a TPM path. Declarations of
|
||||||
|
any TPM options without specifying a path will result in those options being
|
||||||
|
ignored.
|
||||||
|
|
||||||
|
Here is an example of using the TPM options:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.provider :libvirt do |libvirt|
|
||||||
|
libvirt.tpm_model = 'tpm-tis'
|
||||||
|
libvirt.tpm_type = 'passthrough'
|
||||||
|
libvirt.tpm_path = '/dev/tpm0'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
## Box Format
|
## Box Format
|
||||||
|
|
||||||
You can view an example box in the [example_box/directory](https://github.com/pradels/vagrant-libvirt/tree/master/example_box). That directory also contains instructions on how to build a box.
|
You can view an example box in the [example_box/directory](https://github.com/pradels/vagrant-libvirt/tree/master/example_box). That directory also contains instructions on how to build a box.
|
||||||
|
@ -59,6 +59,10 @@ module VagrantPlugins
|
|||||||
@keymap = config.keymap
|
@keymap = config.keymap
|
||||||
@kvm_hidden = config.kvm_hidden
|
@kvm_hidden = config.kvm_hidden
|
||||||
|
|
||||||
|
@tpm_model = config.tpm_model
|
||||||
|
@tpm_type = config.tpm_type
|
||||||
|
@tpm_path = config.tpm_path
|
||||||
|
|
||||||
# Boot order
|
# Boot order
|
||||||
@boot_order = config.boot_order
|
@boot_order = config.boot_order
|
||||||
|
|
||||||
@ -164,6 +168,7 @@ module VagrantPlugins
|
|||||||
env[:ui].info(" -- Video Type: #{@video_type}")
|
env[:ui].info(" -- Video Type: #{@video_type}")
|
||||||
env[:ui].info(" -- Video VRAM: #{@video_vram}")
|
env[:ui].info(" -- Video VRAM: #{@video_vram}")
|
||||||
env[:ui].info(" -- Keymap: #{@keymap}")
|
env[:ui].info(" -- Keymap: #{@keymap}")
|
||||||
|
env[:ui].info(" -- TPM Path: #{@tpm_path}")
|
||||||
|
|
||||||
@boot_order.each do |device|
|
@boot_order.each do |device|
|
||||||
env[:ui].info(" -- Boot device: #{device}")
|
env[:ui].info(" -- Boot device: #{device}")
|
||||||
|
@ -155,6 +155,35 @@ module VagrantPlugins
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#TPM
|
||||||
|
if config.tpm_path
|
||||||
|
raise Errors::FogCreateServerError, "The TPM Path must be fully qualified" unless config.tpm_path[0].chr == '/'
|
||||||
|
|
||||||
|
tpm = REXML::XPath.first(xml_descr,'/domain/devices/tpm')
|
||||||
|
if tpm.nil?
|
||||||
|
descr_changed = true
|
||||||
|
tpm = REXML::Element.new('tpm', REXML::XPath.first(xml_descr,'/domain/devices/tpm/model'))
|
||||||
|
tpm.attributes['model'] = config.tpm_model
|
||||||
|
tpm_backend_type = tpm.add_element('backend')
|
||||||
|
tpm_backend_type.attributes['type'] = config.tpm_type
|
||||||
|
tpm_device_path = tpm_backend_type.add_element('device')
|
||||||
|
tpm_device_path.attributes['path'] = config.tpm_path
|
||||||
|
else
|
||||||
|
if tpm.attributes['model'] != config.tpm_model
|
||||||
|
descr_changed = true
|
||||||
|
tpm.attributes['model'] = config.tpm_model
|
||||||
|
end
|
||||||
|
if tpm.elements['backend'].attributes['type'] != config.tpm_type
|
||||||
|
descr_changed = true
|
||||||
|
tpm.elements['backend'].attributes['type'] = config.tpm_type
|
||||||
|
end
|
||||||
|
if tpm.elements['backend'].elements['device'].attributes['path'] != config.tpm_path
|
||||||
|
descr_changed = true
|
||||||
|
tpm.elements['backend'].elements['device'].attributes['path'] = config.tpm_path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Video device
|
# Video device
|
||||||
video = REXML::XPath.first(xml_descr,'/domain/devices/video/model')
|
video = REXML::XPath.first(xml_descr,'/domain/devices/video/model')
|
||||||
if video.attributes['type'] != config.video_type || video.attributes['vram'] != config.video_vram
|
if video.attributes['type'] != config.video_type || video.attributes['vram'] != config.video_vram
|
||||||
|
@ -80,6 +80,12 @@ module VagrantPlugins
|
|||||||
attr_accessor :keymap
|
attr_accessor :keymap
|
||||||
attr_accessor :kvm_hidden
|
attr_accessor :kvm_hidden
|
||||||
|
|
||||||
|
# Sets the information for connecting to a host TPM device
|
||||||
|
# Only supports socket-based TPMs
|
||||||
|
attr_accessor :tpm_model
|
||||||
|
attr_accessor :tpm_type
|
||||||
|
attr_accessor :tpm_path
|
||||||
|
|
||||||
# Sets the max number of NICs that can be created
|
# Sets the max number of NICs that can be created
|
||||||
# Default set to 8. Don't change the default unless you know
|
# Default set to 8. Don't change the default unless you know
|
||||||
# what are doing
|
# what are doing
|
||||||
@ -143,6 +149,10 @@ module VagrantPlugins
|
|||||||
@keymap = UNSET_VALUE
|
@keymap = UNSET_VALUE
|
||||||
@kvm_hidden = UNSET_VALUE
|
@kvm_hidden = UNSET_VALUE
|
||||||
|
|
||||||
|
@tpm_model = UNSET_VALUE
|
||||||
|
@tpm_type = UNSET_VALUE
|
||||||
|
@tpm_path = UNSET_VALUE
|
||||||
|
|
||||||
@nic_adapter_count = UNSET_VALUE
|
@nic_adapter_count = UNSET_VALUE
|
||||||
|
|
||||||
# Boot order
|
# Boot order
|
||||||
@ -404,6 +414,9 @@ module VagrantPlugins
|
|||||||
@video_vram = 9216 if @video_vram == UNSET_VALUE
|
@video_vram = 9216 if @video_vram == UNSET_VALUE
|
||||||
@keymap = 'en-us' if @keymap == UNSET_VALUE
|
@keymap = 'en-us' if @keymap == UNSET_VALUE
|
||||||
@kvm_hidden = false if @kvm_hidden == UNSET_VALUE
|
@kvm_hidden = false if @kvm_hidden == UNSET_VALUE
|
||||||
|
@tpm_model = 'tpm-tis' if @tpm_model == UNSET_VALUE
|
||||||
|
@tpm_type = 'passthrough' if @tpm_type == UNSET_VALUE
|
||||||
|
@tpm_path = nil if @tpm_path == UNSET_VALUE
|
||||||
@nic_adapter_count = 8 if @nic_adapter_count == UNSET_VALUE
|
@nic_adapter_count = 8 if @nic_adapter_count == UNSET_VALUE
|
||||||
|
|
||||||
# Boot order
|
# Boot order
|
||||||
|
@ -122,5 +122,14 @@
|
|||||||
</source>
|
</source>
|
||||||
</hostdev>
|
</hostdev>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<% if @tpm_path -%>
|
||||||
|
<%# TPM Device -%>
|
||||||
|
<tpm model='<%= @tpm_model %>'>
|
||||||
|
<backend type='<%= @tpm_type %>'>
|
||||||
|
<device path='<%= @tpm_path %>'/>
|
||||||
|
</backend>
|
||||||
|
</tpm>
|
||||||
|
<% end -%>
|
||||||
</devices>
|
</devices>
|
||||||
</domain>
|
</domain>
|
||||||
|
Loading…
Reference in New Issue
Block a user