Cosa succede se dd zeri sull'unità in cui risiede dd?


10

Questo comando: dd if=/dev/zero of=/dev/sda bs=1Mriuscirà se il comando dd era originariamente su / dev / sda? Sarà completo perché dd è in memoria in quel momento?

Risposte:


40

Ci possono essere tre cose che possono accadere:

  1. Il comando si avvia, viene eseguito fino al completamento e si torna a un prompt. Dal momento che il disco viene effettivamente cancellato, non puoi fare molto dopo, anche se potresti essere fortunato con alcuni comandi incorporati della shell.
  2. Il comando inizia. Ad un certo punto viene sfogliato a causa della pressione della memoria. Normalmente questo non è un problema perché parti di esso possono essere ricaricate dal disco (dati invariati) o dallo swap. Tuttavia, se li hai appena cancellati, il comando dd fallirà parzialmente anche se riempie il disco.
  3. La terza opzione è qualcosa di BSD. L'MBR su un disco montato è protetto dalla sovrascrittura. Anche se si esegue il comando come root. Ci sono dozzine di distribuzioni Linux, tutte leggermente diverse. È del tutto possibile che alcuni di loro lo emulino.


Finora per la teoria. Ora per un test pratico.

Ho installato un nuovo Ubuntu 12.10 su una VM. (Workstation VMware su win7-x64, utilizzando le opzioni predefinite e un disco virtuale da 10 GB).

Il comando dd è stato completato con successo e mi è stato restituito quello che sembrava un prompt funzionante. Potrei inserire nuovi comandi, anche se fallirebbero per ovvi motivi.

Schermata della macchina virtuale Ubuntu dopo aver cancellato il disco


9
Grande +1 per il test pratico!
Doug Harris,

10
Vedo Segmentation faulte affermi che è stato completato correttamente ...?
Alvin Wong,

1
Sì. Ha reso il disco illeggibile. Penso che fosse l'obiettivo. Per cancellazioni sicure dovresti davvero provare qualcos'altro (come il comando cancella sicura).
Hennes,

una delle migliori risposte che abbia mai avuto. Grazie!
agz

6

Un rapido esperimento in una macchina virtuale che utilizza Damn Small Linux indica che il comando dd viene effettivamente completato, come previsto; il programma viene inizialmente caricato in memoria per l'esecuzione e ha poco senso caricare più volte l'eseguibile durante il processo. Alla fine, dd uscirà e segnalerà "nessuno spazio lasciato sul dispositivo".

Successivamente, il sistema operativo sembra funzionare normalmente a prima vista, ma si blocca dopo il primo comando che non può più eseguire per ovvi motivi e non risponde. Una breve ispezione del contenuto del disco rigido mostra che la partizione è stata effettivamente azzerata.


4

Dalla mmappagina su Linux:

MAP_SHARED Share this mapping.  Updates to the mapping are visible to other processes that map this  file,
           and  are  carried  through  to the underlying file.  The file may not actually be updated until
           msync(2) or munmap() is called.


MAP_PRIVATE
           Create a private copy-on-write mapping.  Updates to the mapping are not visible to other  pro‐
           cesses  mapping  the  same  file,  and  are  not carried through to the underlying file.  It is
           unspecified whether changes made to the file after the mmap() call are visible  in    mapped
           region.

Gli eseguibili vengono mappati nella memoria dal kernel tramite una chiamata interna alla mmapfunzione. È MAP_PRIVATErichiesta una mappatura del tipo (consultare fs/binfmt_elf.cl'albero dei sorgenti del kernel).

Quindi si riduce al comportamento di mmap: se i cambiamenti nel file, o il dispositivo a blocchi sottostante a cui viene fatto riferimento a quel file, vengono propagati alle pagine della mappatura che sono già state paginate e sono presenti.

Quella pagina si basa sugli standard API, piuttosto che sul comportamento del kernel, quindi il "non specificato". Il comportamento effettivo è che le modifiche al file non vengono propagate alle pagine già presenti. Ovviamente, se il programma salta improvvisamente a una pagina di codice che non è stata paginata e la cancellazione è già avvenuta, allora otterrà una pagina di tutti gli zeri.

Ma, molto probabilmente, con il tempo si ddcancella, ha impaginato in tutte le pagine di codice necessarie per continuare il ciclo di cancellazione. Esiste la possibilità che una volta terminato il ciclo, possa colpire del codice che si trova in una pagina non presente: come, diciamo, una funzione si estende attraverso un limite di pagina, quindi per raggiungere l'istruzione di ritorno, una pagina deve essere recuperata.

Ma quella pagina può anche essere memorizzata nella cache da una precedente ddchiamata.


1

Sì. Certo, ti costerà anche la maggior parte del tuo filesystem, ma presumibilmente sai già che ...


0

Ho fatto un errore di recente. Avevo intenzione di aggiungere un img da 2 GB su scheda SD, ma per errore l'ho fatto su SDA dd if=rasberrypi.img of=/dev/sda. Realizzato il mio errore e cancellato il dd, ma per allora erano stati scritti ~ 600 MB (su un disco con ~ 500 GB usati). Il tavolo delle partizioni è stato rovinato.

Il desktop (con 10 GB di memoria e fino a settimane) ha continuato a funzionare per alcune ore se non è successo nulla. Gestito per ottenere recentemente cambiato importanti file in dropbox, navigato normalmente in Chrome. In effetti ho potuto eseguire il dd su scheda SD come avevo inizialmente desiderato, ha funzionato bene.

Dopo un paio d'ore, il mio filesystem è entrato in modalità di sola lettura e i programmi casuali hanno iniziato a morire. Sono stato coinvolto in molti altri sistemi, ho potuto continuare a utilizzare quelle sessioni, ma fare una nuova sessione mi ha dato l'errore di non riuscire a trovare il programma ssh. In questo momento ho potuto cambiare le schede aperte in Chrome, ma il contenuto delle schede sembra essere "bloccato". Se aggiorno, ottengo lo schermo bianco per sempre. rsyslogd stava prendendo il 100% di CPU (1 core) per qualche motivo, probabilmente era confuso perché non poteva scaricare i log su disco ... forse.

Avevo aperto (e messo in pausa) un video da 350 MB in VLC, potevo ancora riprodurlo e saltare a qualsiasi parte del video. Probabilmente dal momento che è un download recente.

Potrei arrestare normalmente il sistema usando la GUI, nessun errore.

Quindi questo non risponde esattamente alla tua domanda, ma dice cosa succede se cancelli l'inizio del disco.

La maggior parte delle cose sul disco può ancora essere recuperabile, ma non mi preoccuperò poiché (si spera) viene eseguito il backup di tutto ciò che mi interessa.


-1

Molto probabilmente non verrà completato, poiché alcuni altri componenti in esecuzione richiederanno un file mancante e faranno prendere il panico dal kernel. se vuoi davvero azzerare il disco, usa un live CD; altrimenti non puoi mai garantire il risultato.


2
Richiedere un file mancante non farà prendere il panico dal kernel. In tal caso, le macchine si arresterebbero in modo anomalo se avessero un solo disco inaffidabile.
David Schwartz,

@DAvid Schwartz, se così fosse, allora #rm -rf / eliminerebbe effettivamente l'intero file system. So dagli esperimenti che non è così. il sistema non può funzionare a lungo interamente da ram a meno che non sia implementata una sorta di tecnologia ramdisk, che non è standard.
Frank Thomas,

@FrankThomas: il kernel è stato preso dal panico?
David Schwartz,

sì, spegnimento della schermata nera.
Frank Thomas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.