Skip to content

Commit

Permalink
Editorial review of bhyve chapter.
Browse files Browse the repository at this point in the history
Reviewed by:	Allan Jude
Sponsored by:	iXsystems
  • Loading branch information
dlavigne committed May 5, 2014
1 parent aff82d4 commit 6daac9d
Showing 1 changed file with 93 additions and 101 deletions.
194 changes: 93 additions & 101 deletions en_US.ISO8859-1/books/handbook/virtualization/chapter.xml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,11 @@
<application>Virtual PC</application>.</para>
</listitem>

<listitem>
<para>How to install &os; as a guest in
<application>byhve</application>.</para>
</listitem>

<listitem>
<para>How to tune a &os; system for best performance under
virtualization.</para>
Expand Down Expand Up @@ -1289,36 +1294,35 @@ perm pass* 0660</programlisting>
<title>&os; as a Host with
<application>bhyve</application></title>

<para>Starting with &os; 10.0-RELEASE the BSD licensed hypervisor
<application>bhyve</application> is part of the base system.
<application>bhyve</application> supports a number of guests
including &os;, OpenBSD, and many flavors of &linux;.
<application>bhyve</application> currently only supports a
<para>Starting with &os; 10.0-RELEASE, the <application>bhyve</application>
<acronym>BSD</acronym>-licensed hypervisor is part of the base system.
This hypervisor supports a number of guests,
including &os;, OpenBSD, and many &linux; distributions.
Currently, <application>bhyve</application> only supports a
serial console and does not emulate a graphical console.
<application>bhyve</application> is a legacy-free hypervisor,
meaning that instead of translating instructions, and manually
managing memory mappings, it relies on the virtualization
offload features of newer <acronym>CPU</acronym>s.
<application>bhyve</application> also avoids emulating
compatible hardware for the guest, and instead relies on the
paravirtualization drivers, called
<literal>VirtIO</literal>.</para>

<para>Due to the design of <application>bhyve</application>, it is
only possible to use <application>bhyve</application> on
computers with newer processors that support &intel;
<acronym>EPT</acronym> (Extended Page Tables) or &amd;
<acronym>RVI</acronym> (Rapid Virtualization Indexing, also know
as <acronym>NPT</acronym> or Nested Page Tables). Most newer
As a legacy-free hypervisor, it relies on the virtualization
offload features of newer <acronym>CPU</acronym>s,
instead of translating instructions and manually
managing memory mappings.
It also avoids emulating
compatible hardware for the guest and instead relies on
para-virtualization drivers. In &os;, these are provided by the
&man.virtio.4; driver.</para>

<para>Due to the design of <application>bhyve</application>, it
requires a computer with a newer processor that supports &intel;
Extended Page Tables (<acronym>EPT</acronym>) or &amd;
Rapid Virtualization Indexing (<acronym>RVI</acronym>), also know
as Nested Page Tables (<acronym>NPT</acronym>). Most newer
processors, specifically the &intel;&nbsp;&core; i3/i5/i7 and
&intel;&nbsp;&xeon; E3/E5/E7 support this feature, for a
&intel;&nbsp;&xeon; E3/E5/E7, support this feature. For a
complete list of &intel; processors that support
<acronym>EPT</acronym> see the <link
xlink:href="http://ark.intel.com/search/advanced?s=t&amp;ExtendedPageTables=true">&intel;
ARK</link>. <acronym>RVI</acronym> is found on the 3rd
<acronym>EPT</acronym>, refer to <link
xlink:href="http://ark.intel.com/search/advanced?s=t&amp;ExtendedPageTables=true">http://ark.intel.com/search/advanced?s=t&amp;ExtendedPageTables=true</link>.
<acronym>RVI</acronym> is found on the 3rd
generation and later of the &amd.opteron; (Barcelona)
processors. The easiest way to check for support of
<acronym>EPT</acronym> or <acronym>RVI</acronym> on a system is
<acronym>EPT</acronym> or <acronym>RVI</acronym> is
to look for the <literal>POPCNT</literal> processor feature flag
on the <literal>Features2</literal> line in
<command>dmesg</command> or
Expand All @@ -1329,32 +1333,34 @@ perm pass* 0660</programlisting>

<para>The first step to creating a virtual machine in
<application>bhyve</application> is configuring the host
system. Load the <application>bhyve</application> kernel
module called vmm. Create a <filename>tap</filename>
system. First, load the <application>bhyve</application> kernel
module:</para>

<screen>&prompt.root; <userinput>kldload vmm</userinput></screen>

<para>Then, create a <filename>tap</filename>
interface for the network device in the virtual machine to
attach to. Optionally create a bridge interface and add the
<filename>tap</filename> interface as well as the physical
interface as members to allow the virtual machine to have
access to the network.</para>

