colinux64/conf/initrd-linuxrc
2025-02-13 19:09:34 -07:00

174 lines
4.0 KiB
Bash
Executable File

#!/bin/sh
PATH=/sbin:/bin:/usr/bin:/usr/sbin
LOG=/linuxrc.log
KERNEL_VERSION=$(uname -r)
message_disable_initrd()
{
echo "Try to run coLinux without initrd. Comment out initrd from configuration."
echo "Please install modules manualy."
sleep 1
echo -e "\nPress <ENTER> to continue"
read junk
}
install_modules()
{
# rootfs mounted right?
if [ ! -d /mnt/linux/etc ]; then
return
fi
# modules exist on rootfs?
if [ -d /mnt/linux/lib/modules/$KERNEL_VERSION ]; then
echo "Modules already installed." | tee -a $LOG
return
fi
echo "Installing modules for coLinux $KERNEL_VERSION" | tee -a $LOG
echo "remount rootfs rw" >> $LOG
mount -o remount,rw $ROOTDEV /mnt/linux 2>> $LOG
# search device with path to lib/modules
while read device mountpoint type opts dump
do
case "$device" in
/dev/*)
case "$mountpoint" in
/lib)
echo "mount lib" >> $LOG
device="$(echo $device | sed -r -e 's|(/dev/.+)/([0-9]+)|\1\2|')"
mount $device /mnt/linux$mountpoint -t $type 2>&1 >> $LOG
lib_dev=$device
;;
/lib/modules)
echo "mount modules" >> $LOG
device="$(echo $device | sed -r -e 's|(/dev/.+)/([0-9]+)|\1\2|')"
mount $device /mnt/linux$mountpoint -t $type 2>&1 >> $LOG
modules_dev=$device
;;
esac
;;
esac
done < /mnt/linux/etc/fstab
if [ -d /mnt/linux/lib/modules/$KERNEL_VERSION ]; then
echo "Skipping." | tee -a $LOG
else
MODFILE=vmlinux-modules.tar.gz
if [ ! -f /lib/modules/$MODFILE ]; then
echo "Mounting cofs for vmlinux-modules.tar.gz" | tee -a $LOG
# TODO: get cofs index number from proc fs
if mount -o ro -t cofs 31 /lib/modules
then
if [ -f /lib/modules/modules-$KERNEL_VERSION.tgz ]; then
MODFILE=modules-$KERNEL_VERSION.tgz
fi
else
echo "failed" | tee -a $LOG
fi
fi
if [ -f /lib/modules/$MODFILE ]; then
echo "untar $MODFILE" >> $LOG
if tar zxf /lib/modules/$MODFILE -C /mnt/linux 2>&1 >> $LOG
then
if [ -f /mnt/linux/lib/modules/$KERNEL_VERSION/modules.dep ]; then
chown -R 0:0 /mnt/linux/lib/modules/$KERNEL_VERSION 2>> $LOG
touch /mnt/linux/lib/modules/$KERNEL_VERSION/modules.dep
echo "done" | tee -a $LOG
else
echo "initrd: Missing modules.dep in $MODFILE." | tee -a $LOG
fi
fi
sync; sleep 1
else
echo -e "\ninitrd: $MODFILE not found in cofs31" | tee -a $LOG
message_disable_initrd
fi
umount /lib/modules 2>/dev/null
fi
# Create console for boot with udev
if [ ! -c /mnt/linux/dev/console ]; then
mknod /mnt/linux/dev/console c 5 1
fi
# Need umount lib/modules?
if [ -n "$modules_dev" ]; then
echo "umount modules" >> $LOG
umount $modules_dev 2>&1 >> $LOG
sync; sleep 1
fi
if [ -n "$lib_dev" ]; then
echo "umount lib" >> $LOG
umount $lib_dev 2>&1 >> $LOG
sync; sleep 1
fi
}
# Re-mount in rw mode (in case ro was passed on boot)
echo "(Re)mount / read-write" >> $LOG
mount -o remount,rw / 2>> $LOG
# Mount filesystems in /etc/fstab.
echo "Mount proc: " >> $LOG
mount -t proc /proc /proc 2>&1 | tee -a $LOG
# Read boot command line (use cat, shell read function may fail)
CMDLINE="$(cat /proc/cmdline)"
# Display /etc/issue file.
echo "Displaying /etc/issue file" >> $LOG
if [ -s /etc/issue ]; then
cat /etc/issue
fi
sleep 1
echo -n "Determining /"
echo "Determining /" >> $LOG
ROOTDEV=/dev/root
for barg in ${CMDLINE}; do
ROOTDEV=`IFS='='; set ${barg}; [ $1 = root ] && echo $2`
if [ -n "${ROOTDEV}" ]; then
# Transform /dev/cobd/0 into /dev/cobd0 for udev
ROOTDEV="$(echo $ROOTDEV | sed -r -e 's|(/dev/.+)/([0-9]+)|\1\2|')"
echo ", Found."
break
fi
done
echo " ($ROOTDEV) " >> $LOG
echo "Mounting /" | tee -a $LOG
if mount -o ro $ROOTDEV /mnt/linux
then
install_modules
echo "Closing /" | tee -a $LOG
if ! umount -f /mnt/linux 2>&1 >> $LOG
then
echo "Failed. (trying again)"
sync ; sleep 1
if ! umount -f /mnt/linux
then
echo -e "\ninitrd: umount failed on rootfs"
message_disable_initrd
fi
sync
fi
fi
sync
# Freeing proc that was auto-mounted earlier
umount /proc 2>&1 >> $LOG
sync