Hello, 
 
I try to port systemd to a live distro.
The biggest problem is that they work with modules. 
 
So before the start up can be processed all the modules needs to 
be packed out and copied to memory.
 
The script for that is this :
 
#!/bin/bash# Activate a module, while running LiveCD.# Include it into live 
directory structure on the fly## Author: Tomas M. <http://www.linux-live.org># 
Modifications for Porteus by fanthom/brokenman
MODULE=$(readlink -f "$1")
# Make sure that only one (two for root) instance of 'activate' script is 
runningpid=`ps a | egrep -v 'grep|xterm' | grep -c -w 
/opt/porteus-scripts/activate`while [ $pid -gt 3 ]; do    echo "too many 
activations - sleeping 1 sec..." && sleep 1    pid=`ps a | egrep -v 
'grep|xterm' | grep -c -w /opt/porteus-scripts/activate`done
# Switch to rootif [ "$DISPLAY" ]; then    if [ `whoami` != "root" ]; then      
  xterm -T "Please enter root's password below" -e su -c 
"/opt/porteus-scripts/xactivate $MODULE && sleep 2"        exit    fielse    if 
[ `whoami` != "root" ]; then        echo "Please enter root's password below"   
     su -c "/opt/porteus-scripts/activate $MODULE"        exit    fifi
if [ "$2" = "-k" ]; then   CALLED_BY_GUI_HELPER=1fi
if [ -e /opt/porteus-scripts/xactivate -a "$DISPLAY" -a ! 
"$CALLED_BY_GUI_HELPER" ]; then   exec /opt/porteus-scripts/xactivate "$MODULE" 
2>/dev/nullfi
PATH=.:$(dirname $0):/usr/lib:$PATH. liblinuxlive || exit 3
BASE=$(basename $1 2>/dev/null)if ismountpoint "/mnt/live/memory/images/$BASE"; 
then    echo "Module is already activated. Deactivate? Answer y/n"    read ans  
  if [ "$ans" = "y" ]; then        deactivate $BASE        exit    else        
exit    fifi
if [ "$MODULE" = "" -o ! -e "$MODULE" -o -d "$MODULE" ]; then   echo   echo 
"Activate a module on the fly while running Linux Live"   echo "Usage: $0 
module.xzm"   exit 1fi
if [ "$(echo $MODULE | fgrep -i .xzm)" = "" ]; then   echo   echo "$(basename 
$MODULE): Module must end with .xzm"   exit 2fi
IMAGES=/mnt/live/memory/imagesMODULES=/mnt/live/memory/modules
# are we even using union?if [ "$(grep '^aufs / ' /proc/mounts)" = "" ]; then   
echo "not in the live mode, can't continue. Try xzm2dir $MODULE /"   exit 4fi
mkdir -p "$MODULES"
# Test whether the module file is stored in union# if yes, then we must move it 
somewhere else (to RAM) else it can't be addedif [ -e 
"/mnt/live/memory/changes/$(readlink -f "$MODULE")" ]; then   echo "module file 
is stored inside the union, moving to $MODULES first..."   
TARGET="$MODULES/$(basename "$MODULE")"   mv "$MODULE" "$TARGET"   if [ $? -ne 
0 ]; then      echo "error copying module to memory, not enough free RAM? try 
df" >&2      rm "$TARGET"      exit 6   fi   MODULE="$TARGET"fi
# 'Stale NFS' workaroundcd /etc
MOD=$(union_insert_module / "$MODULE" $IMAGES)if [ $? -ne 0 ]; then echo "error 
inserting module to live filesystem" >&2; exit 3; fiMOD="$IMAGES/$(basename 
$MOD)"
# All executables (but symlinks) in /etc/rc.d/init.d/ from this module will be 
started# with two arguments: "start" "activate".# This is done only by the 
'activate' script, not in the case when the module is loaded # during OS 
startup (in that case, your distro is responsible for execution)## For 
compatibility, /etc/init.d is also examined, but it's not recommended for you 
to put your startup scripts# there in your modulefind_n_run_scripts $MOD start 
activate
# Rebuild the system configuration cacheecho "Updating shared library links:  
/sbin/ldconfig"/sbin/ldconfigecho "Updating MIME database:  
/usr/bin/update-mime-database /usr/share/mime"/usr/bin/update-mime-database 
/usr/share/mime > /dev/null 2>&1
# Update KDE menukdeuser=`ps aux | grep /usr/bin/startkde | grep -v grep | cut 
-d " " -f1`if [ "$kdeuser" ]; then    echo "Updating KDE menu: kbuildsycoca"    
for x in "$kdeuser"; do su --login $x -c "kbuildsycoca"; donefi
# Update LXDE menulxuser=`ps aux | grep lxsession | grep -v grep | cut -d " " 
-f1`if [ "$lxuser" ]; then    desktop=`find $MOD/usr/share/applications -name 
"*.desktop" | wc -l`    if [ "$desktop" != "0" ]; then        echo "Updating 
LXDE menu: rm ~/.cache/menus/*; lxpanelctl restart"         for x in "$lxuser"; 
do su --login $x -c "rm ~/.cache/menus/*; lxpanelctl restart"; done    fifi
# Make sure that we have at least one free loop devicex=`grep /dev/loop 
/proc/mounts | tail -n1 | cut -d " " -f1 | sed 's@/dev/loop@@'`; let y=x+1if [ 
! -e /dev/loop$y ]; then    echo "Adding new loop device: mknod /dev/loop$y b 7 
$y"    mknod /dev/loop$y b 7 $yfiJump to Line 
     Go          
How can I have the same functionallity with systemd.Must I make a custom 
service file which is called at first and how does the service file look 
like.Or is there another better way ? Roelof                                    
        
_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to