Running Linux using an external Jaz drive and floppy

New Message Reply Date view Thread view Subject view Author view Attachment view

From: Andrew Richards (andrew_at_tic.ch)
Date: Mon Feb 03 1997 - 07:40:53 EST


Hi,

Here's some general info for those of you who may be interested. It's the method I
used to get Linux to run on my Thinkpad 701CS without using any HD space - i.e.
a partial boot from floppy to the point that my PCMCIA SCSI card is recognised
(New Media Bus Toaster). It is a somewhat unsatisfactory solution, since at the
times that the Jaz is not mounted, the system is trying to do things to the 'Wrong'
root partition (i.e. a dummy root partition during startup, and once the PCMCIA
drivers get unloaded, well, erm, there is no root partition). Still, it works.
Also note that I read in a message to a Linux mailing list that the PCMCIA drivers
in a future release will be such that they can be compiled into the kernel.

Note that this method allows you to create a very portable Linux boot disk: I've
tried it in another notebook and it worked first time (i.e. the notebook had the Jaz
drive connected with the same Linux medium in)

cheers,

Andrew.

SETTING UP LINUX TO BOOT FROM SCSI DISK ATTACHED VIA PCMCIA
(c) Andrew Richards, January 1997 (andrew_at_tic.ch).

Introduction
  I have a laptop that is very tight on space on the hard disk, so
  I decided to install Linux on my Jaz drive, attached via a PCMCIA
  SCSI card (New Media Bus Toaster). The problem with Linux and
  PCMCIA in this scenario is that PCMCIA support normally only
  gets loaded _after_ the root filesystem has been mounted. PCMCIA
  support cannot be compiled into the kernel.

  By using LILO (or LOADLIN with a similar method) it is possible
  to setup a boot floppy or a program you can fire from DOS,
  which contains the kernel and a skeleton root filesystem with
  enough information and drivers to load the PCMCIA drivers for
  the SCSI card. Once these drivers are loaded it is possible to
  mount the real root filesystem.

  The kernel offers a facility called initrd which makes this chain
  of events possible. Once the real root filesystem is loaded, the
  skeleton root filesystem is moved to a subdirectory where it is
  still mounted. This can then be unmounted if desired.

  Here are some notes on what I did to get this working on _my_
  setup - yours could well be different, so take care to adjust e.g.
  device names to match your system when reading this document. I
  assume technical competence and some willpower - this procedure
  isn't easy! I hope this document helps someone out there...

Distributing this document
  Feel free to distribute this document; on the same terms as the
  GNU license.

Starting point
  You need to run a basic Linux somehow to generate the boot floppy
  or hard-disk setup. Talk nicely to a friend or do as I did:

  The distribution of Linux that I'm using makes it possible to
  run Linux from the CD-ROM - which contains a 'Live filesystem',
  with the exception of about 30Mbyte of files which have to be
  on a read/writeable device, i.e. a directory on the hard disk.

  Note that this setup is unsatisfactory for normal Linux use
  because it is botched together, slow (because of the CD-ROM)
  and inflexible if I want to add bits to it. But to get our boot
  floppy it's great.

  Also note that you need a reasonably recent version of Linux -
  I guess anything from 1996 onwards. Anything with a version 2.x
  kernel is fine.

The Jaz drive
  I used this for three things when setting up the root floppy -
  a place to store my skeleton root filesystem, a place to compile
  a kernel for my floppy, and for the real root filesystem. I did
  this by having three partitions of the Jaz disk - generated by
  using cfdisk. The skeleton root filesystem must fit into a
  partition of 5 Megabytes - any bigger and there's no chance it'll
  compress onto a single floppy disk.

The Kernel
  I decided to build my own kernel to minimise space. This is
  actually not strictly necessary - you could easily use one of
  the precompiled kernels from the distribution. To do this I
  copied /usr/src/linux and subdirectories to a writeable device
  (in fact a small partition on the Jaz drive), then executed
  these commands from the ....src/linux directory,
                make menuconfig
                make dep
                make clean
                make zImage
  This creates (after a long compilation - about an hour for me)
  the file zImage in ....src/linux/arch/i386/boot. Make sure that
  you include RAM disk support and SCSI support (but no specific
  low-level SCSI drivers are required - the PCMCIA module doesn't
  need these).
  You now have a compressed kernel image that will be used later...

