This commit is contained in:
illiliti 2020-09-10 22:53:39 +03:00
parent 4f94d6e40c
commit ee6fea9a50
26 changed files with 226 additions and 295 deletions

View File

@ -14,23 +14,22 @@ create_symlink()
ln -s "../../${dev_name}" "$sym" ln -s "../../${dev_name}" "$sym"
} }
# int main() [ -b "/dev/${dev_name=${DEVPATH##*/}}" ] || exit 1
{
[ -b "/dev/${dev_name=${DEVPATH##*/}}" ] || exit 1
read -r dm_name < "/sys/block/${dev_name}/dm/name" && { exec > /dev/null 2>&1
read -r dm_name < "/sys/block/${dev_name}/dm/name" && {
mkdir -p /dev/mapper mkdir -p /dev/mapper
ln -sf "../${dev_name}" "/dev/mapper/${dm_name:?}" ln -sf "../${dev_name}" "/dev/mapper/${dm_name:?}"
} }
command -v blkid || exit 0 command -v blkid || exit 0
# prevent race condition # prevent race condition
blkid "/dev/${dev_name}" || sleep 2 blkid "/dev/${dev_name}" || sleep 2
for line in $(blkid "/dev/${dev_name}"); do case "${line%%=*}" in for line in $(blkid "/dev/${dev_name}"); do case "${line%%=*}" in
UUID) create_symlink /dev/disk/by-uuid "${line##*=}" ;; UUID) create_symlink /dev/disk/by-uuid "${line##*=}" ;;
LABEL) create_symlink /dev/disk/by-label "${line##*=}" ;; LABEL) create_symlink /dev/disk/by-label "${line##*=}" ;;
PARTUUID) create_symlink /dev/disk/by-partuuid "${line##*=}" ;; PARTUUID) create_symlink /dev/disk/by-partuuid "${line##*=}" ;;
esac; done esac; done
} > /dev/null 2>&1

View File

