Switch_root / pivot_root help needed
Patrick Zwahlen
zwahlen at partenaire.ch
Mon Mar 20 15:39:10 UTC 2006
Hi Rob, and thanks for the quick reply.
I have changed 2 things:
- My /init is now a regular file
- I do an "exec switch_root ..." instead of just "switch_root"
... And it now works like a charm.
Thanks again ! - Patrick -
> -----Original Message-----
> From: Rob Landley [mailto:rob at landley.net]
> Sent: vendredi, 17. mars 2006 21:10
> To: busybox at busybox.net
> Cc: Patrick Zwahlen
> Subject: Re: Switch_root / pivot_root help needed
>
> On Friday 17 March 2006 4:42 am, Patrick Zwahlen wrote:
> > Hi there,
> >
> > I am new to this mailinglist, and would need some help on solving a
> > switch_root problem. I couldn't find examples in the list,
> but I might
> > have looked too fast... :-)
> >
> > I am working on a project that will ultimately run on a
> Soekris box,
> > but I am doing my current tests using qemu.
>
> svn 14007 applied a fix to switch_root after 1.1.0 came out.
> 1.1.1 comes out monday, might want to grab a current snapshot
> and test to see if stuff works for you...
>
> > Anyway, here is what I am doing:
> >
> > - I boot a 2.6.15.6 kernel (i586)
> > - kernel uncompresses an initramfs (cpio archive passed from the
> > bootloader)
> > - /init is an ash script
> > - I mount /proc /sys
> > - I mount /dev as tmpfs (this is what RedHat are doing in their
> > initrd, not sure why...)
>
> Mostly to provide an empty directory so you don't have to
> worry about deleting stuff from last time.
>
> > - I populate /dev using udevstart
>
> Might want to look at mdev, but it's your system.
>
> > - I mount my hard drive, which contains my new root filesystems
> > (currently ext2 files)
> > mount /dev/hda2 /mnt/hda2
> > - I loopback mount my rootfs
> > mkdir /mnt/newroot
> > losetup /dev/loop0 /mnt/hda2/rootfs.ext2
> > mount /dev/loop0 /mnt/newroot
> > - I mount /proc in my new root
>
> You can mount --move the existing /proc and /sys mounts, by the way...
>
> > - And finally:
> > cd /mnt/newroot
> > switch_root -c /dev/ttyS0 . /sbin/init
> > switch_root: not rootfs
>
>
>
> > The code generating the error is in switch_root.c
> > =================================================
> > if (stat("/init", &st1) || !S_ISREG(st1.st_mode) || statfs("/",
> > &stfs) ||
> > (stfs.f_type != RAMFS_MAGIC && stfs.f_type !=
> > TMPFS_MAGIC) ||
> > getpid() != 1)
> > {
> > bb_error_msg_and_die("not rootfs");
> > }
> > =================================================
> > However, I don't understand which test is failing.
>
> You can break 'em up a bit and stick printf() calls between them.
>
> > My /init does exist,
> > but it is a symbolic link to /etc/rc.sysinit (my actual ash script).
>
> Looks like the S_ISREG() is hitting you then. Yeah, a
> symlink is legitimate, I should tweak that...
>
> > My
> > "/" is not listed when I do a "mount",
>
> cat /proc/mounts
>
> > but it is definitely the kernel's
> > rootfs. And finally, I am pretty sure I am PID 1. I am
> clearly wrong
> > somewhere here :-)
> >
> > I have also done a test with pivot_root:
> > cd /mnt/newroot
> > pivot_root . Initrd
> > pivot_root: pivot_root: Invalid argument
>
> pivot_root won't work with rootfs. You can't relocate/umount rootfs.
>
> > At this point, I am stuck ! Are there special kernel requirements ?
> > Does busybox's switch_root/pivot_root depends on other applets ?
>
> No, I'm guessing it's the S_ISREG() test. I suppose we don't
> really _need_ that...
>
> > Thanks a lot for your help and support. - Patrick -
>
> Rob
> --
> Never bet against the cheap plastic solution.
>
More information about the busybox
mailing list