The skeleton root filesystem
  I setup a 5Mbyte partition on the Jaz drive, i.e /dev/sda2
  (/dev/sda1 is where the real Linux root filesystem is, /dev/sda3
  is the partition I used to generate the kernel). Before
  creating a filesystem on it, 'Zero' it so that it compresses well:
                dd if=/dev/zero of=/dev/sda2 bs=1k count=5120
  then create a filesystem on it,
                mke2fs -b 1024 -m 0 /dev/sda2 5120
  mount it,
                mount /dev/sda2 /mnt
  and put the necessary files in it (see my directory structure
  below - the options d, p, and R for the cp command are very useful
  for this step). You will need to create a special file /linuxrc
  which is run for the skeleton root filesystem. Mine looks like
  this,
                                        #!/bin/bash
                                        /etc/rd.d/pcmcia start
                                        fsck /dev/sda1
  - alternatively, make /linuxrc a symbolic link to a shell, so
  that you can then type in commands manually,
                cd /mnt
                ln -s bin/bash linuxrc
  Note that if you choose this second option, when you boot your
  system with the new boot floppy, you will have a shell prompt.
  Typically type the comands above (pcmcia start, fsck) before
  typing 'exit' - once the shell terminates (i.e. the program
  linuxrc), the real root filesystem is mounted.

  Now unmount the filesystem,
                umount /mnt
  Compress it to a file,
                dd if=/dev/sda2 bs=1k count=5120 | gzip -9 > /skeleton.gz
  This file will be used later...

The floppy
  Take an old unwanted floppy that's been formatted at least once
  in it's lifetime (i.e. under DOS). Create a filesystem on it,
                mke2fs /dev/fd0 -m 0
  mount it,
                mount /dev/fd0 /mnt
  and remove the lost+found directory for extra space,
                rm -r /mnt/lost+found
  Copy the 'Loader' to the floppy (see LILO documentation),
                cp /boot/boot.b /mnt
  Copy the kernel image that you wish to use to the floppy,
                cp ....zImage /mnt
  Copy the compressed skeleton root filesystem to the floppy,
                cp /skeleton.gz /mnt
  Note that if skeleton.gz doesn't fit on this floppy, that's not
  a problem - see the next section - but before you do that, tell
  LILO to put the finishing touches to the disk:
  Create a file /etc/lilo.conf with contents e.g.,
                                boot = /dev/fd0
                                compact
                                install=/mnt/boot.b
                                map=/mnt/map
                                image=/mnt/zImage
                                   label=linux
                                   root=/dev/sda1
                                   initrd=/mnt/skeleton.gz
  - in this example the real root filesystem is on /dev/sda1. If
  you had to put skeleton.gz on a separate disk, add the indented
  line (under image...),
                append="prompt_ramdisk=1"
  Run LILO to process the lilo.conf file, updating your floppy,
                lilo
  tidy up by unmounting the floppy
                umount /mnt
  - you've now created your boot floppy, but don't reboot just yet....

Creating a separate root floppy if necessary (see previous section)
  Again using an old unwanted formatted floppy,
                dd if=/skeleton.gz of=/dev/fd0

The real root filesystem
  Set this up from the Linux install disks if you haven't already,
  and add the empty directory /initrd to it. The skeleton filesystem
  will get moved to this directory when the real root filesystem
  gets mounted.

Does it work?
  Cross your fingers. Now reboot the system with your boot floppy
  in the drive.

Using LOADLIN instead of a boot floppy
  Using LOADLIN it's possible to fire Linux from DOS using files
  found on the hard disk (formatted for DOS). It needs most of
  the steps above - in particular a kernel and a compressed
  skeleton root filesystem. Then proceed as follows:
    *THIS SECTION STILL TO BE WRITTEN*

Still to be added to this document
  Altering the startup and shutdown files to not dismount the
  root filesystem until the latest possible moment, and not to
  unload PCMCIA support while the root filesystem needs to be
  accessed (my current thoughts are to put a couple of syncs
  in the /etc/pcmcia/scsi file).

Sources
  I used lots of Linux documents to sort this out. Personal
  contributions from Dave Ahn, Chris Bednar and Huber Mantel
  and the documents, Kernel HOWTO, Module HOWTO, Installation
  HOWTO, PCMCIA HOWTO, BOOTDISK HOWTO, LILO documentation and
  man pages, and in particular the initrd.txt and ramdisk.txt
  documents (for me in /usr/src/linux/Documentation).

The skeleton root file system
  Here is a listing of the skeleton root file system:

total 11
drwxr-xr-x bin
drwxr-xr-x dev
drwxr-xr-x etc
drwxr-xr-x lib
-rwxr-xr-x linuxrc
drwxr-xr-x mnt
drwxr-xr-x modules
drwxr-xr-x proc
lrwxrwxrwx rmmod -> bin/insmod
lrwxrwxrwx sbin -> bin
drwxr-xr-x tmp
drwxr-xr-x usr
drwxr-xr-x var
    
bin:
total 753
drwxr-xr-x init.d
lrwxrwxrwx sh -> bash
and ordinary files:
agetty, bash, cardmgr, cat, echo, fgrep, fsck, fsck.ext2, init, insmod,
kill, loadkeys, ls, mingetty, mknod, mount, ps, pwd, rm, scsi_info, sleep,
umount, uname

