[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] sidecar (hvm shim) creation script
On Wed, Jan 10, 2018 at 5:07 AM, Ian Jackson <ian.jackson@xxxxxxxxxxxxx> wrote: > The attached script works for me. I have been testing it with a > Citrix pvshim shim series and a shim binary that Wei passed me under > the table. It makes a bootable HVM guest config for a PV guest. > > Things that I see are wrong: > > * My guest is trying to balloon up but due to the extra memory used > by the shim it can't. I hope Amazon's vixen series has some kind > of bodge for this ? Max memory gets set in dom0 construction so the guest will try every minute but fail. It results in spurious debug printks if you have guest loglvl set to debug but no real harm otherwise. Regards, Anthony Liguori > * I see this message when I create the domain: > xc: error: ERROR: Not a Xen-ELF image: No ELF notes or '__xen_guest' > section found: Invalid kernel > which I hope is something to do with the shim series (which > I also built my tools from) or the shim binary I am using. > > I don't know what the default shim path should be. > > Ian. > > > #!/usr/bin/perl -w > # > # usage: > # pvshim-converter [OPTIONS] OLD-CONFIG NEW-CONFIG > # > # options: > # --sidecars-directory DIR default is /var/lib/xen/pvshim-sidecars > # --shim SHIM overrides domain config file > # --debug verbose, and leaves sidecar prep dir around > # > # What we do > # > # read existing config file using python > # determine kernel, ramdisk and cmdline > # use them to produce sidecar and save it under domain name > # mess with the things that need to be messed with > # spit out new config file > > use strict; > > use Getopt::Long; > use JSON; > use IO::Handle; > use POSIX; > use Fcntl qw(:flock); > > our $debug; > > sub runcmd { > print STDERR "+ @_\n" if $debug; > $!=0; $?=0; system @_ and die "$_[0]: $! $?"; > } > > our $shim; > our $sidecars_dir = '/var/lib/xen/pvshim-sidecars'; > > GetOptions('sidecars-directory=s' => \$sidecars_dir, > 'shim=s' => \$shim, > 'debug' => \$debug) > or die "pvshim-converter: bad options\n"; > > @ARGV==2 or die "pvshim-converter: need old and new config filenames"; > > our ($in,$out) = @ARGV; > > our $indata; > > if ($in ne '-') { > open I, '<', "$in" or die "open input config file: $!\n"; > } else { > open I, '<&STDIN' or die $!; > } > { > local $/; > $indata = <I>; > } > I->error and die $!; > close I; > > open P, "-|", qw(python -c), <<END, $indata or die $!; > import sys > import json > l = {} > exec sys.argv[1] in l > for k in l.keys(): > if k.startswith("_"): > del l[k] > print json.dumps(l) > END > > our $c; > > { > local $/; > $_ = <P>; > $!=0; $?=0; close P or die "$! $?"; > $c = decode_json $_; > } > > die "no domain name ?" unless exists $c->{name}; > die "bootloader not yet supported" if $c->{bootloader}; > die "no kernel" unless $c->{kernel}; > > our $sidecar = $c->{pvshim_sidecar_path} || "$sidecars_dir/$c->{name}.iso"; > our $dmwrap = $c->{pvshim_sidecar_path} || "$sidecars_dir/$c->{name}.dm"; > > $shim ||= $c->{pvshim_path}; > $shim ||= '/usr/local/lib/xen/boot/xen-shim'; > > our $shim_cmdline = $c->{pvshim_cmdline} || 'pv-shim console=xen,pv > sched=null'; > $shim_cmdline .= ' '.$c->{pvshim_extra} if $c->{pvshim_extra}; > > our $kernel_cmdline = $c->{cmdline} || ''; > $kernel_cmdline .= ' root='.$c->{root} if $c->{root}; > $kernel_cmdline .= ' '.$c->{extra} if $c->{extra}; > > print "pvshim-converter: creating sidecar in $sidecar\n"; > > runcmd qw(mkdir -m700 -p --), $sidecars_dir; > > open L, ">", "$sidecar.lock" or die "$sidecar.lock: open $!"; > flock L, LOCK_EX or die "$sidecar.lock: lock: $!"; > > my $sd = "$sidecar.dir"; > > system qw(rm -rf --), $sd; > mkdir $sd, 0700; > > runcmd qw(cp --), $shim, "$sd/shim"; > runcmd qw(cp --), $c->{kernel}, "$sd/kernel"; > runcmd qw(cp --), $c->{ramdisk}, "$sd/ramdisk" if $c->{ramdisk}; > > my $grubcfg = <<END; > serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1 > terminal_input serial > terminal_output serial > > set timeout=0 > > menuentry 'Xen shim' { > insmod gzio > insmod xzio > multiboot (cd)/shim placeholder $shim_cmdline > module (cd)/kernel placeholder $kernel_cmdline > module (cd)/ramdisk > } > END > > runcmd qw(mkdir -p --), "$sd/boot/grub"; > open G, ">", "$sd/boot/grub/grub.cfg" or die "$sd, grub.cfg: $!"; > print G $grubcfg or die $!; > close G or die $!; > > unlink "$sidecar.new" or $!==ENOENT or die "$sidecar.new: rm: $!"; > runcmd qw(grub-mkrescue -o), "$sidecar.new", "$sidecar.dir"; > if (!stat "$sidecar.new") { > $!==ENOENT or die "$sidecar.new: stat: $!"; > > print STDERR <<END; > pvshim-converter: grub-mkrescue exited with status zero but failed to make > iso. > NB that grub-mkrescue has a tendency to lie in its error messages. > END > my $missing; > foreach my $check (qw(xorriso mformat)) { > $missing |= system qw(sh -c), "type $check"; > } > > if ($missing) { > print STDERR <<END; > You seem to have some program(s) missing which grub-mkrescue depends on, > see above. ("mformat" is normally in the package "mtools".) > Installing those programs will probably help. > END > } else { > print STDERR <<END; > And older grub-mkrescue has a tendency not to notice certain problems. > Maybe strace will tell you what is wrong. :-/ > END > } > die "pvshim-converter: grub-mkrescue did not make iso\n"; > } > > runcmd qw(rm -rf --), "$sidecar.dir" unless $debug; > > open Q, ">", "$dmwrap.new" or die "$dmwrap: $!"; > print Q <<'END_DMWRAP'; > #!/bin/bash > > set -x > : "$@" > set +x > > newargs=() > > newarg () { > newargs+=("$1") > } > > while [ $# -gt 1 ]; do > case "$1" in > -no-shutdown|-nodefaults|-no-user-config) > newarg "$1"; shift > ;; > -xen-domid|-chardev|-mon|-display|-boot|-m|-machine) > newarg "$1"; shift > newarg "$1"; shift > ;; > -name) > newarg "$1"; shift > name="$1"; shift > newarg "$name" > ;; > -netdev|-cdrom) > : fixme > newarg "$1"; shift > newarg "$1"; shift > ;; > -drive|-kernel|-initrd|-append|-vnc) > shift; shift > ;; > -device) > shift > case "$1" in > XXXrtl8139*) > newarg "-device" > newarg "$1"; shift > ;; > *) > shift > ;; > esac > ;; > *) > echo >&2 "warning: unexpected argument $1 being passed through" > newarg "$1"; shift > ;; > esac > done > > if [ "x$name" != x ]; then > logdir=/var/log/xen > logfile="$logdir/shim-$name.log" > savelog "$logfile" ||: > newarg -serial > newarg "file:$logfile" > fi > > set -x > exec /usr/local/lib/xen/bin/qemu-system-i386 "${newargs[@]}" > END_DMWRAP > > chmod 0755, "$dmwrap.new" or die "$dmwrap: chmod: $!"; > > close Q or die $!; > > rename "$sidecar.new", $sidecar or die "$sidecar: install: $!"; > rename "$dmwrap.new", $dmwrap or die "$dmwrap: install: $!"; > > print STDERR <<END; > pvshim-converter: wrote qemu wrapper to $dmwrap > pvshim-converter: wrote sidecar to $sidecar > END > > my $append = <<END; > builder='hvm' > type='hvm' > device_model_version='qemu-xen' > device_model_override='$dmwrap' > device_model_args_hvm=['-cdrom','$sidecar'] > boot='c' > END > > if ($out ne '-') { > open O, ">", "$out.tmp" or die "open output config temp: $out.tmp: $!\n"; > } else { > open O, ">&STDOUT" or die $!; > } > > print O $indata, "\n", $append or die "write output: $!"; > close O or die "close output: $!"; > > if ($out ne '-') { > rename "$out.tmp", $out or die "install output: $!"; > print STDERR "pvshim-converter: wrote new guest config to $out\n"; > } else { > print STDERR "pvshim-converter: wrote new guest config to stdout\n"; > } > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |