Moved bootscripts and udev-config to BOOK

Updated Makefile to automatically generate bootscript and udev-config tarballs
Updated licesnse to be the same as BLFS

git-svn-id: http://svn.linuxfromscratch.org/LFS/trunk/BOOK@8548 4aa44e1e-78dd-0310-a6d2-fbcd4c07a689
This commit is contained in:
Bruce Dubbs 2008-06-03 21:51:14 +00:00
parent 9faa3e27af
commit 1c4800743d
98 changed files with 9113 additions and 57 deletions

View File

@ -12,7 +12,7 @@ else
Q = @
endif
lfs: validxml profile-html
lfs: maketar validxml profile-html
@echo "Generating chunked XHTML files..."
$(Q)xsltproc --nonet -stringparam chunk.quietly $(CHUNK_QUIET) \
-stringparam rootid "$(ROOT_ID)" -stringparam base.dir $(BASEDIR)/ \
@ -78,9 +78,17 @@ tmpdir:
$(Q)rm -f $(RENDERTMP)/lfs-pdf.fo
validxml: tmpdir
@echo "Processing bootscripts..."
$(Q)sh process-scripts.sh $(RENDERTMP)
@echo "Validating the book..."
$(Q)xmllint --nonet --noent --xinclude --postvalid \
-o $(RENDERTMP)/lfs-full.xml index.xml
$(Q)rm -f appendices/*.script
$(Q)sh aux-file-data.sh $(RENDERTMP)/lfs-full.xml
maketar:
@echo "Making tarballs..."
$(Q)sh make-aux-files.sh $(RENDERTMP)
profile-html: validxml
@echo "Generating profiled XML for XHTML..."
@ -106,4 +114,4 @@ validate:
all: lfs nochunks pdf dump-commands
.PHONY : all dump-commands lfs nochunks pdf profile-html tmpdir validate \
validxml wget-list
validxml wget-list maketar

403
appendices/creat-comm.xml Normal file
View File

@ -0,0 +1,403 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % general-entities SYSTEM "../general.ent">
%general-entities;
]>
<sect1 id="CC" xreflabel="Creative Commons License">
<?dbhtml filename="creat-comm.html"?>
<title>Creative Commons License</title>
<para role='title'>Creative Commons Legal Code</para>
<para role='title'>Attribution-NonCommercial-ShareAlike 2.0</para>
<important>
<para>CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT
PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN
"AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION
PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS
USE.</para>
</important>
<para role='title'>License</para>
<para>THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.</para>
<para>BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE
BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS
CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
CONDITIONS.</para>
<orderedlist>
<?dbfo label-width="1.5em"?>
<listitem>
<para>Definitions</para>
<orderedlist>
<listitem>
<para>"Collective Work" means a work, such as a periodical issue, anthology or
encyclopedia, in which the Work in its entirety in unmodified form, along
with a number of other contributions, constituting separate and independent
works in themselves, are assembled into a collective whole. A work that
constitutes a Collective Work will not be considered a Derivative Work (as
defined below) for the purposes of this License.</para>
</listitem>
<listitem>
<para>"Derivative Work" means a work based upon the Work or upon
the Work and other pre-existing works, such as a translation, musical
arrangement, dramatization, fictionalization, motion picture version, sound
recording, art reproduction, abridgment, condensation, or any other form in
which the Work may be recast, transformed, or adapted, except that a work
that constitutes a Collective Work will not be considered a Derivative Work
for the purpose of this License. For the avoidance of doubt, where the Work
is a musical composition or sound recording, the synchronization of the Work
in timed-relation with a moving image ("synching") will be considered a
Derivative Work for the purpose of this License.</para>
</listitem>
<listitem>
<para>"Licensor" means the individual or entity that offers the
Work under the terms of this License.</para>
</listitem>
<listitem>
<para>"Original Author" means the individual or entity who created
the Work.</para>
</listitem>
<listitem>
<para>"Work" means the copyrightable work of authorship offered
under the terms of this License.</para>
</listitem>
<listitem>
<para>"You" means an individual or entity exercising rights under
this License who has not previously violated the terms of this License with
respect to the Work, or who has received express permission from the
Licensor to exercise rights under this License despite a previous
violation.</para>
</listitem>
<listitem>
<para>"License Elements" means the following high-level license
attributes as selected by Licensor and indicated in the title of this
License: Attribution, Noncommercial, ShareAlike.</para>
</listitem>
</orderedlist>
</listitem>
<listitem>
<para>Fair Use Rights. Nothing in this license is intended to reduce,
limit, or restrict any rights arising from fair use, first sale or other
limitations on the exclusive rights of the copyright owner under copyright law
or other applicable laws.</para>
</listitem>
<listitem>
<para>License Grant. Subject to the terms and conditions of this
License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
perpetual (for the duration of the applicable copyright) license to exercise
the rights in the Work as stated below:</para>
<orderedlist>
<listitem>
<para>to reproduce the Work, to incorporate the Work into one or
more Collective Works, and to reproduce the Work as incorporated in the
Collective Works;</para>
</listitem>
<listitem>
<para>to create and reproduce Derivative Works;</para>
</listitem>
<listitem>
<para>to distribute copies or phonorecords of, display publicly,
perform publicly, and perform publicly by means of a digital audio
transmission the Work including as incorporated in Collective
Works;</para>
</listitem>
<listitem>
<para>to distribute copies or phonorecords of, display publicly,
perform publicly, and perform publicly by means of a digital audio
transmission Derivative Works;</para>
</listitem>
</orderedlist>
<para>The above rights may be exercised in all media and formats whether now
known or hereafter devised. The above rights include the right to make such
modifications as are technically necessary to exercise the rights in other
media and formats. All rights not expressly granted by Licensor are hereby
reserved, including but not limited to the rights set forth in Sections 4(e)
and 4(f).</para>
</listitem>
<listitem>
<para>Restrictions.The license granted in Section 3 above is
expressly made subject to and limited by the following
restrictions:</para>
<orderedlist>
<listitem>
<para>You may distribute, publicly display, publicly perform, or
publicly digitally perform the Work only under the terms of this License, and
You must include a copy of, or the Uniform Resource Identifier for, this
License with every copy or phonorecord of the Work You distribute, publicly
display, publicly perform, or publicly digitally perform. You may not offer
or impose any terms on the Work that alter or restrict the terms of this
License or the recipients' exercise of the rights granted hereunder. You may
not sublicense the Work. You must keep intact all notices that refer to this
License and to the disclaimer of warranties. You may not distribute, publicly
display, publicly perform, or publicly digitally perform the Work with any
technological measures that control access or use of the Work in a manner
inconsistent with the terms of this License Agreement. The above applies to
the Work as incorporated in a Collective Work, but this does not require the
Collective Work apart from the Work itself to be made subject to the terms of
this License. If You create a Collective Work, upon notice from any Licensor
You must, to the extent practicable, remove from the Collective Work any
reference to such Licensor or the Original Author, as requested. If You
create a Derivative Work, upon notice from any Licensor You must, to the
extent practicable, remove from the Derivative Work any reference to such
Licensor or the Original Author, as requested.</para>
</listitem>
<listitem>
<para>You may distribute, publicly display, publicly perform, or
publicly digitally perform a Derivative Work only under the terms of this
License, a later version of this License with the same License Elements as
this License, or a Creative Commons iCommons license that contains the same
License Elements as this License (e.g. Attribution-NonCommercial-ShareAlike
2.0 Japan). You must include a copy of, or the Uniform Resource Identifier
for, this License or other license specified in the previous sentence with
every copy or phonorecord of each Derivative Work You distribute, publicly
display, publicly perform, or publicly digitally perform. You may not offer
or impose any terms on the Derivative Works that alter or restrict the terms
of this License or the recipients' exercise of the rights granted hereunder,
and You must keep intact all notices that refer to this License and to the
disclaimer of warranties. You may not distribute, publicly display, publicly
perform, or publicly digitally perform the Derivative Work with any
technological measures that control access or use of the Work in a manner
inconsistent with the terms of this License Agreement. The above applies to
the Derivative Work as incorporated in a Collective Work, but this does not
require the Collective Work apart from the Derivative Work itself to be made
subject to the terms of this License.</para>
</listitem>
<listitem>
<para>You may not exercise any of the rights granted to You in
Section 3 above in any manner that is primarily intended for or directed
toward commercial advantage or private monetary compensation. The exchange of
the Work for other copyrighted works by means of digital file-sharing or
otherwise shall not be considered to be intended for or directed toward
commercial advantage or private monetary compensation, provided there is no
payment of any monetary compensation in connection with the exchange of
copyrighted works.</para>
</listitem>
<listitem>
<para>If you distribute, publicly display, publicly perform, or
publicly digitally perform the Work or any Derivative Works or Collective
Works, You must keep intact all copyright notices for the Work and give the
Original Author credit reasonable to the medium or means You are utilizing by
conveying the name (or pseudonym if applicable) of the Original Author if
supplied; the title of the Work if supplied; to the extent reasonably
practicable, the Uniform Resource Identifier, if any, that Licensor specifies
to be associated with the Work, unless such URI does not refer to the
copyright notice or licensing information for the Work; and in the case of a
Derivative Work, a credit identifying the use of the Work in the Derivative
Work (e.g., "French translation of the Work by Original Author," or
"Screenplay based on original Work by Original Author"). Such credit may be
implemented in any reasonable manner; provided, however, that in the case of
a Derivative Work or Collective Work, at a minimum such credit will appear
where any other comparable authorship credit appears and in a manner at least
as prominent as such other comparable authorship credit.</para>
</listitem>
<listitem>
<para>For the avoidance of doubt, where the Work is a musical
composition:</para>
<orderedlist>
<listitem>
<para>Performance Royalties Under Blanket Licenses. Licensor
reserves the exclusive right to collect, whether individually or via a
performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the
public performance or public digital performance (e.g. webcast) of the
Work if that performance is primarily intended for or directed toward
commercial advantage or private monetary compensation.</para>
</listitem>
<listitem>
<para>Mechanical Rights and Statutory Royalties. Licensor
reserves the exclusive right to collect, whether individually or via a
music rights agency or designated agent (e.g. Harry Fox Agency),
royalties for any phonorecord You create from the Work ("cover
version") and distribute, subject to the compulsory license created
by 17 USC Section 115 of the US Copyright Act (or the equivalent in
other jurisdictions), if Your distribution of such cover version is primarily
intended for or directed toward commercial advantage or private monetary
compensation. 6. Webcasting Rights and Statutory Royalties. For the
avoidance of doubt, where the Work is a sound recording, Licensor
reserves the exclusive right to collect, whether individually or via a
performance-rights society (e.g. SoundExchange), royalties for the public
digital performance (e.g. webcast) of the Work, subject to the compulsory
license created by 17 USC Section 114 of the US Copyright Act (or the
equivalent in other jurisdictions), if Your public digital performance is
primarily intended for or directed toward commercial advantage or private
monetary compensation.</para>
</listitem>
</orderedlist>
</listitem>
<listitem>
<para>Webcasting Rights and Statutory Royalties. For the
avoidance of doubt, where the Work is a sound recording, Licensor reserves
the exclusive right to collect, whether individually or via a
performance-rights society (e.g. SoundExchange), royalties for the public
digital performance (e.g. webcast) of the Work, subject to the compulsory
license created by 17 USC Section 114 of the US Copyright Act (or the
equivalent in other jurisdictions), if Your public digital performance is
primarily intended for or directed toward commercial advantage or private
monetary compensation.</para>
</listitem>
</orderedlist>
</listitem>
<listitem>
<para>Representations, Warranties and Disclaimer</para>
<para>UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND
CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING,
WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A
PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE.
SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH
EXCLUSION MAY NOT APPLY TO YOU.</para>
</listitem>
<listitem>
<para>Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY
APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY
FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</para>
</listitem>
<listitem>
<para>Termination</para>
<orderedlist>
<listitem>
<para>This License and the rights granted hereunder will terminate
automatically upon any breach by You of the terms of this License.
Individuals or entities who have received Derivative Works or Collective
Works from You under this License, however, will not have their licenses
terminated provided such individuals or entities remain in full compliance
with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any
termination of this License.</para>
</listitem>
<listitem>
<para>Subject to the above terms and conditions, the license
granted here is perpetual (for the duration of the applicable copyright in
the Work). Notwithstanding the above, Licensor reserves the right to release
the Work under different license terms or to stop distributing the Work at
any time; provided, however that any such election will not serve to withdraw
this License (or any other license that has been, or is required to be,
granted under the terms of this License), and this License will continue in
full force and effect unless terminated as stated above.</para>
</listitem>
</orderedlist>
</listitem>
<listitem>
<para>Miscellaneous</para>
<orderedlist>
<listitem>
<para>Each time You distribute or publicly digitally perform the
Work or a Collective Work, the Licensor offers to the recipient a license to
the Work on the same terms and conditions as the license granted to You under
this License.</para>
</listitem>
<listitem>
<para>Each time You distribute or publicly digitally perform a
Derivative Work, Licensor offers to the recipient a license to the original
Work on the same terms and conditions as the license granted to You under
this License.</para>
</listitem>
<listitem>
<para>If any provision of this License is invalid or unenforceable
under applicable law, it shall not affect the validity or enforceability of
the remainder of the terms of this License, and without further action by the
parties to this agreement, such provision shall be reformed to the minimum
extent necessary to make such provision valid and
enforceable.</para>
</listitem>
<listitem>
<para>No term or provision of this License shall be deemed waived
and no breach consented to unless such waiver or consent shall be in writing
and signed by the party to be charged with such waiver or
consent.</para>
</listitem>
<listitem>
<para>This License constitutes the entire agreement between the
parties with respect to the Work licensed here. There are no understandings,
agreements or representations with respect to the Work not specified here.
Licensor shall not be bound by any additional provisions that may appear in
any communication from You. This License may not be modified without the
mutual written agreement of the Licensor and You.</para>
</listitem>
</orderedlist>
</listitem>
</orderedlist>
<important>
<para>Creative Commons is not a party to this License, and makes no warranty
whatsoever in connection with the Work. Creative Commons will not be liable to
You or any party on any legal theory for any damages whatsoever, including
without limitation any general, special, incidental or consequential damages
arising in connection to this license. Notwithstanding the foregoing two (2)
sentences, if Creative Commons has expressly identified itself as the Licensor
hereunder, it shall have all rights and obligations of Licensor.</para>
<para>Except for the limited purpose of indicating to the public that the Work is
licensed under the CCPL, neither party will use the trademark "Creative
Commons" or any related trademark or logo of Creative Commons without the prior
written consent of Creative Commons. Any permitted use will be in compliance
with Creative Commons' then-current trademark usage guidelines, as may be
published on its website or otherwise made available upon request from time to
time.</para>
<para>Creative Commons may be contacted at <ulink url='http://creativecommons.org/' />.</para>
</important>
</sect1>

25
appendices/license.xml Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % general-entities SYSTEM "../general.ent">
%general-entities;
]>
<appendix id="Licenses" xreflabel="Appendix E">
<?dbhtml dir="appendicies"?>
<?dbhtml filename="licenses.html"?>
<title>LFS Licenses</title>
<para>This book is licensed under the Creative Commons
Attribution-NonCommercial-ShareAlike 2.0 License.</para>
<para>Computer instructions may be extracted from the book under the MIT
License.</para>
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="creat-comm.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="mit-lic.xml"/>
</appendix>

33
appendices/mit-lic.xml Normal file
View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % general-entities SYSTEM "../general.ent">
%general-entities;
]>
<sect1 id="MIT" xreflabel="MIT License">
<?dbhtml filename="mit.html" ?>
<title>The MIT License</title>
<para>Copyright &copy; &copyrightdate; Gerard Beekmans</para>
<para>Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:</para>
<para>The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.</para>
<para>HE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.</para>
</sect1>

195
appendices/scripts.xml Normal file
View File

@ -0,0 +1,195 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % general-entities SYSTEM "../general.ent">
<!ENTITY checkfs SYSTEM "checkfs.script">
<!ENTITY cleanfs SYSTEM "cleanfs.script">
<!ENTITY console SYSTEM "console.script">
<!ENTITY functions SYSTEM "functions.script">
<!ENTITY consolelog SYSTEM "consolelog.script">
<!ENTITY halt SYSTEM "halt.script">
<!ENTITY localnet SYSTEM "localnet.script">
<!ENTITY modules SYSTEM "modules.script">
<!ENTITY mountfs SYSTEM "mountfs.script">
<!ENTITY mountkernfs SYSTEM "mountkernfs.script">
<!ENTITY network SYSTEM "network.script">
<!ENTITY reboot SYSTEM "reboot.script">
<!ENTITY rc SYSTEM "rc.script">
<!ENTITY sendsignals SYSTEM "sendsignals.script">
<!ENTITY setclock SYSTEM "setclock.script">
<!ENTITY swap SYSTEM "swap.script">
<!ENTITY sysctl SYSTEM "sysctl.script">
<!ENTITY sysklogd SYSTEM "sysklogd.script">
<!ENTITY template SYSTEM "template.script">
<!ENTITY udev SYSTEM "udev.script">
<!ENTITY udev_retry SYSTEM "udev_retry.script">
<!ENTITY createfiles SYSTEM "createfiles.script">
<!ENTITY modules_sys SYSTEM "modules-sysinit.script">
<!ENTITY rc_sys SYSTEM "rc-sysinit.script">
<!ENTITY ifup SYSTEM "ifup.script">
<!ENTITY ifdown SYSTEM "ifdown.script">
<!ENTITY ipv4_static SYSTEM "ipv4-static.script">
<!ENTITY ipv4_static_route SYSTEM "ipv4-static-route.script">
%general-entities;
]>
<appendix id="scripts" xreflabel="Appendix D">
<?dbhtml dir="scripts"?>
<?dbhtml filename="scripts.html"?>
<title>Boot and sysconfig scripts version-&lfs-bootscripts-version;</title>
<para>The scripts in this appendix are listed by the directory where they
normally reside. The order is <filename
class='directory'>/etc/rc.d/init.d</filename>, <filename
class='directory'>/etc/sysconfig</filename>, <filename
class='directory'>/etc/sysconfig/network-devices</filename>, and <filename
class='directory'>/etc/sysconfig/network-devices/services</filename>. Within
each section, the files are listed in the order they are normally called.
</para>
<sect1 id="rc" role="wrap">
<title>/etc/rc.d/init.d/rc</title>
<para>The <systemitem>rc</systemitem> script is the first script called by
<application>init</application> and initiates the boot process.</para>
<screen>&rc;</screen>
</sect1>
<sect1 id="functions" role="wrap">
<title>/etc/rc.d/init.d/functions</title>
<screen>&functions;</screen>
</sect1>
<sect1 id="mountkernfs" role="wrap">
<title>/etc/rc.d/init.d/mountkernfs</title>
<screen>&mountkernfs;</screen>
</sect1>
<sect1 id="consolelog" role="wrap">
<title>/etc/rc.d/init.d/consolelog</title>
<screen>&consolelog;</screen>
</sect1>
<sect1 id="modules" role="wrap">
<title>/etc/rc.d/init.d/modules</title>
<screen>&modules;</screen>
</sect1>
<sect1 id="udev" role="wrap">
<title>/etc/rc.d/init.d/udev</title>
<screen>&udev;</screen>
</sect1>
<sect1 id="swap" role="wrap">
<title>/etc/rc.d/init.d/swap</title>
<screen>&swap;</screen>
</sect1>
<sect1 id="setclock" role="wrap">
<title>/etc/rc.d/init.d/setclock</title>
<screen>&setclock;</screen>
</sect1>
<sect1 id="checkfs" role="wrap">
<title>/etc/rc.d/init.d/checkfs</title>
<screen>&checkfs;</screen>
</sect1>
<sect1 id="mountfs" role="wrap">
<title>/etc/rc.d/init.d/mountfs</title>
<screen>&mountfs;</screen>
</sect1>
<sect1 id="udev_retry" role="wrap">
<title>/etc/rc.d/init.d/udev_retry</title>
<screen>&udev_retry;</screen>
</sect1>
<sect1 id="cleanfs" role="wrap">
<title>/etc/rc.d/init.d/cleanfs</title>
<screen>&cleanfs;</screen>
</sect1>
<sect1 id="console" role="wrap">
<title>/etc/rc.d/init.d/console</title>
<screen>&console;</screen>
</sect1>
<sect1 id="localnet" role="wrap">
<title>/etc/rc.d/init.d/localnet</title>
<screen>&localnet;</screen>
</sect1>
<sect1 id="sysctlscript" role="wrap">
<title>/etc/rc.d/init.d/sysctl</title>
<screen>&sysctl;</screen>
</sect1>
<sect1 id="sysklogd" role="wrap">
<title>/etc/rc.d/init.d/sysklogd</title>
<screen>&sysklogd;</screen>
</sect1>
<sect1 id="network" role="wrap">
<title>/etc/rc.d/init.d/network</title>
<screen>&network;</screen>
</sect1>
<sect1 id="sendsignals" role="wrap">
<title>/etc/rc.d/init.d/sendsignals</title>
<screen>&sendsignals;</screen>
</sect1>
<sect1 id="rebootscript" role="wrap">
<title>/etc/rc.d/init.d/reboot</title>
<screen>&reboot;</screen>
</sect1>
<sect1 id="haltscript" role="wrap">
<title>/etc/rc.d/init.d/halt</title>
<screen>&halt;</screen>
</sect1>
<sect1 id="template" role="wrap">
<title>/etc/rc.d/init.d/template</title>
<screen>&template;</screen>
</sect1>
<sect1 id="rcsys" role="wrap">
<title>/etc/sysconfig/rc</title>
<screen>&rc_sys;</screen>
</sect1>
<sect1 id="modulessys" role="wrap">
<title>/etc/sysconfig/modules</title>
<screen>&modules_sys;</screen>
</sect1>
<sect1 id="createfiles" role="wrap">
<title>/etc/sysconfig/createfiles</title>
<screen>&createfiles;</screen>
</sect1>
<sect1 id="ifup" role="wrap">
<title>/etc/sysconfig/network-devices/ifup</title>
<screen>&ifup;</screen>
</sect1>
<sect1 id="ifdown" role="wrap">
<title>/etc/sysconfig/network-devices/ifdown</title>
<screen>&ifdown;</screen>
</sect1>
<sect1 id="ipv4static" role="wrap">
<title>/etc/sysconfig/network-devices/services/ipv4-static</title>
<screen>&ipv4_static;</screen>
</sect1>
<sect1 id="ipv4route" role="wrap">
<title>/etc/sysconfig/network-devices/services/ipv4-static-route</title>
<screen>&ipv4_static_route;</screen>
</sect1>
</appendix>

38
aux-file-data.sh Executable file
View File

@ -0,0 +1,38 @@
#!/bin/bash
if [ $# -lt 1 ] ; then
echo "This script needs the location of the xml file to update"
exit 1
fi
FILE=$1
# Bootscript data
bootscripts=$(ls lfs-bootscripts*.bz2)
base=$(basename $bootscripts .tar.bz2)
bootsize=$(ls -lk $bootscripts | cut -f5 -d" ")
bootmd5=$(md5sum $bootscripts | cut -f1 -d" ")
# Figure intalled size of bootscripts
TOPDIR=$(pwd)
TMP_DIR=$(mktemp -d /tmp/lfsbootfiles.XXXXXX)
pushd $TMP_DIR > /dev/null
tar -xf $TOPDIR/$bootscripts
bootinstallsize=$(du -sk $TMP_DIR | cut -f1)
popd > /dev/null
rm -rf $TMP_DIR
sed -i -e s/BOOTSCRIPTS-SIZE/$bootsize/ \
-e s/BOOTSCRIPTS-INSTALL-KB/$bootinstallsize/ \
-e s/BOOTSCRIPTS-MD5SUM/$bootmd5/ $FILE
############
# udev configuration tarball data
udevconfig=$(ls udev-config*.bz2)
udevsize=$(ls -lk $udevconfig | cut -f5 -d" ")
udevmd5=$(md5sum $udevconfig | cut -f1 -d" ")
sed -i -e s/UDEV-SIZE/$udevsize/ \
-e s/UDEV-MD5SUM/$udevmd5/ $FILE

927
bootscripts/ChangeLog Normal file
View File

@ -0,0 +1,927 @@
2008-05-21 Bryan Kadzban <bryan@linuxfromscratch.org>
* lfs/init.d/udev, lfs/init.d/udev_retry: Use new udevadm program.
2007-08-20 DJ Lucas <dj@linuxfromscratch.org>
* lfs/init.d/setclock: Added missing 'stop' argument to usage text
2007-08-13 Dan Nicholson <dnicholson@linuxfromscratch.org>
* lfs/init.d/checkfs: Don't suppress error messages from the screen.
2007-07-18 Dan Nicholson <dnicholson@linuxfromscratch.org>
* Makefile, lfs/init.d/consolelog: New bootscript controlling the
kernel log level on the console. This is controlled by the LOGLEVEL
variable in /etc/sysconfig/console.
* lfs/init.d/modules: Remove the log level handling since this is
done in the consolelog script now.
* lfs/init.d/modules: Clean up the script by removing the file
descriptor duplication and instead just redirecting
/etc/sysconfig/modules to the input of the while loop.
2007-06-16 Dan Nicholson <dnicholson@linuxfromscratch.org>
* lfs/init.d/mountfs, lfs/init.d/mountkernfs, lfs/init.d/setclock,
lfs/init.d/modules, lfs/sysconfig/network-devices/if{up,down}:
Don't suppress stderr during bootscripts unless necessary. This
would prevent potentially critical messages from reaching the screen.
2007-04-24 Dan Nicholson <dnicholson@linuxfromscratch.org>
* lfs/init.d/functions: When killproc is executed, it checks that
the process is still running, sleeps if it is, then checks again.
The sleep is 1 second in between checks. By sleeping for 0.1 seconds
in between checks, killproc is much faster as it's wasting much
less time sleeping in the normal case that the process has died
after a short delay.
2007-04-16 Dan Nicholson <dnicholson@linuxfromscratch.org>
* lfs/init.d/functions: Redirect stderr when using kill to suppress
output.
* lfs/init.d/functions: killproc() was not handling the case where a
pidfile is passed to the function. The logic with the signal to be
used was causing issues with the handling of pidfiles. This has been
fixes, and now killproc() will recheck the process if the signal
was TERM (the default) or KILL.
* lfs/init.d/functions: statusproc() has been changed to use pidofproc()
instead of the deprecated getpids(). Additionally, it now accepts
the -p argument to specify a pidfile.
* lfs/init.d/functions: Currently, statusproc() always returns
successfully, and the only way to know if the process is running
is to parse the output. This changes statusproc() to return the
status of pidofproc(), which will return unsuccessfully if the
requested process is not running.
* lfs/init.d/functions: Changed reloadproc() to use pidofproc() and
respect the -p argument for pidfiles.
* lfs/init.d/sysklogd: Remove a useless argument to reloadproc().
2007-03-13 Dan Nicholson <dnicholson@linuxfromscratch.org>
* lfs/init.d/functions: If pidofproc() is passed the -p argument
it can bomb testing a null variable with an integer expression.
2007-02-22 Dan Nicholson <dnicholson@linuxfromscratch.org>
* lfs/init.d/mountfs, lfs/init.d/console, lfs/init.d/setclock,
lfs/init.d/mountkernfs: &> redirection is not supported in POSIX.
Fortunately, it's equivalent to >word 2>&1 according to bash(1).
2007-02-22 Dan Nicholson <dnicholson@linuxfromscratch.org>
* lfs/init.d/console: POSIX says that shells only need to trap on
signals. Trapping on ERR isn't always supported. Conditionals have
been added to set the $failed variable in spots that seemed
appropriate for checking errors.
2007-02-22 Dan Nicholson <dnicholson@linuxfromscratch.org>
* lfs/init.d/functions: Use arithmetic expansion and string length,
which are both mandated by POSIX, rather than spawning two processes
every time boot_mesg() is called.
2007-02-22 Dan Nicholson <dnicholson@linuxfromscratch.org>
* lfs/init.d/functions: In order to provide an `echo' which provides
handles the -e and -n options for all POSIX shells, a feature test
is added which stores its result in $ECHO. /bin/echo will be used
if the default echo is not capable. Changed the existing functions
to reference $ECHO when needed.
* lfs/init.d/console: Use $ECHO when -en is needed.
2007-02-03 Bryan Kadzban <bryan@linuxfromscratch.org>
* ChangeLog: Rename from CHANGELOG, start using GNU style entries.
* Makefile: Move setclock before checkfs. Fixes #1948.
2006-11-25 Bryan Kadzban <bryan@linuxfromscratch.org>
* lfs/init.d/udev_retry: Copy Debian's "copy generated rules" initscript
code, to clean up when the rule_generator scripts run before / is
writable. (Since the rule_generator code is from Debian, I assume their
cleanup code is appropriate.)
2006-10-15 Bryan Kadzban <bryan@linuxfromscratch.org>
* lfs/init.d/udev_retry: Fix to work with udev >= 099.
n/a - June 2, 2006
* Removed console config file and makefile targets.
* Removed references to /dev/bug and bugreport in udevand
udev_retry bootscripts. (DJ Lucas)
n/a - April 17, 2006
* Updated udev script to use the new udevsettle program.
* Added udev_retry script for systems that have /usr on a different
partition or for some other reason fail the initial replay. (Archaic)
n/a - April 15, 2006
* Cleaned up contrib directory. Removed: contrib/init.d,
contrib/enhanced, contrib/livecd, contrib/hotplug, and raq2
patch. (DJ Lucas)
n/a - April 14, 2006
* Merged changes from udev_update branch (DJ Lucas)
* Replaced a return with an exit and reversed comment changes in
udev bootscript. (Dan Nicholson)
* Replaced walk_sysfs function in udev bootscript with new udevtrigger
program and move wait_for_uevents function inline. (DJ Lucas)
* Removed extra evaluate_retval in udev bootscript. (Ken Moffat)
* Wait for uevents to be processed in the udev script. See ticket #1720
for details. (Matthew Burgess)
n/a - March 21, 2006
* Removed old references to boot_log function and arguments passed
to boot_mesg_flush in echo_* functions. (DJ Lucas)
n/a - March 10, 2006
* Moved src argument to ipv4-static-route service script and
removed from ipv4-static service script. (DJ Lucas)
n/a - March 8. 2006
* Correct sourced path in checkfs script. (Matthew Burgess)
n/a - December 31, 2005
* Replaced /etc/rc.d with ${rc_base} in checkfs. (Vincent Fretin)
n/a - December 24, 2005
* Added UTF-8 support to console script. (Alexander E. Patrakov)
n/a - September 11, 2005
* Removed text wraping and boot logging.
* Changed killproc to use warning if not running
* Changed 'print_status warning' to use old style output
* Fixed display error with LSB init-functions script
* Made above killproc/print_status changes in enhanced
bootscripts.
* Made logger service configurable in enhanced
bootscripts. (DJ Lucas)
n/a - August 14, 2005
* Added -s flag to pidofproc() for backwards
compatibility (DJ Lucas)
* Fixed erronous values returned by pidofproc() which
broke the functionality of statusproc (DJ Lucas)
n/a - July 1, 2005
* Changed a == to a = in lfs/init.d/functions, in the boot_mesg
function for ash compliancy (Nathan Coulson)
n/a - June 26, 2005
* Removed consolelog script from contrib
* Updated interactive rc script in contrib and added
README.rc-Interactive, added install target to the
Makefile. (DJ Lucas)
3.2.2 - May 29, 2005
* Tagged as 3.2.2 (Nathan Coulson)
n/a - May 26, 2005
* Added minimal target for cross-lfs book (Jim Gifford)
* Fixed raq2 patch (Jim Gifford)
3.2.1 - May 1, 2005
* Tagged as 3.2.1 (Nathan Coulson)
n/a - April 17, 2005
* removed touch from hotplug bootscript (Matthew Burgess)
* moved commands around in localnet bootscript (Andrew Benton)
3.2.0 - March 30, 2005
* Changed from syslog-ng to sysklogd (Archaic)
* Temporairly changed loadproc to return 0 if the program is
already running (Nathan Coulson)
* Fixed (by reverting) ifup/ifdown/network (Nathan Coulson),
Reported by Jim Gifford
* Fixed network up/down along with adding support of ONHOTPLUG
* Tagged as 3.2.0
n/a - March 19, 2005
* Updated RaQ2 patch (Jim Gifford)
* Added net.agent for Hotplug of Network adapters in contrib
(Jim Gifford)
n/a - March 16, 2005
* Reverted the change from loadproc to start_daemon,
Moved compatibility code into one single function.
(Nathan Coulson)
* Readded the ONHOTPLUG option for ifup/ifdown (Nathan Coulson)
* Fixed killproc's output
n/a - March 01, 2005
* Added CHECK_LINK variable in ifconfig.*/*, so if the
interface does not exist, it will not fail.
(Nathan Coulson)
n/a - February 19, 2005
* Added evaluate_retval to the end of loadproc and killproc.
lsb does not say that killproc should print [ OK ],
but required for compatibility. (Nathan Coulson)
n/a - February 9, 2005
* Accidently mounted /dev with 775 instead of 755, fixed
(Reported by Alexander E. Patrakov)
n/a - February 9, 2005
* Bugfix for /dev, now mounted with 755 permission
n/a - February 8, 2005
* changed pidof, so it doesnt check the process id
of running bootscripts, and to process shell scripts
(Nathan Coulson)
n/a - February 6, 2005
* Updated main functions file with lsb functions file
Should now be LSB compliant (Nathan Coulson)
n/a - January 10, 2005
* Moved ONBOOT check back to network (Nathan Coulson)
* Removed ONHOTPLUG check (Nathan Coulson)
n/a - January 6, 2005
* fixed mountkernfs output (Nathan Coulson)
* reverted mountfs fakemounting (Nathan Coulson)
n/a - January 5, 2005
* Attempted to simplify network bootup files (Nathan Coulson)
* Modified mountkernfs to use mountpoint (Nathan Coulson)
* Assuming sysfs is always mounted (Nathan Coulson)
* Moved fakemount to below mounting (Nathan Coulson)
* Removed -t noramfs from umount, as we now use tmpfs (Nathan Coulson)
* moved sysctl from mountkernfs to sysctl (Nathan Coulson)
* Added -q to sysctl (Nathan Coulson)
n/a - January 2, 2005
* Fixed statusproc output. (DJ Lucas)
3.1.0 - December 31, 2004
* fixed textoutput
* Tagged as 3.1.0
n/a - December 30, 2004
* Fixed name of LSB Functions file
* Changed boot_mesg to act like echo instead of echo -n, boot_mesg now
takes the -n argument if you do not wish to goto the next line
3.0.1 - December 25, 2004
* Released as 3.0.1
n/a - December 20, 2004
* Cleaned up header.
* Added RaQ2 Patch
n/a - December 16, 2004
* Fixed a text typo in udev, tmpfs instead of ramfs (Steve Crosby)
n/a - December 14, 2004
* Fixed a warning with find in cleanfs
3.0 - December 8, 2004
n/a - December 5, 2004
* Moved bootlog to use local2 service to avoide conflict with
dhcpcd (DJ Lucas)
3.0-rc1 - December 1, 2004
* rc-Interactive added (DJ Lucas)
* rc-Interactive moved to contrib (Nathan Coulson)
n/a - November 27, 2004
* Moved bootlog to use local1 to avoid conflict with ppd (DJ Lucas)
n/a - November 25, 2004
* Added consolelog to contrib/sysconfig (DJ Lucas)
* Rewrite of line wraping in boot_mesg and various fixes
related to boot_mesg changes (DJ Lucas, Alexander Patrakov)
* syslog-ng is now installed by default (Jeremy Utley)
* hotplug is now installed by default (Jeremy Utley)
* udev now uses /sbin/hotplug as the default hotplug handler (Nathan Coulson)
* udev now mounts a tmpfs instead of a ramfs onto /dev,
as suggested by Greg K-H (Nathan Coulson)
* Created contrib/lsb, and added a LSB compliant functions file
(Nathan Coulson, and Alexander Patrakov)
* Modified find [requires find 4.2.3+] (Matthew Burgess)
n/a - November 20, 2004
* Modifed modules script to return to previous kernel message
level (DJ Lucas)
n/a - November 02, 2004
* Added sysctl -p to mountkernfs (Matthew Burgess, DJ Lucas)
n/a - October 07, 2004
* statusproc modified not to send data to bootlog (Nathan Coulson)
* Fixed halt commands in checkfs and udev (James Robertson)
n/a - October 04, 2004
* Fixes to commit on 2004/09/30 (James Robertson)
* Revert a few changes until later (Nathan Coulson)
* Added a warning about switching from a 8bit font
to a 9bit font (Alexander Patrakov)
n/a - September 30, 2004
* Finished off boot_mesg() (James Robertson)
* Standardized all scripts to same variable format and other
internal sh/bash function calls (James Robertson)
* Fully implemented boot_mesg across all scripts in sysconfig
and init.d (James Robertson)
n/a - September 26, 2004
* Added BOOTMESG_PREFIX variable, so users can optionally set a
prefix for boot messages (James Robertson)
* Fixed localnet status, to use ip instead of ifconfig (Jim Gifford)
* Added consolelog to contrib (DJ Lucas)
* loadproc and killproc can have the -nomsg parameter to avoid
calling evaluate_retval or print_status (Jim Gifford)
* boot_mesg no longer explicitly adds a \n onto end of lines
* Added a function called boot_mesg_flush, which can
dump the BOOTMESG to the bootlog. This helps avoid making
everything have to end in OK/WARN/FAIL (Nathan Coulson)
n/a - September 24, 2004
* Removed /dev/udev.tdb test
n/a - September 23, 2004
* Fixed boot_log so it output's $@'s contents, not @$
* Added support for colors in boot_mesg (James Robertson)
* Modified udev's error checking
* Modified hotplug's error checking
* Converted checkfs's error handling to use boot_mesg with
color support
* Added $INFO color to functions (James Robertson)
n/a - September 22, 2004
* Removed the dependency on wl by replacing it with grep (Bryan Kadzban)
* Fixed getpids, to remove unused pids obtained from $PIDFILE
* Removed ${NORMAL} from echo "$BOOTMESG" in functions, and removed
space added to each additional sentence tacked onto BOOTMESG
* boot_mesg now handles \n's properly, and does not dimish the size of
the next line (James Robertson)
* boot_log has been added. The echo_ functions commit the log,
and then clear the BOOTMSG variable
* All scriptes have been converted to use boot_mesg
n/a - September 21, 2004
* boot_mesg has been enhanced. Subsequent calls will overwrite previous
text, and it will wrap text basedupon the variable ${WCOL}.
(James Robertson)
* Fixed mtu optional service typo (Kevin P Fleming)
* Added SOURCE variable to ipv4-static-route (Kevin P Fleming)
n/a - September 16, 2004
* nework interfaces are now brought down in reverse order
n/a - September 15, 2004
* Added blue bracket, from dj's 3.0-pre1 bootscript package
[echo_failure, echo_warning, and echo_ok]
* Added a new function called boot_mesg, meant to replace the echo
command.
This will give us the posibility of doing logging at a later date
* Do not set COLUMNS if COLUMNS is already set
* Modified getpids, loadproc, killproc, reloadproc, and statusproc as
done by DJ
2.2.3 - September 04, 2004
* Tagged as 2.2.3
n/a - September 04, 2004
* Added new script to contrib for syslog-ng, which is now part of
LFS-Unstable, and a new Makefile target install-syslog-ng which
removes the sysklogd links, and replaces them with syslog-ng (JU)
2.2.2 - August 11, 2004
* Tagged as 2.2.2
n/a - August 7, 2004
* Added missing error redirect (/dev/null) in getpids. (DJ)
n/a - August 4, 2004
* Added MODE, DIRMODE, and CONFMODE variables to the makefile
to allow permissions to be set at install. (DJ)
n/a - July 31, 2004
* Moved PIDFILE check to getpids and removed arguments from
killproc and reloadproc. Signals are now set at begining of
funtcions script with KILLDELAY. (DJ)
* Added a optional service script which can set the MTU for a given
interface
n/a - July 21, 2004
* Committed DJ Lucas's patch for the killproc function. It no
longer requires arguments if PIDFILE is set
* added --backup to all sysconfig configuration files, so they are not
replaced on a make install
n/a - July 13, 2004
* Added the PEER variable to the ifconfig.*/* file, done by
Kevin P. Fleming
2.2.1 - July 12, 2004
* Tagged as 2.2.1
n/a - July 12, 2004
* Hotplug was moved from rcsysinit.d to rc{1,2,3,4,5} to help bring
up/down network interfaces started by hotplug. This has been revoked
at this time
* Networking interfaces are now brought down in reverse order
* Moved the ONBOOT check to within ifup/ifdown, so we can bring up/down
the interfaces at boottime/shutdown properly, done by Kevin P. Fleming
* Use PREFIX instead of NETMASK for adding addresses in ipv4-static,
done by Kevin P. Fleming
* Fix reversal of services inside ifconfig.* directories in ifdown,
done by Kevin P. Fleming
* Add ipv4-static-route service, supplied by Kevin P. Fleming
2.2.0 - July 12, 2004
* Tagged as 2.2.0
n/a - July 11, 2004
* Minor script output changes
* Repaired networking scripts broken in previous commits
n/a - July 10, 2004
* We now use the ip program [from iproute2] instead of ipconfig
[net-tools] to bring up/down ethernet interfaces, and local
connections, submitted by Jim Gifford
* Removed gateway backward compatibility
* Removed ifup-eth0 ifdown-eth0 compatibility
* Removed the "assume SERVICE=static if SERVICE is unset" compatibility
* Pass the IFCONFIG environmental variable to services, so they can
locate the file with the parameters they must read
* Rename static to ipv4-static
* Stage1 for network configuration via directories, ifup and ifdown
modified, and the static service modified
* Stage2 for network configuration via directories complete, network was
modified to check within subdirectories for ONBOOT=yes. Final Stage
n/a - July 8, 2004
* Changed iso01 to lat1 everywhere in /etc/sysconfig/console. This
fixes the problem with line-drawing characters.
n/a - July 7, 2004
* Halted the computer, if unable to mount /dev as a ramfs
n/a - July 6, 2004
* Moved the hotplug bootscript back to contrib, it will not be used in
the testing branch of the lfs book at this time
n/a - July 4, 2004
* Modified ifup and ifdown to be hotplug aware
n/a - July 3, 2004
* Change the check for ONBOOT into a source within a subshell
n/a - July 1, 2004
* Moved hotplug start to runlevels 3-5 from sysinit
n/a - June 30, 2004
* Pass -depth in cleanfs
n/a - June 29, 2004
* Made the grep for ONBOOT in the network script more exact
2.1.2 - June 27, 2004
* Install the automatic module loading script by default
* Tagged as 2.1.2
n/a - June 26, 2004
* Fixed font for UK in /etc/sysconfig/console
n/a - June 23, 2004
* Fixed a typo in the hotplug installation procedure
n/a - June 21, 2004
* Re-ordered the "mount" and "echo" commands in the udev script, to
prevent a possible race
* Converted the udev script to use udevsend/udevd
* Moved removal of /fastboot and /forcefsck to just after the root fs
becomes writable, and dropped the removal of /etc/nologin
* Cleaned and tweaked both the output and actions of cleanfs
* Removed the disabling of hotplug from sendsignals
* Removed anything that might call "rmmod" in hotplug, since rmmod is
notoriously troublesome in the 2.6.x kernels, and call it with the
stop argument from runlevels 0 and 6
* Fixed previous modifications to the udev and cleanfs scripts
n/a - June 20, 2004
* Rolled back to the /dev/.udev.tdb check from 2.1.1, since the new
one doesn't work as well, and the bug that caused it to change is
now fixed
n/a - June 18, 2004
* Updated sysconfig/console
* Fixed disabling hotplug in sendsignals
* hotplug is now installed by default
n/a - June 15, 2004
* Reset /proc/sys/kernel/hotplug to /bin/true when running the "stop"
command for hotplug
* Cleaned the output of the mountkernfs script
* Don't output "Creating files and directories" when it's a lie
n/a - June 8, 2004
* Changed the location the optional module script is installed to
/etc/rc.d/rcsysinit.d/S05modules.
n/a - June 4, 2004
* Added a echo to the > /proc/sys/kernel/hotplug line, as > did not
clear it
n/a - June 3, 2004
* Added '> /proc/sys/kernel/hotplug' to sendsignals, to disable hotplug
events, which may start up new daemons
* Added elementry bootup logging support. If it can write to
/var/log/boot.log, it will
* Removed logging support, it kept / from being remounted ro
n/a - June 2, 2004
* Reorganize what goes on in the udev script
* Reorganize what goes on in the hotplug script
* Moved setting /sbin/hotplug as the default hotplug manager into the
hotplug script
n/a - June 1, 2004
* Removed usbfs from mountkernfs, and mountfs
* Edited the udev script, so it'll always set /proc/sys/kernel/hotplug
n/a - May 24, 2004
* Added more example keymaps and font settings to /etc/sysconfig/console
* Install the /etc/sysconfig/console file by default
n/a - May 23, 2004
* Changed the symlink for the optional modules script
* Removed depmod from the optional modules script
n/a - May 20, 2004
* Removed the random script. There is not a strong enough case for
adding it to the lfs-bootscripts.
n/a - May 19, 2004
* Added the random bootscript from blfs-bootscripts
2.1.1 - May 18, 2004
* Fixed installation of modules configuration
* Tagged as 2.1.1
n/a - May 16, 2004
* Added sysklogd configuration file
* Added example /etc/sysconfig/console file
* Do not attempt to populate /dev if that directory has already been
set up earlier in bootup (such as on initramfs/initrd)
* Prevent excessive kernel output once klogd starts
* Added hotplug script
n/a - May 15, 2004
* Namespace rework (enumeration of scripts is now cleaner)
* Removed directories: blfs, contrib/new-boot-0.2, contrib/rlv
n/a - May 13, 2004
* Repaired the console script
* Added a check to cleanfs [createfiles], to make sure that we have
a valid devicetype, if we have type=dev
n/a - May 11, 2004
* Added usbfs to mountkernfs and mountfs
n/a - May 6, 2004
* Don't use loadproc in localnet, it's not meant for that
* Quote tests of $PIDFILE, so that things behave when it's empty
* Removed unused kill -0 from killproc
2.1.0 - May 4, 2004
* Update to the console script, prevent install of the console script
* Chgrp /var/run/utmp to group utmp if it exists.
* Moved udev from contrib to lfs
* Moved GATEWAY setup from /etc/rc.d/init.d/network to
/etc/sysconfig/network-devices/services/static
* Use the contents of $PIDFILE, if it is set in the script
* Tagged as 2.1.0.
n/a - April 30, 2004
* Moved the loadkeys script to console, and added setfont. Contributed
by Alexander E. Patrakov
2.0.5 - April 29, 2004
* Added the heimdal init script.
* Tagged as 2.0.5
2.0.4 - April 27, 2004
* Tagged as 2.0.4
n/a - April 24, 2004
* Added a example script for /etc/sysconfig/createfiles
* Added a check for /sys before mounting sysfs
* Added -t noramfs to umount on /etc/rc.d/init.d/mountfs.
This will prevent /dev from being unmounted, if /proc/mounts
is symlinked to /etc/mtab
n/a - April 18, 2004
* Small fix to a if statement in netfs
n/a - April 17, 2004
* Added the lisa bootscript, lisa is part of the KDE Network package
* Add proper error checking to the mountfs script when writing out mtab
* Add more comments to the udev script, and conditionalize various
things that should've been done this way in the first place
* Include a template module auto-loading configuration file instead of
having syntax comments in the script itself
n/a - April 12, 2004
* Added a automatic modules loading script to the contrib directory
submitted by Zack
* Edited mountkernfs, so that if you can mount sysfs on /sys, it will
be mounted at boottime. Should not affect 2.4 systems
* Since all entries are added to /etc/mtab, we should not require
the NO_FS variable. It has been removed from mountfs
* Added the udev script into the contrib directory, submitted by Zack
2.0.3 - April 8, 2004
* Updated cleanfs, so it can create devices. Supplied by Zack
* Tagged as 2.0.3
n/a - March 31, 2004
* Changed "Press Enter" on unknown error to white
* Moved S10swap to S20swap. When udev is added, it has to be
ran before swap is setup
n/a - March 29, 2004
* Fixed the rc5.d symlink for ntp so it creates S26ntp instead
of S26npt
* Moved S20mountkernfs to S00mountkernfs in rcsysinit.d. Will help in
the addition of udev in the future.
n/a - March 27, 2004
* Changed gdm path from hardcoded to program name. There are 2 spots
gnome can be installed
n/a - March 26, 2004
* Updated fam daemon script. It now uses the famd daemon instead of fam
n/a - March 24, 2004
* Removed mount command out of nfs. the netfs script already handles
this
2.0.2 - March 24, 2004
* Edited cleanfs to solve a problem. [if /tmp does not exist, it
could run the find command on the root filesystem]
* Tagged as 2.0.2
2.0.1 - March 24, 2004
* Found typo in BLFS MySQL Script.
* Tagged as 2.0.1
2.0.0 - March 23, 2004
* Tagged as 2.0.0, no changes from 2.0.0-pre2
2.0.0-pre2 - March 23, 2004
* Cleaned the /tmp directory on bootup. find command supplied by Zack
* Added a script which can automatically create files and directories
on startup. [Handles files/directories, permissions, and user/group].
Created by Zack
* Added blfs/init.d/fam script
* Tagged as 2.0.0-pre2
n/a - March 20, 2004
* Added create-service-dir target and removed from create-dirs
* Changed service script install targets to use
create-service-dir
* Added check for dhcpcd service script for stale pid file
Suggested by Jeremy
* Added ifconfig to ipx service script for hosting device not up
n/a - March 19, 2004
* Added support for ETCDIR, and DESTDIR in the Makefile,
compliments of Tushar
* Renamed mountproc to mountkernfs
* Updated the README file
* Coloured the print_error_message in functions red
* added stop to the setclock script
* changed echo > to > in cleanfs, suggested by winkie
* BLFS Scripts Added, collected by Zack
* Edited killproc, so it checks for running pids, rather then
the completion of the above kill command. Suggested by Zack
* Added network services found in blfs, removed adsl. Submitted by
DJ.
1.99.4 - March 17, 2004
* Fixed one last halt line in checkfs script
* Moved the directory structure around
* Tagged as development release 1.99.4
n/a - February 28, 2004
* Added stty sane to the top of rc.d/init.d/rc. Hopefully, this will
fix the problems
* Also changed all instances of <ctrl-j> back to enter
1.99.3 - February 23, 2004
* Tagged as development release 1.99.3
n/a - February 19, 2004
* Fixed checkfs script, so it will no longer continue to boot after a
failure in the init.d/checkfs script. Tested with the help of Andre
Müller. Fix suggested by Zack
n/a - February 7, 2004
* Added -s onto grep on network stop
* Replaced a few more enter's with ctrl-j
1.99.2 - February 6, 2004
* Added -s onto grep in network start
* Tagged as development release 1.99.2
n/a - February 4, 2004
* Fixed $WARNING $NORMAL and $ERROR lines, broken by changes in
functions
* Changed above fixes to work with ash
* Fixed checkfs symlink in Makefile
* functions is no longer installed as executable
* Added a check to checkfs, for errors above 16. These are caused by
being unable to run fsck, either due to user input, or a unfunctional
linux system
1.99.1 - February 2, 2004
* Tagged as development release 1.99.1
n/a - February 2, 2004:
* Added -d to umount in mountfs.
* Fixed network shutdown script
* Fixed Makefile rc.6 to reboot
* Added -s flag to grep command in rc.d/init.d/network -
suppresses an error if no ifconfig.* files exist
n/a - January 30, 2004:
* Reorganized the network system to accept multiple services.
* Ash Compliancy
* Modified some scripts to follow template
* Reorganized functions, based upon Ash Compliancy Patch
* Added a sleep 5 to failure for evaulate_retval, and changed
evaulate_retval to return true instead of false. Instead, a
exit 1 will indicate the script terminated abnormally, causing
your system to wait until you hit ctrl-J
* Switched "Press enter to continue" to "Press <ctrl-j> to continue"
* replaced 3 with $KILLDELAY in sendsignals
* mountfs does not mount network filesystems [identified by _netdev
in /etc/fstab]
* removed unneded touch out of cleanfs
n/a - January 30, 2004:
* New maintainers for the lfs-bootscripts package are:
Jeremy Utley (jeremy@linuxfromscratch.org)
Nathan Coulson (nathan@linuxfromscratch.org)
1.11 - February 3rd, 2003:
* /etc/mtab is now a real file and is handled correctly so there are
no errors even when the machine has crashed.
1.10 - September 12th, 2002:
* Fixed up checkfs to work with non-ext2 filesystems too (such as
minix).
1.9 - April 5th, 2002:
* reloadproc function had a missing '=' in the "failure 1" command (it
should be failure=1)
* When script exists with unexpected value, you have to hit "Enter" to
continue, not just a random key as printed on the screen.
* Moved K10sysklogd, K20sendsignals, K30mount and K40swap to
K40sysklogd, K50sendsignals, K60mount, K70swap
* Changed the #!/bin/sh lines to #!/bin/bash - /bin/sh may not be
linked to bash but to some other shell of your choice. These scripts
are written to work with bash, so you can't just run them when
/bin/sh -> csh or ash or whatever else tickles your fancy. This
change should fix that.
1.8 - March 14th, 2002:
* Fixed the getpids function call so PPID's would be taken into account
properly.
* Added the 'contrib' directory with other people's bootscript
implementations.
1.7 - March 10th, 2002:
* Used code from Matthias Benkmann's simpleinit-msb @
http://winterdrache.de/linux/newboot/index.html mainly for improved
killproc function handling
* When a requested process isn't running, or is already running, a
warning "Not running" or "Already running" will be displayed. This
was out of allignment due to a missing $CURS_UP
* Removed "||exit" from ifup and ifdown scripts. They are useless.
* Changed the loadkeys script to run "loadkeys -d" and removed the need
for the /etc/sysconfig/keyboard file. The kbd patch fixes the
"loadkeys -d" behaviour.
1.6 - February 26th, 2002:
* replaced -o %PPID with -o $PPID throughout the functions script. This
construct does what it's supposed to do (don't take PPID into account
because this would fail if a running daemon and the bootscript have
the same name).
* added 'restart' to the swap script
* instead of using 'echo -n' to supress newlines so the [ OK ] and
related messages allign properly, substitute this with a single echo
command that simply goes one line up before outputting anything. This
also has the benefit that when programs have their own output (like
swapon, fsck and loadkeys), there won't be an unwanted blank line
between the program's output and the [ OK ] et all. messages.
1.5 - February 2nd, 2002:
* added 'exit 1' to the statusproc function when there aren't enough
parameters passed to it (such as the name of process to check for)
1.4 - February 2nd, 2002:
* when /fastboot is detected and the message about it is printed,
don't run 'exit 1' else the rc script will cause a [FAILED] to
be printed which is undesired in this case.
1.3 - January 30th, 2002:
* network script: changed default route detection by using the same
method as used when starting the script: check if the GATEWAY
variable is set
* removed the emptying of /etc/mtab since it's a symlink to
/proc/mounts now
* added the mountproc script which mounts the proc system. This is done
because we need proc mounted even before the mountfs script is ran
(now that /etc/mtab is a symlink to /proc/mounts)
* removed all absolute paths from command calls
* added umask 022 and PATH="/bin:/usr/bin:/sbin:/usr/sbin" to the
functions script. Every file now sources this so that umask and PATH
are set correctly
1.2 - January 26th, 2002:
* network script: detect if a default route is set before removing it

29
bootscripts/LICENSE Normal file
View File

@ -0,0 +1,29 @@
Copyright (c) 1999-2002, Gerard Beekmans
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions in any form must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Neither the name of "Linux From Scratch" nor the names of its
contributors may be used to endorse or promote products derived from
this material without specific prior written permission.
* Any material derived from Linux From Scratch must contain a
reference to the "Linux From Scratch" project.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

134
bootscripts/Makefile Normal file
View File

@ -0,0 +1,134 @@
ETCDIR=/etc
EXTDIR=${DESTDIR}${ETCDIR}
MODE=754
DIRMODE=755
CONFMODE=644
all: install
create-dirs:
install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc0.d
install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc1.d
install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc2.d
install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc3.d
install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc4.d
install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc5.d
install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rc6.d
install -d -m ${DIRMODE} ${EXTDIR}/rc.d/rcsysinit.d
install -d -m ${DIRMODE} ${EXTDIR}/rc.d/init.d
install -d -m ${DIRMODE} ${EXTDIR}/sysconfig
create-service-dir:
install -d -m ${DIRMODE} ${EXTDIR}/sysconfig/network-devices/services
install: create-dirs create-service-dir
install -m ${MODE} lfs/init.d/checkfs ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/cleanfs ${EXTDIR}/rc.d/init.d/
install -m ${CONFMODE} lfs/init.d/functions ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/halt ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/console ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/consolelog ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/localnet ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/modules ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/mountfs ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/mountkernfs ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/network ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/rc ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/reboot ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/sendsignals ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/setclock ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/sysklogd ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/swap ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/sysctl ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/template ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/udev ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/udev_retry ${EXTDIR}/rc.d/init.d/
ln -sf ../init.d/network ${EXTDIR}/rc.d/rc0.d/K80network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc.d/rc0.d/K90sysklogd
ln -sf ../init.d/sendsignals ${EXTDIR}/rc.d/rc0.d/S60sendsignals
ln -sf ../init.d/mountfs ${EXTDIR}/rc.d/rc0.d/S70mountfs
ln -sf ../init.d/swap ${EXTDIR}/rc.d/rc0.d/S80swap
ln -sf ../init.d/localnet ${EXTDIR}/rc.d/rc0.d/S90localnet
ln -sf ../init.d/halt ${EXTDIR}/rc.d/rc0.d/S99halt
ln -sf ../init.d/network ${EXTDIR}/rc.d/rc1.d/K80network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc.d/rc1.d/K90sysklogd
ln -sf ../init.d/network ${EXTDIR}/rc.d/rc2.d/K80network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc.d/rc2.d/K90sysklogd
ln -sf ../init.d/sysklogd ${EXTDIR}/rc.d/rc3.d/S10sysklogd
ln -sf ../init.d/network ${EXTDIR}/rc.d/rc3.d/S20network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc.d/rc4.d/S10sysklogd
ln -sf ../init.d/network ${EXTDIR}/rc.d/rc4.d/S20network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc.d/rc5.d/S10sysklogd
ln -sf ../init.d/network ${EXTDIR}/rc.d/rc5.d/S20network
ln -sf ../init.d/network ${EXTDIR}/rc.d/rc6.d/K80network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc.d/rc6.d/K90sysklogd
ln -sf ../init.d/sendsignals ${EXTDIR}/rc.d/rc6.d/S60sendsignals
ln -sf ../init.d/mountfs ${EXTDIR}/rc.d/rc6.d/S70mountfs
ln -sf ../init.d/swap ${EXTDIR}/rc.d/rc6.d/S80swap
ln -sf ../init.d/localnet ${EXTDIR}/rc.d/rc6.d/S90localnet
ln -sf ../init.d/reboot ${EXTDIR}/rc.d/rc6.d/S99reboot
ln -sf ../init.d/mountkernfs ${EXTDIR}/rc.d/rcsysinit.d/S00mountkernfs
ln -sf ../init.d/consolelog ${EXTDIR}/rc.d/rcsysinit.d/S02consolelog
ln -sf ../init.d/modules ${EXTDIR}/rc.d/rcsysinit.d/S05modules
ln -sf ../init.d/udev ${EXTDIR}/rc.d/rcsysinit.d/S10udev
ln -sf ../init.d/swap ${EXTDIR}/rc.d/rcsysinit.d/S20swap
ln -sf ../init.d/setclock ${EXTDIR}/rc.d/rcsysinit.d/S25setclock
ln -sf ../init.d/checkfs ${EXTDIR}/rc.d/rcsysinit.d/S30checkfs
ln -sf ../init.d/mountfs ${EXTDIR}/rc.d/rcsysinit.d/S40mountfs
ln -sf ../init.d/udev_retry ${EXTDIR}/rc.d/rcsysinit.d/S45udev_retry
ln -sf ../init.d/cleanfs ${EXTDIR}/rc.d/rcsysinit.d/S50cleanfs
ln -sf ../init.d/console ${EXTDIR}/rc.d/rcsysinit.d/S70console
ln -sf ../init.d/localnet ${EXTDIR}/rc.d/rcsysinit.d/S80localnet
ln -sf ../init.d/sysctl ${EXTDIR}/rc.d/rcsysinit.d/S90sysctl
if [ ! -f ${EXTDIR}/sysconfig/createfiles ]; then install -m ${CONFMODE} lfs/sysconfig/createfiles ${EXTDIR}/sysconfig/; fi
if [ ! -f ${EXTDIR}/sysconfig/modules ]; then install -m ${CONFMODE} lfs/sysconfig/modules ${EXTDIR}/sysconfig/; fi
if [ ! -f ${EXTDIR}/sysconfig/rc ]; then install -m ${CONFMODE} lfs/sysconfig/rc ${EXTDIR}/sysconfig/; fi
install -m ${MODE} lfs/sysconfig/network-devices/ifup ${EXTDIR}/sysconfig/network-devices/
install -m ${MODE} lfs/sysconfig/network-devices/ifdown ${EXTDIR}/sysconfig/network-devices/
install -m ${MODE} lfs/sysconfig/network-devices/services/ipv4-static ${EXTDIR}/sysconfig/network-devices/services/
install -m ${MODE} lfs/sysconfig/network-devices/services/ipv4-static-route ${EXTDIR}/sysconfig/network-devices/services/
install-consolelog: create-dirs
install -m ${MODE} contrib/init.d/consolelog ${EXTDIR}/rc.d/init.d
ln -sf ../init.d/consolelog ${EXTDIR}/rc.d/rcsysinit.d/S00consolelog
install-lsb-compliant:
make -C contrib/lsb
install-service-mtu: create-service-dir
install -m ${MODE} contrib/sysconfig/network-devices/services/mtu ${EXTDIR}/sysconfig/network-devices/services
minimal: create-dirs create-service-dir
install -m ${MODE} lfs/init.d/checkfs ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/cleanfs ${EXTDIR}/rc.d/init.d/
install -m ${CONFMODE} lfs/init.d/functions ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/halt ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/localnet ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/mountfs ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/mountkernfs ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/rc ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/reboot ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/sendsignals ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/setclock ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/swap ${EXTDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/udev ${EXTDIR}/rc.d/init.d/
ln -sf ../init.d/sendsignals ${EXTDIR}/rc.d/rc0.d/S60sendsignals
ln -sf ../init.d/mountfs ${EXTDIR}/rc.d/rc0.d/S70mountfs
ln -sf ../init.d/swap ${EXTDIR}/rc.d/rc0.d/S80swap
ln -sf ../init.d/halt ${EXTDIR}/rc.d/rc0.d/S99halt
ln -sf ../init.d/sendsignals ${EXTDIR}/rc.d/rc6.d/S60sendsignals
ln -sf ../init.d/mountfs ${EXTDIR}/rc.d/rc6.d/S70mountfs
ln -sf ../init.d/swap ${EXTDIR}/rc.d/rc6.d/S80swap
ln -sf ../init.d/reboot ${EXTDIR}/rc.d/rc6.d/S99reboot
ln -sf ../init.d/mountkernfs ${EXTDIR}/rc.d/rcsysinit.d/S00mountkernfs
ln -sf ../init.d/udev ${EXTDIR}/rc.d/rcsysinit.d/S10udev
ln -sf ../init.d/swap ${EXTDIR}/rc.d/rcsysinit.d/S20swap
ln -sf ../init.d/setclock ${EXTDIR}/rc.d/rcsysinit.d/S25setclock
ln -sf ../init.d/checkfs ${EXTDIR}/rc.d/rcsysinit.d/S30checkfs
ln -sf ../init.d/mountfs ${EXTDIR}/rc.d/rcsysinit.d/S40mountfs
ln -sf ../init.d/cleanfs ${EXTDIR}/rc.d/rcsysinit.d/S50cleanfs
if [ ! -f ${EXTDIR}/sysconfig/rc ]; then install -m ${CONFMODE} lfs/sysconfig/rc ${EXTDIR}/sysconfig/; fi
.PHONY: all create-dirs create-service-dir \
install install-service-mtu

79
bootscripts/README Normal file
View File

@ -0,0 +1,79 @@
Network Configuration:
Script Files:
rc.d/init.d/network
sysconfig/network-devices/ifup
sysconfig/network-devices/ifdown
sysconfig/network-devices/services/*
Configuration Files:
sysconfig/network-devices/ifconfig.*/*
Note: ifconfig.* could be either a file or directory,
but the filename extention must be the same name
as the network interface you wish it to belong to.
The files within the directory will be processed
in alphanumerical order on boot, and reversed on
shutdown.
- SERVICE: which script to run in services directory.
- ONBOOT: if set to yes, this interface will be started on
bootup, and stopped on shutdown
- ONHOTPLUG: if set to yes, this interface will be started
and stopped on hotplug events. This requires
ifup and ifdown symlinked to /sbin, as well
as the hotplug package
sysconfig/network
- HOSTNAME: Value of the system's hostname
Additional Configuration:
sysconfig/network-devices/ifconfig.*
ipv4-static:
- IP: static IP Address
- GATEWAY: Specifies the IP Address of the gateway server
- PREFIX: CIDR prefix of IP Address, defaults to 24 if not set
- PEER: IP Address of peer (for point-to-point connections and tunnels)
- BROADCAST: broadcast address
ipv4-static-route:
- TYPE: network (default type if not specified), default, host or
unreachable
- IP: IP Address of target (for network, host and unreachable)
- PREFIX: CIDR prefix of target (for network, host and unreachable)
- GATEWAY: IP Address of gateway to reach target (for network and default)
SetClock configuration:
Script Files:
rc.d/init.d/setclock
Configuration Files:
sysconfig/clock
- UTC: 1 assumes hwclock is in UTC
0 assumes hwclock is in local time
CleanFS configuration:
Script Files:
rc.d/init.d/cleanfs
Configuration Files:
/etc/sysconfig/createfiles
Each line is parsed, using space as a deliminator.
[NAME] [TYPE] [PERMISSIONS] [USER] [GROUP]
The below fields are currently only used on dev type.
([DEV TYPE] [MAJOR#] [MINOR#])
Name:
File/Directory/Device name
Type:
dir: creates a directory
file: creates a file
dev: creates a device
Permissions:
chmod the created file
User/Group:
chown the created file/dir to this user/group
Dev Type:
char: character [needs MAJOR#, MINOR#]
block: block [needs MAJOR#, MINOR#]
pipe: pipe
Major#:
Used by character and block devices.
Minor#:
Used by character and block devices.

View File

@ -0,0 +1,26 @@
ChangeLog
20080531 - [dj] * Synced with LFS-Bootscrpts-20080531 (use udevadm)
* Added additional functions to manage_functions script.
20080413 - [dj] * Added manage_functions script for use by scripts such as
{install,remove}_initd or chkconfig, that need to parse the
LSB headers.
* Cleaned up script headers to reflect real Start or Stop
20080315 - [dj] * Corrected test for $pidfile in pidofproc()
* Replaced exit with return in statusproc() - (lfs-functions)
20080315 - [dj] * Added missing 'stale pid file' checking for pidofproc()
20080210 - [dj] * Updated documentation
20070820 - [dj] * Synced with LFS-bootscripts
20070705 - [dj] * Synced with LFS-bootscripts
* Removed 'stty' from the environment setup as it breaks
custom key configs when run from the CLI.
20070218 - [dj] * Synced with LFS-bootscripts.
20070206 - [dj] * Initial commit

View File

@ -0,0 +1,32 @@
LSB-V3 Installation:
Inline LFS installation: make install &&
sed -i.bak 's@/etc/rc.d@/etc@' /etc/inittab
After LFS: for file in /etc/rc.d /etc/sysconfig/rc /etc/sysconfig/modules \
/etc/sysconfig/createfiles
do
mv $file $file.bak
done &&
make install &&
sed -i.bak 's@/etc/rc.d@/etc@' /etc/inittab
With existing scripts: HERE=$PWD
cp -a /etc/rc.d /etc/rc.d.bak &&
mv /etc/rc.d/* /etc &&
cd /etc/rc.d &&
ln -s ../rc*.d . &&
ln -s ../init.d . &&
for file in /etc/rc.d /etc/syconfig/rc \
/etc/sysconfig/modules /etc/sysconfig/createfiles
do
mv $file $file.bak
done &&
cd $HERE &&
unset HERE &&
make install &&
sed -i.bak 's@/etc/rc.d@/etc/@' /etc/inittab
That's it!

View File

@ -0,0 +1,134 @@
ETCDIR=/etc
EXTDIR=${DESTDIR}${ETCDIR}
MODE=754
DIRMODE=755
CONFMODE=644
all: install
create-dirs:
install -d -m ${DIRMODE} ${EXTDIR}/rc0.d
install -d -m ${DIRMODE} ${EXTDIR}/rc1.d
install -d -m ${DIRMODE} ${EXTDIR}/rc2.d
install -d -m ${DIRMODE} ${EXTDIR}/rc3.d
install -d -m ${DIRMODE} ${EXTDIR}/rc4.d
install -d -m ${DIRMODE} ${EXTDIR}/rc5.d
install -d -m ${DIRMODE} ${EXTDIR}/rc6.d
install -d -m ${DIRMODE} ${EXTDIR}/rcsysinit.d
install -d -m ${DIRMODE} ${EXTDIR}/init.d
install -d -m ${DIRMODE} ${EXTDIR}/sysconfig
install -d -m ${DIRMODE} ${DESTDIR}/lib/lsb
install -d -m ${DIRMODE} ${EXTDIR}/lsb/state
create-service-dir:
install -d -m ${DIRMODE} ${EXTDIR}/sysconfig/network-devices/services
create-boottemp-dir:
install -d -m ${DIRMODE} ${EXTDIR}/init.d/boottemp
install: create-dirs create-service-dir create-boottemp-dir
install -m ${MODE} init.d/checkfs ${EXTDIR}/init.d/
install -m ${MODE} init.d/cleanfs ${EXTDIR}/init.d/
install -m ${CONFMODE} init.d/lfs-functions ${EXTDIR}/init.d/
install -m ${MODE} init.d/halt ${EXTDIR}/init.d/
install -m ${MODE} init.d/console ${EXTDIR}/init.d/
install -m ${MODE} init.d/localnet ${EXTDIR}/init.d/
install -m ${MODE} init.d/modules ${EXTDIR}/init.d/
install -m ${MODE} init.d/mountfs ${EXTDIR}/init.d/
install -m ${MODE} init.d/mountkernfs ${EXTDIR}/init.d/
install -m ${MODE} init.d/network ${EXTDIR}/init.d/
install -m ${MODE} init.d/rc ${EXTDIR}/init.d/
install -m ${MODE} init.d/reboot ${EXTDIR}/init.d/
install -m ${MODE} init.d/sendsignals ${EXTDIR}/init.d/
install -m ${MODE} init.d/setclock ${EXTDIR}/init.d/
install -m ${MODE} init.d/sysklogd ${EXTDIR}/init.d/
install -m ${MODE} init.d/swap ${EXTDIR}/init.d/
install -m ${MODE} init.d/sysctl ${EXTDIR}/init.d/
install -m ${MODE} init.d/template ${EXTDIR}/init.d/
install -m ${MODE} init.d/udev ${EXTDIR}/init.d/
install -m ${MODE} init.d/udev_retry ${EXTDIR}/init.d/
install -m ${CONFMODE} lsb/init-functions ${DESTDIR}/lib/lsb/
install -m ${CONFMODE} lsb/manage-functions ${DESTDIR}/lib/lsb/
install -m ${CONFMODE} etc/lsb-config ${EXTDIR}/lsb/
ln -sf ../init.d/network ${EXTDIR}/rc0.d/K80network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc0.d/K90sysklogd
ln -sf ../init.d/sendsignals ${EXTDIR}/rc0.d/S60sendsignals
ln -sf ../init.d/mountfs ${EXTDIR}/rc0.d/S70mountfs
ln -sf ../init.d/swap ${EXTDIR}/rc0.d/S80swap
ln -sf ../init.d/localnet ${EXTDIR}/rc0.d/S90localnet
ln -sf ../init.d/halt ${EXTDIR}/rc0.d/S99halt
ln -sf ../init.d/network ${EXTDIR}/rc1.d/K80network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc1.d/K90sysklogd
ln -sf ../init.d/network ${EXTDIR}/rc2.d/K80network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc2.d/K90sysklogd
ln -sf ../init.d/sysklogd ${EXTDIR}/rc3.d/S10sysklogd
ln -sf ../init.d/network ${EXTDIR}/rc3.d/S20network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc4.d/S10sysklogd
ln -sf ../init.d/network ${EXTDIR}/rc4.d/S20network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc5.d/S10sysklogd
ln -sf ../init.d/network ${EXTDIR}/rc5.d/S20network
ln -sf ../init.d/network ${EXTDIR}/rc6.d/K80network
ln -sf ../init.d/sysklogd ${EXTDIR}/rc6.d/K90sysklogd
ln -sf ../init.d/sendsignals ${EXTDIR}/rc6.d/S60sendsignals
ln -sf ../init.d/mountfs ${EXTDIR}/rc6.d/S70mountfs
ln -sf ../init.d/swap ${EXTDIR}/rc6.d/S80swap
ln -sf ../init.d/localnet ${EXTDIR}/rc6.d/S90localnet
ln -sf ../init.d/reboot ${EXTDIR}/rc6.d/S99reboot
ln -sf ../init.d/mountkernfs ${EXTDIR}/rcsysinit.d/S00mountkernfs
ln -sf ../init.d/sysctl ${EXTDIR}/rcsysinit.d/S05sysctl
ln -sf ../init.d/modules ${EXTDIR}/rcsysinit.d/S10modules
ln -sf ../init.d/udev ${EXTDIR}/rcsysinit.d/S15udev
ln -sf ../init.d/swap ${EXTDIR}/rcsysinit.d/S20swap
ln -sf ../init.d/setclock ${EXTDIR}/rcsysinit.d/S25setclock
ln -sf ../init.d/checkfs ${EXTDIR}/rcsysinit.d/S30checkfs
ln -sf ../init.d/mountfs ${EXTDIR}/rcsysinit.d/S40mountfs
ln -sf ../init.d/udev_retry ${EXTDIR}/rcsysinit.d/S45udev_retry
ln -sf ../init.d/cleanfs ${EXTDIR}/rcsysinit.d/S50cleanfs
ln -sf ../init.d/console ${EXTDIR}/rcsysinit.d/S70console
ln -sf ../init.d/localnet ${EXTDIR}/rcsysinit.d/S80localnet
if [ ! -f ${EXTDIR}/sysconfig/createfiles ]; then install -m ${CONFMODE} sysconfig/createfiles ${EXTDIR}/sysconfig/; fi
if [ ! -f ${EXTDIR}/sysconfig/modules ]; then install -m ${CONFMODE} sysconfig/modules ${EXTDIR}/sysconfig/; fi
if [ ! -f ${EXTDIR}/sysconfig/rc ]; then install -m ${CONFMODE} sysconfig/rc ${EXTDIR}/sysconfig/; fi
if [ ! -f ${EXTDIR}/sysconfig/rc.site ]; then install -m ${CONFMODE} sysconfig/rc.site ${EXTDIR}/sysconfig/; fi
install -m ${MODE} sysconfig/network-devices/ifup ${EXTDIR}/sysconfig/network-devices/
install -m ${MODE} sysconfig/network-devices/ifdown ${EXTDIR}/sysconfig/network-devices/
install -m ${MODE} sysconfig/network-devices/services/ipv4-static ${EXTDIR}/sysconfig/network-devices/services/
install -m ${MODE} sysconfig/network-devices/services/ipv4-static-route ${EXTDIR}/sysconfig/network-devices/services/
minimal: create-dirs create-service-dir create-boottemp-dir
install -m ${MODE} init.d/checkfs ${EXTDIR}/init.d/
install -m ${MODE} init.d/cleanfs ${EXTDIR}/init.d/
install -m ${CONFMODE} init.d/lfs-functions ${EXTDIR}/init.d/
install -m ${MODE} init.d/halt ${EXTDIR}/init.d/
install -m ${MODE} init.d/localnet ${EXTDIR}/init.d/
install -m ${MODE} init.d/mountfs ${EXTDIR}/init.d/
install -m ${MODE} init.d/mountkernfs ${EXTDIR}/init.d/
install -m ${MODE} init.d/rc ${EXTDIR}/init.d/
install -m ${MODE} init.d/reboot ${EXTDIR}/init.d/
install -m ${MODE} init.d/sendsignals ${EXTDIR}/init.d/
install -m ${MODE} init.d/setclock ${EXTDIR}/init.d/
install -m ${MODE} init.d/swap ${EXTDIR}/init.d/
install -m ${MODE} init.d/udev ${EXTDIR}/init.d/
install -m ${CONFMODE} lsb/init-functions ${DESTDIR}/lib/lsb/
install -m ${CONFMODE} lsb/manage-functions ${DESTDIR}/lib/lsb/
install -m ${CONFMODE} etc/lsb-config ${EXTDIR}/lsb/
ln -sf ../init.d/sendsignals ${EXTDIR}/rc0.d/S60sendsignals
ln -sf ../init.d/mountfs ${EXTDIR}/rc0.d/S70mountfs
ln -sf ../init.d/swap ${EXTDIR}/rc0.d/S80swap
ln -sf ../init.d/halt ${EXTDIR}/rc0.d/S99halt
ln -sf ../init.d/sendsignals ${EXTDIR}/rc6.d/S60sendsignals
ln -sf ../init.d/mountfs ${EXTDIR}/rc6.d/S70mountfs
ln -sf ../init.d/swap ${EXTDIR}/rc6.d/S80swap
ln -sf ../init.d/reboot ${EXTDIR}/rc6.d/S99reboot
ln -sf ../init.d/mountkernfs ${EXTDIR}/rcsysinit.d/S00mountkernfs
ln -sf ../init.d/udev ${EXTDIR}/rcsysinit.d/S10udev
ln -sf ../init.d/swap ${EXTDIR}/rcsysinit.d/S20swap
ln -sf ../init.d/setclock ${EXTDIR}/rcsysinit.d/S25setclock
ln -sf ../init.d/checkfs ${EXTDIR}/rcsysinit.d/S30checkfs
ln -sf ../init.d/mountfs ${EXTDIR}/rcsysinit.d/S40mountfs
ln -sf ../init.d/cleanfs ${EXTDIR}/rcsysinit.d/S50cleanfs
if [ ! -f ${EXTDIR}/sysconfig/rc ]; then install -m ${CONFMODE} sysconfig/rc ${EXTDIR}/sysconfig/; fi
.PHONY: all create-dirs create-service-dir create-boottemp-dir \
install minimal

View File

@ -0,0 +1,105 @@
LSB-V3 README
The scripts contianed in this directory are a complete rewrite of the
boot scripts from LFS-6.1 (updated for LFS-SVN about 2008-04-13). As is
usually the case with a rewrite, there have been many changes:
LSB Version 3.1 Compliant Scripts - Immediately noticable are the LSB headers
in the rc.d scripts themselves. Each script contains a usable header to
allow for automating both the installation of, and determining proper
execution order for the startup scripts. These values can also be used
directly in parallel boot setups. Additionally, messages are displayed in
one single write to the screen, after exit status is determined, so that
they can be used in parallel setups. I am not sure if this was the only
barrier to auto language translation in the previous bootscripts. Further,
the messages are created from parts and only written to the screen in a
single command, so maybe no help at all WRT translated boot messages.
LSB 3.1 Omissions - Unfortunately, this package is not completely LSB
compliant as it lacks install-initd and remove-initd programs. The current
popular flavor of these programs is written in Python, which, as you should
know, is not installed until BLFS. I began work on a bash implementation,
and have provided the needed functions to parse the LSB headers in the
manage-functions script (insalled by default into /lib/lsb). Unfortunately,
I have yet to complete the actual install-initd and remove-initd scripts,
however, I do have an almost complete install-initd kept locally. I am
currently working on a separate script to completely rewrite the symlinks
should LFS default values not prove sufficient when working with scripts in
the wild. I have not included either here because they are not yet complete
or thoroughly tested, and due to the development process of lfs-bootscritps,
would be included in a release tarball. If you would like to assist with the
development of these scripts, or would even just like to see what I have so
far, please email me privately. Of course, feel free to write your own if you
do not like the manage-fucntions script (or bash).
Distribution Independent - this original goal for the LFS scripts has been
stretched even further by providing both a global rc config file that
contains (generally) static values, and a new rc.site config file to allow
customization of messages as diplayed to the end user during the boot
process. The format of messages printed to the screen is adjustable
here. As well, the other options that were available in the previous
versions of the lfs-bootscripts, and additional options as discussed below,
are configurable by the /etc/sysconfig/rc.site file.
Single Environment - The rc script has been rewritten completely to allow a
single source of the boot configuration per runlevel change. This config
is inherited from rc's environment as opposed to being sourced everytime a
script is run. This results in a negledgable decrease in boot time, but
it is just better in principle.
Boot Logging - The previous incarnation of the boot log didn't begin
recording events until the root filesystem was mounted read/write. This has
been corrected by providing a tempfs mount immediately after init hands
control to the rc script. The bootlog is generated on the tempfs and then
passed to the log file before login. Additionally, shutdown events are no
longer recorded in the bootlog. They were pretty much useless and it really
wasn't what I'd call a *boot* log. Boot logging is on by default and is
configurable in the /etc/sysconfig/rc.site file.
Interactive Boot - This feature has been included by default, and is a
little more polished than my previous attempt. It does introduce a two
second delay in the boot process (so that you have time to press a button
to select interactive mode). This time value, and the option prompt itself,
is configurable in the /etc/sysconfig/rc.site file.
RC_BASE - The base directory for the bootscripts is now /etc, not
/etc/rc.d. This is mostly to conform with mainstream distros, but other
boot methods do expect that /etc/init.d is the location of bootscripts.
Some distros provide a rc.d direcorty with symlinks to the rc*.d and init.d
directories, I have not done that. /etc is the location now, get your
flying fingers accustomed to it! Of course, this is still configurable in
/etc/sysconfig/rc.site, and if the change is too great, I'll put it back.
LSB Functions - The previous lfs-bootscripts sourced a functions file
located at /etc/rc.d/init.d/functions. This file has been renamed
$distro-functions to segregate it from the old. The name is configurable
by the rc.site configuration file. Both old and new bootscripts can be
used simultaneously in a SYS-V setup (with proper symlinks in place).
LSB defined functions are used where possible, but the $distro-functions file
provides, easy to use wraper functions that
start/stop/reload/force-reload/restart programs, evaluate the numerical
LSB return values, and print status messages to the screen. Both LFS
functions and LSB functions are documented directly in the scritps located
at /etc/init.d/$distro-functions and /lib/lsb/init-functions respectively.
Pretier - Yeah, I just couldn't handle all the grey text... By default,
successful boot messages are prefixed with a single green astrik character,
warning messages with two yellow astirks, and failures are prefixed with
three red astriks. This just provides a second 'quick glance' status when
watching the boot messages fly by. Again, the prefixes are configurable (or
completely removable) in the /etc/sysconfig/rc.site file.
Complete Rewrite - Yep. That doesn't mean that code wasn't reused when
possible, so Alexander, Bryan, Dan, Gerard, Jeremy, Jim, Mathias, Matthew,
Nathan, and countless other contributors (whose names I've forgotten and will
promptly be reminded of (please)) are due credit for these as well. That
said, at very least, this is a complete reorganisation that I've tested to
the best of my ability, but there probably are some hidden bugs that will
come to lite when used more frequently. Please give me a shout _when_ you
find them.
Thanks.
-- DJ Lucas
dj@linuxfromscratch.org

View File

@ -0,0 +1,8 @@
# Begin /etc/lsb/lsb-config
rcbase="/etc/init.d"
statedir="/etc/lsb/state"
distro="LFS"
# End /etc/lsb/lsb-config

View File

@ -0,0 +1,105 @@
#!/bin/sh
# Begin /etc/init.d/checkfs
### BEGIN INIT INFO
# Provides: checkfs
# Required-Start: udev swap $time
# Should-Start: lvm
# Required-Stop:
# Should-Stop:
# Default-Start: sysinit
# Default-Stop:
# Short-Description: Checks local filesystems before mounting.
# Description: Checks local filesystmes before mounting.
# X-LFS-Default-Start: S30
# X-LFS-Default-Stop:
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
if [ -f /fastboot ]; then
echo "${INFO}/fastboot found!"
log_success_msg "Will not perform file system checks as requested."
exit 0
fi
mount -n -o remount,ro / >/dev/null
if [ ${?} != 0 ]
then
log_failure_msg "Mounting root file system in read-only mode"
echo "${FAILURE}FAILURE:\n"
echo -n "${FIALURE}Cannot check root filesystem because it "
echo "${FAILURE}could not be mounted"
echo "${FAILURE}in read-only mode.\n\n"
echo -n "${FAILURE}After you press Enter, this system will be "
echo "${FAILURE}halted and powered off.\n"
echo "${INFO}Press enter to continue...${NORMAL}"
read ENTER
/etc/rc.d/init.d/halt stop
fi
if [ -f /forcefsck ]
then
echo "${INFO}/forcefsck found!"
log_success_msg "${INFO}Forcing file system checks as requested."
options="-f"
else
options=""
fi
# Note: -a option used to be -p; but this fails e.g.
# on fsck.minix
fsck ${options} -a -A -C -T
error_value=${?}
if [ "${error_value}" = 0 ]
then
log_success_msg "Checking file systems..."
elif [ "${error_value}" = 1 ]
then
log_warning_msg "Checking file systems..."
echo "${WARNING}WARNING:\n"
echo "${WARNING}File system errors were found and have been"
echo "${WARNING}corrected. You may want to double-check that"
echo "${WARNING}everything was fixed properly.${NORMAL}"
elif [ "${error_value}" = 2 -o "${error_value}" = 3 ]; then
log_warning_msg "Checking file systems..."
echo "${WARNING}WARNING:\n"
echo "${WARNING}File system errors were found and have been been"
echo "${WARNING}corrected, but the nature of the errors require"
echo "${WARNING}this system to be rebooted.\n"
echo "After you press enter, this system will be rebooted.\n"
echo "${INFO}Press Enter to continue...${NORMAL}"
read ENTER
reboot -f
elif [ "${error_value}" -gt 3 -a "${error_value}" -lt 16 ]; then
log_failure_msg "Checking file systems..."
echo "${FAILURE}FAILURE:\n"
echo "${FAILURE}File system errors were encountered that could"
echo "${FAILURE}not be fixed automatically. This system cannot"
echo "${FAILURE}continue to boot and will therefore be halted"
echo "${FAILURE}until those errors are fixed manually by a"
echo "${FAILURE}System Administrator.\n"
echo "${FAILURE}After you press Enter, this system will be"
echo "${FAILURE}halted and powered off.\n"
echo "${INFO}Press Enter to continue...${NORMAL}"
read ENTER
/etc/rc.d/init.d/halt stop
elif [ "${error_value}" -ge 16 ]; then
log_failure_msg "Checking file systems..."
echo "${FAILURE}FAILURE:\n"
echo "${FAILURE}Unexpected Failure running fsck. Exited with error"
echo "${FAILURE}code: ${error_value}.${NORMAL}"
exit ${error_value}
fi
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End /etc/init.d/checkfs

View File

@ -0,0 +1,113 @@
#!/bin/sh
# Begin /etc/init.d/cleanfs
### BEGIN INIT INFO
# Provides: cleanfs
# Required-Start: $local_fs
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: sysinit
# Default-Stop:
# Short-Description: Cleans temporary directories early in the boot process.
# Description: Cleans temporary directories /var/run, /var/lock, and
# /tmp. cleanfs also creates /var/run/utmp and any files
# defined in /etc/sysconfig/createfiles.
# X-LFS-Default-Start: S50
# X-LFS-Default-Stop:
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
# Function to create files/directory on boot.
create_files()
{
# Read in the configuration file.
exec 9>&0 < /etc/sysconfig/createfiles
while read name type perm usr grp dtype maj min junk
do
# Ignore comments and blank lines.
case "${name}" in
""|\#*) continue ;;
esac
# Ignore existing files.
if [ ! -e "${name}" ]
then
# Create stuff based on its type.
case "${type}" in
dir)
mkdir "${name}"
;;
file)
:> "${name}"
;;
dev)
case "${dtype}" in
char)
mknod "${name}" c ${maj} ${min}
;;
block)
mknod "${name}" b ${maj} ${min}
;;
pipe)
mknod "${name}" p
;;
*)
echo -n "\n${WARNING}Unknown device type: ${dtype}"
echo "${NORMAL}"
;;
esac
;;
*)
echo "\n${WARNING}Unknown type: ${type}${NORMAL}"
continue
;;
esac
# Set up the permissions, too.
chown ${usr}:${grp} "${name}"
chmod ${perm} "${name}"
fi
done
exec 0>&9 9>&-
}
case "${1}" in
start)
message="Cleaning file systems: "
message="${message}${INFO} /tmp"
find /tmp -xdev -mindepth 1 ! -name lost+found \
-delete || failed=1
message="${message} /var/lock"
find /var/lock -type f -exec rm -f {} \; || failed=1
message="${message} /var/run${NORMAL}"
find /var/run ! -type d ! -name utmp -exec rm -f {} \; || failed=1
> /var/run/utmp
if grep -q '^utmp:' /etc/group ; then
chmod 664 /var/run/utmp
chgrp utmp /var/run/utmp
fi
(exit ${failed})
evaluate_retval standard
if egrep -qv '^(#|$)' /etc/sysconfig/createfiles 2>/dev/null
then
message="Creating files and directories..."
create_files
evaluate_retval standard
fi
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End /etc/init.d/cleanfs

View File

@ -0,0 +1,111 @@
#!/bin/sh
# Begin $rc_base/init.d/console
### BEGIN INIT INFO
# Provides: console
# Required-Start:
# Should-Start: $local_fs
# Required-Stop:
# Should-Stop:
# Default-Start: sysinit
# Default-Stop:
# Short-Description: Sets up a localised console.
# Description: Sets up fonts and language settings for the user's
# local as defined by /etc/sysconfig/console.
# X-LFS-Default-Start: S70
# X-LFS-Default-Stop:
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
MESSAGE="Setting up Linux console..."
# Native English speakers probably don't have /etc/sysconfig/console at all
if [ -f /etc/sysconfig/console ]
then
. /etc/sysconfig/console
fi
is_true() {
[ "$1" = "1" ] || [ "$1" = "yes" ] || [ "$1" = "true" ]
}
failed=0
case "${1}" in
start)
# There should be no bogus failures below this line!
# Figure out if a framebuffer console is used
[ -d /sys/class/graphics/fb0 ] && USE_FB=1 || USE_FB=0
# Figure out the command to set the console into the
# desired mode
is_true "${UNICODE}" &&
MODE_COMMAND="echo -en '\033%G' && kbd_mode -u" ||
MODE_COMMAND="echo -en '\033%@\033(K' && kbd_mode -a"
# On framebuffer consoles, font has to be set for each vt in
# UTF-8 mode. This doesn't hurt in non-UTF-8 mode also.
! is_true "${USE_FB}" || [ -z "${FONT}" ] ||
MODE_COMMAND="${MODE_COMMAND} && setfont ${FONT}"
# Apply that command to all consoles mentioned in
# /etc/inittab. Important: in the UTF-8 mode this should
# happen before setfont, otherwise a kernel bug will
# show up and the unicode map of the font will not be
# used.
# FIXME: Fedora Core also initializes two spare consoles
# - do we want that?
for TTY in `grep '^[^#].*respawn:/sbin/agetty' /etc/inittab |
grep -o '\btty[[:digit:]]*\b'`
do
openvt -f -w -c ${TTY#tty} -- \
/bin/sh -c "${MODE_COMMAND}" || failed=1
done
# Set the font (if not already set above) and the keymap
is_true "${USE_FB}" || [ -z "${FONT}" ] ||
setfont $FONT ||
failed=1
[ -z "${KEYMAP}" ] ||
loadkeys ${KEYMAP} >/dev/null 2>&1 ||
failed=1
[ -z "${KEYMAP_CORRECTIONS}" ] ||
loadkeys ${KEYMAP_CORRECTIONS} >/dev/null 2>&1 ||
failed=1
# Linux kernel generates wrong bytes when composing
# in Unicode mode. That's why we disable dead keys in Unicode
# mode by default. If you need them, download and apply
# http://www.linuxfromscratch.org/~alexander/patches/linux-2.6.12.5-utf8_input-2.patch
# After patching, add "-m charset_of_your_keymap" to the FONT
# variable and set BROKEN_COMPOSE=false
# in /etc/sysconfig/console
[ -n "$BROKEN_COMPOSE" ] || BROKEN_COMPOSE="$UNICODE"
! is_true "$BROKEN_COMPOSE" ||
echo "" | loadkeys -c >/dev/null 2>&1 ||
failed=1
# Convert the keymap from $LEGACY_CHARSET to UTF-8
[ -z "$LEGACY_CHARSET" ] ||
dumpkeys -c "$LEGACY_CHARSET" |
loadkeys -u >/dev/null 2>&1 ||
failed=1
# If any of the commands above failed, the trap at the
# top would set $failed to 1
( exit $failed )
evaluate_retval standard
;;
*)
echo $"Usage:" "${0} {start}"
exit 1
;;
esac
# End $rc_base/init.d/console

View File

@ -0,0 +1,32 @@
#!/bin/sh
# Begin $RC_BASE/init.d/halt
### BEGIN INIT INFO
# Provides: halt
# Required-Start:
# Should-Start:
# Required-Stop: localnet
# Should-Stop:
# Default-Start: 0
# Default-Stop:
# Short-Description: Halts the system.
# Description: Halts the System.
# X-LFS-Default-Start:
# X-LFS-Default-Stop: S99
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
stop)
log_success_msg "Halting System..."
halt -d -f -i -p
;;
*)
echo "Usage: {stop}"
exit 1
;;
esac
# End /etc/init.d/halt

View File

@ -0,0 +1,215 @@
# Begin /etc/init.d/lfs-functions
# Provides LFS specific functions for LSB style bootscripts
################################# chkstat() ###################################
# chk_stat checks the status of a script by checking for both a binary file #
# to execute, and if set, a config file that may be needed for the program #
# to run successfully. The calling script will exit with a return value of 5 #
# if the binary does not exist, and a value of 6 if the needed config file is #
# unavailable as per LSB requirements. This function accepts zero, one, or #
# two string arguments. If arguments are passed, the first must be a bin #
# file. If a second argument is passed, it is interpreted as the config #
# file. Optionally, zero arguments can be passed if BIN_FILE, and optinally #
# CONFIG_FILE are set in the calling script. #
###############################################################################
chk_stat()
{
if [ "${#}" -gt "0" -a "${#}" -lt "3" ]; then
BIN_FILE="${1}"
if [ -z "${2}" ]; then
CONFIG_FILE=""
else
CONFIG_FILE="${2}"
fi
elif [ -z "${BIN_FILE}" ]; then
echo "Usage: 'chk_stat BIN_FILE CONFIG_FILE'"
exit 1 # Generic Error
fi
if [ ! -e "${BIN_FILE}" ]; then
log_failure_msg "${BIN_FILE} not installed" &&
exit 5
fi
if [ ! -z "${CONFIG_FILE}" ]; then
if [ ! -e "${CONFIG_FILE}" ]; then
log_failure_msg "${CONFIG_FILE} does not exist" &&
exit 6
fi
fi
}
################################ loadproc() ###################################
# loadproc is just a wraper to start_daemon for simple scripts, which will #
# require no arguments if $BIN_FILE is set. #
###############################################################################
loadproc()
{
start_daemon "${BIN_FILE}" "${@}"
}
################################ endproc() ####################################
# endproc, like loadproc, is just a wraper to killproc for simplicity and is #
# dependent on $BIN_FILE being set. #
###############################################################################
endproc()
{
killproc "${BIN_FILE}" "${@}"
}
############################### statusproc() ##################################
# statusproc checks the status of a particular binary and displays the #
# appropriate message (running or not running) and exits on the return value #
# of pidofproc. This function accepts two string arguments or zero arguments #
# if BIN_FILE and MESSAGE are set, else it requires the bin file as the first #
# argument, and the message as the second. Both must be enclosed in quotes. #
###############################################################################
statusproc()
{
if [ "${#}" -gt "0" -a "${#}" -lt "3" ]; then
BIN_FILE="${1}"
MESSAGE="${2}"
elif [ -z "${BIN_FILE}" -o -z "${MESSAGE}" ]; then
echo "Usage: 'statusproc BIN_FILE MESSAGE'"
exit 1 # Generic Error
fi
pidlist=`pidofproc "${BIN_FILE}"`
STATUS=$?
echo "Checking ${MESSAGE} status:"
if [ "${STATUS}" = "0" ]; then
log_success_msg "Running with PID(s) ${pidlist}"
else
log_warning_msg "Not running!"
fi
return "${STATUS}"
}
############################### reloadproc() ##################################
# reloadproc sends a HUP signal to the running program (relaod configuration) #
# It optionally, using the -force switch, checks the status of a particular #
# program and starts it if it is not already running. This function accepts #
# one optional switch (must be the first argument), and either two, or zero #
# string arguments. If BIN_FILE and MESSAGE are set in the script's #
# environment, it will use those values, else it requires the bin file as #
# the first argument (following -force if used), and the message as the #
# second. Both must be enclosed in quotes. If the force option is used, it #
# follows the LSB definition of 'force-reload' - the program is started if #
# not already running. #
###############################################################################
reloadproc()
{
local force="0"
if [ "${#}" -gt "0" -a "${1}" = "-force" ]; then
force="1"
shift 1
fi
if [ "${#}" -gt "0" -a "${#}" -lt "3" ]; then
BIN_FILE="${1}"
MESSAGE="${2}"
elif [ -z "${BIN_FILE}" -o -z "${MESSAGE}" ]; then
echo "Usage: 'reloadproc BIN_FILE MESSAGE'"
exit 1 # Generic Error
fi
}
############################## evaluate_retval() ###############################
# evaluate_retval requires that you pass exactly one evaluation parameter of #
# (start, stop, other) based on the previous action that is being evaluated. #
# This function is intended for use with start_daemon and killproc to #
# interpret the LSB exit codes properly, othewise the checks only for success #
# or failure. #
################################################################################
evaluate_retval()
{
local error_value="${?}"
# Handle LSB defined return values
case "${1}" in
start)
case "${error_value}" in
0)
log_success_msg "Starting ${MESSAGE} "
return "${error_value}"
;;
2)
log_failure_msg "Starting ${MESSAGE} Error: Invalid argument!"
return "${error_value}"
;;
5)
log_failure_msg "Starting ${MESSAGE} Error: Not available!"
return "${error_value}"
;;
*)
log_failure_msg "Starting ${MESSAGE} Error: General failure!"
return "${error_value}"
;;
esac
;;
stop)
case "${error_value}" in
0)
log_success_msg "Stopping ${MESSAGE} "
return "${error_value}"
;;
2)
log_failure_msg "Stopping ${MESSAGE} Error: Invalid argument!"
return "${error_value}"
;;
5)
log_failure_msg "Stopping ${MESSAGE} Error: Not available!"
return "${error_value}"
;;
7)
log_warning_msg "Stopping ${MESSAGE} Warning: Not running!"
return "${error_value}"
;;
*)
log_failure_msg "Stopping ${MESSAGE} Error: General failure!"
return "${error_value}"
;;
esac
;;
force-reload)
message="Forcefully reloading "
;;
reload)
message="Reloading "
;;
restart)
message="Restarting "
;;
try-restart)
message="Trying restart "
;;
standard)
# $message or $MESSAGE must be set, but not both in order
# to use the 'standard' target.
;;
esac
# Print messages for the generic force-reload, reload, restart,
# and try-restart targets
if [ "${error_value}" = "0" ]
then
log_success_msg "${message}${MESSAGE} "
return "${error_value}"
else
log_failure_msg "${message}${MESSAGE} "
return "${error_value}"
fi
}

View File

@ -0,0 +1,84 @@
#!/bin/sh
# Begin /etc/init.d/localnet
### BEGIN INIT INFO
# Provides: localnet
# Required-Start: $local_fs
# Should-Start:
# Required-Stop: $network
# Should-Stop: swap
# Default-Start: sysinit 0 6
# Default-Stop:
# Short-Description: Starts the local network.
# Description: Sets the hostname of the machine and starts the
# loopback interface.
# X-LFS-Default-Start: S80
# X-LFS-Default-Stop: S90
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
. /etc/sysconfig/network
case "${1}" in
start)
ip addr add 127.0.0.1/8 label lo dev lo
ip link set lo up
if [ "${?}" = "0" ]
then
log_success_msg "Bringing up the loopback interface..."
else
log_failure_msg "Bringing up the loopback interface..."
fi
hostname "${HOSTNAME}"
if [ "${?}" = "0" ]
then
log_success_msg "Setting hostname to ${HOSTNAME}..."
else
log_failure_msg "Setting hostname to ${HOSTNAME}..."
fi
;;
stop)
ip link set lo down
if [ "${?}" = "0" ]
then
log_success_msg "Bringing down the loopback interface..."
else
log_failure_msg "Bringing down the loopback interface..."
fi
;;
restart)
ip link set lo down
retval="${?}"
sleep 1
ip addr add 127.0.0.1/8 label lo dev lo
retval=$(( "${retval}" + "${?}" ))
ip link set lo up
retval=$(( "${retval}" + "${?}" ))
hostname "${HOSTNAME}"
retval=$(( "${retval}" + "${?}" ))
if [ "${retval}" = "0" ]
then
log_success_msg "Restarting local network..."
else
log_failure_msg "Restarting local network..."
fi
;;
status)
log_success_msg "Hostname is: ${INFO}$(hostname)${NORMAL}"
ip link show lo
;;
*)
echo "Usage: ${0} {start|stop|restart|status}"
exit 1
;;
esac
# End /etc/init.d/localnet

View File

@ -0,0 +1,99 @@
#!/bin/sh
# Begin /etc/init.d/modules
### BEGIN INIT INFO
# Provides: modules
# Required-Start: mountkernfs
# Should-Start: sysctl
# Required-Stop:
# Should-Stop:
# Default-Start: sysinit
# Default-Stop:
# Short-Description: Loads required modules.
# Description: Loads modules listed in /etc/sysconfig/modules.
# X-LFS-Default-Start: S10
# X-LFS-Default-Stop:
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
# Assure that the kernel has module support.
[ -e /proc/ksyms -o -e /proc/modules ] || exit 0
case "${1}" in
start)
# Exit if there's no modules file or there are no
# valid entries
[ -r /etc/sysconfig/modules ] &&
egrep -qv '^($|#)' /etc/sysconfig/modules ||
exit 0
# If proc is mounted, find the current kernel
# message level
if [ -f /proc/sys/kernel/printk ]; then
prev_msg=`cat /proc/sys/kernel/printk | \
sed 'l 1' | sed -n '2~0p' | \
sed 's/\\\//'`
else
prev_msg="6"
fi
# Now set the message level to 1 so not to make too
# much noise when loading modules
dmesg -n 1
# Only try to load modules if the user has actually given us
# some modules to load.
if egrep -qv '^(#|$)' /etc/sysconfig/modules 2>/dev/null
then
# Read in the configuration file.
exec 9>&0 < /etc/sysconfig/modules
message="${INFO}Loading modules:"
while read module args
do
# Ignore comments and blank lines.
case "${module}" in
""|\#*) continue ;;
esac
# Attempt to load the module, making
# sure to pass any arguments provided.
modprobe ${module} ${args} > /dev/null
# Print the module name if successful,
# otherwise take note.
if [ ${?} -eq 0 ]; then
message="${message}${NORMAL} ${module}"
else
failedmod="${failedmod} ${module}"
fi
done
# Print a message about successfully loaded
# modules on the correct line.
log_success_msg "${message}"
# Print a failure message with a list of any
# modules that may have failed to load.
if [ "${failedmod}" ]; then
log_failure_msg "${FAILURE}Failed to load modules:${failedmod}"
fi
exec 0>&9 9>&-
fi
# Set the kernel message level back to it's previous value.
dmesg -n "${prev_msg}"
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End /etc/init.d/modules

View File

@ -0,0 +1,60 @@
#!/bin/sh
# Begin /etc/init.d/mountfs
### BEGIN INIT INFO
# Provides: $local_fs
# Required-Start: udev checkfs
# Should-Start: lvm
# Required-Stop: sendsignals
# Should-Stop:
# Default-Start: sysinit 0 6
# Default-Stop:
# Short-Description: Mounts and unmounts all local filesystems.
# Description: Remounts root filesystem read/write and mounts all
# remaining local filesystems defined in /etc/fstab on
# start. Rmounts root filesystem read-only and unmounts
# remaining filesystems on stop.
# X-LFS-Default-Start: S40
# X-LFS-Default-Stop: S70
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
message="Remounting root file system in read-write mode..."
mount -n -o remount,rw / >/dev/null
evaluate_retval standard
# Remove fsck-related file system watermarks.
rm -f /fastboot /forcefsck
message="Recording existing mounts in /etc/mtab..."
> /etc/mtab
mount -f / || failed=1
mount -f /proc || failed=1
mount -f /sys || failed=1
(exit ${failed})
evaluate_retval standard
# This will mount all filesystems that do not have _netdev in
# their option list. _netdev denotes a network filesystem.
message="Mounting remaining file systems..."
mount -a -O no_netdev >/dev/null
evaluate_retval standard
;;
stop)
message="Unmounting all other currently mounted file systems..."
umount -a -d -r >/dev/null
evaluate_retval standard
;;
*)
echo "Usage: ${0} {start|stop}"
exit 1
;;
esac
# End /etc/init.d/mountfs

View File

@ -0,0 +1,45 @@
#!/bin/sh
# Begin /etc/init.d/mountkernfs
### BEGIN INIT INFO
# Provides: mountkernfs
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: sysinit
# Default-Stop:
# Short-Description: Mounts /sys and /proc virtual (kernel) filesystems.
# Description: Mounts /sys and /proc virtual (kernel) filesystems.
# X-LFS-Default-Start: S00
# X-LFS-Default-Stop:
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
message="Mounting kernel-based file systems:"
if ! mountpoint /proc > /dev/null; then
message="${message}${INFO} /proc${NORMAL}"
mount -n /proc || failed=1
fi
if ! mountpoint /sys > /dev/null; then
message="${message}${INFO} /sys${NORMAL}"
mount -n /sys || failed=1
fi
(exit ${failed})
evaluate_retval standard
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End /etc/init.d/mountkernfs

View File

@ -0,0 +1,74 @@
#!/bin/sh
# Begin /etc/init.d/network
### BEGIN INIT INFO
# Provides: $network
# Required-Start: $syslog
# Should-Start:
# Required-Stop:
# Should-Stop: $remote_fs
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: Starts and configures network interfaces.
# Description: Starts and configures network interfaces.
# X-LFS-Default-Start: S20
# X-LFS-Default-Stop: K80
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
. /etc/sysconfig/network
case "${1}" in
start)
# Start all network interfaces
for file in ${NETWORK_DEVICES}/ifconfig.*
do
interface=${file##*/ifconfig.}
# skip if $file is * (because nothing was found)
if [ "${interface}" = "*" ]
then
continue
fi
IN_BOOT=1 ${NETWORK_DEVICES}/ifup ${interface}
done
;;
stop)
# Reverse list
FILES=""
for file in ${NETWORK_DEVICES}/ifconfig.*
do
FILES="${file} ${FILES}"
done
# Stop all network interfaces
for file in ${FILES}
do
interface=${file##*/ifconfig.}
# skip if $file is * (because nothing was found)
if [ "${interface}" = "*" ]
then
continue
fi
IN_BOOT=1 ${NETWORK_DEVICES}/ifdown ${interface}
done
;;
restart)
${0} stop
sleep 1
${0} start
;;
*)
echo "Usage: ${0} {start|stop|restart}"
exit 1
;;
esac
# End /etc/init.d/network

View File

@ -0,0 +1,193 @@
#!/bin/sh
# Begin $RC_BASE/init.d/rc
# Get the configuration file
# All changes are to occur in the config file
. /etc/sysconfig/rc
# These 3 signals will not cause our script to exit
trap "" INT QUIT TSTP
# Simple sanity check - rc only takes one argument
if [ "${#}" -ne 1 ]; then
echo "Usage: ${0} <runlevel>" >&2
exit 1
fi
# Do not use the RUNLEVEL and PREVLEVEL variables provided by init so
# that they can be modified and alternate directories (sysinit) can
# be used without affecting init
runlevel="${1}"
prevlevel="${PREVLEVEL}"
# Just in case - some flavors of init don't set PREVLEVEL to 'N'
if [ "${prevlevel}" = "" ]; then
prevlevel="N"
fi
# Mount a tmpfs to store boot accounting information
if [ "${runlevel}" = "sysinit" -a "${TEMPFS_MOUNT}" != "" ]; then
mount -n -t tmpfs tmpfs "${TEMPFS_MOUNT}" -o mode=600
fi
# Provide an interactive prompt (if requested)
if [ "${runlevel}" = "sysinit" -a "${iprompt}" = "yes" ]; then
# ash does not accept t and n flags for read
ls -l /bin/sh | grep "/ash"
if [ "${?}" -eq "0" ]; then
# We are using ash
echo -e -n "${WARNING}WARNING: Either bash or zsh is required"
echo -e "${WARNING} for interactive startup.\n"
sleep 3
else
echo ""
# dcol and icol are spaces before the message to center the
# message on screen.
dcol=$(( $(( ${COLUMNS} - ${dlen} )) / 2 ))
icol=$(( $(( ${COLUMNS} - ${ilen} )) / 2 ))
echo -e "\\033[${dcol}G${welcome_message}"
echo -e "\\033[${icol}G${i_message}${NORMAL}"
echo ""
read -t "${itime}" -n 1 interactive 2>&1 > /dev/null
if [ "${interactive}" = "I" -o "${interactive}" = "i" ]; then
echo -n -e "${CURS_UP}"
echo -e "${INFO}Interactive boot selected...${NORMAL}"
echo "interactive=I" > "${TEMPFS_MOUNT}/.interactive-start"
fi
fi
fi
# Verify that the directory exists
if [ ! -d "${RC_BASE}/rc${runlevel}.d" ]; then
echo -n "${WARNING}${RC_BASE}/rc${runlevel}.d does not exist."
echo "${NORMAL}"
exit 1
fi
# Source the interactive state file if it exists
if [ "${runlevel}" != "sysinit" -a -f "${TEMPFS_MOUNT}/.interactive-start" ]; then
. "${TEMPFS_MOUNT}/.interactive-start"
fi
# Prompt for interactive startup after completing sysinit
if [ "${interactive}" = "I" -a "${runlevel}" != "sysinit" -a \
"${runlevel}" != "0" -a "${runlevel}" != "6" ]; then
echo -n -e "Proceed with interactive starup of runlevel "
echo -n -e "${INFO}${runlevel}${NORMAL}?"
echo -n -e "(${FAILURE}y${NORMAL})es/(${FAILURE}n${NORMAL})o "
read -n 1 go_on
echo ""
if [ "${go_on}" = "n" ]; then
# don't continue
exit 0
fi
fi
# Attempt to stop all services started in the previous runlevel,
# that are stopped in this runlevel
if [ "${prevlevel}" != "N" ]; then
for link in $(ls -v ${RC_BASE}/rc${runlevel}.d/K* 2> /dev/null)
do
# Check to see if link is a valid symlink
if [ ! -f ${link} ]; then
echo -e "${WARNING}${link} is not a valid symlink."
continue # go on to the next K* link
fi
# Check to see if link is executable
if [ ! -x ${link} ]; then
echo -e "${WARNING}${link} is not executable, skipping."
continue # go on to the next K* link
fi
script=${link#$RC_BASE/rc$runlevel.d/K[0-9][0-9]}
prev_start=$RC_BASE/rc$prevlevel.d/S[0-9][0-9]$script
sysinit_start=$RC_BASE/rcsysinit.d/S[0-9][0-9]$script
if [ "${runlevel}" != "0" -a "${runlevel}" != "6" ]; then
if [ ! -f ${prev_start} ] && [ ! -f ${sysinit_start} ]; then
echo -e -n "${WARNING}WARNING:\n\n${link} can't be"
echo -e "${WARNING} executed because it was not"
echo -e -n "${WARNING} not started in the previous"
echo -e "${WARNING} runlevel (${prevlevel})."
echo -e "${NORMAL}"
continue
fi
fi
${link} stop
error_value=${?}
if [ "${error_value}" != "0" ]; then
print_error_msg
fi
done
fi
# Start all functions in this runlevel if they weren't started in
# the previous runlevel
for link in $( ls -v ${RC_BASE}/rc${runlevel}.d/S* 2> /dev/null)
do
if [ "${prevlevel}" != "N" ]; then
script=${link#$RC_BASE/rc$runlevel.d/S[0-9][0-9]}
stop=$RC_BASE/rc$runlevel.d/K[0-9][0-9]$script
prev_start=$RC_BASE/rc$prevlevel.d/S[0-9][0-9]$script
[ -f ${prev_start} ] && [ ! -f ${stop} ] && continue
fi
# Check to see if link is a valid symlink
if [ ! -f ${link} ]; then
echo -e "${WARNING}${link} is not a valid symlink."
continue # go on to the next K* link
fi
# Check to see if link is executable
if [ ! -x ${link} ]; then
echo -e "${WARNING}${link} is not executable, skipping."
continue # go on to the next K* link
fi
case ${runlevel} in
0|6)
${link} stop
;;
*)
if [ "${interactive}" = "I" -o "${interactive}" = "i" ]; then
echo -e -n "${WARNING}Start ${INFO}${link} ${WARNING}?"
echo -e -n "${NORMAL}(${FAILURE}y${NORMAL})es/(${FAILURE}n${NORMAL})o "
read -n 1 startit 2>&1 > /dev/null
echo ""
if [ "${startit}" = "y" -o "${startit}" = "Y" ]; then
${link} start
else
echo -e -n "${WARNING}Not starting ${INFO}${link}"
echo -e "${WARNING}.${NORMAL}\n"
fi
else
${link} start
fi
;;
esac
error_value=${?}
if [ "${error_value}" -gt "1" ]; then
print_error_msg
fi
done
# Strip apply time to the logs, strip out any color codes and dump
# the log to /var/log/boot.log
if [ -f "${TEMPFS_MOUNT}/.bootlog" -a "${runlevel}" != "sysinit" ]; then
# Remove any color codes from the temp log file
sed -i 's@\\033\[[0-9];[0-9][0-9]m@@g' "${TEMPFS_MOUNT}/.bootlog"
#Fix the time and hostname
BTIMESPEC=$(echo `date +"%b %d %T"` `hostname`)
sed -i "s@^bootlog:@${BTIMESPEC} bootlog:@" "${TEMPFS_MOUNT}/.bootlog"
cat "${TEMPFS_MOUNT}/.bootlog" >> /var/log/boot.log
rm -f "${TEMPFS_MOUNT}/.bootlog"
fi
# End $RC_BASE/init.d/rc

View File

@ -0,0 +1,34 @@
#!/bin/sh
# Begin /etc/init.d/reboot
### BEGIN INIT INFO
# Provides: reboot
# Required-Start:
# Should-Start:
# Required-Stop: localnet
# Should-Stop:
# Default-Start: 6
# Default-Stop:
# Short-Description: Reboots the system.
# Description: Reboots the System.
# X-LFS-Default-Start:
# X-LFS-Default-Stop: S99
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
stop)
log_success_msg "Restarting system..."
reboot -d -f -i
;;
*)
echo "Usage: ${0} {stop}"
exit 1
;;
esac
# End /etc/init.d/reboot

View File

@ -0,0 +1,49 @@
#!/bin/sh
# Begin /etc/init.d/sendsignals
### BEGIN INIT INFO
# Provides: sendsignals
# Required-Start:
# Should-Start:
# Required-Stop: $syslog
# Should-Stop:
# Default-Start: 0 6
# Default-Stop:
# Short-Description: Attempts to kill remaining processes.
# Description: Attempts to kill remaining processes.
# X-LFS-Default-Start:
# X-LFS-Default-Stop: S60
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
stop)
message="Sending all processes the TERM signal..."
killall5 -15
error_value=${?}
sleep 3
(exit ${error_value})
evaluate_retval standard
message="Sending all processes the KILL signal..."
killall5 -9
error_value=${?}
sleep 3
(exit ${error_value})
evaluate_retval standard
;;
*)
echo "Usage: ${0} {stop}"
exit 1
;;
esac
# End /etc/init.d/sendsignals

View File

@ -0,0 +1,61 @@
#!/bin/sh
# Begin /etc/init.d/setclock
### BEGIN INIT INFO
# Provides: $time
# Required-Start: udev
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: sysinit
# Default-Stop:
# Short-Description: Stores and restores time from the hardware clock
# Description: On boot, system time is obtained from hwclock. The
# hardware clock can also be set on shutdown.
# X-LFS-Default-Start: S25
# X-LFS-Default-Stop:
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
BIN_FILE="/sbin/hwclock"
CONFIGFILE="/etc/sysconfig/clock"
chk_stat
. "${CONFIGFILE}"
CLOCKPARAMS=
case "${UTC}" in
yes|true|1)
CLOCKPARAMS="${CLOCKPARAMS} --utc"
;;
no|false|0)
CLOCKPARAMS="${CLOCKPARAMS} --localtime"
;;
esac
case ${1} in
start)
message="Setting system clock..."
${BIN_FILE} --hctosys ${CLOCKPARAMS} >/dev/null
evaluate_retval standard
;;
stop)
message="Setting hardware clock..."
${BIN_FILE} --systohc ${CLOCKPARAMS} >/dev/null
evaluate_retval standard
;;
*)
echo "Usage: ${0} {start|stop}"
;;
esac
# End /etc/init.d/setclock

View File

@ -0,0 +1,57 @@
#!/bin/sh
# Begin /etc/init.d/swap
### BEGIN INIT INFO
# Provides: swap
# Required-Start: mountkernfs udev
# Should-Start: lvm
# Required-Stop: $local_fs
# Should-Stop:
# Default-Start: sysinit 0 6
# Default-Stop:
# Short-Description: Mounts and unmounts swap partitions.
# Description: Mounts and unmounts swap partitions defined in
# /etc/fstab.
# X-LFS-Default-Start: S20
# X-LFS-Default-Stop: S80
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
message="Activating all swap files/partitions..."
swapon -a
evaluate_retval standard
;;
stop)
message="Deactivating all swap files/partitions..."
swapoff -a
evaluate_retval standard
;;
restart)
swapoff -a
error_level="${?}"
sleep 1
swapon -a
error_level="$(( ${error_level} + ${?} ))"
(exit "${error_level}")
evaluate_retval restart
;;
status)
log_success_msg "Retrieving swap status..."
echo
swapon -s
;;
*)
echo "Usage: ${0} {start|stop|restart|status}"
exit 1
;;
esac
# End /etc/init.d/swap

View File

@ -0,0 +1,41 @@
#!/bin/sh
# Begin /etc/init.d/sysctl
### BEGIN INIT INFO
# Provides: sysctl
# Required-Start: udev
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: sysinit
# Default-Stop:
# Short-Description: Makes changes to the proc filesystem
# Description: Makes changes to the proc filesystem as defined in
# /etc/sysctl.conf. See 'man sysctl(8)'.
# X-LFS-Default-Start: S05
# X-LFS-Default-Stop:
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
if [ -f "/etc/sysctl.conf" ]; then
message="Setting kernel runtime parameters..."
sysctl -q -p
evaluate_retval standard
fi
;;
status)
sysctl -a
;;
*)
echo "Usage: ${0} {start|status}"
exit 1
;;
esac
# End /etc/init.d/sysctl

View File

@ -0,0 +1,71 @@
#!/bin/sh
# Begin /etc/init.d/sysklogd
### BEGIN INIT INFO
# Provides: $syslog
# Required-Start: localnet
# Should-Start:
# Required-Stop: $network
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts kernel and system log daemons.
# Description: Starts kernel and system log daemons.
# /etc/fstab.
# X-LFS-Default-Start: S10
# X-LFS-Default-Stop: K90
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
MESSAGE="system log daemon..."
start_daemon /usr/sbin/syslogd -m 0
evaluate_retval start
MESSAGE="kernel log daemon..."
start_daemon /usr/sbin/klogd
evaluate_retval start
;;
stop)
MESSAGE="kernel log daemon..."
killproc /usr/sbin/klogd
evaluate_retval stop
MESSAGE="system log daemon..."
killproc /usr/sbin/syslogd
evaluate_retval stop
;;
force-reload)
MESSAGE="system log daemon config file..."
killproc -HUP `/usr/sbin/syslogd`
evaluate_retval reload
;;
restart)
MESSAGE="system and kernel log deamons..."
failed=0
killproc /usr/sbin/klogd || failed=1
killproc /usr/sbin/syslogd || failed=1
start_daemon /usr/sbin/syslogd -m 0 || failed=1
start_daemon /usr/sbin/klogd || failed=1
(exit ${failed})
evaluate_retval restart
;;
status)
statusproc /usr/sbin/syslogd
statusproc /usr/sbin/klogd
;;
*)
echo "Usage: ${0} {start|stop|force-reload|restart|status}"
exit 1
;;
esac
# End /etc/init.d/sysklogd

View File

@ -0,0 +1,92 @@
#!/bin/sh
# Begin /etc/init.d/template
### BEGIN INIT INFO
# Provides: template
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
# X-LFS-Default-Start:
# X-LFS-Default-Stop:
# X-LFS-Provided-By:
### END INIT INFO
# Source the LSB init-functions, ours are pulled in from there.
. /lib/lsb/init-functions
# These are optional, but required for chk_stat. They will be used in
# the rest of the functions if defined, else you must provide a program
# name to control, and a message ('Starting Template Service...'
# or 'Stoping Template Service...') to evauate_retval. See the
# documentaion in the lfs-fucntions file for more information.
MESSAGE="Template Service"
BIN_FILE="/some/path/to/template"
CONFIGFILE="/etc/sysconfig/template.conf"
# check that $BIN_FILE exists and is executable, and $CONFIGFILE exists.
chk_stat
# LSB Defined functions require that at least $BIN_FILE be passed to them,
# where as lfs-functions will use the $BIN_FILE environment variable.
# loadproc() and endproc() are just wrappers that pass everything on to
# the LSB defined functions.
case "${1}" in
start)
#start_daemon "${BIN_FILE}" -arg1 -arg2 #... or:
loadproc -arg1 -arg2 -arg3 #...
evaluate_retval start
;;
stop)
#killproc -TERM "${BIN_FILE}" or:
endproc
evaluate_retval stop
;;
force-reload)
reloadproc -force
evaluate_retval force-reload
;;
restart)
$0 stop
$0 start
;;
status)
statusproc
;;
# reload and try-restart are optional per LSB requirements
reload)
reloadproc
evaluate_retval reload
;;
try-restart)
# Since this is optional there is no lfs-function for this one...
# might be at a later time if used enough, but I doubt it usefullness.
pidofproc "${BIN_FILE}" > /dev/null
if [ "${?}" -ne "0" ]; then
MESSAGE="${MESSAGE}: Not Running"
else
$0 stop
$0 start
exit 0
fi
evaluate_retval try-restart
;;
*)
echo "Usage: ${0} {start|stop|{force-}reload|{try-}restart|status}"
exit 1
;;
esac
# End /etc/init.d/template

View File

@ -0,0 +1,81 @@
#!/bin/sh
# Begin $rc_base/init.d/udev
### BEGIN INIT INFO
# Provides: udev
# Required-Start: mountkernfs
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: sysinit
# Default-Stop:
# Short-Description: Populated /dev with device nodes.
# Description: Mounts a tempfs on /dev and starts the udevd daemon.
# Device nodes are created as defined by udev.
# X-LFS-Default-Start: S15
# X-LFS-Default-Stop:
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
MESSAGE="Populating /dev with device nodes..."
case "${1}" in
start)
if ! grep -q '[[:space:]]sysfs' /proc/mounts; then
echo_failure
boot_mesg -n "FAILURE:\n\nUnable to create" ${FAILURE}
boot_mesg -n " devices without a SysFS filesystem"
boot_mesg -n "\n\nAfter you press Enter, this system"
boot_mesg -n " will be halted and powered off."
boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
boot_mesg "" ${NORMAL}
read ENTER
/etc/rc.d/init.d/halt stop
fi
# Mount a temporary file system over /dev, so that any devices
# made or removed during this boot don't affect the next one.
# The reason we don't write to mtab is because we don't ever
# want /dev to be unavailable (such as by `umount -a').
mount -n -t tmpfs tmpfs /dev -o mode=755
if [ ${?} != 0 ]; then
echo_failure
boot_mesg -n "FAILURE:\n\nCannot mount a tmpfs" ${FAILURE}
boot_mesg -n " onto /dev, this system will be halted."
boot_mesg -n "\n\nAfter you press Enter, this system"
boot_mesg -n " will be halted and powered off."
boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
boot_mesg "" ${NORMAL}
read ENTER
/etc/rc.d/init.d/halt stop
fi
# Udev handles uevents itself, so we don't need to have
# the kernel call out to any binary in response to them
echo > /proc/sys/kernel/hotplug
# Copy static device nodes to /dev
cp -a /lib/udev/devices/* /dev
# Start the udev daemon to continually watch for, and act on,
# uevents
/sbin/udevd --daemon
# Now traverse /sys in order to "coldplug" devices that have
# already been discovered
/sbin/udevadm trigger
# Now wait for udevd to process the uevents we triggered
/sbin/udevadm settle
evaluate_retval standard
;;
*)
echo "Usage ${0} {start}"
exit 1
;;
esac
# End $rc_base/init.d/udev

View File

@ -0,0 +1,51 @@
#!/bin/sh
# Begin $rc_base/init.d/udev_retry
### BEGIN INIT INFO
# Provides: udev_retry
# Required-Start: udev
# Should-Start: $local_fs
# Required-Stop:
# Should-Stop:
# Default-Start: sysinit
# Default-Stop:
# Short-Description: Replays failed uevents and creates additonal devices.
# Description: Replays any failed uevents that were skipped due to
# slow hardware initialization, and creates those needed
# device nodes
# X-LFS-Default-Start: S45
# X-LFS-Default-Stop:
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
MESSAGE="Retrying failed uevents, if any..."
case "${1}" in
start)
# From Debian: "copy the rules generated before / was mounted
# read-write":
for file in /dev/.udev/tmp-rules--*; do
dest=${file##*tmp-rules--}
[ "$dest" = '*' ] && break
cat $file >> /etc/udev/rules.d/$dest
rm -f $file
done
# Re-trigger the failed uevents in hope they will succeed now
/sbin/udevadm trigger --retry-failed
# Now wait for udevd to process the uevents we triggered
/sbin/udevadm settle
evaluate_retval standard
;;
*)
echo "Usage ${0} {start}"
exit 1
;;
esac
# End $rc_base/init.d/udev_retry

View File

@ -0,0 +1,577 @@
# Begin /lib/lsb/init-funtions
# Provides initialization funtions as defined by the Linux Standard Base
# specification, version 3.1.0
# Source rc configuration if not inherited from the environment
if [ "${RC_BASE}" = "" ]; then
. /etc/sysconfig/rc
fi
# Source the distro functions file
if [ "${DISTRO_MINI}" != "" ]; then
. "${RC_BASE}/init.d/${DISTRO_MINI}-functions"
fi
################################################################################
# start_daemon() #
# Usage: start_daemon [-f] [-n nicelevel] [-p pidfile] pathname [args...] #
# #
# Purpose: This runs the specified program as a daemon #
# #
# Inputs: -f: (force) run the program even if it is already running. #
# -n nicelevel: specify a nice level. See 'man nice(1)'. #
# -p pidfile: use the specified file to determine PIDs. #
# pathname: the complete path to the specified program #
# args: additional arguments passed to the program (pathname) #
# #
# Return values (as defined by LSB exit codes): #
# 0 - program is running or service is OK #
# 1 - generic or unspecified error #
# 2 - invalid or excessive argument(s) #
# 5 - program is not installed #
################################################################################
start_daemon()
{
local force=""
local nice="0"
local pidfile=""
local pidlist=""
local retval=""
# Process arguments
while true
do
case "${1}" in
-f)
force="1"
shift 1
;;
-n)
nice="${2}"
shift 2
;;
-p)
pidfile="${2}"
shift 2
;;
-*)
return 2
;;
*)
program="${1}"
break
;;
esac
done
# Check for a valid program
if [ ! -e "${program}" ]
then
return 5
fi
# Execute
if [ -z "${force}" ]
then
if [ -z "${pidfile}" ]
then
# determine the pid by discovery
pidlist=`pidofproc "${1}"`
retval="${?}"
else
# The PID file contains the needed PIDs
# Note that by LSB requirement, the path must be given to pidofproc,
# however, it is not used by the current implementation or standard.
pidlist=`pidofproc -p "${pidfile}" "${1}"`
retval="${?}"
fi
# return a value ONLY
# It is the init script's (or distribution's functions) responsibilty
# to log messages!
case "${retval}" in
0)
# program is already running correctly, this is a
# succesful start.
return 0
;;
1)
# program is not running, but an invalid pid file exists
# remove the pid file and continue
rm -f "${pidfile}"
;;
3)
# program is not running and no pidfile exists
# do nothing here, let start_deamon continue.
;;
*)
# Others as returned by status values shall not be interpreted
# and returned as an unspecified error.
return 1
;;
esac
fi
# do the start!
nice -n "${nice}" "${@}"
}
################################################################################
# killproc() #
# Usage: killproc [-p pidfile] pathname [signal] #
# #
# Purpose: Send control signals to running processes #
# #
# Inputs: -p pidfile, uses the specified pidfile #
# pathname, pathname to the specified program #
# signal, send this signal to pathname #
# #
# Return values (as defined by LSB exit codes): #
# 0 - program (pathname) has stopped/is already stopped or a #
# running program has been sent specified signal and stopped #
# successfully #
# 1 - generic or unspecified error #
# 2 - invalid or excessive argument(s) #
# 5 - program is not installed #
# 7 - program is not running and a signal was supplied #
################################################################################
killproc()
{
local pidfile
local program
local prefix
local progname
local signal="-TERM"
local fallback="-KILL"
local nosig
local pidlist
local retval
local pid
local delay="30"
local piddead
local dtime
# Process arguments
while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
*)
program="${1}"
if [ -n "${2}" ]
then
signal="${2}"
fallback=""
else
nosig=1
fi
# error on additional arguments
if [ -n "${3}" ]
then
return 2
else
break
fi
;;
esac
done
# Check for a valid program
if [ ! -e "${program}" ]
then
return 5
fi
# Check for a valid signal
check_signal "${signal}"
if [ "${?}" != "0" ]
then
return 2
fi
# Get a list of pids
if [ -z "${pidfile}" ]
then
# determine the pid by discovery
pidlist=`pidofproc "${1}"`
retval="${?}"
else
# The PID file contains the needed PIDs
# Note that by LSB requirement, the path must be given to pidofproc,
# however, it is not used by the current implementation or standard.
pidlist=`pidofproc -p "${pidfile}" "${1}"`
retval="${?}"
fi
# return a value ONLY
# It is the init script's (or distribution's functions) responsibilty
# to log messages!
case "${retval}" in
0)
# program is running correctly
# do nothing here, let killproc continue.
;;
1)
# program is not running, but an invalid pid file exists
# remove the pid file.
rm -f "${pidfile}"
# this is only a success if no signal was passed.
if [ -n "${nosig}" ]
then
return 0
else
return 7
fi
;;
3)
# program is not running and no pidfile exists
# this is only a success if no signal was passed.
if [ -n "${nosig}" ]
then
return 0
else
return 7
fi
;;
*)
# Others as returned by status values shall not be interpreted
# and returned as an unspecified error.
return 1
;;
esac
# perform different actions for exit signals and control signals
check_sig_type "${signal}"
if [ "${?}" -eq "0" ] # signal is used to terminate the program
then
# account for empty pidlist (pid file still exists and nosignal was given)
if [ "${pidlist}" != "" ]; then
#kill the list of pids
for pid in ${pidlist}
do
kill -0 "${pid}" 2> /dev/null
if [ "${?}" -ne "0" ]; then
# process is dead, continue to next and assume all is well
continue
else
kill "${signal}" "${pid}" 2> /dev/null
# Wait up to ${delay}/10 seconds to for "${pid}" to
# terminate in 10ths of a second
while [ "${delay}" != "0" ]
do
kill -0 "${pid}" 2> /dev/null || piddead="1"
if [ "${piddead}" = "1" ]
then
break
fi
sleep 0.1
delay="$(( ${delay} - 1 ))"
done
# If a fallback is set, and program is still running, then
# use the fallback
if [ -n "${fallback}" -a "${piddead}" != "1" ]
then
kill "${fallback}" "${pid}" 2> /dev/null
sleep 1
# Check again, and fail if still running
kill -0 "${pid}" 2> /dev/null && return 1
else
# just check one last time and if still alive, fail
sleep 1
kill -0 "${pid}" 2> /dev/null && return 1
fi
fi
done
fi
# Check for and remove stale PID files.
if [ -z "${pidfile}" ]
then
#find the basename of $program
prefix=`echo "${program}" | sed 's/[^/]*$//'`
progname=`echo "${program}" | sed "s@${prefix}@@"`
if [ -e "/var/run/${progname}.pid" ]
then
rm -f "/var/run/${progname}.pid" 2> /dev/null
fi
else
if [ -e "${pidfile}" ]
then
rm -f "${pidfile}" 2> /dev/null
fi
fi
# For signals that do not expect a program to exit, simply
# let kill do it's job, and evaluate kills return for value
else # check_sig_type - signal is not used to terminate program
for pid in ${pidlist}
do
kill "${signal}" "${pid}"
if [ "${?}" -ne "0" ]; then
return 1
fi
done
fi
}
################################################################################
# pidofproc() #
# Usage: pidofproc [-p pidfile] pathname #
# #
# Purpose: This function returns one or more pid(s) for a particular daemon #
# #
# Inputs: -p pidfile, use the specified pidfile instead of pidof #
# pathname, path to the specified program #
# #
# Return values (as defined by LSB status codes): #
# 0 - Success (PIDs to stdout) #
# 1 - Program is dead, PID file still exists (remaining PIDs output) #
# 3 - Program is not running (no output) #
################################################################################
pidofproc()
{
local pidfile
local program
local prefix
local progname
local pidlist
local lpids
local exitstatus="0"
# Process arguments
while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
*)
program="${1}"
if [ -n "${2}" ]
then
# Too many arguments
# Since this is status, return unknown
return 4
else
break
fi
;;
esac
done
# If a PID file is not specified, try and find one.
if [ -z "${pidfile}" ]
then
# get the program's basename
prefix=`echo "${program}" | sed 's/[^/]*$//'`
progname=`echo "${program}" | sed "s@${prefix}@@"`
# if a PID file exists with that name, assume that is it.
if [ -e "/var/run/${progname}.pid" ]
then
pidfile="/var/run/${progname}.pid"
fi
fi
# if a PID file is set and exists, use it.
if [ -n "${pidfile}" -a -e "${pidfile}" ]
then
# use the value in the first line of the pidfile
pidlist=`/bin/head -n1 "${pidfile}"`
# This can optionally be written as 'sed 1q' to repalce 'head -n1'
# should LFS move /bin/head to /usr/bin/head
else
# use pidof
pidlist=`pidof "${program}"`
fi
# Figure out if all listed PIDs are running.
for pid in ${pidlist}
do
kill -0 ${pid} 2> /dev/null
if [ "${?}" = "0" ]; then
lpids="${pids}${pid} "
else
exitstatus="1"
fi
done
if [ -z "${lpids}" -a ! -f "${pidfile}" ]; then
return 3
else
echo "${lpids}"
return "${exitstatus}"
fi
}
################################################################################
# log_success_msg() #
# Usage: log_success_msg [$MESSAGE | "message"] #
# #
# Purpose: Print a successful status message to the screen and optionally #
# a boot log file. #
# #
# Inputs: accepts one string value, either a quoted string or optionally #
# the value of $MESSAGE if set in the running environment. #
# #
# Return values: Not used #
################################################################################
log_success_msg()
{
echo -n -e "${PREFIX_SUCCESS}${@}"
echo -e "${SET_COL}${BRACKET}[${SUCCESS} OK ${BRACKET}]${NORMAL}"
if [ "${BOOTLOG_ENAB}" = "yes" ]; then
if [ $( hostname ) = "(none)" ]; then
BTTIMESPEC=""
else
BTTIMESPEC="$(echo `date +"%b %d %T"` `hostname`) "
fi
echo "${BTTIMESPEC}bootlog: ${@} Successful" >> "${TEMPFS_MOUNT}/.bootlog"
fi
return 0
}
################################################################################
# log_failure_msg() #
# Usage: log_failure_msg [$MESSAGE | "message"] #
# #
# Purpose: Print a failure status message to the screen and optionally #
# a boot log file. #
# #
# Inputs: accepts one string value, either a quoted string or optionally #
# the value of $MESSAGE if set in the running environment. #
# #
# Return values: Not used #
################################################################################
log_failure_msg()
{
echo -n -e "${PREFIX_FAILURE}${@}"
echo -e "${SET_COL}${BRACKET}[${FAILURE} FAIL ${BRACKET}]${NORMAL}"
if [ "${BOOTLOG_ENAB}" = "yes" ]; then
if [ $( hostname ) = "(none)" ]; then
BTTIMESPEC=""
else
BTTIMESPEC="$(echo `date +"%b %d %T"` `hostname`) "
fi
echo "${BTTIMESPEC}bootlog: ${@} Failed!" >> "${TEMPFS_MOUNT}/.bootlog"
fi
return 0
}
################################################################################
# log_warning_msg() #
# Usage: log_warning_msg [$MESSAGE | "message"] #
# #
# Purpose: Print a warning status message to the screen and optionally #
# a boot log file. #
# #
# Inputs: accepts one string value, either a quoted string or optionally #
# the value of $MESSAGE if set in the running environment. #
# #
# Return values: Not used #
################################################################################
log_warning_msg()
{
echo -n -e "${PREFIX_WARNING}${@}"
echo -e "${SET_COL}${BRACKET}[${WARNING} WARN ${BRACKET}]${NORMAL}"
if [ "${BOOTLOG_ENAB}" = "yes" ]; then
if [ $( hostname ) = "(none)" ]; then
BTTIMESPEC=""
else
BTTIMESPEC="$(echo `date +"%b %d %T"` `hostname`) "
fi
echo "${BTTIMESPEC}bootlog: ${@} Warning" >> "${TEMPFS_MOUNT}/.bootlog"
fi
return 0
}
################################################################################
# check_signal() #
# Usage: check_signal [ -{signal} | {signal} ] #
# #
# Purpose: Check for a valid signal. This is not defined by any LSB draft, #
# however, it is required to check the signals to determine if the #
# signals chosen are invalid arguments to the other functions. #
# #
# Inputs: accepts a single string value in the form or -{signal} or {signal} #
# #
# Return values: #
# 0 - Success (signal is valid #
# 1 - Signal is not valid #
################################################################################
check_signal()
{
local valsig
# Add error handling for invalid signals
valsig="-ALRM -HUP -INT -KILL -PIPE -POLL -PROF -TERM -USR1 -USR2"
valsig="${valsig} -VTALRM -STKFLT -PWR -WINCH -CHLD -URG -TSTP -TTIN"
valsig="${valsig} -TTOU -STOP -CONT -ABRT -FPE -ILL -QUIT -SEGV -TRAP"
valsig="${valsig} -SYS -EMT -BUS -XCPU -XFSZ -0 -1 -2 -3 -4 -5 -6 -8 -9"
valsig="${valsig} -11 -13 -14 -15"
echo "${valsig}" | grep -- " ${1} " > /dev/null
if [ "${?}" = "0" ]
then
return 0
else
return 1
fi
}
################################################################################
# check_sig_type() #
# Usage: check_signal [ -{signal} | {signal} ] #
# #
# Purpose: Check if signal is a program termination signal or a control signal #
# This is not defined by any LSB draft, however, it is required to #
# check the signals to determine if they are intended to end a #
# program or simply to control it. #
# #
# Inputs: accepts a single string value in the form or -{signal} or {signal} #
# #
# Return values: #
# 0 - Signal is used for program termination #
# 1 - Signal is used for program control #
################################################################################
check_sig_type()
{
local valsig
# The list of termination signals (limited to generally used items)
valsig="-ALRM -INT -KILL -TERM -PWR -STOP -ABRT -QUIT -2 -3 -6 -9 -14 -15"
echo "${valsig}" | grep -- " ${1} " > /dev/null
if [ "${?}" = "0" ]
then
return 0
else
return 1
fi
}
# End /lib/lsb/init-functions

View File

@ -0,0 +1,306 @@
#!/bin/bash
# Begin /lib/lsb/manage-functions
# /lib/lsb/manage-functions contains the functions used by
# /lib/lsb/install_initd and /lib/lsb/remove_initd as well as additional helper
# functions for use in programs that would provide functionality similar to
# the RedHat chkconfig utility, for instance.
# source the confif file
. /etc/lsb/lsb-config
# Define all arrays at script start to avoid scope issues
# scriptlist is a list of valid scripts used as an index
declare -a scriptlist
# fullheaders is a complete set of valid LSB headers, stored in memory for
# each indexed script, to avoid multiple disk reads
declare -a fullheaders
###############################################################################
# get_headers() - Obtains a valid list of scripts contained in ${rcbase} and #
# inserts the name of the script into the scriptlist[] array #
# for use by all other functions. Additionally, it inserts #
# the entire LSB header information from each script into a #
# second array, fullheaders[], so that diskreads need only be #
# done once #
# Returns no value, but populates the variable ${scriptcount} #
# and the arrays ${scriptlist} and ${fullheaders} for use #
# with other functions in this script. This function is #
# called unconditionally at the end of this scrip and is #
# provided as a function only for the case that it needs to #
# be called again after other operations. #
###############################################################################
get_headers()
{
echo -n "Retrieving script information from disk..."
count=1
for file in $(find -P /etc/init.d -xdev -perm -u=x | sed -n 2~1p \
| sed "s@/etc/init.d/rc@@")
do
# determine if script is an LSB compliant script
grep "### BEGIN INIT INFO" $file > /dev/null
if test $? -gt "0"
then
# this is not a valid script and is ignored
# skip the rest of the loop
continue
fi
# determine basename using only bash (is basename a builtin?)
filename=$(echo "${file}" | sed "s@${rcbase}/@@")
# assign it to an array possition
scriptlist["${count}"]="${filename}"
# find the begining of the init info for the script
begin=$(grep -n "### BEGIN INIT INFO" "${file}" | cut -d: -f1)
# find the end of the init info for the script
end=$(grep -n "### END INIT INFO" "${file}" | cut -d: -f1)
# we'll use the difference between the values in the tail command
diff=$(( ${end} - ${begin} ))
# assign the entire LSB header information as a single string to the
# fullheaders[] array
fullheaders["${count}"]=$(head -n "${end}" "${file}" \
| tail -n "${diff}")
count=$(( ${count} + 1 ))
unset begin
unset end
unset diff
unset filename
done
# a number or array elements would be a nice regular variable assignment
scriptcount="${#scriptlist[@]}"
unset count
echo -e "Completed!"
}
###############################################################################
# print_headers() - Presents a formatted list of all LSB compliant script #
# headers to stdout preceeded by script name for use in #
# other scripts #
###############################################################################
print_headers()
{
get_headers
count=1
while test "${count}" -lt "${scriptcount}"
do
echo "${scriptlist[$count]}"
echo "============================================================="
echo "${fullheaders[$count]}"
echo ""
echo ""
count="$(( ${count} + 1 ))"
done
}
###############################################################################
# get_index() - Determines the array index of the specified script #
###############################################################################
get_index()
{
filename=$(echo "${1}" | sed "s@${rcbase}/@@")
count=1
while test "${count}" -lt "${scriptcount}"
do
echo "${scriptlist[${count}]}" | grep "${filename}" > /dev/null
if test "${?}" -ne "0"
then
count=$(( ${count} + 1 ))
continue
else
break
fi
done
if test "${filename}" == "${scriptlist[${count}]}"
then
echo "${count}"
else
echo "${1} is not a valid LSB init script."
exit 1
fi
unset filename
unset count
}
###############################################################################
# get_lsb_value() - Obtains the LSB Value of $1 for index of script ($2). #
###############################################################################
get_lsb_value()
{
# Probably need some error checking in here
echo "${fullheaders[${2}]}" | \
grep "^# ${1}" | \
sed -e "s@# ${1}:@@" \
-e "s/^[ \t]*//"
}
###############################################################################
# convert_lsb_required() - Converts LSB defined facilities (facility names #
# begining with a '$' character) into script names #
# for required start/stop #
###############################################################################
convert_lsb_required()
{
local count=0
local provides=""
local reqfacility=""
local reqprovideslist=""
for reqfacility in $@
do
# find the requires and it's index and then find the script name
# from the index. Since this is required, exit if it is not found
## If reqfacility is already in script name format, nothing needs to
## be done, just echo it back out. I can't think of an easy way to
## do this right now, the scriptname will be the same as the provides
## anyway, so just let it fly for now...it'll be correct, it just
## takes an extra couple of commands to get the same result.
## Besides, this will do some extra sanity checking in case somebody
## writes a script that isn't named the same as provides, though this
## isn't LSB compliant. Additionally, these same comments apply to
## the convert_lsb_should() fucntion below.
count=0
while test ${count} -lt ${scriptcount}
do
count=$(( $count + 1 ))
provides="$( get_lsb_value Provides ${count} )"
if test "${provides}" = "${reqfacility}"
then
reqprovideslist="${reqprovideslist} ${scriptlist[$count]}"
break
fi
if test ${count} -eq ${scriptcount}; then
# If we've never broken out of the while loop, then this is an
# unrecoverable error since it is a required item. Exit now!
echo "Error: unable to locate required facility ${reqfacility}!"
exit 5
fi
done
done
echo "${reqprovideslist}" | sed -e "s/^[ \t]*//" -e "s/^[ \t]*//"
}
###############################################################################
# convert_lsb_should() - Converts LSB defined facilities (facility names #
# begining with a '$' character) into script names for #
# should start/stop #
###############################################################################
convert_lsb_should()
{
local count=0
local provides=""
local optfacility=""
local optprovideslist=""
for optfacility in $@
do
# find the should and it's index and then find the script name
# from the index. Since this is not an error, simply warn if it
# is not found.
count=0
while test ${count} -lt ${scriptcount}
do
count=$(( $count + 1 ))
provides="$( get_lsb_value Provides ${count} )"
if test "${provides}" = "${optfacility}"
then
optprovideslist="${optprovideslist} ${scriptlist[$count]}"
break
fi
# No need to error or warn on should items, and it's messy if so!
done
done
echo "${optprovideslist}" | sed -e "s/^[ \t]*//" -e "s/[ \t]*$//"
}
get_headers
###############################################################################
# get_lsb_required_value() - Additional function to simplify repetitive tasks #
# Obtains the LSB Value of $1 for index of script #
# ($2) and immediately converts LSB defined #
# facilities (beginning with a '$' character) to a #
# script name. If the script is not found, then #
# the function exits with an error as per #
# convert_lsb_required. #
###############################################################################
get_lsb_required_value()
{
local reqval
# Probably need some error checking in here
reqval=`echo "${fullheaders[${2}]}" | \
grep "^# ${1}" | \
sed -e "s@# ${1}:@@" \
-e "s/^[ \t]*//"`
# If $reqval contains a '$' charcter, then convert it to a script name
echo "${reqval}" | grep "\\$" 2>&1 > /dev/null
if test "${?}" -eq "0"
then
reqval=`convert_lsb_required "${reqval}"`
fi
echo "${reqval}"
}
###############################################################################
# get_lsb_should_value() - Additional function to simplify repetitive tasks #
# Obtains the LSB Value of $1 for index of script #
# ($2) and immediately converts LSB defined #
# facilities (beginning with a '$' character) to a #
# script name. If the script is not found, the #
# value is removed from the list as it is optional. #
###############################################################################
get_lsb_should_value()
{
local optval
local listitem
local optitem
# Probably need some error checking in here
optval=`echo "${fullheaders[${2}]}" | \
grep "^# ${1}" | \
sed -e "s@# ${1}:@@" \
-e "s/^[ \t]*//"`
# If $optval contains a '$' charcter, then convert it to a script name
echo "${optval}" | grep "\\$" 2>&1 > /dev/null
if test "${?}" -eq "0"
then
optval=`convert_lsb_should "${optval}"`
# if we still have a "$" character, then it's not found and it should
# be removed from the list (and it's trailing space if one exists)
# since it is optional
echo "${optval}" | grep "\\$" 2>&1 > /dev/null
if test "${?}" -eq "0"
then
# Remove the value
for listitem in ${optval}
do
echo "${listitem}" | grep "\\$"
if test "${?}" -eq "0"
then
optval=`echo "${optval}" | sed -e 's@${listitem} @@' \
-e 's@${listitem}@@' | \
sed -e "s@# ${1}:@@" \
-e "s/^[ \t]*//"`
fi
done
fi
fi
# If a should start value does not have a script associted with it, then
# remove it (or it and trailing space) from the list
for optitem in ${otpval}
do
grep "${optitem}" "${statedir}/enabled-scripts" 2>&1 > /dev/null
if test "${?}" -ne "0"
then
optval=`echo "${optval}" | sed -e 's@${otpitem} @@' \
-e 's@${optitem}@@' | \
sed -e "s@# ${1}:@@" \
-e "s/^[ \t]*//"`
fi
done
echo "${optval}"
}
# End /lib/lsb/manage-functions

View File

@ -0,0 +1,28 @@
########################################################################
# Begin /etc/sysconfig/createfiles
#
# Description : Createfiles script config file
#
# Authors :
#
# Version : 00.00
#
# Notes : The syntax of this file is as follows:
# if type is equal to "file" or "dir"
# <filename> <type> <permissions> <user> <group>
# if type is equal to "dev"
# <filename> <type> <permissions> <user> <group> <devtype> <major> <minor>
#
# <filename> is the name of the file which is to be created
# <type> is either file, dir, or dev.
# file creates a new file
# dir creates a new directory
# dev creates a new device
# <devtype> is either block, char or pipe
# block creates a block device
# char creates a character deivce
# pipe creates a pipe, this will ignore the <major> and <minor> fields
# <major> and <minor> are the major and minor numbers used for the device.
########################################################################
# End /etc/sysconfig/createfiles

View File

@ -0,0 +1,18 @@
########################################################################
# Begin /etc/sysconfig/modules
#
# Description : Module auto-loading configuration
#
# Authors :
#
# Version : 00.00
#
# Notes : The syntax of this file is as follows:
# <module> [<arg1> <arg2> ...]
#
# Each module should be on it's own line, and any options that you want
# passed to the module should follow it. The line deliminator is either
# a space or a tab.
########################################################################
# End /etc/sysconfig/modules

View File

@ -0,0 +1,93 @@
#!/bin/sh
########################################################################
# Begin $NETWORK_DEVICES/ifdown
#
# Description : Interface Down
#
# Authors : Nathan Coulson - nathan@linuxfromscratch.org
# Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version : 00.01
#
# Notes : the IFCONFIG variable is passed to the scripts found
# in the services directory, to indicate what file the
# service should source to get environmental variables.
#
########################################################################
. /lib/lsb/init-functions
# Collect a list of configuration files for our interface
if [ -n "${2}" ]; then
for file in ${@#$1}; do # All parameters except $1
FILES="${FILES} ${NETWORK_DEVICES}/ifconfig.${1}/${file}"
done
elif [ -d "${NETWORK_DEVICES}/ifconfig.${1}" ]; then
FILES=`echo ${NETWORK_DEVICES}/ifconfig.${1}/*`
else
FILES="${NETWORK_DEVICES}/ifconfig.${1}"
fi
# Reverse the order configuration files are processed in
for file in ${FILES}; do
FILES2="${file} ${FILES2}"
done
FILES=${FILES2}
# Process each configuration file
for file in ${FILES}; do
# skip backup files
if [ "${file}" != "${file%""~""}" ]; then
continue
fi
if [ ! -f "${file}" ]; then
message="${file} is not a network configuration file or directory."
log_warning_msg
fi
(
. ${file}
# Will not process this service if started by boot, and ONBOOT
# is not set to yes
if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then
continue
fi
# Will not process this service if started by hotplug, and
# ONHOTPLUG is not set to yes
if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" ]; then
continue
fi
# This will run the service script, if SERVICE is set
if [ -n "${SERVICE}" -a -x "${NETWORK_DEVICES}/services/${SERVICE}" ]; then
if ip link show ${1} > /dev/null 2>&1
then
IFCONFIG=${file} ${NETWORK_DEVICES}/services/${SERVICE} ${1} down
else
message="Interface ${1} doesn't exist."
log_warning_msg
fi
else
echo -e "${FAILURE}Unable to process ${file}. Either"
echo -e "${FAILURE}the SERVICE variable was not set,"
echo -e "${FAILURE}or the specified service cannot be executed."
message=""
log_failure_msg
fi
)
done
if [ -z "${2}" ]; then
link_status=`ip link show $1`
if [ -n "${link_status}" ]; then
if echo "${link_status}" | grep -q UP; then
message="Bringing down the ${1} interface..."
ip link set ${1} down
evaluate_retval standard
fi
fi
fi
# End $NETWORK_DEVICES/ifdown

View File

@ -0,0 +1,87 @@
#!/bin/sh
########################################################################
# Begin $NETWORK_DEVICES/ifup
#
# Description : Interface Up
#
# Authors : Nathan Coulson - nathan@linuxfromscratch.org
# Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version : 00.00
#
# Notes : the IFCONFIG variable is passed to the scripts found
# in the services directory, to indicate what file the
# service should source to get environmental variables.
#
########################################################################
. /lib/lsb/init-functions
# Collect a list of configuration files for our interface
if [ -n "${2}" ]; then
for file in ${@#$1} # All parameters except $1
do
FILES="${FILES} ${NETWORK_DEVICES}/ifconfig.${1}/${file}"
done
elif [ -d "${NETWORK_DEVICES}/ifconfig.${1}" ]; then
FILES=`echo ${NETWORK_DEVICES}/ifconfig.${1}/*`
else
FILES="${NETWORK_DEVICES}/ifconfig.${1}"
fi
message="Bringing up the ${1} interface..."
# Process each configruation file
for file in ${FILES}; do
# skip backup files
if [ "${file}" != "${file%""~""}" ]; then
continue
fi
if [ ! -f "${file}" ]; then
log_warning_msg
message="${file} is not a network configuration file or directory."
log_warning_msg
fi
(
. ${file}
# Will not process this service if started by boot, and ONBOOT
# is not set to yes
if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then
continue
fi
# Will not process this service if started by hotplug, and
# ONHOTPLUG is not set to yes
if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" -a "${HOSTNAME}" != "(none)" ]; then
continue
fi
if [ -n "${SERVICE}" -a -x "${NETWORK_DEVICES}/services/${SERVICE}" ]; then
if [ -z "${CHECK_LINK}" -o "${CHECK_LINK}" = "y" -o "${CHECK_LINK}" = "yes" -o "${CHECK_LINK}" = "1" ]; then
if ip link show ${1} > /dev/null 2>&1; then
link_status=`ip link show ${1}`
if [ -n "${link_status}" ]; then
if ! echo "${link_status}" | grep -q UP; then
ip link set ${1} up
evaluate_retval standard
fi
fi
else
message="${message}Interface ${1} doesn't exist."
log_warning_msg
fi
fi
IFCONFIG=${file} ${NETWORK_DEVICES}/services/${SERVICE} ${1} up
else
echo -e "${FAILURE}Unable to process ${file}. Either"
echo -e "${FAILURE}the SERVICE variable was not set,"
echo -e "${FAILURE}or the specified service cannot be executed."
message=""
log_failure_msg
fi
)
done
# End $NETWORK_DEVICES/ifup

View File

@ -0,0 +1,80 @@
#!/bin/sh
########################################################################
# Begin $NETWORK_DEVICES/services/ipv4-static
#
# Description : IPV4 Static Boot Script
#
# Authors : Nathan Coulson - nathan@linuxfromscratch.org
# Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /lib/lsb/init-functions
. ${IFCONFIG}
if [ -z "${IP}" ]; then
log_failure_msg "IP variable missing from ${IFCONFIG}, cannot continue."
exit 1
fi
if [ -z "${PREFIX}" -a -z "${PEER}" ]; then
log_warning_msg "PREFIX variable missing from ${IFCONFIG}, assuming 24."
PREFIX=24
args="${args} ${IP}/${PREFIX}"
elif [ -n "${PREFIX}" -a -n "${PEER}" ]; then
log_failure_msg "PREFIX and PEER both specified in ${IFCONFIG}, cannot continue."
exit 1
elif [ -n "${PREFIX}" ]; then
args="${args} ${IP}/${PREFIX}"
elif [ -n "${PEER}" ]; then
args="${args} ${IP} peer ${PEER}"
fi
if [ -n "${BROADCAST}" ]; then
args="${args} broadcast ${BROADCAST}"
fi
if [ -n "${SOURCE}" ]; then
args="${args} src ${SOURCE}"
fi
case "${2}" in
up)
MESSAGE="Adding IPv4 address ${IP} to the ${1} interface..."
ip addr add ${args} dev ${1}
evaluate_retval
if [ -n "${GATEWAY}" ]; then
if ip route | grep -q default; then
log_warning_msg "Gateway already setup; skipping." ${WARNING}
else
MESSAGE="Setting up default gateway..."
ip route add default via ${GATEWAY} dev ${1}
evaluate_retval
fi
fi
;;
down)
if [ -n "${GATEWAY}" ]; then
MESSAGE="Removing default gateway..."
ip route del default
evaluate_retval
fi
MESSAGE="Removing IPv4 address ${IP} from the ${1} interface..."
ip addr del ${args} dev ${1}
evaluate_retval
;;
*)
echo "Usage: ${0} [interface] {up|down}"
exit 1
;;
esac
# End $NETWORK_DEVICES/services/ipv4-static

View File

@ -0,0 +1,92 @@
#!/bin/sh
########################################################################
# Begin $NETWORK_DEVICES/services/ipv4-static-route
#
# Description : IPV4 Static Route Script
#
# Authors : Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /lib/lsb/init-functions
. ${IFCONFIG}
case "${TYPE}" in
("" | "network")
need_ip=1
need_gateway=1
;;
("default")
need_gateway=1
args="${args} default"
desc="default"
;;
("host")
need_ip=1
;;
("unreachable")
need_ip=1
args="${args} unreachable"
desc="unreachable "
;;
(*)
boot_mesg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue." ${FAILURE}
echo_failure
exit 1
;;
esac
if [ -n "${need_ip}" ]; then
if [ -z "${IP}" ]; then
boot_mesg "IP variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
echo_failure
exit 1
fi
if [ -z "${PREFIX}" ]; then
boot_mesg "PREFIX variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
echo_failure
exit 1
fi
args="${args} ${IP}/${PREFIX}"
desc="${desc}${IP}/${PREFIX}"
fi
if [ -n "${need_gateway}" ]; then
if [ -z "${GATEWAY}" ]; then
boot_mesg "GATEWAY variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
echo_failure
exit 1
fi
args="${args} via ${GATEWAY}"
fi
case "${2}" in
up)
boot_mesg "Adding '${desc}' route to the ${1} interface..."
ip route add ${args} dev ${1}
evaluate_retval
;;
down)
boot_mesg "Removing '${desc}' route from the ${1} interface..."
ip route del ${args} dev ${1}
evaluate_retval
;;
*)
echo "Usage: ${0} [interface] {up|down}"
exit 1
;;
esac
# End $NETWORK_DEVICES/services/ipv4-static-route

View File

@ -0,0 +1,52 @@
# Begin /etc/sysconfig/rc
# Author: DJ Lucas - dj@linuxfromscratch.org
# Version: 1.0 LSB V.3.1
# Global variable inherited by initscripts are in caps
# Local variables for the rc script are in lowercase
# Source site specific rc configuration
. /etc/sysconfig/rc.site
# This sets default terminal options.
# stty sane - this has been removed as nobody recalls
# the reason for it in the first place - if no problems arize,
# then it will be removed completely at a later date.
# Setup default values for the environment
umask 022
PATH="/bin:/sbin"
# Find current screen size
if [ -z "${COLUMNS}" ]; then
COLUMNS=$(stty size)
COLUMNS=${COLUMNS##* }
fi
# When using remote connections, such as a serial port, stty size returns 0
if [ "${COLUMNS}" = "0" ]; then
COLUMNS=80
fi
## Measurements for positioning result messages
COL=$((${COLUMNS} - 8))
WCOL=$((${COL} - 2))
# Set Cursur Position Commands, used via echo -e
SET_COL="\\033[${COL}G" # at the $COL char
SET_WCOL="\\033[${WCOL}G" # at the $WCOL char
CURS_UP="\\033[1A\\033[0G" # Up one line, at the 0'th char
# Bootlogging and interactive startup require a valid tempfs mount
# if this mount is not present, disable them
if [ "${TEMPFS_MOUNT}" = "" -o ! -d "${TEMPFS_MOUNT}" ]; then
TEMPFS_MOUNT=""
iprompt=""
BOOTLOG_ENAB=""
fi
# Export the environment variables so they are inherited by the scripts
export PATH SET_COL SET_WCOL CURS_UP TEMPFS_MOUNT BOOTLOG_ENAB RUNLEVEL
# End /etc/sysconfig/rc

View File

@ -0,0 +1,69 @@
# Set base directory information
RC_BASE="/etc"
RC_FUNCTIONS="${RC_BASE}/init.d/lfs-functions"
# Location of network device scripts and config files
NETWORK_DEVICES="/etc/sysconfig/network-devices"
# Directory to store boot process accounting information
# Used for boot logging and interactive flag when rootfs
# is not writable
TEMPFS_MOUNT="${RC_BASE}/init.d/boottemp"
# Bootlogging (requires a tempfs mount)
BOOTLOG_ENAB="yes"
# Distro Information
DISTRO="Linux From Scratch" # The distro name
DISTRO_CONTACT="lfs-dev@linuxfromscratch.org" # Bug report address
DISTRO_MINI="lfs" # Short name used in filenames for distro config
# Define custom colors used in messages printed to the screen
BRACKET="\\033[1;34m" # Blue
FAILURE="\\033[1;31m" # Red
INFO="\\033[1;36m" # Cyan
NORMAL="\\033[0;39m" # Grey
SUCCESS="\\033[1;32m" # Green
WARNING="\\033[1;33m" # Yellow
# Prefix boot messages for easier reading on framebuffer consoles
PREFIX_SUCCESS=" ${SUCCESS}*${NORMAL} "
PREFIX_WARNING="${WARNING}**${NORMAL} "
PREFIX_FAILURE="${FAILURE}***${NORMAL}"
# Export varialbles so that they are inherited by the initscripts
export RC_BASE RC_FUNCTIONS NETWORK_DEVICES TEMPFS_MOUNT BOOTLOG_ENAB
export DISTRO DISTRO_CONTACT DISTRO_MINI
export BRACKET FAILURE INFO NORMAL SUCCESS WARNING
export PREFIX_SUCCESS PREFIX_WARNING PREFIX_FAILURE
# Interactive startup
iprompt="yes" # Wether to display the interactive boot promp
itime="2" # The ammount of time (in seconds) to display the prompt
dlen="29" # The total length of the distro welcome string
ilen="38" # The total length of the interactive message
welcome_message="Welcome to ${INFO}${DISTRO}${NORMAL}"
i_message="Press '${FAILURE}I${NORMAL}' to enter interactive startup"
# Error message displayed when a script's exit value is not zero
print_error_msg()
{
# ${link} and ${error_value} are defined by the rc script
echo -e "${FAILURE}FAILURE: You should not be reading this error message."
echo -e ""
echo -e -n "${FAILURE}It means that an unforseen error took place in"
echo -e -n "${INFO} ${link}"
echo -e "${FAILURE},"
echo -e "${FAILURE}which exited with a return value of ${error_value}."
echo -e ""
echo -e -n "${FAILURE}If you are able to track this error down to a bug"
echo -e "${FAILURE}in one of the files"
echo -e -n "provided by ${INFO}${DISTRO}${FAILURE}, "
echo -e -n "${FAILURE}please be so kind to inform us at "
echo -e "${INFO}${DISTRO_CONTACT}${FAILURE}.${NORMAL}"
echo -e ""
echo -e "${INFO}Press Enter to continue..."
echo -e "${NORMAL}"
read ENTER
}

View File

@ -0,0 +1,11 @@
ETCDIR=/etc
EXTDIR=${DESTDIR}${ETCDIR}
MODE=754
DIRMODE=755
CONFMODE=644
install:
install -d -m ${DIRMODE} ${DESTDIR}/lib/lsb
install -m ${CONFMODE} lib/init-functions ${DESTDIR}/lib/lsb
.PHONY: install

View File

@ -0,0 +1,348 @@
#*******************************************************************************
# Function - start_daemon [-f] [-n nicelevel] [-p pidfile] pathname [args]
#
# Purpose: This runs the specified program as a daemon
#
# Inputs: -f, run the program even if it is already running
# -n nicelevel, specifies a nice level. See nice(1).
# -p pidfile, uses the specified pidfile
# pathname, pathname to the specified program
# args, arguments to pass to specified program
#
# Outputs: return 0 - Success
# return 2 - Invalid or excessive number of arguments,
# warning in stdout
# return 4 - Program or service status is unknown
#
# Dependencies: nice
#
# Todo: none
#
#*******************************************************************************
start_daemon()
{
local pidfile=""
local forcestart=""
local nicelevel="0"
while true
do
case "${1}" in
-f)
forcestart="1"
shift 1
;;
-n)
nicelevel="${2}"
shift 2
;;
-p)
pidfile="${2}"
shift 2
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 2
;;
*)
break
;;
esac
done
if [ -z "${forcestart}" ]; then
if [ -z "${pidfile}" ]; then
pidofproc "${1}" > /dev/null
else
pidofproc -p "${pidfile}" "${1}" > /dev/null
fi
case "${?}" in
0)
log_warning_msg "Unable to continue: ${1} is running"
return 4
;;
1)
log_warning_msg "Unable to continue: ${pidfile} exists"
return 4
;;
3)
;;
*)
log_failure_msg "Unknown error code from pidofproc: ${?}"
return 4
;;
esac
fi
nice -n "${nicelevel}" "${@}"
}
#*******************************************************************************
# Function - killproc [-p pidfile] pathname [signal]
#
# Purpose:
#
# Inputs: -p pidfile, uses the specified pidfile
# pathname, pathname to the specified program
# signal, send this signal to pathname
#
# Outputs: return 0 - Success
# return 1 - Invalid or excessive number of arguments,
# warning in stdout
# return 4 - Unknown Status
#
# Dependencies: kill
#
# Todo: test
#
#*******************************************************************************
killproc()
{
local pidfile=""
local killsig=""
local pidlist=""
while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 1
;;
*)
break
;;
esac
done
if [ "${#}" = "2" ]; then
killsig="${2}"
elif [ "${#}" != "1" ]; then
shift 2
log_failure_msg "Excess Arguments: $@"
return 1
fi
if [ -z "${pidfile}" ]; then
pidlist=`pidofproc "${1}"`
else
pidlist=`pidofproc -p "${pidfile}" "${1}"`
fi
for pid in ${pidlist}
do
kill -${killsig:-TERM} ${pid} 2> /dev/null
if [ -z "${killsig}" ]; then
# Wait up to 3 seconds, for ${pid} to terminate
local dtime=3
while [ "${dtime}" != "0" ]
do
kill -0 ${pid} 2> /dev/null || break
sleep 1
dtime=$(( ${dtime} - 1))
done
# If ${pid} is still running, kill it
kill -0 ${pid} 2> /dev/null && kill -KILL ${pid} 2> /dev/null
fi
done
if [ -z "${killsig}" ]; then
pidofproc "${1}" 2>&1 > /dev/null
# Program was terminated
if [ "$?" != "0" ]; then
# Pidfile Exists
if [ -f "${pidfile}" ]; then
rm -f "${pidfile}" 2>&1 > /dev/null
fi
return 0
else # Program is still running
return 4 # Unknown Status
fi
else
if [ -z "${pidfile}" ]; then
pidofproc "${1}" 2> /dev/null
else
pidofproc -p "${pidfile}" "${1}" 2> /dev/null
fi
fi
}
#*******************************************************************************
# Function - pidofproc [-p pidfile] pathname
#
# Purpose: This function returns one or more pid(s) for a particular daemon
#
# Inputs: -p pidfile, use the specified pidfile instead of pidof
# pathname, path to the specified program
#
# Outputs: return 0 - Success, pid's in stdout
# return 1 - Invalid or excessive number of arguments,
# warning in stdout
# return 1 - Program is dead, pidfile exists
# return 3 - Program is not running
#
# Dependencies: pidof, echo
#
# Todo: - Invalid or excessive argments, and program is dead pidfile exists
# conflict with eachother
#
#*******************************************************************************
pidofproc()
{
local pidfile=""
local lpids=""
local pidlist=""
while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 1
;;
*)
break
;;
esac
done
if [ "${#}" != "1" ]; then
shift 1
log_failure_msg "Excess Arguments: $@"
return 1
fi
if [ -n "${pidfile}" ]; then
if [ ! -r "${pidfile}" ]; then
return 3 # Program is not running
fi
lpids=`head -n 1 ${pidfile}`
for pid in ${lpids}
do
if [ "${pid}" -ne "$$" -a "${pid}" -ne "${PPID}" ]; then
kill -0 "${pid}" 2> /dev/null &&
pidlist="${pidlist} ${pid}"
fi
echo ${pidlist}
test -z "${pidlist}" && return 1 # Program is dead, pidfile exists
return 0
done
else
pidof "${1}"
fi
if [ "$?" != "0" ]; then
return 3 # Program is not running
fi
}
# Screen Dimentions
if [ -z "${COLUMNS}" ]; then
COLUMNS=$(stty size)
COLUMNS=${COLUMNS##* }
fi
# When using remote connections, such as a serial port, stty size returns 0
if [ "${COLUMNS}" = "0" ]; then
COLUMNS=80
fi
# Measurements for positioning result messages
COL=$((${COLUMNS} - 8))
WCOL=$((${COL} - 2))
# Set Cursur Position Commands, used via echo -e
SET_COL="\\033[${COL}G" # at the $COL char
SET_WCOL="\\033[${WCOL}G" # at the $WCOL char
CURS_UP="\\033[1A\\033[0G" # Up one line, at the 0'th char
# Set color commands, used via echo -e
# Please consult `man console_codes` for more information
# under the "Set Graphics Resolution" section
#
# Warning, when switching from a 8bit to a 9bit font,
# the linux console will reinterpret the bold (1;) to
# the top 256 glyphs of the 9bit font. This does
# not affect framebuffer consoles
NORMAL="\\033[0;39m" # Standard console grey
SUCCESS="\\033[1;32m" # Success is green
WARNING="\\033[1;33m" # Warnings are yellow
FAILURE="\\033[1;31m" # Failures are red
INFO="\\033[1;36m" # Information is light cyan
BRACKET="\\033[1;34m" # Brackets are blue
BOOTMESG_PREFIX=" * " # Text at the beginning of every line
#*******************************************************************************
# Function - log_success_msg "message"
#
# Purpose: Print a success message
#
# Inputs:
#
# Outputs:
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_success_msg()
{
echo -n -e "${BOOTMESG_PREFIX}${@}"
echo -e "${SET_COL}""${BRACKET}""[""${SUCCESS}"" OK ""${BRACKET}""]""${NORMAL}"
return 0
}
#*******************************************************************************
# Function - log_failure_msg "message"
#
# Purpose: Print a failure message
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_failure_msg() {
echo -n -e "${BOOTMESG_PREFIX}${@}"
echo -e "${SET_COL}""${BRACKET}""[""${FAILURE}"" FAIL ""${BRACKET}""]""${NORMAL}"
return 0
}
#*******************************************************************************
# Function - log_warning_msg "message"
#
# Purpose: print a warning message
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_warning_msg() {
echo -n -e "${BOOTMESG_PREFIX}${@}"
echo -e "${SET_COL}""${BRACKET}""[""${WARNING}"" WARN ""${BRACKET}""]""${NORMAL}"
return 0
}

View File

@ -0,0 +1,45 @@
#!/bin/sh
########################################################################
# Begin $network_devices/services/mtu
#
# Description : Sets MTU per interface
#
# Authors : Nathan Coulson - nathan@linuxfromscratch.org
# Jim Gifford - jim@linuxfromscratch.org
#
# Version : 00.00
#
# Notes : This sets the maximum amount of bytes that can be
# transmitted within a packet. By default, this
# value is set to 1500.
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
. ${IFCONFIG}
if [ -z "${MTU}" ]
then
boot_mesg "MTU variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
echo_failure
exit 1
fi
case "${2}" in
up)
boot_mesg "Setting the MTU for ${1} to ${MTU}..."
echo "${MTU}" > "/sys/class/net/${1}/mtu"
evaluate_retval
;;
down)
;;
*)
echo "Usage: ${0} [interface] {up|down}"
exit 1
;;
esac
# End $network_devices/services/mtu

