123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- #!/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
|