From 831e13eea8edbe4fbb6693628607b14bfd4f1aa8 Mon Sep 17 00:00:00 2001 From: dufourj Date: Sat, 4 Feb 2006 21:34:07 +0000 Subject: PC104 : - suppression du pivot_root (chroot convient mieux aux besoins) ; - script de mise à jour du programme sur l'initrd PC104 en autonome quasi-fonctionnel (quelques amélioriation à faire) ; - impossibilité de démarrer un binaire créé sur lampion sans provoquer un kill du kernel (certains supports noyau manquant ? Lib ou autres programmes manquant ?). - l'initrd compressé c'est rapide à booter mais long à mettre à jour... --- i/pc104/initrd/conf/busybox/config | 30 ++++++---- i/pc104/initrd/conf/rcS | 13 +++- i/pc104/initrd/conf/update_initrd.sh | 36 +++++------ i/pc104/initrd/create.sh | 2 +- i/pc104/initrd/update.sh | 112 ++++++++++++++++++++++++++--------- 5 files changed, 130 insertions(+), 63 deletions(-) (limited to 'i/pc104') diff --git a/i/pc104/initrd/conf/busybox/config b/i/pc104/initrd/conf/busybox/config index 28d373d..5373116 100644 --- a/i/pc104/initrd/conf/busybox/config +++ b/i/pc104/initrd/conf/busybox/config @@ -75,7 +75,7 @@ PREFIX="./_install" # # CONFIG_BASENAME is not set # CONFIG_CAL is not set -# CONFIG_CAT is not set +CONFIG_CAT=y # CONFIG_CHGRP is not set # CONFIG_CHMOD is not set # CONFIG_CHOWN is not set @@ -107,15 +107,15 @@ CONFIG_FEATURE_FANCY_ECHO=y # CONFIG_LENGTH is not set # CONFIG_LN is not set # CONFIG_LOGNAME is not set -# CONFIG_LS is not set -# CONFIG_FEATURE_LS_FILETYPES is not set -# CONFIG_FEATURE_LS_FOLLOWLINKS is not set -# CONFIG_FEATURE_LS_RECURSIVE is not set -# CONFIG_FEATURE_LS_SORTFILES is not set -# CONFIG_FEATURE_LS_TIMESTAMPS is not set -# CONFIG_FEATURE_LS_USERNAME is not set -# CONFIG_FEATURE_LS_COLOR is not set -# CONFIG_FEATURE_LS_COLOR_IS_DEFAULT is not set +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +CONFIG_FEATURE_LS_COLOR=y +CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y # CONFIG_MD5SUM is not set # CONFIG_MKDIR is not set # CONFIG_MKFIFO is not set @@ -168,7 +168,15 @@ CONFIG_TRUE=y # CONFIG_WHOAMI is not set # CONFIG_YES is not set # CONFIG_FEATURE_PRESERVE_HARDLINKS is not set -# CONFIG_FEATURE_AUTOWIDTH is not set + +# +# Common options for ls and more +# +CONFIG_FEATURE_AUTOWIDTH=y + +# +# Common options for df, du, ls +# # CONFIG_FEATURE_HUMAN_READABLE is not set # CONFIG_FEATURE_MD5_SHA1_SUM_CHECK is not set diff --git a/i/pc104/initrd/conf/rcS b/i/pc104/initrd/conf/rcS index 2b1b486..0c1012c 100755 --- a/i/pc104/initrd/conf/rcS +++ b/i/pc104/initrd/conf/rcS @@ -14,6 +14,13 @@ mount /proc # Launch update script in background ./etc/robot/update_initrd.sh & -# TODO Export variables (LD...) -# Launch the program -# . /robot/start.sh +# Launch the program ! Go Go Go ! +# For the library +export LD_LIBRARY_PATH="./lib/;/robot/lib/" +# Go to the directory where everything is +cd /robot/ +# According to some scripts I have seen, it is quicker because it removes a +# fork... +# FIXME This does not work with ash busybox shell +# . start.sh +./start.sh diff --git a/i/pc104/initrd/conf/update_initrd.sh b/i/pc104/initrd/conf/update_initrd.sh index 4a76956..1f99519 100755 --- a/i/pc104/initrd/conf/update_initrd.sh +++ b/i/pc104/initrd/conf/update_initrd.sh @@ -1,37 +1,33 @@ #!/bin/sh # The purpose of this script is to provide a system to update the PC104 in # autonomous mode via the network. -# It is called by the linuxrc and should not be called by hand. +# It is called by the linuxrc/init at boot in another process so it can be +# blocking. It should not be called by hand. # PATH is not correctly set... PATH=$PATH:/usr/sbin/ # Bring eth0 up ifconfig eth0 up # Get the configuration of the network via dhcp +# TODO Check life time of this program and that it does not do stupid things +# after a while... udhcpc -i eth0 -s /etc/udhcpc.script # Wait here for a connection. I do not know if it is a feature or a bug, but # when nc receive a connection, it is end here. Maybe it is because of the # missing library (warmed by gcc at compiled time) nc -l -p 1234 -# Mount the real system -mount /mnt/localsys -# Pivot root to the new_root. -# XXX It is a good idea to pivot_root ? Chroot is better ? +# From here, someone has connected to the 1234 port, we mount the real linux +# inside of the PC104 and start a ssh daemon, it is easier to use +# +# Mount the real system read only (security reason in case of hard reboot) +mount -r /mnt/localsys +# Chroot to the new_root cd /mnt/localsys -pivot_root . old_root -# FIXME: I do not sure this is the good solution... Why make a exec and a -# chroot ? I am not sure it is a good idea... -exec chroot . sh -c '/etc/init.d/mountvirtfs; /etc/init.d/ssh start;' \ +# For the moment, I have seen it is compulsary to put the redirection +chroot . sh -c '/etc/init.d/mountvirtfs; /etc/init.d/ssh start; exit' \ dev/console 2>&1 -# This part sux : what's about the old process ? -# Kill them ? -#umount /old_root -# We should call all the script -# TODO : find a better way to call it. -#/etc/init.d/mountvirtfs start -##/etc/init.d/mountall.sh start -#/etc/init.d/networking start -#/etc/init.d/ssh start -# XXX And for the end ? -# The FS has enough errors so do it well ! Umount everything ! +# XXX I would like the previous command to end, and give back the hand to the +# next one. This way, I could have still a way to comunicate with the PC104 by +# the initrd and not by the chrooted mode. +# read 5 diff --git a/i/pc104/initrd/create.sh b/i/pc104/initrd/create.sh index e6cc64f..342ddf8 100755 --- a/i/pc104/initrd/create.sh +++ b/i/pc104/initrd/create.sh @@ -50,7 +50,7 @@ mount_initrd () create_empty_struct () { # Create an empty root structure - mkdir -p $INITRD_TEMPDIR/{bin,dev,etc/{robot,init.d},proc,sbin,usr/{sbin,bin},var/lock,robot,initrd,mnt/localsys} + mkdir -p $INITRD_TEMPDIR/{bin,dev,etc/{robot,init.d},proc,sbin,usr/{sbin,bin},robot,initrd,mnt/localsys} # Create all the devices files we need create_dev # Install the inittab diff --git a/i/pc104/initrd/update.sh b/i/pc104/initrd/update.sh index 9cb9059..ae7b0cf 100755 --- a/i/pc104/initrd/update.sh +++ b/i/pc104/initrd/update.sh @@ -1,6 +1,9 @@ #!/bin/bash # Script for updating the marvin program in the initrd. +set -e +set -u + # Variables - Default values # Local directory name containing the representation for the initrd ROBOT_LOCAL_DIR="./robot" @@ -12,8 +15,12 @@ ROBOT_START_SCRIPT="start.sh" ROBOT_BUILD_DIR="." # Config directory ROBOT_CONF_DIR="$ROBOT_BUILD_DIR/../runtime" -# Max size of the config directory -ROBOT_CONF_MAX_SIZE="3000" +# Max size of the config directory (in bytes) +ROBOT_CONF_MAX_SIZE="100000" +# Hostname of the robot +ROBOT_HOST="nenuphar" +# In autonomous mode, wait time for bringing up the ssh deamon +ROBOT_WAIT_TIME="3s" check_rsync () { @@ -29,17 +36,19 @@ check_create_structure () # Check the local directory exist if [[ ! -d $ROBOT_LOCAL_DIR ]] then - mkdir $ROBOT_LOCAL_DIR + mkdir -p $ROBOT_LOCAL_DIR/lib fi # Check we have a start script - if [[ ! -f $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT ]] + if [[ ! -x $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT ]] then # Create a default one - echo -e \ - "# Startup script launched when the PC104 boot.\n\ -# It will be sourced by other script.\n\ -# Example : \n\ -# ./test_ai -z" > $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT + cat < $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT +# Startup script launched when the PC104 boot. +# It will be sourced by other script. +# Example : +# ./test_ai -z +EOF + chmod +x $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT # Need to tune it by the user echo "Please tune your $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT." # XXX vim it ? @@ -51,12 +60,12 @@ check_create_structure () # a binary existing check_install_binary () { - if [[ $(grep -cv "^#" $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT) -eq 0 ]] + if [[ $(grep -c "^\\./" $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT) -eq 0 ]] then echo "No command found in your $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT." exit 3 fi - for line in "$(grep -v "^#" $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT)" + for line in "$(grep "^\\./" $ROBOT_LOCAL_DIR/$ROBOT_START_SCRIPT)" do bin="$(echo "$line" | cut -d ' ' -f 1)" if [[ ! -x $ROBOT_BUILD_DIR/$bin ]] @@ -65,9 +74,14 @@ check_install_binary () exit 4 else # Copy the binary to the local dir - install -m 777 $ROBOT_BUILD_DIR/$bin $ROBOT_LOCAL_DIR/ + cp -p $ROBOT_BUILD_DIR/$bin $ROBOT_LOCAL_DIR/ # Remove useless symbol - strip $ROBOT_LOCAL_DIR/$bin + strip -p $ROBOT_LOCAL_DIR/$bin + # Copy needed libraries + for lib in "$(ldd $ROBOT_BUILD_DIR/$bin | cut -d ' ' -f 3)" + do + cp -p $lib $ROBOT_LOCAL_DIR/lib + done fi done } @@ -76,28 +90,69 @@ check_install_binary () check_install_config () { # First we check the size - if [[ $(du -bs $ROBOT_CONF_DIR | cut -f 1) -gt $ROBOT_CONF_MAX_SIZE ]] + if [[ $(du -bs --exclude=.svn $ROBOT_CONF_DIR | cut -f 1) -gt $ROBOT_CONF_MAX_SIZE ]] then echo "Config directory ($ROBOT_CONF_DIR) is too big." exit 5 fi # There is no way to know the files needed, so we rsync everything - rsync -aq $ROBOT_CONF_DIR/ $ROBOT_LOCAL_DIR/rc + rsync -aq --exclude=.svn $ROBOT_CONF_DIR/ $ROBOT_LOCAL_DIR } -# TODO Send it to the initrd -# Guiding steps : -# 1. Try netcat on the robot -# 1.a If it responding, we are in autonomous mode, wait that the PC104 mount -# the real system for ssh -# 2. Try ssh -# 2.a Not responding, wrong robot/dns ? Too quick from 1 ? -# 3. Backuper/rotater l'initrd -# 4. Décompréssé l'initrd -# 5. Le monter -# 6. rsyncer -# 7. Démonter -# 8. Re-compresser +upload_data () +{ + # Check if host exist and is up + echo "Ping" + ping -c 1 -w 1 -q $ROBOT_HOST > /dev/null + case $? in + 0) + # Robot is online ! + ;; + 1) + # Host exist but is offline + echo "$ROBOT_HOST is currently down." + exit 6 + ;; + 2) + # Host does not exist + echo "$ROBOT_HOST does not exist." + exit 7 + ;; + *) + # Unknown error... + echo "ping failed, unknown error." + exit 8 + ;; + esac + echo "nc" + # Are we in automous mode ? + if [[ $(nc -w 1 $ROBOT_HOST 1234) -eq 0 ]] + then + sleep $ROBOT_WAIT_TIME + fi + # Mount the initrd + echo "Mounting" + # TODO Best manage compressed initrd or not +# && gunzip -c /initrd/last > /tmp/initrd_cur \ + ssh -o "ConnectTimeout 1" root@$ROBOT_HOST "mount -oremount,rw / \ + && cp /initrd/last /tmp/initrd_cur \ + && mount -o loop /tmp/initrd_cur /mnt/initrd" + # Rsyncer + echo "rsync" + # TODO Remove old files ! + rsync -av $ROBOT_LOCAL_DIR/ root@$ROBOT_HOST:/mnt/initrd/$ROBOT_REMOTE_DIR/ + echo "umount" + # Démonter et recompresser l'initrd voir rotater tout + # TODO Best manage compressed initrd or not + # TODO Backup, rotation, et less cp ! +# && gzip -f -9 -c /tmp/initrd_cur > /initrd/initrd1.gz\ + ssh -o "ConnectTimeout 1" root@$ROBOT_HOST "umount /mnt/initrd \ + && cp /tmp/initrd_cur /initrd/initrd1.gz \ + && sync \ + && mount -oremount,ro /" +# TODO Change between NFS/Autonomous... +# && kill -SIGTERM 1" +} # TODO Parameter @@ -105,3 +160,4 @@ check_rsync check_create_structure check_install_binary check_install_config +upload_data -- cgit v1.2.3