## 101212.xen4_update_vm ## - was: 100804.xen4_update_vm080304.xenu_update_mod ## - migrate para-VM to xen-4 ## - fix xen4: ## ca02 131073 xvda2 driver: vbd ## Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ## - details: 100802.prob.xen-4.vfs_unable_mount_xvda_vbd ## - copy linux-XenU-modules into VM-Image (offline) ## procedure: extract version from vm.cfg -> mount fs -> copy modules ## - create devices (ex. hvc,xvda) ## - notes ## - xen4 use 3 different names for the same object (confused). sample: ## vmcfg:root = "ca01 ro" ## vmcfg:disk = ...,sda1,w' ## vm:fstab:/dev/xvda1 / ext3... ## - usage: copy&paste line by line, check variables before use ## optional: check config with xm_sh_tech ## - contact: hlehmann_at_fh-lausitz.de #### --------------------------------------------------------------------- #### CHANGES ## 101212 ## - fix oldhd ## - debug ## 100804 ## - add check xvda (100802.prob.xen-4.vfs_unable_mount_xvda_vbd) ## - add support lvol ## - add check hvc #### --------------------------------------------------------------------- #### var CFG=vm1 ## vm.cfg <-- change it etcxencfg=/etc/xen/$CFG chkdevxvda=1 ## 1: mknod xvdaX (update to pvops) maxdevxvd=4 ## n: mknod xvda4 (depend chkdevxvda=1) chkfstabxvd=1 ## 1: convert fstab sda -> xvda mnt=/mnt/tmp ## temp mountpoint LOG=$HOME/xenu_update_mod.log chkkernel=1 ## 1: replace $imgxenu in vm.cfg imgxenu=/boot/vmlinux-2.6.32 ## new imgxenu imgxenu=`ls -tr /boot/vmli*xenU | tail -1` ## new imgxenu chkhvc=1 ## 1: check: xencons securetty /dev/hvc0 inittab chkca=1 ## 1: convert root=/dev/sda1 -> root=ca01 #### sh env echo "CFG=$CFG mnt=$mnt imgxenu=$imgxenu" [ ! -d $mnt ] && echo "Error: dir $mnt not exist" [ `mount | egrep "$mnt " | wc -l` -eq 1 ] && echo "Error: mnt $mnt busy" [ $chkkernel -eq 1 -a ! -f $imgxenu ] && echo "Error: file $imgxenu not exist" [ ! -f $etcxencfg ] && echo "Error: file $etcxencfg not exist" ls -l $etcxencfg* [ -f $LOG ] && grep $CFG $LOG echo "`date +%y%m%d` update_mod CFG=$CFG chkdevxvda=$chkdevxvda \ chkfstabxvd=$chkfstabxvd chkhvc=$chkhvc" | tee -a $LOG #### check VERxenU #VERxenU=`uname -r | sed "s/-xen.*//"`-xenU #echo "VERxenU=$VERxenU" ## unused ### read cfg kimg=`cat $etcxencfg | grep "^kern" | cut -d = -f 2 | sed "s/\"//g;s/ //g"` #kver=`echo $kimg | sed "s:\"::g;s:^.*vmlinuz-\(.*\)$:\1:"` echo "kimg=$kimg" #if [ "$VERxenU" != "$kver" ]; then echo Version xenU differ. using $kver; # VERxenU=$kver; fi vmname=`cat $etcxencfg | grep "^name" | cut -d = -f 2 | sed "s/\"//g;s/ //g"` [ ! -f $kimg ] && echo "Warning: configured image $kimg not found" echo "CFG=$CFG vmname=$vmname kimg=$kimg" #### read VM-Image ## root-fs defined at 1. line typical #imgroot=`cat $etcxencfg | grep "^disk" |sed "s/,/:/" | cut -d : -f 2 | head -1` imgroot=`cat $etcxencfg | grep "^disk" |cut -d , -f 1 |sed "s:.*\:::"|head -1` ls -la $imgroot* [ ! -f "$imgroot" -a ! -e "$imgroot" ] && echo "Error: root-fs $imgroot not found" #### read ModVer #VERmod=`zcat $kimg | strings | grep ^2.6 | head -1 | awk '{ print $1}'` #[ "$VERmod" = "" ] && VERmod=`cat $kimg | strings | grep ^2.6 | head -1 \ # | awk '{ print $1}'` #echo "VERmod=$VERmod" #### list avaible modules #ls -la /lib/modules/ | grep $VERmod #[ ! -d "/lib/modules/$VERmod" ] && echo "ERROR: Dir /lib/modules/$VERmod not exist" #### --------------------------------------------------------------------- #### chkkernel grep kernel $etcxencfg echo "check $kimg -> $imgxenu" if [ $chkkernel -eq 1 ]; then if [ `grep "$imgxenu" $etcxencfg | wc -l` -eq 1 ]; then echo "nothing to do" else echo "change $kimg -> $imgxenu" cp -p $etcxencfg $etcxencfg.old cat $etcxencfg.old | sed "s%$kimg%$imgxenu%" > $etcxencfg diff $etcxencfg.old $etcxencfg fi fi #### reread cfg kimg=`cat $etcxencfg | grep "^kern" | cut -d = -f 2 | sed "s/\"//g;s/ //g"` echo "kimg=$kimg" [ ! -f $kimg ] && echo "ERROR: Image $kimg not found" #### read ModVer VERmod=`zcat $kimg | strings | grep ^2.6 | head -1 | awk '{ print $1}'` [ "$VERmod" = "" ] && VERmod=`cat $kimg | strings | grep ^2.6 | head -1 \ | awk '{ print $1}'` echo "VERmod=$VERmod" [ ! -d "/lib/modules/$VERmod" ] && echo "ERROR: Dir /lib/modules/$VERmod not exist" #### xen0: compile xenU modules # xen-2.x: linux-$VERlin-xenU# make ARCH=xen modules modules_install # xen-3.x: build*$VERlin*xenU# make modules modules_install #### Shutdown VM xm list $vmname xm shut $vmname sleep 30 #### mount VM-Image [ -f $imgroot ] && mount -o loop $imgroot $mnt [ ! -f $imgroot -a -e $imgroot ] && mount $imgroot $mnt #devm=/dev/mapper #[ ! -f $devm/$imgroot -a -e $devm/$imgroot ] && mount $devm/$imgroot $mnt #### list installed modules ls -l /lib/modules/ | grep $VERmod ls -l $mnt/lib/modules/ | grep $VERmod du -sk $mnt/lib/modules/* #### copy files # rm -fR $mnt/lib/modules/$VERmod dir=$mnt/lib/modules/$VERmod; [ -d $dir -a "$VERmod" != "" ] && mv $dir $dir.old # mkdir $mnt/lib/modules/$VERmod [ "$VERmod" != "" ] && echo "exec: cp -a /lib/modules/$VERmod $mnt/lib/modules/" [ "$VERmod" != "" ] && cp -a /lib/modules/$VERmod $mnt/lib/modules/ du -sk $mnt/lib/modules/* ls -la $mnt/lib/modules #### chkdevxvda (xen-4) if [ $chkdevxvda -eq 1 -a ! -e $mnt/dev/xvda ]; then mknod -m 600 $mnt/dev/xvda b 202 0; chown root:disk $mnt/dev/xvda for i in $(seq 1 $maxdevxvd) ;do mknod -m 600 $mnt/dev/xvda$i b 202 $i; chown root:disk $mnt/dev/xvda$i ls -la $mnt/dev/xvda$i done else echo "/dev/xvda already exist, nothing to do" fi # ls -l $mnt/dev/xvda* #### chkfstab (xen-4) if [ $chkfstabxvd -eq 1 ]; then file=$mnt/etc/fstab # cat $file if [ `grep xvda $file| wc -l` -eq 0 ]; then old=hda; [ `grep sda $file| wc -l` -ne 0 ] && old=sda echo update $file $old xvda mv $file $file.old cat $file.old | sed "s:$old:xvda:g" > $file diff $file.old $file # chkca=1 ## recommended else echo "xvda found in $file, nothing to do" fi ls -l $file* fi file=$etcxencfg # grep root $file if [ $chkca -eq 1 -a $chkfstabxvd -eq 1 ]; then if [ `grep root $file | grep ca0| wc -l` -eq 0 ]; then old=hda; [ `grep sda $file| wc -l` -ne 0 ] && old=sda echo "chg $old -> ca0" cp -p $file $file.old #cat $file.old | sed "s:$old:ca0:g" > $file cat $file.old | sed "s:\(^root.*\)/dev/$old\(.*$\):\1ca0\2:g" > $file diff $file.old $file else echo "ca0 found in $file, nothing to do" fi fi ## if chkca ## inittab getty # http://www.archivum.info/ubuntu-bugs@lists.ubuntu.com/2010-05/00402/(Bug-572708)-(NEW)-upstart-disables-hvc0-getty-in-Lucid-10.04.html # http://www.mjmwired.net/kernel/Documentation/powerpc/hvcs.txt ##-d $mnt/etc/init if [ $chkhvc -eq 1 -a -d $mnt/etc/init ]; then file=$mnt/etc/init/hvc0.conf if [ ! -f $file ]; then echo "create $file" cat > $file<> $file diff $file.old $file else echo "entry hvc0 found in $file, nothing to do" fi fi ## !-d $mnt/etc/init ## /dev/hvc0 if [ $chkhvc -eq 1 ]; then if [ ! -e $mnt/dev/hvc0 ]; then echo "mknod $mnt/dev/hvc0 c 229 0" mknod $mnt/dev/hvc0 c 229 0 else echo "/dev/hvc0 already exist" fi ls -l $mnt/dev/hvc* fi ## if chkhvc ## securetty if [ $chkhvc -eq 1 ]; then file=$mnt/etc/securetty if [ `grep hvc0 $file| wc -l` -eq 0 ]; then echo "add hvc0 $file" cp -p $file $file.old echo "hvc0" >> $file else echo "entry hvc0 already exist in $file, nothing to do" fi ls -l $file* fi ## if chkhvc ## xencons file=$etcxencfg if [ $chkhvc -eq 1 ]; then if [ `grep xencons $file| wc -l` -eq 0 ]; then echo "add extra=\"xencons=tty\"" cp -p $file $file.old echo "extra=\"xencons=tty\"" >> $file diff $file.old $file else echo "xencons found in $file, nothing to do" fi fi ## if chkhvc ## show vm.cfg [ `grep -v "^#" $etcxencfg | grep xenbr | wc -l` -ne 0 ] \ && echo "Warn: uihhh...asbach, check bridge: brctl show (chg. not impl. yet)" [ `grep -v "^#" $etcxencfg | grep ramdisk | wc -l` -ne 0 ] \ && echo "Warn: ramdisk found (chg. not impl. yet)" grep -v "^#" $etcxencfg #### umount VM-Image umount $mnt #### --------------------------------------------------------------------- #### start VM # xm create $CFG # xm list xm create $CFG -c