From 275089f2d6ead506350f09e1f66c82bfcb879db0 Mon Sep 17 00:00:00 2001 From: yangsong Date: Sun, 2 Aug 2015 04:17:30 -0400 Subject: [PATCH] enable syslog in the stateless initrd, add logs in the xcat dracut module for redhat --- xCAT-server/lib/xcat/plugins/anaconda.pm | 8 +++ .../netboot/rh/dracut_033/patch/initqueue.sh | 58 +++++++++++++++++++ .../rh/dracut_033/patch/module-setup.sh | 40 +++++++++++++ .../rh/dracut_033/patch/rsyslogd-start.sh | 51 ++++++++++++++++ .../rh/dracut_033/patch/syslog-genrules.sh | 34 +++++++++++ .../share/xcat/netboot/rh/dracut_033/xcatroot | 27 ++++++++- xCAT-server/share/xcat/netboot/rh/genimage | 31 +++++++++- 7 files changed, 245 insertions(+), 4 deletions(-) create mode 100755 xCAT-server/share/xcat/netboot/rh/dracut_033/patch/initqueue.sh create mode 100755 xCAT-server/share/xcat/netboot/rh/dracut_033/patch/module-setup.sh create mode 100755 xCAT-server/share/xcat/netboot/rh/dracut_033/patch/rsyslogd-start.sh create mode 100755 xCAT-server/share/xcat/netboot/rh/dracut_033/patch/syslog-genrules.sh diff --git a/xCAT-server/lib/xcat/plugins/anaconda.pm b/xCAT-server/lib/xcat/plugins/anaconda.pm index 290d35b68..c9ce10bed 100755 --- a/xCAT-server/lib/xcat/plugins/anaconda.pm +++ b/xCAT-server/lib/xcat/plugins/anaconda.pm @@ -749,9 +749,17 @@ sub mknetboot my ($host, $ipaddr) = xCAT::NetworkUtils->gethostnameandip($xcatmaster); if($ipaddr){ + #for use in postscript and postbootscript in xcatdsklspost in the rootimg $kcmdline .=" LOGSERVER=$ipaddr "; + + #for use in syslog dracut module in the initrd + $kcmdline .=" syslog.server=$ipaddr syslog.type=rsyslogd syslog.filter=*.* "; }else{ + #for use in postscript and postbootscript in xcatdsklspost in the rootimg $kcmdline .=" LOGSERVER=$xcatmaster "; + + #for use in syslog dracut module in the initrd + $kcmdline .=" syslog.server=$xcatmaster syslog.type=rsyslogd syslog.filter=*.* "; } $kcmdline .= " xcatdebugmode=1 "; diff --git a/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/initqueue.sh b/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/initqueue.sh new file mode 100755 index 000000000..f85e6d6a9 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/initqueue.sh @@ -0,0 +1,58 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh +# +# Licensed under the GPLv2+ +# +# Copyright 2008-2010, Red Hat, Inc. +# Harald Hoyer + +PATH=/usr/sbin:/usr/bin:/sbin:/bin + +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh + +while [ $# -gt 0 ]; do + case "$1" in + --onetime) + onetime="yes";; + --settled) + qname="/settled";; + --finished) + qname="/finished";; + --timeout) + qname="/timeout";; + --online) + qname="/online";; + --unique) + unique="yes";; + --name) + name="$2";shift;; + --env) + env="$2"; shift;; + *) + break;; + esac + shift +done + +if [ -z "$unique" ]; then + job="${name}$$" +else + job="${name:-$1}" + job=${job##*/} +fi + +exe=$1 +shift + +[ -x "$exe" ] || exe=$(command -v $exe) + +{ + [ -n "$onetime" ] && echo '[ -e "$job" ] && rm -f -- "$job"' + [ -n "$env" ] && echo "$env" + echo "$exe $@" +} > "/tmp/$$-${job}.sh" + +mv -f "/tmp/$$-${job}.sh" "$hookdir/initqueue${qname}/${job}.sh" +[ -z "$qname" ] && >> $hookdir/initqueue/work +exit 0 diff --git a/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/module-setup.sh b/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/module-setup.sh new file mode 100755 index 000000000..c12f4ba6d --- /dev/null +++ b/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/module-setup.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh + +check() { + # do not add this module by default + return 255 +} + +depends() { + return 0 +} + +install() { + local _i + local _installs + if type -P rsyslogd >/dev/null; then + _installs="rsyslogd" + inst_libdir_file rsyslog/lmnet.so rsyslog/imklog.so rsyslog/imuxsock.so + elif type -P syslogd >/dev/null; then + _installs="syslogd" + elif type -P syslog-ng >/dev/null; then + _installs="syslog-ng" + else + derror "Could not find any syslog binary although the syslogmodule" \ + "is selected to be installed. Please check." + fi + if [ -n "$_installs" ]; then + inst_multiple cat $_installs + inst_hook cmdline 90 "$moddir/parse-syslog-opts.sh" + inst_hook pre-udev 61 "$moddir/syslog-genrules.sh" + inst_hook cleanup 99 "$moddir/syslog-cleanup.sh" + inst_simple "$moddir/rsyslogd-start.sh" /sbin/rsyslogd-start + inst_simple "$moddir/rsyslogd-stop.sh" /sbin/rsyslogd-stop + mkdir -m 0755 -p ${initdir}/etc/templates + inst_simple "${moddir}/rsyslog.conf" /etc/templates/rsyslog.conf + fi + dracut_need_initqueue +} + diff --git a/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/rsyslogd-start.sh b/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/rsyslogd-start.sh new file mode 100755 index 000000000..044118c4c --- /dev/null +++ b/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/rsyslogd-start.sh @@ -0,0 +1,51 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh + +# Triggered by udev and starts rsyslogd with bootparameters + +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh + +rsyslog_config() { + local server=$1 + shift + local syslog_template=$1 + shift + local filters=$* + local filter= + local confline= + + cat $syslog_template + +# for filter in $filters; do +# echo "${filter} @${server}" +# done + + + if [ -n "$filters" ];then + confline="${filters}"; + else + confline="*.*" + fi + + if [ -n "$server" ];then + confline="$confline @${server}" + else + confline="$confline /var/log/messages" + fi + + echo "$confline" +# echo "*.* /tmp/syslog" +} + +read server < /tmp/syslog.server +read filters < /tmp/syslog.filters +[ -z "$filters" ] && filters="kern.*" +read conf < /tmp/syslog.conf +[ -z "$conf" ] && conf="/etc/rsyslog.conf" && echo "$conf" > /tmp/syslog.conf + +template=/etc/templates/rsyslog.conf +if [ -n "$server" ]; then + rsyslog_config "$server" "$template" "$filters" > $conf + rsyslogd -i /var/run/syslogd.pid +fi diff --git a/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/syslog-genrules.sh b/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/syslog-genrules.sh new file mode 100755 index 000000000..5a3dbd9f2 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/rh/dracut_033/patch/syslog-genrules.sh @@ -0,0 +1,34 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh + +# Creates the syslog udev rules to be triggered when interface becomes online. +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh + +detect_syslog() { + syslogtype="" + if [ -e /sbin/rsyslogd ]; then + syslogtype="rsyslogd" + elif [ -e /sbin/syslogd ]; then + syslogtype="syslogd" + elif [ /sbin/syslog-ng ]; then + syslogtype="syslog-ng" + else + warn "Could not find any syslog binary although the syslogmodule is selected to be installed. Please check." + fi + echo "$syslogtype" + [ -n "$syslogtype" ] +} + +read syslogtype < /tmp/syslog.type +if [ -z "$syslogtype" ]; then + syslogtype=$(detect_syslog) + echo $syslogtype > /tmp/syslog.type +fi +if [ -e "/sbin/${syslogtype}-start" ]; then + #printf 'ACTION=="online", SUBSYSTEM=="net", RUN+="/sbin/initqueue --onetime /sbin/'${syslogtype}'-start $env{INTERFACE}"\n' > /etc/udev/rules.d/70-syslog.rules + #printf 'ATTR{operstate}!="down", SUBSYSTEM=="net", RUN+="/sbin/initqueue --onetime /sbin/'${syslogtype}'-start $env{INTERFACE}"\n' > /etc/udev/rules.d/70-syslog.rules + /sbin/initqueue --online --onetime /sbin/${syslogtype}-start +else + warn "syslog-genrules: Could not find binary to start syslog of type \"$syslogtype\". Syslog will not be started." +fi diff --git a/xCAT-server/share/xcat/netboot/rh/dracut_033/xcatroot b/xCAT-server/share/xcat/netboot/rh/dracut_033/xcatroot index a85207dfd..b99dc8dab 100755 --- a/xCAT-server/share/xcat/netboot/rh/dracut_033/xcatroot +++ b/xCAT-server/share/xcat/netboot/rh/dracut_033/xcatroot @@ -1,4 +1,6 @@ #!/bin/sh +logger -t xcat -p debug "running xcatroot...." + NEWROOT=$3 RWDIR=.statelite XCATMASTER=$XCAT @@ -17,7 +19,11 @@ XCATIPORT="3002" fi +logger -t xcat -p debug "MASTER=$MASTER XCATIPORT=$XCATIPORT" + + if [ $NODESTATUS -ne 0 ];then +logger -t xcat -p debug "nodestatus: netbooting,reporting..." /tmp/updateflag $MASTER $XCATIPORT "installstatus netbooting" fi @@ -26,8 +32,10 @@ if [ ! -z "$imgurl" ]; then NFS=0 FILENAME=${imgurl##*/} while [ ! -r "$FILENAME" ]; do + logger -t xcat -p debug "downloading $imgurl...." echo Getting $imgurl... if ! wget $imgurl; then + logger -t xcat -p debug "downloading $imgurl failed,retrying...." rm -f $FILENAME sleep 27 fi @@ -58,6 +66,7 @@ if [ -r /rootimg.sfs ]; then mount --move /ro $NEWROOT/ro mount --move /rw $NEWROOT/rw elif [ -r /rootimg.gz ]; then + logger -t xcat -p debug "rootimg.gz downloaded,setting up RAM-root tmpfs...." echo Setting up RAM-root tmpfs. if [ -z $rootlimit ];then mount -t tmpfs -o mode=755 rootfs $NEWROOT @@ -66,6 +75,7 @@ elif [ -r /rootimg.gz ]; then fi cd $NEWROOT + logger -t xcat -p debug "Extracting root filesystem:" echo -n "Extracting root filesystem:" if [ -x /bin/cpio ]; then gzip -cd /rootimg.gz |/bin/cpio -idum @@ -73,6 +83,7 @@ elif [ -r /rootimg.gz ]; then gzip -cd /rootimg.gz |cpio -idum fi $NEWROOT/etc/init.d/localdisk + logger -t xcat -p debug "Done...." echo Done elif [ -r /rootimg-statelite.gz ]; then echo Setting up RAM-root tmpfs for statelite mode. @@ -197,11 +208,18 @@ elif [ -r /rootimg-statelite.gz ]; then mount -n --bind /sys $NEWROOT/sys else + logger -t xcat -p debug "Failed to download image, panicing in 5..." echo -n Failed to download image, panicing in 5... for i in 4 3 2 1 0; do /bin/sleep 1 + logger -t xcat -p debug "$i..." echo -n $i... - done + done + logger -t xcat -p debug "You're dead. rpower nodename reset to play again." + logger -t xcat -p debug "* Did you packimage with -m cpio, -m squashfs, or -m nfs?" + logger -t xcat -p debug "* If using -m squashfs did you include aufs.ko with geninitrd? e.g.: -n tg3,squashfs,aufs,loop" + logger -t xcat -p debug "If using -m nfs did you export NFS and sync rootimg? And did you include the aufs and nfs modules in the proper order: e.g.: -n tg3,aufs,loop,sunrpc,lockd,nfs_acl,nfs" + echo echo "You're dead. rpower nodename reset to play again. @@ -242,6 +260,7 @@ if [ -z $STATEMNT ]; then netif=${lf#*.} netif=${netif%.*} cp $lf "$NEWROOT/var/lib/dhclient/dhclient-$netif.leases" + logger -t xcat -p debug "saving $NEWROOT/var/lib/dhclient/dhclient-$netif.leases" done if [ ! -z "$ifname" ]; then @@ -257,10 +276,13 @@ if [ -z $STATEMNT ]; then ETHX=$(getdevfrommac $MACX) fi + if [ ! -z "$MACX" ] && [ ! -z "$ETHX" ]; then if [ ! -e $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX ]; then + logger -t xcat -p debug "creating $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX" touch $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX fi + logger -t xcat -p debug "writing $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX: DEVICE=$ETHX;BOOTPROTO=dhcp;HWADDR=$MACX;ONBOOT=yes" echo "DEVICE=$ETHX" > $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX echo "BOOTPROTO=dhcp" >> $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX echo "HWADDR=$MACX" >> $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX @@ -268,12 +290,15 @@ if [ -z $STATEMNT ]; then fi fi +logger -t xcat -p debug "saving $NEWROOT/etc/resolv.conf" cp /etc/resolv.conf "$NEWROOT/etc/" if [ -d "$NEWROOT/etc/sysconfig" -a ! -e "$NEWROOT/etc/sysconfig/selinux" ]; then + logger -t xcat -p debug "disable selinux ..." echo "SELINUX=disabled" >> "$NEWROOT/etc/sysconfig/selinux" fi +logger -t xcat -p debug "exiting xcatroot..." # inject new exit_if_exists echo 'settle_exit_if_exists="--exit-if-exists=/dev/root"; rm "$job"' > $hookdir/initqueue/xcat.sh # force udevsettle to break diff --git a/xCAT-server/share/xcat/netboot/rh/genimage b/xCAT-server/share/xcat/netboot/rh/genimage index 56be0a5f5..3f0e5190d 100755 --- a/xCAT-server/share/xcat/netboot/rh/genimage +++ b/xCAT-server/share/xcat/netboot/rh/genimage @@ -582,11 +582,13 @@ foreach my $dn (@ndrivers) { } @ndrivers = @fulldrivers; +my $dracutver; + unlink "/tmp/genimage.$$.yum.conf"; if ( (-d "$rootimg_dir/usr/share/dracut") or (-d "$rootimg_dir/usr/lib/dracut") ) { $dracutmode = 1; # get dracut version - my $dracutver = `rpm --root $rootimg_dir -qi dracut | grep Version | awk -F' ' '{print \$3}'`; + $dracutver = `rpm --root $rootimg_dir -qi dracut | grep Version | awk -F' ' '{print \$3}'`; chomp($dracutver); if ($dracutver =~ /^\d\d\d$/) { if ($dracutver >= "033") { @@ -826,6 +828,27 @@ sub mkinitrd_dracut { $dracutmoduledir="$rootimg_dir/usr/lib/dracut/modules.d/"; } + + if ($dracutver > "033") { + my $perm = (stat("$fullpath/$dracutdir/patch/initqueue.sh"))[2]; + cp("$fullpath/$dracutdir/patch/initqueue.sh", $dracutmoduledir."99base/"); + chmod($perm&07777, $dracutmoduledir."99base/"."initqueue.sh"); + + + $perm = (stat("$fullpath/$dracutdir/patch/module-setup.sh"))[2]; + cp("$fullpath/$dracutdir/patch/module-setup.sh", $dracutmoduledir."98syslog/"); + chmod($perm&07777, $dracutmoduledir."98syslog/"."module-setup.sh"); + + $perm = (stat("$fullpath/$dracutdir/patch/rsyslogd-start.sh"))[2]; + cp("$fullpath/$dracutdir/patch/rsyslogd-start.sh", $dracutmoduledir."98syslog/"); + chmod($perm&07777, $dracutmoduledir."98syslog/"."rsyslogd-start.sh"); + + $perm = (stat("$fullpath/$dracutdir/patch/syslog-genrules.sh"))[2]; + cp("$fullpath/$dracutdir/patch/syslog-genrules.sh", $dracutmoduledir."98syslog/"); + chmod($perm&07777, $dracutmoduledir."98syslog/"."syslog-genrules.sh"); + + } + my $dracutmpath = $dracutmoduledir."97xcat/"; mkpath($dracutmpath); @@ -910,10 +933,10 @@ sub mkinitrd_dracut { # update etc/dracut.conf open($DRACUTCONF, '>', "$rootimg_dir/etc/dracut.conf"); if (-d glob($dracutmoduledir."[0-9]*fadump")){ - print $DRACUTCONF qq{dracutmodules+="xcat nfs base network kernel-modules fadump"\n}; + print $DRACUTCONF qq{dracutmodules+="xcat nfs base network kernel-modules fadump syslog"\n}; } else{ - print $DRACUTCONF qq{dracutmodules+="xcat nfs base network kernel-modules"\n}; + print $DRACUTCONF qq{dracutmodules+="xcat nfs base network kernel-modules syslog"\n}; } print $DRACUTCONF qq{add_drivers+="$add_drivers"\n}; close $DRACUTCONF; @@ -930,6 +953,8 @@ sub mkinitrd_dracut { $additional_options= qq{--include /tmp/cmdline /etc/cmdline}; } + + # force the dracut run in non-hostonly mode for dracut higher than version 033 if ($dracutver > "033") { $additional_options .= " -N";