<screen>&prompt.root; <userinput>kldload vmm</userinput>
&prompt.root; <userinput>kldload nmdm</userinput>
&prompt.root; <userinput>ifconfig <replaceable>tap0</replaceable> create</userinput>
attach to. In order for the network device to participate in
the network, also create a bridge interface containing the
<filename>tap</filename> interface ane the physical
interface as members. In this example, the physical interface
is <replaceable>igb0</replaceable>:</para>

<screen>&prompt.root; <userinput>ifconfig <replaceable>tap0</replaceable> create</userinput>
&prompt.root; <userinput>sysctl net.link.tap.up_on_open=1</userinput>
net.link.tap.up_on_open: 0 -> 1
&prompt.root; <userinput>ifconfig <replaceable>bridge0</replaceable> create</userinput>
&prompt.root; <userinput>ifconfig <replaceable>bridge0</replaceable> addm <replaceable>igb0</replaceable> addm <replaceable>tap0</replaceable></userinput>
&prompt.root; <userinput>ifconfig <replaceable>bridge0</replaceable> up</userinput></screen>

</sect2>

<sect2 xml:id="virtualization-bhyve-freebsd">
<title>Creating a FreeBSD Guest</title>

<para>Create a file to use as the virtual disk for the guest
machine.</para>
machine. Specify the size and name of the virtual disk:</para>

<screen>&prompt.root; <userinput>truncate -s <replaceable>16G</replaceable> <filename>guest.img</filename></userinput></screen>
<screen>&prompt.root; <userinput>truncate -s <replaceable>16G</replaceable> <replaceable>guest.img</replaceable></userinput></screen>

<para>Download an installation image of &os; to install:</para>

Expand All @@ -1365,21 +1371,21 @@ FreeBSD-10.0-RELEASE-amd64-bootonly.iso 100% of 209 MB 570 kBps 06m17s</
machine in <application>bhyve</application>. The script will
start the virtual machine and run it in a loop, so it will
automatically restart if it crashes. The script takes a
number of options to control the configuration of the machine.
<option>-c</option> controls the number of virtual CPUs.
number of options to control the configuration of the machine:
<option>-c</option> controls the number of virtual CPUs,
<option>-m</option> limits the amount of memory available to
the guest. <option>-t</option> defines which
<filename>tap</filename> device to use. <option>-d</option>
indicates which disk image to use. <option>-i</option> tells
<application>bhyve</application> to boot from the CD image
instead of the disk, and <option>-I</option> defines which CD
image to use. Finally the last parameter is the name of the
virtual machine, used to track the running machines. Start
the guest, <option>-t</option> defines which
<filename>tap</filename> device to use, <option>-d</option>
indicates which disk image to use, <option>-i</option> tells
<application>bhyve</application> to boot from the <acronym>CD</acronym> image
instead of the disk, and <option>-I</option> defines which <acronym>CD</acronym>
image to use. The last parameter is the name of the
virtual machine, used to track the running machines. This example starts
the virtual machine in installation mode:</para>

<screen>&prompt.root; <userinput>sh <filename>/usr/share/examples/bhyve/vmrun.sh</filename> -c <replaceable>4</replaceable> -m <replaceable>1024M</replaceable> -t tap0 -d <filename>guest.img</filename> -i -I <filename>FreeBSD-10.0-RELEASE-amd64-bootonly.iso</filename> <replaceable>guestname</replaceable></userinput></screen>
<screen>&prompt.root; <userinput>sh /usr/share/examples/bhyve/vmrun.sh -c <replaceable>4</replaceable> -m <replaceable>1024M</replaceable> -t tap0 -d <replaceable>guest.img</replaceable> -i -I <replaceable>FreeBSD-10.0-RELEASE-amd64-bootonly.iso</replaceable> <replaceable>guestname</replaceable></userinput></screen>

<para>The system will boot and start the installer. After
<para>The virtual machine will boot and start the installer. After
installing a system in the virtual machine, when the system
asks about dropping in to a shell at the end of the
installation, choose <guibutton>Yes</guibutton>. A small
Expand All @@ -1389,34 +1395,35 @@ FreeBSD-10.0-RELEASE-amd64-bootonly.iso 100% of 209 MB 570 kBps 06m17s</

<programlisting>console "/usr/libexec/getty std.9600" xterm on secure</programlisting>

<para>Reboot the virtual machine. Rebooting the virtual machine
causes <application>bhyve</application> to exit. However the
<para>Reboot the virtual machine. While rebooting the virtual machine
causes <application>bhyve</application> to exit, the
<filename>vmrun.sh</filename> script runs
<command>bhyve</command> in a loop and will automatically
restart it. When this happens, choose the reboot option from
the boot loader menu, and this will escape the loop. Now the
the boot loader menu in order to escape the loop. Now the
guest can be started from the virtual disk:</para>

