mirror of
				https://github.com/kholia/OSX-KVM.git
				synced 2025-11-04 05:32:43 +00:00 
			
		
		
		
	This is the last item using `brctl`, and we can just as easily replace it with the equivalent `ip` incantation.
		
			
				
	
	
		
			158 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
There are two main ways to set up networking on OS X / macOS, as it does not
 | 
						|
function with what QEMU defaults to for network settings:
 | 
						|
 | 
						|
-----------------------------------
 | 
						|
User Mode Networking (Easier Setup)
 | 
						|
-----------------------------------
 | 
						|
 | 
						|
By default, QEMU uses user mode networking (SLiRP). This networking mode is the
 | 
						|
slowest and is not visible via the outside network, but requires no host-side
 | 
						|
setup, so it's perfect if you just want internet but don't care about latency
 | 
						|
or about connecting to the VM from an external source.
 | 
						|
 | 
						|
In order to do this, change the line in your qemu-system-x86_64 command (found
 | 
						|
in boot-macOS.sh) to the following:
 | 
						|
 | 
						|
-netdev user,id=net0 -device network_adapter,netdev=net0,id=net0,mac=52:54:00:c9:18:27 \
 | 
						|
 | 
						|
Once you set network_adapter to the preferred adapter, no further setup is required; your
 | 
						|
internet should Just Werk™ in your virtual machine!
 | 
						|
 | 
						|
For further information on detailed configuration options, see QEMU's
 | 
						|
documentation on networking ( http://wiki.qemu.org/Documentation/Networking )
 | 
						|
 | 
						|
Here is the list of network adapters supported by macOS,
 | 
						|
 | 
						|
e1000-82545em - The problem that we run into here is that OS X is nitpicky
 | 
						|
about what emulated networking devices it is willing to accept. The
 | 
						|
e1000-82545em is a known adapter that can be used on pretty much any version of
 | 
						|
MacOS.
 | 
						|
 | 
						|
To use this adapter, replace network_adapter with e1000-82545em
 | 
						|
 | 
						|
vmxnet3,virtio-net-pci - An alternative solution to e1000. Instead of emulating
 | 
						|
the e1000, these are paravirtualized NICs, which can allow for better
 | 
						|
performance (in theory). The only catch is that the you need to have a recent
 | 
						|
version of MacOS (10.11 or later).
 | 
						|
 | 
						|
To use these adapters, replace network_adapter with vmxnet3 or virtio-net-pci.
 | 
						|
 | 
						|
 | 
						|
SSH access in user mode
 | 
						|
-----------------------
 | 
						|
 | 
						|
Although the IP address of the VM is not visible to the outside, it is possible
 | 
						|
to use port forwarding to access the VM's ports from your host, eg the SSH port.
 | 
						|
To achieve that:
 | 
						|
 | 
						|
- In MacOS, turn on SSH under System Preferences > Sharing > Remote Login.
 | 
						|
- Modify the startup script to include `-netdev user,id=net0,hostfwd=tcp::10022-:22`
 | 
						|
- Use `ssh localhost -p10022` to get in.
 | 
						|
 | 
						|
You can use the same for VNC.
 | 
						|
 | 
						|
-----------------------------------
 | 
						|
Tap Networking (Better Performance)
 | 
						|
-----------------------------------
 | 
						|
 | 
						|
Installing "virt-manager" automagically creates the "virbr0" local private bridge :-)
 | 
						|
 | 
						|
sudo apt-get install uml-utilities virt-manager
 | 
						|
 | 
						|
sudo ip tuntap add dev tap0 mode tap
 | 
						|
sudo ip link set tap0 up promisc on
 | 
						|
sudo ip link set dev tap0 master virbr0
 | 
						|
 | 
						|
sudo ip link set dev virbr0 up  # as needed
 | 
						|
sudo ip link set dev tap0 master virbr0
 | 
						|
 | 
						|
Note: If `virbr0` network interface is not present on your system, it may
 | 
						|
have been deactivated. Try enabling it by using the following commands,
 | 
						|
 | 
						|
virsh net-start default
 | 
						|
virsh net-autostart default
 | 
						|
 | 
						|
