summaryrefslogtreecommitdiff
path: root/initramfs/init
blob: 1565d42eca098ad87d7d925bf2432da540023c72 (plain)
    1 #!/bin/sh
    2 
    3 #
    4 # initramfs /init (busybox ash)
    5 #
    6 
    7 # color codes and some predefined texts
    8 BOLD="\033[1m"
    9 NORM="\033[0m"
   10 RED="\033[31m"
   11 GREEN="\033[32m"
   12 YELLOW="\033[33m"
   13 BLUE="\033[34m"
   14 OK="${BOLD}${GREEN}OK${NORM}"
   15 FAILED="${BOLD}${RED}FAILED${NORM}"
   16 DONE="${BOLD}${GREEN}DONE${NORM}"
   17 
   18 # helper functions
   19 
   20 # check an exit value and print a colored status
   21 checkReturn() {
   22 	if [ $? -ne 0 ]
   23 	then
   24 		echo -e $FAILED
   25 	else
   26 		echo -e $OK
   27 	fi
   28 }
   29 
   30 # print a colored done status
   31 echoDone() {
   32 	echo -e $DONE
   33 }
   34 
   35 # search for and mount the crux media, populate a tmpfs from it,
   36 # and prepare /newroot for switch_root at the end of the script
   37 find_and_mount_media() {
   38 	echo -e -n " ${BOLD}${BLUE}*${NORM} Creating and mounting tmpfs... "
   39 	mkdir /.tmpfs
   40 	mount -t tmpfs tmpfs /.tmpfs
   41 	checkReturn
   42 
   43 	grep -q "prefix=*" /proc/cmdline
   44 	if [ $? -eq 0 ]
   45 	then
   46 		for opt in `cat /proc/cmdline`
   47 		do
   48 			echo $opt | grep -q "prefix="
   49 			if [ $? -eq 0 ]
   50 			then
   51 				PREFIX=`echo $opt | cut -d= -f2`
   52 			fi
   53 		done
   54 	fi
   55 	MEDIAMNT=/.tmpfs/.media
   56 
   57 	echo -e " ${BOLD}${BLUE}*${NORM} Searching for the CRUX media..."
   58 	mkdir -p ${MEDIAMNT}
   59 	CRUXMEDIA=""
   60 	CDROM_DEVICES="`awk '/drive name:/ { for (i=3;i<=NF;i++) { printf("%s ", $i) } }' /proc/sys/dev/cdrom/info`"
   61 	BLOCK_DEVICES="`grep -E '[sh]d' /proc/partitions | awk '{ print $4 }'`"
   62 	for DEV in $CDROM_DEVICES $BLOCK_DEVICES
   63 	do
   64 		DEV="/dev/$DEV"
   65 		mount -r $DEV ${MEDIAMNT} 2> /dev/null
   66 		if [ $? -eq 0 ]
   67 			then
   68 			echo -e -n "   ${BOLD}${GREEN}*${NORM} Found media on $DEV"
   69 			if [ -e ${MEDIAMNT}/${PREFIX}/crux-media ]
   70 			then
   71 				echo ", CRUX media."
   72 				CRUXMEDIA=$DEV
   73 				break
   74 			else
   75 				echo ", but it's not the CRUX media."
   76 				umount ${MEDIAMNT}
   77 			fi
   78 		else
   79 			echo -e "   ${BOLD}${YELLOW}*${NORM} No media found on $DEV."
   80 		fi
   81 	done
   82 
   83 	# check if the media was mounted properly. if not, spawn a shell
   84 	if [ ! -e ${MEDIAMNT}/${PREFIX}/crux-media ]
   85 	then
   86 		echo -e " ${BOLD}${RED}*${NORM} The CRUX media was not properly mounted!"
   87 		echo " Spawning a shell for you to attempt to fix this problem. If"
   88 		echo " you are able to find the correct device, mount it at"
   89 		echo " ${MEDIAMNT} and then log out of this shell to continue."
   90 		echo " If you are NOT able to fix the problem, installation will"
   91 		echo " not be possible."
   92 		echo
   93 		/bin/sh
   94 	fi
   95 
   96 	# check again and stop if it's still not there
   97 	if [ ! -e ${MEDIAMNT}/${PREFIX}/crux-media ]
   98 	then
   99 		echo -e " ${BOLD}${RED}*${NORM} The CRUX media still appears not to be"
  100 		echo " found and installation will not continue."
  101 		echo
  102 		sleep 99999
  103 		exit 1
  104 	fi
  105 
  106 	echo -e " ${BOLD}${BLUE}*${NORM} Populating root filesystem..."
  107 	mkdir -p /newroot
  108 	echo -e -n "   ${BOLD}${BLUE}*${NORM} Mounting new root filesystem... "
  109 	mount -t tmpfs tmpfs /newroot
  110 	checkReturn
  111 	echo -e -n "   ${BOLD}${BLUE}*${NORM} Copying files from rootfs.tar.xz... "
  112 	tar -xpf ${MEDIAMNT}/${PREFIX}/rootfs.tar.xz -C /newroot
  113 	checkReturn
  114 	echo -e -n "   ${BOLD}${BLUE}*${NORM} Copying devices from rootfs... "
  115 	cp -af /dev/* /newroot/dev/
  116 	checkReturn
  117 	mkdir -p /newroot/dev/pts /newroot/media
  118 
  119 	# the media gets unmounted here and remounted after switch_root
  120 	umount ${MEDIAMNT}
  121 	rmdir ${MEDIAMNT}
  122 	sed -i -e "s,#CRUXMEDIA#,${CRUXMEDIA}," /newroot/etc/fstab
  123 
  124 	echo -e -n " ${BOLD}${BLUE}*${NORM} Unmounting tmpfs... "
  125 	umount /.tmpfs
  126 	checkReturn
  127 	rmdir /.tmpfs
  128 }
  129 
  130 /bin/busybox --install -s /bin
  131 
  132 # main script
  133 echo ""
  134 echo -e "${BOLD}CRUX 2.8 - ${BLUE}http://crux.nu/${NORM}"
  135 echo ""
  136 
  137 exec >/dev/console </dev/console 2>&1
  138 
  139 echo -e -n " ${BOLD}${BLUE}*${NORM} Mounting "
  140 echo -e -n "${BOLD}${GREEN}/proc${NORM}"
  141 mount -t proc proc /proc
  142 
  143 PRINTK="`cat /proc/sys/kernel/printk`"
  144 echo "0" > /proc/sys/kernel/printk
  145 
  146 echo -e ", ${BOLD}${GREEN}/sys${NORM}."
  147 mount -t sysfs sysfs /sys
  148 
  149 grep -q "debug" /proc/cmdline
  150 if [ $? -eq 0 ]
  151 then
  152 	DEBUG=1
  153 fi
  154 
  155 echo -e -n " ${BOLD}${BLUE}*${NORM} Populating /dev via mdev... "
  156 mdev -s
  157 checkReturn
  158 echo -e -n "   ${BOLD}${BLUE}*${NORM} Registering mdev as hotplug agent... "
  159 echo "/bin/mdev" > /proc/sys/kernel/hotplug
  160 checkReturn
  161 
  162 if [ -d /lib/modules ]
  163 then
  164 	echo -e -n " ${BOLD}${BLUE}*${NORM} Loading modules... "
  165 
  166 	# filesystem
  167 	load_fs_modules() {
  168 		# no notification for fs modules since they're generic
  169 		#echo -e -n "${BOLD}${BLUE}File Systems${NORM}"
  170 		for mod in isofs ext2 ext3 ext4 reiserfs xfs jfs vfat msdos \
  171 			crc32c libcrc32c btrfs
  172 		do
  173 			if [ ! -z "$DEBUG" ]
  174 			then
  175 				echo -n " $mod"
  176 			fi
  177 			modprobe $mod
  178 		done
  179 		#echo -n ", "
  180 	}
  181 
  182 	# cdrom
  183 	load_cdrom_modules() {
  184 		# no notification for cdrom modules since they're generic
  185 		#echo -e -n "${BOLD}${BLUE}CDROM${NORM}"
  186 		# there's only one cdrom module for now but the loop allows for adding
  187 		# more if ever needed
  188 		for mod in cdrom
  189 		do
  190 			if [ ! -z "$DEBUG" ]
  191 			then
  192 				echo -n " $mod"
  193 			fi
  194 			modprobe $mod
  195 		done
  196 		#echo -n ", "
  197 	}
  198 
  199 	# SCSI
  200 	load_scsi_modules() {
  201 		echo -e -n "${BOLD}${BLUE}SCSI${NORM}"
  202 		for mod in scsi_mod sr_mod sd_mod scsi_transport_fc scsi_transport_iscsi \
  203 			scsi_transport_sas scsi_transport_spi 3w-9xxx 3w-xxxx 53c700 BusLogic \
  204 			NCR53c406a a100u2w aacraid advansys aha152x aha1542 aha1740 aic79xx \
  205 			aic7xxx aic94xx arcmsr atp870u dc395x dmx3191d dpt_i2o dtc eata fdomain \
  206 			gdth hptiop in2000 initio ipr ips lpfc megaraid megaraid_mbox megaraid_sas \
  207 			nsp32 pas16 psi240i qla1280 qla2xxx qla4xxx qlogicfas qlogicfas408 seagate \
  208 			sim710 stex sym53c416 sym53c8xx t128 tmscsim u14-34f ultrastor \
  209 			wd7000 mptsas mptspi hpsa
  210 		do
  211 			if [ ! -z "$DEBUG" ]
  212 			then
  213 				echo -n " $mod"
  214 			fi
  215 			modprobe $mod > /dev/null 2>&1
  216 		done
  217 		echo -n ", "
  218 	}
  219 
  220 	# USB
  221 	load_usb_modules() {
  222 		echo -e -n "${BOLD}${BLUE}USB${NORM}"
  223 		for mod in ehci-hcd ohci-hcd uhci-hcd usb-storage usbhid
  224 		do
  225 			if [ ! -z "$DEBUG" ]
  226 			then
  227 				echo -n " $mod"
  228 			fi
  229 			modprobe $mod
  230 		done
  231 		echo -n ", "
  232 	}
  233 
  234 	# ATA
  235 	load_ata_modules() {
  236 		echo -e -n "${BOLD}${BLUE}ATA${NORM}"
  237 		for mod in libata libahci ahci sata_promise sata_sil sata_svw sata_via \
  238 			sata_mv sata_nv sata_sil24 sata_sx4 sata_sis sata_uli \
  239 			sata_vsc sata_qstor sata_inic162x ata_piix pata_mpiix \
  240 			pata_pdc2027x pata_radisys pata_sil680 pata_rz1000 pata_cmd640 \
  241 			pata_efar pata_cmd64x pata_hpt366 pata_hpt37x pata_hpt3x3 \
  242 			pata_opti pata_optidma pata_it8213 pata_ninja32 pata_it821x \
  243 			pata_artop pata_cypress pata_serverworks pata_ns87410 \
  244 			pata_ns87415 pata_ali pata_amd pdc_adma ata_generic \
  245 			pata_atiixp pata_triflex pata_sc1200 \
  246 			pata_netcell pata_sch pata_sis pata_hpt3x2n pata_marvell \
  247 			pata_jmicron pata_via pata_cs5520 pata_cs5530 pata_cs5535 \
  248 			pata_cs5536 pata_sl82c105
  249 		do
  250 			if [ ! -z "$DEBUG" ]
  251 			then
  252 				echo -n " $mod"
  253 			fi
  254 			modprobe $mod
  255 		done
  256 		echo -n ", "
  257 	}
  258 
  259 	# FireWire
  260 	load_firewire_modules() {
  261 		echo -e -n "${BOLD}${BLUE}FireWire${NORM}"
  262 		for mod in core ohci sbp2
  263 		do
  264 			if [ ! -z "$DEBUG" ]
  265 			then
  266 				echo -n " $mod"
  267 			fi
  268 			modprobe firewire-$mod
  269 		done
  270 		echo -n ", "
  271 	}
  272 
  273 	MODORDER="fs cdrom ata scsi usb firewire"
  274 
  275 	for MODS in $MODORDER
  276 	do
  277 		grep -q "no$MODS" /proc/cmdline
  278 		[ $? -ne 0 ] && load_${MODS}_modules
  279 	done
  280 
  281 	echoDone
  282 else
  283 	echo -e " ${BOLD}${YELLOW}*${NORM} No modules were found in the initial RAM filesystem."
  284 fi
  285 
  286 grep -q "devicetimeout=*" /proc/cmdline
  287 if [ $? -eq 0 ]
  288 then
  289 	for opt in `cat /proc/cmdline`
  290 	do
  291 		echo $opt | grep -q "devicetimeout"
  292 		if [ $? -eq 0 ]
  293 		then
  294 			DEVTIMEOUT=`echo $opt | cut -d= -f2`
  295 		fi
  296 	done
  297 else
  298 	DEVTIMEOUT=10
  299 fi
  300 echo -e " ${BOLD}${BLUE}*${NORM} Waiting $DEVTIMEOUT seconds for devices to settle..."
  301 sleep $DEVTIMEOUT
  302 
  303 # if root=/dev/XXX was specified on the command line, use that as the new root
  304 # instead of searching for the media and using it. if it fails, fall back to
  305 # the media
  306 grep -q "root=/dev/*" /proc/cmdline
  307 if [ $? -eq 0 ]
  308 then
  309 	#echo "root= was specified"
  310 	for opt in `cat /proc/cmdline`
  311 	do
  312 		echo "$opt" | grep -q root=
  313 		if [ $? -eq 0 ]
  314 		then
  315 			ROOTDEV=`echo $opt | cut -d= -f2`
  316 		fi
  317 	done
  318 	mkdir -p /newroot
  319 	# check the specified root device to see if it has an init
  320 	mount $ROOTDEV /newroot
  321 	if [ $? -ne 0 ]
  322 	then
  323 		echo -e " ${BOLD}${RED}*${NORM} Unable to mount the specified root device! Falling back to the live media."
  324 		find_and_mount_media
  325 	else
  326 		if [ -x /newroot/sbin/init ]
  327 		then
  328 			echo -e " ${BOLD}${BLUE}*${NORM} Mounted root device $ROOTDEV."
  329 		else
  330 			echo -e " ${BOLD}${RED}*${NORM} The specified root device ($ROOTDEV) does not appear to be usable! Falling back to the live media."
  331 			umount /newroot
  332 			find_and_mount_media
  333 		fi
  334 	fi
  335 else
  336 	find_and_mount_media
  337 fi
  338 
  339 # copy busybox for debugging
  340 if [ ! -z "${DEBUG}" ]
  341 then
  342 	cp /bin/busybox /newroot/bin/
  343 fi
  344 
  345 echo -e " ${BOLD}${BLUE}*${NORM} Switching root.\n"
  346 echo "$PRINTK" > /proc/sys/kernel/printk
  347 echo > /proc/sys/kernel/hotplug
  348 umount /sys
  349 umount /proc
  350 exec /bin/switch_root /newroot /sbin/init
  351 
  352 echo "Something's broken, here's a shell."
  353 exec /bin/sh

Generated by cgit