View File

@ -0,0 +1,131 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/checkfs
#
# Description : File System Check
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# A. Luebke - luebke@users.sourceforge.net
#
# Version : 00.00
#
# Notes :
#
# Based on checkfs script from LFS-3.1 and earlier.
#
# From man fsck
# 0 - No errors
# 1 - File system errors corrected
# 2 - System should be rebooted
# 4 - File system errors left uncorrected
# 8 - Operational error
# 16 - Usage or syntax error
# 32 - Fsck canceled by user request
# 128 - Shared library error
#
#########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
start)
if [ -f /fastboot ]; then
boot_mesg -n "/fastboot found, will not perform" ${INFO}
boot_mesg " file system checks as requested."
echo_ok
exit 0
fi
boot_mesg "Mounting root file system in read-only mode..."
mount -n -o remount,ro / >/dev/null
evaluate_retval
if [ ${?} != 0 ]; then
echo_failure
boot_mesg -n "FAILURE:\n\nCannot check root" ${FAILURE}
boot_mesg -n " filesystem because it could not be mounted"
boot_mesg -n " in read-only mode.\n\nAfter you"
boot_mesg -n " press Enter, this system will be"
boot_mesg -n " halted and powered off."
boot_mesg -n "\n\nPress enter to continue..." ${INFO}
boot_mesg "" ${NORMAL}
read ENTER
${rc_base}/init.d/halt stop
fi
if [ -f /forcefsck ]; then
boot_mesg -n "/forcefsck found, forcing file" ${INFO}
boot_mesg " system checks as requested."
echo_ok
options="-f"
else
options=""
fi
boot_mesg "Checking file systems..."
# Note: -a option used to be -p; but this fails e.g.
# on fsck.minix
fsck ${options} -a -A -C -T
error_value=${?}
if [ "${error_value}" = 0 ]; then
echo_ok
fi
if [ "${error_value}" = 1 ]; then
echo_warning
boot_mesg -n "WARNING:\n\nFile system errors" ${WARNING}
boot_mesg -n " were found and have been corrected."
boot_mesg -n " You may want to double-check that"
boot_mesg -n " everything was fixed properly."
boot_mesg "" ${NORMAL}
fi
if [ "${error_value}" = 2 -o "${error_value}" = 3 ]; then
echo_warning
boot_mesg -n "WARNING:\n\nFile system errors" ${WARNING}
boot_mesg -n " were found and have been been"
boot_mesg -n " corrected, but the nature of the"
boot_mesg -n " errors require this system to be"
boot_mesg -n " rebooted.\n\nAfter you press enter,"
boot_mesg -n " this system will be rebooted"
boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
boot_mesg "" ${NORMAL}
read ENTER
reboot -f
fi
if [ "${error_value}" -gt 3 -a "${error_value}" -lt 16 ]; then
echo_failure
boot_mesg -n "FAILURE:\n\nFile system errors" ${FAILURE}
boot_mesg -n " were encountered that could not be"
boot_mesg -n " fixed automatically. This system"
boot_mesg -n " cannot continue to boot and will"
boot_mesg -n " therefore be halted until those"
boot_mesg -n " errors are fixed manually by a"
boot_mesg -n " System Administrator.\n\nAfter you"
boot_mesg -n " press Enter, this system will be"
boot_mesg -n " halted and powered off."
boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
boot_mesg "" ${NORMAL}
read ENTER
${rc_base}/init.d/halt stop
fi
if [ "${error_value}" -ge 16 ]; then
echo_failure
boot_mesg -n "FAILURE:\n\nUnexpected Failure" ${FAILURE}
boot_mesg -n " running fsck. Exited with error"
boot_mesg -n " code: ${error_value}."
boot_mesg "" ${NORMAL}
exit ${error_value}
fi
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End $rc_base/init.d/checkfs

View File

@ -0,0 +1,110 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/cleanfs
#
# Description : Clean file system
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
# Function to create files/directory on boot.
create_files() {
# Read in the configuration file.
exec 9>&0 < /etc/sysconfig/createfiles
while read name type perm usr grp dtype maj min junk
do
# Ignore comments and blank lines.
case "${name}" in
""|\#*) continue ;;
esac
# Ignore existing files.
if [ ! -e "${name}" ]; then
# Create stuff based on its type.
case "${type}" in
dir)
mkdir "${name}"
;;
file)
:> "${name}"
;;
dev)
case "${dtype}" in
char)
mknod "${name}" c ${maj} ${min}
;;
block)
mknod "${name}" b ${maj} ${min}
;;
pipe)
mknod "${name}" p
;;
*)
boot_mesg -n "\nUnknown device type: ${dtype}" ${WARNING}
boot_mesg "" ${NORMAL}
;;
esac
;;
*)
boot_mesg -n "\nUnknown type: ${type}" ${WARNING}
boot_mesg "" ${NORMAL}
continue
;;
esac
# Set up the permissions, too.
chown ${usr}:${grp} "${name}"
chmod ${perm} "${name}"
fi
done
exec 0>&9 9>&-
}
case "${1}" in
start)
boot_mesg -n "Cleaning file systems:" ${INFO}
boot_mesg -n " /tmp" ${NORMAL}
cd /tmp &&
find . -xdev -mindepth 1 ! -name lost+found \
-delete || failed=1
boot_mesg -n " /var/lock" ${NORMAL}
cd /var/lock &&
find . -type f ! -newer /proc -exec rm -f {} \; || failed=1
boot_mesg " /var/run" ${NORMAL}
cd /var/run &&
find . ! -type d ! -name utmp ! -newer /proc \
-exec rm -f {} \; || failed=1
> /var/run/utmp
if grep -q '^utmp:' /etc/group ; then
chmod 664 /var/run/utmp
chgrp utmp /var/run/utmp
fi
(exit ${failed})
evaluate_retval
if egrep -qv '^(#|$)' /etc/sysconfig/createfiles 2>/dev/null; then
boot_mesg "Creating files and directories..."
create_files
evaluate_retval
fi
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End $rc_base/init.d/cleanfs

View File

@ -0,0 +1,109 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/console
#
# Description : Sets keymap and screen font
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# Alexander E. Patrakov
#
# Version : 00.03
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
# Native English speakers probably don't have /etc/sysconfig/console at all
if [ -f /etc/sysconfig/console ]
then
. /etc/sysconfig/console
else
exit 0
fi
is_true() {
[ "$1" = "1" ] || [ "$1" = "yes" ] || [ "$1" = "true" ]
}
failed=0
case "${1}" in
start)
boot_mesg "Setting up Linux console..."
# There should be no bogus failures below this line!
# Figure out if a framebuffer console is used
[ -d /sys/class/graphics/fb0 ] && USE_FB=1 || USE_FB=0
# Figure out the command to set the console into the
# desired mode
is_true "${UNICODE}" &&
MODE_COMMAND="${ECHO} -en '\033%G' && kbd_mode -u" ||
MODE_COMMAND="${ECHO} -en '\033%@\033(K' && kbd_mode -a"
# On framebuffer consoles, font has to be set for each vt in
# UTF-8 mode. This doesn't hurt in non-UTF-8 mode also.
! is_true "${USE_FB}" || [ -z "${FONT}" ] ||
MODE_COMMAND="${MODE_COMMAND} && setfont ${FONT}"
# Apply that command to all consoles mentioned in
# /etc/inittab. Important: in the UTF-8 mode this should
# happen before setfont, otherwise a kernel bug will
# show up and the unicode map of the font will not be
# used.
# FIXME: Fedora Core also initializes two spare consoles
# - do we want that?
for TTY in `grep '^[^#].*respawn:/sbin/agetty' /etc/inittab |
grep -o '\btty[[:digit:]]*\b'`
do
openvt -f -w -c ${TTY#tty} -- \
/bin/sh -c "${MODE_COMMAND}" || failed=1
done
# Set the font (if not already set above) and the keymap
is_true "${USE_FB}" || [ -z "${FONT}" ] ||
setfont $FONT ||
failed=1
[ -z "${KEYMAP}" ] ||
loadkeys ${KEYMAP} >/dev/null 2>&1 ||
failed=1
[ -z "${KEYMAP_CORRECTIONS}" ] ||
loadkeys ${KEYMAP_CORRECTIONS} >/dev/null 2>&1 ||
failed=1
# Linux kernel generates wrong bytes when composing
# in Unicode mode. That's why we disable dead keys in Unicode
# mode by default. If you need them, download and apply
# http://www.linuxfromscratch.org/~alexander/patches/linux-2.6.12.5-utf8_input-2.patch
# After patching, add "-m charset_of_your_keymap" to the FONT
# variable and set BROKEN_COMPOSE=false
# in /etc/sysconfig/console
[ -n "$BROKEN_COMPOSE" ] || BROKEN_COMPOSE="$UNICODE"
! is_true "$BROKEN_COMPOSE" ||
echo "" | loadkeys -c >/dev/null 2>&1 ||
failed=1
# Convert the keymap from $LEGACY_CHARSET to UTF-8
[ -z "$LEGACY_CHARSET" ] ||
dumpkeys -c "$LEGACY_CHARSET" |
loadkeys -u >/dev/null 2>&1 ||
failed=1
# If any of the commands above failed, the trap at the
# top would set $failed to 1
( exit $failed )
evaluate_retval
;;
*)
echo $"Usage:" "${0} {start}"
exit 1
;;
esac
# End $rc_base/init.d/console

View File

@ -0,0 +1,61 @@
#!/bin/sh
# Begin $rc_base/init.d/consolelog
########################################################################
#
# Description : Set the kernel log level for the console
#
# Authors : Dan Nicholson - dnicholson@linuxfromscratch.org
#
# Version : 00.00
#
# Notes : /proc must be mounted before this can run
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
# set the default loglevel
LOGLEVEL=7
if [ -r /etc/sysconfig/console ]; then
. /etc/sysconfig/console
fi
case "${1}" in
start)
case "$LOGLEVEL" in
[1-8])
boot_mesg "Setting the console log level to ${LOGLEVEL}..."
dmesg -n $LOGLEVEL
evaluate_retval
;;
*)
boot_mesg "Console log level '${LOGLEVEL}' is invalid" ${FAILURE}
echo_failure
;;
esac
;;
status)
# Read the current value if possible
if [ -r /proc/sys/kernel/printk ]; then
read level line < /proc/sys/kernel/printk
else
boot_mesg "Can't read the current console log level" ${FAILURE}
echo_failure
fi
# Print the value
if [ -n "$level" ]; then
${ECHO} -e "${INFO}The current console log level" \
"is ${level}${NORMAL}"
fi
;;
*)
echo "Usage: ${0} {start|status}"
exit 1
;;
esac
# End $rc_base/init.d/consolelog

View File

@ -0,0 +1,769 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/functions
#
# Description : Run Level Control Functions
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes : With code based on Matthias Benkmann's simpleinit-msb
# http://winterdrache.de/linux/newboot/index.html
#
########################################################################
## Environmental setup
# Setup default values for environment
umask 022
export PATH="/bin:/usr/bin:/sbin:/usr/sbin"
# Signal sent to running processes to refresh their configuration
RELOADSIG="HUP"
# Number of seconds between STOPSIG and FALLBACK when stopping processes
KILLDELAY="3"
## Screen Dimensions
# Find current screen size
if [ -z "${COLUMNS}" ]; then
COLUMNS=$(stty size)
COLUMNS=${COLUMNS##* }
fi
# When using remote connections, such as a serial port, stty size returns 0
if [ "${COLUMNS}" = "0" ]; then
COLUMNS=80
fi
## Measurements for positioning result messages
COL=$((${COLUMNS} - 8))
WCOL=$((${COL} - 2))
## Provide an echo that supports -e and -n
# If formatting is needed, $ECHO should be used
case "`echo -e -n test`" in
-[en]*)
ECHO=/bin/echo
;;
*)
ECHO=echo
;;
esac
## Set Cursor Position Commands, used via $ECHO
SET_COL="\\033[${COL}G" # at the $COL char
SET_WCOL="\\033[${WCOL}G" # at the $WCOL char
CURS_UP="\\033[1A\\033[0G" # Up one line, at the 0'th char
## Set color commands, used via $ECHO
# Please consult `man console_codes for more information
# under the "ECMA-48 Set Graphics Rendition" section
#
# Warning: when switching from a 8bit to a 9bit font,
# the linux console will reinterpret the bold (1;) to
# the top 256 glyphs of the 9bit font. This does
# not affect framebuffer consoles
NORMAL="\\033[0;39m" # Standard console grey
SUCCESS="\\033[1;32m" # Success is green
WARNING="\\033[1;33m" # Warnings are yellow
FAILURE="\\033[1;31m" # Failures are red
INFO="\\033[1;36m" # Information is light cyan
BRACKET="\\033[1;34m" # Brackets are blue
STRING_LENGTH="0" # the length of the current message
#*******************************************************************************
# Function - boot_mesg()
#
# Purpose: Sending information from bootup scripts to the console
#
# Inputs: $1 is the message
# $2 is the colorcode for the console
#
# Outputs: Standard Output
#
# Dependencies: - sed for parsing strings.
# - grep for counting string length.
#
# Todo:
#*******************************************************************************
boot_mesg()
{
local ECHOPARM=""
while true
do
case "${1}" in
-n)
ECHOPARM=" -n "
shift 1
;;
-*)
echo "Unknown Option: ${1}"
return 1
;;
*)
break
;;
esac
done
## Figure out the length of what is to be printed to be used
## for warning messages.
STRING_LENGTH=$((${#1} + 1))
# Print the message to the screen
${ECHO} ${ECHOPARM} -e "${2}${1}"
}
boot_mesg_flush()
{
# Reset STRING_LENGTH for next message
STRING_LENGTH="0"
}
boot_log()
{
# Left in for backwards compatibility
:
}
echo_ok()
{
${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${SUCCESS} OK ${BRACKET}]"
${ECHO} -e "${NORMAL}"
boot_mesg_flush
}
echo_failure()
{
${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${FAILURE} FAIL ${BRACKET}]"
${ECHO} -e "${NORMAL}"
boot_mesg_flush
}
echo_warning()
{
${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${WARNING} WARN ${BRACKET}]"
${ECHO} -e "${NORMAL}"
boot_mesg_flush
}
print_error_msg()
{
echo_failure
# $i is inherited by the rc script
boot_mesg -n "FAILURE:\n\nYou should not be reading this error message.\n\n" ${FAILURE}
boot_mesg -n " It means that an unforeseen error took"
boot_mesg -n " place in ${i}, which exited with a return value of"
boot_mesg " ${error_value}.\n"
boot_mesg_flush
boot_mesg -n "If you're able to track this"
boot_mesg -n " error down to a bug in one of the files provided by"
boot_mesg -n " the LFS book, please be so kind to inform us at"
boot_mesg " lfs-dev@linuxfromscratch.org.\n"
boot_mesg_flush
boot_mesg -n "Press Enter to continue..." ${INFO}
boot_mesg "" ${NORMAL}
read ENTER
}
check_script_status()
{
# $i is inherited by the rc script
if [ ! -f ${i} ]; then
boot_mesg "${i} is not a valid symlink." ${WARNING}
echo_warning
continue
fi
if [ ! -x ${i} ]; then
boot_mesg "${i} is not executable, skipping." ${WARNING}
echo_warning
continue
fi
}
evaluate_retval()
{
error_value="${?}"
if [ ${error_value} = 0 ]; then
echo_ok
else
echo_failure
fi
# This prevents the 'An Unexpected Error Has Occurred' from trivial
# errors.
return 0
}
print_status()
{
if [ "${#}" = "0" ]; then
echo "Usage: ${0} {success|warning|failure}"
return 1
fi
case "${1}" in
success)
echo_ok
;;
warning)
# Leave this extra case in because old scripts
# may call it this way.
case "${2}" in
running)
${ECHO} -e -n "${CURS_UP}"
${ECHO} -e -n "\\033[${STRING_LENGTH}G "
boot_mesg "Already running." ${WARNING}
echo_warning
;;
not_running)
${ECHO} -e -n "${CURS_UP}"
${ECHO} -e -n "\\033[${STRING_LENGTH}G "
boot_mesg "Not running." ${WARNING}
echo_warning
;;
not_available)
${ECHO} -e -n "${CURS_UP}"
${ECHO} -e -n "\\033[${STRING_LENGTH}G "
boot_mesg "Not available." ${WARNING}
echo_warning
;;
*)
# This is how it is supposed to
# be called
echo_warning
;;
esac
;;
failure)
echo_failure
;;
esac
}
reloadproc()
{
local pidfile=""
local failure=0
while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 2
;;
*)
break
;;
esac
done
if [ "${#}" -lt "1" ]; then
log_failure_msg "Usage: reloadproc [-p pidfile] pathname"
return 2
fi
# This will ensure compatibility with previous LFS Bootscripts
if [ -n "${PIDFILE}" ]; then
pidfile="${PIDFILE}"
fi
# Is the process running?
if [ -z "${pidfile}" ]; then
pidofproc -s "${1}"
else
pidofproc -s -p "${pidfile}" "${1}"
fi
if [ -n "${pidlist}" ]; then
for pid in ${pidlist}
do
kill -"${RELOADSIG}" "${pid}" || failure="1"
done
(exit ${failure})
evaluate_retval
else
boot_mesg "Process ${1} not running." ${WARNING}
echo_warning
fi
}
statusproc()
{
local pidfile=""
local base=""
local ret=""
while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 2
;;
*)
break
;;
esac
done
if [ "${#}" != "1" ]; then
shift 1
log_failure_msg "Usage: statusproc [-p pidfile] pathname"
return 2
fi
# Get the process basename
base="${1##*/}"
# This will ensure compatibility with previous LFS Bootscripts
if [ -n "${PIDFILE}" ]; then
pidfile="${PIDFILE}"
fi
# Is the process running?
if [ -z "${pidfile}" ]; then
pidofproc -s "${1}"
else
pidofproc -s -p "${pidfile}" "${1}"
fi
# Store the return status
ret=$?
if [ -n "${pidlist}" ]; then
${ECHO} -e "${INFO}${base} is running with Process"\
"ID(s) ${pidlist}.${NORMAL}"
else
if [ -n "${base}" -a -e "/var/run/${base}.pid" ]; then
${ECHO} -e "${WARNING}${1} is not running but"\
"/var/run/${base}.pid exists.${NORMAL}"
else
if [ -n "${pidfile}" -a -e "${pidfile}" ]; then
${ECHO} -e "${WARNING}${1} is not running"\
"but ${pidfile} exists.${NORMAL}"
else
${ECHO} -e "${INFO}${1} is not running.${NORMAL}"
fi
fi
fi
# Return the status from pidofproc
return $ret
}
# The below functions are documented in the LSB-generic 2.1.0
#*******************************************************************************
# Function - pidofproc [-s] [-p pidfile] pathname
#
# Purpose: This function returns one or more pid(s) for a particular daemon
#
# Inputs: -p pidfile, use the specified pidfile instead of pidof
# pathname, path to the specified program
#
# Outputs: return 0 - Success, pid's in stdout
# return 1 - Program is dead, pidfile exists
# return 2 - Invalid or excessive number of arguments,
# warning in stdout
# return 3 - Program is not running
#
# Dependencies: pidof, echo, head
#
# Todo: Remove dependency on head
# This depreciates getpids
# Test changes to pidof
#
#*******************************************************************************
pidofproc()
{
local pidfile=""
local lpids=""
local silent=""
pidlist=""
while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
-s)
# Added for legacy opperation of getpids
# eliminates several '> /dev/null'
silent="1"
shift 1
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 2
;;
*)
break
;;
esac
done
if [ "${#}" != "1" ]; then
shift 1
log_failure_msg "Usage: pidofproc [-s] [-p pidfile] pathname"
return 2
fi
if [ -n "${pidfile}" ]; then
if [ ! -r "${pidfile}" ]; then
return 3 # Program is not running
fi
lpids=`head -n 1 ${pidfile}`
for pid in ${lpids}
do
if [ "${pid}" -ne "$$" -a "${pid}" -ne "${PPID}" ]; then
kill -0 "${pid}" 2>/dev/null &&
pidlist="${pidlist} ${pid}"
fi
if [ "${silent}" != "1" ]; then
echo "${pidlist}"
fi
test -z "${pidlist}" &&
# Program is dead, pidfile exists
return 1
# else
return 0
done
else
pidlist=`pidof -o $$ -o $PPID -x "$1"`
if [ "${silent}" != "1" ]; then
echo "${pidlist}"
fi
# Get provide correct running status
if [ -n "${pidlist}" ]; then
return 0
else
return 3
fi
fi
if [ "$?" != "0" ]; then
return 3 # Program is not running
fi
}
# This will ensure compatibility with previous LFS Bootscripts
getpids()
{
if [ -z "${PIDFILE}" ]; then
pidofproc -s -p "${PIDFILE}" $@
else
pidofproc -s $@
fi
base="${1##*/}"
}
#*******************************************************************************
# Function - loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]
#
# Purpose: This runs the specified program as a daemon
#
# Inputs: -f, run the program even if it is already running
# -n nicelevel, specifies a nice level. See nice(1).
# -p pidfile, uses the specified pidfile
# pathname, pathname to the specified program
# args, arguments to pass to specified program
#
# Outputs: return 0 - Success
# return 2 - Invalid of excessive number of arguments,
# warning in stdout
# return 4 - Program or service status is unknown
#
# Dependencies: nice
#
# Todo: LSB says this should be called start_daemon
# LSB does not say that it should call evaluate_retval
# It checks for PIDFILE, which is deprecated.
# Will be removed after BLFS 6.0
# loadproc returns 0 if program is already running, not LSB compliant
#
#*******************************************************************************
loadproc()
{
local pidfile=""
local forcestart=""
local nicelevel="10"
# This will ensure compatibility with previous LFS Bootscripts
if [ -n "${PIDFILE}" ]; then
pidfile="${PIDFILE}"
fi
while true
do
case "${1}" in
-f)
forcestart="1"
shift 1
;;
-n)
nicelevel="${2}"
shift 2
;;
-p)
pidfile="${2}"
shift 2
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 2 #invalid or excess argument(s)
;;
*)
break
;;
esac
done
if [ "${#}" = "0" ]; then
log_failure_msg "Usage: loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]"
return 2 #invalid or excess argument(s)
fi
if [ -z "${forcestart}" ]; then
if [ -z "${pidfile}" ]; then
pidofproc -s "${1}"
else
pidofproc -s -p "${pidfile}" "${1}"
fi
case "${?}" in
0)
log_warning_msg "Unable to continue: ${1} is running"
return 0 # 4
;;
1)
log_warning_msg "Unable to continue: ${pidfile} exists"
return 0 # 4
;;
3)
;;
*)
log_failure_msg "Unknown error code from pidofproc: ${?}"
return 4
;;
esac
fi
nice -n "${nicelevel}" "${@}"
evaluate_retval # This is "Probably" not LSB compliant, but required to be compatible with older bootscripts
return 0
}
#*******************************************************************************
# Function - killproc [-p pidfile] pathname [signal]
#
# Purpose:
#
# Inputs: -p pidfile, uses the specified pidfile
# pathname, pathname to the specified program
# signal, send this signal to pathname
#
# Outputs: return 0 - Success
# return 2 - Invalid of excessive number of arguments,
# warning in stdout
# return 4 - Unknown Status
#
# Dependencies: kill
#
# Todo: LSB does not say that it should call evaluate_retval
# It checks for PIDFILE, which is deprecated.
# Will be removed after BLFS 6.0
#
#*******************************************************************************
killproc()
{
local pidfile=""
local killsig=TERM # default signal is SIGTERM
pidlist=""
# This will ensure compatibility with previous LFS Bootscripts
if [ -n "${PIDFILE}" ]; then
pidfile="${PIDFILE}"
fi
while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 2
;;
*)
break
;;
esac
done
if [ "${#}" = "2" ]; then
killsig="${2}"
elif [ "${#}" != "1" ]; then
shift 2
log_failure_msg "Usage: killproc [-p pidfile] pathname [signal]"
return 2
fi
# Is the process running?
if [ -z "${pidfile}" ]; then
pidofproc -s "${1}"
else
pidofproc -s -p "${pidfile}" "${1}"
fi
# If running, send the signal
if [ -n "${pidlist}" ]; then
for pid in ${pidlist}
do
kill -${killsig} ${pid} 2>/dev/null
# Wait up to 3 seconds, for ${pid} to terminate
case "${killsig}" in
TERM|SIGTERM|KILL|SIGKILL)
# sleep in 1/10ths of seconds and
# multiply KILLDELAY by 10
local dtime="${KILLDELAY}0"
while [ "${dtime}" != "0" ]
do
kill -0 ${pid} 2>/dev/null || break
sleep 0.1
dtime=$(( ${dtime} - 1))
done
# If ${pid} is still running, kill it
kill -0 ${pid} 2>/dev/null && kill -KILL ${pid} 2>/dev/null
;;
esac
done
# Check if the process is still running if we tried to stop it
case "${killsig}" in
TERM|SIGTERM|KILL|SIGKILL)
if [ -z "${pidfile}" ]; then
pidofproc -s "${1}"
else
pidofproc -s -p "${pidfile}" "${1}"
fi
# Program was terminated
if [ "$?" != "0" ]; then
# Remove the pidfile if necessary
if [ -f "${pidfile}" ]; then
rm -f "${pidfile}"
fi
echo_ok
return 0
else # Program is still running
echo_failure
return 4 # Unknown Status
fi
;;
*)
# Just see if the kill returned successfully
evaluate_retval
;;
esac
else # process not running
print_status warning not_running
fi
}
#*******************************************************************************
# Function - log_success_msg "message"
#
# Purpose: Print a success message
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_success_msg()
{
${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
${ECHO} -e "${SET_COL}""${BRACKET}""[""${SUCCESS}"" OK ""${BRACKET}""]""${NORMAL}"
return 0
}
#*******************************************************************************
# Function - log_failure_msg "message"
#
# Purpose: Print a failure message
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_failure_msg() {
${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
${ECHO} -e "${SET_COL}""${BRACKET}""[""${FAILURE}"" FAIL ""${BRACKET}""]""${NORMAL}"
return 0
}
#*******************************************************************************
# Function - log_warning_msg "message"
#
# Purpose: print a warning message
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_warning_msg() {
${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
${ECHO} -e "${SET_COL}""${BRACKET}""[""${WARNING}"" WARN ""${BRACKET}""]""${NORMAL}"
return 0
}
# End $rc_base/init.d/functions

View File

@ -0,0 +1,28 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/halt
#
# Description : Halt Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
stop)
halt -d -f -i -p
;;
*)
echo "Usage: {stop}"
exit 1
;;
esac
# End $rc_base/init.d/halt

View File

@ -0,0 +1,54 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/localnet
#
# Description : Loopback device
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
. /etc/sysconfig/network
case "${1}" in
start)
boot_mesg "Bringing up the loopback interface..."
ip addr add 127.0.0.1/8 label lo dev lo
ip link set lo up
evaluate_retval
boot_mesg "Setting hostname to ${HOSTNAME}..."
hostname ${HOSTNAME}
evaluate_retval
;;
stop)
boot_mesg "Bringing down the loopback interface..."
ip link set lo down
evaluate_retval
;;
restart)
${0} stop
sleep 1
${0} start
;;
status)
echo "Hostname is: $(hostname)"
ip link show lo
;;
*)
echo "Usage: ${0} {start|stop|restart|status}"
exit 1
;;
esac
# End $rc_base/init.d/localnet

View File

@ -0,0 +1,72 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/modules
#
# Description : Module auto-loading script
#
# Authors : Zack Winkles
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
# Assure that the kernel has module support.
[ -e /proc/ksyms -o -e /proc/modules ] || exit 0
case "${1}" in
start)
# Exit if there's no modules file or there are no
# valid entries
[ -r /etc/sysconfig/modules ] &&
egrep -qv '^($|#)' /etc/sysconfig/modules ||
exit 0
boot_mesg -n "Loading modules:" ${INFO}
# Only try to load modules if the user has actually given us
# some modules to load.
while read module args; do
# Ignore comments and blank lines.
case "$module" in
""|"#"*) continue ;;
esac
# Attempt to load the module, making
# sure to pass any arguments provided.
modprobe ${module} ${args} >/dev/null
# Print the module name if successful,
# otherwise take note.
if [ $? -eq 0 ]; then
boot_mesg -n " ${module}" ${NORMAL}
else
failedmod="${failedmod} ${module}"
fi
done < /etc/sysconfig/modules
boot_mesg "" ${NORMAL}
# Print a message about successfully loaded
# modules on the correct line.
echo_ok
# Print a failure message with a list of any
# modules that may have failed to load.
if [ -n "${failedmod}" ]; then
boot_mesg "Failed to load modules:${failedmod}" ${FAILURE}
echo_failure
fi
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End $rc_base/init.d/modules

View File