Add "-netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device e1000-82545em,netdev=net0,id=net0,mac=52:54:00:c9:18:27 \"
 | 
						|
to your qemu-system-x86_64 command.
 | 
						|
 | 
						|
 | 
						|
Using an rc.local startup script
 | 
						|
--------------------------------
 | 
						|
 | 
						|
I have the following commands present in `/etc/rc.local`.
 | 
						|
 | 
						|
#!/usr/bin/env bash
 | 
						|
sudo ip tuntap add dev tap0 mode tap
 | 
						|
sudo ip link set tap0 up promisc on
 | 
						|
sudo ip link set dev virbr0 up
 | 
						|
sudo ip link set dev tap0 master virbr0
 | 
						|
 | 
						|
This has been enough for me so far.
 | 
						|
 | 
						|
Note: You may need to enable the `rc.local` functionality manually on modern
 | 
						|
Ubuntu versions. Check out the [notes](notes.md) included in this repository
 | 
						|
for details.
 | 
						|
 | 
						|
 | 
						|
QEMU networking tip
 | 
						|
-------------------
 | 
						|
 | 
						|
# printf '52:54:00:AB:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256))  # generates QEMU compatible mac addresses!
 | 
						|
 | 
						|
 | 
						|
------------------
 | 
						|
Bridged Networking
 | 
						|
------------------
 | 
						|
 | 
						|
QEMU defaults to using NAT for its guests. It has a built-in DHCP server that
 | 
						|
provides addresses from the 192.168.12x.0 subnet. However, this configuration
 | 
						|
makes file sharing, printer sharing, and other common networking activities
 | 
						|
harder to use in a home network.
 | 
						|
 | 
						|
Bridged networking allows your QEMU guest to get an address on the same subnet
 | 
						|
as the host computer. For example, many home networks let the wireless router
 | 
						|
handle IP assignment via DHCP. Here are the steps for setting up the bridge.
 | 
						|
 | 
						|
To setup bridged networking from the command line, refer to this documentation
 | 
						|
at the Ubuntu website. https://help.ubuntu.com/community/KVM/Networking
 | 
						|
 | 
						|
Ultimately, the script for booting the QEMU guest will need a line similar to
 | 
						|
the following to enable bridged networking in the guest:
 | 
						|
 | 
						|
    -netdev bridge,id=net0,br=virbr0,"helper=/usr/lib/qemu/qemu-bridge-helper"
 | 
						|
 | 
						|
On some systems the `qemu-bridge-helper` file has incorrect permissions. For it
 | 
						|
to work, it needs to be setuid root. This can be accomplished with this command:
 | 
						|
 | 
						|
    $ sudo chmod u+s /usr/lib/qemu/qemu-bridge-helper
 | 
						|
 | 
						|
Note that this is sometimes viewed as a security hole. Be careful and understand
 | 
						|
what you are doing before running this command.
 | 
						|
 | 
						|
 | 
						|
-----------------------
 | 
						|
Bridged Networking 2023
 | 
						|
-----------------------
 | 
						|
 | 
						|
sudo mkdir -p /etc/qemu
 | 
						|
 | 
						|
sudo cp bridge.conf /etc/qemu
 | 
						|
 | 
						|
sudo chmod u+s /usr/lib/qemu/qemu-bridge-helper
 | 
						|
 | 
						|
sudo ip link add name br0 type bridge
 | 
						|
 | 
						|
sudo ip link set dev br0 up
 | 
						|
 | 
						|
sudo ip link set enx00e04c680a67 master br0 && sudo dhclient br0
 | 
						|
 | 
						|
$ brctl show
 | 
						|
bridge name	bridge id		STP enabled	interfaces
 | 
						|
br0		8000.ead0ee60b7c1	yes		enx00e04c680a67
 | 
						|
							tap0
 | 
						|
Use the following network device in scripts:
 | 
						|
 | 
						|
-netdev bridge,id=net0,br=br0,"helper=/usr/lib/qemu/qemu-bridge-helper" -device virtio-net-pci,netdev=net0,id=net0,mac=00:16:CB:00:11:34
 | 
						|
 | 
						|
Also see https://dortania.github.io/OpenCore-Post-Install/universal/iservices.html to tweak the config.plist file.
 |