|
From: Michael R. <mc...@sa...> - 2013-08-26 22:14:32
|
Teto <mat...@gm...> wrote:
>> Yes, you could do this. I use hostfs for /, and I just mount
>> /usr/share from the host.
> Could you please detail the procedure since I get lost in your files.
> And the man page looks ambiguous to me. First how do you launch your
> uml kernel: just host$ ./uml_kernel initrd=custom_initrd or you add "
> root=cowtempfile,/dev/sdb5" ? I wish you could explain to me what to
> mount and when. Your init replace the temporary (/,/dev,/etc etc..) by
High-level explanation of UNTI.
1) You point (via umlsetup.sh) at the kernel source you want, it makes an lndir
link tree (%1) for the kernel, and compiles it.
2) You also point at the UML root tree you want to use.
That's an extracted file system that lives on the host, not a COW or loopback
file. We suggest you put your UML file systems on the same disk as
your reference root file system, as it can use hard links, which is way
faster, and saves piles of disk space.
3) an initrd is created from files in the root file system, and a linuxrc
file is created that:
a) populates a /dev (we used to use devfs, but it went away) into a ramfs.
b) gropes /proc/cmdline to find out where / is on the host, and mounts it
with hostfs.
c) invokes /sbin/init
At some point, hostfs grew caching, which is annoying, because it means that
I have to rm /my/test/program from within the UML, each time before I can
make DESTDIR= install it again from the host, or the file does not update. I
wish I could turn that off.
(%1) since 2.6.x some other make options would let you avoid that, but
in some cases one wants to patch the kernel before compiling, but
not screw with the original kernel source, and anyway, we started
in the 2.4 days.
LOW LEVEL stuff. A script is generated:
00 #!/bin/sh
01
02 if [ -z "${TEST_PURPOSE}" ] && [ -f /uml/umlbuild/.switches.sh ]; then . /uml/umlbuild/.switches.sh; fi
03 # get value from baseconfig
04 . /corp/projects/pandora/unstrung/testing/baseconfigs/net.A.sh
05
06 /uml/umlbuild/plain/vmlinux initrd=/uml/umlbuild/initrd.cpio
umlroot=/uml/umlbuild/A/root
root=/dev/ram0 rw ssl=pty
ssl0=port:1300 ssl1=port:1301
umid=A $net
$UML_DEBUG_OPT $UML_A_OPT
rdinit=/linuxrc $*
07 if [ -n "$UML_SLEEP" ]; then eval $UML_SLEEP; fi
02 - this sucks in some variables that tells net.A.sh, if there is a
uml_netjig (a version of uml_switch that knows how to play back pcap
files), running, or if one should use multicast sockets.
04 - each virtual machine has some network configuration, which looks like:
net_eth0="eth0=mcast,12:00:00:dc:bc:ff,239.192.0.1,21200"
net_eth1="eth1=mcast,12:00:00:64:64:23,239.192.1.2,31200";
net="$net_eth0 $net_eth1"
06 - the kernel to run.
- the initrd in CPIO format.
- umlroot= path to what path on the host to mount as /
- serial port 0 is the current pty, and some additional serial ports.
I use serial ports with gdbattach a lot to let me debug a
process inside the UML from outside. If I'm debugging the kernel
itself, I just gdb attach to the kernel.
- $net from above.
- rdinit=/linuxrc
07 - I tend to run the start.sh script in a fresh xterm -e, and if the kernel
bails, the xterm closes immediately, so "export UMLSLEEP='sleep 60'" helps
here.
https://github.com/mcr/unstrung uses this, as does:
https://github.com/xelerance/openswan
See https://github.com/mcr/unstrung/blob/master/testing/utils/linuxrc-uml.sh
for the linuxrc that I use.
--
] Never tell me the odds! | ipv6 mesh networks [
] Michael Richardson, Sandelman Software Works | network architect [
] mc...@sa... http://www.sandelman.ca/ | ruby on rails [
|