Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- # Copyright 2003-2006 Gentoo Foundation
- # Copyright 2006-2010 Francois Dupoux
- # Distributed under the terms of the GNU General Public License v2
- good_msg()
- {
- msg_string=$1
- msg_string="${msg_string:-...}"
- [ "$2" != 1 ] && echo -e "${GOOD}>>${NORMAL} ${msg_string} ${NORMAL}"
- }
- bad_msg()
- {
- msg_string=$1
- msg_string="${msg_string:-...}"
- [ "$2" != 1 ] && echo -e "${BAD}!!${NORMAL} ${msg_string} ${NORMAL}"
- }
- parse_opt()
- {
- case "$1" in
- *\=*)
- local key_name="`echo "$1" | cut -f1 -d=`"
- local key_len=${#key_name}
- local value_start=$((key_len+2))
- echo "$1" | cut -c ${value_start}-
- ;;
- esac
- }
- sysresccd_expand_alldevices()
- {
- for curdev in $*
- do
- echo ${curdev}
- done
- }
- sysresccd_expand_removable()
- {
- # Look for the value of 1 in the file /sys/block/sd*/removable
- for curdev in $*
- do
- devroot=$(echo ${curdev} | awk -F / '{sub(/[0-9]+$/,"",$NF); print $NF}')
- removable_f="/sys/block/${devroot}/removable"
- [ -f "${removable_f}" ] && grep -q ^1 ${removable_f} && echo ${curdev}
- done
- }
- sysresccd_runshell()
- {
- if [ -n "$1" ] && [ -x "$1" ]
- then
- exec "$1"
- else
- exec /bin/sh
- fi
- exit 1
- }
- sysresccd_panic()
- {
- bad_msg "$@"
- bad_msg "Running a mini shell (cannot complete the boot process)"
- sleep 2
- sysresccd_runshell
- }
- sysresccd_setup_keymap()
- {
- if [ -z "$SETKMAP" ]
- then
- if [ ! -e /dev/vc/0 -a ! -e /dev/tty0 ]
- then
- DEVBIND=1
- mount -o bind ${NEWROOT}/dev /dev
- fi
- [ ! -e /dev/tty0 ] && ln -s /dev/tty1 /dev/tty0
- sysresccd_chooseKeymap
- [ "${DEVBIND:-0}" -eq '1' ] && umount /dev
- else # "setkmap=xx" option was used
- sysresccd_useKeymap $SETKMAP
- fi
- }
- sysresccd_useKeymap()
- {
- keymap=$1
- if [ -e /lib/keymaps/${keymap}.map ]
- then
- good_msg "Loading the ''${keymap}'' keymap"
- loadkmap < /lib/keymaps/${keymap}.map
- xkeymap=${keymap}
- echo ${keymap} | grep -e "[0-9]+" >/dev/null 2>&1
- if [ "$?" -eq '0' ]
- then
- xkeymap=`tail -n 7 /lib/keymaps/keymapList | grep ${keymap} | sed -r "s/.*\s+${keymap}\s+([a-z-]+).*/\1/g" | grep -v 1`
- fi
- mkdir -p /etc/sysconfig
- echo "XKEYBOARD=${xkeymap}" > /etc/sysconfig/keyboard
- elif [ "$keymap" = '' ]
- then
- echo
- good_msg "Keeping default keymap"
- else
- bad_msg "Sorry, but keymap ''${keymap}'' is invalid!"
- sysresccd_chooseKeymap
- fi
- }
- sysresccd_chooseKeymap()
- {
- good_msg "Loading keymaps"
- cat /lib/keymaps/keymapList
- echo "default choice (US keymap) will be used if no action within 20 seconds"
- read -t 20 -p '<< Load keymap (Enter for default): ' keymap
- sysresccd_useKeymap $keymap
- }
- sysresccd_terminal()
- {
- /bin/consolechars -f /usr/share/consolefonts/ter-v16b.psf
- kbd_mode -u
- }
- sysresccd_debug()
- {
- # Run debug shell if requested with "minishell" in cmdline
- if [ "${MINISHELL}" = '1' ]
- then
- good_msg "Running a mini shell (as requested by the command line)"
- sysresccd_runshell ${MINISHELL}
- fi
- }
- # ---- convert a short netmask (eg: '/24') to a long one ----
- netmask_shorttolong() # eg: '24' ==> '255.255.255.0'
- {
- mask="$1"
- if [ -n "${mask}" ]
- then
- [ "${mask}" -gt '32' ] && mask='32'
- [ "${mask}" -lt '0' ] && mask='0'
- bit=0
- for i in 0 1 2 3
- do
- curbyte=0
- for j in 0 1 2 3 4 5 6 7
- do
- curbit=0 ; [ "$bit" -lt "$mask" ] && curbit=1
- curbyte=$((curbyte*2))
- curbyte=$((curbyte+curbit))
- bit=$((bit+1))
- done
- echo -n "$curbyte"
- [ "$i" -lt '3' ] && echo -n '.'
- done
- fi
- }
- # configure an interface: eg: $1='192.168.1.1/24' $2='eth0'
- netconfig_setip()
- {
- ethip=$1
- cureth=$2
- ipaddrbase=${ethip%%/*} # '192.168.1.1/24' --> '192.168.1.1'
- if echo "${ethip}" | grep -q -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/([0-9]{1,2})$'
- then
- ipaddrmask=${ethip#*/} # '192.168.1.1/24' --> '24'
- else
- ipaddrmask=''
- fi
- if [ -n "${ipaddrmask}" ]
- then
- iplongmask=$(netmask_shorttolong $ipaddrmask 2>/dev/null)
- maskopt="netmask ${iplongmask}"
- echo "netconfig1: netmask_shorttolong($ipaddrmask)=$iplongmask"
- else
- iplongmask=''
- maskopt=''
- fi
- echo "netconfig1: configure ${cureth} to ${ethip}"
- ipcmd_add="ifconfig ${cureth} ${ipaddrbase} ${maskopt}"
- ${ipcmd_add} ; res=$?
- echo "netconfig1: ${ipcmd_add} --> ${res}"
- }
- sysresccd_speakup()
- {
- if [ -n "${SPEAKUP}" ]
- then
- OPTLIST="$(echo ${SPEAKUP} | sed -e 's!,! !g')"
- for curopt in ${OPTLIST}
- do
- for x in ${curopt}
- do
- case "${x}" in
- quiet\=*)
- SPEAKUP_QUIET=`parse_opt "${x}"`
- ;;
- synth\=*)
- SPEAKUP_SYNTH=`parse_opt "${x}"`
- ;;
- port\=*)
- SPEAKUP_PORT=`parse_opt "${x}"`
- SPEAKUP_OPTIONS="${SPEAKUP_OPTIONS} port=${SPEAKUP_PORT}"
- ;;
- ser\=*)
- SPEAKUP_SER=`parse_opt "${x}"`
- SPEAKUP_OPTIONS="${SPEAKUP_OPTIONS} ser=${SPEAKUP_SER}"
- ;;
- esac
- done
- done
- if [ -n "${SPEAKUP_QUIET}" ]
- then
- cmd="/sbin/modprobe -b speakup quiet=${SPEAKUP_QUIET}"
- ${cmd}
- fi
- if [ -n "${SPEAKUP_SYNTH}" ]
- then
- cmd="/sbin/modprobe -b speakup_${SPEAKUP_SYNTH} ${SPEAKUP_OPTIONS} start=1"
- ${cmd}
- fi
- fi
- }
- sysresccd_udev_start()
- {
- good_msg "Loading modules..."
- echo '0' > /proc/sys/kernel/printk
- # show name of modules being loaded
- touch /showmodprobe
- # Note that this only becomes /dev on the real filesystem if udev's scripts
- # are used; which they will be, but it's worth pointing out
- tmpfs_size="10M"
- if [ -e /etc/udev/udev.conf ]; then
- . /etc/udev/udev.conf
- fi
- mount -t tmpfs -o size=$tmpfs_size,mode=0755 udev /dev
- [ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
- [ -e /dev/null ] || mknod /dev/null c 1 3
- > /dev/.initramfs-tools
- mkdir /dev/.initramfs
- # process module dependencies
- depmod -a
- # load custom modules
- for modname in ${MODLOAD}
- do
- /sbin/modprobe.sh -b ${modname}
- if [ $? -eq 0 ]
- then
- good_msg "modprobe ${modname} successful"
- else
- bad_msg "modprobe ${modname} failed (res=$?)"
- fi
- done
- # write blacklist to modprobe.d
- for modname in ${BLACKLIST}
- do
- echo "blacklist ${modname}" >> /etc/modprobe.d/initramfs.conf
- good_msg "module ${modname} has been blacklisted"
- done
- # run udevd and let it process uevents
- echo > /sys/kernel/uevent_helper
- mkdir -p /dev/.udev/db/
- udevd --daemon --resolve-names=never
- mkdir -p /dev/.udev/queue/ /dev/.udev/rules.d/
- udevadm trigger
- udevadm settle || true
- # if the scandelay parameter has been set, we wait a bit for devices
- sleep 3 # sleep 3 seconds anyway: most USB devices just need it to initialize
- [ -n "${SCANDELAY}" ] && good_msg "Waiting ${SCANDELAY} seconds..." && sleep ${SCANDELAY}
- # reload the tg3 driver (https://bugzilla.redhat.com/show_bug.cgi?id=525966#c19)
- if grep -q ^tg3 /proc/modules && grep -q reload /proc/cmdline
- then
- echo "Reloading module tg3 ..."
- modprobe -r tg3
- modprobe broadcom
- modprobe tg3
- echo "Module tg3 has been reloaded"
- fi
- # hide name of modules being loaded
- rm -f /showmodprobe
- }
- sysresccd_udev_stop()
- {
- # Stop udevd, we'll miss a few events while we run init, but we catch up
- for proc in /proc/[0-9]*
- do
- [ -x $proc/exe ] || continue
- [ "$(busybox readlink $proc/exe)" != /sbin/udevd ] || kill ${proc#/proc/}
- done
- echo '6' > /proc/sys/kernel/printk
- }
- sysresccd_netconfig()
- {
- good_msg "Performing the network configuration..."
- # configure the loopback network interface anyway
- /sbin/ifconfig lo 127.0.0.1
- # ---- force dhcp if booting via pxe and no static configuration specified
- if [ "${NETCONFIG}" = '1' ] && [ -z "${SETETHX}${NODHCP}${DODHCP}" ]
- then
- DODHCP='all'
- fi
- # ---- create the /etc/nsswitch.conf file (it must exist for both dns and static) ----
- rm -f /etc/nsswitch.conf /etc/host.conf
- echo "hosts: files dns" > /etc/nsswitch.conf
- # ---- set the name of the network interfaces if requested on the boot argv
- if grep -q -E 'nameif=[0-9,!:a-fA-F]*' /proc/cmdline
- then
- good_msg "Renaming the network interfaces (option 'nameif' was used)"
- ethlist="$(/sbin/ifconfig -a | grep 'HWaddr' | grep '^eth[0-9]*' | awk '{print $1}')"
- maclist="$(/sbin/ifconfig -a | grep 'HWaddr' | grep '^eth[0-9]*' | awk '{print $5}')"
- # ---- get the option from the boot command line # eg: "nameif=eth0!00:11:22:33:44:55,eth1!00:22:33:44:55:aa"
- BOOTIF=''
- CMDLINE="$(cat /proc/cmdline)"
- for x in ${CMDLINE}
- do
- if echo "${x}" | grep -q -E 'BOOTIF=..-..-..-..-..-..-..'
- then
- BOOTIF="$(echo ${x} | cut -d= -f2 | sed -e 's#^01-##;s#-#:#g')"
- fi
- done
- NAMEIFOPT=''
- for x in $(cat /proc/cmdline)
- do
- if echo "${x}" | grep -q -E 'nameif=[0-9,!:a-fA-F]*'
- then
- NAMEIFOPT="$(echo ${x} | cut -d= -f2 | sed -e 's!,! !g')"
- test -n "${BOOTIF}" && NAMEIFOPT=$(echo $NAMEIFOPT | sed -e "s!BOOTIF!${BOOTIF}!g")
- fi
- done
- # ---- rename all the network interfaces so that each name is free for another interface
- pos=0
- for curmac in ${maclist}
- do
- cmd="busybox nameif iftmp${pos} ${curmac}"
- ${cmd}
- echo "netconfig1: ${cmd} --> $?"
- pos=$((pos+1))
- done
- # ---- rename the interfaces with the name requested on the boot command
- for val in ${NAMEIFOPT}
- do
- for opt in ${val}
- do
- name="$(echo ${opt} | cut -d! -f1)"
- mac="$(echo ${opt} | cut -d! -f2)"
- cmd="busybox nameif $name $mac"
- ${cmd}
- echo "netconfig1: ${cmd} --> $?"
- sleep 1
- done
- done
- # ---- attribute the remaining names to the remaining network interfaces
- maclist="$(/sbin/ifconfig -a | grep 'HWaddr' | grep '^iftmp[0-9]*' | awk '{print $5}')"
- for curmac in ${maclist}
- do
- pos=0
- ifdone=0
- while [ "${pos}" -lt 99 ] && [ "$ifdone" = '0' ]
- do
- curif="eth${pos}"
- if ! /sbin/ifconfig -a | grep 'HWaddr' | grep -q "^${curif}"
- then
- cmd="busybox nameif $curif $curmac"
- ${cmd}
- echo "netconfig1: ${cmd} --> $?"
- ifdone=1
- sleep 1
- fi
- pos=$((pos+1))
- done
- done
- fi
- if [ "${NETCONFIG}" = '1' ] # show interfaces detected with the new name
- then
- ethlist="$(/sbin/ifconfig -a | grep 'HWaddr' | grep '^eth[0-9]*' | awk '{print $1}')"
- if [ -z "${ethlist}" ]
- then
- echo "No ethernet interfaces found on your system, PXE boot won't work."
- sleep 2
- else
- echo "Here are the ethernet interfaces found on your system:"
- # ---- get the option from the boot command line # eg: "nameif=eth0!00:11:22:33:44:55,eth1!00:22:33:44:55:aa"
- for cureth in ${ethlist}
- do
- #cureth="${ethlist[curpos]}"
- curmac="$(/sbin/ifconfig ${cureth} | grep 'HWaddr' | grep '^eth[0-9]*' | awk '{print $5}')"
- echo "* ${cureth}: ${curmac}"
- ifconfig ${cureth} up
- done
- fi
- fi
- # ---- configure the ethernet interfaces if requested by 'ethx=ip' ----
- if [ -n "${SETETHX}" ]
- then
- echo "netconfig1: found option ethx=${SETETHX}"
- ethlist="$(/sbin/ifconfig -a | grep 'eth' | awk '{print $1}' | busybox xargs)" # (eg: eth0 eth1 eth2)
- for cureth in ${ethlist}
- do
- netconfig_setip ${SETETHX} ${cureth}
- done
- fi
- # ---- configure individual ethernet interfaces ----
- if cat /proc/cmdline | grep -q -E 'eth[0-9]{1,2}=[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
- then
- # parse the command line for individual ethernet interfaces settings
- for x in $(cat /proc/cmdline)
- do
- if echo "${x}" | grep -q -E 'eth[0-9]{1,2}=[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
- then
- iface=$(echo ${x} | cut -d= -f1)
- ipaddr=$(echo ${x} | cut -d= -f2)
- echo "netconfig1: found option ${x}"
- netconfig_setip ${ipaddr} ${iface}
- fi
- done
- fi
- # ---- configure the network via dhcp ----
- if [ -n "${DODHCP}" ]
- then
- if [ "${DODHCP}" = 'all' ]
- then
- ethlist="$(/sbin/ifconfig -a | grep 'eth' | awk '{print $1}' | busybox xargs)" # (eg: eth0 eth1 eth2)
- else
- ethlist="$(echo ${DODHCP} | sed -e 's!,! !g')" # (eg: eth0 eth2)
- fi
- dhcpstate=''
- while [ "${dhcpstate}" != 'ok' ] # retry until we get a dhcp address on at least one interface
- do
- for cureth in ${ethlist}
- do
- # Try to find whether or not the link is connected
- mac=$(ifconfig ${cureth} | grep HWaddr | awk '{print $5}')
- linkstate=''
- if [ -z "${linkstate}" ] && [ -f /sbin/ethtool ] && /sbin/ethtool ${cureth} 2>/dev/null | grep -qiF 'Link detected: yes'
- then
- linkstate='link-ok'
- fi
- if [ -z "${linkstate}" ] && [ -f /sbin/mii-tool ] && /sbin/mii-tool ${cureth} 2>/dev/null | grep -qiF 'link ok'
- then
- linkstate='link-ok'
- fi
- if [ -z "${linkstate}" ] && [ -f /sbin/mii-tool ] && /sbin/mii-tool ${cureth} 2>/dev/null | grep -qiF 'no link'
- then
- linkstate='no-link'
- fi
- if [ -z "${linkstate}" ]
- then
- linkstate='unknown'
- fi
- echo "--- ${cureth}: link=${linkstate}, mac=${mac}"
- # If the link is up, then try (even if another interface already has a dhcp address)
- if [ "${linkstate}" != 'no-link' ]
- then
- good_msg "Attempting to get a DHCP address on ${cureth}..."
- [ -n "${DHCPHOSTNAME}" ] && hostnameopt="-H ${DHCPHOSTNAME}"
- cmd="busybox udhcpc -n -i ${cureth} ${hostnameopt}"
- ${cmd} ; res="$?"
- echo "${cmd} --> ${res}"
- [ "${res}" = '0' ] && dhcpstate='ok'
- fi
- done
- if [ "${dhcpstate}" != 'ok' ]
- then
- echo "Cannot get a DHCP address. Check the cables on the ethernet interfaces."
- sleep 2
- fi
- done
- fi
- # ---- configure the gateway if requested on cmdline ----
- if [ -n "${SETGW}" ]
- then
- while route del default gw 0.0.0.0 2>&-
- do
- echo "netconfig1: removing old default route"
- done
- echo "netconfig1: set new default route to ${SETGW}"
- route add default gw ${SETGW}
- fi
- # ---- configure the nameserver if requested on cmdline ----
- if [ -n "${SETDNS}" ]
- then
- rm -f /etc/resolv.conf 2>/dev/null
- echo "netconfig1: set nameserver to ${SETDNS}"
- echo "nameserver ${SETDNS}" > /etc/resolv.conf
- fi
- }
- sysresccd_setup_volumes()
- {
- # Setup dmraid for fake raid devices
- if [ -x "/sbin/dmraid-activate" ] && ! grep -q 'nodmraid' /proc/cmdline
- then
- good_msg "Activating dmraid (fake hardware raid)..."
- if devices=$(dmraid -r -c)
- then
- for dev in $devices
- do
- dmraid-activate $dev
- done
- fi
- fi
- # Setup mdadm for linux software raid
- if [ -x "/sbin/mdadm" ] && ! grep -q 'nomdadm' /proc/cmdline
- then
- good_msg "Loading MD modules for software raid..."
- for mod in linear multipath raid0 raid1 raid456 raid5 raid6 raid10
- do
- /sbin/modprobe -b ${mod}
- done
- good_msg "Starting mdadm (linux software raid)"
- /sbin/mdadm -Es > /etc/mdadm.conf
- /sbin/mdadm -As
- fi
- # Setup the Logical Volume Manager
- if [ -x "/sbin/lvm" ] && ! grep 'nolvm' /proc/cmdline
- then
- good_msg 'Setting up the Logical Volume Manager'
- /sbin/lvm vgscan --ignorelockingfailure --mknodes 2>/dev/null
- /sbin/lvm vgchange -ay --ignorelockingfailure 2>/dev/null
- fi
- }
- # ============================================================================================================
- sysresccd_chroot()
- {
- # check the kernel is able to execute /sbin/init
- good_msg "Checking ${INITPROG} can be executed by the current kernel..."
- inittype="$(readelf -h ${NEWROOT}${INITPROG} | grep Class | awk '{print $2}')"
- archtype="$(uname -m)"
- echo " ${INITPROG} on the root filesystem is an ${inittype} binary"
- echo " The current running kernel architecture is ${archtype}"
- if [ "${inittype}" = 'ELF64' ] && [ "${archtype}" != 'x86_64' ]
- then
- sysresccd_panic "You must boot with a 64bit kernel such as rescue64 to run ${INITPROG}"
- fi
- # move /dev to the new root filesystem
- mount -n -o move /dev ${NEWROOT}/dev
- nuke /dev
- ln -s ${NEWROOT}/dev /dev
- if [ ! -x ${NEWROOT}${INITPROG} ]
- then
- sysresccd_panic "${INITPROG} not found on root filesystem"
- fi
- umount /proc
- umount /sys
- good_msg "Executing ${INITPROG} from the root filesystem..."
- exec run-init ${NEWROOT} ${INITPROG} <${NEWROOT}/dev/console >${NEWROOT}/dev/console
- # ------------------------------- minishell -------------------------------
- sysresccd_panic "Failed to run run-init ${NEWROOT} ${INITPROG}"
- }
- # ============================================================================================================
- # ============================================================================================================
- sysresccd_stage1_http()
- {
- if ! mount -t tmpfs -o ${CACHESIZE} tmpfs ${BOOTPATH}
- then
- sysresccd_panic "Cannot create tmpfs on ${BOOTPATH}"
- fi
- if ! echo "${HTTPBOOT}" | grep -q '^http://'
- then
- sysresccd_panic "You requested an http boot, the address is not a valid http:// url."
- fi
- good_msg "Downloading ${LOOPDAT} from ${HTTPBOOT}"
- BOOTMD5=$(echo ${HTTPBOOT} | sed -e "s/${LOOPDAT}/${LOOPMD5}/g") # URL of the md5 file
- for attempt in 0 1 2 3 4 5 6 7 8 9
- do
- /bin/busybox wget ${BOOTMD5} -O /dev/null && break
- echo "Failed to download ${BOOTMD5} (attempt ${attempt}), retrying..."
- sleep 1
- done
- /bin/busybox wget ${BOOTMD5} -O ${BOOTPATH}/${LOOPMD5}
- res1=$?
- /bin/busybox wget ${HTTPBOOT} -O ${BOOTPATH}/${LOOPDAT}
- res2=$?
- if [ ${res1} -ne 0 ] || [ ${res2} -ne 0 ]
- then
- sysresccd_panic "Cannot download the files: wget failed. May be due to lack of memory"
- fi
- if [ ! -f "${BOOTPATH}/${LOOPDAT}" ]
- then
- sysresccd_panic "Cannot download the \"${LOOPDAT}\" boot file."
- fi
- md5now=$(/bin/busybox md5sum ${BOOTPATH}/${LOOPDAT} | cut -d ' ' -f1)
- md5orig=$(cat ${BOOTPATH}/${LOOPMD5} | cut -d ' ' -f1)
- if [ "$md5now" = "$md5orig" ]
- then
- good_msg "Downloaded boot file to \"${BOOTPATH}/${LOOPDAT}\""
- else
- sysresccd_panic "The root filesystem image is invalid: md5sum failed"
- fi
- }
- sysresccd_stage1_tftp()
- {
- if ! mount -t tmpfs -o ${CACHESIZE} tmpfs ${BOOTPATH}
- then
- sysresccd_panic "Cannot create tmpfs on ${BOOTPATH}"
- fi
- if ! echo "${TFTPBOOT}" | grep -q '^tftp://'
- then
- sysresccd_panic "You requested an tftp boot, the address is not a valid tftp:// url."
- fi
- good_msg "Downloading ${LOOPDAT} from ${TFTPBOOT}"
- url="$(echo ${TFTPBOOT} | sed 's!tftp://!!g')" # remote the 'tftp://' prefix
- tftpip="${url%%/*}"
- tftpurl="/${url#*/}"
- BOOTMD5=$(echo ${tftpurl} | sed -e "s/${LOOPDAT}/${LOOPMD5}/g") # URL of the md5 file
- cmd1="/bin/busybox tftp -g -r ${BOOTMD5} -l ${BOOTPATH}/${LOOPMD5} ${tftpip}"
- echo "$cmd1"
- ${cmd1} ; res1="$?"
- cmd2="/bin/busybox tftp -g -r ${tftpurl} -l ${BOOTPATH}/${LOOPDAT} ${tftpip}"
- echo "$cmd2"
- ${cmd2} ; res2="$?"
- if [ "$res1" != '0' ] || [ "$res2" != '0' ]
- then
- sysresccd_panic "Cannot download the files, wget failed. May be due to lack of memory"
- fi
- if [ ! -f "${BOOTPATH}/${LOOPDAT}" ]
- then
- sysresccd_panic "Cannot download the \"${LOOPDAT}\" boot file."
- fi
- md5now=$(/bin/busybox md5sum ${BOOTPATH}/${LOOPDAT} | cut -d ' ' -f1)
- md5orig=$(cat ${BOOTPATH}/${LOOPMD5} | cut -d ' ' -f1)
- if [ "$md5now" = "$md5orig" ]
- then
- good_msg "Downloaded boot file to \"${BOOTPATH}/${LOOPDAT}\""
- else
- sysresccd_panic "The root filesystem image is invalid: md5sum failed"
- fi
- }
- sysresccd_stage1_nfs()
- {
- nfsurl=$(echo ${NFSBOOT} | sed -e 's!nfs://!!g')
- good_msg "Mouting the NFS filesystem from ${NFSBOOT}"
- cmd="mount -t nfs -o intr,nolock ${nfsurl} ${BOOTPATH}"
- if ! ${cmd}
- then
- sysresccd_panic "Cannot mount NFS: ${cmd}"
- fi
- good_msg "Successfully mounted the NFS filesystem"
- if [ ! -f "${BOOTPATH}/${SUBDIR}/${LOOPDAT}" ]
- then
- sysresccd_panic "Cannot find the \"${SUBDIR}/${LOOPDAT}\" boot file."
- fi
- md5now=$(/bin/busybox md5sum ${BOOTPATH}/${SUBDIR}/${LOOPDAT} | cut -d ' ' -f1)
- md5orig=$(cat ${BOOTPATH}/${SUBDIR}/${LOOPMD5} | cut -d ' ' -f1)
- if [ "$md5now" = "$md5orig" ]
- then
- good_msg "Successfully checked md5 sum of ${BOOTPATH}/${LOOPDAT}"
- else
- sysresccd_panic "md5sum checksum is invalid on the root filesystem image"
- fi
- }
- sysresccd_find_devices() # $1=devtype
- {
- devtype="$1"
- case "${devtype}" in
- auto) # all devices
- searchdevices=$(sysresccd_expand_alldevices ${BLKDEVICES})
- ;;
- rmdev) # removable devices only
- searchdevices=$(sysresccd_expand_removable ${BLKDEVICES})
- ;;
- UUID\=*) # find file on filesystem having the speficed UUID
- uuid=`parse_opt "${devtype}"`
- target="$(/bin/readlink -f /dev/disk/by-uuid/${uuid})"
- if [ -b "${target}" ]
- then
- searchdevices="${target}"
- elif [ -b "/dev/disk/by-uuid/${uuid}" ]
- then
- searchdevices="/dev/disk/by-uuid/${uuid}"
- fi
- ;;
- LABEL\=*) # find file on filesystem having the speficed LABEL
- label=`parse_opt "${devtype}"`
- target="$(/bin/readlink -f /dev/disk/by-label/${label})"
- if [ -b "${target}" ]
- then
- searchdevices="${target}"
- elif [ -b "/dev/disk/by-label/${label}" ]
- then
- searchdevices="/dev/disk/by-label/${label}"
- fi
- ;;
- *) # specific device name (eg: "/dev/sda1")
- searchdevices="${devtype}"
- ;;
- esac
- echo "${searchdevices}"
- return 1
- }
- # find the device that contains a file with that path: ${SUBDIR}/${LOOPDAT}
- sysresccd_find_file() # $1=devtype, $2=filepath $3=mountdir, $4=mode
- {
- devtype="$1" # on which devices should we search that file
- filepath="$2" # path of the file we are looking for (eg: "/sysrcd.dat")
- mountdir="$3" # where to mount the device if we find it
- mountmode="$4" # mount mode: either 'ro' or 'rw'
- searchdevices="$(sysresccd_find_devices ${devtype})"
- SEARCHDEVICE='' # result returned
- mkdir -p ${mountdir}
- for curdev in ${searchdevices}
- do
- if [ -b "${curdev}" ] # Check for a block device to mount
- then
- # check the 'skipmount=/dev/xxx' option (use it with a failing hard drive)
- # compare with a space at the end so that "/dev/sda1" and "/dev/sda11" don't match
- if echo "$(cat /proc/cmdline) " | grep -F -q "skipmount=${curdev} "
- then
- good_msg "Skipping mount on device: ${curdev}"
- else
- good_msg "Attempting to mount device: ${curdev}"
- for curfs in vfat msdos iso9660 ntfs auto
- do
- case "${curfs}" in
- iso9660)
- mntopt='-o mode=0644'
- ;;
- vfat)
- mntopt='-o fmask=0133'
- ;;
- *)
- mntopt=''
- ;;
- esac
- if mount -r -t ${curfs} ${curdev} ${mountdir} ${mntopt} >/dev/null 2>&1
- then
- if [ -e ${mountdir}/${filepath} ]
- then
- SEARCHDEVICE="${curdev}"
- good_msg "File ${filepath} found on device ${curdev}"
- if [ "${mountmode}" = 'rw' ] && ! mount -o remount,rw,noatime ${mountdir}
- then
- sysresccd_panic "Cannot remount ${curdev} in read-write mode"
- fi
- return 0
- else
- umount ${mountdir} >/dev/null 2>&1
- fi
- fi
- done
- fi
- fi
- done
- return 1
- }
- # find the device which contains sysrcd.dat and mount it on ${BOOTPATH}
- sysresccd_stage1_normal()
- {
- good_msg "Searching for ${SUBDIR}/${LOOPDAT} on devices..."
- filefound=''
- for attempts in 1 2 3 4 5
- do
- [ ${attempts} -gt 1 ] && sleep 3 && bad_msg "Cannot find device with ${SUBDIR}/${LOOPDAT}. Retrying..."
- if sysresccd_find_file 'auto' ${SUBDIR}/${LOOPDAT} ${BOOTPATH} 'ro'
- then
- if [ "${DOCHECK}" = '1' ] # don't run checksum by default on slow medias (cdrom, usb, ...)
- then
- if [ ! -f "${BOOTPATH}/${SUBDIR}/${LOOPMD5}" ]
- then
- bad_msg "Cannot find md5 checksum file: ${LOOPMD5}"
- else
- md5now=$(/bin/busybox md5sum ${BOOTPATH}/${SUBDIR}/${LOOPDAT} | cut -d ' ' -f1)
- md5orig=$(cat ${BOOTPATH}/${SUBDIR}/${LOOPMD5} | cut -d ' ' -f1)
- if [ "$md5now" = "$md5orig" ]
- then
- good_msg "md5 checksum of ${LOOPDAT} successfully checked"
- else
- sysresccd_panic "md5sum checksum is invalid on the root filesystem image"
- fi
- fi
- fi
- filefound='1'
- break
- fi
- done
- if [ -z "${filefound}" ]
- then
- sysresccd_panic "Cannot find ${SUBDIR}/${LOOPDAT} on devices"
- fi
- if [ "${DOCACHE}" = '1' ]
- then
- good_msg "Creating tmpfs for caching in ${CACHEDIR}"
- if ! mount -t tmpfs -o ${CACHESIZE} tmpfs ${CACHEDIR}
- then
- sysresccd_panic "Cannot mount tmpfs filesystem on ${CACHEDIR} for caching"
- fi
- # --------------- Get loopfile size
- squashfspath="${BOOTPATH}/${SUBDIR}/${LOOPDAT}"
- squashfssize=$(ls -l "$squashfspath" | sed -e ":a;s/ / /g;ta" | cut -f 5 -d ' ') # size in bytes
- squashfssizekb=$(( $squashfssize / 1024 )) # size in kilo-bytes
- # --------------- Cache autorun files
- autoruns="$(ls -d ${BOOTPATH}/${SUBDIR}/autorun* 2>/dev/null)"
- [ "$autoruns" != "" ] && cp $autoruns ${CACHEDIR}/
- # --------------- Cache main loop file
- cp -a ${BOOTPATH}/${SUBDIR}/version ${CACHEDIR}/ 2>/dev/null
- cp -a ${BOOTPATH}/${SUBDIR}/${LOOPMD5} ${CACHEDIR}/${LOOPMD5} 2>/dev/null
- good_msg "Copying ${LOOPDAT} file for caching (size: $squashfssizekb KB)..."
- if [ -x /bin/pv ]
- then
- /bin/pv -p < ${BOOTPATH}/${SUBDIR}/${LOOPDAT} > ${CACHEDIR}/${LOOPDAT}
- #/bin/rsync -aP ${BOOTPATH}/${SUBDIR}/${LOOPDAT} ${CACHEDIR}/${LOOPDAT}
- else
- cp -a ${BOOTPATH}/${SUBDIR}/${LOOPDAT} ${CACHEDIR}/${LOOPDAT} 2>/dev/null
- fi
- # --------------- Check main loop file
- expectedsize=$(/bin/busybox stat -c%s "${BOOTPATH}/${SUBDIR}/${LOOPDAT}")
- copiedsize=$(/bin/busybox stat -c%s "${CACHEDIR}/${LOOPDAT}")
- if [ "${copiedsize}" != "${expectedsize}" ] # Was the copy completed successfully ?
- then # docache failed
- bad_msg "Caching failed. Likely due to lack of memory"
- rm -f "${CACHEDIR}/${LOOPDAT}"
- umount ${CACHEDIR} 2>/dev/null
- sleep 3
- else # docache successful
- good_msg "File ${LOOPDAT} successfully cached"
- SUBDIR=''
- # cache other files if possible
- if [ -z "${LOWMEM}" ] && [ -d ${BOOTPATH}/${SUBDIR}/bootdisk ] && [ -d ${BOOTPATH}/${SUBDIR}/ntpasswd ]
- then
- good_msg "Copying isolinux/syslinux + bootdisk + ntpasswd + usb_inst for caching..."
- if ! cp -a ${BOOTPATH}/${SUBDIR}/???linux ${BOOTPATH}/${SUBDIR}/bootdisk \
- ${BOOTPATH}/${SUBDIR}/ntpasswd ${BOOTPATH}/${SUBDIR}/usb_inst* ${CACHEDIR}/
- then
- rm -rf ${CACHEDIR}/???linux ${CACHEDIR}/bootdisk ${CACHEDIR}/ntpasswd ${CACHEDIR}/usb_inst*
- bad_msg "Cannot cache these directories (required only for pxebootsrv). Likely due to lack of memory"
- fi
- fi
- # unmount the media if possible
- if umount ${BOOTPATH}
- then
- good_msg "The original media has been unmounted"
- cmd="mount -n --move ${CACHEDIR} ${BOOTPATH}"
- if ! ${cmd}
- then
- bad_msg "${cmd} --> ${res}" && sleep 3
- fi
- else
- bad_msg "Cannot unmount the original media"
- fi
- # unmount isostore if necessary
- if cat /proc/mounts | awk '{print $2}' | grep -q "^${ISOSTORE}$"
- then
- if losetup -d /dev/loop0
- then
- umount ${ISOSTORE} && good_msg "Unmounted ${ISOSTORE}" || bad_msg "Cannot unmount ${ISOSTORE}"
- fi
- fi
- fi
- fi
- }
- sysresccd_stage2_nbd()
- {
- nbdurl=$(echo ${NBDBOOT} | sed -e 's!nbd://!!g')
- NBD_SERVER=$(echo "${nbdurl}" | sed 's/:.*//')
- NBD_PORT=$(echo "${nbdurl}" | sed 's/.*://')
- REAL_ROOT="nbd"
- NBD_DEVICE="/dev/nbd0"
- NBD_PROG="/sbin/nbd-client"
- if [ ! -x "${NBD_PROG}" ]
- then
- sysresccd_panic "Error: program ${NBD_PROG} not found"
- fi
- if ! /sbin/modprobe -b nbd
- then
- sysresccd_panic "Error: cannot load nbd kernel module"
- fi
- good_msg "Setting up the NBD boot device..."
- if ! ${NBD_PROG} "${NBD_SERVER}" "${NBD_PORT}" "${NBD_DEVICE}" -persist
- then
- sysresccd_panic "Error: nbd-client failed to connect to ${NBD_SERVER}:${NBD_PORT}"
- else
- good_msg "nbd-client successfully connected to ${NBD_SERVER}:${NBD_PORT}"
- fi
- cmd="mount -t squashfs -o ro ${NBD_DEVICE} ${SQUASHFSMNT}"
- if ! ${cmd}
- then
- sysresccd_panic "ERROR: Cannot mount ${NBD_DEVICE}. ${cmd}"
- else
- good_msg "successfully mounted ${NBD_DEVICE} on ${SQUASHFSMNT}"
- fi
- }
- sysresccd_stage2_normal() # mount ${BOOTPATH}/sysrcd.dat on ${SQUASHFSMNT}
- {
- good_msg "Mounting the squashfs root filesystem on ${SQUASHFSMNT}"
- mountok=''
- squashfsimg="${BOOTPATH}/${SUBDIR}/${LOOPDAT}"
- for fs in '-t squashfs' ''
- do
- if [ "$mountok" != "ok" ]
- then
- mount ${fs} ${squashfsopt} -o ro ${squashfsimg} ${SQUASHFSMNT} 2>/dev/null && mountok='ok'
- fi
- done
- if [ "$mountok" != "ok" ]
- then
- sysresccd_panic "ERROR: Cannot mount ${LOOPDAT}. Kernel version [$(uname -a)]"
- fi
- }
- sysresccd_stage3_normal() # "backstore" + "aufs" + "mount --move"
- {
- # 1. search for a backstore file ("sysrcd.bs" by default)
- BACKSTORE_FOUND=''
- if [ "${BACKSTORE_CMD}" != 'off' ]
- then
- BACKSTORE_DEVTYPE='rmdev' # by default search backstores only on removable devices
- BACKSTORE_NOLOOP=''
- for curopt in $(echo ${BACKSTORE_CMD} | sed -e 's!,! !g')
- do
- case "${curopt}" in
- alldev)
- BACKSTORE_DEVTYPE='auto' # search for backstores on all types of devices
- ;;
- UUID\=*)
- BACKSTORE_DEVTYPE=${curopt}
- ;;
- LABEL\=*)
- BACKSTORE_DEVTYPE=${curopt}
- ;;
- noloop)
- BACKSTORE_NOLOOP='1' # uses a device as backstore
- ;;
- *)
- BACKSTORE_DAT=${curopt} # search for backstores on that particular device
- ;;
- esac
- done
- if [ -n "${BACKSTORE_NOLOOP}" ]
- then
- case "${BACKSTORE_DEVTYPE}" in
- UUID\=* | LABEL\=* )
- good_msg "Mounting device ${BACKSTORE_DEVTYPE} as backing store"
- BACKSTORE_DEV="$(sysresccd_find_devices ${BACKSTORE_DEVTYPE})"
- if ! mount ${BACKSTORE_DEV} ${BACKSTORE_MEM}
- then
- sysresccd_panic "Cannot mount the backstore device ${BACKSTORE_DEV}"
- fi
- BACKSTORE_FOUND='1'
- ;;
- rmdev | auto | * )
- sysresccd_panic "UUID or LABEL needed to mount a block device as backing store"
- ;;
- esac
- else
- good_msg "Searching for ${SUBDIR}/${BACKSTORE_DAT} on devices..."
- if sysresccd_find_file ${BACKSTORE_DEVTYPE} ${SUBDIR}/${BACKSTORE_DAT} ${BACKSTORE_MNT} 'rw'
- then
- good_msg "Backing store ${SUBDIR}/${BACKSTORE_DAT} found on ${SEARCHDEVICE}"
- if ! mount ${BACKSTORE_MNT}/${SUBDIR}/${BACKSTORE_DAT} ${BACKSTORE_MEM}
- then
- sysresccd_panic "Cannot mount the loopback backstore file ${SUBDIR}/${BACKSTORE_DAT}"
- fi
- BACKSTORE_FOUND='1'
- fi
- fi
- fi
- # 2. store modifications in a tmpfs filesystem if there is no backstore
- if [ -z "${BACKSTORE_FOUND}" ] && ! mount -t tmpfs tmpfs ${BACKSTORE_MEM}
- then
- sysresccd_panic "Fatal error: cannot mount tmpfs on ${BACKSTORE_MEM}"
- fi
- # 3. create the aufs filesystem
- if ! grep -q aufs /proc/filesystems
- then
- sysresccd_panic "Fatal error: aufs filesystem not supported by the kernel."
- fi
- if mount -t aufs none ${NEWROOT} -o dirs=${BACKSTORE_MEM}=rw:${SQUASHFSMNT}=ro -o noatime
- then
- good_msg "The aufs filesystem has been created"
- else
- sysresccd_panic "Fatal error: cannot mount the aufs filesystem."
- fi
- # 4. copy cached autorun scripts
- autoruns="$(ls -d ${CACHEDIR}/autorun* 2>/dev/null)"
- [ "$autoruns" != "" ] && cp $autoruns ${NEWROOT}/var/autorun/cdrom
- # 5. create the aufs filesystem for /tftpboot
- TFTPBOOT_MEM='/tftpmem'
- TFTPBOOT_DIR='/tftpboot'
- mkdir -p ${TFTPBOOT_MEM}
- mkdir -p ${TFTPBOOT_DIR}
- if ! mount -t tmpfs tmpfs ${TFTPBOOT_MEM} -o size=512m
- then
- sysresccd_panic "Fatal error: cannot mount tmp filesystem on ${TFTPBOOT_MEM}"
- fi
- if ! mount -t aufs none ${TFTPBOOT_DIR} -o dirs=${TFTPBOOT_MEM}=rw:${BOOTPATH}=ro
- then
- bad_msg "Cannot prepare ${TFTPBOOT_DIR} for pxebootsrv"
- fi
- if [ -f ${BOOTPATH}/isolinux/isolinux.cfg ]
- then
- isolinux_dir="isolinux"
- elif [ -f ${BOOTPATH}/syslinux/syslinux.cfg ]
- then
- isolinux_dir="syslinux"
- fi
- if [ -n "${isolinux_dir}" ]
- then
- for curfile in initram.igz rescuecd rescue64 altker32 altker64
- do
- ln -s ${isolinux_dir}/${curfile} ${TFTPBOOT_DIR}/${curfile}
- done
- fi
- # 5. move filesystems mount points to the newroot
- for mntdir in ${BOOTPATH} ${SQUASHFSMNT} ${BACKSTORE_MNT} ${BACKSTORE_MEM} ${ISOSTORE} ${TFTPBOOT_MEM}
- do
- targetdir="${NEWROOT}/livemnt/${mntdir}"
- if cat /proc/mounts | awk '{print $2}' | grep -q "^${mntdir}$"
- then
- mkdir -p ${targetdir} 2>/dev/null
- cmd="mount -n --move ${mntdir} ${targetdir}"
- if ! ${cmd}
- then
- sysresccd_panic "${cmd} failed"
- fi
- fi
- done
- if ! mount -n --move ${TFTPBOOT_DIR} ${NEWROOT}${TFTPBOOT_DIR}
- then
- bad_msg "Cannot move [${TFTPBOOT_DIR}] -> [${NEWROOT}${TFTPBOOT_DIR}]"
- fi
- # make directories
- for curdir in /mnt/custom /mnt/gentoo /mnt/windows /mnt/floppy /mnt/backup \
- /var/run/iptraf /var/log/iptraf /var/spool/cron /var/run/samba \
- /var/log/samba /var/cache/samba /var/log/clamav /var/run/clamav \
- /var/cache/hald /var/run/hald
- do
- mkdir -p "${NEWROOT}${curdir}"
- done
- if [ -e /etc/sysconfig/keyboard ]
- then
- mkdir -p ${NEWROOT}/etc/sysconfig/
- cp /etc/sysconfig/keyboard ${NEWROOT}/etc/sysconfig/keyboard
- fi
- # if option "lowmem" was enabled then do not start these initscripts
- if [ "${LOWMEM}" = '1' ]
- then
- for initscr in sshd nfs portmap
- do
- rm -f "${NEWROOT}/etc/runlevels/default/${initscr}"
- done
- fi
- # blacklist modules passed to "noload=mod1,mod2,mod3"
- for modname in ${BLACKLIST}
- do
- echo "blacklist ${modname}" >> ${NEWROOT}/etc/modprobe.d/blacklist.conf
- done
- # prevent fbcon module from loading (console could become unusable)
- echo "blacklist fbcon" >> ${NEWROOT}/etc/modprobe.d/blacklist.conf
- # manage services
- [ -n "${NONETMGR}" ] && chroot ${NEWROOT} /sbin/rc-update del NetworkManager default >/dev/null 2>&1
- chroot ${NEWROOT} /sbin/rc-update del spind default >/dev/null 2>&1
- chroot ${NEWROOT} /sbin/rc-update del autoconfig default >/dev/null 2>&1
- rm -f ${NEWROOT}/etc/init.d/crypto-loop
- rm -f ${NEWROOT}/etc/init.d/drbd
- }
- sysresccd_stage3_rootsys() # mount the root partition on ${SQUASHFSMNT}
- {
- good_msg "Searching a root filesystem having ${INITPROG}"
- filefound=''
- for attempts in 1 2 3 4 5
- do
- [ ${attempts} -gt 1 ] && sleep 3 && bad_msg "Cannot find device with ${INITPROG}. Retrying..."
- if sysresccd_find_file ${ROOTOPT} ${INITPROG} ${NEWROOT} 'rw'
- then
- filefound='1'
- break
- fi
- done
- if [ -z "${filefound}" ]
- then
- sysresccd_panic "Cannot find a valid root filesystem (partition having ${INITPROG})"
- fi
- #NEWKERMODS="${NEWROOT}/lib/modules/$(uname -r)"
- #mkdir -p ${NEWKERMODS}
- #mount -t tmpfs tmpfs ${NEWKERMODS}
- #cp -a /lib/modules/$(uname -r)/* ${NEWKERMODS}/
- }
- sysresccd_stage0_isoloop() # losetup the iso image on /dev/loop0
- {
- good_msg "Searching for ${SUBDIR}/${ISOLOOP} on devices..."
- filefound=''
- for attempts in 1 2 3 4 5
- do
- [ ${attempts} -gt 1 ] && sleep 3 && bad_msg "Cannot find device with ${SUBDIR}/${ISOLOOP}. Retrying..."
- if sysresccd_find_file 'auto' ${SUBDIR}/${ISOLOOP} ${ISOSTORE} 'ro'
- then
- filefound='1'
- break
- fi
- done
- if [ -z "${filefound}" ]
- then
- sysresccd_panic "Cannot find device with ${SUBDIR}/${ISOLOOP}"
- fi
- if losetup /dev/loop0 ${ISOSTORE}/${SUBDIR}/${ISOLOOP}
- then
- good_msg "Loopback device configured with ${ISOSTORE}/${SUBDIR}/${ISOLOOP}"
- BLKDEVICES="$BLKDEVICES /dev/loop0"
- else
- bad_msg "Cannot configure /dev/loop0 with ${ISOSTORE}/${SUBDIR}/${ISOLOOP}"
- fi
- }
- # =============================================================================
- sysresccd_stage0() # special preparations for isoroot
- {
- case "${STAGE0}" in
- isoloop)
- sysresccd_stage0_isoloop
- STAGE1='normal'
- ;;
- *)
- STAGE1="${STAGE0}"
- ;;
- esac
- }
- sysresccd_stage1() # find sysrcd.dat and put it in ${BOOTPATH}
- {
- case "${STAGE1}" in
- rootsys)
- STAGE2="rootsys"
- ;;
- nbd)
- STAGE2="nbd"
- ;;
- http)
- sysresccd_stage1_http
- STAGE2="normal"
- ;;
- tftp)
- sysresccd_stage1_tftp
- STAGE2="normal"
- ;;
- nfs)
- sysresccd_stage1_nfs
- STAGE2="normal"
- ;;
- normal)
- sysresccd_stage1_normal
- STAGE2="normal"
- ;;
- esac
- }
- sysresccd_stage2() # mount ${BOOTPATH}/sysrcd.dat on ${SQUASHFSMNT}
- {
- case "${STAGE2}" in
- rootsys)
- STAGE3="rootsys"
- ;;
- nbd)
- sysresccd_stage2_nbd
- STAGE3="normal"
- ;;
- normal)
- sysresccd_stage2_normal
- STAGE3="normal"
- ;;
- esac
- }
- sysresccd_stage3() # ${NEWROOT}=aufs
- {
- case "${STAGE3}" in
- rootsys)
- sysresccd_stage3_rootsys
- ;;
- normal)
- sysresccd_stage3_normal
- ;;
- esac
- }
- # =============================================================================
- sysresccd_parsecmdline()
- {
- for x in $(cat /proc/cmdline)
- do
- case "${x}" in
- init\=*)
- INITPROG=`parse_opt "${x}"`
- ;;
- dodhcp)
- DODHCP='all'
- SETETHX=''
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- dodhcp\=*)
- DODHCP=`parse_opt "${x}"`
- SETETHX=''
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- nodhcp)
- NODHCP='1'
- ;;
- ethx\=*)
- SETETHX=`parse_opt "${x}"`
- DODHCP=''
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- dns\=*)
- SETDNS=`parse_opt "${x}"`
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- gw\=*)
- SETGW=`parse_opt "${x}"`
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- gateway\=*)
- SETGW=`parse_opt "${x}"`
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- dhcphostname\=*)
- DHCPHOSTNAME=`parse_opt "${x}"`
- NETCONFIG='1'
- ;;
- netboot\=http://*)
- HTTPBOOT=`parse_opt "${x}"`
- STAGE0='http'
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- netboot\=tftp://*)
- TFTPBOOT=`parse_opt "${x}"`
- STAGE0='tftp'
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- netboot\=nfs://*)
- NFSBOOT=`parse_opt "${x}"`
- STAGE0='nfs'
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- netboot\=nbd://*)
- NBDBOOT=`parse_opt "${x}"`
- STAGE0='nbd'
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- root\=*)
- ROOTOPT=`parse_opt "${x}"`
- STAGE0='rootsys'
- ;;
- isoloop\=*)
- ISOLOOP=`parse_opt "${x}"`
- STAGE0='isoloop'
- ;;
- docache)
- DOCACHE='1'
- ;;
- subdir\=*)
- SUBDIR=`parse_opt "${x}"`
- ;;
- speakup\=*)
- SPEAKUP=`parse_opt "${x}"`
- ;;
- backstore\=*)
- BACKSTORE_CMD=`parse_opt "${x}"`
- ;;
- setkmap\=*)
- SETKMAP=`parse_opt "${x}"`
- ;;
- scandelay\=*)
- SCANDELAY=`parse_opt "${x}"`
- ;;
- scandelay)
- SCANDELAY=10
- ;;
- doload\=*)
- MODLOAD=`parse_opt "${x}"`
- MODLOAD="`echo ${MODLOAD} | sed -e \"s/,/ /g\"`"
- ;;
- nodetect)
- NODETECT='1'
- ;;
- noload\=*)
- BLACKLIST=`parse_opt "${x}"`
- BLACKLIST="`echo ${BLACKLIST} | sed -e \"s/,/ /g\"`"
- ;;
- CONSOLE\=*)
- CONSOLE=`parse_opt "${x}"`
- exec >${CONSOLE} <${CONSOLE} 2>&1
- ;;
- docheck)
- DOCHECK='1'
- ;;
- lowmem)
- LOWMEM='1'
- ;;
- minishell)
- MINISHELL='1'
- ;;
- nonm)
- NONETMGR='1'
- ;;
- nonetman)
- NONETMGR='1'
- ;;
- httpboot\=*) # for compatibility only
- HTTPBOOT=`parse_opt "${x}"`
- STAGE0='http'
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- tftpboot\=*) # for compatibility only
- TFTPBOOT=`parse_opt "${x}"`
- STAGE0='tftp'
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- boothttp\=*) # for compatibility only
- HTTPBOOT=`parse_opt "${x}"`
- STAGE0='http'
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- boottftp\=*) # for compatibility only
- TFTPBOOT=`parse_opt "${x}"`
- STAGE0='tftp'
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- nfsboot\=*) # for compatibility only
- ARG=`parse_opt "${x}"`
- NFSBOOT="nfs://${ARG}"
- STAGE0='nfs'
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- nbdboot\=*) # for compatibility only
- ARG=`parse_opt "${x}"`
- NBDBOOT="nbd://${ARG}"
- STAGE0='nbd'
- NETCONFIG='1'
- NONETMGR='1'
- ;;
- esac
- done
- }
- # =============================================================================
- sysresccd_init()
- {
- export PATH=/bin:/usr/bin:/sbin:/usr/sbin
- # only run as an init program
- if [ "$$" != '1' ]
- then
- echo '/init has to be run as the init process as the one'
- echo 'with a PID of 1. Try adding init="/init" to the'
- echo 'kernel command line or running "exec /init".'
- exit 1
- fi
- # create system directories
- [ -d /dev ] || mkdir -m 0755 /dev
- [ -d /root ] || mkdir -m 0700 /root
- [ -d /sys ] || mkdir /sys
- [ -d /proc ] || mkdir /proc
- [ -d /tmp ] || mkdir /tmp
- [ -d /selinux ] || mkdir /selinux
- [ -d /var/lock ] || mkdir -p /var/lock
- [ -d /usr/bin ] || mkdir -p /usr/bin
- [ -d /usr/sbin ] || mkdir -p /usr/sbin
- [ -d ${SQUASHFSMNT} ] || mkdir -p ${SQUASHFSMNT}
- [ -d ${BOOTPATH} ] || mkdir -p ${BOOTPATH}
- [ -d ${NEWROOT} ] || mkdir -p ${NEWROOT}
- [ -d ${BACKSTORE_MNT} ] || mkdir -p ${BACKSTORE_MNT}
- [ -d ${BACKSTORE_MEM} ] || mkdir -p ${BACKSTORE_MEM}
- [ -d ${ISOSTORE} ] || mkdir -p ${ISOSTORE}
- [ -d ${CACHEDIR} ] || mkdir -p ${CACHEDIR}
- # mount virtual filesystems
- /bin/busybox mount -t sysfs -o nodev,noexec,nosuid none /sys
- /bin/busybox mount -t proc -o nodev,noexec,nosuid none /proc
- # setup busybox
- /bin/busybox --install -s
- }
- # =============================================================================
- NORMAL="\033[0m"
- WARN="\033[33;1m"
- BAD="\033[31;1m"
- BOLD="\033[1m"
- GOOD="\033[32;1m"
- DOCACHE=''
- SETKMAP=''
- MINISHELL=''
- NETCONFIG=''
- DHCPHOSTNAME=''
- DOCHECK=''
- LOWMEM=''
- SETGW=''
- SETDNS=''
- SETETHX=''
- NETBOOT=''
- NFSBOOT=''
- NBDBOOT=''
- ISOLOOP=''
- ISOLOOPDEV=''
- DODHCP=''
- NODHCP=''
- ROOTFS=''
- SUBDIR=''
- SPEAKUP=''
- STAGE0='normal'
- BOOTPATH='/boot'
- NEWROOT='/newroot'
- SQUASHFSMNT='/squashfs'
- ISOSTORE='/isostore'
- BACKSTORE_CMD=''
- BACKSTORE_MNT='/backstore'
- BACKSTORE_MEM='/memory'
- BACKSTORE_DAT='sysrcd.bs'
- LOOPDAT='sysrcd.dat'
- LOOPMD5='sysrcd.md5'
- INITPROG='/sbin/init'
- CONSOLE='/dev/console'
- CACHEDIR='/cache'
- CACHESIZE='size=512m'
- NONETMGR=''
- # Start with an empty list
- BLKDEVICES=""
- # CDROM DEVICES
- BLKDEVICES="$BLKDEVICES /dev/cdroms/* /dev/ide/cd/* /dev/sr*"
- # USB Keychain/Storage
- BLKDEVICES="$BLKDEVICES /dev/sd*"
- # IDE devices
- BLKDEVICES="$BLKDEVICES /dev/hd*"
- # USB Block Driver
- BLKDEVICES="$BLKDEVICES /dev/ubd* /dev/ubd/*"
- # iSeries devices
- BLKDEVICES="$BLKDEVICES /dev/iseries/vcd*"
- # HP Smart Array
- BLKDEVICES="$BLKDEVICES /dev/cciss* /dev/cciss/*"
- # devmapper
- BLKDEVICES="$BLKDEVICES /dev/dm* /dev/mapper/*"
- # md raid
- BLKDEVICES="$BLKDEVICES /dev/md* /dev/md/*"
- # =============================================================================
- sysresccd_init
- sysresccd_parsecmdline
- sysresccd_terminal
- sysresccd_udev_start
- sysresccd_speakup
- sysresccd_setup_keymap
- sysresccd_setup_volumes
- sysresccd_netconfig
- sysresccd_debug
- sysresccd_stage0
- sysresccd_stage1
- sysresccd_stage2
- sysresccd_stage3
- sysresccd_udev_stop
- sysresccd_chroot
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement