nsh/script: support rc.sysinit script

Follow: http://glennastory.net/boot/sysinit.html

This is first script that init runs is rc.sysinit. This
script does serval initialization tasks about basic service.

The boot sequence currently provided to the board level is:
board_earlyinitialize->
    board_lateinitialize(Peripherals driver, core driver, ...)->
	run rcS script(mount fs, run service) ->
	    board_appinitialize->

After this patch:
The boot sequence currently provided to the board level is:
board_earlyinitialize->
    board_lateinitialize(core driver,...)->
	run rc.sysinit script(mount fs, run core service) ->
	    board_appinitialize(Peripherals driver)->
		run rcS script(run other service)->

So, Peripheral drivers can do more with the file system and
core services.

Signed-off-by: Jiuzhu Dong <dongjiuzhu1@xiaomi.com>
This commit is contained in:
Jiuzhu Dong 2022-04-15 21:59:24 +08:00 committed by Petro Karashchenko
parent 768a21b587
commit 9f79bf183a
7 changed files with 97 additions and 34 deletions

View File

@ -700,8 +700,9 @@ config NSH_ROMFSETC
default n
depends on FS_ROMFS
---help---
Mount a ROMFS filesystem at /etc and provide a startup script
at /etc/init.d/rcS. The default startup script will mount
Mount a ROMFS filesystem at /etc and provide a system init
script at /etc/init.d/rc.sysinit and a startup script
at /etc/init.d/rcS. The default system init script will mount
a FAT FS RAMDISK at /tmp but the logic is easily extensible.
if NSH_ROMFSETC
@ -711,8 +712,9 @@ config NSH_CROMFSETC
default n
depends on FS_CROMFS
---help---
Mount a CROMFS filesystem at /etc and provide a compressed startup
script at /etc/init.d/rcS.
Mount a CROMFS filesystem at /etc and provide a compressed system
init script at /etc/init.d/rc.sysinit and a startup script
at /etc/init.d/rcS.
config NSH_ROMFSRC
bool "Support ROMFS login script"
@ -734,6 +736,14 @@ config NSH_ROMFSMOUNTPT
can be changed with this setting. This must be a absolute path
beginning with '/'.
config NSH_SYSINITSCRIPT
string "Relative path to sysinit script"
default "init.d/rc.sysinit"
---help---
This is the relative path to the sysinit script within the mountpoint.
The default is init.d/rc.sysinit. This is a relative path and must not
start with '/'.
config NSH_INITSCRIPT
string "Relative path to startup script"
default "init.d/rcS"

View File

