PDA

View Full Version : dd, non capisco


kingv
24-11-2004, 12:45
stavo cercando una maniera veloce per generare dei file di grossa dimensione e un amico mi ha suggerito un:

dd of=miofile bs=1M seek=1024 count=0

che a occhio mi sembrava una maniera argutissima di fare quello che volevo, ovvero creare un file di un giga disinteressandomi che venisse riempito con qualcosa di utile (come ad esempio copiando da /dev/zero).

Il problema è che il comando sopra ritorna subito, troppo in fretta per essersi andato a cercare tutto quello spazio su disco.

eppure se faccio un ls mi trovo effettivamente un file creato da un giga , ma con un df vedo in realtà che lo spazio libero è esattamente uguale a quello prima della creazione.

c'e' qualcosa che mi sfugge? :wtf:
perchè ls mi mostra un file della dimensione corretta?

cdere
24-11-2004, 13:05
forse per df tutti i blocchi zero equivalgono a spazio libero, fidati che con dd funge...


ma hai messo if=/dev/zero ?




p.s. in caso non ti fidi indirizza l'output di /dev/random così stai tranquillo

SilverXXX
24-11-2004, 13:06
Se non ricordo male (ma non vorrei dire una cazzata :D ) alcuni fs creano il file nella fat, ma allocano lo spazzio fisico solo in caso di bisogno (comunque lo spazio, per l'os, è come se fosse occupato).

Psycotic
24-11-2004, 13:27
purtroppo il mio inglese nn mi aiuta a capire il man del dd..

cmq
quando creo file uso ddd cosi'

dd if=/dev/zero of=/file count=100000

con df vedo effettivamente che li ha usati i 100mega

kingv
24-11-2004, 14:02
fermi, lo so che se uso come source /dev/random o /dev/zero si comporta come ci si aspetta.


il fatto è che ho usato quella sintassi per cercare di ottenere che lo spazio sia allocato su disco da un file il cui contenuto NON viene scritto dal comando dd ma viene lasciato "così com'e'".

ilsensine
24-11-2004, 14:11
Originariamente inviato da kingv
stavo cercando una maniera veloce per generare dei file di grossa dimensione e un amico mi ha suggerito un:

dd of=miofile bs=1M seek=1024 count=0

Arguto, il ragazzo

c'e' qualcosa che mi sfugge? :wtf:
perchè ls mi mostra un file della dimensione corretta?
Perchè la dimensione del file è...quella, ma non è ancora stata fisicamente allocata sul disco!!!
Mai sentito parlare delle "pagine COW" o simili diavolerie? (non sto parlando di mucche :p )

Psycotic
24-11-2004, 14:12
ok ho capito.. benomale e' la stessa domanda che avevo fatto tempo fa su amule
che praticamente mi creava dei file temporanei es. 700mb ma poi effettivamente con df lo vedeva sempre come spazio libero..
Mi sembra che cmq non mi avevano dato una risposta...

Quindi non so che dire... Vabbe' io non e' che sono molto bravo in linux.. :cry:

Psycotic
24-11-2004, 14:17
ma una volta che crei quel file.. se lo stai vedendo significa cheeli inode punta a quei blocchi no?
Forse dovrei andare a ristudiarmi il filesystem perche' mi sfuggono parecchie cose..

ilsensine
24-11-2004, 14:19
Originariamente inviato da Psycotic
ma una volta che crei quel file.. se lo stai vedendo significa cheeli inode punta a quei blocchi no?
Quali blocchi? Non esistono ancora blocchi per quel file ;)
Solo quando proverai a _scriverli_, verranno allocati fisicamente. Finché ti limiterai a _leggerli_, vedrai solo una sfilza di zeri.

The Katta
24-11-2004, 14:28
Questo post mi sembra interessante.
http://groups.google.it/groups?hl=it&lr=&selm=nwGMb.3433%24XG.3138%40newssvr29.news.prodigy.com

Psycotic
24-11-2004, 14:33
ho capito..

The Katta
24-11-2004, 14:38
Bah mentre che cercavo avete scritto 5 altri post con le risposte :cry:

La prossima volta cercherò di esser più celere :(

kingv
24-11-2004, 16:31
Originariamente inviato da ilsensine
Mai sentito parlare delle "pagine COW" o simili diavolerie? (non sto parlando di mucche :p )



no, vado a documentarmi :(

quindi la dimensione che mostra 'ls' non e' un n°blocchi x dimensione blocco.

ilsensine
24-11-2004, 16:39
Originariamente inviato da kingv
no, vado a documentarmi :(

quindi la dimensione che mostra 'ls' non e' un n°blocchi x dimensione blocco.
Il COW completo è ancora in fase di sviluppo (prevede i "cow links", cerca su google). Che io sappia al momento è usato prevalentemente per l'UML.

Mason
24-11-2004, 16:39
pensavo che la cow fosse solo per le aree dati (stack+heap) dei processi.

qui la cow non riescoa vederla, gli faccio scrivere un file, lui mappa il file di destinazione con quello a sorgente fino alla prima modifica del primo, poi esegue la cow?

e cmq un file da 1 gb, se non lo scrive, lo tiene in memoria nei buffer fino ad 1 gb? lo comprime?

ilsensine
24-11-2004, 16:48
Originariamente inviato da Mason
pensavo che la cow fosse solo per le aree dati (stack+heap) dei processi.

qui la cow non riescoa vederla, gli faccio scrivere un file, lui mappa il file di destinazione con quello a sorgente fino alla prima modifica del primo, poi esegue la cow?

e cmq un file da 1 gb, se non lo scrive, lo tiene in memoria nei buffer fino ad 1 gb? lo comprime?
C'è analogia tra la gestione COW delle pagine di memoria e nei file. Ci sono due casi:
- Il caso osservato da kingv: è analogo all'allocazione di memoria tramite mmap anonimo (le pagine di memoria vengono allocate fisicamente solo quando il programma tenta di scriverci, nella gestione del page fault)
- Il COW su copia: nella copia di un file, non viene allocato lo spazio per il file di copia; mano mano che viene modificato, vengono allocati i nuovi blocchi (quelli rimanenti rimangono in comune, finchè uno dei due file non li modifica). E' utilizzato come dicevo per lo UML, per evitare di sprecare troppo spazio nella creazione di diverse immagini di file system quasi identiche. E' analogo alla gestione delle pagine di memoria dopo una fork.

AnonimoVeneziano
24-11-2004, 17:40
Uff, basta parlare di mucche :D

dd if=/dev/zero of=file.out bs=1024 count=<dimensione del file in KB>

Ciao :D

kingv
24-11-2004, 17:55
Originariamente inviato da AnonimoVeneziano
Uff, basta parlare di mucche :D

dd if=/dev/zero of=file.out bs=1024 count=<dimensione del file in KB>

Ciao :D


:nonsifa:

troppo facile, rileggi tutto :zzz:

AnonimoVeneziano
24-11-2004, 20:36
Qualcosa non mi quadra

Leggendo il thread mi sembra che il prob sia che voi create il file , ma poi DF non rilevi lo spazio occupato perchè i blocchi in realtà non vengono scritti (almeno leggendo Psycotic) .

Beh :

DF prima di DD :

/dev/hda2 23284168 18548764 3552620 84% /balthasar

melchior@melchior:~$ dd if=/dev/zero of=/balthasar/file.p bs=1024 count=102400
entrati 102400+0 record
usciti 102400+0 record
104857600 bytes transferred in 12,561449 seconds (8347572 bytes/sec)

(scrive 100MB di zeri)

DF dopo DD :

/dev/hda2 23284168 18656180 3445204 85% /balthasar

Sinceramente non vedo il problema ....

Ciao

AnonimoVeneziano
24-11-2004, 20:41
Con DU :

melchior@melchior:~$ du -b /balthasar/file.p
104857600 /balthasar/file.p
melchior@melchior:~$

Ciao

The Katta
24-11-2004, 20:42
Non usa /dev/zero come if ma il default che è lo standard input

kingv
24-11-2004, 21:27
Originariamente inviato da AnonimoVeneziano

melchior@melchior:~$ dd if=/dev/zero of=/balthasar/file.p bs=1024 count=102400


non mi sembra la stessa sintassi che indicavo io nel primo post ;)

che usando /dev/zero (o /dev/random) come input i risultati fossero quelli attesi l'avevo già detto :O

ilsensine
25-11-2004, 07:47
Originariamente inviato da AnonimoVeneziano
melchior@melchior:~$ dd if=/dev/zero of=/balthasar/file.p bs=1024
Questo comando scrive fisicamente il file, quello di kingv no. Tutta la magia sta in "seek=xxx count=0".

guldo76
25-11-2004, 13:16
Originariamente inviato da Psycotic
purtroppo il mio inglese nn mi aiuta a capire il man del dd..
Guarda che le pagine man sono disponibili anche in italiano. :)