<screen>&prompt.root; <userinput>sh <filename>/usr/share/examples/bhyve/vmrun.sh</filename> -c <replaceable>4</replaceable> -m <replaceable>1024M</replaceable> -t tap0 -d <filename>guest.img</filename> <replaceable>guestname</replaceable></userinput></screen>
<screen>&prompt.root; <userinput>sh /usr/share/examples/bhyve/vmrun.sh -c <replaceable>4</replaceable> -m <replaceable>1024M</replaceable> -t tap0 -d <replaceable>guest.img</replaceable> <replaceable>guestname</replaceable></userinput></screen>
</sect2>

<sect2 xml:id="virtualization-bhyve-linux">
<title>Creating a &linux; Guest</title>

<note><para><application>bhyve</application> requires
<package>sysutils/grub2-bhyve</package> in order to boot
operating systems other than &os;.</para></note>
<para>In order to boot operating systems other than &os;, the
<package>sysutils/grub2-bhyve</package> port must be first
installed.</para>

<para>Create a file to use as the virtual disk for the guest
machine.</para>
<para>Next, create a file to use as the virtual disk for the guest
machine:</para>

<screen>&prompt.root; <userinput>truncate -s <replaceable>16G</replaceable> <filename>linux.img</filename></userinput></screen>
<screen>&prompt.root; <userinput>truncate -s <replaceable>16G</replaceable> <replaceable>linux.img</replaceable></userinput></screen>

<para>Starting a virtual machine with
<application>bhyve</application> is a two step process. First
a kernel must be loaded, then the guest can be started.
<package>sysutils/grub2-bhyve</package> is used to load the
&linux; kernel. Create a <filename>device.map</filename> that
The &linux; kernel is loaded with
<package>sysutils/grub2-bhyve</package>.
Create a <filename>device.map</filename> that
<application>grub</application> will use to map the virtual
devices to the files on the host system:</para>

Expand All @@ -1426,10 +1433,10 @@ FreeBSD-10.0-RELEASE-amd64-bootonly.iso 100% of 209 MB 570 kBps 06m17s</
<para>Use <package>sysutils/grub2-bhyve</package> to load the
&linux; kernel from the <acronym>ISO</acronym> image:</para>

<screen>&prompt.root; <userinput>grub-bhyve -m <filename>device.map</filename> -r cd0 -M <replaceable>1024M</replaceable> <replaceable>linuxguest</replaceable></userinput></screen>
<screen>&prompt.root; <userinput>grub-bhyve -m device.map -r cd0 -M <replaceable>1024M</replaceable> <replaceable>linuxguest</replaceable></userinput></screen>

<para>This will start grub. If the installation CD contains a
<filename>grub.cfg</filename> then a menu will be displayed.
<para>This will start grub. If the installation <acronym>CD</acronym> contains a
<filename>grub.cfg</filename>, a menu will be displayed.
If not, the <literal>vmlinuz</literal> and
<literal>initrd</literal> files must be located and loaded
manually:</para>
Expand All @@ -1446,14 +1453,8 @@ grub> <userinput>boot</userinput></screen>
<para>Now that the &linux; kernel is loaded, the guest can be
started:</para>

<screen>&prompt.root; <userinput>bhyve -AI -H -P \
-s 0:0,hostbridge \
-s 1:0,lpc \
-s 2:0,virtio-net,tap1 \
-s 3:0,virtio-blk,./linux.img \
-s 4:0,ahci-cd,./somelinux.iso \
-l com1,stdio \
-c <replaceable>4</replaceable> -m <replaceable>1024M</replaceable> <replaceable>linuxguest</replaceable></userinput></screen>
<screen>&prompt.root; <userinput>bhyve -AI -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./linux.img \
-s 4:0,ahci-cd,./somelinux.iso -l com1,stdio -c <replaceable>4</replaceable> -m <replaceable>1024M</replaceable> <replaceable>linuxguest</replaceable></userinput></screen>

<para>The system will boot and start the installer. After
installing a system in the virtual machine, reboot the virtual
Expand All @@ -1466,7 +1467,7 @@ grub> <userinput>boot</userinput></screen>
<para>Now the guest can be started directly from the virtual
disk. Load the kernel:</para>

<screen>&prompt.root; <userinput>grub-bhyve -m <filename>device.map</filename> -r hd0,msdos1 -M <replaceable>1024M</replaceable> <replaceable>linuxguest</replaceable></userinput>
<screen>&prompt.root; <userinput>grub-bhyve -m device.map -r hd0,msdos1 -M <replaceable>1024M</replaceable> <replaceable>linuxguest</replaceable></userinput>
grub> <userinput>ls</userinput>
(hd0) (hd0,msdos2) (hd0,msdos1) (cd0) (cd0,msdos1) (host)
(lvm/VolGroup-lv_swap) (lvm/VolGroup-lv_root)
Expand All @@ -1480,13 +1481,8 @@ grub> <userinput>boot</userinput></screen>

