312 lines
		
	
	
	
		
			8.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			312 lines
		
	
	
	
		
			8.1 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="nutyxcd"
 | 
						|
   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/nutyx-cd
 | 
						|
	mkdir  -p /media/cdrom 2>/dev/null
 | 
						|
	[ "$verbose" == "no" ] || echo "mount -n /dev/nutyx-cd /media/cdrom"
 | 
						|
	mount -n /dev/nutyx-cd /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/setup-nutyx || 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/setup-nutyx ]; then
 | 
						|
		find_media
 | 
						|
		if [ ! -L /dev/nutyx-cd ]; 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/setup-nutyx ]; 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/setup-nutyx
 | 
						|
		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
 |