milis/rootfs/lib/services/init.in

313 lines
8.0 KiB
Bash

#!/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
problem()
{
printf "Encountered a problem!\n\nDropping you to a shell.\n\n"
sh
}
no_device()
{
printf "The device %s, which is supposed to contain the\n" $1
printf "root file system, does not exist.\n"
printf "Please fix this problem and exit this shell.\n\n"
}
no_mount()
{
printf "Could not mount device %s\n" $1
printf "Sleeping forever. Please reboot and fix the kernel command line.\n\n"
printf "Maybe the device is formatted with an unsupported file system?\n\n"
printf "Or maybe filesystem type autodetection went wrong, in which case\n"
printf "you should add the rootfstype=... parameter to the kernel command line.\n\n"
printf "Available partitions:\n"
}
do_mount_root()
{
[ -n "$rootflags" ] && rootflags="$rootflags,"
rootflags="$rootflags$ro"
case "$root" in
/dev/* ) device=$root ;;
UUID=* ) eval $root; device="/dev/disk/by-uuid/$UUID" ;;
LABEL=*) eval $root; device="/dev/disk/by-label/$LABEL" ;;
"" ) echo "No root device specified." ; problem ;;
esac
while [ ! -b "$device" ] ; do
no_device $device
problem
done
if [ "$rootfstype" != "auto" ]; then
rootfstype=`print_file_system $device`
fi
if [ "$rootfstype" == "no" ]; then
no_mount $device
cat /proc/partitions
while true ; do sleep 10000 ; done
fi
[ -z "$overlayroot" ] && mountpoint=/.root || mountpoint=/.roRoot
mkdir -p $mountpoint
if ! mount -n -t "$rootfstype" -o "$rootflags" "$device" $mountpoint ; then
no_mount $device
cat /proc/partitions
while true ; do sleep 10000 ; done
else
log_info_msg "Mounting root file system ${root} in read-only mode..."
evaluate_retval
fi
if [ -n "$overlayroot" ]; then
overlaydevice=$overlayroot; # /dev/mapper/<vg>/<lv>
mkdir -p /mnt/OVL
if ! mount -n "$overlaydevice" /mnt/OVL; then
no_mount $overlaydevice
cat /proc/partitions
while true ; do sleep 10000 ; done
else
log_info_msg "Mounting overlay upper file system ${overlayroot}..."
evaluate_retval
fi
mkdir -p /mnt/OVL/{upper,work}
if ! mount -n -t overlay -o lowerdir=$mountpoint,upperdir=/mnt/OVL/upper,workdir=/mnt/OVL/work overlayrootfs /.root; then
no_mount "overlayrootfs"
cat /proc/partitions
while true ; do sleep 10000 ; done
else
log_info_msg "Mounting overlay root filesystem..."
evaluate_retval
fi
fi
}
do_install()
{
echo "Start installation on $root "
umount /.root
ro="rw"
mkdir /etc
ln -s /proc/self/mounts /etc/mtab
do_mount_root
for DIR in home proc sys dev srv mnt
do
echo -n "."
if [ ! -d /.root/$DIR ]; then
mkdir /.root/$DIR
fi
done
echo -n "."
ln -s lib /.root/lib64
if [ ! -d /.root/tmp ]; then
echo -n "."
mkdir /.root/tmp
chmod 1777 /.root/tmp
fi
for DIR in var run usr etc root lib sbin bin opt
do
echo -n "."
if [ -f /.root/boot/$DIR.squashfs ]; then
mkdir /DIR
mount -o loop -t squashfs /.root/boot/$DIR.squashfs /DIR
cp -a /DIR /.root/$DIR
umount /DIR
rm -r /DIR
if [ "$DIR" == "root" ]; then
chmod 750 /.root/root
fi
fi
done
# We need to check if entry exist in /etc/fstab
if [ "`cat /.root/etc/fstab |sed "s/ \+/ /g"|sed "s/\t\+/ /g"|sed "s/ /:/g"|cut -d ":" -f1-2|grep $root|cut -d ":" -f2`" != "/" ]; then
# blkid will tell us the file system
TYPE=`print_file_system $root`
echo -n "."
echo "$root / $TYPE defaults 0 1" >> /.root/etc/fstab
do_stop_udev
fi
umount /.root
ro="ro"
do_mount_root
echo "Successfully Installed on device $root"
}
do_mount_in_ram()
{
# squasfs files are in ${1} on the initrd
# RW folders
modprobe squashfs
modprobe loop
for DIR in var run etc root
do
if [ -f ${1}/$DIR.squashfs ];then
mkdir /DIR
[ "$verbose" == "no" ] || echo "mount -o loop -t squashfs ${1}/$DIR.squashfs /DIR"
mount -o loop -t squashfs ${1}/$DIR.squashfs /DIR || problem
mkdir -p /$DIR > /dev/null 2>&1
cp -a /DIR/* /$DIR/ > /dev/null 2>&1
umount /DIR
rm -r /DIR
if [ "$DIR" == "root" ]; then
chmod 750 /root
fi
fi
done
# RO folders
for DIR in usr lib sbin bin opt
do
if [ -f ${1}/$DIR.squashfs ];then
mkdir /$DIR > /dev/null 2>&1
[ "$verbose" == "no" ] || echo "mount -o loop -t squashfs ${1}/$DIR.squashfs /$DIR"
mount -o loop -t squashfs ${1}/$DIR.squashfs /$DIR || problem
fi
done
}
find_media() {
EXPECT_LABEL="milis_calisan"
for SYS in /sys/block/sd* /sys/block/sr* ; do
[ "$verbose" == "no" ] || echo "Looking in $SYS for media"
if [ ! -d "$SYS" ]; then continue; fi
DEV=/dev/${SYS##*/}
LABEL=`dd if=$DEV bs=1 skip=32808 count=32 2>/dev/null`
if [ ${LABEL} == ${EXPECT_LABEL} ] 2>/dev/null ; then
ln -s $DEV /dev/cdrom
mkdir -p /media/cdrom 2>/dev/null
[ "$verbose" == "no" ] || echo "mount -n /dev/cdrom /media/cdrom"
mount -n /dev/cdrom /media/cdrom
[ -d /media/cdrom/depot ] && echo $DEV > /tmp/depot
break
fi
done
}
MainLoop(){
while [ ! -f /root/boot ];
do
[ "$verbose" == "no" ] || echo "Launch /etc/rc.d/init.d/milis-kur ..."
/etc/rc.d/init.d/milis-kur || problem
done
}
# **********
# Begin here
# **********
init=/sbin/init
overlayroot=
root=
rootdelay=
rootfstype=auto
ro="ro"
rootflags=
device=
verbose="no"
. /lib/lsb/init-functions
do_mount_virtualfs
read -r cmdline < /proc/cmdline
for param in $cmdline ; do
case $param in
init=* ) init=${param#init=} ;;
root=* ) root=${param#root=} ;;
rootdelay=* ) rootdelay=${param#rootdelay=} ;;
overlayroot=*) overlayroot=${param#overlayroot=} ;;
rootfstype=* ) rootfstype=${param#rootfstype=} ;;
rootflags=* ) rootflags=${param#rootflags=} ;;
ro ) ro="ro" ;;
rw ) ro="rw" ;;
quiet ) export verbose="no" ;;
testiso ) export verbose="yes" ;;
esac
done
if [ -n "$rootdelay" ] && [ -f /sbin/mdadm ]; then
/sbin/mdadm --auto-detect
### First we activate lvm if possible
if [ -f /sbin/lvm ]; then
/sbin/lvm vgchange --ignorelockingfailure -ay
if [ $? = 0 ]; then
/sbin/lvm vgscan --ignorelockingfailure --mknodes
fi
fi
fi
if [ -d /lib/modules ]; then
do_start_localnet
do_start_udev
fi
if [ -n "$rootdelay" ] ; then
[ "$verbose" == "no" ] || echo "... wait $rootdelay seconds"
sleep "$rootdelay"
fi
if [ "$root" == "" ]; then
if [ ! -f /etc/rc.d/init.d/milis-kur ]; then
find_media
if [ ! -L /dev/cdrom ]; then
[ "$verbose" == "no" ] || echo "Media not found yet, trying again in 5 sec"
sleep 5
find_media
fi
if [ -d /media/cdrom/isolinux/boot ]; then
do_mount_in_ram /media/cdrom/isolinux/boot
else
do_mount_in_ram /boot
fi
else
do_mount_in_ram /boot
fi
if [ ! -f /etc/rc.d/init.d/milis-kur ]; then
no_mount
sh
else
if [ "$verbose" == "yes" ]; then
echo "/etc/rc.d/init.d/milis-kur exit ..."
ls -lt /etc/rc.d/init.d/milis-kur
fi
fi
# TODO This doesn't works FIXME
[ "$verbose" == "no" ] || echo "Stop udev ..."
do_stop_udev
[ "$verbose" == "no" ] || echo "Start udev ..."
do_start_udev
[ "$verbose" == "no" ] || echo "Wait 5 second ..."
[ "$verbose" == "no" ] || sleep 5
[ "$verbose" == "no" ] && clear
MainLoop
root=`cat /root/boot`
[ "$verbose" == "no" ] || echo "Stop udev ..."
do_stop_udev
killall -w /sbin/udevd
for DIR in usr lib sbin bin opt
do
[ "$verbose" == "no" ] || echo "umount /$DIR ..."
umount /$DIR > /dev/null 2>&1
done
fi
mkdir /.root
do_mount_root
if ! [ -d /.root/bin -a -d /.root/dev -a -d /.root/etc -a -d /.root/lib \
-a -d /.root/sbin -a -d /.root/tmp -a -d /.root/root -a -d /.root/proc \
-a -d /.root/usr -a -d /.root/var -a -d /.root/run -a -d /.root/sys ]; then
do_install
fi
do_stop_udev
cd /.root
exec switch_root /.root "$init" "$@" > /dev/null 2>&1