Alex Tang wrote:
Hi folks.
I've got a working kickstart installation, however in the %post
section, i would like to detect, mount, and write to a USB memory key.
However, I can't seem to detect the memory key properly. Does the
standard anaconda kernel support USB? Is there something else I need
to do?
Thanks
...alex...
In the USA we have Labor Day and many stores have Labor Day sales. I
went and purchased an USB Thumb Drive and 9-in-1 Flash Media
Reader/Writer. This was an interesting question so I had to answer it
for myself. Hopefully, it will answer your questions too. More
importantly, it also gave me a reason to finally buy these
contraptions. ;-)
If you can find a device that is USB 2.0 and compatible with USB 1.1
and also complying with USB Storage Class specification version 1.0,
then the device should work with Linux. The Memorex TravelDrive had
this stated on the back of the blister pack. The packaging also said
it would work with Linux 2.4.x and above. The PPA Internaltion
http://www.ppa-usa.com/product_pages/cardreaders/2285.htm Media Reader
did not mention Linux but it had all the same specs as the Memorex
drive. Both drives correctly worked with a working FC2 machine as
well as with Anaconda during install. Oh! I do not work or represent
nor have I received any money for research from these companies! They
were just the best value for the specifications above.
The difference between these two USB devices as per the salesperson is
that the USB thumbdrive can be booted from by most modern
motherboards. The USB thumbdrive is also supposed to be faster
device. So says he...I don't know.
So far I can answer that the FC2 Anaconda kernel has USB support. At
the Fedora Boot: prompt I hit enter. After I hit enter the kernel
boots. Finally I briefly see the message "loading usb-storage driver"
that is displayed by the Anaconda loader. After this I see the media
test screen--"CD Found...To begin testing the CD media..." I hit
enter and wait for the "Welcome" screen. At that point you can use
the <Alt><Ctrl><F2> keys to access a bash prompt. The bash shell let
me poke around.
I have already seen usb-storage drive message now I was curios what
dmesg said. Here's the output:
<snip>
usbcore: registered new driver hiddev
usbcore: registered new driver hid
drivers/usb/input/hid-core.c: v2.0:USB HID core driver
<snip>
SCSI subsystem initialized
ohci_hcd: 2004 Feb 02 USB 1.1 'Open' Host Controller (OHCI) Driver (PCI)
ohci_hcd: block sizes: ed 64 td 64
ohci_hcd 0000:00:02.2: OHCI Host Controller
ohci_hcd 0000:00:02.2: irq 10, pci mem e0831000
ohci_hcd 0000:00:02.2: new USB bus registered, assigned bus number 1
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 3 ports detected
ohci_hcd 0000:00:02.3: OHCI Host Controller
ohci_hcd 0000:00:02.3: irq 5, pci mem e0833000
ohci_hcd 0000:00:02.3: new USB bus registered, assigned bus number 2
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 3 ports detected
usb 1-1: new full speed USB device using address 2
usb 2-1: new full speed USB device using address 2
Initializing USB Mass Storage driver...
scsi0 : SCSI emulation for USB Mass Storage devices
Vendor: Generic Model: USB Storage-SMC Rev: I03A
Type: Direct-Access ANSI SCSI revision: 02
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
Vendor: Generic Model: USB Storage-CFC Rev: I03A
Type: Direct-Access ANSI SCSI revision: 02
SCSI device sdb: 250368 512-byte hdwr sectors (128 MB)
sdb: assuming Write Enabled
sdb: assuming drive cache: write through
sdb: sdb1
Attached scsi removable disk sdb at scsi0, channel 0, id 0, lun 1
Vendor: Generic Model: USB Storage-MMC Rev: I03A
Type: Direct-Access ANSI SCSI revision: 02
Attached scsi removable disk sdc at scsi0, channel 0, id 0, lun 2
Vendor: Generic Model: USB Storage-MSC Rev: I03A
Type: Direct-Access ANSI SCSI revision: 02
Attached scsi removable disk sdd at scsi0, channel 0, id 0, lun 3
USB Mass Storage device found at 2
scsi1 : SCSI emulation for USB Mass Storage devices
Vendor: Model: Memorex TD 2B Rev: PMAP
Type: Direct-Access ANSI SCSI revision: 02
SCSI device sde: 487424 512-byte hdwr sectors (250 MB)
sde: assuming Write Enabled
sde: assuming drive cache: write through
sde: sde1
Attached scsi removable disk sde at scsi1, channel 0, id 0, lun 0
USB Mass Storage device found at 2
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
<snip>
Note that I attached both the 9-in-1 reader and the thumb drive to the
system. There's your first obstacle to detecting the correct drive.
I don't know how the kernel orders the device names for these storage
devices. I don't recall the order I had these installed earlier in
the day. Hence, I don't know if switching USB port that the devices
were plugged into would make a difference. It appears that the
"Initializing USB Mass Storage driver..." message is the key. Once
that is displayed the kernel starts assigning device names. The
Memorex drive received sde:sde1 while the 9-in-1 reader received four
scsi device names, sda:sda1 through sdd:sdd1. If you have other scsi
devices on the system, then this could complicate your detection code.
As an aside, this ordering of device names would affect your kickstart
stanza. If you only had one usb-storage device on your system, then
you would use
ks=hd:sda1/ks.cfg
to locate the kickstart file. However, in the example above with two
readers on the system and five device names, I would use either
ks=hd:sdb1/ks.cfg
for the CompactFlash card or
ks=hd:sde1/ks.cfg
for the thumbdrive.
If just a thumbdrive is attached to an Anaconda kernel then you will
see this in the dmesg output.
<snip>
Initializing USB Mass Storage driver...
scsi0 : SCSI emulation for USB Mass Storage devices
Vendor: Model: Memorex TD 2B Rev: PMAP
Type: Direct-Access ANSI SCSI revision: 02
SCSI device sda: 487424 512-byte hdwr sectors (250 MB)
sda: assuming Write Enabled
sda: assuming drive cache: write through
sda: sda1
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
USB Mass Storage device found at 2
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
<snip>
The thumbdrive now has a device name of sda:sda1.
If I use fdisk -l /dev/sda then I will see this output.
Disk /dev/sda: 249 MB, 249561088 bytes
16 heads, 32 sectors/track, 952 cylinders
Units = cylinders of 512 * 512 = 262144 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 952 243696 6 FAT16
(Note that when the 9-in-1 reader was attached, the fdisk output
looked like this for a 128MB CompactFlash card.
fdisk -l /dev/sdb
Disk /dev/sdb: 128 MB, 128188416 bytes
8 heads, 32 sectors/track, 978 cylinders
Units = cylinders of 256 * 512 = 131072 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 * 1 978 125168 6 FAT16 )
It appears that FAT16 is used on these devices for compatibility
purposes. A CompactFlash card in the 9-in-1 reader/writer also shows
as FAT16. I bet Microsoft saw a cash cow here and wanted to license
FAT http://www.eweek.com/article2/0,1759,1569534,00.asp. Anyhow, the
Anaconda kernel also recognizes FAT16. So you can mount the drive as
mkdir /tmp/td
mount /dev/sda1 /tmp/td
or
mkdir /tmp/td
mount -t vfat /dev/sda1 /tmp/td
I selected /tmp because Anaconda mounts other devices used in the
install process under /tmp. It appears that /mnt is saved for the
live hard drives that you will be updating or installing the
distribution on.
Depending on where you create your mount point, in my case it is
/tmp/td, then writing to the thumbdrive is as simple as
cp mylogfile.log /tmp/td
In bash you could use
dmesg > /tmp/td/dmesg.txt
In any scripting language you could just open a file on the mount
point. In Python it may be something like this
tdoutput = open(/tmp/td/tdoutput, 'w')
tdoutput.write(...)
tdoutput.close()
Your most pressing problem is selecting the correct scsi device name
should multiple scsi devices be configured on your target install
system. This could include cameras, thumbdrives, media readers,
scanners, and gasp a parallel port zip drive. Let's not forget scsi
hard drives or cd-rom drives. If you know your only scsi device is
the thumbdrive, then /dev/sda1 is all you need.
If you are trying to make the Anaconda Kick Start file work on
multiple machines, then one file may be helpful. This is the
/tmp/scsidisks file. With both the 9-in-1 reader and the Memorex
TravelDrive attached to the FC2 install target machine, the contents
of the file looked like this
sda usb-storage
sdb usb-storage
sdc usb-storage
sdd usb-storage
sde usb-storage
With just the Memorex TravelDrive, the file looked like this
sda usb-storage
If you are not doing something twisted like I did with two usb-storage
devices attached to the PC, then you could just look for the
usb-storage line. I checked that sed, awk, cut, bash, and python are
available to you in the Anaconda runtime environment on FC2. A tab
separates the device name and usb-storage literal string. I do not
know how portable this approach would be from one Red Hat
distro/version to the next. Other people may be able to provide you
with another approach. With that said, "I leave the thrill and joy of
discovering the rest of the solution to you."
Greg Morgan