etc romfs

The ROMFS image is the contents of the /etc directory, including the start-up script contains any command support by Nuttx, and other customized contents needed.

Configuration

CONFIG_NSH_ROMFS          /* Mount a ROMFS file system at "/etc" and provide a system init script at
                             "/etc/init.d.rc.sysinit" and a startup script at "etc/init.d/rcS". */
CONFIG_ETC_ROMFSMOUNTPT   /* The default mountpoint for the ROMFS volume is "/etc", but that can be
                             changed with this setting.  This must be a absolute path beginning with '/'
                             and enclosed in quotes. */
CONFIG_ETC_ROMFSDEVNO     /* This is the minor number of the ROMFS block device. The default is '0'
                             corresponding to "/dev/ram0". */
CONFIG_ETC_ROMFSSECTSIZE  /* This is the sector size to use with the ROMFS volume. Since the default volume
                             is very small, this defaults to 64 but should be increased if the ROMFS volume
                             were to be become large. Any value selected must be a power of 2. */

This capability also depends on:

CONFIG_DISABLE_MOUNTPOINT  /* If mount point support is disabled, then you cannot mount any file systems. */
CONFIG_FS_ROMFS            /* This option enables ROMFS file system support. */

Start up Scripts

Start-Up Script. The start-up script contains any command support by Nuttx (i.e., that you see when you enter ‘nsh> help’). The implementation that is provided is intended to provide great flexibility for the use of Start-Up files. This paragraph will discuss the general behavior when all of the configuration options are set to the default values.

In this default case, enabling CONFIG_ETC_ROMFS will cause Nuttx to behave as follows at Nuttx start-up time:

  • Nuttx will create a read-only RAM disk (a ROM disk), containing a tiny ROMFS file system containing the following:

    `--init.d/
        `-- rcS
        `-- rc.sysinit
    

    Where rcS is the start-up script. Where rc.sysinit is the system-init script.

  • Nuttx will then mount the ROMFS file system at /etc, resulting in:

    |--dev/
    |   `-- ram0
    `--etc/
        `--init.d/
            `-- rcS
            `-- rc.sysinit
    
  • By default, the contents of rc.sysinit script are:

    # Create a RAMDISK and mount it at /tmp
    
    mkrd -m 1 -s 512 1024
    mkfatfs /dev/ram1
    mount -t vfat /dev/ram1 /tmp
    
  • NSH will execute the script at /etc/init.d/rc.sysinit at system init (before the first NSH prompt). After execution of the script, the root FS will look like:

    |--dev/
    |   |-- ram0
    |   `-- ram1
    |--etc/
    |   `--init.d/
    |       `-- rcS
    |       `-- rc.sysinit
    `--tmp/
    

Example Configurations. Here are some configurations that have CONFIG_ETC_ROMFS=y in the NuttX configuration file. They might provide useful examples:

  • boards/arm/stm32/hymini-stm32v/nsh2

  • boards/arm/dm320/ntosd-dm320/nsh

  • boards/sim/sim/sim/nsh

  • boards/sim/sim/sim/nsh2

  • boards/sim/sim/sim/nx

  • boards/sim/sim/sim/nx11

  • boards/sim/sim/sim/touchscreen

In most of these cases, the configuration sets up the default /etc/init.d/rc.sysinit and /etc/init.d/rcS script. The default script is here: apps/nshlib/rc.sysinit.template and apps/nshlib/rcS.template. (The funny values in the rc.sysinit.template like XXXMKRDMINORXXX get replaced via sed at build time). This default configuration creates a ramdisk and mounts it at /tmp as discussed above.

Customizing Start up Scripts

In order to modify the start-up behavior, there are three things to study:

  1. Configuration Options. The additional CONFIG_ETC_ROMFS configuration options discussed with Configuration

  2. tools/mkromfsimg.sh Script. The script tools/mkromfsimg.sh creates etc_romfs.c. It is not automatically executed. If you want to change the configuration settings associated with creating and mounting the /tmp directory, then it will be necessary to re-generate this header file using the tools/mkromfsimg.sh script.

    The behavior of this script depends upon several things:

    1. The configuration settings then installed configuration.

    2. The genromfs tool(available from http://romfs.sourceforge.net) or included within the NuttX buildroot toolchain. There is also a snapshot available in the NuttX tools repository here.

    3. The xxd tool that is used to generate the C header files (xxd is a normal part of a complete Linux or Cygwin installation, usually as part of the vi package).

    4. The file include/arch/board/rc.sysinit.template and the file include/arch/board/rcs.template

  3. rc.sysinit.template. The file apps/nshlib/rc.sysinit.template contains the general form of the rc.sysinit file; configured values are plugged into this template file to produce the final rc.sysinit file.

    rcS.template. The file apps/nshlib/rcS.template contains the general form of the rcS file; configured values are plugged into this template file to produce the final rcS file.

    To generate a custom rc.sysinit and rcS file a copy of rc.sysinit.template and rcS.template needs to be placed at tools/ and changed according to the desired start-up behaviour. Running tools/mkromfsimg.h creates etc_romfs.c which needs to be copied to arch/board/src and compiled in Makefile

All of the startup-behavior is contained in rc.sysinit.template and rcS.template. The role of mkromfsimg.sh script is to (1) apply the specific configuration settings to rc.sysinit.template to create the final rc.sysinit, and rcS.template to create the final rcS, and (2) to generate the source file etc_romfs.c containing the ROMFS file system image. To do this, mkromfsimg.sh uses two tools that must be installed in your system:

  1. The genromfs tool that is used to generate the ROMFS file system image.

  2. The xxd tool that is used to create the C header file.

Customizing ROMFS Image

The ROMFS image can be generated from the content in the corresponding board/arch/board/board/src/etc directory, and added by Makefile.

Example Configurations. Here are some configurations that have CONFIG_ETC_ROMFS=y in the NuttX configuration file. They might provide useful examples:

  • boards/risc-v/bl808/ox64/src/etc

  • boards/risc-v/qemu-rv/rv-virt/src/etc

  • boards/risc-v/esp32c3/esp32c3-devkit/src/etc

  • boards/risc-v/k230/canmv230/src/etc

  • boards/risc-v/jh7110/star64/src/etc

  • boards/arm64/rk3399/nanopi_m4/src/etc

  • boards/sim/sim/sim/src/etc