@ -0,0 +1,54 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/mountfs
#
# Description : File System Mount Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
start)
boot_mesg "Remounting root file system in read-write mode..."
mount -n -o remount,rw / >/dev/null
evaluate_retval
# Remove fsck-related file system watermarks.
rm -f /fastboot /forcefsck
boot_mesg "Recording existing mounts in /etc/mtab..."
> /etc/mtab
mount -f / || failed=1
mount -f /proc || failed=1
mount -f /sys || failed=1
(exit ${failed})
evaluate_retval
# This will mount all filesystems that do not have _netdev in
# their option list. _netdev denotes a network filesystem.
boot_mesg "Mounting remaining file systems..."
mount -a -O no_netdev >/dev/null
evaluate_retval
;;
stop)
boot_mesg "Unmounting all other currently mounted file systems..."
umount -a -d -r >/dev/null
evaluate_retval
;;
*)
echo "Usage: ${0} {start|stop}"
exit 1
;;
esac
# End $rc_base/init.d/mountfs

View File

@ -0,0 +1,44 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/mountkernfs
#
# Description : Mount proc and sysfs
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
start)
boot_mesg -n "Mounting kernel-based file systems:" ${INFO}
if ! mountpoint /proc >/dev/null; then
boot_mesg -n " /proc" ${NORMAL}
mount -n /proc || failed=1
fi
if ! mountpoint /sys >/dev/null; then
boot_mesg -n " /sys" ${NORMAL}
mount -n /sys || failed=1
fi
boot_mesg "" ${NORMAL}
(exit ${failed})
evaluate_retval
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End $rc_base/init.d/mountkernfs

View File

@ -0,0 +1,73 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/network
#
# Description : Network Control Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# Nathan Coulson - nathan@linuxfromscratch.org
# Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
. /etc/sysconfig/network
case "${1}" in
start)
# Start all network interfaces
for file in ${network_devices}/ifconfig.*
do
interface=${file##*/ifconfig.}
# skip if $file is * (because nothing was found)
if [ "${interface}" = "*" ]
then
continue
fi
IN_BOOT=1 ${network_devices}/ifup ${interface}
done
;;
stop)
# Reverse list
FILES=""
for file in ${network_devices}/ifconfig.*
do
FILES="${file} ${FILES}"
done
# Stop all network interfaces
for file in ${FILES}
do
interface=${file##*/ifconfig.}
# skip if $file is * (because nothing was found)
if [ "${interface}" = "*" ]
then
continue
fi
IN_BOOT=1 ${network_devices}/ifdown ${interface}
done
;;
restart)
${0} stop
sleep 1
${0} start
;;
*)
echo "Usage: ${0} {start|stop|restart}"
exit 1
;;
esac
# End /etc/rc.d/init.d/network

99
bootscripts/lfs/init.d/rc Normal file
View File

@ -0,0 +1,99 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/rc
#
# Description : Main Run Level Control Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
# This sets a few default terminal options.
stty sane
# These 3 signals will not cause our script to exit
trap "" INT QUIT TSTP
[ "${1}" != "" ] && runlevel=${1}
if [ "${runlevel}" = "" ]; then
echo "Usage: ${0} <runlevel>" >&2
exit 1
fi
previous=${PREVLEVEL}
[ "${previous}" = "" ] && previous=N
if [ ! -d ${rc_base}/rc${runlevel}.d ]; then
boot_mesg "${rc_base}/rc${runlevel}.d does not exist." ${WARNING}
boot_mesg_flush
exit 1
fi
# Attempt to stop all service started by previous runlevel,
# and killed in this runlevel
if [ "${previous}" != "N" ]; then
for i in $(ls -v ${rc_base}/rc${runlevel}.d/K* 2> /dev/null)
do
check_script_status
suffix=${i#$rc_base/rc$runlevel.d/K[0-9][0-9]}
prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix
sysinit_start=$rc_base/rcsysinit.d/S[0-9][0-9]$suffix
if [ "${runlevel}" != "0" ] && [ "${runlevel}" != "6" ]; then
if [ ! -f ${prev_start} ] && [ ! -f ${sysinit_start} ]; then
boot_mesg -n "WARNING:\n\n${i} can't be" ${WARNING}
boot_mesg -n " executed because it was not"
boot_mesg -n " not started in the previous"
boot_mesg -n " runlevel (${previous})."
boot_mesg "" ${NORMAL}
boot_mesg_flush
continue
fi
fi
${i} stop
error_value=${?}
if [ "${error_value}" != "0" ]; then
print_error_msg
fi
done
fi
#Start all functions in this runlevel
for i in $( ls -v ${rc_base}/rc${runlevel}.d/S* 2> /dev/null)
do
if [ "${previous}" != "N" ]; then
suffix=${i#$rc_base/rc$runlevel.d/S[0-9][0-9]}
stop=$rc_base/rc$runlevel.d/K[0-9][0-9]$suffix
prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix
[ -f ${prev_start} ] && [ ! -f ${stop} ] && continue
fi
check_script_status
case ${runlevel} in
0|6)
${i} stop
;;
*)
${i} start
;;
esac
error_value=${?}
if [ "${error_value}" != "0" ]; then
print_error_msg
fi
done
# End $rc_base/init.d/rc

View File

@ -0,0 +1,31 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/reboot
#
# Description : Reboot Scripts
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
stop)
boot_mesg "Restarting system..."
reboot -d -f -i
;;
*)
echo "Usage: ${0} {stop}"
exit 1
;;
esac
# End $rc_base/init.d/reboot

View File

@ -0,0 +1,52 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/sendsignals
#
# Description : Sendsignals Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
stop)
boot_mesg "Sending all processes the TERM signal..."
killall5 -15
error_value=${?}
sleep ${KILLDELAY}
if [ "${error_value}" = 0 ]; then
echo_ok
else
echo_failure
fi
boot_mesg "Sending all processes the KILL signal..."
killall5 -9
error_value=${?}
sleep ${KILLDELAY}
if [ "${error_value}" = 0 ]; then
echo_ok
else
echo_failure
fi
;;
*)
echo "Usage: ${0} {stop}"
exit 1
;;
esac
# End $rc_base/init.d/sendsignals

View File

@ -0,0 +1,49 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/setclock
#
# Description : Setting Linux Clock
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
. /etc/sysconfig/clock
CLOCKPARAMS=
case "${UTC}" in
yes|true|1)
CLOCKPARAMS="${CLOCKPARAMS} --utc"
;;
no|false|0)
CLOCKPARAMS="${CLOCKPARAMS} --localtime"
;;
esac
case ${1} in
start)
boot_mesg "Setting system clock..."
hwclock --hctosys ${CLOCKPARAMS} >/dev/null
evaluate_retval
;;
stop)
boot_mesg "Setting hardware clock..."
hwclock --systohc ${CLOCKPARAMS} >/dev/null
evaluate_retval
;;
*)
echo "Usage: ${0} {start|stop}"
;;
esac

View File

@ -0,0 +1,50 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/swap
#
# Description : Swap Control Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
start)
boot_mesg "Activating all swap files/partitions..."
swapon -a
evaluate_retval
;;
stop)
boot_mesg "Deactivating all swap files/partitions..."
swapoff -a
evaluate_retval
;;
restart)
${0} stop
sleep 1
${0} start
;;
status)
boot_mesg "Retrieving swap status." ${INFO}
echo_ok
echo
swapon -s
;;
*)
echo "Usage: ${0} {start|stop|restart|status}"
exit 1
;;
esac
# End $rc_base/init.d/swap

View File

@ -0,0 +1,39 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/sysctl
#
# Description : File uses /etc/sysctl.conf to set kernel runtime
# parameters
#
# Authors : Nathan Coulson (nathan@linuxfromscratch.org)
# Matthew Burgress (matthew@linuxfromscratch.org)
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
start)
if [ -f "/etc/sysctl.conf" ]; then
boot_mesg "Setting kernel runtime parameters..."
sysctl -q -p
evaluate_retval
fi
;;
status)
sysctl -a
;;
*)
echo "Usage: ${0} {start|status}"
exit 1
;;
esac
# End $rc_base/init.d/sysctl

View File

@ -0,0 +1,57 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/sysklogd
#
# Description : Sysklogd loader
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
start)
boot_mesg "Starting system log daemon..."
loadproc syslogd -m 0
boot_mesg "Starting kernel log daemon..."
loadproc klogd
;;
stop)
boot_mesg "Stopping kernel log daemon..."
killproc klogd
boot_mesg "Stopping system log daemon..."
killproc syslogd
;;
reload)
boot_mesg "Reloading system log daemon config file..."
reloadproc syslogd
;;
restart)
${0} stop
sleep 1
${0} start
;;
status)
statusproc syslogd
statusproc klogd
;;
*)
echo "Usage: ${0} {start|stop|reload|restart|status}"
exit 1
;;
esac
# End $rc_base/init.d/sysklogd

View File

@ -0,0 +1,50 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/
#
# Description :
#
# Authors :
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
start)
boot_mesg "Starting..."
loadproc
;;
stop)
boot_mesg "Stopping..."
killproc
;;
reload)
boot_mesg "Reloading..."
reloadproc
;;
restart)
${0} stop
sleep 1
${0} start
;;
status)
statusproc
;;
*)
echo "Usage: ${0} {start|stop|reload|restart|status}"
exit 1
;;
esac
# End $rc_base/init.d/

View File

