You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.2 KiB
61 lines
1.2 KiB
10 years ago
|
#!/bin/sh
|
||
|
|
||
|
#Mount things needed by this script
|
||
|
mount -t proc proc /proc
|
||
|
mount -t sysfs sysfs /sys
|
||
|
|
||
|
#Disable kernel messages from popping onto the screen
|
||
|
echo 0 > /proc/sys/kernel/printk
|
||
|
|
||
|
#Create all the symlinks to /bin/busybox
|
||
|
busybox --install -s
|
||
|
|
||
|
#Create device nodes
|
||
|
mknod /dev/null c 1 3
|
||
|
mknod /dev/tty c 5 0
|
||
|
mdev -s
|
||
|
|
||
|
#Function for parsing command line options with "=" in them
|
||
|
# get_opt("init=/sbin/init") will return "/sbin/init"
|
||
|
get_opt() {
|
||
|
echo "$@" | cut -d "=" -f 2
|
||
|
}
|
||
|
|
||
|
#Defaults
|
||
|
init="/sbin/init"
|
||
|
root="/dev/hda1"
|
||
|
|
||
|
#Process command line options
|
||
|
for i in $(cat /proc/cmdline); do
|
||
|
case $i in
|
||
|
root\=*)
|
||
|
root=$(get_opt $i)
|
||
|
;;
|
||
|
init\=*)
|
||
|
init=$(get_opt $i)
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
|
||
|
exec sh
|
||
|
|
||
|
# Skipping the rest
|
||
|
|
||
|
#Mount the root device
|
||
|
mount "${root}" /newroot
|
||
|
|
||
|
#Check if $init exists and is executable
|
||
|
if [[ -x "/newroot/${init}" ]] ; then
|
||
|
#Unmount all other mounts so that the ram used by
|
||
|
#the initramfs can be cleared after switch_root
|
||
|
umount /sys /proc
|
||
|
|
||
|
#Switch to the new root and execute init
|
||
|
exec switch_root /newroot "${init}"
|
||
|
fi
|
||
|
|
||
|
#This will only be run if the exec above failed
|
||
|
echo "Failed to switch_root, dropping to a shell"
|
||
|
exec sh
|