Difference between revisions of "Clean Core"

From LinuxMCE
Jump to: navigation, search
(Personal Notes: almost halfway there I think (hope))
 
(22 intermediate revisions by 8 users not shown)
Line 1: Line 1:
 +
{{versioninfo|710Status=Relevant to 0710 and older|710UpdatedDate=2nd June 2011|710UpdatedBy=purps|810Status=Not applicable|810UpdatedDate=2nd June 2011|810UpdatedBy=purps|1004Status=Not applicable|1004UpdatedDate=3rd August 2011|1004UpdatedBy=foxi352}}
 +
[[Category:LinuxMCE Configuration]]
 +
{| align="right"
 +
  | __TOC__
 +
  |}
 +
 +
 
== Introduction ==
 
== Introduction ==
This page is meant to document the efforts to turn the LMCE core into one or more "services" that are automaticly started at boot time.  In other words we would like to get rid of the Launch Manager application, and it's dependency uppon a graphic environment, at least for starting a (dedicated) core machine.
 
  
Due to the lack of documentation we will have to figure a lot of things out on our ownPlease don't be shy to add any related knowledge you have, we don't really know what we're doing, so why should you?  At least by adding stuff here we'll be able to build uppon each others experience without having to reverse-engineer the wheel every time.  And who knows, one day we might even achieve our common goal.
+
This page is meant to document the efforts to turn the LinuxMCE core into one or more Linux "services" that are automatically started at boot timeIn other words, we would like to be able to boot a dedicated LinuxMCE Core server without using the Launch Manager application and without the dependency upon a graphic environment.
  
== Known Information ==
+
Please don't be shy to add any related knowledge you have.
* In [http://forum.linuxmce.com/index.php?topic=1766.0 Starting CORE software automatically. Beta1.1] bobpaul wrote on June 24, 2007 [http://forum.linuxmce.com/index.php?topic=1766.msg8377#msg8377]:
+
you'll find all of the LinuxMCE scripts in /usr/pluto/bin.
+
Two very interesting scripts are Start_X.sh (which I assume you already found?) and StartCoreServices.sh
+
+
My guess would be you could disable the Start_X script.
+
This can be done from the web interface and goto Advanced: Software: Boot Sequence.
+
Untick the box for Start_X.
+
Then, manually launch /usr/pluto/bin/StartCoreServices.sh from some init script.
+
I think that should do what you originally asked for, but I haven't tried it myself.
+
  
* A request for more information on the forum was posted by KingCrab: [http://forum.linuxmce.com/index.php?topic=1894.msg8605#msg8605 How does a core system start?].  If you don't want to sign up for the wiki or feel uncomfortable editing this page you could leave a message there.
+
{{p}}
  
* More to come...
+
== Runlevels ==
  
 +
Runlevels are an easy way to change how the system boots.  LinuxMCE (as Kubuntu) uses runlevel 2 for normal operation (depending on the selections you made during installation) and runlevel 1 is used for ''rescue mode''.  The runlevels 0 and 6 are used for doing a ''shutdown'' or a ''reboot''.  Which leaves the runlevels 3, 4 and 5 free for us to experiment with.
  
== Version Specific Notes ==
+
As an example we will be setting up the following scheme in this document:
This seems like a good place to add information specificly related to a certain version of LMCE.
+
# rescue  (as it is now)
 +
# KDE  (as installed by Kubuntu, like '''mainly-PC''' is now)
 +
# Core  (as in textmode, ideal for headless systems)
 +
# Core + KDE  (best of both worlds)
 +
# LaunchManager  (as the classic '''dedicated-MC''' setup is now)
  
=== LMCE 1.1 RC1 ===
+
Of course you can just adapt the example to your specific wishes or needs.
The current test version.
+
  
== Personal Notes ==
+
{{p}}
So... what did you try, and how did it work out?
+
  
----
+
=== Starting another runlevel ===
  
I've tried the way bobpaul described in his post, but unfortunately working with the Start_X box didn't change anything for me. Then I tried it the "old linux way" ;-) I removed the S99kdm script from /etc/rc2.d, giving me a text login at bootup. Next step was to modify the /etc/rc.local by adding /usr/pluto/bin/StartCoreServices.sh. After next bootup the login web page was up again. This is the point I stopped testing and tried to get more information on startup before moving on...
+
If you just want to start a different runlevel once without modifying your startup scripts to much (as described below) You can simply boot into ''rescue mode'' by pressing [Esc] if grub tells you to and selecting it from the boot menu. That should boot up to a text console in single user mode, from there you can easily switch to another runlevel, for example runlevel 3:
(done with beta2 and rc1)
+
telinit 3
  
-- [[User:KingCrab|KingCrab]]
+
The "runlevel" command will show you the previous and current runlevel. 
  
----
+
=== Setting up the runlevels ===
  
I looked on a dedicated core, but the Start_X box was already unticked in the web interface for the core. So I looked at "/etc/rc2.d/S99kdm" which turned out to be a symlink to a non-existant file.  In the end I just rebooted to "rescue" mode and launched "/usr/pluto/bin/StartCoreServices.sh" by hand.  After taking controll with "screen -r" I discover that the DCERouter is unable to connect to the MySQL server.
+
Traditionally the runlevels are controlled by manipulating a set of "symbolic links" in the ''/etc/rc'''X'''.d/'' directory, where '''X''' is the runlevel (0-6,S), however the Kubuntu system uses upstart, which has other ways as well.
  
I reboot the machine to single usermode again to have a clean starting point, this time I decide to change to runlevel 3 with the command "telinit 3".  LinuxMCE is only fully started in runlevel 2 so there are no screen sessions to attach to except for the "VoiceMailMonitor" one (obviously started by /etc/rc3.d/S99voiceMailMonitor).  After launching "/usr/pluto/bin/StartCoreServices.sh" by hand again I see 2 additional screen sessions for "discovery" and "DCERouter", none of the sessions seem to show errors.  The script itself however ended with the message "ERROR: Couldn't attach to DCOP server".
+
When you are done with this you can switch to a different runlevel using one of the methods described elsewhere in this document, be sure to reboot in order to make a clean start.
  
The web-admin appears to fully work, and so does booting a diskless Media Director.  Storage might not fully work yet though, as there are still 2 pluto related scripts (symlinked) in "/etc/rc2.d" that I haven't started yet, "StorageDevices_SambaRadar.sh" and "StorageDevices_StatusRadar.sh" but I'm not entirely sure if they normally even get started since they don't have the usual S## prefix.
+
Before starting it is always wise to make a backup of a few things, just in case:
 +
tar cjvf ~/backup-`date '+%Y%m%d:%H%M'`.tar.bz2 /etc/init.d /etc/rc*.d
  
I tested this using a dedicated core installation of LMCE-1.1B2 running under VMWare as described in: [[Testing with VMWare]], which I still had lying around.
+
{{p}}
  
-- [[User:Zaerc|Zaerc]] 15:53, 2 August 2007 (MST)
+
==== Preparation ====
  
----
+
Here are additional scripts needed to start the core devices, normally these task are performed by the launch-manager and it's startup script.
  
Not entirely unrelated, but I stumbled onto this neat trick. If you have installed your LinuxMCE hybrid as a "A dedicated LMCE System" so that it starts automaticly after boot you can switch to starting LinuxMCE from the desktop icon (and back) with these instructionsFor this the otherwise unused runlevel 3 is usedBasicly this hack just activates the backup-config of KDE in another runlevel, and then sets that runlevel as the default, this way it's easy to switch back and forth.
+
First a script for init (upstart):
 +
cd /
 +
cat >etc/init.d/core <<"EOF"
 +
#!/bin/sh
 +
 +
case "$1" in
 +
        start)
 +
                /usr/pluto/bin/startCore.sh
 +
                ;;
 +
        stop)
 +
   
 +
                /usr/pluto/bin/StopCoreServices.sh
 +
                ;;
 +
   
 +
        *)
 +
                echo "Usage: /etc/init.d/core {start|stop}"
 +
                exit 1
 +
                ;;
 +
