# Creating and using an initrd for Firecracker

## Creating

### Based on alpine or suse

You can use the script found
[here](https://github.com/marcov/firecracker-initrd) to generate an initrd
either based on alpine or suse linux.

The script extracts the init system from each distribution and creates a initrd.

### Custom

Use this option for creating an initrd if you're building your own init or if
you need any specific files / logic in your initrd.

```bash
mkdir initrd
cp /path/to/your/init initrd/init
# copy everything else you need in initrd/
cd initrd
find . -print0 | cpio --null --create --verbose --format=newc > initrd.cpio
```

## Usage

When setting your boot source, add a `initrd_path` property like so:

```shell
curl --unix-socket /tmp/firecracker.socket -i \
    -X PUT 'http://localhost/boot-source'   \
    -H 'Accept: application/json'           \
    -H 'Content-Type: application/json'     \
    -d "{
        \"kernel_image_path\": \"/path/to/kernel\",
        \"boot_args\": \"console=ttyS0 reboot=k panic=1 pci=off\",
        \"initrd_path\": \"/path/to/initrd.cpio\"
    }"
```

### Notes

- You should not use a drive with `is_root_device: true` when using an initrd
- Make sure your kernel configuration has `CONFIG_BLK_DEV_INITRD=y`
- If you don't want to place your init at the root of your initrd, you can add
  `rdinit=/path/to/init` to your `boot_args` property
- If you intend to `pivot_root` in your init, it won't be possible because the
  initrd is mounted as a rootfs and cannot be unmounted. You will need to use
  `switch_root` instead.