@ -176,21 +176,28 @@ the `echo $PWD` command.
- `PWD` - The current working directory
- `OLDPWD` - The previous working directory
## NSH Start-Up Script
## NSH System-init And Start-Up Script
NSH supports options to provide a start up script for NSH. In general this
capability is enabled with `CONFIG_NSH_ROMFSETC`, but has several other related
configuration options as described in the final section of this README. This
capability also depends on:
NSH supports options to provide a system init script and start up script for NSH.
In general this capability is enabled with `CONFIG_NSH_ROMFSETC`, but has
several other related configuration options as described in the final section
of this README. This capability also depends on:
- `CONFIG_DISABLE_MOUNTPOINT` not set
- `CONFIG_FS_ROMFS`
### Default Start-Up Behavior
### Default Script Behavior
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.
the use of script files, include system init file and start-up file. This
paragraph will discuss the general behavior when all of the configuration
options are set to the default values.
System-init script is executed before Start-up script. The system-init script
is mainly used for file system mounting and core system service startup, and the
start-up script is used for application and other system service startup. So,
Between them, some initialize can use filesystem and core system service,
Examples: Peripheral driver initialize at `boardctl(BOARDIOC_FINALINIT, 0)`.
In this default case, enabling `CONFIG_NSH_ROMFSETC` will cause NSH to behave as
follows at NSH startup time:
@ -201,9 +208,11 @@ follows at NSH startup time:
```
| `--init.d/
`-- rcS
`-- rc.sysinit
````
Where `rcS` is the NSH start-up script
Where `rc.sysinit` is the NSH system-init script
- NSH will then mount the ROMFS file system at `/etc`, resulting in:
@ -213,9 +222,10 @@ follows at NSH startup time:
`--etc/
`--init.d/
`-- rcS
`-- rc.sysinit
```
- By default, the contents of `rcS` script are:
- By default, the contents of `rc.sysinit` script are:
```shell
# Create a RAMDISK and mount it at XXXRDMOUNTPOINTXXX
@ -225,8 +235,9 @@ follows at NSH startup time:
mount -t vfat /dev/ram1 /tmp
```
- NSH will execute the script at `/etc/init.d/rcS` at start-up (before the first
NSH prompt. After execution of the script, the root FS will look like:
- 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/
@ -235,6 +246,7 @@ follows at NSH startup time:
|--etc/
| `--init.d/
| `-- rcS
| `-- rc.sysinit
`--tmp/
```
@ -262,21 +274,27 @@ there are three things to study:
- The file `apps/nshlib/rcS.template` (OR, if `CONFIG_NSH_ARCHROMFS` is
defined, `include/arch/board/rcs.template`)
3. `rcS.template`. The file `apps/nshlib/rcS.template` contains the general form
3. `rc.sysinit.template`. The file `apps/nshlib/rc.sysinit.template` contains
the general form of the `rc.sysinit.template` 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.
**Note**: `apps/nshlib/rcS.template` generates the standard, default
`nsh_romfsimg.h` file. If `CONFIG_NSH_ARCHROMFS` is defined in the NuttX
configuration file, then a custom, board-specific `nsh_romfsimg.h` file residing
in `boards/<arch>/<chip>/<board>/include` will be used. **Note** when the OS is
configured, `include/arch/board` will be linked to
**Note**: `apps/nshlib/rc.sysinit.template` and ` apps/nshlib/rcS.template`
generates the standard, default `nsh_romfsimg.h` file. If `CONFIG_NSH_ARCHROMFS`
is defined in the NuttX configuration file, then a custom, board-specific
`nsh_romfsimg.h` file residing in `boards/<arch>/<chip>/<board>/include` will be
used. **Note** when the OS is configured, `include/arch/board` will be linked to
`boards/<arch>/<chip>/<board>/include`.
All of the startup-behavior is contained in `rcS.template`. The role of
`mkromfsimg.sh` is to (1) apply the specific configuration settings to
`rcS.template` to create the final `rcS`, and (2) to generate the header file
`nsh_romfsimg.h` containing the ROMFS file system image.
All of the startup-behavior is contained in `rc.sysinit.template` and
`rcS.template`. The role of `mkromfsimg.sh` is to (1) apply the specific
configuration settings to `rc.sysinit.template` to create the final
`rc.sysinit.template`, and `rcS.template` to create the final `rcS` and
(2) to generate the header file `nsh_romfsimg.h` containing the ROMFS file
system image.
## Simple Commands
@ -1803,8 +1821,9 @@ The behavior of NSH can be modified with the following settings in the
`/dev/mmcsdN` where `N` is the minor number. Default is zero.
- `CONFIG_NSH_ROMFSETC` Mount a ROMFS file system at `/etc` and provide a
startup script at `/etc/init.d/rcS`. The default startup script will mount a
FAT FS RAMDISK at `/tmp` but the logic is easily extensible.
system init script at `/etc/init.d/rc.sysinit` and a startup script at
`/etc/init.d/rcS`. The default system init script will mount a FAT FS RAMDISK
at `/tmp` but the logic is easily extensible.
- `CONFIG_NSH_CONSOLE`
@ -1944,6 +1963,10 @@ configuration setting apply:
`/etc`, but that can be changed with this setting. This must be a absolute
path beginning with `/`.
- `CONFIG_NSH_SYSINITSCRIPT` This is the relative path to the system init
script within the mountpoint. The default is `init.d/rc.sysinit`. This
is a relative path and must not start with `/`.
- `CONFIG_NSH_INITSCRIPT` This is the relative path to the startup script
within the mountpoint. The default is `init.d/rcS`. This is a relative path
and must not start with `/`.

