273 lines
5.0 KiB
Bash
273 lines
5.0 KiB
Bash
#!/bin/sh
|
|
|
|
[ -d /dev ] || mkdir -m 0755 /dev
|
|
[ -d /root ] || mkdir -m 0700 /root
|
|
[ -d /sys ] || mkdir /sys
|
|
[ -d /proc ] || mkdir /proc
|
|
[ -d /tmp ] || mkdir /tmp
|
|
mkdir -p /var/lock
|
|
mount -t sysfs -o nodev,noexec,nosuid none /sys
|
|
mount -t proc -o nodev,noexec,nosuid none /proc
|
|
|
|
grep -q '\<quiet\>' /proc/cmdline || echo "Loading, please wait..."
|
|
|
|
# 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
|
|
if ! mount -t devtmpfs -o mode=0755 none /dev; then
|
|
mount -t tmpfs -o mode=0755 none /dev
|
|
mknod -m 0600 /dev/console c 5 1
|
|
mknod /dev/null c 1 3
|
|
fi
|
|
mkdir /dev/pts
|
|
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 none /dev/pts || true
|
|
> /dev/.initramfs-tools
|
|
mkdir /dev/.initramfs
|
|
|
|
# Export the dpkg architecture
|
|
export DPKG_ARCH=
|
|
. /conf/arch.conf
|
|
|
|
# Set modprobe env
|
|
export MODPROBE_OPTIONS="-qb"
|
|
|
|
# Export relevant variables
|
|
export ROOT=
|
|
export ROOTDELAY=
|
|
export ROOTFLAGS=
|
|
export ROOTFSTYPE=
|
|
export IPOPTS=
|
|
export HWADDR=
|
|
export break=
|
|
export init=/sbin/init
|
|
export quiet=n
|
|
export readonly=y
|
|
export rootmnt=/root
|
|
export debug=
|
|
export panic=
|
|
export blacklist=
|
|
export resume_offset=
|
|
|
|
# Bring in the main config
|
|
. /conf/initramfs.conf
|
|
for conf in conf/conf.d/*; do
|
|
[ -f ${conf} ] && . ${conf}
|
|
done
|
|
. /scripts/functions
|
|
|
|
# Parse command line options
|
|
for x in $(cat /proc/cmdline); do
|
|
case $x in
|
|
init=*)
|
|
init=${x#init=}
|
|
;;
|
|
root=*)
|
|
ROOT=${x#root=}
|
|
case $ROOT in
|
|
LABEL=*)
|
|
ROOT="${ROOT#LABEL=}"
|
|
|
|
# support / in LABEL= paths (escape to \x2f)
|
|
case "${ROOT}" in
|
|
*[/]*)
|
|
if [ -x "$(command -v sed)" ]; then
|
|
ROOT="$(echo ${ROOT} | sed 's,/,\\x2f,g')"
|
|
else
|
|
if [ "${ROOT}" != "${ROOT#/}" ]; then
|
|
ROOT="\x2f${ROOT#/}"
|
|
fi
|
|
if [ "${ROOT}" != "${ROOT%/}" ]; then
|
|
ROOT="${ROOT%/}\x2f"
|
|
fi
|
|
IFS='/'
|
|
newroot=
|
|
for s in $ROOT; do
|
|
if [ -z "${newroot}" ]; then
|
|
newroot="${s}"
|
|
else
|
|
newroot="${newroot}\\x2f${s}"
|
|
fi
|
|
done
|
|
unset IFS
|
|
ROOT="${newroot}"
|
|
fi
|
|
esac
|
|
ROOT="/dev/disk/by-label/${ROOT}"
|
|
;;
|
|
UUID=*)
|
|
ROOT="/dev/disk/by-uuid/${ROOT#UUID=}"
|
|
;;
|
|
/dev/nfs)
|
|
[ -z "${BOOT}" ] && BOOT=nfs
|
|
;;
|
|
esac
|
|
;;
|
|
rootflags=*)
|
|
ROOTFLAGS="-o ${x#rootflags=}"
|
|
;;
|
|
rootfstype=*)
|
|
ROOTFSTYPE="${x#rootfstype=}"
|
|
;;
|
|
rootdelay=*)
|
|
ROOTDELAY="${x#rootdelay=}"
|
|
case ${ROOTDELAY} in
|
|
*[![:digit:].]*)
|
|
ROOTDELAY=
|
|
;;
|
|
esac
|
|
;;
|
|
resumedelay=*)
|
|
RESUMEDELAY="${x#resumedelay=}"
|
|
;;
|
|
loop=*)
|
|
LOOP="${x#loop=}"
|
|
;;
|
|
loopflags=*)
|
|
LOOPFLAGS="-o ${x#loopflags=}"
|
|
;;
|
|
loopfstype=*)
|
|
LOOPFSTYPE="${x#loopfstype=}"
|
|
;;
|
|
cryptopts=*)
|
|
cryptopts="${x#cryptopts=}"
|
|
;;
|
|
nfsroot=*)
|
|
NFSROOT="${x#nfsroot=}"
|
|
;;
|
|
netboot=*)
|
|
NETBOOT="${x#netboot=}"
|
|
;;
|
|
ip=*)
|
|
IPOPTS="${x#ip=}"
|
|
;;
|
|
hwaddr=*)
|
|
HWADDR="${x#hwaddr=}"
|
|
;;
|
|
boot=*)
|
|
BOOT=${x#boot=}
|
|
;;
|
|
resume=*)
|
|
RESUME="${x#resume=}"
|
|
;;
|
|
resume_offset=*)
|
|
resume_offset="${x#resume_offset=}"
|
|
;;
|
|
noresume)
|
|
noresume=y
|
|
;;
|
|
panic=*)
|
|
panic="${x#panic=}"
|
|
case ${panic} in
|
|
*[![:digit:].]*)
|
|
panic=
|
|
;;
|
|
esac
|
|
;;
|
|
quiet)
|
|
quiet=y
|
|
;;
|
|
ro)
|
|
readonly=y
|
|
;;
|
|
rw)
|
|
readonly=n
|
|
;;
|
|
debug)
|
|
debug=y
|
|
quiet=n
|
|
exec >/dev/.initramfs/initramfs.debug 2>&1
|
|
set -x
|
|
;;
|
|
debug=*)
|
|
debug=y
|
|
quiet=n
|
|
set -x
|
|
;;
|
|
break=*)
|
|
break=${x#break=}
|
|
;;
|
|
break)
|
|
break=premount
|
|
;;
|
|
blacklist=*)
|
|
blacklist=${x#blacklist=}
|
|
;;
|
|
netconsole=*)
|
|
netconsole=${x#netconsole=}
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ -z "${noresume}" ]; then
|
|
export resume=${RESUME}
|
|
else
|
|
export noresume
|
|
fi
|
|
|
|
[ -n "${netconsole}" ] && modprobe netconsole netconsole=${netconsole}
|
|
|
|
maybe_break top
|
|
|
|
# export BOOT variable value for compcache,
|
|
# so we know if we run from casper
|
|
export BOOT
|
|
|
|
# Don't do log messages here to avoid confusing usplash
|
|
run_scripts /scripts/init-top
|
|
|
|
maybe_break modules
|
|
log_begin_msg "Loading essential drivers..."
|
|
load_modules
|
|
log_end_msg
|
|
|
|
maybe_break premount
|
|
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-premount"
|
|
run_scripts /scripts/init-premount
|
|
[ "$quiet" != "y" ] && log_end_msg
|
|
|
|
maybe_break mount
|
|
log_begin_msg "Mounting root file system..."
|
|
. /scripts/${BOOT}
|
|
parse_numeric ${ROOT}
|
|
mountroot
|
|
log_end_msg
|
|
|
|
maybe_break bottom
|
|
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-bottom"
|
|
run_scripts /scripts/init-bottom
|
|
[ "$quiet" != "y" ] && log_end_msg
|
|
|
|
# Move virtual filesystems over to the real filesystem
|
|
mount -n -o move /sys ${rootmnt}/sys
|
|
mount -n -o move /proc ${rootmnt}/proc
|
|
|
|
# Check init bootarg
|
|
if [ -n "${init}" ] && [ ! -x "${rootmnt}${init}" ]; then
|
|
echo "Target filesystem doesn't have ${init}."
|
|
init=
|
|
fi
|
|
|
|
# Search for valid init
|
|
if [ -z "${init}" ] ; then
|
|
for init in /sbin/init /etc/init /bin/init /bin/sh; do
|
|
if [ ! -x "${rootmnt}${init}" ]; then
|
|
continue
|
|
fi
|
|
break
|
|
done
|
|
fi
|
|
|
|
# No init on rootmount
|
|
if [ ! -x "${rootmnt}${init}" ]; then
|
|
panic "No init found. Try passing init= bootarg."
|
|
fi
|
|
|
|
# Confuses /etc/init.d/rc
|
|
if [ -n ${debug} ]; then
|
|
unset debug
|
|
fi
|
|
|
|
# Chain to real filesystem
|
|
maybe_break init
|
|
exec run-init ${rootmnt} ${init} "$@" <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1
|
|
panic "Could not execute run-init."
|