Adding start of mkdumprd2

This commit is contained in:
Neil Horman 2009-05-13 20:52:55 +00:00
parent 2e66fb4fde
commit bda545992e
1 changed files with 351 additions and 0 deletions

351
mkdumprd2 Executable file
View File

@ -0,0 +1,351 @@
#!/bin/sh
##########################################################
#File: mkdumprd2
#Author: Neil Horman <nhorman@redhat.com>
#Copyright 2009 Red Hat, Inc.
#Summary: A vastly simplified infrastructure for creating
# initramfs files for use with kdump
#########################################################
########################################################
#Global Variables
########################################################
#BASE_DIR is the parent of both TEMP_DIR and STAGE_DIR
BASE_DIR=""
#TEMP_DIR is the directory where any temp files that we
# create during the build process go, that we
# do not want to wind up in our initramfs
TEMP_DIR=""
#STAGE_DIR is the directory we create to do all our
# initramfs creation in
STAGE_DIR=""
#IMG_FILE is the file that is our initramfs after cpio
IMG_FILE=""
########################################################
#Cleanup functions so that we can get out easily and
#sanely when something goes wrong
########################################################
finish_and_exit()
{
local EXIT_CODE=$1
local EXIT_MSG=$2
if [ -n "$EXIT_MSG" ]
then
echo $EXIT_MSG
fi
exit $EXIT_CODE
}
#########################################################
#Clean up our various temporary files
#And exit
########################################################
cleanup_and_exit()
{
EXIT_CODE=$1
if [ -d $BASE_DIR ]
then
rm -rf $STAGE_DIR
fi
if [ -f $IMG_FILE ]
then
rm -f $IMG_FILE
fi
finish_and_exit $EXIT_CODE ""
}
#########################################################
#This creates the directory hierarchy that use to
#start creating a new initramfs
#########################################################
create_new_initramfs_dir()
{
local TMPDIR=`mktemp -d`
if [ ! -d $TMPDIR ]
then
return 1
fi
mkdir $TMPDIR/stage
mkdir $TMPDIR/temp
BASE_DIR=$TMPDIR
STAGE_DIR=$TMPDIR/stage
TEMP_DIR=$TMPDIR/temp
return 0
}
#########################################################
#Helper functions for stage_initramfs
#########################################################
create_initramfs_dirs()
{
mkdir -p $STAGE_DIR/lib || return 1
mkdir -p $STAGE_DIR/lib64 || return 1
mkdir -p $STAGE_DIR/bin || return 1
mkdir -p $STAGE_DIR/etc || return 1
mkdir -p $STAGE_DIR/dev || return 1
mkdir -p $STAGE_DIR/proc || return 1
mkdir -p $STAGE_DIR/sys || return 1
mkdir -p $STAGE_DIR/tmp || return 1
mkdir -p $STAGE_DIR/sysroot || return 1
mkdir -p $STAGE_DIR/modules || return 1
mkdir -p $STAGE_DIR/usr/share/udhcpc || return 1
mkdir -p $STAGE_DIR/var/run || return 1
mkdir -p $STAGE_DIR/etc/network/if-pre-up.d || return 1
mkdir -p $STAGE_DIR/etc/network/if-up.d || return 1
mkdir -p $STAGE_DIR/etc/network/if-pre-down.d || return 1
mkdir -p $STAGE_DIR/etc/network/if-down.d || return 1
mkdir -p $STAGE_DIR/etc/network/if-post-down.d || return 1
cd $STAGE_DIR
ln -s bin sbin
}
load_dependent_libs()
{
local BIN=$1
ldd $BIN | grep "not a dynamic executable"
if [ $? == 0 ]
then
#There are no dependencies, we're done
return
fi
ldd $BIN | grep "statically linked"
if [ $? == 0 ]
then
#There are no dependencies, we're done
return
fi
for LIB in `ldd $BIN | awk '/\// {if ($2 == "=>") { print $3} else {print $1}}'`
do
install_with_deps $LIB
if [ ! -f $STAGE_DIR/$LIB ]
then
install --mode=755 $LIB $STAGE_DIR/$LIB
fi
done
return
}
install_with_deps()
{
local BIN=$1
local MODE=$2
install --mode=$MODE $BIN $STAGE_DIR/bin
install_with_deps $BIN
}
populate_std_files()
{
# We of course need busybox
install_with_deps /sbin/busybox 755
# And we need to link all the apps busybox provides in
for i in `/sbin/busybox |
awk 'BEGIN {found=0} /.*/ { if (found) print $0 } /Currently/ {found=1}' |
sed -e's/,//g' -e's/busybox//g'`
do
ln -s busybox $STAGE_DIR/sbin/$i
done
# We always get kpartx, dmsetup, lvm and mdadm
for i in lvm kpartx mdadm dmsetup
do
install_wtih_deps $i 755
done
# We also want to suck in all the runtime scripts
# that make life easier inside the initramfs
# These don't need deps, because they're all msh scripts
for i in `ls /usr/share/kexec-tools/advanced_config/kdump-scripts/`
do
install --mode=755 $i $STAGE_DIR/bin
done
/bin/sh
}
#########################################################
#This function is the recepie for populating our initramfs
#with the basic included functions/scripts, loading the
#manifest files, copying in the init script, and doing
#site specific post processing
#########################################################
prep_std_initramfs()
{
#start by creating the directories we need
create_initramfs_dirs
#copy in the standard included files
populate_std_files
}
##########################################################
#This function validates each line in the manifest file to
#ensure that we sanitize the input
#Args are:
#1 - file type
#2 - File source
#3 - destination path
#4 - optional arguments
##########################################################
validate_minifest_line()
{
case "$type" in
reg|ren)
# Regular file, make sure that the file exists
if [ ! -f $2 ]
then
return 1
fi
;;
gen)
# Generated file, make sure that the script
# exists and is executable
if [ ! -x $2 ]
then
return 1
fi
;;
null)
# Null files have no output, they simply
# provide a means by which to manipulate the
# the initramfs. Just make sure the file exists
if [ ! -x $2 ]
then
return 1
fi
;;
*)
# Unknown manifest type, fail
return 1
;;
esac
return 0
}
##########################################################
#This function reads in our manifest file and moves all
#the specified contents to their respective destinations
#the manifest file has the following format
#
#{type} {source arg} {dest path}
#
#see the kexec-adv-manifest man page for details
##########################################################
populate_from_manifest()
{
local type
local sarg
local dpath
local opts
local ddir
while read type sarg dpath opts
do
validate_manifest_line $type $sarg $dpath $opts
if [ $? != 0 ]
then
finish_and_exit 1 "$sarg: Invalid line in manifest"
fi
case "$type" in
reg|ren)
# Just do a raw copy from the source path
# to the dest path
if [ "$type" == "reg" ]
then
ddir=$STAGE_DIR/$dpath
else
ddir=$(dirname $STAGE_DIR/$dpath)
fi
mkdir -p $ddir
cp $sarg $STAGE_DIR/$dpath
;;
gen)
# Generated file: run the sarg with the provided opts
# Assume that the binary will output the generated file
# to stdout
ddir=$(dirname $STAGE_DIR/$dpath)
mkdir -p $ddir
$sarg $opts > $STAGE_DIR/$dpath
if [ $? != 0 ]
then
finish_and_exit 1 "$sarg: Non-zero exit"
fi
;;
null)
# Just run $sarg as program, passing $BASE_DIR as the
# first argument, and $opts next. This lets us
# manipulate the intiramfs without having to add
# anything to the file
$sarg $BASE_DIR $opts
if [ $? != 0 ]
then
finish_and_exit 1 "$sarg: Non-zero exit"
fi
esac
done < /etc/kdump-adv-conf/manifest
}
##########################################################
# This function takes our stage directory, and makes an
# image file out of it
##########################################################
create_initramfs_image()
{
IMG_FILE=$(mktemp $TEMP_DIR/initrd.img.XXXXXX)
(cd $STAGE_DIR; find . | cpio --quiet -c -o) > $IMG_FILE
if [ $? != 0 ]
then
finish_and_exit 1 " Could not create initramfs"
fi
target=NEED TO PASS IN TARGET KERNEL HERE
}
##########################################################
#Start the actual code here
##########################################################
# Create a new staging area
create_new_initramfs_dir
if [ $? != 0 ]
then
finish_and_exit 1 "Unable to stage a new initramfs area"
fi
# Do staging
prep_std_initramfs
# Pull in the user supplied manifest
populate_from_manifest
# Do image file creation
create_initramfs_image
# Cleanup
cleanup_and_exit 0