esac
 +
 +
exit 0
 +
EOF
 +
chmod +x etc/init.d/core
 +
  
'''These instructions require root privileges!'''
+
Which calls a script that determines the device number of the core device:
# Change the ''/etc/rc3.d/S99kdm'' symlink to point at ''../init.d/kdm.saved''.
+
# Create an ''/etc/inittab'' configuration file to start runlevel 3 by default (there should be none to start with, but you may want to check to be certain, if it already exists you can skip this step and edit it as described below).
+
# Reboot the machine.
+
  
  ln -sfv ../init.d/kdm.saved /etc/rc3.d/S99kdm
+
  cd /
 +
cat >usr/pluto/bin/startCore.sh <<"EOF"
 +
#!/bin/sh
 +
 +
BASEDIR=/usr/pluto/bin
 +
DeviceTemplate_Core=7
 +
 +
source $BASEDIR/SQL_Ops.sh
 +
 +
$BASEDIR/Config_Device_Changes.sh
 +
$BASEDIR/Start_OrbiterGen.sh
 +
$BASEDIR/UpdateMediaDaemonControl.sh -enable
 +
 +
$BASEDIR/Start_DCERouter.sh
 +
 +
$BASEDIR/checkforRaids.sh
 +
$BASEDIR/UpdateAvailableSerialPorts.sh
 +
 +
QUERY="SELECT PK_Device FROM Device JOIN DeviceTemplate ON Device.FK_DeviceTemplate=DeviceTemplate.PK_DeviceTemplate WHERE PK_DeviceTemplate=${DeviceTemplate_Core}"
 +
RESULT=$(RunSQL "$QUERY")
 +
for ROW in $RESULT
 +
do
 +
        CoreDev=$(Field 1 "$ROW")
 +
        $BASEDIR/startDevices.sh $CoreDev
 +
