mirror of
https://salsa.debian.org/kernel-team/initramfs-tools.git
synced 2026-01-26 15:39:08 +00:00
The kernel now looks for 'tmpfs' in the value of the rootfstype parameter, and uses either ramfs or tmpfs for the initramfs depending on that. We should allow 'tmpfs' to appear, but not pass it down to the fsck and mount commands. So filter it out of the value of $ROOTFSTYPE. Signed-off-by: Ben Hutchings <benh@debian.org>
343 lines
6.6 KiB
Bash
Executable File
343 lines
6.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Default PATH differs between shells, and is not automatically exported
|
|
# by klibc dash. Make it consistent.
|
|
export PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
|
|
|
[ -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 sysfs /sys
|
|
mount -t proc -o nodev,noexec,nosuid proc /proc
|
|
|
|
# shellcheck disable=SC2013
|
|
for x in $(cat /proc/cmdline); do
|
|
case $x in
|
|
initramfs.clear)
|
|
clear
|
|
;;
|
|
quiet)
|
|
quiet=y
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ "$quiet" != "y" ]; then
|
|
quiet=n
|
|
echo "Loading, please wait..."
|
|
fi
|
|
export quiet
|
|
|
|
# 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
|
|
mount -t devtmpfs -o nosuid,mode=0755 udev /dev
|
|
|
|
# Prepare the /dev directory
|
|
[ ! -h /dev/fd ] && ln -s /proc/self/fd /dev/fd
|
|
[ ! -h /dev/stdin ] && ln -s /proc/self/fd/0 /dev/stdin
|
|
[ ! -h /dev/stdout ] && ln -s /proc/self/fd/1 /dev/stdout
|
|
[ ! -h /dev/stderr ] && ln -s /proc/self/fd/2 /dev/stderr
|
|
|
|
mkdir /dev/pts
|
|
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
|
|
|
|
# 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 IP=
|
|
export DEVICE=
|
|
export BOOT=
|
|
export BOOTIF=
|
|
export UBIMTD=
|
|
export break=
|
|
export init=/sbin/init
|
|
export readonly=y
|
|
export rootmnt=/root
|
|
export debug=
|
|
export panic=
|
|
export blacklist=
|
|
export resume=
|
|
export resume_offset=
|
|
export noresume=
|
|
export drop_caps=
|
|
export fastboot=n
|
|
export forcefsck=n
|
|
export fsckfix=
|
|
|
|
|
|
# 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
|
|
# shellcheck disable=SC2013
|
|
for x in $(cat /proc/cmdline); do
|
|
case $x in
|
|
init=*)
|
|
init=${x#init=}
|
|
;;
|
|
root=*)
|
|
ROOT=${x#root=}
|
|
if [ -z "${BOOT}" ] && [ "$ROOT" = "/dev/nfs" ]; then
|
|
BOOT=nfs
|
|
fi
|
|
;;
|
|
rootflags=*)
|
|
ROOTFLAGS="-o ${x#rootflags=}"
|
|
;;
|
|
rootfstype=*)
|
|
# Linux interprets 'rootfstype=*tmpfs*' to control the
|
|
# initramfs filesystem; we should remove 'tmpfs' from
|
|
# the list
|
|
ROOTFSTYPE="$(list_filter_out "${x#rootfstype=}" tmpfs)"
|
|
;;
|
|
rootdelay=*)
|
|
ROOTDELAY="${x#rootdelay=}"
|
|
case ${ROOTDELAY} in
|
|
*[![:digit:].]*)
|
|
ROOTDELAY=
|
|
;;
|
|
esac
|
|
;;
|
|
nfsroot=*)
|
|
# shellcheck disable=SC2034
|
|
NFSROOT="${x#nfsroot=}"
|
|
;;
|
|
initramfs.runsize=*)
|
|
RUNSIZE="${x#initramfs.runsize=}"
|
|
;;
|
|
ip=*)
|
|
IP="${x#ip=}"
|
|
;;
|
|
boot=*)
|
|
BOOT=${x#boot=}
|
|
;;
|
|
ubi.mtd=*)
|
|
UBIMTD=${x#ubi.mtd=}
|
|
;;
|
|
resume=*)
|
|
RESUME="${x#resume=}"
|
|
;;
|
|
resume_offset=*)
|
|
resume_offset="${x#resume_offset=}"
|
|
;;
|
|
noresume)
|
|
noresume=y
|
|
;;
|
|
drop_capabilities=*)
|
|
drop_caps="-d ${x#drop_capabilities=}"
|
|
;;
|
|
panic=*)
|
|
panic="${x#panic=}"
|
|
;;
|
|
ro)
|
|
readonly=y
|
|
;;
|
|
rw)
|
|
readonly=n
|
|
;;
|
|
debug)
|
|
debug=y
|
|
quiet=n
|
|
if [ -n "${netconsole}" ]; then
|
|
log_output=/dev/kmsg
|
|
else
|
|
log_output=/run/initramfs/initramfs.debug
|
|
fi
|
|
set -x
|
|
;;
|
|
debug=*)
|
|
debug=y
|
|
quiet=n
|
|
set -x
|
|
;;
|
|
break=*)
|
|
break=${x#break=}
|
|
;;
|
|
break)
|
|
break=premount
|
|
;;
|
|
blacklist=*)
|
|
blacklist=${x#blacklist=}
|
|
;;
|
|
netconsole=*)
|
|
netconsole=${x#netconsole=}
|
|
[ "$debug" = "y" ] && log_output=/dev/kmsg
|
|
;;
|
|
BOOTIF=*)
|
|
BOOTIF=${x#BOOTIF=}
|
|
;;
|
|
fastboot|fsck.mode=skip)
|
|
fastboot=y
|
|
;;
|
|
forcefsck|fsck.mode=force)
|
|
forcefsck=y
|
|
;;
|
|
fsckfix|fsck.repair=yes)
|
|
fsckfix=y
|
|
;;
|
|
fsck.repair=no)
|
|
fsckfix=n
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Default to BOOT=local if no boot script defined.
|
|
if [ -z "${BOOT}" ]; then
|
|
BOOT=local
|
|
fi
|
|
|
|
if [ -n "${noresume}" ] || [ "$RESUME" = none ]; then
|
|
noresume=y
|
|
else
|
|
resume=${RESUME:-}
|
|
fi
|
|
|
|
mount -t tmpfs -o "nodev,noexec,nosuid,size=${RUNSIZE:-10%},mode=0755" tmpfs /run
|
|
mkdir -m 0700 /run/initramfs
|
|
|
|
if [ -n "$log_output" ]; then
|
|
exec >"$log_output" 2>&1
|
|
unset log_output
|
|
fi
|
|
|
|
maybe_break top
|
|
|
|
# Don't do log messages here to avoid confusing graphical boots
|
|
run_scripts /scripts/init-top
|
|
|
|
maybe_break modules
|
|
[ "$quiet" != "y" ] && log_begin_msg "Loading essential drivers"
|
|
[ -n "${netconsole}" ] && /sbin/modprobe netconsole netconsole="${netconsole}"
|
|
load_modules
|
|
[ "$quiet" != "y" ] && log_end_msg
|
|
|
|
starttime="$(_uptime)"
|
|
starttime=$((starttime + 1)) # round up
|
|
export starttime
|
|
|
|
if [ "$ROOTDELAY" ]; then
|
|
sleep "$ROOTDELAY"
|
|
fi
|
|
|
|
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"
|
|
# Always load local and nfs (since these might be needed for /etc or
|
|
# /usr, irrespective of the boot script used to mount the rootfs).
|
|
. /scripts/local
|
|
. /scripts/nfs
|
|
. "/scripts/${BOOT}"
|
|
parse_numeric "${ROOT}"
|
|
maybe_break mountroot
|
|
mount_top
|
|
mount_premount
|
|
mountroot
|
|
log_end_msg
|
|
|
|
if read_fstab_entry /usr; then
|
|
log_begin_msg "Mounting /usr file system"
|
|
mountfs /usr
|
|
log_end_msg
|
|
fi
|
|
|
|
# Mount cleanup
|
|
mount_bottom
|
|
nfs_bottom
|
|
local_bottom
|
|
|
|
case "$IP" in
|
|
""|none|off) ;; # Do nothing
|
|
*)
|
|
configure_networking
|
|
esac
|
|
|
|
maybe_break bottom
|
|
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-bottom"
|
|
# We expect udev's init-bottom script to move /dev to ${rootmnt}/dev
|
|
run_scripts /scripts/init-bottom
|
|
[ "$quiet" != "y" ] && log_end_msg
|
|
|
|
# Move /run to the root
|
|
mount -n -o move /run ${rootmnt}/run
|
|
|
|
validate_init() {
|
|
run-init -n "${rootmnt}" "${1}"
|
|
}
|
|
|
|
# Check init is really there
|
|
if ! validate_init "$init"; then
|
|
echo "Target filesystem doesn't have requested ${init}."
|
|
init=
|
|
for inittest in /sbin/init /etc/init /bin/init /bin/sh; do
|
|
if validate_init "${inittest}"; then
|
|
init="$inittest"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# No init on rootmount
|
|
if ! validate_init "${init}" ; then
|
|
panic "No init found. Try passing init= bootarg."
|
|
fi
|
|
|
|
maybe_break init
|
|
|
|
# don't leak too much of env - some init(8) don't clear it
|
|
# (keep init, rootmnt, drop_caps)
|
|
unset debug
|
|
unset MODPROBE_OPTIONS
|
|
unset DPKG_ARCH
|
|
unset ROOTFLAGS
|
|
unset ROOTFSTYPE
|
|
unset ROOTDELAY
|
|
unset ROOT
|
|
unset IP
|
|
unset BOOT
|
|
unset BOOTIF
|
|
unset DEVICE
|
|
unset UBIMTD
|
|
unset blacklist
|
|
unset break
|
|
unset noresume
|
|
unset panic
|
|
unset quiet
|
|
unset readonly
|
|
unset resume
|
|
unset resume_offset
|
|
unset noresume
|
|
unset fastboot
|
|
unset forcefsck
|
|
unset fsckfix
|
|
unset starttime
|
|
|
|
# Move virtual filesystems over to the real filesystem
|
|
mount -n -o move /sys ${rootmnt}/sys
|
|
mount -n -o move /proc ${rootmnt}/proc
|
|
|
|
# Chain to real filesystem
|
|
# shellcheck disable=SC2086,SC2094
|
|
exec run-init ${drop_caps} "${rootmnt}" "${init}" "$@" <"${rootmnt}/dev/console" >"${rootmnt}/dev/console" 2>&1
|
|
echo "Something went badly wrong in the initramfs."
|
|
panic "Please file a bug on initramfs-tools."
|