I need to reliably boot a server from a USB device. Since USB
device ordering can be unpredictable, I wrote a simple
early-userspace "init" program to find the root FS on the correct USB
device & partition. I have "labeled" the root ext2 FS on the USB
drive, and the program searches for the label by examining the bytes
at a specific offset from the beginning of the partition. The program
is written in Pascal, and compiled using Free Pascal (fpc). I wrote
it after studying how kinit and run-init work. If you are interested
in looking at the code, it can be downloaded here:
http://systemdesignworks.com/mount_label.lpr
Although the program seems to work, it causes a lock-up later in
the boot process. I have been testing on Gentoo Linux. My program
launches the Gentoo init which runs fine for a while and then
eventually locks up for some unknown reason. I have tested "kinit" on
Gentoo, and it works fine.
Because of the crash issue, I want to rewrite the program by
modifying kinit and using C. This is where I need help. Here is the
main function that needs to be translated into C:
function FindRootDeviceByLabel(const RootFSLabel: string): boolean;
const
DEV_MAJOR: dev_t = 8;
DEV_MODE: mode_t = S_IFBLK or &0660;
var
ActualFSLabel: string;
FileDescriptor: cint;
ReadBytes: TsSize;
DeviceFound: boolean;
dev_minor: dev_t;
begin
Result := False;
SetLength(ActualFSLabel, Length(RootFSLabel));
//loop through all devices that might have our root filesystem sda2 to sdp2
dev_minor := 2;
while dev_minor < 243 do begin // last one is 242
if mknod(DEVICENAME, DEV_MODE, (DEV_MAJOR shl 8) or dev_minor) = 0 then
begin
WriteLn('Created device node "', DEVICENAME, '".
dev_minor = ',
dev_minor);
end
else begin
WriteError('mknod with dev_minor: ' + IntToStr(dev_minor));
EXIT; //exit w/ error
end;
dev_minor := dev_minor + 16;
FileDescriptor := FpOpen(DEVICENAME, 0, 0);
if FileDescriptor >= 0 then begin
WriteLn('Opened device: ', DEVICENAME);
ReadBytes := FpPRead(FileDescriptor,
PChar(ActualFSLabel), Length(ActualFSLabel), $478);
if (ReadBytes = Length(ActualFSLabel)) then begin
if (ActualFSLabel = RootFSLabel) then begin
Result := True;
DeviceFound := True;
end;
end
else WriteError('Reading from device: ' + DEVICENAME);
WriteLn('Closing device: ', DEVICENAME);
if FpClose(FileDescriptor) <> 0 then
WriteError('Closing device: ' + DEVICENAME);
if DeviceFound then BREAK;
end
else WriteError('Opening device: ' + DEVICENAME);
//Delete the device so we can try again
WriteLn('Deleting device we created: ', DEVICENAME);
if Fpunlink(DEVICENAME) <> 0 then
WriteError('Deleting device: ' + DEVICENAME);
end; // while dev_minor < 243
end;
I pay someone to help me get this working. Anyone interested?
Thanks,
Wayne Sherman
System Design Works