@ -0,0 +1,77 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/udev
#
# Description : Udev cold-plugging script
#
# Authors : Zack Winkles, Alexander E. Patrakov
#
# Version : 00.02
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
start)
boot_mesg "Populating /dev with device nodes..."
if ! grep -q '[[:space:]]sysfs' /proc/mounts; then
echo_failure
boot_mesg -n "FAILURE:\n\nUnable to create" ${FAILURE}
boot_mesg -n " devices without a SysFS filesystem"
boot_mesg -n "\n\nAfter you press Enter, this system"
boot_mesg -n " will be halted and powered off."
boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
boot_mesg "" ${NORMAL}
read ENTER
/etc/rc.d/init.d/halt stop
fi
# Mount a temporary file system over /dev, so that any devices
# made or removed during this boot don't affect the next one.
# The reason we don't write to mtab is because we don't ever
# want /dev to be unavailable (such as by `umount -a').
mount -n -t tmpfs tmpfs /dev -o mode=755
if [ ${?} != 0 ]; then
echo_failure
boot_mesg -n "FAILURE:\n\nCannot mount a tmpfs" ${FAILURE}
boot_mesg -n " onto /dev, this system will be halted."
boot_mesg -n "\n\nAfter you press Enter, this system"
boot_mesg -n " will be halted and powered off."
boot_mesg -n "\n\nPress Enter to continue..." ${INFO}
boot_mesg "" ${NORMAL}
read ENTER
/etc/rc.d/init.d/halt stop
fi
# Udev handles uevents itself, so we don't need to have
# the kernel call out to any binary in response to them
echo > /proc/sys/kernel/hotplug
# Copy static device nodes to /dev
cp -a /lib/udev/devices/* /dev
# Start the udev daemon to continually watch for, and act on,
# uevents
/sbin/udevd --daemon
# Now traverse /sys in order to "coldplug" devices that have
# already been discovered
/sbin/udevadm trigger
# Now wait for udevd to process the uevents we triggered
/sbin/udevadm settle
evaluate_retval
;;
*)
echo "Usage ${0} {start}"
exit 1
;;
esac
# End $rc_base/init.d/udev

View File

@ -0,0 +1,45 @@
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/udev_retry
#
# Description : Udev cold-plugging script (retry)
#
# Authors : Alexander E. Patrakov
#
# Version : 00.02
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
start)
boot_mesg "Retrying failed uevents, if any..."
# From Debian: "copy the rules generated before / was mounted
# read-write":
for file in /dev/.udev/tmp-rules--*; do
dest=${file##*tmp-rules--}
[ "$dest" = '*' ] && break
cat $file >> /etc/udev/rules.d/$dest
rm -f $file
done
# Re-trigger the failed uevents in hope they will succeed now
/sbin/udevadm trigger --retry-failed
# Now wait for udevd to process the uevents we triggered
/sbin/udevadm settle
evaluate_retval
;;
*)
echo "Usage ${0} {start}"
exit 1
;;
esac
# End $rc_base/init.d/udev_retry

View File

@ -0,0 +1,28 @@
########################################################################
# Begin /etc/sysconfig/createfiles
#
# Description : Createfiles script config file
#
# Authors :
#
# Version : 00.00
#
# Notes : The syntax of this file is as follows:
# if type is equal to "file" or "dir"
# <filename> <type> <permissions> <user> <group>
# if type is equal to "dev"
# <filename> <type> <permissions> <user> <group> <devtype> <major> <minor>
#
# <filename> is the name of the file which is to be created
# <type> is either file, dir, or dev.
# file creates a new file
# dir creates a new directory
# dev creates a new device
# <devtype> is either block, char or pipe
# block creates a block device
# char creates a character deivce
# pipe creates a pipe, this will ignore the <major> and <minor> fields
# <major> and <minor> are the major and minor numbers used for the device.
########################################################################
# End /etc/sysconfig/createfiles

View File

@ -0,0 +1,18 @@
########################################################################
# Begin /etc/sysconfig/modules
#
# Description : Module auto-loading configuration
#
# Authors :
#
# Version : 00.00
#
# Notes : The syntax of this file is as follows:
# <module> [<arg1> <arg2> ...]
#
# Each module should be on it's own line, and any options that you want
# passed to the module should follow it. The line deliminator is either
# a space or a tab.
########################################################################
# End /etc/sysconfig/modules

View File

@ -0,0 +1,95 @@
#!/bin/sh
########################################################################
# Begin $network_devices/ifdown
#
# Description : Interface Down
#
# Authors : Nathan Coulson - nathan@linuxfromscratch.org
# Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version : 00.01
#
# Notes : the IFCONFIG variable is passed to the scripts found
# in the services directory, to indicate what file the
# service should source to get environmental variables.
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
# Collect a list of configuration files for our interface
if [ -n "${2}" ]; then
for file in ${@#$1}; do # All parameters except $1
FILES="${FILES} ${network_devices}/ifconfig.${1}/${file}"
done
elif [ -d "${network_devices}/ifconfig.${1}" ]; then
FILES=`echo ${network_devices}/ifconfig.${1}/*`
else
FILES="${network_devices}/ifconfig.${1}"
fi
# Reverse the order configuration files are processed in
for file in ${FILES}; do
FILES2="${file} ${FILES2}"
done
FILES=${FILES2}
# Process each configuration file
for file in ${FILES}; do
# skip backup files
if [ "${file}" != "${file%""~""}" ]; then
continue
fi
if [ ! -f "${file}" ]; then
boot_mesg "${file} is not a network configuration file or directory." ${WARNING}
echo_warning
continue
fi
(
. ${file}
# Will not process this service if started by boot, and ONBOOT
# is not set to yes
if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then
continue
fi
# Will not process this service if started by hotplug, and
# ONHOTPLUG is not set to yes
if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" ]; then
continue
fi
# This will run the service script, if SERVICE is set
if [ -n "${SERVICE}" -a -x "${network_devices}/services/${SERVICE}" ]; then
if ip link show ${1} > /dev/null 2>&1
then
IFCONFIG=${file} ${network_devices}/services/${SERVICE} ${1} down
else
boot_mesg "Interface ${1} doesn't exist." ${WARNING}
echo_warning
fi
else
boot_mesg -n "Unable to process ${file}. Either" ${FAILURE}
boot_mesg -n " the SERVICE variable was not set,"
boot_mesg " or the specified service cannot be executed."
echo_failure
continue
fi
)
done
if [ -z "${2}" ]; then
link_status=`ip link show $1`
if [ -n "${link_status}" ]; then
if echo "${link_status}" | grep -q UP; then
boot_mesg "Bringing down the ${1} interface..."
ip link set ${1} down
evaluate_retval
fi
fi
fi
# End $network_devices/ifdown

View File

@ -0,0 +1,89 @@
#!/bin/sh
########################################################################
# Begin $network_devices/ifup
#
# Description : Interface Up
#
# Authors : Nathan Coulson - nathan@linuxfromscratch.org
# Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version : 00.00
#
# Notes : the IFCONFIG variable is passed to the scripts found
# in the services directory, to indicate what file the
# service should source to get environmental variables.
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
# Collect a list of configuration files for our interface
if [ -n "${2}" ]; then
for file in ${@#$1} # All parameters except $1
do
FILES="${FILES} ${network_devices}/ifconfig.${1}/${file}"
done
elif [ -d "${network_devices}/ifconfig.${1}" ]; then
FILES=`echo ${network_devices}/ifconfig.${1}/*`
else
FILES="${network_devices}/ifconfig.${1}"
fi
boot_mesg "Bringing up the ${1} interface..."
boot_mesg_flush
# Process each configruation file
for file in ${FILES}; do
# skip backup files
if [ "${file}" != "${file%""~""}" ]; then
continue
fi
if [ ! -f "${file}" ]; then
boot_mesg "${file} is not a network configuration file or directory." ${WARNING}
echo_warning
continue
fi
(
. ${file}
# Will not process this service if started by boot, and ONBOOT
# is not set to yes
if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then
continue
fi
# Will not process this service if started by hotplug, and
# ONHOTPLUG is not set to yes
if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" -a "${HOSTNAME}" != "(none)" ]; then
continue
fi
if [ -n "${SERVICE}" -a -x "${network_devices}/services/${SERVICE}" ]; then
if [ -z "${CHECK_LINK}" -o "${CHECK_LINK}" = "y" -o "${CHECK_LINK}" = "yes" -o "${CHECK_LINK}" = "1" ]; then
if ip link show ${1} > /dev/null 2>&1; then
link_status=`ip link show ${1}`
if [ -n "${link_status}" ]; then
if ! echo "${link_status}" | grep -q UP; then
ip link set ${1} up
fi
fi
else
boot_mesg "Interface ${1} doesn't exist." ${WARNING}
echo_warning
continue
fi
fi
IFCONFIG=${file} ${network_devices}/services/${SERVICE} ${1} up
else
boot_mesg "Unable to process ${file}. Either" ${FAILURE}
boot_mesg " the SERVICE variable was not set,"
boot_mesg " or the specified service cannot be executed."
echo_failure
continue
fi
)
done
# End $network_devices/ifup

View File

@ -0,0 +1,82 @@
#!/bin/sh
########################################################################
# Begin $network_devices/services/ipv4-static
#
# Description : IPV4 Static Boot Script
#
# Authors : Nathan Coulson - nathan@linuxfromscratch.org
# Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
. ${IFCONFIG}
if [ -z "${IP}" ]; then
boot_mesg "IP variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
echo_failure
exit 1
fi
if [ -z "${PREFIX}" -a -z "${PEER}" ]; then
boot_mesg -n "PREFIX variable missing from ${IFCONFIG}," ${WARNING}
boot_mesg " assuming 24."
echo_warning
PREFIX=24
args="${args} ${IP}/${PREFIX}"
elif [ -n "${PREFIX}" -a -n "${PEER}" ]; then
boot_mesg "PREFIX and PEER both specified in ${IFCONFIG}, cannot continue." ${FAILURE}
echo_failure
exit 1
elif [ -n "${PREFIX}" ]; then
args="${args} ${IP}/${PREFIX}"
elif [ -n "${PEER}" ]; then
args="${args} ${IP} peer ${PEER}"
fi
if [ -n "${BROADCAST}" ]; then
args="${args} broadcast ${BROADCAST}"
fi
case "${2}" in
up)
boot_mesg "Adding IPv4 address ${IP} to the ${1} interface..."
ip addr add ${args} dev ${1}
evaluate_retval
if [ -n "${GATEWAY}" ]; then
if ip route | grep -q default; then
boot_mesg "Gateway already setup; skipping." ${WARNING}
echo_warning
else
boot_mesg "Setting up default gateway..."
ip route add default via ${GATEWAY} dev ${1}
evaluate_retval
fi
fi
;;
down)
if [ -n "${GATEWAY}" ]; then
boot_mesg "Removing default gateway..."
ip route del default
evaluate_retval
fi
boot_mesg "Removing IPv4 address ${IP} from the ${1} interface..."
ip addr del ${args} dev ${1}
evaluate_retval
;;
*)
echo "Usage: ${0} [interface] {up|down}"
exit 1
;;
esac
# End $network_devices/services/ipv4-static

View File

@ -0,0 +1,97 @@
#!/bin/sh
########################################################################
# Begin $network_devices/services/ipv4-static-route
#
# Description : IPV4 Static Route Script
#
# Authors : Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
# Version : 00.00
#
# Notes :
#
########################################################################
. /etc/sysconfig/rc
. ${rc_functions}
. ${IFCONFIG}
case "${TYPE}" in
("" | "network")
need_ip=1
need_gateway=1
;;
("default")
need_gateway=1
args="${args} default"
desc="default"
;;
("host")
need_ip=1
;;
("unreachable")
need_ip=1
args="${args} unreachable"
desc="unreachable "
;;
(*)
boot_mesg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue." ${FAILURE}
echo_failure
exit 1
;;
esac
if [ -n "${need_ip}" ]; then
if [ -z "${IP}" ]; then
boot_mesg "IP variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
echo_failure
exit 1
fi
if [ -z "${PREFIX}" ]; then
boot_mesg "PREFIX variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
echo_failure
exit 1
fi
args="${args} ${IP}/${PREFIX}"
desc="${desc}${IP}/${PREFIX}"
fi
if [ -n "${need_gateway}" ]; then
if [ -z "${GATEWAY}" ]; then
boot_mesg "GATEWAY variable missing from ${IFCONFIG}, cannot continue." ${FAILURE}
echo_failure
exit 1
fi
args="${args} via ${GATEWAY}"
fi
if [ -n "${SOURCE}" ]; then
args="${args} src ${SOURCE}"
fi
case "${2}" in
up)
boot_mesg "Adding '${desc}' route to the ${1} interface..."
ip route add ${args} dev ${1}
evaluate_retval
;;
down)
boot_mesg "Removing '${desc}' route from the ${1} interface..."
ip route del ${args} dev ${1}
evaluate_retval
;;
*)
echo "Usage: ${0} [interface] {up|down}"
exit 1
;;
esac
# End $network_devices/services/ipv4-static-route

View File

@ -0,0 +1,18 @@
########################################################################
# Begin /etc/sysconfig/rc
#
# Description : rc script configuration
#
# Authors :
#
# Version : 00.00
#
# Notes :
#
########################################################################
rc_base=/etc/rc.d
rc_functions=${rc_base}/init.d/functions
network_devices=/etc/sysconfig/network-devices
# End /etc/sysconfig/rc

View File

@ -36,6 +36,22 @@
</listitem>
-->
<listitem>
<para>2008-06-03</para>
<itemizedlist>
<listitem>
<para>[bdubbs] - Added udev-config scripts to appenices.</para>
</listitem>
<listitem>
<para>[bdubbs] - Added lfs-bootscripts to appenices.</para>
</listitem>
<listitem>
<para>[bdubbs] - Updated license to Creative Commons with
extracted code under the MIT license.</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>2008-05-23</para>
<itemizedlist>
@ -65,25 +81,25 @@
<itemizedlist>
<listitem>
<para>[jhuntwork] - Use -mtune=native for glibc. We don't
want our libc optimized for 486. It should be optimized
for the local machine.</para>
want our libc optimized for 486. It should be optimized
for the local machine.</para>
</listitem>
<listitem>
<para>[jhuntwork] - Updated Autoconf to 2.62.</para>
</listitem>
<listitem>
<para>[jhuntwork] - Updated E2fsprogs to 1.40.8. Fixes #2173.
</para>
</listitem>
<listitem>
<para>[jhuntwork] - Fixed behavior in kbd where man pages
for optional programs that aren't built are installed.
Thanks Greg Schafer for spotting this.
</para>
</listitem>
<listitem>
<para>[jhuntwork] - Updated E2fsprogs to 1.40.8. Fixes #2173.
</para>
</listitem>
<listitem>
<para>[jhuntwork] - Fixed behavior in kbd where man pages
for optional programs that aren't built are installed.
Thanks Greg Schafer for spotting this.
</para>
</listitem>
<listitem>
<para>[jhuntwork] - Fixed kbd to install getkeycodes,
setkeycodes and resizecons. Also moved loadkeys to /bin from
setkeycodes and resizecons. Also moved loadkeys to /bin from
/usr/bin. Thanks, Greg Schafer.</para>
</listitem>
</itemizedlist>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ENTITY version "SVN-20080522">
<!ENTITY releasedate "May 22, 2008">
<!ENTITY version "SVN-20080603">
<!ENTITY releasedate "June 3, 2008">
<!ENTITY copyrightdate "1999&ndash;2008">
<!ENTITY milestone "7.0">
<!ENTITY generic-version "development"> <!-- Use "development", "testing", or "x.y[-pre{x}]" -->

View File

@ -41,6 +41,8 @@
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="appendices/acronymlist.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="appendices/acknowledgments.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="appendices/dependencies.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="appendices/scripts.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="appendices/license.xml"/>
</part>
<index/>

22
make-aux-files.sh Executable file
View File

@ -0,0 +1,22 @@
#!/bin/bash
rm -f lfs-bootscripts*.tar.bz2
# Get base file name and move bootscripts directory to that name
version=`grep "ENTITY lfs-bootscripts-version" packages.ent |cut -d'"' -f2`
mv bootscripts lfs-bootscripts-$version
# Create the tarball and clean up
tar -cjf lfs-bootscripts-$version.tar.bz2 --exclude .svn lfs-bootscripts-$version
mv lfs-bootscripts-$version bootscripts
rm -f udev-config*.bz2
# Get file name and move udev config directory to that name
version=`grep "ENTITY udev-config " packages.ent |cut -d'"' -f2`
mv udev-config $version
# Create the tarball and clean up
tar -cjf $version.tar.bz2 --exclude .svn $version
mv $version udev-config

View File

@ -283,12 +283,12 @@
<!ENTITY less-ch6-du "2.8 MB">
<!ENTITY less-ch6-sbu "0.1 SBU">
<!ENTITY lfs-bootscripts-version "20080522">
<!ENTITY lfs-bootscripts-size "42 KB">
<!ENTITY lfs-bootscripts-version "20080522"> <!-- Scripts depend on this format -->
<!ENTITY lfs-bootscripts-size "BOOTSCRIPTS-SIZE KB"> <!-- Updated in Makefile -->
<!ENTITY lfs-bootscripts-url "&downloads-root;lfs-bootscripts-&lfs-bootscripts-version;.tar.bz2">
<!ENTITY lfs-bootscripts-md5 "2f29eb04b3373de58b770e3946575751">
<!ENTITY lfs-bootscripts-md5 "BOOTSCRIPTS-MD5SUM"> <!-- Updated in Makefile -->
<!ENTITY lfs-bootscripts-home " ">
<!ENTITY lfs-bootscripts-ch7-du "0.4 MB">
<!ENTITY lfs-bootscripts-ch7-du "BOOTSCRIPTS-INSTALL-KB KB"> <!-- Updated in Makefile -->
<!ENTITY lfs-bootscripts-ch7-sbu "less than 0.1 SBU">
<!ENTITY libtool-version "1.5.26">
@ -496,10 +496,10 @@
<!ENTITY udev-ch6-du "7.6 MB">
<!ENTITY udev-ch6-sbu "0.1 SBU">
<!ENTITY udev-config "udev-config-20080522">
<!ENTITY udev-config-size "13 KB">
<!ENTITY udev-config "udev-config-20080522"> <!-- Scripts depend on this format -->
<!ENTITY udev-config-size "UDEV-SIZE KB"> <!-- Updated in Makefile -->
<!ENTITY udev-config-url "&downloads-root;&udev-config;.tar.bz2">
<!ENTITY udev-config-md5 "cb5126322dacf38fe1770c28119208d5">
<!ENTITY udev-config-md5 "UDEV-MD5SUM"> <!-- Updated in Makefile -->
<!ENTITY udev-config-home " ">
<!ENTITY util-linux-ng-version "2.13.1">

22
process-scripts.sh Normal file
View File

@ -0,0 +1,22 @@
#!/bin/sh
for s in bootscripts/lfs/init.d/* \
bootscripts/lfs/sysconfig/* \
bootscripts/lfs/sysconfig/network-devices/* \
bootscripts/lfs/sysconfig/network-devices/services/*
do
script=`basename $s`
# Skip directories
[ $script == 'network-devices' ] && continue
[ $script == 'services' ] && continue
# Disambiguate duplicate file names
[ $s == 'bootscripts/lfs/sysconfig/rc' ] && script='rc-sysinit';
[ $s == 'bootscripts/lfs/sysconfig/modules' ] && script='modules-sysinit';
sed -e 's/\&/\&amp\;/g' -e 's/</\&lt\;/g' -e 's/>/\&gt\;/g' \
-e "s/'/\&apos\;/g" -e 's/"/\&quot\;/g' -e 's/\t/ /g' \
$s > appendices/${script}.script
done

View File

@ -19,47 +19,21 @@
<copyright id="copyright">
<year>1999&ndash;2008</year>
<year>&copyrightdate;</year>
<holder>Gerard Beekmans</holder>
</copyright>
<legalnotice>
<para>Copyright (c) 1999&ndash;2007, Gerard Beekmans</para>
<para>Copyright &copy; &copyrightdate;, Gerard Beekmans</para>
<para>All rights reserved.</para>
<para>Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:</para>
<para>This book is licensed under a <xref linkend="CC"/>.</para>
<para>Computer instructions may be extracted from the book under the
<xref linkend="MIT"/>.</para>
<itemizedlist>
<listitem>
<para>Redistributions in any form must retain the above copyright
notice, this list of conditions and the following disclaimer</para>
</listitem>
<listitem>
<para>Neither the name of <quote>Linux From Scratch</quote> nor the
names of its contributors may be used to endorse or promote products
derived from this material without specific prior written
permission</para>
</listitem>
<listitem>
<para>Any material derived from Linux From Scratch must contain
a reference to the <quote>Linux From Scratch</quote> project</para>
</listitem>
</itemizedlist>
<para>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
<quote>AS IS</quote> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</para>
<para><trademark class='registered'>Linux</trademark> is a registered trademark of
Linus Torvalds.</para>
</legalnotice>

101
udev-config/55-lfs.rules Normal file
View File

@ -0,0 +1,101 @@
# /etc/udev/rules.d/25-lfs.rules: Rule definitions for LFS.
# Core kernel devices
# override both of these
KERNEL=="random", MODE="0444"
KERNEL=="urandom", MODE="0444"
KERNEL=="aio", MODE="0444"
KERNEL=="kmsg", MODE="0600"
KERNEL=="rtc", MODE="0666"
# Comms devices
KERNEL=="rfcomm[0-9]*", GROUP="uucp"
KERNEL=="ippp[0-9]*", GROUP="uucp"
KERNEL=="isdn[0-9]*", GROUP="uucp"
KERNEL=="isdnctrl[0-9]*", GROUP="uucp"
KERNEL=="capi", NAME="capi20", SYMLINK+="isdn/capi20"
KERNEL=="capi?*", NAME="capi/%n", GROUP="uucp"
KERNEL=="dcbri[0-9]*", GROUP="uucp"
# ALSA devices go in their own subdirectory
KERNEL=="controlC[0-9]*", GROUP="audio", NAME="snd/%k"
KERNEL=="hwC[0-9]*D[0-9]*", GROUP="audio", NAME="snd/%k"
KERNEL=="pcmC[0-9]*D[0-9]*[cp]", GROUP="audio", NAME="snd/%k"
KERNEL=="midiC[0-9]*D[0-9]*", GROUP="audio", NAME="snd/%k"
KERNEL=="timer", GROUP="audio", NAME="snd/%k"
KERNEL=="seq", GROUP="audio", NAME="snd/%k"
# Sound devices
KERNEL=="admmidi*", GROUP="audio"
KERNEL=="adsp*", GROUP="audio"
KERNEL=="aload*", GROUP="audio"
KERNEL=="amidi*", GROUP="audio"
KERNEL=="amixer*", GROUP="audio"
KERNEL=="audio*", GROUP="audio"
KERNEL=="dmfm*", GROUP="audio"
KERNEL=="dmmidi*", GROUP="audio"
KERNEL=="dsp*", GROUP="audio"
KERNEL=="midi*", GROUP="audio"
KERNEL=="mixer*", GROUP="audio"
KERNEL=="music", GROUP="audio"
KERNEL=="sequencer*", GROUP="audio"
# Input devices
# override MODE on these four
KERNEL=="mice", MODE="0644", SYMLINK+="mouse"
KERNEL=="mouse*", MODE="0644"
KERNEL=="event*", MODE="0644"
KERNEL=="ts*", MODE="0644"
KERNEL=="psaux", MODE="0644"
KERNEL=="js", MODE="0644"
KERNEL=="djs", MODE="0644"
# USB devices go in their own subdirectory
KERNEL=="hiddev*", NAME="usb/%k"
KERNEL=="legousbtower*", NAME="usb/%k"
KERNEL=="dabusb*", NAME="usb/%k"
SUBSYSTEMS=="usb", KERNEL=="lp[0-9]*", NAME="usb/%k"
# DRI devices are managed by the X server, so prevent udev from creating them
KERNEL=="card*", OPTIONS+="ignore_device"
# Video devices
KERNEL=="fb[0-9]*", GROUP="video"
KERNEL=="video[0-9]*", GROUP="video"
KERNEL=="radio[0-9]*", GROUP="video"
KERNEL=="vbi[0-9]*", GROUP="video"
KERNEL=="vtx[0-9]*", GROUP="video"
# DVB devices
SUBSYSTEM=="dvb", GROUP="video"
# Storage/memory devices
# override: make group-writable
SUBSYSTEM=="block", MODE="0660"
# dmsetup and lvm2 related programs create devicemapper devices so we prevent
# udev from creating them
KERNEL=="dm-*", OPTIONS+="ignore_device"
# Tape devices
# override all these
KERNEL=="ht[0-9]*", GROUP="tape"
KERNEL=="nht[0-9]*", GROUP="tape"
KERNEL=="pt[0-9]*", GROUP="tape"
KERNEL=="npt[0-9]*", GROUP="tape"
KERNEL=="st[0-9]*", GROUP="tape"
KERNEL=="nst[0-9]*", GROUP="tape"

View File

@ -0,0 +1,3 @@
# /etc/udev/rules.d/81-cdrom.rules: Set CD-ROM permissions.
ACTION=="add", SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", GROUP="cdrom"

199
udev-config/ChangeLog Normal file
View File

@ -0,0 +1,199 @@
2008-05-21 Bryan Kadzban <bryan@linuxfromscratch.org>
* 81-firmware.rules, doc/81-firmware.txt: Remove. This rule is
already handled by udev's 50-udev-default.rules file. The docs
can be added back later if needed.
* Makefile: Don't install the above deleted files.
* 55-lfs.rules: Remove the device-mapper rule, since the upstream
50-udev-default.rules file handles it properly.
2008-04-02 Bryan Kadzban <bryan@linuxfromscratch.org>
* Makefile: Make the package DESTDIR-friendly by installing the docs
into a fixed $(PREFIX)/share/doc/udev-config directory, instead of
trying to figure out what version of udev was just installed.
2007-10-30 Bryan Kadzban <bryan@linuxfromscratch.org>
* 55-lfs.rules: Since the dialout group was renamed to uucp, delete
the rules that override upstream's assignment of the dialout group.
Replace "dialout" with "uucp" on the remaining rules.
2007-10-29 Bryan Kadzban <bryan@linuxfromscratch.org>
* 51-lfs.rules: Move to 55-lfs.rules.
* doc/51-lfs.rules: Move to doc/55-lfs.rules.
2007-10-27 Bryan Kadzban <bryan@linuxfromscratch.org>
* 25-lfs.rules: Some rules in here are duplicates of rules from udev's
new 50-udev-defaults.rules file; remove them. Override permissions
where needed elsewhere (and document overrides in comments).
* 26-modprobe.rules: Provided by udev's 80-drivers.rules and built-in
modaliases for SCSI device-type modules in 2.6.22+ kernels; remove.
* 25-lfs.rules: Move to 51-lfs.rules.
* 27-firmware.rules: Move to 81-firmware.rules.
* 81-cdrom.rules: Move to 61-cdrom.rules.
* doc/25-lfs.txt: Rename to 51-lfs.txt.
* doc/26-modprobe.txt: Rename to 80-drivers.txt, and modify to reflect
the upstream rules.
* doc/27-firmware.txt: Rename to 81-firmware.txt.
* doc/81-cdrom.txt: Rename to 61-cdrom.txt.
* Makefile: Use new filenames.
2007-07-31 Dan Nicholson <dnicholson@linuxfromscratch.org>
* 25-lfs.rules: Changed the usb_device rule tto create /dev/bus/usb
nodes if the usb_device in 2.6.22+ kernels. The rule was also changed
to only trigger on "add" events. This change is not backwards
compatible with older kernels.
2007-06-12 Dan Nicholson <dnicholson@linuxfromscratch.org>
* 25-lfs.rules: Fix the CPUID nodes from cpu/%n/cpu to cpu/%n/cpuid,
which is what's expected in userspace apps such as x86info.
2007-06-08 Bryan Kadzban <bryan@linuxfromscratch.org>
* 25-lfs.rules: Add rules for DVB devices (create nodes in /dev/dvb/)
and floppies (create extra nodes based on CMOS type), copied from
the SuSE rules file. Thanks to Alexander Patrakov for the bugreport.
2007-03-04 Matthew Burgess <matthew@linuxfromscratch.org>
* Makefile: Use `udevd --version' to work out what version of Udev is
installed (requires Udev >= 106)
2007-01-02 Bryan Kadzban <bryan@linuxfromscratch.org>
* 25-lfs.rules: Change CPU devices (cpu, msr, microcode) to be in
/dev/cpu/ and /dev/cpu/N/, to match Documentation/devices.txt.
2006-10-21 Bryan Kadzban <bryan@linuxfromscratch.org>
* Makefile: Add a missing backslash in install-extra-doc.
* 05-udev-early.rules, 60-persistent-input.rules,
60-persistent-storage.rules, 95-udev-late.rules: Remove. The book
will install these files from udev's etc/udev/rules.d directory
instead.
* Makefile: Don't install these rules files after all. Also, only
install corresponding docs if requested.
2006-10-20 Bryan Kadzban <bryan@linuxfromscratch.org>
* Makefile: Added; contains targets to install rules and doc files.
From Dan Nicholson.
2006-10-14 Bryan Kadzban <bryan@linuxfromscratch.org>
* 05-udev-early.rules, 60-persistent-storage.rules: Sync up with
upstream sample rules files (from udev-102), except for one rule
which is more specific in our tarball and should probably be changed
upstream.
* doc/60-persistent-storage.txt: Modify to match the changes. Also
fix a couple typos.
* 25-lfs.rules: Remove duplicate rules (ttyS[0-9]* is also matched by
tty[BC...S...][0-9]*, and ttyUSB[0-9]* is in there twice).
* 25-lfs.rules: Fix Alsa device KERNEL rules. Udev uses shell-style
glob matching, not regular expressions, so the old rules would match
nonsense device names like hw0asdf and pcmDzxcv. As long as the first
character after the "fixed" portion was in the list, the rule would
match; it wouldn't apply the same character range to later characters.
* doc/25-lfs.txt: Add a note on interaction between permissions and
symlinks.
2006-10-09 Bryan Kadzban <bryan@linuxfromscrtach.org>
* 25-lfs.rules: Fix fb[0-9]* device permissions (should use the default
0660).
* doc/25-lfs.txt: Fix typo: /dev/ptmx is given mode 0666, not 0660.
Also tweak the comment about other TTY devices.
2006-10-04 Bryan Kadzban <bryan@linuxfromscratch.org>
* 05-udev-early.rules: Remove WAIT_FOR_SYSFS="bus" rule. With kernel
2.6.18, this rule is no longer required.
* doc/05-udev-early.txt: Update to match.
2006-09-28 Bryan Kadzban <bryan@linuxfromscratch.org>
* doc/60-persistent-storage.txt: Explain persistent storage rules, or
at least the parts I understand. (I don't use DASD or netblock or
several other supported configurations.)
* doc/81-cdrom.txt: Explain 81-cdrom.rules.
* doc/95-udev-late.txt: Explain 95-udev-late.rules. Documentation is
now finished.
2006-09-26 Bryan Kadzban <bryan@linuxfromscratch.org>
* doc/60-persistent-input.txt: Explain (in probably too much detail)
60-persistent-input.rules.
2006-09-24 Bryan Kadzban <bryan@linuxfromscratch.org>
* doc/05-udev-early.txt: Rewrap to fit 80 columns.
* doc/26-modprobe.txt: Explain 26-modprobe.rules, and modaliases.
* doc/27-firmware.txt: Explain 27-firmware.rules.
2006-09-24 Bryan Kadzban <bryan@linuxfromscratch.org>
* doc/25-lfs.txt: Explain 25-lfs.rules.
* 25-lfs.rules: Use SYMLINK+= for isdn/capi20 also.
2006-09-23 Bryan Kadzban <bryan@linuxfromscratch.org>
* doc: New subdirectory to contain documentation of rules
* doc/README: New file, top-level documentation
* doc/*.txt: New documentation files, one for each rules file. Only
05-udev-early.txt has anything in it.
2006-09-23 Bryan Kadzban <bryan@linuxfromscratch.org>
* 25-lfs.rules: Add "ignore_device" to OPTIONS for DRI devices, instead
of setting NAME to an empty string. This matches the way we ignore
devmapper / LVM devices.
2006-09-22 Bryan Kadzban <bryan@linuxfromscratch.org>
* 60-persistent-input.rules, 95-udev-late.rules: Import from udev-100.
60-persistent-input.rules creates persistent symlinks for input
devices, and 95-udev-late.rules enables udevmonitor.
* 60-persistent-storage.rules: Replace ATTRS{../removable} with just
ATTRS{removable} on partition devices. Replace ATTRS{removable}
with ATTR{removable} on whole-disk devices.
2006-09-20 Bryan Kadzban <bryan@linuxfromscratch.org>
* 05-early.rules: Missed a rule in the last change. ENV{PHYSDEVBUS}
in the rule that waits for the "bus" symlink should be replaced by
SUBSYSTEMS.
2006-09-20 Bryan Kadzban <bryan@linuxfromscratch.org>
* Adapted rules to the new matches used in udev-098 and above (e.g.,
SYSFS becomes ATTRS). Prevents warnings, and support for the old
matches will be removed eventually. These rules will not work with
udev-097 and before!
* Fixed several bugs in the rules left over from previous udev
versions (missing commas, overwriting user symlinks using ="..."
instead of +="...", and matching against "*" instead of "?*").
* Renamed CHANGELOG to ChangeLog, started using pseudo-GNU-format
entries. (See standards.info; search it for "changelog" to get
the general gist.)
dnicholson - Jul 14, 2006
* Fixed usbdev PROGRAM so that it works with the BusyBox sh. Thanks
to Anthony Wright.
n/a - Jul 12, 2006
* Added options so temporary nodes are not created with device-mapper
* Adapted cdrom rules to identify CD-ROM drives correctly by adding
SUBSYSTEM=="block" test.
* Added simple 81-cdrom.rules file to set cdrom group ownership
n/a - Jun 07, 2006
* Removed nvidia rules
* Removed bug reporting rule
* Moved Debian-based persistent CD-ROM rules to contrib
* Adapted firmware rule to udev-093
n/a - May 15, 2006
* Part one of 25-lfs.rules rewrite
* Some minor tweaking of the layout
n/a - May 12, 2006
* Initial import of the udev-config directory.
* Reorganized and modularized the rules files.
* Added explanatory comments

42
udev-config/Makefile Normal file
View File

@ -0,0 +1,42 @@
# Makefile to install udev rules and documentation
PREFIX = /usr
RULES_DIR = /etc/udev/rules.d
INSTALL = install
INSTALL_DATA = $(INSTALL) -m644
RULES_FILES = \
55-lfs.rules \
61-cdrom.rules
DOC_FILES = $(RULES_FILES:.rules=.txt)
EXTRA_DOC_FILES = \
05-udev-early.txt \
60-persistent-input.txt \
60-persistent-storage.txt \
80-drivers.txt \
95-udev-late.txt
# Location to install the docs
DOC_DIR = $(PREFIX)/share/doc/udev-config
all:
install: install-rules
install-rules:
$(INSTALL) -d $(DESTDIR)$(RULES_DIR)
for rule in $(RULES_FILES); do \
$(INSTALL_DATA) $$rule $(DESTDIR)$(RULES_DIR) || exit 1; \
done;
install-doc:
$(INSTALL) -d $(DESTDIR)$(DOC_DIR)
for doc in $(DOC_FILES); do \
$(INSTALL_DATA) doc/$$doc $(DESTDIR)$(DOC_DIR) || exit 1; \
done
install-extra-doc:
$(INSTALL) -d $(DESTDIR)$(DOC_DIR)
for doc in $(EXTRA_DOC_FILES); do \
$(INSTALL_DATA) doc/$$doc $(DESTDIR)$(DOC_DIR) || exit 1; \
done

View File

@ -0,0 +1,3 @@
# /etc/udev/rules.d/81-cdrom.rules: Set CD-ROM permissions and get device capabilities
ACTION=="add", SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", IMPORT{program}="cdrom_id --export $tempnode", GROUP="cdrom"

View File

@ -0,0 +1,12 @@
# /etc/udev/rules.d/83-cdrom-symlinks.rules: Determine CD drive capability.
ACTION!="add", GOTO="cd_aliases_generator_end"
SUBSYSTEM!="block", GOTO="cd_aliases_generator_end"
ENV{GENERATED}=="?*", GOTO="cd_aliases_generator_end"
# Fail the uevent if the autogenerated rules cannot be saved
ENV{ID_CDROM}=="?*", PROGRAM="/bin/grep -c ' / [^[:space:]]* rw' /proc/mounts", RESULT!="2", RUN+="/bin/false", GOTO="cd_aliases_generator_end"
ENV{ID_CDROM}=="?*", PROGRAM="write_cd_aliases", SYMLINK+="%c"
LABEL="cd_aliases_generator_end"

View File

@ -0,0 +1,111 @@
#!/bin/sh -e
RULES_FILE="/etc/udev/rules.d/82-persistent-cd.rules"
##############################################################################
lock_rules_file() {
RULES_LOCK="/dev/.udev/.lock-${RULES_FILE##*/}"
retry=30
while ! mkdir $RULES_LOCK 2> /dev/null; do
if [ $retry -eq 0 ]; then
echo "Cannot lock $RULES_FILE!" >&2
exit 2
fi
sleep 1
retry=$(($retry - 1))
done
}
unlock_rules_file() {
rmdir $RULES_LOCK || true
}
##############################################################################
find_next_available() {
# use echo to convert newlines to spaces
local links=`echo $(find_all_symlinks $1)`
local basename=${links%%[ 0-9]*}
local max=-1
for name in $links; do
local num=${name#$basename}
[ "$num" ] || num=0
[ $num -gt $max ] && max=$num
done
max=$(($max + 1))
# "name0" actually is just "name"
[ $max -eq 0 ] && return
echo "$max"
}
find_all_symlinks() {
local linkre="$1"
local match="$2"
[ -e $RULES_FILE ] || return
local search='.*[[:space:],]SYMLINK+="\('"$linkre"'\)"[[:space:]]*\(,.*\|\\\|\)$'
sed -n -e "${match}s/${search}/\1/p" $RULES_FILE
}
write_rule() {
local match="$1"
local link="$2"
local comment="$3"
[ -e "$RULES_FILE" ] || PRINT_HEADER=1
{
if [ "$PRINT_HEADER" ]; then
PRINT_HEADER=
echo "# This file was automatically generated by the $0"
echo "# program, probably run by the 83-cdrom.rules rules file."
echo "#"
echo "# You can modify it, as long as you keep each rule on a single line"
echo "# and set the \$GENERATED variable."
echo ""
fi
[ "$comment" ] && echo "# $comment"
echo "ACTION==\"add\", SUBSYSTEM==\"block\", $match, ENV{ID_CDROM}==\"1\", SYMLINK+=\"$link\", ENV{GENERATED}=\"1\""
} >> $RULES_FILE
SYMLINKS="$SYMLINKS $link"
}
##############################################################################
if [ -z "$DEVPATH" ]; then
echo "Missing \$DEVPATH." >&2
exit 1
fi
if [ -z "$ID_CDROM" ]; then
echo "$DEVPATH is not a CD reader." >&2
exit 1
fi
# Prevent parallel processes from modifying the file at the same time.
lock_rules_file
link_num=$(find_next_available 'cdrom[0-9]*')
#match="ENV{ID_PATH}==\"$ID_PATH\""
#kernel=${DEVPATH##*/}
#match="KERNEL==\"$kernel\""
id=${PHYSDEVPATH##*/}
match="BUS==\"$PHYSDEVBUS\", ID==\"$id\""
comment="$ID_MODEL ($ID_PATH)"
write_rule "$match" "cdrom$link_num" "$comment"
[ "$ID_CDROM_CD_RW" ] && write_rule "$match" "cdrw$link_num"
[ "$ID_CDROM_DVD" ] && write_rule "$match" "dvd$link_num"
[ "$ID_CDROM_DVD_RW" ] && write_rule "$match" "dvdrw$link_num"
unlock_rules_file
echo $SYMLINKS
exit 0

View File

@ -0,0 +1,33 @@
Purpose of rules file:
The kernel does not always fully populate a given kobject's attributes before
sending the uevent for that kobject. This means that a given sysfs directory
may not have all the required files in it (each directory corresponds to a
kobject, and each file corresponds to an attribute).
Therefore, we must sometimes wait for attributes to show up when devices are
discovered. This is accomplished by udev's WAIT_FOR_SYSFS rule types.
Description of rules:
All rules in this file match ACTION="add", because none of them apply when
devices are being removed.
SUBSYSTEM is the kernel subsystem that the device uses. Current kernels have
some issues with SCSI device attributes being created too late. For any device
with a SUBSYSTEM of scsi, we must wait for the ioerr_cnt attribute. (This is
the last attribute created for SCSI devices, so when this attribute appears,
the kobject is fully populated.)
It is also possible to use SUBSYSTEMS in Udev rules. Using SUBSYSTEMS would
cause Udev to search up the device tree for a matching SUBSYSTEM value. (Note
that "the device tree" is not necessarily the same as the path under /sys (the
DEVPATH). Rather, "up the device tree" is the path followed by udevinfo when
it is given the argument "-a".)
We do not use SUBSYSTEMS in this rule, because we only care about the SUBSYSTEM
of the kobject in question. We don't care about devices that are children of
SCSI devices, only the SCSI device itself. We will use SUBSYSTEMS in later
rules, though.

View File

@ -0,0 +1,94 @@
Purpose of rules file:
This is the core rules file for Udev on LFS. If these rules were not included,
most devices would either only work for root, or would not work at all.
Description of rules:
By default, Udev creates device nodes with UID 0, GID 0, and permissions 0660,
and in one flat directory structure with all nodes in /dev. This does not
always work well.
KERNEL=="ptmx"
Any uevent generated by the kernel with a name matching "ptmx" will match this
rule. Note that the matching done by Udev is shell-style; these are not regex
matches. For the ptmx device, we first change the permisions, by assigning to
the MODE value:
KERNEL=="ptmx", MODE="0666"
We also assign a different GID to /dev/ptmx (also all other TTY devices), by
assigning to the GROUP value:
KERNEL=="ptmx", MODE="0666", "GROUP="tty"
There are also devices that should not be in /dev, because historically they
have been created in subdirectories instead. For instance, all Alsa devices
have traditionally been put into the /dev/snd subdirectory:
KERNEL=="controlC[0-9]*", <...>, NAME="snd/%k"
"%k" expands into "the original value of KERNEL" (note: not the pattern that was
matched against). This type of rule puts any matching device into the snd/
subdirectory.
Sometimes we need to move devices based on more than just their name. For
example, USB printer devices need to be moved to /dev/usb/lpX, but we can't
match only "lp[0-9]*", because that would also match parallel port printers.
So we match both KERNEL and SUBSYSTEMS in this case, to move USB printers only.
Some devices also commonly have symlinks pointing to them -- for example,
/dev/mouse is usually a symlink to /dev/input/mice. We acheive this by
assigning to the SYMLINK value. But note that SYMLINK can store multiple values
(because each device node could have multiple symlinks pointing to it), so we
need to add to the list of symlinks, not overwrite the whole list:
KERNEL=="mice", <...>, SYMLINK+="mouse"
If we needed to add multiple symlinks, they would be space-separated inside the
double quotes.
Of course, symlinks, permissions, and device names can all be combined in a
rule if needed. But note that if you combine permissions and symlinks, or if
you combine GROUP and symlinks, the permissions of the symlink will not be
modified, only those of the target device. (This is because the kernel does
not pay any attention to the permissions on symlinks, only the permissions on
their targets, and there's no reason to change something that won't be used.)
Finally, we have this rule:
SUBSYSTEM=="usb_device", PROGRAM="/bin/sh -c 'X=%k; X=$${X#usbdev}; B=$${X%%%%.*} D=$${X#*.}; echo bus/usb/$$B/$$D'", NAME="%c"
This rule matches any device under the SUBSYSTEM of usb_device. (All devices
that were traditionally created under /proc/bus/usb/ use this subsystem.) We
tell Udev to run the specified PROGRAM; Udev will save the output of this
program (it will be available under %c later).
The program itself is a shell that starts by setting the variable X to the
original kernel name (which is "usbdevB.D" for these devices, where B and D are
the bus and device numbers of the USB device). Then, the rule re-sets X to the
value of X with the string "usbdev" removed from the start. So now, X has the
value "B.D". Then, the rule sets B to the value of X after a period, and all
characters following it, have been removed from the end; this sets B to just
the string "B" (just the bus number of the USB device). Then, the rule sets D
to the value of X after a period, and all characters before it, have been
removed from the beginning; this sets D to just the string "D" (just the device
number).
Then, the rule echoes "bus/usb/$B/$D" (bus/usb/bus-number/device-number), so
Udev will capture that value. The rule sets NAME="%c" to put the device node
at /dev/bus/usb/bus-number/device-number. (This is the same layout that the
/proc/bus/usb/ devices used.)
Most of the doubled characters in this rule are doubled so that Udev does not
interpret them. The rule looks all the more confusing because of this method
of escaping special characters.
A final word of caution: Any particular rule must be written on one line, and a
comma must separate each part of the rule.

View File

@ -0,0 +1,86 @@
Purpose of rules file:
This rules file provides nonvolatile, unique names (in the form of symlinks)
for input devices that cooperate.
Description of rules:
This file starts off with a few rules that make Udev skip the entire file if
the current uevent is not input related. If ACTION is not "add", or SUBSYSTEM
is not "input", or KERNEL (the device node) matches "input[0-9]*", then Udev
will GOTO the LABEL named "persistent_input_end", which is the last rule in
this file. (input[0-9]* uevents are skipped because they do not create device
nodes.)
This type of "skip this list of rules if X" operation is done in both the
persistent input and persistent storage rules files. The reason is efficiency
-- if Udev had to go run the usb_id and/or path_id programs for non-input and
non-storage rules, those rules would take much longer to process for no good
reason.
First in this file is a set of rules for by-ID style symlinks. These attempt
to uniquely identify a device based on its serial number, but there are some
issues with this. Many USB manufacturers do not provide a unique serial number
for each device -- for instance, my Microsoft Intellimouse Optical has a USB
serial number of "Microsoft_Microsoft_IntelliMouse_Optical". This kind of
nonsensical "serial number" means that if you plug in two Intellimouse Optical
devices, they will both get the same by-id symlink, and the device that the
symlink points to will be random. This defeats the purpose of by-ID symlinks.
(However, I believe this behavior is technically valid according to the USB
standard. I believe it is not recommended, though.)
Anyway, first in the by-ID rules, we have a rule that runs for any (input)
device hanging anywhere off a USB bus. It uses the IMPORT{program} option to
run the "/lib/udev/usb_id -x" program. usb_id looks at the environment to find
out which device to look at, generates a list of environment-variable VAR=value
pairs, and prints them. Udev stores this output away while the process is
running. After the process exits, Udev modifies the current environment to
include the VARs that usb_id printed. (It assigns the "value"s that usb_id
printed to each of those VARs.) Specifically, usb_id prints ID_VENDOR,
ID_MODEL, ID_REVISION, ID_SERIAL, ID_TYPE, and ID_BUS (at least in the case of
the aforementioned USB optical mouse). These variable names will all be set in
the environment.
Then, we have a set of rules to set ID_CLASS for various types of devices. The
rules first check for a "usb"-bus device that has a "bInterfaceClass" of 03 and
a "bInterfaceProtocol" of 01. If the interface class is 03, this is an HID
device. If the protocol is 01, it's a keyboard device. So we set ID_CLASS to
"kbd". The next rule checks whether the interface protocol is 02, and if so,
sets ID_CLASS to "mouse" (HID devices with a protocol of 02 are mice).
Any input device that the "pcspkr" driver claims must be a speaker. Any input
device that the "atkbd" driver claims must be a keyboard. Any input device
that the "psmouse" driver claims must be a mouse. If there's a sysfs attribute
named "name", whose contents contain "dvb", "DVB", or " IR ", then we set
ID_CLASS to "ir".
Then, we have a rule to search the tree and find the first parent that has a
modalias. If that modalias matches the big long ugly string in the rules file,
we assume this is a joystick device, and set ID_CLASS appropriately. (This
parent should be the kobject for the joystick device itself. The reason we
search the tree is that the current uevent is for a device node, not the
physical joystick device.)
Once the ID_CLASS variable is set properly, we have one more modification to
perform: if the ID_SERIAL variable was not set at all by the usb_id program, we
set it to "noserial".
Now that all the environment variables are set up properly, we start generating
the by-ID symlinks in /dev/input/by-id/. If the current device node's name
starts with "event", we add "event" into the symlink name. Otherwise, we don't
add anything for mice. (Other device types don't get a persistent by-ID
symlink.)
Next, we create by-path symlinks. The /lib/udev/path_id program takes the path
of the device as an argument, and prints out "ID_PATH=string", where "string"
is the "shortest physical path" to the device. We import this value into the
environment.
If the path is non-empty, and the device node name starts with "mouse" or
"event", we add a by-path symlink based on the path and the device class (and
we also add "event" if it's an event device). This symlink should be stable as
long as the device never moves to a different port.

View File

@ -0,0 +1,95 @@
Purpose of rules file:
This rules file provides nonvolatile, unique names (in the form of symlinks)
for various types of storage devices -- both IDE/ATA and SCSI.
Description of rules:
First, similar to the 60-persistent-input.rules file, we skip the entire file
for uevents that this rules file should not apply to, as an optimization. The
file does not apply to removal uevents or non-block devices. It does not apply
to ramdisks, loopback-mount devices, floppy disks, netblock devices, or device-
mapper devices. It also should not apply to removable devices (that is, non-
partition devices with attributes named "removable" with the value "1", or
partition devices whose parents have "removable" set to "1" -- partition
kobjects don't have the "removable" attribute, only whole-disk kobjects do).
For partition devices, we use the IMPORT{parent} option to pull in all the
environment variables that get set for the parent device. (The parent of a
partition device is the containing whole-disk device.) The IMPORT{parent}
option is documented in the udev(7) manpage, but basically the value that we
assign is used as a filter of environment variable names to import.
Now, we start with rules to create by-ID symlinks (similar to the by-ID links
created for input devices). For hd* whole-disk devices (they're IDE/ATA, since
they start with hd), we run the ata_id program in --export mode. The ata_id
program requires a device node to be passed, so we also use the $tempnode Udev
variable -- this causes Udev to create a temporary device node somewhere and
substitute its name where $tempnode appears in the program command line.
The ata_id program, in --export mode, prints several ID_* values. If we're
looking at a whole-disk device, and if ID_SERIAL is among those, we add a
symlink containing the device's ID_MODEL and ID_SERIAL values. If we're
looking at a partition device, we create an ID_MODEL- and ID_SERIAL-based
symlink also, but we add -partX to the end of the link name (where X is the
partition number).
For SCSI devices, we first make some modifications to the environment. If the
device's kobject has a parent with a non-empty "ieee1394_id" attribute, then
the device is Firewire, so we set the ID_SERIAL environment variable to the
value of that attribute, and we set ID_BUS to "ieee1394". Now, if ID_SERIAL is
not set, we run usb_id, which (if this is a USB storage device) will print
various values. If ID_SERIAL is still unset, we run scsi_id with a set of
parameters designed to get an ID_SERIAL by querying the device itself. If that
still fails, we try running scsi_id in a mode that prints the information even
if the disk doesn't support so-called "vital product data" pages. If the
uevent is for a DASD device, we run dasd_id.
If one of these *_id programs gave us an ID_SERIAL, then for whole-disk devices
we create a by-ID symlink using the ID_BUS and ID_SERIAL. For partition
devices, we create a by-ID symlink that has the same form except we add -partX
to the end (just like for IDE/ATA devices).
Now we have some rules to create by-path persistent symlinks. We start by
running the path_id program on the DEVPATH (%p) value. For whole-disk devices
and SCSI ROM type devices, we create a symlink directly, using the environment
variable ID_PATH, under the /dev/disk/by-path directory. But for SCSI tape
devices, we create a by-path symlink in the /dev/tape/by-path directory (we
base the symlink on the same information, though: the ID_PATH value printed by
path_id). Now, for both SCSI ROM and SCSI tape devices, we skip everything
that's left in the rules file (this is another optimization: neither SCSI ROM
nor SCSI tape devices have UUIDs, labels, or EDD information).
For partition devices, we now create a by-path symlink of the same form as the
other partition device persistent symlinks (that is, with the same name as the
parent device, but with -partX added). We know that ID_PATH is set whenever it
applies, because we ran the path_id program on the parent device, and we did an
IMPORT{parent} on ID_* earlier in the rules file.
Now we create by-label and by-uuid symlinks. These use properties of various
filesystems to generate a persistent name for a partition. For instance, if
you use the ext2 filesystem, you can use e2label to assign a label, and mke2fs
assigns a UUID when the filesystem is created. MS-DOS compatible filesystems
also assign a "UUID" (actually it's just a serial number, created based on the
date and time the partition was formatted, so it is not unique), which these
rules will also use. But for removable partitions, we skip the rules (for the
same reason as we skipped them above for removable disks).
We run the vol_id program to get ID_FS_USAGE, ID_FS_UUID, and ID_FS_LABEL_SAFE
values. (vol_id supports other values as well, but we do not use them here.)
ID_FS_USAGE corresponds to the way the filesystem is supposed to be used; if it
gets set to "filesystem", "other", or "crypto", we create a symlink. If
ID_FS_UUID is set, we use it in a by-uuid symlink. If ID_FS_LABEL_SAFE is set,
we use it in a by-label symlink.
Finally, we create EDD-based symlinks in the by-id directory. For whole-disk
devices, we run edd_id to get the EDD-generated ID string. (For partition
devices, we import this string from the parent.) If edd_id yields an ID_EDD
value, we use it in a symlink, for both whole disks and partitions.
The last rule in the file is merely a LABEL that various other rules use to
bypass the file (or the rest of the file) when needed.

View File

@ -0,0 +1,16 @@
Purpose of rules file:
This file re-assigns CD-ROM type devices to the "cdrom" group.
Description of rules:
There is only one rule here. It depends on the 60-persistent-storage file,
though, because it requires the ID_TYPE environment variable to be set properly
for CD devices. Normally the rules in the 60-persistent-storage.rules file
will run the correct *_id programs to do this properly.
If ID_TYPE is "cd", and this is a block device, and it's an add event, then we
assign the device to the "cdrom" group. Simple, once the *_id programs have
all been run.

View File

@ -0,0 +1,69 @@
Purpose of rules file:
The rules in this file allow Udev to fully replace the old /sbin/hotplug
script. They automatically load kernel modules as devices are discovered.
Description of rules:
All rules in this file match ACTION=="add", so they only run when devices are
being added.
ENV{MODALIAS} is the value of the environment variable named MODALIAS. This
environment variable is sent by the kernel when it sends a uevent for any
device that has a modalias. Modaliases are strings that can be used to load
the appropriate kernel module driver.
Generally a modalias will contain information like vendor ID, device ID, and
possibly other IDs depending on the bus the device is connected to. (USB, for
instance, has the concept of a "device class" and a "device interface", which
are basically just ways to standardize the USB protocol for various types of
devices. This is what allows a single kernel module such as hid.ko to drive
many different vendors' USB input devices: all devices that support the USB
HID interface expose the HID interface number in their modalias, and so the
hid.ko driver can be loaded for each device. When it loads, hid.ko attaches
to the HID interface and does whatever is needed to work with each device.)
Kernel modules that drive hardware expose a list of modaliases. These
modaliases are matched against the device modalias by /sbin/modprobe (after
shell-style expansion), with the help of /sbin/depmod's modules.alias file.
The upshot of all this is, you can tell Udev to run "/sbin/modprobe modalias",
and it will load the module that claims it can drive the "modalias" device.
The rule that does this inspects ENV{MODALIAS} to ensure it is not empty. It
does this by comparing it to "?*" -- inside a match, "*" would match *any*
string, including the empty string, so to ensure MODALIAS is not empty, we need
to match against "?*" instead. ("?" matches any one character.)
The Udev RUN+="" option adds a program to run when the rule matches. In this
case, we tell Udev to run "/sbin/modprobe $env{MODALIAS}". Note that Udev does
not do path searches; if the executable is not specified with a fully-qualified
path, it *must* be located under the /lib/udev directory. If it is not, you
*must* specify a fully-qualified path, as we do here. Also, "$env{string}" is
replaced by the value of the environment variable "string" when the command
runs, so this adds the modalias to the modprobe command. The modprobe program
will do the rest. Finally, the {ignore_error} option is added to the RUN key;
this prevents Udev from failing the uevent if the modprobe command fails. (The
modprobe command will fail when run during cold-plugging, if the driver was
configured into the kernel instead of as a module, for instance.)
There is still one feature of the old hotplug shell-script system that Udev
cannot provide: blacklisting modules from being auto-loaded. To accomplish
this, we must use module-init-tools. In /etc/modprobe.conf, if you use the
"blacklist <module-name>" syntax, modprobe will not load <module-name> under
any name except its real module name. Any modaliases exposed by that module
will not be honored.
There are also rules in this file for various other types of driver loading.
PNP-BIOS devices, for instance, expose a list of PNP IDs in their sysfs "id"
attribute, instead of exposing a single MODALIAS, so one rule loops through
each ID and tries to load the appropriate module. Several other types of
devices require an extra module before they will work properly; one example
of this is IDE tapes, which require the ide-scsi module. Finally, whenever
any SCSI device is found, the file uses the TEST key to check whether the
/sys/module/sg directory exists. If not, then the "sg" module -- the SCSI
generic driver -- is loaded. (That driver creates the module/sg directory,
so the module/sg test is just to see whether the driver has already been
loaded.)

View File

@ -0,0 +1,18 @@
Purpose of rules file:
Sends all uevents to a Unix-domain socket, where they can be monitored by other
programs.
Description of rules:
There is only one rule, which matches all uevents. It uses Udev's RUN key to
specify a socket to send each uevent to. Normally RUN is used to start up a
process, but if the pathname starts with "socket:", Udev instead interprets
the rest of the name as a Unix-domain socket to send the uevent to. In this
case, we send send the uevent to the socket named /org/kernel/udev/monitor,
which is created by the udevmonitor program. Udevmonitor is used to watch
uevents as they come to Udev. Its only purpose is for debugging, but sending
the uevent to a socket that doesn't exist is a very cheap operation, so we
enable this rule for all uevents.

6
udev-config/doc/README Normal file
View File

@ -0,0 +1,6 @@
This directory contains documentation for each rule file used in LFS.
Each .rules file should contain a corresponding .txt file in this directory,
which explains both the overall purpose of the rules file, and each type of
rule contained therein.