huge rework

This commit is contained in:
illiliti 2020-02-25 13:51:20 +03:00
parent 347d0d2d01
commit 81f7aac01a
2 changed files with 114 additions and 104 deletions

View File

@ -66,7 +66,7 @@ setup_mdev() {
done done
# load drivers # load drivers
find /sys -name modalias -type f -exec sort -u "{}" "+" | find /sys -name modalias -type f -exec sort -u {} + |
xargs modprobe -qba xargs modprobe -qba
} }

216
tinyramfs
View File

@ -96,14 +96,20 @@ install_requirements() {
# install user specified binaries # install user specified binaries
[ "$binaries" ] && [ "$binaries" ] &&
install_binary "$binaries" for custom_binary in $binaries; do
install_binary "$custom_binary"
done
# install util-linux binaries # install util-linux binaries
[ "$util_linux" = 1 ] && [ "$util_linux" = 1 ] &&
install_binary mount blkid for util_linux_binary in mount blkid; do
install_binary "$util_linux_binary"
done
# install mandatory binaries # install mandatory binaries
install_binary busybox modprobe for main_binary in busybox modprobe; do
install_binary "$main_binary"
done
} }
create_structure() { create_structure() {
@ -136,11 +142,13 @@ create_symlinks() {
} }
install_devmgr() { install_devmgr() {
msg info "installing device manager"
case "$devmgr" in case "$devmgr" in
udev) udev)
msg info "installing udev" for udev_binary in udevd udevadm dmsetup; do
install_binary "$udev_binary"
install_binary udevd udevadm dmsetup done
find /usr/lib/udev \ find /usr/lib/udev \
! -path "*rc_keymaps*" \ ! -path "*rc_keymaps*" \
@ -151,20 +159,18 @@ install_devmgr() {
msg panic "failed to install udev" msg panic "failed to install udev"
;; ;;
mdev) mdev)
msg info "installing mdev" install -m644 "${filesdir}/mdev.conf" \
install -m644 "${filesdir}/mdev.conf" \
"${workdir}/etc/mdev.conf" "${workdir}/etc/mdev.conf"
install -Dm755 "${filesdir}/storage-device" \ install -Dm755 "${filesdir}/storage-device" \
"${workdir}/lib/mdev/storage-device" "${workdir}/lib/mdev/storage-device"
;; ;;
mdevd) mdevd)
msg info "installing mdevd" for mdevd_binary in mdevd mdevd-coldplug; do
install_binary "$mdevd_binary"
done
install_binary mdevd mdevd-coldplug install -m644 "${filesdir}/mdev.conf" \
install -m644 "${filesdir}/mdev.conf" \
"${workdir}/etc/mdev.conf" "${workdir}/etc/mdev.conf"
install -Dm755 "${filesdir}/storage-device" \ install -Dm755 "${filesdir}/storage-device" \
@ -181,9 +187,10 @@ install_lvm() {
install_binary lvm install_binary lvm
lvm_drivers="dm-thin-pool dm-multipath dm-snapshot dm-cache dm-log dm-mirror"
[ "$hostonly" = 1 ] && [ "$hostonly" = 1 ] &&
install_driver "$lvm_drivers" for lvm_driver in dm-thin-pool dm-multipath dm-snapshot dm-cache dm-log dm-mirror; do
install_driver "$lvm_driver"
done
# install lvm config # install lvm config
if [ "$lvm_conf" = 1 ]; then if [ "$lvm_conf" = 1 ]; then
@ -211,20 +218,18 @@ install_luks() {
install_binary cryptsetup install_binary cryptsetup
luks_drivers="aes dm-crypt sha256 sha512 wp512 ecb lrw xts twofish serpent"
[ "$hostonly" = 1 ] && [ "$hostonly" = 1 ] &&
install_driver "$luks_drivers" for luks_driver in aes dm-crypt sha256 sha512 wp512 ecb lrw xts twofish serpent; do
install_driver "$luks_driver"
done
# avoid "locking directory missing" warning # avoid "locking directory missing" warning
# message and libgcc_s.so.1 missing error # message and libgcc_s.so.1 missing error
# see https://bugs.archlinux.org/task/56771 # see https://bugs.archlinux.org/task/56771
mkdir -p "${workdir}/run/cryptsetup" mkdir -p "${workdir}/run/cryptsetup"
[ -e /usr/lib/libgcc_s.so.1 ] && { [ -e /usr/lib/libgcc_s.so.1 ] &&
install -s -m755 /usr/lib/libgcc_s.so.1 \ install_library /usr/lib/libgcc_s.so.1
"${workdir}/usr/lib/libgcc_s.so.1" ||
msg panic "failed to install LUKS libraries"
}
# copy luks header # copy luks header
[ -f "$luks_header" ] && { [ -f "$luks_header" ] && {
@ -249,23 +254,22 @@ install_driver() {
# check monolithic kernel(builtin drivers) # check monolithic kernel(builtin drivers)
[ -d "${moddir}/${kernel}" ] || return [ -d "${moddir}/${kernel}" ] || return
# we need splitting driver="$1"
# shellcheck disable=SC2068 driver="${driver##*/}"
for driver in $@; do driver="${driver%%.*}"
# strip path and extension if any # TODO busybox modprobe doesn't support -S option
driver="${driver##*/}" modprobe -S "$kernel" -D "$driver" 2> /dev/null |
driver="${driver%%.*}"
# TODO busybox modprobe doesn't support -S option
modprobe -S "$kernel" -D "$driver" 2> /dev/null |
grep -v "builtin\|net" | grep -v "builtin\|net" |
cut -d " " -f 2 | cut -d " " -f 2 |
while read -r driver_dep; do while read -r full_driver; do
install -Dm644 "$driver_dep" \ # check if driver already installed
"${workdir}${driver_dep}" [ -e "${workdir}${full_driver}" ] &&
done continue
install -Dm644 "$full_driver" \
"${workdir}${full_driver}"
done done
} }
@ -276,7 +280,11 @@ install_hostonly_drivers() {
msg panic "hostonly mode required root_type option to be configured" msg panic "hostonly mode required root_type option to be configured"
# perform autodetection of drivers via /sys # perform autodetection of drivers via /sys
install_driver "$(find /sys -name modalias -exec sort -u "{}" "+")" find /sys -name modalias -exec sort -u {} + |
while read -r alias_driver; do
install_driver "$alias_driver"
done
# TODO autodetect root fs driver # TODO autodetect root fs driver
# TODO separate root type option # TODO separate root type option
@ -285,7 +293,9 @@ install_hostonly_drivers() {
# install user specified drivers # install user specified drivers
[ "$drivers" ] && [ "$drivers" ] &&
install_driver "$drivers" for custom_driver in $drivers; do
install_driver "$custom_driver"
done
} }
install_all_drivers() { install_all_drivers() {
@ -293,20 +303,23 @@ install_all_drivers() {
modker="${moddir}/${kernel}/kernel" modker="${moddir}/${kernel}/kernel"
install_driver \ find \
"$(find \ "${modker}/arch" \
"${modker}/arch" \ "${modker}/crypto" \
"${modker}/crypto" \ "${modker}/fs" \
"${modker}/fs" \ "${modker}/lib" \
"${modker}/lib" \ "${modker}/drivers/block" \
"${modker}/drivers/block" \ "${modker}/drivers/ata" \
"${modker}/drivers/ata" \ "${modker}/drivers/md" \
"${modker}/drivers/md" \ "${modker}/drivers/scsi" \
"${modker}/drivers/scsi" \ "${modker}/drivers/usb/storage" \
"${modker}/drivers/usb/storage" \ "${modker}/drivers/usb/host" \
"${modker}/drivers/usb/host" \ "${modker}/drivers/virtio" \
"${modker}/drivers/virtio" \ -type f 2> /dev/null |
-type f 2> /dev/null)"
while read -r path_driver; do
install_driver "$path_driver"
done
} }
generate_depmod() { generate_depmod() {
@ -315,8 +328,8 @@ generate_depmod() {
modker="${moddir}/${kernel}" modker="${moddir}/${kernel}"
cp "${modker}/modules.builtin" \ cp "${modker}/modules.builtin" \
"${modker}/modules.order" \ "${modker}/modules.order" \
"${workdir}${modker}" "${workdir}${modker}"
depmod -b "$workdir" "$kernel" depmod -b "$workdir" "$kernel"
} }
@ -324,74 +337,71 @@ generate_depmod() {
install_binary() { install_binary() {
# TODO make strip optional # TODO make strip optional
binary="$1"
fullbin=$(command -v "$binary")
workdirbin="${workdir}/usr/bin/" workdirbin="${workdir}/usr/bin/"
# we need splitting # check if binary exists
# shellcheck disable=SC2068 [ "$fullbin" ] ||
for binary in $@; do msg panic "$binary doesn't exists"
msg info "installing binary $binary"
fullbin=$(command -v "$binary") # check if binary already installed
[ -e "${workdirbin}${fullbin##*/}" ] &&
return
# check if binary exists # install and strip binary
[ "$fullbin" ] || install -s -m755 "$fullbin" \
msg panic "$binary doesn't exists" "${workdirbin}${fullbin##*/}"
# install and strip binary # check static
install -s -m755 "$fullbin" \ ldd "$fullbin" > /dev/null 2>&1 ||
"${workdirbin}${fullbin##*/}" return
# check static # exract paths to libraries
ldd "$fullbin" > /dev/null 2>&1 || ldd $(command -v "$binary") |
continue sed -nr \
-e 's,.* (/.*lib.*/.*.so.*) .*,\1,p' \
-e 's,.*(/lib.*/ld.*.so.*) .*,\1,p' |
# install libraries while read -r library; do
install_library "$binary" install_library "$library"
done done
} }
install_library() { install_library() {
# TODO make strip optional # TODO make strip optional
library="$1"
namelib="${library##*/}"
reallib=$(readlink "$library")
fulllib=$(readlink -f "$library")
workdirlib="${workdir}/usr/lib/" workdirlib="${workdir}/usr/lib/"
# extract paths to libraries from ldd output # check symlink
ldd $(command -v "$1") | if [ -h "$library" ]; then
sed -nr \
-e 's,.* (/.*lib.*/.*.so.*) .*,\1,p' \
-e 's,.*(/lib.*/ld.*.so.*) .*,\1,p' |
while read -r library; do # check if library already exists
namelib="${library##*/}" [ -e "${workdirlib}${fulllib##*/}" ] ||
reallib=$(readlink "$library") [ -e "${workdirlib}${namelib}" ] ||
fulllib=$(readlink -f "$library") {
# regular
install -s -m755 "${fulllib}" \
"${workdirlib}${fulllib##*/}"
# check symlink # FIXME handle all symlinks
if [ -h "$library" ]; then # symlink may link to symlink
[ -h "/usr/lib/${reallib}" ] &&
cp -a "/usr/lib/${reallib}" \
"${workdirlib}"
# check if library already exists # symlink
[ -e "${workdirlib}${fulllib##*/}" ] || cp -a "$library" "${workdirlib}"
[ -e "${workdirlib}${namelib}" ] || }
{ else
# regular [ -e "${workdirlib}${namelib}" ] ||
install -s -m755 "${fulllib}" \ install -s -m755 "$library" \
"${workdirlib}${fulllib##*/}" "${workdirlib}${namelib}"
# FIXME handle all symlinks
# symlink may link to symlink
[ -h "/usr/lib/${reallib}" ] &&
cp -a "/usr/lib/${reallib}" \
"${workdirlib}"
# symlink
cp -a "$library" "${workdirlib}"
}
else
[ -e "${workdirlib}${namelib}" ] ||
install -s -m755 "$library" \
"${workdirlib}${namelib}"
fi fi
done
} }
install_files() { install_files() {