Newsgroup: it.comp.os.linux.software
Titolo: Riparare bootsector di un floppy

Sono alle prese con slax che ho provato a mettere su una
chiavetta usb formattata come superfloppy.
Sostanzialmente si tratta della stessa struttura di un floppy,
infatti non c'� partizionamento del dispositivo ne tantomeno MBR
e tabella partizioni.
Per la formattazione ho semplicemente usato mkdosfs:
mkdosfs /dev/sda
Il device � montabile e dentro vi ho messo slax:
# mount /dev/sda /mnt/sda
# cd /mnt/sda
# tar xvf /path/to/downloads/slax-version.tar
# ls
 boot slax
# cd boot
# ./bootinst.sh
Ok, slax funzione e va b�.
Poi ho cercato di piegare un po' il salvataggio dei cambiamenti
alle mie esigenze optando per salvarli non direttamente sul
filesystem fat ma creando un file vuoto con dd formattato in xfs.
Per usarlo con slax � necessario modificare il file boot/slax.cfg
e cambiare una riga sostituendo nel paramentro
changes=/slax/
il valore
changes=slaxsave.dat
dove slaxsave.dat � il nome del file creato con dd.
Ok... per vari motivi ho rilanciato lo script di installazione
del bootloader:
# ./bootinst.sh
che lavora includendo i dati presenti nel file che avevo
modificato.
In questo modo al riavvio scegliendo la chiavetta come device di
boot ottengo un non troppo loquace:
BOOT ERROR.
Ora, il bootinst.sh, non fa altro che mettere syslinux sulla
chiavetta penso andando a modificare il bootsector del nostro
superfloppy.
Per lanciato una seconda volta, come ho fatto io, a quanto pare
tende a danneggiare qualcosa...
Infatti ho provto a togliere tutto dalla chiavetta e reinstallare
slax:
# tar xvf /path/to/slax-version.tar
# ls
boot slax
# cd boot
# ./bootinst.sh
# reboot
al riavvio tengo premuto ESC, scelgo la chiavetta, ok...
Ma con sorpresa ottengo ancora lo stesso errore di prima:
BOOT ERROR
Pertanto, visto che la slax era reinstallata in modo pulito, non
posso che dare la colpa al bootsector della chiavetta corrotto.
Probabilmente syslinux non � riuscito a sovrascriverlo
correttamente...
Voi cosa ne dite?
Ho anche provato a riformattare la chiavetta di nuovo con
mkdosfs. Rimettere slax lanciare il solito script e riavviare. E
sta volta invece funziona.
Per questo do la colpa a syslinux.
Per� il riformattare la chiavetta � una situazione un po' estrema
e soprattutto invasiva.
Allora mi chiedevo se non esista qualche tool che mi permatta da
linux di manipolare, controllare e riparare il boot sector di un
floppy, s� perch� alla fine stiamo parlando di un superfloppy, che
almeno come struttura penso siano la stessa cosa.
Ovviamente riparare il bootsector preservando i dati e
filesystem.
Non so se si pu� lavorare con dd...
Tipo, magari potrei fare una copia con dd del bootsector sano,
poi se si sporcasse in seguito a successive operazioni di
syslinux potrei ripristinarlo intonso... ma non so se si perdono
cos� i dati. Inoltre non so quanto � lungo questo boot sector di
preciso. e non so, magari conviene usare qalche programma
apposito.
Per ora ho tentato di risanare la faccenda con dosfsck, ma senza
cavare un ragno dal buco.
In ogni caso i dati sono intonsi, non corrotti... l'unica cosa
che varia � appunto la possibilit� di avviare slax, che come ho
detto � venuta meno.
Spero ci sia ancora in giro qualcuno con esperienza di floppy
disk...  ;-)
Saluti.

 detto � venuta meno.
Ho fatto alcune prove lavorando con dd e su files immagine creati
da zero, l'idea � questa:
- creo un file vuoto di 1 MB con dd
# dd if=/dev/zero of=onemega.img bs=512 count=1K
- lo formatto
# mkdosfs onemega.img
- ne estraggo il boot sector
# dd if=onemega.img of=bootsect.img count=1
- lo monto in loop, scrivo qualcosa e lo smonto
# mount -o loop -t auto onemega.img /mnt/loop
# echo "prova scrittura" > /mnt/loop/prova
# umount /mnt/loop
- cancello il boot sector
# dd if=/dev/zero of=onemega.img count=1 conv=notrunc,noerror
- verifico che il file system diventa inaccessibile, non si
  riesce neanche a montare il file come prima.
# mount -o loop -t auto onemega.img /mnt/loop
mount no such files or directories  (vado a memoria).
Ecco, a questo punto abbiamo ottenuto un file formattato con
boot sector corrotto... e i dati non sono pi� accessibili.
Si pu� ripristinare e avere nuovamente i dati accessibili???
La risposta sembra proprio essere affermativa!  :-)
- posso ricopiare l'immagine del bootsector sano nel primo
  settore del file formattato:
# dd if=bootsect.img of=onemega.img conv=noerror,notrunc
in questo caso mi pare che l'opzione "count=1" sia superflua in
quanto il file bootsect.img � gi� di 512 byte corrispondenti
all'estesione del bootsector del nostro file.
- a questo punto verifico l'accessibilit� dei dati
# mount -o loop -t auto onemega.img /mnt/loop
# cat /mnt/loop/prova
prova scrittura
#
E con questo ecco trovato un metodo a basso livello per il
riprisino del boot sector di un floppy.
Ho provato a fare la stessa cosa usando una sd card da 512 MB.
Formattata, backuppato il bootsector, scritta, azzerato il
bootsector. La schedina risultava inaccessiile. Ho poi
ripristinato il bootsector e i dati che vi avevo scritto sono
tornati accessibili. 
==============================================================
Ora, della chiavetta usb cui vorrei portare allo stato originario
il boot sector, non ho l'immagine del boot sector sano.
Perci� sto cercando un modo per creare da zero un bootsector che
vada bene per tale chiavetta consentendomi di non perdere i dati.
I dati contenuti in essa sono accessibili e backuppati su
altro device... quindi stiamo parlando di prove che posso
condurre con discreta disinvoltura.
Un modo ci sarebbe,ma non � molto comodo.
L'idea sarebbe di creare l'immagine della chiavetta in un file.
dd if=/dev/sda of=pendrive.img conv=noerror,notrunc
Si pu� anche estrarre il bootsector probabilmente corrotto,
potrebbe magari tornare utile a qualcosa.
dd if=/dev/sda of=penbs.img count=1 conv=noerror,notrunc
A questo punto ho un file della stessa grandezza della chiavetta.
Posso svuotarlo e riformattarlo, ma prima ne faccio una copia, in
modo da poter lavorare successivamente su questo invece che sulla
chiavetta:
cp pendrive.img penbackup.img
dd if=/dev/zero of=pendrive.img conv=noerror,notrunc
non sono sicurissimo di questo comando, in particolare non so
bene se le dimensioni di pendrive.img vengano mantenute... si
pu� fare qualche prova.
mkdosfs pendrive.img
Ecco, forse non era necessario l'azzeramento del file, bastava
magari solo quest'ultimo comando per ottenere un clone vuoto
della chiavetta e formattato in fat.
Questo clone adesso dovrebbe avere un bootsector compatibile con
quello della chiavetta... essendo delle stesse dimensioni.
Dovrebbe anche essere un bootsector sano, cos� come se la
chiavetta fosse appena stata formattata.
Posso allora copirlo nell'immagine di backup della chiavetta,
contenente ancora i dati accessibili.
dd if=pendrive.img of=penbackup.img count=1 conv=noerror,notrunc
questo passaggio mi serve solo per essere sicuro di non perdere i
dati quando eseguir� lo stesso comando sulla chiavetta reale.
Pertanto vado a verificare l'accessibilit� dei dati contenuti in
penbackup.img:
mount -o loop -t auto penbackup.img /mnt/loop
ls /mnt/loop
Se i dati si vedono allora procedo al sovrascrittura del
bootsector della chiavetta.
dd if=pendrive.img of=/dev/sda count=1 conv=noerror,notrunc
A questo punto dovrei avere una chiavetta identica con boot
sector sano. Provo quindi a installare completamente slax
lanciando lo script bootinst.sh che richiama syslinux.
Mi aspetto a questo punto che la chiavetta sia correttamente
bootabile come la prima volta.
Prima di fare questo mi faccio per� una copia del bootsector sano
in modo da non dover rifare tutto qualora il problema si
ripetesse.
Ora, questo metodo ha un evidente limite, in quanto se si
trattasse realmente di un floppy si avrebbe a che fare con la
copia di pochi MB di roba.
Avendo invece a che fare con un superfloppy da 16 GB le cose
cambiano. Le immagini diventano un tantino ingombranti e sento
cos� l'esigenza di creare un bootsector sano e compatibile con
quello della chiavetta, ma senza la necessit� di creare un file
vuoto delle stesse dimensioni della chiavetta.
Infatti ho notato che se creo due files di due dimensioni diverse
e li formatto con mkdosfs, ne estraggo i rispettivi bootsector su
due files e eseguo diff, ottengo che i files differiscono.
# dd if=/dev/zero of=primo.img bs=512 count=2K
# dd if=/dev/zero of=secondo.img bs=512 count=3K
# mkdosfs primo.img
# mkdosfs secondo.img
# dd if=primo.img of=
primo.bs
 count=1
# dd if=secondo.img of=
secondo.bs
 count=1
# diff 
primo.bs
 
secondo.bs
binary files differs
Ora la domanda �:
come creare l'immagine di un boot sector di un superfloppy da
16GB formattato con mdosfs senza dover creare un file da 16GB?

 formattato con mdosfs senza dover creare un file da 16GB?
Uhmmm... ma l'opzione -C di mkdosfs non dovrebbe servire proprio a questo?
-- 
Bye, Lem
Ceterum censeo ISLAM esse delendum
____________________________________________________________________________
Non sprecare i cicli idle della tua CPU: 
http://boinc.berkeley.edu/index.php