61 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| #Create all the symlinks to /bin/busybox
 | |
| /bin/busybox --install -s
 | |
| 
 | |
| #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 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
 |