This guide provides instructions on how to set up and launch the Fuchsia emulator (FEMU) on your machine.
The steps are:
Running FEMU requires that you've completed the following guides:
To run FEMU, you first need to build a Fuchsia system image that supports the emulator environment. This guide uses x64
for the board and workbench_eng
for the product as an example.
To build a FEMU Fuchsia image, do the following:
Set the Fuchsia build configuration:
fx set workbench_eng.x64 --release
Build Fuchsia:
fx build
For more information on supported boards and products, see the Fuchsia emulator (FEMU) overview page.
(Linux only) Most Linux machines support VM acceleration through KVM, which greatly improves the performance and usability of the emulator.
If KVM is available on your machine, add yourself to the kvm
group on your machine:
sudo usermod -a -G kvm ${USER}
Log out of all desktop sessions to your machine and then log in again.
To verify that KVM is configured correctly, run the following command:
if [[ -r /dev/kvm ]] && grep '^flags' /proc/cpuinfo | grep -qE 'vmx|svm'; then echo 'KVM is working'; else echo 'KVM not working'; fi
Verify that this command prints the following line:
KVM is working
If you see KVM not working
, you may need to reboot your machine for the permission change to take effect.
Prior to starting the emulator, start the package server.
To start the package server, run the following command:
fx serve
Once this command is run, it does not terminate and keeps the Fuchsia package server running on the host machine (unless the terminal is closed or Ctrl+C
is pressed on the terminal, which kills the command).
Alternatively you can background the fx serve
process.
Start the Fuchsia emulator on your Linux machine.
If your machine is behind a firewall, you may need to apply some additional configuration to allow the emulator to access the network. This is typically accomplished by running an “upscript”, which sets up the interfaces and firewall access rules for the current process. If you're on a corporate network, check with your internal networking team to see if they have an existing upscript for you to use.
However, even if you‘re not behind a firewall, there’s still some configuration needed to enable tun/tap networking. The example upscript at {{ ‘’ }}FUCHSIA_ROOT{{ ‘’ }}/scripts/start-unsecure-internet.sh should work for the majority of non-corporate users.
To start the emulator, do the following:
Start a new terminal.
To configure the upscript, run the following command:
ffx config set emu.upscript {{ '<var>' }}FUCHSIA_ROOT{{ '</var>' }}/scripts/start-unsecure-internet.sh
start-unsecure-internet.sh
is an example upscript.FUCHSIA_ROOT
is the path to your Fuchsia directory.Start the emulator with access to external networks:
ffx emu start --net tap
--net
specifies the networking mode for the emulator. --net tap
attaches to a Tun/Tap interface.
Or, you can start the emulator without access to external networks:
ffx emu start --net none
Starting the emulator opens a new window with the title Fuchsia Emulator.
To discover the Fuchsia emulator as a running Fuchsia device, run the following command:
ffx target list
This command prints output similar to the following:
$ ffx target list NAME SERIAL TYPE STATE ADDRS/IP RCS fuchsia-emulator <unknown> workbench_eng.x64 Product [fe80::866a:a5ea:cd9e:69f6%qemu] N
fuchsia-emulator
is the default node name of the Fuchsia emulator.
The output of ffx target list
is influenced by the --net
option in the following ways:
--net none
disables networking, which causes the device to be not discoverable by ffx target list
.
--net tap
and --net user
allow the device to be discoverable when running ffx target list
.
If no target is found after running ffx target list
, the target may need to be added manually by running ffx target add
:
ffx target add {{ "<var>" }}device-ip{{ "</var>" }}:{{ "<var>" }}device-port{{ "</var>" }}
To learn more about Fuchsia device commands and Fuchsia workflows, see Explore Fuchsia.
This section provides additional FEMU options.
To see a full list of the emulator's supported flags, run the following command:
ffx emu start --help
If you don't need graphics or working under the remote workflow, you can run FEMU in headless mode:
ffx emu start --headless
To reboot FEMU, run the following ffx
command:
ffx target reboot
To stop FEMU, run the following ffx
command:
ffx emu stop
This section provides instructions on how to configure an IPv6 network for FEMU on Linux machine using TUN/TAP{: .external}.
Note: You only need to do this once per machine.
To enable networking in FEMU using tap networking{: .external}, do the following:
Set up tuntap
:
sudo ip tuntap add dev qemu mode tap user $USER
Enable the network for qemu
:
sudo ip link set qemu up
By default, the FEMU launcher uses SwiftShader{:.external} Vulkan ICD for host graphics rendering. With the --gpu
flag, you can set the emulator to use the host GPU hardware for rendering. See the following options:
The host
and auto
GPU emulation modes are for experimental use only and are not officially supported at the moment. You may see graphics artifacts, testing failures or emulator crashes when using these two modes.