<para>Boot the virtual machine:</para>

<screen>&prompt.root; <userinput>bhyve -AI -H -P \
-s 0:0,hostbridge \
-s 1:0,lpc \
-s 2:0,virtio-net,tap1 \
-s 3:0,virtio-blk,./linux.img \
-l com1,stdio \
-c <replaceable>4</replaceable> -m <replaceable>1024M</replaceable> <replaceable>linuxguest</replaceable></userinput></screen>
<screen>&prompt.root; <userinput>bhyve -AI -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap1 \
-s 3:0,virtio-blk,./linux.img -l com1,stdio -c <replaceable>4</replaceable> -m <replaceable>1024M</replaceable> <replaceable>linuxguest</replaceable></userinput></screen>

<para>&linux; will now boot in the virtual machine and
eventually present you with the login prompt. Login and use
Expand All @@ -1498,32 +1494,28 @@ grub> <userinput>boot</userinput></screen>
</sect2>

<sect2 xml:id="virtualization-bhyve-nmdm">
<title>Virtual Machines Consoles</title>
<title>Virtual Machine Consoles</title>

<para>It is advantageous to wrap the
<application>bhyve</application> console in a session
management tool such as <package>sysutils/tmux</package> or
<package>sysutils/screen</package> in order to detach and
reattach to the console. It is also possible to have the
console of <application>bhyve</application> be a null modem
device that can be accessed with <command>cu</command>. Load
the <filename>nmdm</filename> kernel module, and replace
device that can be accessed with <command>cu</command>. To do this, load
the <filename>nmdm</filename> kernel module and replace
<option>-l com1,stdio</option> with
<option>-l com1,/dev/nmdm0A</option>. The
<filename>/dev/nmdm</filename> devices are created
automatically as needed, each is a pair,
<filename>/dev/nmdm1A</filename> and
<filename>/dev/nmdm1B</filename> corresponding to the two ends
of the null modem cable. See &man.nmdm.4; for more
automatically as needed, where each is a pair, corresponding to the two ends
of the null modem cable
(<filename>/dev/nmdm1A</filename> and
<filename>/dev/nmdm1B</filename>). See &man.nmdm.4; for more
information.</para>

<screen>&prompt.root; <userinput>bhyve -AI -H -P \
-s 0:0,hostbridge \
-s 1:0,lpc \
-s 2:0,virtio-net,tap1 \
-s 3:0,virtio-blk,./linux.img \
-l com1,<replaceable>/dev/nmdm0A</replaceable> \
-c <replaceable>4</replaceable> -m <replaceable>1024M</replaceable> <replaceable>linuxguest</replaceable></userinput>
<screen>&prompt.root; <userinput>kldload nmdm</userinput>
&prompt.root; <userinput>bhyve -AI -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./linux.img \
-l com1,<replaceable>/dev/nmdm0A</replaceable> -c <replaceable>4</replaceable> -m <replaceable>1024M</replaceable> <replaceable>linuxguest</replaceable></userinput>
&prompt.root; <userinput>cu -l /dev/nmdm0B -s 9600</userinput>
Connected

Expand All @@ -1549,18 +1541,18 @@ crw------- 1 root wheel 0x1a2 Mar 17 12:20 guestname
crw------- 1 root wheel 0x19f Mar 17 12:19 linuxguest
crw------- 1 root wheel 0x1a1 Mar 17 12:19 otherguest</screen>

<para>Virtual machines can be destroyed using
<para>A specified virtual machine can be destroyed using
<command>bhyvectl</command>:</para>

<screen>&prompt.root; bhyvectl --destroy --vm=guestname</screen>
<screen>&prompt.root; bhyvectl --destroy --vm=<replaceable>guestname</replaceable></screen>
</sect2>

<sect2 xml:id="virtualization-bhyve-onboot">
<title>Persistent Configuration</title>

<para>In order to make the system able to start
<application>bhyve</application> guests at boot time, the
following configurations must be made in the specified
<para>In order to configure the system to start
<application>bhyve</application> guests at boot time, add
the following entries to in the following
files:</para>

<procedure>
Expand All @@ -1582,8 +1574,8 @@ if_tap_load="YES"</programlisting>
<step>
<title><filename>/etc/rc.conf</filename></title>

<programlisting>cloned_interfaces="bridge0 tap0"
ifconfig_bridge0="addm igb0 addm tap0"</programlisting>
<programlisting>cloned_interfaces="<replaceable>bridge0</replaceable> <replaceable>tap0</replaceable>"
ifconfig_bridge0="addm <replaceable>igb0</replaceable> addm <replaceable>tap0</replaceable>"</programlisting>
</step>
</procedure>
</sect2>
Expand Down

0 comments on commit 6daac9d

Please sign in to comment.