#!/bin/bash #================ # FILE : linuxrc #---------------- # PROJECT : OpenSuSE KIWI Image System # COPYRIGHT : (c) 2006 SUSE LINUX Products GmbH. All rights reserved # : # AUTHOR : Marcus Schaefer # : # BELONGS TO : Operating System images # : # DESCRIPTION : This file is changed to become the real # : linuxrc script which is used to prepare the # : operating system for the main image # : # : # STATUS : BETA #---------------- #====================================== # Exports (General)... #-------------------------------------- export PATH="/sbin:/bin:/usr/sbin:/usr/bin" export IFS_ORIG=$IFS export DEBUG=0 export ARCH=`arch` #====================================== # Exports (Configuration)... #-------------------------------------- export systemIntegrity=clean export LIVECD_CONFIG="/cdrom/config.isoclient" export LIVECD="/livecd" export LOCAL_BOOT="no" #====================================== # Functions... #-------------------------------------- . /include initialize #====================================== # Beautify Startup #-------------------------------------- echo "Loading KIWI CD Boot-System..." echo "------------------------------" #====================================== # Update library path #-------------------------------------- ldconfig #====================================== # 1) Mounting local file systems #-------------------------------------- mountSystemFilesystems &>/dev/null closeKernelConsole #====================================== # 2) probe for livecd_config in cmdline #-------------------------------------- includeKernelParameters if grep -i -q "livecd_config=[a-zA-Z0-9/]" /proc/cmdline; then export LIVECD_CONFIG=`sed 's/.*livecd_config=\([^ ]*\).*/\1/' /proc/cmdline` fi #====================================== # 3) Prepare module load support #-------------------------------------- touch /etc/modules.conf touch /lib/modules/*/modules.dep #====================================== # 4) run udevd #-------------------------------------- udevStart #====================================== # 5) start boot shell and logging #-------------------------------------- startBlogD startShell errorLogStart openKernelConsole #====================================== # 6) Including required kernel modules #-------------------------------------- probeDevices #====================================== # 7) Mount the CD device #-------------------------------------- CDMount #====================================== # 8) Load configuration #-------------------------------------- importFile < $LIVECD_CONFIG if [ ! -z "$HYBRID_RW" ];then if [ ! -z "$UNIONFS_CONFIG" ];then UNIONFS_CONFIG=$(echo $UNIONFS_CONFIG | sed -e s@/dev/ram1@$HYBRID_RW@) else IMAGE=$(echo $IMAGE | sed -e s@/dev/ram1@$HYBRID_RW@) fi fi #====================================== # 9) Download RW part of the CD image #-------------------------------------- IFS="," ; for i in $IMAGE;do field=0 IFS=";" ; for n in $i;do case $field in 0) imageDevice=$n ; field=1 ;; 1) imageName=$n ; field=2 ;; 2) imageVersion=$n esac done imageReadOnly="$imageName" imageReadOnly=`echo $imageReadOnly | sed -e s@.$ARCH@@` imageReadOnly="$imageReadOnly-read-only.$ARCH-$imageVersion" imageName="/cdrom/$imageName-$imageVersion" gzippName=$imageName.gz imageMD5s="$imageName.md5" if [ ! -z "$UNIONFS_CONFIG" ] || [ ! -z "$COMBINED_IMAGE" ];then continue fi while true;do IFS=" " read sum1 blocks blocksize zblocks zblocksize < $imageMD5s if ! validateSize;then systemException \ "Not enough RAM available for this image" \ "reboot" fi needBytes=`gzip -l $gzippName|tail -n1|sed -e "s@ \+@:@g"|cut -f3 -d:` needMByte=`expr $needBytes / 1024 / 1024` if [ -x /usr/bin/dcounter ];then errorLogStop Echo -n "Loading $imageName [$imageDevice] " gzip -cd $gzippName |\ dcounter -s $needMByte | dd of=$imageDevice &>/dev/null errorLogContinue echo else Echo "Loading $imageName [$imageDevice]..." gzip -cd $gzippName | dd of=$imageDevice fi dd if=$imageDevice bs=1024 |\ head --bytes=$((blocks * blocksize)) |\ md5sum - > /etc/ireal.md5 read sum2 dumy < /etc/ireal.md5 if test $sum1 = $sum2;then Echo "Image checksum test: fine :-)" break fi Echo "Image checksum test failed:" echo Echo -b "1) Data corruption while loading the image:" Echo -b " will give it a new try..." echo Echo -b "2) ramdisk size is too small for the image:" Echo -b " try to set the kernel parameter ramdisk_size=" echo Echo "Retry to load image..." sleep 15 done rm -f /etc/ireal.md5 done CDUmount #====================================== # 10) Get filesystem type #-------------------------------------- if [ -z "$UNIONFS_CONFIG" ];then probeFileSystem $imageDevice if [ "$FSTYPE" = "luks" ];then imageDevice=$(luksOpen $imageDevice) probeFileSystem $imageDevice export haveLuks=yes fi resizeFilesystem $imageDevice fi #====================================== # 11) Check for swap space #-------------------------------------- swapSpace=`searchSwapSpace` if [ ! -z "$swapSpace" ];then #====================================== # 11.1) use an existing swap partition #-------------------------------------- Echo "Found swap space on: $swapSpace" else #====================================== # 11.1) use a swap file on a free part. #-------------------------------------- swapDevice=`searchDiskSpace` if [ ! -z "$swapDevice" ];then FSTYPE_SAVE=$FSTYPE probeFileSystem $swapDevice SWTYPE=$FSTYPE FSTYPE=$FSTYPE_SAVE if [ $SWTYPE = "unknown" ];then Echo "Can't use unknown filesystem for swap file... skipped" else Echo "Setting up swap file on: $swapDevice -> $SWTYPE" mRAM=`cat /proc/meminfo | grep MemTotal | cut -f2 -d:` mRAM=`echo $mRAM | cut -f1 -d" "` SWSIZE=`expr $mRAM / 1024` SWSIZE=`expr $SWSIZE \* 2` if [ $SWSIZE -lt 64 ];then SWSIZE=64 fi SWDIR=/liveswap SWFILE=$SWDIR/kiwiswap mkdir -p $SWDIR if ! mount -t $SWTYPE $swapDevice $SWDIR;then Echo "Failed to mount swap device on: $swapDevice" unset swapDevice fi if [ ! -f $SWFILE ];then dd if=/dev/zero of=$SWFILE bs=1M count=$SWSIZE >/dev/null if [ ! $? = 0 ];then Echo "Failed to create swap file on: $swapDevice" unset swapDevice fi if ! mkswap $SWFILE >/dev/null;then Echo "Failed to initialize swap file" unset swapDevice fi fi Echo "Created swap file: kiwiswap [ $SWSIZE MB ]" umount $SWDIR fi fi fi #====================================== # 12) Mount OS image to /mnt #-------------------------------------- runHook premount if [ -z "$UNIONFS_CONFIG" ] && [ -z "$COMBINED_IMAGE" ];then #====================================== # 12.1) mount RW part and CD to /mnt #-------------------------------------- if ! mount $imageDevice /mnt >/dev/null;then systemException "Failed to mount RW root filesystem" "reboot" fi cdopt=$(CDMountOption $cddev) mkdir -p $LIVECD && eval mount $cdopt $cddev $LIVECD #====================================== # 12.2) Create RO Link list #-------------------------------------- cd /mnt if [ ! -d $LIVECD/read-only-system ];then Echo "Mounting compressed read only tree..." rosys="/read-only" rosrc="$LIVECD/$imageReadOnly" mkdir -p $rosys if ! kiwiMount $rosrc $rosys "-o loop";then systemException "Failed to mount RO root filesystem" "reboot" fi Echo "Creating live media links..." for dir in bin boot lib lib64 opt sbin usr;do ln -s read-only/$dir $dir done else Echo "Creating live media links..." for dir in bin boot lib lib64 opt sbin usr;do if [ -d $LIVECD/read-only-system/$dir ];then ln -s $LIVECD/read-only-system/$dir $dir fi done fi cd / else #====================================== # 12.1) mount CD to /mnt and unify #-------------------------------------- if [ ! -z "$COMBINED_IMAGE" ]; then Echo "Mounting compressed split tree..." imageReadOnly=`echo $imageReadOnly | sed -e "s/-read-only//"` else Echo "Mounting compressed unified tree..." fi cdopt=$(CDMountOption $cddev) mkdir -p $LIVECD && eval mount $cdopt $cddev $LIVECD if ! mountSystem /dev/loop1 $LIVECD/$imageReadOnly;then systemException "Failed to mount root filesystem" "reboot" fi fi validateRootTree runHook postmount #====================================== # 13) Create system dependant files #-------------------------------------- setupDefaultFstab /config updateRootDeviceFstab /config $imageDevice if [ ! -z "$swapSpace" ];then updateSwapDeviceFstab /config $swapSpace elif [ ! -z "$swapDevice" ];then mkdir -p /mnt/liveswap echo "$swapDevice /liveswap $SWTYPE defaults 1 1" >> /config/etc/fstab echo "/liveswap/kiwiswap swap swap prio=42 0 0" >> /config/etc/fstab fi #====================================== # 14) copy system dependant files #-------------------------------------- setupConfigFiles #====================================== # 15) update system dependant files #-------------------------------------- setupInittab /mnt #====================================== # 16) setup real root device #-------------------------------------- echo 256 > /proc/sys/kernel/real-root-dev #====================================== # 17) umount system filesystems #-------------------------------------- umountSystemFilesystems #====================================== # 18) copy initrd files to image #-------------------------------------- importBranding cp /preinit /mnt cp /include /mnt #====================================== # 19) kill boot shell #-------------------------------------- killShell killBlogD #====================================== # 20) Activate new root #-------------------------------------- activateImage #====================================== # 21) Unmount initrd / system init #-------------------------------------- bootImage $@