done
 +
 +
EOF
 +
chmod +x usr/pluto/bin/startCore.sh
 +
  
  cat >/etc/inittab << EOF
+
And in turn calls this script to start the whole device family, excluding any media directors:
  # WARNING: Do NOT set the default runlevel to 0 (shutdown) or 6 (reboot).
+
 
  #id:2:initdefault: # LinuxMCE
+
cd /
id:3:initdefault: # KDE
+
  cat >usr/pluto/bin/startDevices.sh <<"EOF"
  #id:4:initdefault: # Unused
+
  #!/bin/sh
  #id:5:initdefault: # Unused
+
 +
 +
BASEDIR=/usr/pluto/bin
 +
DeviceTemplate_MeDi=28
 +
 +
source $BASEDIR/SQL_Ops.sh
 +
 +
 +
DEVICES=$*
 +
 +
 +
for DEVICE in $DEVICES
 +
do
 +
 +
 +
        QUERY="SELECT ImplementsDCE, IsPlugin, Disabled, IF(PK_DeviceTemplate=${DeviceTemplate_MeDi},1,0) AS IsMeDi, REPLACE(DeviceTemplate.Description,' ','_') AS Description, CommandLine FROM Device JOIN DeviceTemplate ON Device.FK_DeviceTemplate=DeviceTemplate.PK_DeviceTemplate WHERE PK_Device=${DEVICE}"
 +
   
 +
        RESULT=$(RunSQL "$QUERY")
 +
        for ROW in $RESULT
 +
        do
 +
                IMPLEMENTSDCE=$(Field 1 "$ROW")
 +
                ISPLUGIN=$(Field 2 "$ROW")
 +
                DISABLED=$(Field 3 "$ROW")
 +
                ISMEDI=$(Field 4 "$ROW")
 +
                DESCRIPTION=$(Field 5 "$ROW")
 +
                COMMANDLINE=$(Field 6 "$ROW")
 +
 +
  #             echo $RESULT, $IMPLEMENTSDCE $ISPLUGIN $DISABLED $ISMEDI $DESCRIPTION \"$COMMANDLINE\"
 +
 +
                if [ "$ISMEDI" != "0" ]
 +
                then
 +
                        echo "Device $DEVICE ($DESCRIPTION) is a Media Director"
 +
                        continue
 +
                fi
 +
 +
 +
 +
                if [ "$IMPLEMENTSDCE" = "0" ]
 +
                then
 +
 +
                        echo "Device $DEVICE ($DESCRIPTION) no DCE, going after the children"
 +
 +
                        CHILDREN=""
 +
                        QUERY="SELECT PK_Device FROM Device WHERE FK_Device_ControlledVia=$DEVICE"
 +
                        RESULT=$(RunSQL "$QUERY")
 +
                        for ROW in $RESULT
 +
                        do
 +
                                CHILD=$(Field 1 "$ROW")
 +
                                CHILDREN="$CHILDREN $CHILD"
 +
                        done
 +
 +
 +
                        if [ "$CHILDREN" ]
 +
                        then
 +
 +
                                $0 $CHILDREN
 +
                        else
 +
                                echo "Device $DEVICE ($DESCRIPTION) has no children"
 +
                        fi
 +
 +
                else
 +
 +
                        if [ "$ISPLUGIN" = "0" ]
 +
                        then
 +
 +
                                if [ "$DISABLED" = "0" ]
 +
                                then
 +
 +
                                        if [ -z "$COMMANDLINE" ]
 +
                                        then
 +
                                                COMMANDLINE=$DESCRIPTION
 +
                                        fi
 +
 +
                                        if [ -x "$BASEDIR/${COMMANDLINE}" ]
 +
                                        then
 +
 +
  #                                               echo "/usr/bin/screen -d -m -S ${DESCRIPTION}-${DEVICE} $BASEDIR/Spawn_Device.sh ${DEVICE} ${DCERouter} ${COMMANDLINE}"
 +
                                                /usr/bin/screen -d -m -S ${DESCRIPTION}-${DEVICE} $BASEDIR/Spawn_Device.sh ${DEVICE} ${DCERouter} ${COMMANDLINE}
 +
                                                echo "Device $DEVICE ($DESCRIPTION) started  ${COMMANDLINE}"
 +
 +
                                        else
 +
                                                echo "Device $DEVICE ($DESCRIPTION) unable to start ${COMMANDLINE}"
 +
                                        fi
 +
 +
 +
 +
                                else
 +
                                        echo "Device $DEVICE ($DESCRIPTION) is disabled"
 +
                                fi
 +
 +
 +
                        else
 +
                                echo "Device $DEVICE ($DESCRIPTION) is a plugin"
 +
                        fi
 +
 +
                fi
 +
 +
        done
 +
 +
done
 +
 
  EOF
 
  EOF
 +
chmod +x usr/pluto/bin/startDevices.sh
 +
{{p}}
  