@ -5,7 +5,7 @@
.nh .nh
.ad l .ad l
.\" Begin generated content: .\" Begin generated content:
.TH "tinyramfs.cmdline" "7" "2020-09-07" .TH "tinyramfs.cmdline" "7" "2020-09-10"
.P .P
.SH NAME .SH NAME
.P .P
@ -37,7 +37,7 @@ Enable debug mode.\&
.P .P
.RS 4 .RS 4
Specify breakpoint where shell should be invoked.\& Useful for Specify breakpoint where shell should be invoked.\& Useful for
debugging.\& List of supported breakpoints: debugging.\& List of builtin breakpoints:
.P .P
.RS 4 .RS 4
.ie n \{\ .ie n \{\
@ -46,24 +46,6 @@ debugging.\& List of supported breakpoints:
.el \{\ .el \{\
.IP \(bu 4 .IP \(bu 4
.\} .\}
keymap
.RE
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.IP \(bu 4
.\}
devmgr
.RE
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.IP \(bu 4
.\}
root root
.RE .RE
.RS 4 .RS 4
@ -74,27 +56,12 @@ root
.IP \(bu 4 .IP \(bu 4
.\} .\}
boot boot
.RE
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.IP \(bu 4
.\}
luks
.RE
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.IP \(bu 4
.\}
lvm
.RE .RE
.P .P
Hooks can provide their own breakpoints.\& See source code of hooks
for more information.\&
.P
.RE .RE
\fBroot\fR=UUID|LABEL|/dev/*|PARTUUID \fBroot\fR=UUID|LABEL|/dev/*|PARTUUID
.P .P

View File

@ -25,14 +25,13 @@ kernel parameters without needing to regenerate initramfs image.
*break*=breakpoint *break*=breakpoint
Specify breakpoint where shell should be invoked. Useful for Specify breakpoint where shell should be invoked. Useful for
debugging. List of supported breakpoints: debugging. List of builtin breakpoints:
- keymap
- devmgr
- root - root
- boot - boot
- luks
- lvm Hooks can provide their own breakpoints. See source code of hooks
for more information.
*root*=UUID|LABEL|/dev/\*|PARTUUID *root*=UUID|LABEL|/dev/\*|PARTUUID

View File

@ -3,18 +3,17 @@
# #
# false positive # false positive
# shellcheck disable=2154 # shellcheck disable=2154
{
for _binary in udevd udevadm; do for _binary in udevd udevadm; do
copy_binary "$_binary" copy_binary "$_binary"
done done
mkdir -p "${tmpdir}/lib/udev/rules.d" mkdir -p "${tmpdir}/lib/udev/rules.d"
printf "%s\n" \ printf "%s\n" \
'SUBSYSTEMS=="block", ACTION=="add", RUN+="/bin/device-helper"' \ 'SUBSYSTEMS=="block", ACTION=="add", RUN+="/bin/device-helper"' \
> "${tmpdir}/lib/udev/rules.d/device-helper.rules" > "${tmpdir}/lib/udev/rules.d/device-helper.rules"
[ "$monolith" = 1 ] || printf "%s\n" \ [ "$monolith" = 1 ] || printf "%s\n" \
'ENV{MODALIAS}=="?*", ACTION=="add", RUN+="/bin/modprobe %E{MODALIAS}"' \ 'ENV{MODALIAS}=="?*", ACTION=="add", RUN+="/bin/modprobe %E{MODALIAS}"' \
>> "${tmpdir}/lib/udev/rules.d/device-helper.rules" >> "${tmpdir}/lib/udev/rules.d/device-helper.rules"
}

View File

@ -3,11 +3,10 @@
# #
# false positive # false positive
# shellcheck disable=2154,2034 # shellcheck disable=2154,2034
{
[ "$break" = devmgr ] && { print "break before run_eudev()"; sh; }
udevd -dN never [ "$break" = eudev ] && { print "break before eudev.init"; sh; }
udevadm trigger -c add -t subsystems
udevadm trigger -c add -t devices udevd -dN never
udevadm settle udevadm trigger -c add -t subsystems
} udevadm trigger -c add -t devices
udevadm settle

View File

@ -3,6 +3,5 @@
# #
# false positive # false positive
# shellcheck disable=2154 # shellcheck disable=2154
{
udevadm control -e udevadm control -e
}

View File

@ -3,7 +3,6 @@
# #
# false positive # false positive
# shellcheck disable=2154 # shellcheck disable=2154
{
copy_file "$keymap_path" "$keymap_path" 644 0 copy_file "$keymap_path" "$keymap_path" 644 0
copy_binary loadkmap copy_binary loadkmap
}

View File

@ -3,8 +3,7 @@
# #
# false positive # false positive
# shellcheck disable=2154 # shellcheck disable=2154
{
[ "$break" = keymap ] && { print "break before run_keymap()"; sh; }
loadkmap < "$keymap_path" [ "$break" = keymap ] && { print "break before keymap.init"; sh; }
}
loadkmap < "$keymap_path"

View File

@ -3,8 +3,26 @@
# #
# false positive # false positive
# shellcheck disable=2154 # shellcheck disable=2154
{
[ "$hostonly" = 1 ] && [ "$luks_key" ] && {
copy_file "${luks_key#*=}" /root/key 400 0
sed "s|${luks_key#*=}|/root/key|" \
"${tmpdir}/etc/tinyramfs/config" > "${tmpdir}/_"
mv "${tmpdir}/_" "${tmpdir}/etc/tinyramfs/config"
}
[ "$luks_header" ] && {
copy_file "${luks_header#*=}" /root/header 400 0
sed "s|${luks_header#*=}|/root/header|" \
"${tmpdir}/etc/tinyramfs/config" > "${tmpdir}/_"
mv "${tmpdir}/_" "${tmpdir}/etc/tinyramfs/config"
}
[ "$hostonly" = 1 ] &&
for _module in \ for _module in \
aes ecb xts lrw wp512 sha256 \ aes ecb xts lrw wp512 sha256 \
sha512 twofish serpent dm-crypt sha512 twofish serpent dm-crypt
@ -12,27 +30,8 @@
copy_module "$_module" copy_module "$_module"
done done
copy_binary cryptsetup copy_binary cryptsetup
# avoid possible issues with libgcc_s.so.1 # avoid possible issues with libgcc_s.so.1
# see https://bugs.archlinux.org/task/56771 # see https://bugs.archlinux.org/task/56771
[ -e /lib/libgcc_s.so.1 ] && copy_file /lib/libgcc_s.so.1 /lib/libgcc_s.so.1 755 1 [ -e /lib/libgcc_s.so.1 ] && copy_file /lib/libgcc_s.so.1 /lib/libgcc_s.so.1 755 1
if [ "$luks_key" ]; then
copy_file "${luks_key#*=}" /root/key 400 0
sed "s|${luks_key#*=}|/root/key|" \
"${tmpdir}/etc/tinyramfs/config" > "${tmpdir}/_"
mv "${tmpdir}/_" "${tmpdir}/etc/tinyramfs/config"
fi
if [ "$luks_header" ]; then
copy_file "${luks_header#*=}" /root/header 400 0
sed "s|${luks_header#*=}|/root/header|" \
"${tmpdir}/etc/tinyramfs/config" > "${tmpdir}/_"
mv "${tmpdir}/_" "${tmpdir}/etc/tinyramfs/config"
fi
}

View File

@ -6,17 +6,16 @@
# #
# word splitting is safe by design # word splitting is safe by design
# shellcheck disable=2068 # shellcheck disable=2068
{
[ "$break" = luks ] && { print "break before unlock_luks()"; sh; }
export DM_DISABLE_UDEV=1 [ "$break" = luks ] && { print "break before luks.init"; sh; }
mkdir -p /run/cryptsetup
resolve_device "$luks_root" export DM_DISABLE_UDEV=1
mkdir -p /run/cryptsetup
set -- \ resolve_device "$luks_root"
set -- \
"${luks_discard:+--allow-discards}" "${luks_header:+--header $luks_header}" \ "${luks_discard:+--allow-discards}" "${luks_header:+--header $luks_header}" \
"${luks_key:+-d $luks_key}" "$device" "${luks_name:-crypt-${device##*/}}" "${luks_key:+-d $luks_key}" "$device" "${luks_name:-crypt-${device##*/}}"
cryptsetup open $@ || panic "failed to unlock LUKS" cryptsetup open $@ || panic "failed to unlock LUKS"
}

View File

@ -3,8 +3,8 @@
# #
# false positive # false positive
# shellcheck disable=2154 # shellcheck disable=2154
{
[ "$hostonly" = 1 ] && [ "$hostonly" = 1 ] &&
for _module in \ for _module in \
dm-log dm-cache dm-mirror \ dm-log dm-cache dm-mirror \
dm-snapshot dm-multipath dm-thin-pool dm-snapshot dm-multipath dm-thin-pool
@ -12,9 +12,9 @@
copy_module "$_module" copy_module "$_module"
done done
copy_binary lvm copy_binary lvm
lvm_config=" lvm_config="
devices { devices {
write_cache_state = 0 write_cache_state = 0
} }
@ -26,10 +26,9 @@
use_lvmetad = 0 use_lvmetad = 0
}" }"
mkdir -p "${tmpdir}/etc/lvm" mkdir -p "${tmpdir}/etc/lvm"
lvm config \ lvm config \
--config "$lvm_config" \ --config "$lvm_config" \
${lvm_config:+--mergedconfig} \ ${lvm_config:+--mergedconfig} \
> "${tmpdir}/etc/lvm/lvm.conf" > "${tmpdir}/etc/lvm/lvm.conf"
}

View File

@ -6,22 +6,21 @@
# #
# word splitting is safe by design # word splitting is safe by design
# shellcheck disable=2068 # shellcheck disable=2068
{
[ "$break" = lvm ] && { print "break before trigger_lvm()"; sh; }
export DM_DISABLE_UDEV=1 [ "$break" = lvm ] && { print "break before lvm.init"; sh; }
mkdir -p /run/lvm /run/lock/lvm
set -- \ export DM_DISABLE_UDEV=1
mkdir -p /run/lvm /run/lock/lvm
set -- \
--sysinit -qq -aay "${lvm_discard:+--config=devices{issue_discards=1}}" --sysinit -qq -aay "${lvm_discard:+--config=devices{issue_discards=1}}"
if [ "$lvm_group" ] && [ "$lvm_name" ]; then if [ "$lvm_group" ] && [ "$lvm_name" ]; then
lvm lvchange $@ "${lvm_group}/${lvm_name}" lvm lvchange $@ "${lvm_group}/${lvm_name}"
elif [ "$lvm_group" ]; then elif [ "$lvm_group" ]; then
lvm vgchange $@ "$lvm_group" lvm vgchange $@ "$lvm_group"
elif [ "$lvm_tag" ]; then elif [ "$lvm_tag" ]; then
lvm lvchange $@ "@${lvm_tag}" lvm lvchange $@ "@${lvm_tag}"
else else
lvm vgchange $@ lvm vgchange $@
fi || panic "failed to trigger LVM" fi || panic "failed to trigger LVM"
}

View File

@ -3,16 +3,15 @@
# #
# false positive # false positive
# shellcheck disable=2154,2016 # shellcheck disable=2154,2016
{
for _binary in mdev find; do for _binary in mdev find; do
copy_binary "$_binary" copy_binary "$_binary"
done done
printf "%s\n" \ printf "%s\n" \
'SUBSYSTEM=block;.* 0:0 660 @device-helper' \ 'SUBSYSTEM=block;.* 0:0 660 @device-helper' \
> "${tmpdir}/etc/mdev.conf" > "${tmpdir}/etc/mdev.conf"
[ "$monolith" = 1 ] || printf "%s\n" \ [ "$monolith" = 1 ] || printf "%s\n" \
'$MODALIAS=.* 0:0 660 @modprobe "$MODALIAS"' \ '$MODALIAS=.* 0:0 660 @modprobe "$MODALIAS"' \
>> "${tmpdir}/etc/mdev.conf" >> "${tmpdir}/etc/mdev.conf"
}

View File

@ -3,15 +3,14 @@
# #
# false positive # false positive
# shellcheck disable=2154,2034 # shellcheck disable=2154,2034
{
[ "$break" = devmgr ] && { print "break before run_mdev()"; sh; }
mdev -s [ "$break" = mdev ] && { print "break before mdev.init"; sh; }
mdev -df 2> /dev/null & mdev_pid="$!"
find /sys/devices -name uevent | mdev -s
mdev -df 2> /dev/null & mdev_pid="$!"
while read -r uevent; do find /sys/devices -name uevent |
while read -r uevent; do
printf add > "$uevent" printf add > "$uevent"
done 2> /dev/null done 2> /dev/null
}

View File

@ -3,6 +3,5 @@
# #
# false positive # false positive
# shellcheck disable=2154 # shellcheck disable=2154
{
kill "$mdev_pid" kill "$mdev_pid"
}

View File

@ -3,16 +3,15 @@
# #
# false positive # false positive
# shellcheck disable=2154,2016 # shellcheck disable=2154,2016
{
for _binary in mdevd mdevd-coldplug; do for _binary in mdevd mdevd-coldplug; do
copy_binary "$_binary" copy_binary "$_binary"
done done
printf "%s\n" \ printf "%s\n" \
'SUBSYSTEM=block;.* 0:0 660 @device-helper' \ 'SUBSYSTEM=block;.* 0:0 660 @device-helper' \
> "${tmpdir}/etc/mdev.conf" > "${tmpdir}/etc/mdev.conf"
[ "$monolith" = 1 ] || printf "%s\n" \ [ "$monolith" = 1 ] || printf "%s\n" \
'$MODALIAS=.* 0:0 660 @modprobe "$MODALIAS"' \ '$MODALIAS=.* 0:0 660 @modprobe "$MODALIAS"' \
>> "${tmpdir}/etc/mdev.conf" >> "${tmpdir}/etc/mdev.conf"
}

View File

@ -3,9 +3,8 @@
# #
# false positive # false positive
# shellcheck disable=2154,2034 # shellcheck disable=2154,2034
{
[ "$break" = devmgr ] && { print "break before run_mdevd()"; sh; }
mdevd 2> /dev/null & mdevd_pid="$!" [ "$break" = mdevd ] && { print "break before mdevd.init"; sh; }
mdevd-coldplug
} mdevd 2> /dev/null & mdevd_pid="$!"
mdevd-coldplug

View File

@ -3,6 +3,5 @@
# #
# false positive # false positive
# shellcheck disable=2154 # shellcheck disable=2154
{
kill "$mdevd_pid" kill "$mdevd_pid"
}

View File

@ -1,5 +1,4 @@
# vim: set ft=sh: # vim: set ft=sh:
# shellcheck shell=sh # shellcheck shell=sh
{
copy_binary find copy_binary find
}

View File

@ -3,15 +3,14 @@
# #
# false positive # false positive
# shellcheck disable=2154 # shellcheck disable=2154
{
[ "$break" = devmgr ] && { print "break before run_proc()"; sh; }
command -v device-helper > /proc/sys/kernel/hotplug [ "$break" = proc ] && { print "break before proc.init"; sh; }
# get ready for fork bomb. kek command -v device-helper > /proc/sys/kernel/hotplug
find /sys/devices -name uevent |
while read -r uevent; do # get ready for fork bomb. kek
find /sys/devices -name uevent |
while read -r uevent; do
printf add > "$uevent" printf add > "$uevent"
done 2> /dev/null done 2> /dev/null
}

View File

@ -1,5 +1,4 @@
# vim: set ft=sh: # vim: set ft=sh:
# shellcheck shell=sh # shellcheck shell=sh
{
printf '\n' > /proc/sys/kernel/hotplug printf '\n' > /proc/sys/kernel/hotplug
}

View File

@ -3,18 +3,17 @@
# #
# false positive # false positive
# shellcheck disable=2154 # shellcheck disable=2154
{
for _binary in /lib/systemd/systemd-udevd udevadm; do for _binary in /lib/systemd/systemd-udevd udevadm; do
copy_binary "$_binary" copy_binary "$_binary"
done done
mkdir -p "${tmpdir}/lib/udev/rules.d" mkdir -p "${tmpdir}/lib/udev/rules.d"
printf "%s\n" \ printf "%s\n" \
'SUBSYSTEMS=="block", ACTION=="add", RUN+="/bin/device-helper"' \ 'SUBSYSTEMS=="block", ACTION=="add", RUN+="/bin/device-helper"' \
> "${tmpdir}/lib/udev/rules.d/device-helper.rules" > "${tmpdir}/lib/udev/rules.d/device-helper.rules"
[ "$monolith" = 1 ] || printf "%s\n" \ [ "$monolith" = 1 ] || printf "%s\n" \
'ENV{MODALIAS}=="?*", ACTION=="add", RUN+="/bin/modprobe %E{MODALIAS}"' \ 'ENV{MODALIAS}=="?*", ACTION=="add", RUN+="/bin/modprobe %E{MODALIAS}"' \
>> "${tmpdir}/lib/udev/rules.d/device-helper.rules" >> "${tmpdir}/lib/udev/rules.d/device-helper.rules"
}

View File

@ -3,11 +3,10 @@
# #
# false positive # false positive
# shellcheck disable=2154,2034 # shellcheck disable=2154,2034
{
[ "$break" = devmgr ] && { print "break before run_systemd_udevd()"; sh; }
/lib/systemd/systemd-udevd -dN never [ "$break" = systemd-udevd ] && { print "break before systemd-udevd.init"; sh; }
udevadm trigger -c add -t subsystems
udevadm trigger -c add -t devices /lib/systemd/systemd-udevd -dN never
udevadm settle udevadm trigger -c add -t subsystems
} udevadm trigger -c add -t devices
udevadm settle

View File

@ -3,6 +3,5 @@
# #
# false positive # false positive
# shellcheck disable=2154 # shellcheck disable=2154
{
udevadm control -e udevadm control -e
}

29
init
View File

@ -29,8 +29,6 @@ resolve_device()
esac esac
# prevent race condition # prevent race condition
# XXX what the hell happens here?
# why this loop sometimes trigger panic if i remove '|| :'
while [ ! -b "$device" ]; do sleep 1 while [ ! -b "$device" ]; do sleep 1
[ "$((count += 1))" = "${rootdelay:=30}" ] && { [ "$((count += 1))" = "${rootdelay:=30}" ] && {
panic "failed to lookup partition" panic "failed to lookup partition"
@ -41,14 +39,14 @@ resolve_device()
run_hook() run_hook()
{ {
type="$1"; hksdir=/usr/share/tinyramfs/hooks type="$1"
# run hooks if any # run hooks if any
# false positive # false positive
# shellcheck disable=1090 # shellcheck disable=1090
for hook in $hooks; do for hook in $hooks; do
[ -f "${hksdir}/${hook}/${hook}.${type}" ] || continue [ -f "/usr/share/tinyramfs/hooks/${hook}/${hook}.${type}" ] || continue
. "${hksdir}/${hook}/${hook}.${type}" . "/usr/share/tinyramfs/hooks/${hook}/${hook}.${type}"
done done
} }
@ -121,16 +119,13 @@ boot_system()
switch_root $@ || panic "failed to boot system" switch_root $@ || panic "failed to boot system"
} }
# int main() # enable exit on error and disable globbing
{ # trap EXIT signal
# enable exit on error and disable globbing set -ef; trap panic EXIT
# trap EXIT signal
set -ef; trap panic EXIT
prepare_environment prepare_environment
parse_cmdline parse_cmdline
run_hook init run_hook init
mount_root mount_root
run_hook init.late run_hook init.late
boot_system boot_system
}

View File

@ -134,11 +134,7 @@ prepare_initramfs()
copy_binary "$_binary" copy_binary "$_binary"
done done
if command -v blkid > /dev/null; then command -v blkid > /dev/null && copy_binary blkid
copy_binary blkid
else
print "blkid not found. you will unable to use UUID, LABEL, PARTUUID"
fi
copy_file "${srcdir}/init" /init 755 0 copy_file "${srcdir}/init" /init 755 0
copy_file "$config" /etc/tinyramfs/config 644 0 copy_file "$config" /etc/tinyramfs/config 644 0
@ -237,7 +233,7 @@ copy_hook()
{ {
hook="$1" hook="$1"
for _dir in "$hksdir" /etc/tinyramfs/hooks "${srcdir}/hooks"; do for _dir in "$hksdir" /etc/tinyramfs/hooks /usr/share/tinyramfs/hooks; do
[ -f "${_dir}/${hook}/${hook}" ] || ! continue [ -f "${_dir}/${hook}/${hook}" ] || ! continue
done || panic "could not find $hook hook" done || panic "could not find $hook hook"
@ -247,13 +243,13 @@ copy_hook()
# shellcheck disable=1090 # shellcheck disable=1090
. "${_dir}/${hook}/${hook}" . "${_dir}/${hook}/${hook}"
for _file in init init.late; do for _type in init init.late; do
[ -f "${_dir}/${hook}/${hook}.${_file}" ] || continue [ -f "${_dir}/${hook}/${hook}.${_type}" ] || continue
print "copying ${hook}.${_file}" print "copying ${hook}.${_type}"
copy_file "${_dir}/${hook}/${hook}.${_file}" \ copy_file "${_dir}/${hook}/${hook}.${_type}" \
"/usr/share/tinyramfs/hooks/${hook}/${hook}.${_file}" 644 0 "/usr/share/tinyramfs/hooks/${hook}/${hook}.${_type}" 644 0
done done
} }
@ -262,7 +258,6 @@ copy_modules()
# skip this function if kernel # skip this function if kernel
# compiled with builtin modules # compiled with builtin modules
if [ "$monolith" = 1 ]; then if [ "$monolith" = 1 ]; then
print "skipping modules"
return 0 return 0
elif [ "$hostonly" = 1 ]; then elif [ "$hostonly" = 1 ]; then
@ -351,21 +346,18 @@ make_initramfs()
print "done! check out $output" print "done! check out $output"
) )
# int main() [ "$(id -u)" = 0 ] || panic "must be run as root"
{
[ "$(id -u)" = 0 ] || panic "must be run as root"
# enable exit on error and disable globbing # enable exit on error and disable globbing
set -ef set -ef
prepare_environment "$@" prepare_environment "$@"
prepare_initramfs prepare_initramfs
# copy and run hooks if any # copy and run hooks if any
for _hook in $hooks; do for _hook in $hooks; do
copy_hook "$_hook" copy_hook "$_hook"
done done
copy_modules copy_modules
make_initramfs make_initramfs
}