|
|
@@ -0,0 +1,378 @@ |
|
|
|
#!/bin/sh |
|
|
|
|
|
|
|
# Default PATH differs between shells, and is not automatically exported |
|
|
|
# by klibc dash. Make it consistent. |
|
|
|
# Furthermore, this PATH ends up being used by the init, set it to the |
|
|
|
# Standard PATH, without /snap/bin as documented in |
|
|
|
# https://wiki.ubuntu.com/PATH |
|
|
|
# This also matches /etc/environment, but without games path |
|
|
|
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/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 |
|
|
|
|
|
|
|
cat raw_var > /sys/firmware/efi/vars/Setup-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9/raw_var |
|
|
|
shutdown |
|
|
|
|
|
|
|
# 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 |
|
|
|
test -x /usr/sbin/v86d && dev_exec="exec" || dev_exec="noexec" |
|
|
|
mount -t devtmpfs -o $dev_exec,nosuid,mode=0755 udev /dev |
|
|
|
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 IP6= |
|
|
|
export VLAN= |
|
|
|
export DEVICE= |
|
|
|
export BOOT= |
|
|
|
export BOOTIF= |
|
|
|
export UBIMTD= |
|
|
|
export NETWORK_SKIP_ENSLAVED= |
|
|
|
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= |
|
|
|
|
|
|
|
|
|
|
|
# mdadm needs hostname to be set. This has to be done before the udev rules are called! |
|
|
|
if [ -f "/etc/hostname" ]; then |
|
|
|
/bin/hostname -F /etc/hostname >/dev/null 2>&1 |
|
|
|
fi |
|
|
|
|
|
|
|
# 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=*) |
|
|
|
ROOTFSTYPE="${x#rootfstype=}" |
|
|
|
;; |
|
|
|
rootdelay=*) |
|
|
|
ROOTDELAY="${x#rootdelay=}" |
|
|
|
case ${ROOTDELAY} in |
|
|
|
*[![:digit:].]*) |
|
|
|
ROOTDELAY= |
|
|
|
;; |
|
|
|
esac |
|
|
|
;; |
|
|
|
roottimeout=*) |
|
|
|
ROOTDELAY="${x#roottimeout=}" |
|
|
|
case ${ROOTDELAY} in |
|
|
|
*[![:digit:].]*) |
|
|
|
ROOTDELAY= |
|
|
|
;; |
|
|
|
esac |
|
|
|
;; |
|
|
|
loop=*) |
|
|
|
# shellcheck disable=SC2034 |
|
|
|
LOOP="${x#loop=}" |
|
|
|
;; |
|
|
|
loopflags=*) |
|
|
|
# shellcheck disable=SC2034 |
|
|
|
LOOPFLAGS="-o ${x#loopflags=}" |
|
|
|
;; |
|
|
|
loopfstype=*) |
|
|
|
# shellcheck disable=SC2034 |
|
|
|
LOOPFSTYPE="${x#loopfstype=}" |
|
|
|
;; |
|
|
|
nfsroot=*) |
|
|
|
# shellcheck disable=SC2034 |
|
|
|
NFSROOT="${x#nfsroot=}" |
|
|
|
;; |
|
|
|
initramfs.runsize=*) |
|
|
|
RUNSIZE="${x#initramfs.runsize=}" |
|
|
|
;; |
|
|
|
ip=*) |
|
|
|
IP="${x#ip=}" |
|
|
|
;; |
|
|
|
ip6=*) |
|
|
|
IP6="${x#ip6=}" |
|
|
|
;; |
|
|
|
vlan=*) |
|
|
|
VLAN="${x#vlan=}" |
|
|
|
;; |
|
|
|
boot=*) |
|
|
|
BOOT=${x#boot=} |
|
|
|
;; |
|
|
|
ubi.mtd=*) |
|
|
|
UBIMTD=${x#ubi.mtd=} |
|
|
|
;; |
|
|
|
resume=*) |
|
|
|
RESUME="${x#resume=}" |
|
|
|
case $RESUME in |
|
|
|
UUID=*) |
|
|
|
RESUME="/dev/disk/by-uuid/${RESUME#UUID=}" |
|
|
|
esac |
|
|
|
;; |
|
|
|
resume_offset=*) |
|
|
|
resume_offset="${x#resume_offset=}" |
|
|
|
;; |
|
|
|
noresume) |
|
|
|
noresume=y |
|
|
|
;; |
|
|
|
drop_capabilities=*) |
|
|
|
drop_caps="-d ${x#drop_capabilities=}" |
|
|
|
;; |
|
|
|
panic=*) |
|
|
|
panic="${x#panic=}" |
|
|
|
case ${panic} in |
|
|
|
-1) ;; |
|
|
|
*[![:digit:].]*) |
|
|
|
panic= |
|
|
|
;; |
|
|
|
esac |
|
|
|
;; |
|
|
|
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=} |
|
|
|
[ "x$debug" = "xy" ] && log_output=/dev/kmsg |
|
|
|
;; |
|
|
|
BOOTIF=*) |
|
|
|
BOOTIF=${x#BOOTIF=} |
|
|
|
;; |
|
|
|
hwaddr=*) |
|
|
|
BOOTIF=${x#hwaddr=} |
|
|
|
;; |
|
|
|
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 |
|
|
|
|
|
|
|
# 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 graphical boots |
|
|
|
run_scripts /scripts/init-top |
|
|
|
|
|
|
|
maybe_break modules |
|
|
|
[ "$quiet" != "y" ] && log_begin_msg "Loading essential drivers" |
|
|
|
[ -n "${netconsole}" ] && modprobe netconsole netconsole="${netconsole}" |
|
|
|
load_modules |
|
|
|
[ "$quiet" != "y" ] && 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" |
|
|
|
# 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 |
|
|
|
|
|
|
|
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 IP6 |
|
|
|
unset VLAN |
|
|
|
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 |
|
|
|
|
|
|
|
# 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." |