Adding start of mkdumprd2
This commit is contained in:
parent
2e66fb4fde
commit
bda545992e
351
mkdumprd2
Executable file
351
mkdumprd2
Executable 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
|
Loading…
Reference in New Issue
Block a user