Bugzilla – Attachment 49015 Details for
Bug 115556
/init crashes in initramfs
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
IDP Log In
|
Forgot Password
init
init.real (text/plain), 12.40 KB, created by
Hannes Reinecke
on 2005-09-07 06:56:59 UTC
(
hide
)
Description:
init
Filename:
MIME Type:
Creator:
Hannes Reinecke
Created:
2005-09-07 06:56:59 UTC
Size:
12.40 KB
patch
obsolete
>#! /bin/sh > >export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/lib/klibc/bin > >die() { > umount /proc > umount /sys > umount /dev > exit $1 >} > >exec < /dev/console > /dev/console 2>&1 > >devdir="/dev" >mount -t tmpfs -o 'size=25%,mode=0755' initramfsdevs $devdir >mkdir -p $devdir/pts >mkdir -p $devdir/shm >mkdir -p $devdir/.udevdb > >[ ! -f /proc/cpuinfo ] && mount -tproc proc /proc >[ ! -d /sys/class ] && mount -tsysfs sysfs /sys > > >kernel_cmdline="$@" > >for o in $(cat /proc/cmdline); do > case $o in > linuxrc=trace) > echo -n "cmdline: " > for arg in $@; do > echo -n "$arg " > done > echo "" > echo "init:" > cat /init > set -x > set -v > debug_linuxrc=1 > ;; > noresume) > resume_mode=no > ;; > sysrq=yes|sysrq=1) > echo 1 > /proc/sys/kernel/sysrq > ;; > 1|2|3|4|5|S|s|single) > runlevel=$o > ;; > rw) > read_write=1 > ;; > esac >done > ># Fallback root device number >rootdevn= > >for o in $(cat /proc/cmdline); do > case $o in > root=*) > rootdev=${o#root=} > rootdev_cmdline=1 > ;; > nfsroot=*) > rootdev=${o#nfsroot=} > rootdev_cmdline=1 > ;; > resume=*) > set -- $(IFS== ; echo $o) > resumedev=$2 > ;; > init=*) > set -- $(IFS== ; echo $o) > init=$2 > ;; > esac >done >if [ -z "$rootdev" ]; then > rootdev= >else > # lilo strips off the /dev/prefix from device names! > case $rootdev in > /dev/*) > ;; > LABEL=*) > label=${rootdev#LABEL=} > echo "SUBSYSTEM=\"block\", SYSFS{start}=\"*\", PROGRAM=\"/sbin/vol_id -l %N\", RESULT=\"$label\", SYMLINK=\"root\"" > /etc/udev/rules.d/01-label.rules > echo "KERNEL=\"dm-[0-9]*\", PROGRAM=\"/sbin/vol_id -l %N\", RESULT=\"$label\", SYMLINK=\"root\"" >> /etc/udev/rules.d/01-label.rules > rootdev=/dev/root > ;; > UUID=*) > uuid=${rootdev#UUID=} > echo "SUBSYSTEM=\"block\", SYSFS{start}=\"*\", PROGRAM=\"/sbin/vol_id -u %N\", RESULT=\"$uuid\", SYMLINK=\"root\"" > /etc/udev/rules.d/02-uuid.rules > echo "KERNEL=\"dm-[0-9]*\", PROGRAM=\"/sbin/vol_id -u %N\", RESULT=\"$uuid\", SYMLINK=\"root\"" >> /etc/udev/rules.d/02-uuid.rules > rootdev=/dev/root > ;; > [0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) > maj=$((0x0$rootdev >> 8)) > min=$((0x0$rootdev & 0xff)) > echo "SUBSYSTEM=\"block\", SYSFS{dev}=\"$maj:$min\", SYMLINK=\"root\"" > /etc/udev/rules.d/05-lilo.rules > rootdevn=$maj:$min > rootdev=/dev/root ;; > [0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) > maj=$((0x$rootdev >> 8)) > min=$((0x$rootdev & 0xff)) > echo "SUBSYSTEM=\"block\", SYSFS{dev}=\"$maj:$min\", SYMLINK=\"root\"" > /etc/udev/rules.d/05-lilo.rules > rootdevn=$maj:$min > rootdev=/dev/root ;; > 0x[0-9a-fA-F][0-9a-fA-F]*) > maj=$(($rootdev >> 8)) > min=$(($rootdev & 0xff)) > echo "SUBSYSTEM=\"block\", SYSFS{dev}=\"$maj:$min\", SYMLINK=\"root\"" > /etc/udev/rules.d/05-lilo.rules > rootdevn=$maj:$min > rootdev=/dev/root ;; > *:*) > rootfstype="nfs" > ;; > *) > rootdev=/dev/$rootdev > ;; > esac >fi > ># Verify manual resume mode >if [ "" != "off" -a -n "$resumedev" ]; then > if [ -w /sys/power/resume ]; then > echo "Trying manual resume from $resumedev" > resume_mode=1 > else > resumedev= > fi >else > resume_mode= >fi > ># Check for debugging >if [ -n "$debug_linuxrc" ]; then > echo "udev_log=\"debug\"" >> /etc/udev/udev.conf >else > echo "udev_log=\"error\"" >> /etc/udev/udev.conf >fi > >mkdevn () >{ > local major=$1 minor=$2 minorhi minorlo; > major=$(($major * 256)); > minorhi=$(($minor / 256)); > minorlo=$(($minor % 256)); > minor=$(($minorhi * 256 * 4096)); > echo $(( $minorlo + $major + $minor )) >} > >devmajor () >{ > local devn=$(($1 / 256)); > echo $(( $devn % 4096 )) >} > >devminor () >{ > local devn=$1; > echo $(( $devn % 256 )) >} > >block_driver () >{ > local devn block major driver; > case "$1" in > /dev/*) > devn=$(devnumber $1 2> /dev/null) > ;; > *:*) > set -- $(IFS=: ; echo $1); > devn=$(mkdevn $1 $2) > ;; > [0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) > devn=$((0x$1)) > ;; > esac; > [ -z "$devn" ] && return 1; > while read major driver; do > [ "$major" = Block ] && block=1; > [ -z "$driver" -o -z "$block" ] && continue; > if [ $(devmajor $devn) = $major ]; then > echo $driver; > return 0; > fi; > done </proc/devices; > return 1 >} > > >echo "Starting udev" >if [ -x /sbin/hotplug.sh ]; then > echo "/sbin/hotplug.sh" > /proc/sys/kernel/hotplug >else > echo "/sbin/udev" > /proc/sys/kernel/hotplug >fi >echo "Creating devices" >/sbin/udevstart > ># workaround chicken/egg bug in mdadm and raidautorun ># they do the ioctl on the not yet existing device node... >for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ; do > mknod -m 660 /dev/md$i b 9 $i >done > > >params= > >echo "Loading e1000" >modprobe e1000 $params > >params= > >echo "Loading af_packet" >modprobe af_packet $params > >case $rootdev in >/dev/nfs|*:/*|"") > dhcp_mode=1 ;; >esac > ># run dhcp >if [ -n "$dhcp_mode" ]; then > # ifconfig lo 127.0.0.1 netmask 255.0.0.0 broadcast 127.255.255.255 up > # portmap > echo "running dhcpcd on interface eth0" > dhcpcd -R -Y -N -t 100000000 eth0 > [ -s /var/lib/dhcpcd/dhcpcd-eth0.info ] || { > echo "no response from dhcp server." > echo 256 > /proc/sys/kernel/real-root-dev > die 0 > } > . /var/lib/dhcpcd/dhcpcd-eth0.info > kill -9 $(cat /var/run/dhcpcd-eth0.pid) > if [ -n "$DNS" ]; then > oifs="$IFS" > IFS="," > for ns in $DNS ; do > echo "nameserver $ns" >> /etc/resolv.conf > done > IFS="$oifs" > if [ -n "$DOMAIN" ]; then > echo "search $DOMAIN" >> /etc/resolv.conf > fi > echo 'hosts: dns' > /etc/nsswitch.conf > fi >fi > >: rootfstype = nfs >if [ -z "$rootdev_cmdline" ]; then > case "$ROOTPATH" in > "") ;; > *:*) > rootfstype="nfs" > rootdev="$ROOTPATH" ;; > *) > if [ -n "$DHCPSIADDR" ]; then > rootdev="$DHCPSIADDR:$ROOTPATH" > rootfstype="nfs" > elif [ -n "$DHCPSNAME" ]; then > rootdev="$DHCPSNAME:$ROOTPATH" > rootfstype="nfs" > fi ;; > esac > if [ -z "$rootdev" ]; then > echo "no local root= kernel option given and no root" \ > "server set by the dhcp server." > echo 256 > /proc/sys/kernel/real-root-dev > die 0 > fi >fi > ># Waiting for a device to appear ># device node will be created by udev >: proc udev_wait_for_device >udev_wait_for_device() { > local root > local vg > local retval=1 > local timeout=$udev_timeout > root=$1 > vg=$2 > if [ -n "$root" ]; then > echo -n "Waiting for device /dev/$root to appear: " > while [ $timeout -gt 0 ]; do > if [ -e /dev/$root ]; then > echo " ok" > retval=0 > break; > fi > sleep 1 > echo -n "." > [ -n "$vg" ] && vgchange -a y $vg > timeout=$(( $timeout - 1 )) > done > fi > # Rescan for LVM1 > if [ -n "$vg" -a $retval -eq 1 ]; then > vgscan > vgchange -a y $vg > fi > return $retval; >} > ># Reads the major:minor pair from a sysfs path ># and converts it into a devno >: proc udev_read_devn >udev_read_devn() { > local dev; > local devn; > > if [ -z "$1" ]; then > echo "" > return > fi > > dev=/sys$1/dev > if [ -f $dev ]; then > local major minor devn > IFS=":" read major minor < $dev > devn=$(mkdevn $major $minor) > echo "$devn $major $minor" > else > echo "" > fi >} > >: proc udev_discover_resume >udev_discover_resume() { > local resume > # Waits for the resume device to appear > if [ -n "$resume_mode" ]; then > resume=${resumedev#/dev/} > if udev_wait_for_device $resume; then > path=$(/sbin/udevinfo -q path -n $resume) > if [ $? -eq 0 -a -n "$path" ]; then > set -- $(udev_read_devn $path) > if [ -n "$1" ]; then > devn=$1 > major=$2 > minor=$3 > fi > else > # Try major:minor number of the device node > devn=$(devnumber $resumedev) > major=$(devmajor $devn) > minor=$(devminor $devn) > fi > path= > devn= > fi > if [ -n "$major" -a -n "$minor" ]; then > echo "$major:$minor" > /sys/power/resume > major= > minor= > else > echo "resume device $resumedev not found (ignoring)" > fi > fi >} > ># And a new comment lkjsldkjflaksjdflasjkdf;alsdkjf;alsdjfa;sldkjf ># And a new comment lkjsldkjflaksjdflasjkdf;alsdkjf;alsdjfa;sldkjf >: proc udev_discover_root $rootdev >udev_discover_root() { > local root=$1 > echo "($root)" > if [ "$rootfstype" = "nfs" ] ; then > return 0 > fi > > if udev_wait_for_device ${root#/dev/} $vg_root; then > path=$(/sbin/udevinfo -q path -n $root) > if [ $? -eq 0 -a -n "$path" ] ; then > set -- $(udev_read_devn $path) > if [ -n "$1" ]; then > devn=$1 > major=$2 > minor=$3 > fi > else > # Try major:minor number of the device node > devn=$(devnumber $1) > major=$(devmajor $devn) > minor=$(devminor $devn) > fi > fi > if [ -n "$devn" ] ; then > echo "rootfs: $entry major=$major minor=$minor" \ > "devn=$devn" > echo $devn > /proc/sys/kernel/real-root-dev > return 0 > else > return 1 > fi >} > ># Default timeout is 5 seconds >udev_timeout=5 ># Override timeout from commandline >for o in $(cat /proc/cmdline); do > case $o in > udev_timeout=*) > set -- $(IFS== ; echo $o) > udev_timeout=$2 > ;; > esac >done > ># wait for the resume device >udev_discover_resume > > >: call udev_discover_root rootfstype $rootfstype >if [ "$rootfstype" != "nfs" ] && ! udev_discover_root $rootdev ; then > echo "not found -- exiting to /bin/sh" > cd / > PATH=$PATH PS1='$ ' /bin/sh -i >fi > >if [ -z "$rootfstype" ]; then > rootfstype=$(/sbin/vol_id -t $rootdev) > [ $? -ne 0 ] && $rootfstype= > [ "$rootfstype" = "unknown" ] && $rootfstype= >fi > ># check filesystem if possible >if [ -n "$rootfstype" -a -x /bin/fsck.${rootfstype} ]; then > # fsck is unhappy without it > echo "$rootdev / $rootfstype defaults 1 1" > /etc/fstab > fsck -t $rootfstype -a $rootdev > # Return the fsck status > ROOTFS_FSCK=$? > export ROOTFS_FSCK > ROOTFS_FSTYPE=$rootfstype > export ROOTFS_FSTYPE > if [ $ROOTFS_FSCK -gt 1 -a $ROOTFS_FSCK -lt 4 ]; then > # reboot needed > echo "fsck succeeded, but reboot is required." > echo "Rebooting system." > /bin/reboot -d -f > elif [ $ROOTFS_FSCK -gt 3 ] ; then > echo "fsck failed. Mounting root device read-only." > read_write= > else > echo "fsck succeeded. Mounting root device read-write." > read_write=1 > fi >fi > >opt="-o ro" >[ -n "$read_write" ] && opt="-o rw" >[ "$rootfstype" = "nfs" ] && opt="${opt},nolock" > ># tell kernel root is /dev/ram0, prevents remount after initrd >echo 256 > /proc/sys/kernel/real-root-dev ># mount the actual root device below /root >echo "Mounting root $rootdev" >[ -n "$rootfstype" ] && opt="${opt} -t $rootfstype" >if [ "$rootfstype" = "nfs" ]; then > nfsmount $rootdev /root || die 1 >else > mount $opt $rootdev /root || die 1 >fi ># Look for an init binary on the root filesystem >if [ -n "$init" ] ; then > if [ ! -f "/root$init" ]; then > init= > fi >fi > >if [ -z "$init" ] ; then > for i in /sbin/init /etc/init /bin/init /bin/sh ; do > if [ ! -f "/root$i" ] ; then continue ; fi > init="$i" > break > done >fi > >if [ -z "$init" ] ; then > echo "No init found. Try passing init= optino to the kernel." > die 1 >fi > ># Setup dynamic device nodes directory >dev_on_tmpfs="yes" >if [ -n "$DEV_ON_TMPFS" -a "$DEV_ON_TMPFS" != "yes" ]; then > dev_on_tmpfs= >fi > >if [ -n "$dev_on_tmpfs" ]; then > # Create framebuffer devices > if [ -f /proc/fb ]; then > cat /proc/fb | while read fbnum fbtype; do > if [ $(($fbnum < 32)) ] ; then > [ -c /dev/fb$fbnum ] || mknod /dev/fb$fbnum c 29 $fbnum > fi > done > fi > > # These links are required by devices.txt > (cd /dev; ln -s /proc/self/fd fd) > (cd /dev; ln -s fd/0 stdin; ln -s fd/1 stdout; ln -s fd/2 stderr) > > # ISDN requires /dev/isdninfo > mknod /dev/isdninfo c 45 255 >fi > ># Save all events >if [ -d /root/lib/klibc/events ]; then > mount -t tmpfs -o 'size=5%,mode=0755' eventfs /root/lib/klibc/events > cd /events > for ev in *; do > if [ -f "$ev" ]; then cat $ev > /root/lib/klibc/events/$ev ; fi > done >fi > >if [ -n "$dev_on_tmpfs" ] ; then > /bin/mount -o move /dev /root/dev >else > /bin/mount -o move /dev /root/lib/klibc/dev >fi > ># Reset hotplug >echo "/sbin/hotplug" > /proc/sys/kernel/hotplug > ># Call vendor-specific init script >if [ -x /vendor_init.sh ] ; then > /vendor_init.sh >fi > ># ready to leave >cd /root >umount /proc >umount /sys > ># Export root fs information >ROOTFS_BLKDEV="$rootdev" >export ROOTFS_BLKDEV > >if [ -z "$dev_on_tmpfs" ] ; then > ROOTFS_REALDEV="/lib/klibc/$rootdev" > export ROOTFS_REALDEV >fi > >exec /bin/run-init -c ./dev/console /root $init $runlevel >echo could not exec run-init! > >die 0 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
Actions:
View
Attachments on
bug 115556
:
49014
| 49015 |
49016