| 
									
										
										
										
											2015-05-19 11:06:54 +02:00
										 |  |  | #!/bin/sh | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-19 11:39:39 +02:00
										 |  |  | #Create all the symlinks to /bin/busybox | 
					
						
							|  |  |  | /bin/busybox --install -s | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-19 11:06:54 +02:00
										 |  |  | #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 |