reboot
+
===== On a Mainly Personal Computer installation =====
  
You should be greeted by the KDE login screen, after logging in with the user you created during the '''Kubuntu''' installation, you should be able to start LinuxMCE with the icon as one normally would after a "Primary used as PC" type of installation.
+
If you chose this install type you will need to create an extra startup script.  In other words: when your core machine starts up with a KDE desktop.  Here is a slightly simplified version of the one included in the "Dedicated Media Center" install type:
  
If you want to change the default runlevel again, simply use your favorite text editor (as root) to uncomment one of the other lines in the ''/etc/inittab'' created earlier'''''WARNING:''''' Do '''NOT''' set the default runlevel to 0 (shutdown) or 6 (reboot), if you do your system will either immediately shutdown or rebootThis can be fixed, but just don't do it ok?
+
cd /
 +
cat >etc/init.d/launch-manager <<"EOF"
 +
  #!/bin/sh
 +
  if [ "$1" == "start" ]
 +
then
 +
        /usr/pluto/bin/Startup_Core-Hybrid.sh
 +
fi
 +
 +
EOF
 +
chmod +x etc/init.d/launch-manager
 +
{{p}}
  
I did this on my LinuxMCE-1.1RC1 hybrid installation, which was installed as a dedicated LMCE machine.
+
===== On a Dedicated Media Center installation =====
  
-- [[User:Zaerc|Zaerc]] 18:29, 4 August 2007 (MST)
 
  
----
+
To make things a little bit easier for ourselves we're going to move a few things around a bit, this should give us about the same starting point as when using a "Mainly Personal Computer" setup.  Do this if your core machine normally starts up with the launch manager:
  
