181 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
--------------------------------------------------------------------------------
 | 
						|
configuring cinit,
 | 
						|
Nico Schottelius 2005-05-28 (Last Modified: 2005-06-05)
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
 | 
						|
0. Pre-compile configuration
 | 
						|
1. General configuration layout
 | 
						|
2. Hints
 | 
						|
2.0 Service executing / parameters
 | 
						|
2.1 Daemons
 | 
						|
2.2 Logging
 | 
						|
2.3 Using prepared scripts
 | 
						|
3. Profiles
 | 
						|
 | 
						|
 | 
						|
0. Pre-compile configuration
 | 
						|
 | 
						|
Have a look at conf/*. Those variable will mostly be used when
 | 
						|
compiling cinit. Some will be read later (like destdir).
 | 
						|
 | 
						|
1. General configuration layout
 | 
						|
 | 
						|
/etc/cinit (configurable via conf/cinit_dir) stores the complete
 | 
						|
cinit configuration.
 | 
						|
 | 
						|
cinit is service based.
 | 
						|
A service consists of
 | 
						|
   - a base directory (like /etc/cinit/getty/1)
 | 
						|
   - dependency configuration:
 | 
						|
 | 
						|
      ./wants  - services it wants to be started before (but it
 | 
						|
                 will work anyway)
 | 
						|
 | 
						|
      ./needs/ - services it needs. If those services fail, this service
 | 
						|
                 won't be started
 | 
						|
 
 | 
						|
   - a flag indicating whether to respawn the service:
 | 
						|
 | 
						|
      ./respawn (simply touch it)
 | 
						|
 | 
						|
   - a delay: how long to wait for the service (in seconds) before
 | 
						|
     sending SIGKILL after the SIGTERM (only for respawning processes):
 | 
						|
      
 | 
						|
      ./delay (one line with only the digits)
 | 
						|
 | 
						|
      If delay is non-existing or not readable, the delay from
 | 
						|
      conf/sleep_kill_svc is taken.
 | 
						|
 | 
						|
   - the program to run when switching the service on and off:
 | 
						|
 | 
						|
      ./on        (a link to a program or a shell script)
 | 
						|
      ./on.params (see conf/c_params, the parameters to pass to the program)
 | 
						|
      ./on.env    (see conf/c_env, the environment to pass to the program)
 | 
						|
 | 
						|
      ./off          (call that when shutting down the service)
 | 
						|
      ./off.params   (the parameters to pass to the program)
 | 
						|
      ./on.env       (the environment to pass to the program)
 | 
						|
 | 
						|
You should have a look at the samples/ directory for examples.
 | 
						|
 | 
						|
If things are missing, cinit will continue with what's available.
 | 
						|
This way you only need the files you use. Some examples:
 | 
						|
 | 
						|
   /etc/cinit/init:
 | 
						|
      ./wants -> services it wants
 | 
						|
      ./needs -> services it needs
 | 
						|
      That's everything
 | 
						|
 | 
						|
   /etc/cinit/testsvc:
 | 
						|
      on       -> link to program
 | 
						|
      on.param -> parameters to program
 | 
						|
      respawn  -> restart it
 | 
						|
      That's everything, as it has no dependencies
 | 
						|
 
 | 
						|
   /etc/cinit/fullsvc:
 | 
						|
      on          -> program to start when switching on
 | 
						|
      on.params   -> parameters to pass to start program
 | 
						|
      on.env      -> environment to pass to start program
 | 
						|
 | 
						|
      respawn     -> respawn on service
 | 
						|
 | 
						|
      off         -> program to start when switching off
 | 
						|
      off.params  -> parameters to pass to stop program
 | 
						|
      off.env     -> environment to pass to stop program
 | 
						|
 | 
						|
      wants/*     -> services it wants before starting (non-critical ones)
 | 
						|
      needs/*     -> links to needed services (critical!) before starting
 | 
						|
 | 
						|
 | 
						|
2. Hints
 | 
						|
 | 
						|
2.0 Service executing / parameters
 | 
						|
 | 
						|
The on and off files can and should be links to the programs you want
 | 
						|
to execute. This way you save yourself loading the big shell (which is
 | 
						|
on many Linux systems bash, why so ever, dash does the job as good, still
 | 
						|
beeing small).
 | 
						|
 | 
						|
The on.params and off.params files could also be links to system configuration:
 | 
						|
 | 
						|
Assume the service is called local-tuning/keyboard. The on script
 | 
						|
could look like:
 | 
						|
 | 
						|
   on -> /bin/loadkeys
 | 
						|
   on.params -> /etc/sys/keyboard.mapping
 | 
						|
 | 
						|
   And /etc/sys/keyboard.mapping would contain only the string
 | 
						|
   "dvorak" (or "de-latin1" or "sg-latin1" or ...).
 | 
						|
 | 
						|
 | 
						|
2.1 Daemons
 | 
						|
 | 
						|
Respawning daemons is a bit more difficult, as daemons do often fork()
 | 
						|
(go to background, the calling process exits).
 | 
						|
 | 
						|
This way cinit cannot watch it directly.
 | 
						|
 | 
						|
The first solution is to check the documentation of your daemon program,
 | 
						|
if it has a switch to disable forking (Please have a look at
 | 
						|
daemons.backgrounding for a list of known daemons and their switches
 | 
						|
to avoid backgrounding).
 | 
						|
 | 
						|
The other possibility is to use a program, which will
 | 
						|
   a) start the daemon
 | 
						|
   b) look into the pidfile of the daemon
 | 
						|
   c) will then wait until that pid does not exist anymore
 | 
						|
   d) and then it exits and cinit will restart it (goto a) now)
 | 
						|
 | 
						|
Such a program is included into this cinit release,
 | 
						|
though I do not recommend using it. You should better contact the
 | 
						|
authors and make them implement a clean non-forking mode.
 | 
						|
 | 
						|
The name of the program (actually a shell script) is "cinit.wait.for.daemon".
 | 
						|
 | 
						|
You will use it as the "on" part of the service and you have to add
 | 
						|
 | 
						|
   a) the pidfile to on.params
 | 
						|
   b) the daemon binary
 | 
						|
 | 
						|
Thus the service would look like:
 | 
						|
 | 
						|
   svc-broken-daemon/
 | 
						|
      on -> /usr/sbin/cinit.wait.for.daemon
 | 
						|
      on.params:
 | 
						|
         /var/run/apache.pid
 | 
						|
         /usr/packages/apache-2.0.51/bin/httpd
 | 
						|
         -DSSL
 | 
						|
 | 
						|
Be aware: This is just a hack, first try to avoid backgrounding
 | 
						|
and you won't need this hack!
 | 
						|
 | 
						|
2.2 Logging
 | 
						|
 | 
						|
Currently there's no special logging support.
 | 
						|
When programs write to stdout, it will be displayed on
 | 
						|
the same stdout cinit is connected to
 | 
						|
(we don't even open /dev/console - we are too lazy currently).
 | 
						|
 | 
						|
 | 
						|
2.3 Using prepared scripts
 | 
						|
 | 
						|
In the bin/ directory of this tarball you'll find:
 | 
						|
 | 
						|
   cinit.add.dependency - add a dependency to a service
 | 
						|
   cinit.add.getty      - add a new getty
 | 
						|
   cinit.create.empty.service - create an empty service
 | 
						|
   cinit.reboot         - reboot in /bin/sh
 | 
						|
   cinit.remove.getty   - remove a getty service
 | 
						|
   cinit.respawn.off    - switch respawing off
 | 
						|
   cinit.respawn.on     - switch respawing on
 | 
						|
   cinit.shutdown       - shutdown in /bin/sh
 | 
						|
 | 
						|
 | 
						|
3. Profiles
 | 
						|
 | 
						|
Since cinit-0.0.6 there is profile in cinit.
 | 
						|
Profiles are described in doc/profile.support.
 | 
						|
 | 
						|
X. Examples
 | 
						|
 | 
						|
Can be found in the tarballs below samples/.
 |