lkml.org 
[lkml]   [2003]   [Jul]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: pivot_root seems to be broken in 2.4.21-ac4
Hi Alan,

Alan Cox wrote:
> 2.4.22pre7 has the unshare_files fix - its a security fix.
>
> It should not have changed the behaviour so I'm very interested to
> know if that specific patch set changes the behaviour and precisely
> what your code is doing
I have now compiled vanilla 2.4.21 with the same configuration (but
without the netfilter patch-o-matic patches, which shouldn't matter) -
it works. But now I'm again stuck without the CLE266 module. Attached is
the script that does the actual root fs switch (it is called from init
after the daemons have been stopped, i.e. during runlevel change). I
hope I haven't done anything too stupid in this script, embarassing
myself with this post to LKML... ;)

If you want, I could send you a diff of the two trees (between my
patched 2.4.21 and 2.4.21-ac4 trees). But it will mostly be just your
own -ac4 patch, with preempt and patch-o-matic stuff applied.

Would it help if I tried it with 2.4.22pre7 ?

- Rene

#!/bin/sh
# Switch from harddisk to RAM mode.
#
# Rene Mayrhofer, 2003

. /etc/cramdisk.conf

mntpoint=/cramfs

if [ -e /on-cramfs ]; then
echo "Already running on CRAMFS."
exit 1
fi

if grep -q "$mntpoint" /proc/mounts; then
umount $mntpoint/mnt 2>/dev/null
umount $mntpoint/var 2>/dev/null
umount $mntpoint/data 2>/dev/null
umount $mntpoint/dev 2>/dev/null
umount $mntpoint/proc 2>/dev/null
umount $mntpoint
fi

echo "Building CRAMFS image"
#/usr/local/sbin/createramfs.sh
echo "Mounting CRAMFS image"
# this is stupid - why do we have to do it twice before it works ??
dd if=/boot/cramfs.img of=/dev/rd/0 2>/dev/null
mount -t cramfs /dev/rd/0 $mntpoint
dd if=/boot/cramfs.img of=/dev/rd/0 2>/dev/null
mount -t cramfs /dev/rd/0 $mntpoint
cd $mntpoint

echo "Mounting needed kernel filesystems"
mount -nt proc none proc/
mount -nt devfs none dev/

echo "Changing root to CRAMFS"
/sbin/pivot_root . mnt <dev/console >dev/console 2>&1

echo "Creating RAM disk for var/"
mount -nt tmpfs -o size=300M none var/
echo "Creating directories for var"
for d in $CREATE_VAR_DIRS; do
mkdir -p var/$d
done
echo "Copying directories to var/"
for d in $COPY_VAR_DIRS; do
mkdir -p var/$d
cp -dp mnt/var/$d/* var/$d/ 2> /dev/null
done
echo "Linking directories for var"
for d in $LINK_VAR_DIRS; do
ln -s /var-static/$d var/`dirname $d`
done
echo "Re-executing init"
/usr/sbin/chroot . /sbin/telinit u <dev/console >/dev/console 2>&1

echo "Killing all processes that still have stuff open on /mnt"
/usr/bin/killall getty
/usr/sbin/lsof -n | grep "/mnt" |
while read name pid user fd type device size node name; do
# don't kill ourselves or the currently running rc script ....
if [ -d /proc/$pid ] &&
! cat /proc/$pid/cmdline | grep -q "switch-to-cramfs" &&
! cat /proc/$pid/cmdline | grep -q "/etc/init.d/rc"; then
/bin/kill -9 $pid
fi
done
echo "Mounting data directory read-only"
if grep -q "/mnt/data" /proc/mounts; then
umount -n /mnt/data
fi
mount -nt ext2 -o ro /dev/discs/disc0/part3 /data

echo -n "Postponing unmount of filesystems until runlevel switch has completed"
/usr/sbin/chroot . /bin/bash -c '
# the grep -v is because the processlist contains this command itself...
while ps ax | grep -v "\"/etc/init.d/rc\"" | grep -q "/etc/init.d/rc"; do
sleep 1s
done
echo "Unmounting old filesystems"
if grep -q "/mnt/dev" /proc/mounts; then
umount -n /mnt/dev
fi
if grep -q "/mnt/proc/bus/usb" /proc/mounts; then
umount -n /mnt/proc/bus/usb
fi
if grep -q "/mnt/proc" /proc/mounts; then
umount -n /mnt/proc
fi
if grep -q "/mnt/mnt/cdrom" /proc/mounts; then
umount -n /mnt/mnt/cdrom
fi
if grep -q "/mnt/mnt/usb" /proc/mounts; then
umount -n /mnt/mnt/usb
fi
if grep -q "/mnt/data" /proc/mounts; then
umount -n /mnt/data
fi
if umount /mnt; then
/sbin/hdparm -y /dev/hda
fi' < /dev/null > /dev/null 2> /dev/null &
echo "."
exit 0
\
 
 \ /
  Last update: 2005-03-22 13:47    [from the cache]
©2003-2011 Jasper Spaans