# Run Fuchsia Emulator (FEMU)

This document describes how to run Fuchsia under
emulation using the Fuchsia Emulator (FEMU), covering
differnent developer environments and setups.

For more information on FEMU, see the
[Fuchsia emulator overview](/docs/concepts/emulator/index.md).

## Prerequisites

Before you run FEMU, you must:

 * [Install Fuchsia source and create environment variables](/docs/get-started/get_fuchsia_source.md)
 * [Configure and build Fuchsia](/docs/get-started/build_fuchsia.md)
 * [Set up and configure FEMU](/docs/get-started/set_up_femu.md)

## Run Fuchsia on FEMU

If you haven't already, set up and build Fuchsia, using `fx set`,
specifying a `qemu` board and supported product. This example uses the `core` product:

```posix-terminal
fx set core.qemu-x64 --release [--with=...]

fx build
```

Note: More information on supported boards and products is in the
[Fuchsia emulator overview](/docs/concepts/emulator/index.md).

Next, run FEMU with `ssh` access (with the `-N` flag):

```posix-terminal
fx emu -N
```

### Run FEMU without GUI support

If you don't need graphics or working under the remote workflow,
you can run FEMU in headless mode by adding `--headless` argument to the
`fx emu` command, for example:

```posix-terminal
fx emu -N --headless
```

### Specify GPU used by FEMU

By default, FEMU tries using the host GPU automatically if it is available,
and will fall back to software rendering using
[SwiftShader](https://swiftshader.googlesource.com/SwiftShader/) if host GPU is
unavailable.

You can also add argument `--host-gpu` or `--software-gpu` to `fx emu` command
to enforce FEMU to use a specific graphics device.

### Develop remotely

There are multiple ways to develop Fuchsia remotely using FEMU, and all the
workflow supports GPU acceleration without requiring GPU drivers and runtime
on the local machine.

#### Remote Desktop

These instructions require remote access to the remote machine using remote
desktop tools like [Chrome Remote Desktop](https://remotedesktop.google.com/).

Follow general remote desktop instructions for logging in to your remote machine.
Once logged in, follow standard Fuchsia development instructions for building
Fuchsia, and use the following command to run Fuchsia in the emulator inside
your remote desktop session:

```posix-terminal
fx emu
```

The emulator will use Swiftshader instead of real GPU hardware for GPU
acceleration when running inside Chrome Remote Desktop. Performance will be
worse than using real GPU hardware but the benefit is that it runs on any
workstation.

#### `fx emu-remote` Command

These instructions work for local machines with macOS or Linux, and require SSH
access to a Linux workstation capable of building Fuchsia.

On the terminal of your local machine, type the following to build, fetch the
artifacts and start the emulator with networking:

```posix-terminal
fx emu-remote {{ '<var>REMOTE-WORKSTATION-NAME</var>' }}  -- -N
```

Alternatively, start the emulator on remote workstation, and open an WebRTC
connection to it using local browser.

On the terminal of your local machine, type the following to start the emulator
with networking on {{ '<var>REMOTE-WORKSTATION-NAME</var>' }} and have the
output forwarded using WebRTC to a Chrome tab on local machine:

```posix-terminal
fx emu-remote --stream {{ '<var>REMOTE-WORKSTATION-NAME</var>' }} -- -N
```

This by default uses software rendering and GPU acceleration is supported by
using an existing X server on the remote machine with access to GPU hardware:

```posix-terminal
fx emu-remote --stream --display :0 {{ '<var>REMOTE-WORKSTATION-NAME</var>' }} -- -N
```

Any arguments after “--” will be passed to the fx emu invocation on the remote
machine.

## Exit FEMU

To exit FEMU, run `dm poweroff` in the FEMU terminal.

## Next steps

Once you are running Fuchsia on FEMU, you can:

*   [Test components](/docs/development/run/run-test-component.md)
*   [Run end-to-end tests](/docs/development/testing/run_an_end_to_end_test.md)
