http://wiki.rosalab.ru/ru/index.php?title=Initscripts_policy&feed=atom&action=historyInitscripts policy - История изменений2024-03-29T09:09:29ZИстория изменений этой страницы в викиMediaWiki 1.26.4http://wiki.rosalab.ru/ru/index.php?title=Initscripts_policy&diff=6865&oldid=prevPastorDi: /* References */2012-05-30T11:12:53Z<p><span dir="auto"><span class="autocomment">References</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;' lang='ru'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Предыдущая</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Версия 11:12, 30 мая 2012</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l464" >Строка 464:</td>
<td colspan="2" class="diff-lineno">Строка 464:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div><hr></div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div><hr></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>{{<del class="diffchange diffchange-inline">message</del>|This Policy is based on the [http://wiki.mandriva.com/en/Development/Tasks/Packaging/Policies/Initscripts Mandriva Initscripts Policy].}}</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>{{<ins class="diffchange diffchange-inline">Примечание</ins>|This Policy is based on the [http://wiki.mandriva.com/en/Development/Tasks/Packaging/Policies/Initscripts Mandriva Initscripts Policy].}}</div></td></tr>
</table>PastorDihttp://wiki.rosalab.ru/ru/index.php?title=Initscripts_policy&diff=6864&oldid=prevPastorDi в 11:12, 30 мая 20122012-05-30T11:12:04Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;' lang='ru'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Предыдущая</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Версия 11:12, 30 мая 2012</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l1" >Строка 1:</td>
<td colspan="2" class="diff-lineno">Строка 1:</td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[[<del class="diffchange diffchange-inline">Category</del>:Packaging Policies]]</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>[[<ins class="diffchange diffchange-inline">Категория</ins>:Packaging Policies]]</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>{{<del class="diffchange diffchange-inline">introduction</del>|Daemon processes often need an initscript to be started at boot time. In order to ease the integration and the management of the service, you need to follow some rules.}}</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>{{<ins class="diffchange diffchange-inline">Введение</ins>|Daemon processes often need an initscript to be started at boot time. In order to ease the integration and the management of the service, you need to follow some rules.}}</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>= Initscript usage =</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>= Initscript usage =</div></td></tr>
</table>PastorDihttp://wiki.rosalab.ru/ru/index.php?title=Initscripts_policy&diff=5286&oldid=prevD uragan: Adopted Initscripts policy2012-02-09T07:16:39Z<p>Adopted Initscripts policy</p>
<p><b>Новая страница</b></p><div>[[Category:Packaging Policies]]<br />
{{introduction|Daemon processes often need an initscript to be started at boot time. In order to ease the integration and the management of the service, you need to follow some rules.}}<br />
<br />
= Initscript usage =<br />
<br />
To manage {{pkg|initscripts}}, you should use {{prog|service}} and {{prog|chkconfig}}.<br />
<br />
== service ==<br />
<br />
{{cmd|service}} is a shell script used to start and stop services, either standalone or run with xinetd. Usage is simple, just use <br />
<br />
<pre><br />
service <name_of_service> <actiont><br />
</pre><br />
<br />
where action can be one of ''start'', ''stop'', ''status'', ''restart'', ''reload'' (same as ''restart'' if the package doesn't support on-the-fly reloading) or anything the script can support.<br />
<br />
== Chkconfig ==<br />
<br />
Chkconfig is used to manage the {{file|/etc/rc?.d/*}} and {{file|xinetd}} config files. It removes and adds symlinks in order to start or stop a service at boot for a given runlevel. You should use it to add your script to the system. Macros are provided to wrap the call to {{cmd|chkconfig}}.<br />
<br />
= An example =<br />
<br />
Here is a generic example. You can find others in {{file|/etc/init.d/}}. It should be quite easy to adapt, as you only need to change the variable {{var|DAEMON_NAME}}.<br />
<br />
<pre><br />
#!/bin/sh<br />
#<br />
### BEGIN INIT INFO<br />
# Provides: some_daemon<br />
# Required-Start: $network<br />
# Required-Stop: $network<br />
# Default-Start: 3 4 5<br />
# Short-Description: nothing<br />
# Description: some_daemon is nothing.<br />
# Really, nothing.<br />
### END INIT INFO<br />
<br />
# Source function library.<br />
. /etc/rc.d/init.d/functions<br />
<br />
DAEMON_NAME=some_daemon<br />
DAEMON_PROCESS=some_daemon<br />
DAEMON_BINARY=some_daemon<br />
LOCK_FILE=/var/lock/subsys/$DAEMON_NAME<br />
RETVAL=0<br />
<br />
# default option, they can be overriden in /etc/sysconfig/$DAEMON_NAME<br />
# of course, you can place what you want.<br />
OPTIONS=<br />
PORT=1234<br />
# this file should be commented, with proper pointer to the doc, and you<br />
should use<br />
# more than one line of option, if possible.<br />
[ -f /etc/sysconfig/$DAEMON_NAME ] && . /etc/sysconfig/$DAEMON_NAME<br />
<br />
<br />
# here, you can do what you want with the option<br />
<br />
start() {<br />
# if you cannot start the daemon since something is missing ( like a<br />
path that cannot be set by default<br />
# , place the test here<br />
# if [ -z "$SOME_VAR" ]; then<br />
# echo "You need to set $SOME_VAR in /etc/sysconfig/$DAEMON_NAME"<br />
# RETVAL=1<br />
# return<br />
# fi<br />
<br />
[ -f $LOCK_FILE ] && return<br />
<br />
echo -n "Starting $DAEMON_NAME: "<br />
# use --user to run the daemon under the specified uid<br />
daemon $DAEMON_BINARY $OPTIONS -p $PORT<br />
RETVAL=$?<br />
echo<br />
[ $RETVAL -eq 0 ] && touch $LOCK_FILE<br />
}<br />
<br />
stop() {<br />
echo -n "Shutting down $DAEMON_NAME: "<br />
killproc $DAEMON_PROCESS<br />
RETVAL=$?<br />
echo<br />
[ $RETVAL -eq 0 ] && rm -f $LOCK_FILE<br />
}<br />
<br />
reload() {<br />
echo -n "Reloading $DAEMON_NAME configuration: "<br />
killproc $DAEMON_PROCESS -HUP<br />
RETVAL=$?<br />
echo<br />
}<br />
<br />
case "$1" in<br />
start)<br />
start<br />
;;<br />
stop)<br />
stop<br />
;;<br />
status)<br />
status $DAEMON_PROCESS<br />
RETVAL=$?<br />
;;<br />
reload)<br />
reload<br />
;;<br />
restart)<br />
stop<br />
start<br />
;;<br />
condrestart)<br />
if [ -f $LOCK_FILE ]; then<br />
stop<br />
start<br />
fi<br />
;;<br />
*)<br />
echo "Usage: $0 {start|stop|restart|reload|condrestart|status}"<br />
RETVAL=1<br />
esac<br />
<br />
exit $RETVAL<br />
<br />
</pre><br />
<br />
== The header ==<br />
<br />
The {{pkg|initscript}} header should use LSB tags ( {{cmd|chkconfig}} headers are deprecated and should not be used anymore). See [[#Initscript_Header_format|Initscript Header Format]] for more details.<br />
<br />
== First part - Configuration ==<br />
<br />
<pre><br />
# Source function library.<br />
. /etc/rc.d/init.d/functions<br />
<br />
DAEMON_NAME=some_daemon<br />
DAEMON_PROCESS=some_daemon<br />
DAEMON_BINARY=some_daemon<br />
LOCK_FILE=/var/lock/subsys/$DAEMON_NAME<br />
RETVAL=0<br />
<br />
# default option, they can be overriden in /etc/sysconfig/$DAEMON_NAME<br />
# of course, you can place what you want.<br />
OPTIONS=<br />
PORT=1234<br />
# this file should be commented, with proper pointer to the doc, and you<br />
should use<br />
# more than one line of option, if possible.<br />
[ -f /etc/sysconfig/$DAEMON_NAME ] && . /etc/sysconfig/$DAEMON_NAME<br />
<br />
# here, you can do what you want with the option<br />
</pre><br />
<br />
The first part deals with utility functions provided by {{file|/etc/rc.d/init.d/functions/}}.<br />
<br />
The second part deals with useful script global variables. {{var|$DAEMON_NAME}} is used for providing user feedback, {{var|$DAEMON_BINARY}} is used to actually launch the service, and {{var|$DAEMON_PROCESS}} to communicate with it once launched. Depending of the service, they may be different or identical. {{var|RETVAL}} is used for action result status.<br />
<br />
The third part deals with service configuration. If the service accepts some options, you should place a configuration file in {{file|/etc/sysconfig/}}. In order to ease the administrator duty and prevent namespace clashes, it should have the same name as the service. Placing default values in the script and in the config file is more robust than default value in the config file only.<br />
<br />
== Second part - Primitives ==<br />
<br />
Using functions for defining primitives, such as ''start'' and ''stop'' allows to restart the service without reinvocating the script itself. Each of these function should set {{var|RETVAL}}.<br />
<br />
A typical script needs the following functions:<br />
<br />
<pre><br />
start() {<br />
# if you cannot start the daemon since something is missing ( like a<br />
path that cannot be set by default<br />
# , place the test here<br />
# if [ -z "$SOME_VAR" ]; then<br />
# echo "You need to set $SOME_VAR in /etc/sysconfig/$DAEMON_NAME"<br />
# RETVAL=1<br />
# return<br />
# fi<br />
<br />
[ -f $LOCK_FILE ] && return<br />
<br />
echo -n "Starting $DAEMON_NAME: "<br />
# use --user to run the daemon under the specified uid<br />
daemon $DAEMON_BINARY $OPTIONS -p $PORT<br />
RETVAL=$?<br />
echo<br />
[ $RETVAL -eq 0 ] && touch $LOCK_FILE<br />
}<br />
</pre><br />
<br />
This function is used to start the service. You have to take care of the lock before launching, to avoid having several instances running simultaneously. The "daemon" function takes care of everything (using libsafe, creating a pidfile, etc.), and should return OK only if the startup succedeed. However, some daemons do not crash at the beginning, like older versions of openldap, and still show OK even if they do not work. <br />
<br />
<pre><br />
stop() {<br />
echo -n "Shutting down $DAEMON_NAME: "<br />
killproc $DAEMON_PROCESS<br />
RETVAL=$?<br />
echo<br />
[ $RETVAL -eq 0 ] && rm -f $LOCK_FILE<br />
}<br />
</pre><br />
<br />
This function is used to stop the service. The "killproc" function takes care of sending SIGSTOP (or any other given signal) to the process. Then you have to remove the lock file.<br />
<br />
<pre><br />
reload() {<br />
echo -n "Reloading $DAEMON_NAME configuration: "<br />
killproc $DAEMON_PROCESS -HUP<br />
echo<br />
}<br />
</pre><br />
<br />
This function is used to reload the service, if the daemon supports it.<br />
<br />
== Last part - Handling arguments ==<br />
<br />
<pre> <br />
case "$1" in<br />
.....<br />
esac<br />
exit $RETVAL<br />
</pre> <br />
<br />
A typical script accepts the following actions:<br />
<br />
=== start ===<br />
<br />
Call start() function.<br />
<br />
=== stop ===<br />
<br />
Call stop() function.<br />
<br />
=== status ===<br />
<br />
Call status() function.<br />
<br />
=== restart ===<br />
<br />
<pre><br />
restart)<br />
stop<br />
start<br />
;;<br />
</pre><br />
<br />
This action simply call stop and start, without checking if the service is currently running.<br />
<br />
=== condrestart ===<br />
<br />
<pre><br />
condrestart)<br />
if [ -f $LOCK_FILE ]; then<br />
stop<br />
start<br />
fi<br />
;;<br />
</pre><br />
<br />
This action call stop and start, but only if the service is currently running.<br />
<br />
=== reload ===<br />
<br />
Just call reload() functions, if present. Otherwise, you may as well handle "reload" as "restart"<br />
<br />
=== default action ===<br />
<br />
<pre><br />
*)<br />
echo "Usage: $0 {start|stop|restart|reload|condrestart|status}"<br />
RETVAL=1<br />
</pre><br />
<br />
If nothing else matches the action specified, the script should show an error message, and return an exitvalue of 1 to show there is an error. If you add some actions do not forget to add them in the error message. Bash completion uses a regexp matching "Usage: .'' {.'''}", so do not change the format of the messages.<br />
<br />
= The daemon function =<br />
<br />
The "daemon" function is defined in {{file|/etc/init.d/functions}}. Right now, there are some arguments to pass:<br />
<br />
* {{cmd|--user <uid>}}: to run the daemon under the specified UID<br />
* {{cmd|--check <name>}}: to define the name of file with the pid of the process to check (in {{file|/var/run/$name.pid}} )<br />
* {{cmd|+/-[0-9]}}: to add a nice level. the nice level can also be set in the config file, with the {{var|NICELEVEL}} variable<br />
<br />
= Integration in a package =<br />
<br />
In order to integrate your services in a package, you should be sure of the following points:<br />
<br />
== File naming ==<br />
<br />
The filename should not contain a dot, as {{prog|chkconfig}} will not take it into account. And, it should have the same name as the package, in lower case. The file should be in the directory {{file|/etc/rc.d/init.d/}}, which is linked by {{file|/etc/init.d}}. An rpm macro exists for this path, {{macro|%_initrddir}}.<br />
<br />
<pre><br />
/home/misc $ rpm --eval %_initrddir<br />
/etc/rc.d/init.d<br />
</pre><br />
<br />
== Files permissions ==<br />
<br />
The script should be runnable by root, and therefore, the permissions should be rwxr-xr-x. Msec resets the permissions once installed.<br />
<br />
== Macro in %preun and %post ==<br />
<br />
In order to register your service, you need to place 2 macros, one in the {{macro|%preun}} , one in the {{macro|%post}} section :<br />
<br />
<pre><br />
# service_name is the name of the script<br />
%post<br />
%_post_service service_name<br />
<br />
%preun<br />
%_preun_service service_name<br />
</pre><br />
<br />
See the scripts {{file|/usr/share/rpm-helper/add-service}} and {{file|del-service}}. They take care of adding it to the boot sequence, and stopping or restarting the service if needed.<br />
<br />
If the service should not be started by default because it misses some configuration, add the logic for checking in the initscript, and provide documentation regarding the setup to finish.<br />
<br />
== RPM requirements ==<br />
<br />
As the previous macro use rpm-helper script, you need to be sure that rpm-helper is installed before the scripts are run. All you need is to add these tags to the spec:<br />
<br />
<pre><br />
Requires(post): rpm-helper<br />
Requires(preun): rpm-helper<br />
</pre><br />
<br />
These indicate that the %post and %preun scripts need rpm-helper installed to be able to run.<br />
<br />
= Rpmlint errors =<br />
<br />
{{pkg|rpmlint}} uses a dedicated module to check the initscript. You can find it in the {{pkg|rpmlint}} package, file {{file|/usr/share/rpmlint/InitScriptCheck.py}}.<br />
<br />
= LSB Compliance =<br />
<br />
The [http://www.linuxbase.org/ Linux Standard Base] proposes the following specs: http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html<br />
<br />
= Localisation issues =<br />
<br />
ROSA uses gprintf, which calls {{prog|gettext}} with the localisation domain of "initscripts" to get the localisation of the first string passed to gprintf, replacing macros (such as {{macro|%s}} ) with the remaining arguments. To reduce the load for localisers, it is best to ensure that gprintf calls keep the first string constant, so use:<br />
<br />
<pre><br />
gprintf "Starting %s: " $DAEMON_NAME<br />
</pre><br />
<br />
instead of:<br />
<br />
<pre><br />
gprintf "Starting $DAEMON_NAME: "<br />
</pre><br />
<br />
This allows just one translation to be maintained for each similar call. White space can have an effect too ... so be careful to ensure the string is kept exactly the same.<br />
<br />
Note that the usage of "echo" calls will be replaced with gprintf calls (by {{prog|/usr/share/spec-helper/gprintify.py}} which is called from {{prog|/usr/share/spec-helper/spec-helper}} which is called from {{prog|/usr/lib/rpm/brp-mandrake}} ). Sometimes, {{prog|gprintify}} can mess up your good use of gprintf ... in which case you should export {{var|DONT_GPRINTIFY}} in the {{macro|%install}} section of your spec file to prevent {{prog|gprintify.py}} from being called.<br />
<br />
= Initscript Header format =<br />
<br />
Initscripts used in ROSA Linux should be described using LSB headers instead of {{prog|chkconfig}} headers. Adding LSB headers will allow having a robust services dependency check, and to provide a base for parallelized initialization, so packagers are all encouraged to add LSB headers to their packages.<br />
<br />
== Migration to LSB headers ==<br />
<br />
Let's take the previous dm init script as an example.<br />
<br />
<pre><br />
It contained the following comments:<br />
# chkconfig: 5 30 09<br />
# description: This startup script launches the graphical display manager.<br />
</pre><br />
<br />
=== LSB comments ===<br />
<br />
We can add LSB headers in a block delimited by the following lines:<br />
<br />
<pre><br />
### BEGIN INIT INFO<br />
### END INIT INFO<br />
</pre><br />
<br />
=== Facility provides ===<br />
<br />
Each initscript should provide a facility name. The services should be named preferably using this policy: http://www.lanana.org/lsbreg/init/init.txt<br />
<br />
Facilities that begin with a {{cmd|$}} sign are reserved system facilities, such as <b>$network</b>. A complete list is available here: http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/facilname.html<br />
<br />
<pre><br />
# Provides: dm<br />
</pre><br />
<br />
=== Start dependencies ===<br />
<br />
The services required by an initscript should be described using the <b>Required-Start</b> (mandatory service) or <b>Should-Start</b> (optional service) tags.<br />
<br />
<pre><br />
# Required-Start: xfs<br />
# Should-Start: $network harddrake<br />
</pre><br />
<br />
==== Required services ====<br />
<br />
<b>Required-Start</b> means that the listed services must be available for this service. The initscript system will make sure that they are ( {{prog|chkconfig}} will enforce the dependency).<br />
<br />
==== Optional services ====<br />
<br />
<b>Should-Start</b> means that the listed services should be available for this service if possible. If an optional service is enabled in this runlevel, it will be started before. If it is not enabled, its start will not be enforced by the initscript system.<br />
<br />
=== Stop dependencies ===<br />
<br />
If another service has to be available during stop, the mandatory dependency should be described using a <b>Required-Stop</b> tag:<br />
<br />
<pre><br />
# Required-Stop: xfs<br />
</pre><br />
<br />
The same is available for optional dependencies, using the <b>Should-Stop</b> flag.<br />
<br />
=== Runlevels ===<br />
<br />
You can specify which runlevels the service should be started in using the <b>Default-Start</b> tag.<br />
<br />
<pre><br />
# Default-Start: 5<br />
</pre><br />
<br />
=== Descriptions ===<br />
<br />
Descriptions have to be provided using the <b>Short-Description</b> and <b>Description</b> (potentially multi-line) tags.<br />
<br />
<pre><br />
# Short-Description: Launches the graphical display manager<br />
# Description: This startup script launches the graphical display<br />
# manager.<br />
</pre><br />
<br />
=== Final result ===<br />
<br />
The dm initscript will finally end up with the following LSB header:<br />
<br />
<pre><br />
### BEGIN INIT INFO<br />
# Provides: dm<br />
# Required-Start: xfs<br />
# Required-Stop: xfs<br />
# Should-Start: $network harddrake<br />
# Default-Start: 5<br />
# Short-Description: Launches the graphical display manager<br />
# Description: This startup script launches the graphical display manager.<br />
### END INIT INFO<br />
</pre><br />
<br />
=== Interactive initscripts ===<br />
<br />
Some initscripts request some user input, such as harddrake when a new device is found. For such scripts, LSB asks to use a tag in <b>X-implementor-extension</b> format. In ROSA Linux, <b>X-ROSA-Interactive</b> is used; for compatibility reasons, <b>X-Mandriva-Interactive</b> is also acceptable.<br />
<br />
<pre><br />
# X-ROSA-Interactive<br />
</pre><br />
<br />
== References ==<br />
<br />
For a more complete reference about the LSB headers, please see:<br />
<br />
* [http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/tocsysinit.html LSB System Initialization]<br />
* [http://en.opensuse.org/openSUSE:Packaging_init_scripts openSUSE: Packaging init scripts]<br />
* [http://www.lanana.org/ Linux Assigned Names And Numbers Authority]<br />
<br />
<hr><br />
<br />
{{message|This Policy is based on the [http://wiki.mandriva.com/en/Development/Tasks/Packaging/Policies/Initscripts Mandriva Initscripts Policy].}}</div>D uragan