|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC 3/6] linux-stubdomain: Build a disk image.
On 19/04/13 10:26, Ian Campbell wrote:
> On Wed, 2013-04-17 at 20:09 +0100, Anthony PERARD wrote:
>> This patch build a disk image intend to be mounted as rootfs by the
>> stub-domain. It is build using the 'debugfs' tool and make a ext2 fs.
>
> You seem to have some vestigial code for building a cpio style initramfs
> -- what was wrong with that approach? On the face of it that would seem
> simpler and less "hacky" than the tricks you have to play with debugfs.
The initramfs were taking more memory for the stub domain, I could not
go under 40MB, and now, with the disk, it's 34MB the min that the domain
his willing to run with.
> [...]
>> diff --git a/stubdom-linux/extra/initscript
b/stubdom-linux/extra/initscript
>> new file mode 100644
>> index 0000000..122892f
>> --- /dev/null
>> +++ b/stubdom-linux/extra/initscript
>> @@ -0,0 +1,40 @@
>> +#!/bin/busybox sh
>
> This can become the more normal /bin/sh if you put the appropriate
> symlink in the initrd?
If I recall correctly, I tryed the symlink, and it was not starting.
Maybe a hardlink would works.
>> +
>> +_initscript_panic() {
>> + sleep 10
>> +}
>
> Erm...
Yes, that debug stuff which can be removed...
>> +trap _initscript_panic 0
>> +
>> +set -e
>> +set -x
>> +mount -t sysfs /sys /sys
>> +mount -t proc /proc /proc
>> +mount -t xenfs -o nodev /proc/xen /proc/xen
>> +
>> +# TODO: Check if there is network for the vm before doing this
>> +if test -e /sys/class/net/eth0; then
>> + ip link set eth0 address fe:ff:ff:ff:ff:fe
>> + ip addr flush eth0
>> + ip link set eth0 up
>> + brctl addbr br0
>> + brctl addif br0 eth0
>> + ip link set br0 up
>> +else
>> + echo "No network interface named eth0."
>> + ls -l /sys/class/net/
>> +fi
>> +
>> +# TODO Could probably to xenstore-read `xenstore-read vm`/image/dmargs
>> +# because /local/domain/$domid is probably the root for relative path
>> +domid=$(xenstore-read target)
>> +dom_path="/local/domain/$domid"
>> +vm_path=$(xenstore-read "$dom_path/vm")
>> +dm_args=$(xenstore-read "$vm_path/image/dmargs")
>> +
>> +( sleep 30; free ) &
>> +( sleep 60; free ) &
>> +#( sleep 120; ip addr ) &
>> +( sleep 120; free ) &
>
> Erm....
Same.
>> +free
>> +/bin/qemu $dm_args
>> diff --git a/stubdom-linux/extra/qemu-ifup
b/stubdom-linux/extra/qemu-ifup
>> new file mode 100644
>> index 0000000..d71672b
>> --- /dev/null
>> +++ b/stubdom-linux/extra/qemu-ifup
>> @@ -0,0 +1,7 @@
>> +#! /bin/busybox sh
>> +
>> +ip link set "$1" down
>> +ip link set "$1" address fe:ff:ff:ff:ff:fd
>> +ip addr flush "$1"
>> +brctl addif br0 "$1"
>> +ip link set "$1" up
>
> I don't think this will work for domains with multiple network devices.
> e.g. if you want vifX.0 on xenbr0 and vifX.1 on xenbr0 in the dom0
> backend this will cause them both to get put on the same bridge inside
> the stubdom and therefore surface as a single device in dom0.
OK, I will look into that.
>> diff --git a/stubdom-linux/mk-ramdisk-common
b/stubdom-linux/mk-ramdisk-common
>> new file mode 100755
>> index 0000000..9a4a810
>> --- /dev/null
>> +++ b/stubdom-linux/mk-ramdisk-common
>> @@ -0,0 +1,178 @@
>> +#!/bin/bash
>> +#
>> +# This a simple implementaton of mkinitrd
>
> implementation
>
>> +
>> +
>> +# Set the umask. For iscsi, the initrd can contain platintext
>> +# password (chap secret), so only allow read by owner.
>> +umask 022
>> +
>> +TMPDIR="/tmp"
>> +PROBE="yes"
>> +MNTIMAGE="`pwd`/initramfs/"
>> +IMAGE="./initramfs.cpio"
>> +verbose=""
>> +: ${debug:=false}
>> +case $debug in
>> + true|false) ;;
>> + *)
>> + echo '$debug need to be true or false.'
>> + exit 1
>> + ;;
>> +esac
>> +$debug && verbose='-v'
>> +
>> +DSO_DEPS=""
>> +LDSO=""
>> +get_dso_deps() {
>> + bin="$1" ; shift
>> + DSO_DEPS=""
>> +
>> + declare -a FILES
>> + declare -a NAMES
>> +
>> + # this is a hack, but the only better way requires binutils or
elfutils
>> + # be installed. i.e., we need readelf to find the interpretter.
>
> binutils will surely be installed while building Xen, won't it?
Yes, I will use those for the script.
> "interpreter"
>> [...]
>
>> + case "$FILE" in
>> + /lib*)
>> + TLIBDIR=`echo "$FILE" | sed 's,\(/lib[^/]*\)/.*$,\1,'`
>> + BASE=`basename "$FILE"`
>> + # Prefer nosegneg libs over direct segment accesses
on i686.
>> + if [ -f "$TLIBDIR/i686/nosegneg/$BASE" ]; then
>> + FILE="$TLIBDIR/i686/nosegneg/$BASE"
>> + # Otherwise, prefer base libraries rather than their
optimized
>> + # variants.
>
> Do we not want optimised e.g. SDL libraries if available, or other
> libraries related to the provision of things like VNC which are the
> sorts of instruction hungry stuff that I'd expect to benefit from
> additional clever instructions...
> [...]
>
>> +# this cp keep the link to ld-2.11.x.so
>> +if test "`uname -m`" = x86_64; then
>> + cp --no-dereference "/lib/ld-linux-x86-64.so.2"
"$MNTIMAGE/lib/ld-linux-x86-64.so.2"
>> +else
>> + cp --no-dereference "/lib/ld-linux.so.2" "$MNTIMAGE/lib/ld-linux.so.2"
>> +fi
>
> Didn't you jump through some hoops earlier to find the actual dynamic
> interpreter?
The script was not working for this lib.
>> +try_make_disk=true
>> +if $try_make_disk; then
>> + stubdom_disk=stubdom-disk.img
>> + rm -f $stubdom_disk
>> + dd if=/dev/null of=$stubdom_disk bs=1M seek=40
>> + mkfs.ext2 -q -F -m0 $stubdom_disk
>> +
>> + cd "$MNTIMAGE"
>> + stubdom_disk="../$stubdom_disk"
>> + new_link(){
>> + image=$1
>> + link=$2
>> + target=`readlink $link`
>> + dir=`dirname $link`
>> + dir=${dir#./}
>> + name_link=$(basename $link)
>> + dir_inode=$(debugfs -R "stat /$dir" $image 2>/dev/null |
>> + sed -nr 's/^Inode: ([[:digit:]]+)[[:space:]].*/\1/p')
>> + test "$dir_inode" || echo 'no dir inode found'
>> + test "$dir_inode"
>> + while true; do
>> + free_inode=$(debugfs -R "find_free_inode $dir_inode 0777" -w
$image 2>/dev/null |
>> + sed -nr 's/^Free inode found: ([[:digit:]]+)$/\1/p')
>> + undel_output="$(debugfs -R "undel <$free_inode>
/$dir/$name_link" -w $image 2>&1)"
>> + if grep -q "make_link: No free space in the directory"
<<<"$undel_output"; then
>> + debugfs -R "expand_dir /$dir" -w $image 2>/dev/null
>> + else
>> + break
>> + fi
>> + done
>> + debugfs -f <(
>> + echo "cd /$dir"
>> + echo "set_inode_field $name_link mode 0120777"
>> + echo "set_inode_field $name_link size ${#target}"
>> + # TODO still need to write the link into blocks
>> + if test ${#target} -lt $((12*4)); then
>> + # write into direct block
>> + blockn=0
>> + while test "$target"; do
>> + t="${target:0:4}"
>> + target="${target:4}"
>> + #convert a four charactere string into hexa
>> + val=$(printf '0x%02x%02x%02x%02x\n' \'${t:3:1}
\'${t:2:1} \'${t:1:1} \'${t:0:1})
>> + echo "set_inode_field $name_link block[$blockn] $val"
>> + blockn=$((blockn+1))
>> + done
>> + else
>> + # write into a block
>> + echo >&2 ".... write into block not implemented"
>> + fi
>> + ) -w $image >/dev/null 2>/dev/null
>> + }
>> + # TODO Should check for "copy_file: Could not allocate block in
ext2 filesystem"
>> + debugfs -f <(find . \
>> + \( -type d \! -name . -printf 'cd /\nmkdir %h/%f\n' \) \
>> + -o \( -type f -printf 'cd /%h\nwrite %h/%f %f\n' \) \
>> + | sed -re 's%^((mkdir|cd) )./%\1/%' ) -w $stubdom_disk >/dev/null
>
> This stuff all seems pretty exciting, but isn't it rather fragile
> against differences in e2fstools versions etc?
Yes, that was the only good enough way to create a disk image as user
(not root), with an utility present at least on debian.
> I suppose you must have /usr/sbin and /sbin in your $PATH because none
> of debugfs, mkfs.ext2 and fsck.ext2 appear in my $PATH...
Yes, I don't remove {,/usr}/sbin from my PATH.
>> + find . -type l | while read line; do
>> + new_link $stubdom_disk "$line"
>> + done
>> + fsck.ext2 -fy $stubdom_disk || true
>> + cd - >/dev/null
>> +else
>> + (cd "$MNTIMAGE"; findall . | cpio -H newc --quiet -o) >| "$IMAGE"
|| exit 1
>> + gzip -f "$IMAGE"
>
> This seems like it should be a much simpler option...
--
Anthony PERARD
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |