[libvirt-users] [libvirt] configuring network interface

Tanguy ROZIER tanguy at rozier.eu
Thu Feb 10 14:51:24 UTC 2011


OK so he should fix the problem with libvirt to associate a fixed MAC
to the interface of the VM :

<interface type='bridge'>
   <source bridge='br0'/>
   <mac address="00:11:22:33:44:55"/>       <----------this is here :
you must *define* the MAC address of your interface
</interface>

Tanguy

2011/2/10 Laine Stump <laine at laine.org>:
> On 02/10/2011 08:50 AM, Tanguy ROZIER wrote:
>>
>> Your problem is related to udev : every reboot of VM, udev in VM
>> checks the MAC address of the ethernet interface of the system to
>> associate it with a static name (eth0, eth1...).
>> If you change the MAC address of the Ethernet interface of your VM, it
>> will detect a new interface and associate it with a new name (ethx+1).
>> In order to avoid it :
>> try not to change the MAC address of your VM ethernet device (you can
>> fix it with libvirt xml),
>
> When a domain is defined with an interface, if no mac address is supplied,
> libvirt will automatically generate one and write that generated mac back to
> the config, so that the next time the guest boots it will be presented with
> an ethernet having the same mac address as the previous time.
>
> How are you defining your guests? Are you perhaps using "virsh create" (but
> using an existing image file) to create a transient guest each time you want
> to boot the guest, rather than doing "virsh define" once to create a
> persistent guest, then using "virsh start" each time you want to boot it?
> You should be doing the latter - if you continuously use "virsh create",
> libvirt will think that it's a "throw away" guest, and won't save the config
> (or any changes to it), so the next time you do "virsh create", the disk
> image will have memory of the previous run (by having "eth0" assigned to
> some particular mac address), but libvirt won't have any memory of it (it
> thinks you're creating a brand new guest), so it will generate a new mac
> address for the interface, the guest will boot, see a "new" interface,
> notice that "eth0" is already taken, so it will use "eth1", and so on.
>
> If you actually are using "virsh define" to define a persistent guest, do a
> "virsh dumpxml" of the guest after you've started and destroyed it, and see
> if there is a mac address in the interface config. If not, that's a bug.
>
>
>> or deactivate this mecanism in the VM : search in
>> /etc/udev/rules.d/70-persistent-net.rules : it calls
>> /lib/udev/write_net_rules at every reboot, you could chmod -x this
>> script in order to avoid it.
>
> This may work (or may not - I haven't investigated), but it isn't the right
> way to fix this problem. It's dealing with the symptom rather than the
> cause.
>
>
>> Tanguy
>>
>> 2011/2/10 Marcela Castro León<mcastrol at gmail.com>:
>>>
>>> Hello Laine:
>>> I've revised the configuration and followed all your instructions.
>>> I'll try to give you a better explain of my problem.
>>>
>>> a) I need a bridged (3) configuration, because I have to connect the
>>> guests
>>> from each others. (via ssh and execute mpi). I've three hosts, each of
>>> one
>>> has at least a guest.
>>> I'll only explain about the configuration of one of them, because the
>>> problem is only related a one configuration.
>>> hostname=rionegro  ip=192.168.1.4
>>> guest-name=rnompi1
>>>
>>> b) I've configured host bridge following step by step ther instruction on
>>> http://wiki.libvirt.org/page/Networking
>>> this is the /etc/network/config
>>>
>>> # The loopback network interface
>>> auto lo
>>> iface lo inet loopback
>>>
>>>
>>> auto br0
>>> iface br0 inet static
>>> address 192.168.1.4
>>> netmask 255.255.255.0
>>> network 192.168.1.0
>>> broadcast 192.168.1.255
>>> gateway 192.168.1.10
>>> bridge_ports eth0
>>> bridge_stp on
>>> bridge_fd 0
>>> bridge_maxwait 0
>>>
>>> c) this is the xml guest configuration related to the network.
>>>
>>>     <interface type='bridge'>
>>>       <source bridge='br0'/>
>>>     </interface>
>>>
>>>
>>> d) But the guest doesn't get any IP automatically, and create an
>>> interface
>>> with a variable name (eth4, eth5,etch6..). I don't know how to achieve
>>> the
>>> guest don't behave like this and create always its network interface with
>>> a
>>> fixed name, for example, eth0).
>>>
>>> Why I ask that?
>>>
>>> if the guest created an interface with a fixed name, I would configure
>>> and
>>> static ip for the it.
>>> I'm attaching a printscreen "rnompi1.jpg"  that show what ifconfig ahow
>>> on
>>> the guest (eth14 and without any IP). It doesn't get their host either.
>>>
>>> The only way I achieve to solve but "temporally" until reboot is
>>> configuring
>>> the guest statically using the name of the interface that has just up.In
>>> that case every works fine, and the guest can connect to all the other
>>> guests on the lan and others can connect to it.
>>> But this only works until reboot or reconfigure the guest, because each
>>> time
>>> the name of interface change, and my configuration I had done of
>>> /etc/network/interface didn't work any more because is related to another
>>> interface.
>>>
>>> I hope I've explained better the problem I have.
>>>
>>> Thank you very much, you've already helped too much to better understand
>>> the
>>> different cases of network configuration
>>>
>>> Regards.
>>>
>>>
>>>
>>>
>>> 2011/2/10 Marcela Castro León<mcastrol at gmail.com>
>>>>
>>>> Hello Laine:
>>>> Thank you very much.
>>>> I've showed only one of the guest, each one have it's own ip address.
>>>> Anyway, I'll follow your advise of revise all the configuration after
>>>> reading the doc.
>>>> Thank you very much again.
>>>> Regards.
>>>>
>>>> 2011/2/8 Laine Stump<laine at laine.org>
>>>>>
>>>>> (For future questions such as this, you may find you get a better
>>>>> response (and lower signal-noise ratio) by asking on the recently
>>>>> -created
>>>>> libvirt-users at redhat.com list, as libvir-list has a very large volume
>>>>> of
>>>>> patches and discussion about the internals of libvirt)
>>>>>
>>>>> On 02/08/2011 12:05 PM, Marcela Castro León wrote:
>>>>>
>>>>> Hello
>>>>> I've a lan of virtual machine configured with bridge. I've a private
>>>>> lan
>>>>> of 4 machine, but one of them have 2 lan-card with access to internet.
>>>>>
>>>>> Evertything works almost fine, except that I've configured on each
>>>>> guest
>>>>> the static configuration of the bridge with the ip address, like this:
>>>>>
>>>>> auto lo
>>>>> iface lo inet loopback
>>>>>
>>>>> auto eth6
>>>>> iface eth6 inet static
>>>>> address 192.168.1.41
>>>>> network 192.168.1.0
>>>>> netmask 255.255.255.0
>>>>> gateway 192.168.1.10
>>>>>
>>>>>
>>>>> So are you saying that you're attempting to give each guest the *same*
>>>>> IP
>>>>> address? There's no way that can possibly work, even if each is
>>>>> connected to
>>>>> a separate virtual network or bridge. Since the host's IP stack can
>>>>> "see"
>>>>> all of the guests' network traffic, regardless of the connection mode
>>>>> you
>>>>> choose, each must have a unique IP address even if they can't see each
>>>>> other.
>>>>>
>>>>>
>>>>>
>>>>> But each time I, for example, define the guest, it start with a
>>>>> ascending
>>>>> number of interface: eth6,eth7, eth8, etc, Now is initializing with
>>>>> eth12.
>>>>>
>>>>> There must be a mixup in the explanation - I'm understanding that you
>>>>> put
>>>>> the same config file in each guest, but each guest, when it starts,
>>>>> shows a
>>>>> different ethernet interface in its ifconfig. That doesn't seem right,
>>>>> because none of the guests know about each other. Or are you saying
>>>>> something different? Where are you seeing the "eth6", "eth7", ...
>>>>> "eth12"?
>>>>> In the guest XML config maybe?
>>>>>
>>>>> So, it doesn't get the manual configuration I've done on the
>>>>> /etc/network/interfaces.
>>>>> How can avoid this way of work of the number of ethernet interface the
>>>>> guest start?
>>>>>
>>>>> Why are you doing a manual/static definition on the guest at all? It's
>>>>> simpler to just leave the guest to automatically configure its eth0,
>>>>> and if
>>>>> you really want a particular IP address for a particular guest, handle
>>>>> that
>>>>> with a<host>  element in the<dhcp>  section of the virtual network the
>>>>> guest
>>>>> is connected to (or, if you're using a pure bridging setup, then in the
>>>>> static hosts config of the dhcp server on that network).
>>>>>
>>>>>
>>>>> A way i'm trying to solve is configuring the interface trough the guest
>>>>> xml definition,
>>>>>
>>>>> The guest xml interface configuration cannot be used to setup the IP
>>>>> address, route, etc config of the guest. It is only used for two
>>>>> things:
>>>>>
>>>>> 1) configuring what kind of hardware appears on the guest (but not what
>>>>> name the guest gives to it!)
>>>>>
>>>>> 2) configuring how that hardware is connected to the physical network
>>>>> (usually either via an existing bridge interface on the host (in order
>>>>> for
>>>>> the guest to appear as if its directly connected to the physical
>>>>> network),
>>>>> or via a "virtual network" created by libvirt (which is really just a
>>>>> bridge
>>>>> that's not directly connected to any physical interface, relying
>>>>> instead on
>>>>> the host's IP stack to route packets from the guest out to the physical
>>>>> network.)
>>>>>
>>>>> but the operation "define" on virsh accepted without error the xml i've
>>>>> done, but the dumpxml doesn't show them, so, it doesn't work at all.
>>>>> I've followed the instruction that said the manual "Application
>>>>> development guide - a guide to application development with libvirt" on
>>>>> page
>>>>> 71.
>>>>>
>>>>>
>>>>> That document is targeted towards software developers writing
>>>>> applications to manage virtual guests using the libvirt API, not for
>>>>> system
>>>>> administrators who are configuring virtual guests manually (or, more
>>>>> likely,
>>>>> by using software that uses the libvirt API, eg virsh or virt-manager).
>>>>> It
>>>>> likely contains more detail and less overview than what you need, which
>>>>> is
>>>>> probably what led to the confusion. I've included a pointer to a wiki
>>>>> page
>>>>> below that is more the appropriate level of information (Justin, if the
>>>>> docs
>>>>> you were working on are somewhere easily accessible, you can point to
>>>>> those
>>>>> instead.)
>>>>>
>>>>>
>>>>> The whole definition of the VM is attached, but the related to
>>>>> interface
>>>>> is:
>>>>>     <interface type='bridge'>
>>>>>       <source bridge='br0'/>
>>>>>       <target dev='vnet0'/>
>>>>>     <protocol>
>>>>>         <ip address="192.168.1.41" prefix="24"/>
>>>>>         <route gateway="192.168.1.10"/>
>>>>>     </protocol>
>>>>>     <bridge stp="off" delay="0.01">
>>>>>     <interface type="ethernet" name="eth12">
>>>>>     <protocol>
>>>>>         <ip address="192.168.1.41" prefix="24"/>
>>>>>         <route gateway="192.168.1.10"/>
>>>>>     </protocol>
>>>>>     </interface>
>>>>>     </bridge>
>>>>>     </interface>
>>>>>
>>>>>
>>>>> You are confusing the guest interface config (that is part of the
>>>>> guest's
>>>>> XML config, and described above), and host physical interface config
>>>>> (that
>>>>> is not in any way associated with guest config, but instead used to
>>>>> configure the host's physical network interfaces, bridges, bonds, and
>>>>> vlan
>>>>> interfaces; and nearly as important, is not supported on Ubuntu
>>>>> anyway).
>>>>>
>>>>> Actual guest interface config is *much* simpler than that.
>>>>>
>>>>>
>>>>>
>>>>> But after define, the dumpxml only show this part:
>>>>>     <interface type='bridge'>
>>>>>       <mac address='52:54:00:3c:92:9a'/>
>>>>>       <source bridge='br0'/>
>>>>>     </interface>
>>>>>
>>>>>
>>>>> That's because everything else you've put in your guest config is not
>>>>> actually a part of a valid guest interface config, and so is ignored.
>>>>>
>>>>>
>>>>>
>>>>> I would appreciate any help to solve the question. The problem I've is
>>>>> I
>>>>> lost the access to the guest every time the libvirt change the name of
>>>>> the
>>>>> interface eth1,2,3, etc.
>>>>>
>>>>> In this case I think it may be useful to start over. You've somehow
>>>>> been
>>>>> tricked into misunderstanding the way that network configuration in
>>>>> libvirt
>>>>> works, confusing host interface config with guest interface config, and
>>>>> the
>>>>> resulting config bears little resemblance to what would actually work.
>>>>>
>>>>> ==
>>>>> The first step is to read this page:
>>>>>
>>>>>    http://wiki.libvirt.org/page/Networking
>>>>>
>>>>> to get a basic overview.
>>>>>
>>>>> ==
>>>>> Second step: you should decide which of the three methods of connecting
>>>>> to guests to the physical network you want to use:
>>>>>
>>>>> 1) NATed
>>>>> 2) routed
>>>>> 3) bridged
>>>>>
>>>>> The simplest is (1), and that will probably work just fine as long as
>>>>> 1)
>>>>> you don't need incoming connections to the guests, and 2) you're not
>>>>> concerned about getting the last fraction of an ounce of performance
>>>>> out of
>>>>> the network.
>>>>>
>>>>> Depending on which of those 3 you decide to use:
>>>>>
>>>>> ==
>>>>> Third step: follow the instructions to either create a bridge interface
>>>>> on the host connected to a physical network interface (for (3)), or to
>>>>> create a libvirt virtual network using one of the two modes ((1) or (2)
>>>>> -
>>>>> actually the stock libvirt config already has a "default" network that
>>>>> is
>>>>> probably adequate for (1), and unless you understand IP routing very
>>>>> well,
>>>>> you'll likely want to avoid (2)).
>>>>>
>>>>> Once the physical network is setup:
>>>>>
>>>>> ==
>>>>> Fourth step: define your guests. In each guest, you'll have an
>>>>> <interface>  element, but it will be much simpler than what you've
>>>>> previously
>>>>> tried. For bridged mode, the interface section would look like this:
>>>>>
>>>>>   <interface type='bridge'>
>>>>>     <source bridge='br0'/>
>>>>>   </interface>
>>>>>
>>>>> Depending on the guest, you may want to specify what type of hardware
>>>>> is
>>>>> presented to the guest (default is rtl, which almost always works, but
>>>>> is
>>>>> not the best perfrorming), in particular, if the guest supports
>>>>> virtio-net,
>>>>> you'll want to add this into the<interface>  element:
>>>>>
>>>>>   <model type='virtio'/>
>>>>>
>>>>> For NATed or routed mode, the guest's interface definition would look
>>>>> like this:
>>>>>
>>>>>   <interface type='network'>
>>>>>      <source network='default'/>
>>>>>   </interface>
>>>>>
>>>>> (replace "default" with the name of the network you've defined, if
>>>>> you've
>>>>> defined your own). In this case also, you can add a<model type='...'/>
>>>>>  if
>>>>> appropriate.
>>>>>
>>>>> Note that I don't put anything in the<interface>  element about MAC
>>>>> address, target device, or bus address. Those are all setup
>>>>> automatically by
>>>>> libvirt the first time you start the guest, and it will make sure that
>>>>> the
>>>>> guests don't interfere with each other.
>>>>>
>>>>> ==
>>>>> Fifth step: only if you need a particular guest to have a particular
>>>>> fixed IP address, either 1) edit the network config file on the guest,
>>>>> 2)
>>>>> add a static host to the libvirt virtual network definition (giving the
>>>>> MAC
>>>>> address provided to the guest by libvirt during the initial guest
>>>>> startup)
>>>>> with a<host>  element added to the<dhcp>  element of the network;
>>>>> details
>>>>> are here:
>>>>>
>>>>>     http://www.libvirt.org/formatnetwork.html
>>>>>
>>>>> or 3) if you're using the bridged method to connect to the physical
>>>>> network, again either configure the guest's own config file, or add a
>>>>> static
>>>>> host definition to the dhcp server running on your physical network.
>>>>>
>>>>> If you still have problems don't hesitate to send another mail
>>>>> (although,
>>>>> as I said at the top, sending to libvirt-users at redhat.com may yield
>>>>> better
>>>>> results than libvir-list at redhat.com).
>>>
>>> _______________________________________________
>>> libvirt-users mailing list
>>> libvirt-users at redhat.com
>>> https://www.redhat.com/mailman/listinfo/libvirt-users
>>>
>>
>>
>
>



-- 
----------------------------------------
Tanguy ROZIER
tanguy at rozier.eu
+33 6 07 26 46 68
----------------------------------------




More information about the libvirt-users mailing list