[vox-tech] Problem on running initrd

Stephen Liu satimis at yahoo.com
Thu Dec 1 00:17:48 PST 2005


Hi folks,

Just join the list.

I encountered problem on running initrd burned on CD.  It consists of
following directories;
bin  dev  etc  lib  linuxrc  lost+found  mnt  proc  sbin  sys

linuxrc script;
/bin/sh
                                                                       
        
# ID is a file in root of the LFS boot CD, used to identify the CD.

ID="livecd"

TMP_MOUNT="/mnt"
                                                                       
        
PATH="/bin:/sbin:/usr/bin:/usr/sbin"
                                                                       
        
CHECK_TYPE="try_mount"
                                                                       
        
# MOUNT KERNEL FILESYSTEMS

# Create the proc directory if it does not exist

if [ ! -d "/proc/" ]; then
  mkdir /proc
fi

# Mount the proc filesystem

mount -n proc /proc -t proc

# If sysfs is listed as a valid filesystem type in /proc
# then mount it (if it doesnt then udev wont work
# and you wont have the devices you need)
                                                                       
      
if grep -q '[[:space:]]sysfs' /proc/filesystems; then
    if [ ! -d /sys/block ]; then
    mount -n sysfs /sys -t sysfs
    fi
fi
                                                                       
        
# Create some things that sysfs does not, and should not export for us.
 Feel
# free to add devices to this list.

make_extra_nodes() {
        ln -s /proc/self/fd /dev/fd
        ln -s /proc/self/fd/0 /dev/stdin
        ln -s /proc/self/fd/1 /dev/stdout
        ln -s /proc/self/fd/2 /dev/stderr
        ln -s /proc/kcore /dev/core
        mkdir /dev/pts
        mkdir /dev/shm
}
                                                                       
        
                                                                       
        
if [ ! -x /sbin/hotplug ]; then
    echo /sbin/udev > /proc/sys/kernel/hotplug
fi
                                                                       
        
# Mount a temporary file system over /dev, so that any devices
# made or removed during this boot don't affect the next one.
# The reason we don't write to mtab is because we don't ever
# want /dev to be unavailable (such as by `umount -a').
                                                                       
        
mount -n ramfs /dev -t ramfs
                                                                       
        
/sbin/udevstart
                                                                       
        
make_extra_nodes                                                       
        

# Detecting the live CD is pretty complicated, 
# but is a very logical process
                                                                       
        
# Search for cdrom devices and add them to CDROM_LIST
                                                                       
        
CDROM_LIST=""
                                                                       
        
# Search in proc tree for ide cdrom devices
# There used to be a section for devfs, but this was
# edited for udev. Actually we should probably not
# use /proc anymore, but use sysfs instead...
# Perhaps in the future;)
    
# Check for ide channels.
 
for ide_channel in /proc/ide/ide[0-9]
do

# If there are no ide channels found, then skip this

  if [ ! -d "$ide_channel" ]; then
    break
  fi

# Try each ide device to see if we can find the cd-rom drive

  for ide_device in hda hdb hdc hdd hde hdf hdg hdh hdi hdj hdk hdl hdm
hdn
  do
    device_media_file="$ide_channel/$ide_device/media"
    if [ -e "$device_media_file" ]; then
      grep -i "cdrom" $device_media_file > /dev/null 2>&1
      if [ $? -eq 0 ]; then
        CDROM_LIST="$CDROM_LIST /dev/$ide_device"
      fi
    fi
  done
done

# Check for scsi cds

for scsi_cdrom in /dev/scd[0-99]
do
  if [ -e "$scsi_cdrom" ]; then
    CDROM_LIST="$CDROM_LIST $scsi_cdrom"
  fi
done
                                                                       
        
# Now we try to find the LFS boot CD (we use ID as identification)
                                                                       
        
LFS_CDROM_DEVICE=""

for cdrom_device in $CDROM_LIST
do
  if [ "$CHECK_TYPE" = "try_mount" ]; then
    mount -n -t iso9660 ${cdrom_device} $TMP_MOUNT
    # > /dev/null 2>&1
    media_found=$?
  fi

  if [ $media_found -eq 0 ]; then
    echo -n "media found"
    if [ "$CHECK_TYPE" = "try_mount" ]; then
      [ -e "$TMP_MOUNT/$ID" ]
      media_lfs=$?
    fi
    
    if [ "$CHECK_TYPE" = "try_mount" ]; then
      umount -n $cdrom_device > /dev/null 2>&1
    fi
                                                                       
        
    if [ $media_lfs -eq 0 ]; then
      echo ", LFS boot CD found. Ready!"
      LFS_CDROM_DEVICE="$cdrom_device"
      break;
    else
      echo ", not LFS boot CD."
    fi
                                                                       
        
  else
    echo "no media "
  fi
done
                                                                       
        
# Mount LFS CD as / (root fs)
if [ "$LFS_CDROM_DEVICE" = "" ]; then
  echo "No LFS boot CD found!!!"
  exit 1
else
  echo "Booting from $LFS_CDROM_DEVICE..."
                                                    
# This is the magical part that makes a live CD live!
# The cd is mounted and pivot_root+chroot commands
# are used to start the system.
# If you really want to know what is going on here,
# You should read the chroot and pivot_root man pages

  mount -n -o ro -t iso9660 $LFS_CDROM_DEVICE $TMP_MOUNT
  cd $TMP_MOUNT
  pivot_root . mnt
  umount -n /mnt/proc >/dev/null 2>&1
  exec chroot . sh -c 'umount -n /mnt >/dev/null 2>&1; 
                exec -a init.new /sbin/init 3' <dev/console
>dev/console 2>&1

fi                            
 
******* EOF *******

Whenever after executing "pivot_root . mnt",  "chroot" can't be found. 
The script exits with following warning;
/linuxrc : line 164 : exec chroot : not found ......

The chroot command is on /bin together with pivot_root;

# ls -l /mount_point/bin/;
total 887
lrwxrwxrwx  1 root root      4 Nov 30 00:33 [ -> test
-rwxr-xr-x  1 root root 573171 Aug  5 18:57 bash
-rwxr-xr-x  1 root root  17497 Aug  5 18:57 chroot
-rwxr-xr-x  1 root root  18537 Aug  5 18:57 echo
-rwxr-xr-x  1 root root  83722 Aug  5 18:57 grep
-rwxr-xr-x  1 root root  29317 Aug  5 18:57 ln
-rwxr-xr-x  1 root root  26419 Aug  5 18:57 mkdir
-rwsr-xr-x  1 root root  64768 Aug  5 18:57 mount
-rwxr-xr-x  1 root root   3092 Aug  5 18:57 pivot_root
lrwxrwxrwx  1 root root      4 Nov 30 00:33 sh -> bash
-rwxr-xr-x  1 root root  27389 Aug  5 18:57 test
-rwsr-xr-x  1 root root  33812 Aug  5 18:57 umount[/code]

If comment out the line "pivot_root . mnt" then the script continues to
run.  Please advise how to solve this problem.  TIA


Furthermore how to test the initrd environment under operation on an
existing/running system without rebooting, with following command;

# chroot /mnt /linuxrc

together with pivot_root in such a chroot'ed initrd environment ? and
how?

B.R.
SL


More information about the vox-tech mailing list