Installing Fuchsia on a device

This guide helps you understand the device installation process for Fuchsia. The Fuchsia install process, called ‘paving’, requires two machines, the machine on which you build Fuchsia (“host”) and the device on which you want to run Fuchsia (“target”). The host and target must be able to communicate over a local area network.

This guide covers at a high level how to use your host system to build Fuchsia, create a piece of install media, and stream the system over the network to the target.

Building

The fx command is used throughout these instructions. Before you can install Fuchsia on a device, you must have Fuchsia source on your host by following the instructions in these two documents:

If you have fx mapped into your command path you can follow these instructions. If you don‘t have fx in your path, it can be found at //scripts/fx and you’ll need to use the appropriate relative path in the supplied commands.

Many fx commands are wrappers around build actions in GN coupled with tool invocations.

Assuming that the target system is x86-based and that you want to build a complete Fuchsia system, you can set Fuchsia with the following command:

fx set {product_name}.x64`

Note: For more information on supported products, see product and board.

Then build Fuchsia:

fx build

Creating install media

To create your install media you should use a USB drive since these are well-supported as boot media by most systems.

Note: Creating a USB drive wipes everything from the USB drive being used.

To create a USB drive, insert a USB drive into the host machine and run:

fx mkzedboot <device_path>

On Linux, device_path is typically /dev/sd<X> where X is a letter. On macOS it is typically /dev/disk<N> where ‘N’ is a number. If you don't specify a device path, mkzedboot lists the drives it detects. Be careful not to select the wrong device. Once this is done, remove the USB drive.

Paving

Next, you must build the artifacts to transfer over the network during the paving process. What is transferred is dependent on the target device. For UEFI based systems (like the Intel NUC) our output target type is ‘efi’.

To start the bootserver with the correct image just run fx pave.

Insert the install media into the target device that you want to pave. The target device‘s boot settings may need to be changed to boot from the USB device and this is typically device-specific. For the guides listed below, only go through the steps to set the boot device, don’t continue with any instructions on creating install media.

Paving should occur automatically after the device is booted into Zedboot from the USB drive. After the paving process completes, the system should boot into the Zircon kernel. After paving, the whole system is installed on internal storage.

At this point the USB key can be removed since the system has everything it needs stored locally. If you plan to re-pave frequently it may be useful to keep the USB drive inserted so your system boots into Zedboot by default where paving happens automatically. After the initial pave on UEFI systems that use Gigaboot, another option for re-paving is to press ‘z’ while in Gigaboot to select Zedboot.

Troubleshooting

In some cases paving may fail because you have a disk layout that is incompatible. In these cases you will see a message that asks you to run ‘install-disk-image wipe’. If it is incompatible because it contains an older Fuchsia layout put there by installer (vs the paver) you can fix this by killing the fx pave process on the host, switching to a different console (Alt+F3) on the target, and running install-disk-image wipe. Then reboot the target, re-run fx pave on the host, and the pave should succeed.

In some cases paving may fail with an error indicating “couldn't find space in gpt”. In these cases (as long as you don‘t want to keep the other OS, i.e. Windows, parts) run lsblk and identify the partition that isn’t your USB (it shouldn't have RE in the columns). Identify the number in the first column for your partition (likely to be either 000 or 003). Then, run:

Note: N is the number you just identified.

gpt Init /dev/class/block/N

This clears all Windows partitions from the disk. Once this is done, reboot into zedboot and paving should work.

Changing boot target (localboot, netboot, etc) default

For EFI-based systems, it is possible to change the default boot option of the system paved on the target between local booting and Zedboot for network booting. By default the system boots locally with a 1-second delay in Gigaboot to allow you to select a different mode. To change this default to Zedboot, supply the always_zedboot argument when calling your set command, for example fx set <goal> --args "always_zedboot=true".

More information