bin/init.d:
total 7
-rwxr-xr-x boot
-rwxr-xr-x pcmcia
-rwxr-xr-x rc
    
dev:
total 1
lrwxrwxrwx core -> /proc/kcore
lrwxrwxrwx fd -> /proc/self/fd
drwxr-xr-x inet
lrwxrwxrwx ram -> ram0
lrwxrwxrwx ramdisk -> ram0
lrwxrwxrwx stderr -> fd/2
lrwxrwxrwx stdin -> fd/0
lrwxrwxrwx stdout -> fd/1
and the following devices (from standard dev directory)
console, fd0, fd1, full, hda, hda1, hda2, hda3, hda4, hda5, hda6,
hdb, hdb1, hdb2, hdc, hdc1, hdc2, initrd, kmem, mem, nst0, null, port,
ram0, ram1, random, scd0, scd1, sda, sda1, sda2, sda3, sda4, sda5,
sda6, sda7, sda8, sda9, sdb, sdb1, sdb2, sdb3, sdb4, sdb5, sdb6, sdb7, sdc,
sdc1, sdc2, sr0, sr1, st0, tty, tty0, tty1, tty2, tty3, tty4, urandom, zero
    
dev/inet:
total 0
    
etc:
total 26
-rw-r--r-- fstab
-rw-r--r-- ld.so.cache
drwxr-xr-x pcmcia
-rw-r--r-- rc.config
lrwxrwxrwx rc.d -> ../sbin/init.d
    
etc/pcmcia:
total 48
-r-xr-xr-x cdrom
-r--r--r-- cdrom.opts
-rw-r--r-- config
-r--r--r-- config.opts
-r-xr-xr-x fixed
-r--r--r-- fixed.opts
-r-xr-xr-x ftl
-r--r--r-- ftl.opts
-r-xr-xr-x memory
-r--r--r-- memory.opts
-r-xr-xr-x network
-r--r--r-- network.opts
-r-xr-xr-x pcmem
-r--r--r-- pcmem.opts
-r-xr-xr-x rc.pcmcia
-r-xr-xr-x scsi
-r--r--r-- scsi.opts
-r-xr-xr-x serial
-r--r--r-- serial.opts
    
lib:
total 1208
-rwxr-xr-x ld-linux.so.1
lrwxrwxrwx ld-linux.so.1. -> ld-linux.so.1
lrwxrwxrwx libc.so.5 -> libc.so.5.2.18
-rwxr-xr-x libc.so.5.2.18
-rwxr-xr-x libncurses.so.1.9.9g
lrwxrwxrwx libncurses.so.3.0 -> libncurses.so.1.9.9g
drwxr-xr-x modules
    
lib/modules:
total 1
drwxr-xr-x 2.0.25
    
lib/modules/2.0.25:
total 14
drwxr-xr-x block
drwxr-xr-x cdrom
drwxr-xr-x fs
drwxr-xr-x ipv4
drwxr-xr-x misc
-rw-r--r-- modules.dep
drwxr-xr-x net
drwxr-xr-x pcmcia
drwxr-xr-x scsi
    
lib/modules/2.0.25/block:
total 0
    
lib/modules/2.0.25/cdrom:
total 0
    
lib/modules/2.0.25/fs:
total 12
-rw-r--r-- binfmt_elf.o
    
lib/modules/2.0.25/ipv4:
total 0
    
lib/modules/2.0.25/misc:
total 11
-rw-r--r-- vtx.o
    
lib/modules/2.0.25/net:
total 0
    
lib/modules/2.0.25/pcmcia:
total 120
-rw-r--r-- aha152x_cs.o
-rw-r--r-- ds.o
-rw-r--r-- fixed_cs.o
-rw-r--r-- ftl_cs.o
-rw-r--r-- i82365.o
-rw-r--r-- pcmcia_core.o
-rw-r--r-- tcic.o
    
lib/modules/2.0.25/scsi:
total 104
-rw-r--r-- scsi_mod.o
-rw-r--r-- scsi_syms.o
-rw-r--r-- sd_mod.o
-rw-r--r-- sg.o
-rw-r--r-- sr_mod.o
    
mnt:
total 0
    
modules:
total 123
-rw-r--r-- aha152x.o
-rw-r--r-- aha152x_cs.o
-rw-r--r-- cdrom.o
-rw-r--r-- i82365.o
-rw-r--r-- pcmcia_core.o
    
proc:
total 1
-r--r--r-- devices
    
tmp:
total 0
    
usr:
total 2
drwxr-xr-x adm
drwxr-xr-x lib
    
usr/adm:
total 0
    
usr/lib:
total 0
    
var:
total 1
drwxr-xr-x run
    
var/run:
total 0


New Message Reply Date view Thread view Subject view Author view Attachment view

This archive was generated by hypermail 2.1.3 : Thu Jan 23 2003 - 09:53:26 EST