sabato 18 febbraio 2017

SCO OpenServer 6.0 non fa il boot da disco

In realtà il titolo è un pò fuorviante perchè potrebbe far pensare che sia un problema generale di questo OS, ma vediamo in dettaglio come stanno le cose.
Sul mio vecchio muletto, un portatile Pentium III a 550Mhz con 256 mega di RAM con ormai quasi 18 anni sul groppone ho installato su un disco il mai dimenticato Windows 98, su un altro SCO OpenServer 5.0.7 e visto che mi avanzava ancora un altro disco ho voluto installarci SCO OpenServer 6.
L'installazione si è completata, con i suoi tempi vista l'età dell'hardware, e non ha segnalato nessun problema, solo che al riavvio mi veniva segnalato di inserire un "system disk", in pratica non faceva il boot dal disco fisso.
Come ho detto il PC è vecchio, e quindi ho pensato che forse il lettore di CD con cui ho eseguito l'installazione, da un supporto CDRW, avesse incontrato qualche problema, quindi ho rifatto il CD e rifatto l'installazione. Nulla, al termine riavvio il PC ma non fa il boot.
Allora ho inserito il disco nell'altro portatile, il fratello maggiore, un Pentium III a 1Ghz con 1 giga di RAM, anche lui con un 15 anni di anzianità, ma che a livello di chassis è identico al muletto e quindi usa lo stesso caddy per l'alloggiamento del disco fisso. In soldoni, da questo PC il sistema operativo si è avviato senza problemi. 
Quindi ? Beh i due PC sono molto simili e la differenza principale è nel chipset, quello da cui non avviene il boot è un Intel 440BX, mentre l'altro un VIA Apollo 133, due BIOS diversi .... ma può essere questo il motivo ? 
Potrei essermi fermato qui e usare questo secondo PC per avviare SCO6, ma la curiosità mi ha spinto a voler investigare più in dettaglio il problema e quindi ho copiato il codice di boot, il master boot record, usato da SCO6 per confrontarlo con quello usato da SCO5. Il comando per ottenere l'MBR è semplicemente :
dd if=/dev/hd00 of=/tmp/mbr bs=512 count=1
in questo modo il file mbr contiene il primo settore del disco fisso.
Nei PC dove il boot avviene via BIOS il funzionamento è abbastanza semplice, in pratica il BIOS legge il primo settore del disco fisso e ne esegue le istruzioni. Di solito la prima cosa che fa questo codice è di copiare se stesso, cioè il contenuto del primo settore, in una nuova locazione di memoria e poi controllare la tabella delle partizioni per cercarne una attiva e caricare in memoria il codice di avvio contenuto all'inizio della partizione. Il codice di avvio è diverso per ogni sistema operativo ma quello dell'mbr è più o meno sempre simile.
Un modo semplice per analizzare il codice dell'mbr è quello di disassemblarlo con objdump, ovviamente su linux.
objdump -D -b binary -mi386 -Maddr16,data16,intel mbr
dove mbr è il file che contiene il codice di avvio.
Ora non è che io sia un grande esperto di assembly e il codice di SCO5 e SCO6 è effettivamente diverso ma non molto perchè poi fa la stessa cosa in entrambi i sistemi operativi. 
Però una cosa mi è saltata subito all'occhio, nel codice di SCO6 viene usato un opcode per abilitare l'uso dei registri a 32 bit, di norma il codice dell'mbr è talmente semplice che usa solo registri a 16 bit, anche perchè la CPU quando si avvia per eseguire il BIOS è in modalità "reale", in pratica come un vecchio 8086, prima CPU a 16 bit dell'Intel.
Boh, forse sul muletto questa cosa mette in crisi la CPU, anche se si tratta di un Pentium III, o forse  è il BIOS a non gradire.
A questo punto forse ho capito il problema, ma come lo posso risolvere ? Magari usando come codice di avvio per SCO6 lo stesso usato da SCO5. 
Su SCO5 c'è il comando /bin/dparam che se invocato con l'opzione -w legge il contenuto del file /etc/masterboot e lo copia nel primo settore del disco fisso, riscrive l'mbr insomma.
Allora posso copiare il file /etc/masterboot da SCO5 a SCO6 e fare questa operazione giusto ? sbagliato. Infatti su SCO6 non esiste un file /etc/masterboot e il comando /bin/dparam è un link a /etc/fdisk, e il codice dell'mbr è all'interno di questo eseguibile per cui devo cambiare strategia.
Da SCO5 metto un dichetto nel floppy ed eseguo questi comandi per portarmi poi su SCO6 il necessario.
cd /tmp
cp /bin/dparm .
cp /etc/masterboot .
tar cv6 dparam masterboot
adesso prendo il floppy e sull'altro PC dove SCO6 si avvia eseguo questi comandi.
cd /tmp
tar xv6
cp masterboot /etc
./dparam -w 
in pratica eseguo la versione di SCO5 del comando dparam e non l'originale di SCO6. Spengo il PC e metto il disco nel muletto, lo riaccendo e tadà!!!! SCO6 si avvia direttamente senza nessun problema.
A questo punto qualcuno si domanderà che senso a tutto questo ? Usare SCO oggi ? Su hardware reale poi, quando una VM su un PC moderno è sicuramente più veloce e non da di questi problemi...... beh a questo non ho ancora trovato una risposta sensata.

Nessun commento:

Posta un commento