View File

@ -340,10 +340,17 @@
# define CONFIG_NSH_ROMFSMOUNTPT "/etc"
# endif
# ifndef CONFIG_NSH_SYSINITSCRIPT
# define CONFIG_NSH_SYSINITSCRIPT "init.d/rc.sysinit"
# endif
# ifndef CONFIG_NSH_INITSCRIPT
# define CONFIG_NSH_INITSCRIPT "init.d/rcS"
# endif
# undef NSH_SYSINITPATH
# define NSH_SYSINITPATH CONFIG_NSH_ROMFSMOUNTPT "/" CONFIG_NSH_SYSINITSCRIPT
# undef NSH_INITPATH
# define NSH_INITPATH CONFIG_NSH_ROMFSMOUNTPT "/" CONFIG_NSH_INITSCRIPT
@ -829,6 +836,7 @@ int nsh_usbconsole(void);
int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd,
FAR const char *path);
#ifdef CONFIG_NSH_ROMFSETC
int nsh_sysinitscript(FAR struct nsh_vtbl_s *vtbl);
int nsh_initscript(FAR struct nsh_vtbl_s *vtbl);
#ifdef CONFIG_NSH_ROMFSRC
int nsh_loginscript(FAR struct nsh_vtbl_s *vtbl);

View File

@ -78,9 +78,9 @@ int nsh_consolemain(int argc, FAR char *argv[])
#endif
#if defined(CONFIG_NSH_ROMFSETC) && !defined(CONFIG_NSH_DISABLESCRIPT)
/* Execute the start-up script */
/* Execute the system init script */
nsh_initscript(&pstate->cn_vtbl);
nsh_sysinitscript(&pstate->cn_vtbl);
#endif
#ifdef CONFIG_NSH_NETINIT
@ -95,6 +95,12 @@ int nsh_consolemain(int argc, FAR char *argv[])
boardctl(BOARDIOC_FINALINIT, 0);
#endif
#if defined(CONFIG_NSH_ROMFSETC) && !defined(CONFIG_NSH_DISABLESCRIPT)
/* Execute the start-up script */
nsh_initscript(&pstate->cn_vtbl);
#endif
/* Execute the session */
ret = nsh_session(pstate, true, argc, argv);

View File

@ -145,6 +145,22 @@ int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd,
return ret;
}
/****************************************************************************
* Name: nsh_sysinitscript
*
* Description:
* Attempt to execute the configured system initialization script. This
* script should be executed once when NSH starts.
*
****************************************************************************/
#ifdef CONFIG_NSH_ROMFSETC
int nsh_sysinitscript(FAR struct nsh_vtbl_s *vtbl)
{
return nsh_script(vtbl, "sysinit", NSH_SYSINITPATH);
}
#endif
/****************************************************************************
* Name: nsh_initscript
*

View File

@ -0,0 +1,5 @@
# Create a RAMDISK and mount it at XXXRDMOUNTPOINTXXX
mkrd -m XXXMKRDMINORXXX -s XXMKRDSECTORSIZEXXX XXMKRDBLOCKSXXX
mkfatfs /dev/ramXXXMKRDMINORXXX
mount -t vfat /dev/ramXXXMKRDMINORXXX XXXRDMOUNTPOINTXXX

View File

@ -1,5 +0,0 @@
# Create a RAMDISK and mount it at XXXRDMOUNTPOINTXXX
mkrd -m XXXMKRDMINORXXX -s XXMKRDSECTORSIZEXXX XXMKRDBLOCKSXXX
mkfatfs /dev/ramXXXMKRDMINORXXX
mount -t vfat /dev/ramXXXMKRDMINORXXX XXXRDMOUNTPOINTXXX