And why stop there? (apart from that it's getting light outside again)I decided to try KingCrabs approach with an other runlevel.
+
cd /
 +
mv -iv etc/init.d/kdm etc/init.d/launch-manager
 +
  cp -iv etc/init.d/kdm.saved etc/init.d/kdm
 +
{{p}}
  
# replace ''Startup_Core-Hybrid'' with ''StartCoreServices'' and save the result in a new file.
+
==== Changing the symlinks ====
# remove the link that starts "kdm" in runlevel 4
+
# make a symlink in runlevel 4 to start our modified script
+
  
  sed -e 's/Startup_Core-Hybrid/StartCoreServices/' /etc/init.d/kdm >/etc/init.d/lmce-core
+
In order to make the system boot only the core in runlevel 3, simply copy the symlinks of runlevel 2 and replace the ones that start KDE and the AVWizard with a symlink to the init script we created earlier during the preparations:
rm -v /etc/rc4.d/S99kdm
+
  cd /
  ln -sfv ../init.d/lmce-core /etc/rc4.d/S99lmce-core
+
rm -rfv etc/rc3.d/*
 +
cp -av etc/rc2.d/* etc/rc3.d/
 +
  ln -sfv ../init.d/core etc/rc3.d/S99core
 +
rm -fv etc/rc3.d/S99kdm etc/rc3.d/S990start_avwizard
 +
  
Now you can use the ''/etc/inittab'' trick described above and rebootTo change the default runlevel back to as it was you set it to runlevel 2, deleting the ''/etc/inittab'' file completely should have the same effect (deleting could break non-Kubuntu systems though if they rely on this file).
+
Making the system boot the core + KDE in runlevel 4 is even simpeler as we don't even have to remove the symlinks:
 +
cd /
 +
rm -rfv etc/rc4.d/*
 +
  cp -av etc/rc2.d/* etc/rc4.d/
 +
ln -sfv ../init.d/core etc/rc4.d/S99core
 +
  
Not all services might be properly started yet, this is experimental! These start scripts might also still need to be started for full operation:
+
Starting the launchmanager in runlevel 5:
 +
cd /
 +
rm -rfv etc/rc5.d/*
 +
cp -av etc/rc2.d/* etc/rc5.d/
 +
ln -sfv ../init.d/launch-manager etc/rc5.d/S99launch-manager
 +
rm -fv etc/rc5.d/S99kdm
 +
 +
 
 +
==== Additional upstart files to modify ====
 +
 
 +
You can edit these with your favorite text editor.  In this example they are changed to start in runlevels 3-5 as well. 
 +
 
 +
''/etc/event.d/media-center-startup''
 +
 +
start on runlevel 2
 +
start on runlevel 3
 +
start on runlevel 4
 +
start on runlevel 5
 +
 +
stop on shutdown
 +
 +
script
 +
/usr/pluto/bin/startup-script.sh
 +
end script
 +
 +
''/etc/event.d/pluto-dhcpd-plugin''
 +
 +
start on runlevel 2
 +
start on runlevel 3
 +
start on runlevel 4
 +
start on runlevel 5
 +
 +
stop on shutdown
 +
 +
script
 +
screen -d -m -S DhcpdPlugin /usr/pluto/bin/Dhcpd-Plugin.sh
 +
end script
 +
 +
On a sidenote: ''/etc/event.d/pluto-dhcpd-plugin'' seems redundant as it appears to be started from ''/usr/pluto/bin/startup-script.sh'' as well.
 +
 
 +
{{p}}
 +
 
 +
=== Changing the default runlevel ===
 +
 
 +
The default runlevel is 2, unless specified otherwise in the ''/etc/inittab'' file, here is an example on how to create such a file (it will override an existing one):
 +
cd /
 +
cat >etc/inittab <<"EOF"
 +
# WARNING: Do NOT set the default runlevel to 0 (shutdown) or 6 (reboot).
 +
id:2:initdefault: # KDE
 +
#id:3:initdefault: # Core
 +
#id:4:initdefault: # Core + KDE
 +
#id:5:initdefault: # Launch Manager
 +
EOF
 +
 +
 
 +
This specifies a default runlevel 2 (which it already was without this file anyway), you can use your favorite text editor to edit it to your desire when you permanently want to switch.
 +
 
 +
Note that the ''runlevel='' options specified in the grub menu override this, at least if you have updated the ''/etc/event.d/rc-default'' file as described below.
 +
 
 +
{{p}}
 +
 
 +
=== Selecting a runlevel at boot time ===
 +
 
 +
This is a convenient way to experiment by simply selecting an alternative target from the boot-menu.  If it doesn't work out you can always simply reboot to another runlevel. 
 +
 
 +
First we need to replace one of ''upstart'''s files, ''/etc/event.d/rc-default''.  (It wasn't a big addition, but I didn't like the inconsistent way it was written originally, so I just cleaned it up a bit.)
 +
cd /
 +
cat >etc/event.d/rc-default <<"EOF"
 +
# rc - runlevel compatibility
 +
#
 +
# This task guesses what the "default runlevel" should be and starts the
 +
# appropriate script.
 +
 +
start on stopped rcS
 +
 +
script
 +
        runlevel --reboot || true
 +
 +
 +
        if grep -q -w -- "-s\|single\|S" /proc/cmdline
 +
        then
 +
                RL="S"
 +
        else
 +
                RL="$(sed -n -e 's/.*runlevel=\([1-5]\).*/\1/p' /proc/cmdline || true)"
 +
        fi
 +
 +
        if [ -z "$RL" -a -r /etc/inittab ]
 +
        then
 +
                RL="$(sed -n -e 's/^id:\([1-5]\):initdefault:.*/\1/p' /etc/inittab || true)"
 +
        fi
 +
 +
        if [ -z "$RL" ]
 +
        then
 +
                RL="2"
 +
        fi
 +
 +
        telinit $RL
 +
 +
end script
 +
EOF
 +
 +
 
 +
Now edit ''/boot/grub/menu.lst'' with your favorite text editor as follows:
 +
 
 +
Comment out the "hiddenmenu" option as follows (this will show you the boot menu without having to press [Esc]):
 +
## hiddenmenu 
 +
# Hides the menu by default (press ESC to see the menu)
 +
#hiddenmenu
 +
 
 +
Copy the first boot target once for every runlevel you want to be able to start, and modify it to look something like this:
 +
title          '''LMCE 1.1 (0704) KDE'''
 +
root            (hd''#'',''#'')
 +
kernel          /boot/vmlinuz-2.6.20-15-generic root=UUID=''xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'' ro quiet splash '''runlevel=2'''
 +
initrd          /boot/initrd.img-2.6.20-15-generic
 +
quiet
 +
savedefault
 +
 +
title          '''LMCE 1.1 (0704) Core'''
 +
root            (hd''#'',''#'')
 +
kernel          /boot/vmlinuz-2.6.20-15-generic root=UUID=''xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'' ro quiet splash '''runlevel=3'''
 +
initrd          /boot/initrd.img-2.6.20-15-generic
 +
quiet
 +
savedefault
 +
 +
title          Ubuntu, kernel 2.6.20-15-generic
 +
root            (hd''#'',''#'')
 +
kernel          /boot/vmlinuz-2.6.20-15-generic root=UUID=''xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'' ro quiet splash
 +
initrd          /boot/initrd.img-2.6.20-15-generic
 +
quiet
 +
savedefault
  
diff rc2.d/ rc4.d/
+
The last one is the original boot target, this will start whatever runlevel is set as the default (or runlevel 2 if none specified in ''/etc/inittab'')It shouldn't take to much imagination to add targets for runlevels 4 and 5 as well.
Only in rc2.d/: S10powernowd.early
+
Only in rc2.d/: S23instcheck.sh
+
  Only in rc2.d/: S98LMCEUpdate
+
Only in rc2.d/: S990start_avwizard
+
Only in rc2.d/: S99kdm
+
Only in rc4.d/: S99lmce-core
+
Only in rc2.d/: S99stop-readahead
+
Only in rc2.d/: StorageDevices_SambaRadar.sh
+
Only in rc2.d/: StorageDevices_StatusRadar.sh
+
  
After booting a diskless media director I see a bunch of ''CIFS VFS'' errors on the console, but I have seen plenty of those before I even got started.  The diskless MD plays media, X10 lighting and the mobile orbitter on my phone, as well as restarting the core from the UI or web-admin don't seem to work, so were not quite done yet.   
+
You can also remove the ''quiet splash'' part if you want to see what is going on during boot.   
  
In the end I changed the default runlevel back to 2 and everything works as it did before and I can control the lights with the mobile again...
+
Another section of interest could be:
 +
## default num
 +
# Set the default entry to the entry number NUM. Numbering starts from 0, and
 +
# the entry number 0 is the default if the command is not used.
 +
#
 +
# You can specify 'saved' instead of a number. In this case, the default entry
 +
# is the entry saved with the command 'savedefault'.
 +
# WARNING: If you are using dmraid do not change this entry to 'saved' or your
 +
# array will desync and will not let you boot your system.
 +
default        0
  
-- [[User:Zaerc|Zaerc]] 22:17, 4 August 2007 (MST)
+
== Personal experience ==
  
----
+
Moved to the [[Talk:Clean_Core|discussion/talk]] page.

Latest revision as of 22:16, 19 October 2012

Version Status Date Updated Updated By
710 Relevant to 0710 and older 2nd June 2011 purps
810 Not applicable 2nd June 2011 purps
1004 Not applicable 3rd August 2011 foxi352
1204 Unknown N/A N/A
1404 Unknown N/A N/A
Usage Information


Introduction

This page is meant to document the efforts to turn the LinuxMCE core into one or more Linux "services" that are automatically started at boot time. In other words, we would like to be able to boot a dedicated LinuxMCE Core server without using the Launch Manager application and without the dependency upon a graphic environment.

Please don't be shy to add any related knowledge you have.



Runlevels

Runlevels are an easy way to change how the system boots. LinuxMCE (as Kubuntu) uses runlevel 2 for normal operation (depending on the selections you made during installation) and runlevel 1 is used for rescue mode. The runlevels 0 and 6 are used for doing a shutdown or a reboot. Which leaves the runlevels 3, 4 and 5 free for us to experiment with.

As an example we will be setting up the following scheme in this document:

  1. rescue (as it is now)
  2. KDE (as installed by Kubuntu, like mainly-PC is now)
  3. Core (as in textmode, ideal for headless systems)
  4. Core + KDE (best of both worlds)
  5. LaunchManager (as the classic dedicated-MC setup is now)

Of course you can just adapt the example to your specific wishes or needs.



Starting another runlevel

If you just want to start a different runlevel once without modifying your startup scripts to much (as described below) You can simply boot into rescue mode by pressing [Esc] if grub tells you to and selecting it from the boot menu. That should boot up to a text console in single user mode, from there you can easily switch to another runlevel, for example runlevel 3:

telinit 3

The "runlevel" command will show you the previous and current runlevel.

Setting up the runlevels

Traditionally the runlevels are controlled by manipulating a set of "symbolic links" in the /etc/rcX.d/ directory, where X is the runlevel (0-6,S), however the Kubuntu system uses upstart, which has other ways as well.

When you are done with this you can switch to a different runlevel using one of the methods described elsewhere in this document, be sure to reboot in order to make a clean start.

Before starting it is always wise to make a backup of a few things, just in case:

tar cjvf ~/backup-`date '+%Y%m%d:%H%M'`.tar.bz2 /etc/init.d /etc/rc*.d



Preparation

Here are additional scripts needed to start the core devices, normally these task are performed by the launch-manager and it's startup script.

First a script for init (upstart):

cd /
cat >etc/init.d/core <<"EOF"
#!/bin/sh

case "$1" in
        start)
                /usr/pluto/bin/startCore.sh
                ;;
        stop)

                /usr/pluto/bin/StopCoreServices.sh
                ;;

        *)
                echo "Usage: /etc/init.d/core {start|stop}"
                exit 1
                ;;
esac

exit 0
EOF
chmod +x etc/init.d/core

Which calls a script that determines the device number of the core device:

cd /
cat >usr/pluto/bin/startCore.sh <<"EOF"
#!/bin/sh

BASEDIR=/usr/pluto/bin
DeviceTemplate_Core=7

source $BASEDIR/SQL_Ops.sh

$BASEDIR/Config_Device_Changes.sh
$BASEDIR/Start_OrbiterGen.sh
$BASEDIR/UpdateMediaDaemonControl.sh -enable

$BASEDIR/Start_DCERouter.sh

$BASEDIR/checkforRaids.sh
$BASEDIR/UpdateAvailableSerialPorts.sh

QUERY="SELECT PK_Device FROM Device JOIN DeviceTemplate ON Device.FK_DeviceTemplate=DeviceTemplate.PK_DeviceTemplate WHERE PK_DeviceTemplate=${DeviceTemplate_Core}"
RESULT=$(RunSQL "$QUERY")
for ROW in $RESULT
do
        CoreDev=$(Field 1 "$ROW")
        $BASEDIR/startDevices.sh $CoreDev
done

EOF
chmod +x usr/pluto/bin/startCore.sh

And in turn calls this script to start the whole device family, excluding any media directors:

cd /
cat >usr/pluto/bin/startDevices.sh <<"EOF"
#!/bin/sh


BASEDIR=/usr/pluto/bin
DeviceTemplate_MeDi=28

source $BASEDIR/SQL_Ops.sh


DEVICES=$*


for DEVICE in $DEVICES
do


       QUERY="SELECT ImplementsDCE, IsPlugin, Disabled, IF(PK_DeviceTemplate=${DeviceTemplate_MeDi},1,0) AS IsMeDi, REPLACE(DeviceTemplate.Description,' ','_') AS Description, CommandLine FROM Device JOIN DeviceTemplate ON Device.FK_DeviceTemplate=DeviceTemplate.PK_DeviceTemplate WHERE PK_Device=${DEVICE}"

       RESULT=$(RunSQL "$QUERY")
       for ROW in $RESULT
       do
               IMPLEMENTSDCE=$(Field 1 "$ROW")
               ISPLUGIN=$(Field 2 "$ROW")
               DISABLED=$(Field 3 "$ROW")
               ISMEDI=$(Field 4 "$ROW")
               DESCRIPTION=$(Field 5 "$ROW")
               COMMANDLINE=$(Field 6 "$ROW")

#              echo $RESULT, $IMPLEMENTSDCE $ISPLUGIN $DISABLED $ISMEDI $DESCRIPTION \"$COMMANDLINE\"

               if [ "$ISMEDI" != "0" ]
               then
                       echo "Device $DEVICE ($DESCRIPTION) is a Media Director"
                       continue
               fi



               if [ "$IMPLEMENTSDCE" = "0" ]
               then

                       echo "Device $DEVICE ($DESCRIPTION) no DCE, going after the children"

                       CHILDREN=""
                       QUERY="SELECT PK_Device FROM Device WHERE FK_Device_ControlledVia=$DEVICE"
                       RESULT=$(RunSQL "$QUERY")
                       for ROW in $RESULT
                       do
                               CHILD=$(Field 1 "$ROW")
                               CHILDREN="$CHILDREN $CHILD"
                       done


                       if [ "$CHILDREN" ]
                       then

                               $0 $CHILDREN
                       else
                               echo "Device $DEVICE ($DESCRIPTION) has no children"
                       fi

               else

                       if [ "$ISPLUGIN" = "0" ]
                       then

                               if [ "$DISABLED" = "0" ]
                               then

                                       if [ -z "$COMMANDLINE" ]
                                       then
                                               COMMANDLINE=$DESCRIPTION
                                       fi

                                       if [ -x "$BASEDIR/${COMMANDLINE}" ]
                                       then

#                                               echo "/usr/bin/screen -d -m -S ${DESCRIPTION}-${DEVICE} $BASEDIR/Spawn_Device.sh ${DEVICE} ${DCERouter} ${COMMANDLINE}"
                                               /usr/bin/screen -d -m -S ${DESCRIPTION}-${DEVICE} $BASEDIR/Spawn_Device.sh ${DEVICE} ${DCERouter} ${COMMANDLINE}
                                               echo "Device $DEVICE ($DESCRIPTION) started  ${COMMANDLINE}"

                                       else
                                               echo "Device $DEVICE ($DESCRIPTION) unable to start ${COMMANDLINE}"
                                       fi



                               else
                                       echo "Device $DEVICE ($DESCRIPTION) is disabled"
                               fi


                       else
                               echo "Device $DEVICE ($DESCRIPTION) is a plugin"
                       fi

               fi

       done

done

EOF
chmod +x usr/pluto/bin/startDevices.sh



On a Mainly Personal Computer installation

If you chose this install type you will need to create an extra startup script. In other words: when your core machine starts up with a KDE desktop. Here is a slightly simplified version of the one included in the "Dedicated Media Center" install type:

cd /
cat >etc/init.d/launch-manager <<"EOF"
#!/bin/sh
if [ "$1" == "start" ]
then
        /usr/pluto/bin/Startup_Core-Hybrid.sh
fi

EOF
chmod +x etc/init.d/launch-manager



On a Dedicated Media Center installation

To make things a little bit easier for ourselves we're going to move a few things around a bit, this should give us about the same starting point as when using a "Mainly Personal Computer" setup. Do this if your core machine normally starts up with the launch manager:

cd /
mv -iv etc/init.d/kdm etc/init.d/launch-manager
cp -iv etc/init.d/kdm.saved etc/init.d/kdm



Changing the symlinks

In order to make the system boot only the core in runlevel 3, simply copy the symlinks of runlevel 2 and replace the ones that start KDE and the AVWizard with a symlink to the init script we created earlier during the preparations:

cd /
rm -rfv etc/rc3.d/*
cp -av etc/rc2.d/* etc/rc3.d/
ln -sfv ../init.d/core etc/rc3.d/S99core
rm -fv etc/rc3.d/S99kdm etc/rc3.d/S990start_avwizard

Making the system boot the core + KDE in runlevel 4 is even simpeler as we don't even have to remove the symlinks:

cd /
rm -rfv etc/rc4.d/*
cp -av etc/rc2.d/* etc/rc4.d/
ln -sfv ../init.d/core etc/rc4.d/S99core

Starting the launchmanager in runlevel 5:

cd /
rm -rfv etc/rc5.d/*
cp -av etc/rc2.d/* etc/rc5.d/
ln -sfv ../init.d/launch-manager etc/rc5.d/S99launch-manager
rm -fv etc/rc5.d/S99kdm

Additional upstart files to modify

You can edit these with your favorite text editor. In this example they are changed to start in runlevels 3-5 as well.

/etc/event.d/media-center-startup

start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5

stop on shutdown

script
/usr/pluto/bin/startup-script.sh
end script

/etc/event.d/pluto-dhcpd-plugin

start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5

stop on shutdown

script
screen -d -m -S DhcpdPlugin /usr/pluto/bin/Dhcpd-Plugin.sh
end script

On a sidenote: /etc/event.d/pluto-dhcpd-plugin seems redundant as it appears to be started from /usr/pluto/bin/startup-script.sh as well.



Changing the default runlevel

The default runlevel is 2, unless specified otherwise in the /etc/inittab file, here is an example on how to create such a file (it will override an existing one):

cd /
cat >etc/inittab <<"EOF"
# WARNING: Do NOT set the default runlevel to 0 (shutdown) or 6 (reboot).
id:2:initdefault: # KDE
#id:3:initdefault: # Core
#id:4:initdefault: # Core + KDE
#id:5:initdefault: # Launch Manager
EOF

This specifies a default runlevel 2 (which it already was without this file anyway), you can use your favorite text editor to edit it to your desire when you permanently want to switch.

Note that the runlevel= options specified in the grub menu override this, at least if you have updated the /etc/event.d/rc-default file as described below.



Selecting a runlevel at boot time

This is a convenient way to experiment by simply selecting an alternative target from the boot-menu. If it doesn't work out you can always simply reboot to another runlevel.

First we need to replace one of upstart's files, /etc/event.d/rc-default. (It wasn't a big addition, but I didn't like the inconsistent way it was written originally, so I just cleaned it up a bit.)

cd /
cat >etc/event.d/rc-default <<"EOF"
# rc - runlevel compatibility
#
# This task guesses what the "default runlevel" should be and starts the
# appropriate script.

start on stopped rcS

script
        runlevel --reboot || true


        if grep -q -w -- "-s\|single\|S" /proc/cmdline
        then
                RL="S"
        else
                RL="$(sed -n -e 's/.*runlevel=\([1-5]\).*/\1/p' /proc/cmdline || true)"
        fi

        if [ -z "$RL" -a -r /etc/inittab ]
        then
                RL="$(sed -n -e 's/^id:\([1-5]\):initdefault:.*/\1/p' /etc/inittab || true)"
        fi

        if [ -z "$RL" ]
        then
                RL="2"
        fi

        telinit $RL

end script
EOF

Now edit /boot/grub/menu.lst with your favorite text editor as follows:

Comment out the "hiddenmenu" option as follows (this will show you the boot menu without having to press [Esc]):

## hiddenmenu   
# Hides the menu by default (press ESC to see the menu)
#hiddenmenu

Copy the first boot target once for every runlevel you want to be able to start, and modify it to look something like this:

title           LMCE 1.1 (0704) KDE
root            (hd#,#)
kernel          /boot/vmlinuz-2.6.20-15-generic root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro quiet splash runlevel=2
initrd          /boot/initrd.img-2.6.20-15-generic
quiet
savedefault

title           LMCE 1.1 (0704) Core
root            (hd#,#)
kernel          /boot/vmlinuz-2.6.20-15-generic root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro quiet splash runlevel=3
initrd          /boot/initrd.img-2.6.20-15-generic
quiet
savedefault

title           Ubuntu, kernel 2.6.20-15-generic
root            (hd#,#)
kernel          /boot/vmlinuz-2.6.20-15-generic root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro quiet splash 
initrd          /boot/initrd.img-2.6.20-15-generic
quiet
savedefault

The last one is the original boot target, this will start whatever runlevel is set as the default (or runlevel 2 if none specified in /etc/inittab). It shouldn't take to much imagination to add targets for runlevels 4 and 5 as well.

You can also remove the quiet splash part if you want to see what is going on during boot.

Another section of interest could be:

## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.
# WARNING: If you are using dmraid do not change this entry to 'saved' or your
# array will desync and will not let you boot your system.
default         0

Personal experience

Moved to the discussion/talk page.