|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2001
Città: Pescara
Messaggi: 3695
|
Problemi con MBR e s.o. proprietario
Ciao a tutti,
apro questo thread per avere una qualche opione sulla soluzione di un problema che sto affrontando. Quello che devo fare è poter copiare una partizione contenente un s.o. proprietario, chiamato "Prologue", su un altro HD, in modo da poter farlo funzionare su un altro PC e/o tenerlo come copia di backup. Ho avviato il PC con un livecd linux e ho dato un'occhiata alla tabella delle partizioni, che posso riassumere in: -) hda1 - partizione win98 - FAT32 - circa 3GB - montata in /mnt/vfat; -) hda2 - partizione prologue - filesystem sconosciuto - circa 700MB. Il filesystem della seconda partizione ha id f5; cercando su google ho trovato che è un filesystem multi-volume il cui nome è TwinServer. Putroppo non esistono driver che permettano a linux di montarlo; di conseguenza per poter copiare la partizione ho usato il caro vecchio dd. La sintassi del comando è stata: dd if=/dev/hda2 of=/mnt/vfat/image.img bs=<numero di byte per cilindro> count=<numero di cilindri della partizione> Fatto questo ho ottenuto un file image.img che ho copiato su un altro PC; ho quindi cercato di ripristinare la partizione su un nuovo HD. Per farlo ho prima creato una partizione hdc1 da circa 700MB e quindi ho dato il comando dd if=image.img of=/dev/hdc1 (il nuovo disco è hdc). Fatto questo pare tutto OK, quindi riavvio. Al riavvio però il s.o. non viene trovato. Dato che sulla macchina originale per avviare Prologue era necessario cambiare la partizione attiva tramite fdisk (da dos), la mia domanda è: ma win98 nell'MBR ci scrive un boot loader e non il kernel vero e proprio, giusto? Altrimenti come sarebbe possibile caricare il kernel contenuto in una partizione piuttosto che quello contenuto in un'altra? E ancora: il metodo di copia che ho utilizzato è corretto? Ho sbagliato qualcosa? Ipotizzando che abbia fatto tutto correttamente, per caricare Prologue dal nuovo disco avevo pensato di mettere grub sull'MBR e quindi di utilizzare la tecnica del chainloader per caricare Prologue stesso, configurando appropriatamente grub (naturalmente creerò una partizione hdc1 necessaria a grub e Prologue finirà sulla partizione hdc2). Che ne dite? Grazie a tutti per l'eventuale aiuto. ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Da quello che descrivi immagino che quel s/o possiene un proprio loader, caricabile in chainloader. Vuol dire che il loader possiede la solita parte residente nei 512 byte dell' "MBR" della partizione (anche il loader di windows funziona così).
512 byte sono maledettamente pochi per caricare il resto del loader: saprai che lilo deve essere "rieseguito" ogni volta che modifichi lilo.conf, e quando installi grub devi indicare la posizione degli stage successivi. Questo perché in quei 512 byte hai appena lo spazio per caricare, tramite una chiamata al BIOS, un settore dell'HD. Non hai assolutamente possibilità di sfogliarti il file system alla ricerca del file. La posizione del "grosso" del bootloader, caricato nei 512 byte, deve essere in una parte fissa, inamovibile, del disco, e la sua posizione "hardcoded" nel mbr in fase di installazione (per questo un cp -a + una copia del mbr non è in grado di far funzionare grub -- occorre dd). Quindi non basta che fai una copia 1 a 1 della partizione: sulla partizione hdc1 i settori avranno una posizione diversa da quella che avevano su hda2. In sostanza, per avere qualche speranza che funzioni, devi far sì che i settori nel disco di destinazione coincidano con la posizione originaria. Questo è relativamente facile se i dischi sono identici; ti faccio i migliori auguri se i dischi sono diversi.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Sep 2001
Città: Pescara
Messaggi: 3695
|
Grazie dell'aiuto.
Come avrai notato, sono un po' ignorante in materia... ![]() Allora, ricapitolando: -) nell'MBR ci va sempre solo e soltato l'indirizzo del settore dell'HD da caricare; un kernel non ci entrerebbe assolutamente; -) per quanto detto sopra, il bootloader non risiede direttamente nell'MBR ma da qualche altra parte. La domanda che nasce allora è: dove risiedono kernel e bootoload? Quando uso lilo, una volta che lo installo i kernel tramite il comando "lilo", posso anche cancellare i kernel dalla partizione di boot, tanto al successivo riavvio verrà comunque caricato. Con grub invece questo non va: se cancello il kernel dall'HD grub non lo troverà né potrà caricarlo. Finora ho sempre pensato che lilo scrivesse l'intero kernel nell'MBR; ma dato che mi indichi che questi è grande solo 512 byte un kernel non ci entrerà mai a poi mai... Altra domanda: quindi anche il DOS e Win9X hanno una sorta di bootloader... in pratica FDISK, attivando una partizione piuttosto che un'altra, va a scrivere nell'MBR l'indirizzo del kernel risiedente su una partizione piuttosto che su un'altra, giusto? Quasi ultima domanda (per ora ![]() Ultima domanda (davvero! ![]() Grazie mille! ![]() Ultima modifica di shodan : 24-03-2005 alle 23:17. |
![]() |
![]() |
![]() |
#4 | ||||||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
Quote:
In realtà esistono più settori di avvio. Uno è l'mbr vero e proprio, i primi 512 byte all'inizio del disco. Sono _questi_ che il bios carica ed esegue al boot. Poi in ogni partizione i 512 byte iniziali sono utilizzabili per un bootloader. Quello che seccede con il loader di windows è questo: Il bios carica ed esegue l'MBR; il loader nel MBR quindi carica il settore di avvio della partizione marcata come "attiva" (partizione "attiva" è un concetto prettamente Microsoft), e lo esegue. In quel settore c'è il codice per caricare il resto del loader. Grub/Lilo invece non hanno bisogno di questo doppio caricamento: i 512 byte di avvio possono stare indifferentemente nel MBR (nel qual caso vengono lanciati dal BIOS) oppure nel settore di avvio di una partizione (nel qual caso vengono lanciati da un altro loader; v. ad es. le tecniche per lanciare linux tramite il loader di win2k/XP). In quei 512 byte c'è il codice necessario per caricare il resto del loader, e/o il kernel. Quando indichi a lilo/grub di caricare windows o altro in "chainload", vuole semplicemente dire che devi caricare i 512 byte di avvio della partizione indicata, ed eseguirli. Quote:
Quote:
Quote:
Da esperimenti che ho compiuto in passato però posso dirti che le informazioni sulla "geometria", che da anni ormai sono valori puramente fittizzi, sono scritti anche nella tabella delle partizioni. Questo perché non esiste un modo univoco di descrivere una geometria, visto che ormai non indica più alcuna "geometria fisica" ma sono solo parametri fittizzi. Puoi anche modificarli tramite fdisk di linux, indicando quindi per lo _stesso_ disco geometrie alternative da usare, con il vincolo di utilizzare non più dello spazio del disco. Questa geometria è quella effettivamente utilizzata dal s/o, e - sperabilmente - anche dal BIOS. Mi segui fino a qui?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||||||
![]() |
![]() |
![]() |
#5 | ||
Senior Member
Iscritto dal: Sep 2001
Città: Pescara
Messaggi: 3695
|
Quote:
Fin qui tutto chiaro! Una sola domanda: ma ogni kernel per poter essere caricato ha bisogno di un bootloader oppure nei famosi 512 byte si potrebbe scrivere direttamente l'indirizzo dei settori in cui si trova il kernel stesso? Quote:
![]() Ultima domanda: indipendentemente dalla geometria, se prendo 2 dischi diversi e faccio su entrambi 2 partizioni da 2 GB (all'inizio del disco), il settore in cui inizia la 2° partizione sarà lo stesso su entrambi i disci? Ti ho fatto un milione di domande... ![]() Grazie mille! ![]() |
||
![]() |
![]() |
![]() |
#6 | |||||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
Quote:
Quote:
Quote:
Non dovrebbe essere affatto richiesto l'accesso al disco tramite i parametri di geometria; di questo si deve occupare il disco stesso. Su questo principio si basa l'LBA e l'LBA48. http://www.storagereview.com/guide20.../modesLBA.html
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|||||
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Sep 2001
Città: Pescara
Messaggi: 3695
|
Quote:
Quindi, dato che anche i BIOS possono utilizzare LBA, anche se avessi dischi con geometria fisica diversa (e così è), se "azzecco" il corretto indirizzo LBA il loader dovrebbe trovare il settore giusto. E' corretto? |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
No; come la mettiamo se il loader fa una richiesta al BIOS in CHS?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Sep 2001
Città: Pescara
Messaggi: 3695
|
Be, se la fa in CHS sicuramente non funziona... ma almeno un tentativo si può fare, dato che potrebbe anche fare la chiamata in LBA (anche se non credo, dato che il software è vecchissimo).
A proposito, ma tramite BIOS non è possibile convertire da CHS a LBA? Ciao. ![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Uh? Non credo.
Per me dovresti fare così: - annotati la geometria del disco di origine e di quello (presumibilmente più grande) di destinazione (fdisk -l) - dd del disco _completo_ - sostituisci il disco destinazione, e controlla che parta Quindi, con un live CD: - usa fdisk per espandere il numero dei cilindri, fino a utilizzare tutto lo spazio disponibile (è tra le opzioni avanzate mi sembra). Ricorda che lo spazio da CHS, in byte, è C*H*S*512. (riavvia con il disco così modificato per controllare che funzioni ancora) - crea e formatta le nuove partizioni nello spazio ricreato - formatta la prima partizione, che puoi recuperare installando un linux con grub. Configuri grub per lanciare in chainload la seconda partizione. In teoria dovrebbe funzionare.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Sep 2001
Città: Pescara
Messaggi: 3695
|
Ok, credo di aver capito.
Proverò (spero! ![]() Grazie mille! ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:48.