Utilità per tagliare lo spazio non allocato sull'unità


11

Ho un disco (scheda SD) con alcune partizioni ext4 ma anche uno spazio non allocato. L' fstrimutilità può funzionare solo all'interno di un filesystem. Prima di reinventare la ruota e scriverne una, esiste un'altra utility che può TRIM lo spazio non allocato (o che può TRIM un intervallo specificato esplicitamente)?

Posso verificare che la maggior parte dello spazio non allocato sul dispositivo non è attualmente noto per essere libero dal controller, poiché ho osservato che, su questa particolare scheda, legge 0 di ritorno dello spazio ritagliato, ma una scansione del dispositivo mostra molti dati immondizia rimasti.

Modifica: sto riscontrando un problema con hdparm. L'esempio seguente scarta il primo settore, ma sto vedendo gli stessi risultati indipendentemente dall'intervallo specificato. fstrimnon ha problemi sul dispositivo:

root@ubuntu:~# hdparm --please-destroy-my-drive --trim-sector-ranges 0:1 --verbose /dev/mmcblk0 

/dev/mmcblk0:
trimming 1 sectors from 1 ranges
outgoing cdb:  85 0d 06 00 01 00 01 00 00 00 00 00 00 40 06 00
outgoing_data:  
00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ioctl(fd,SG_IO): Invalid argument
FAILED: Invalid argument

Sto indagando ulteriormente, ma qualcuno ha qualche idea?


1
Se si mappa lo spazio non partizionato con una o più partizioni (temporaneamente), è possibile utilizzarle blkdiscardper tagliare l'intero dispositivo.
frostschutz,

Grazie! Sembra lo strumento giusto, ma blkdiscardnon sembra essere disponibile nei miei repository di pacchetti standard (Ubuntu 12.04, non sembra essere presente in util-linux).
Jason C,

Non sono mai riuscito a hdparmlavorare per me per qualche motivo, ma ho preso il sorgente util-linux da github.com/karelzak/util-linux/tree/stable/v2.23 , l'ho costruito ( ./autogen.sh ; ./configure ; make blkdiscard) e funziona alla grande. Ancora sconcertato hdparmma blkdiscardfa esattamente quello che voglio. Bonus: non è necessario creare prima un filesystem temporaneo, puoi usarlo sfdisk -lper capire lo spazio tra le partizioni e blkdiscardtagliarlo.
Jason C

Oh, non ero nemmeno consapevole di blkdiscardpoter lavorare con le opzioni offset / lunghezza. Quindi le partizioni temporanee che ho suggerito non sono nemmeno necessarie. Bello!
frostschutz,

Risposte:


16

Se hai una versione abbastanza recente di util-linux, contiene lo strumento blkdiscardche è in grado di TRIM su interi dispositivi o varia all'interno di un dispositivo usando --offsete le --lengthopzioni.

Nota: blkdiscard è pericoloso, se si lascia TRIM nelle regioni sbagliate, i dati sono spariti!

Quindi puoi capire le regioni (libere) non partizionate della tua tabella delle partizioni e poi TRIMarle usando questo strumento. Per msdose gptpartizioni, partedfornisce le regioni libere in questo modo:

# parted -m /dev/sda unit b print free | grep ':free;'
1:17408B:1048575B:1031168B:free;
1:64022904832B:64023240191B:335360B:free;

Aggiungi un loop ad esso ...

while IFS=: read -ra FREE
do
    echo blkdiscard --offset ${FREE[1]%%B} --length ${FREE[3]%%B} /dev/sda
done < <(parted -m /dev/sda unit b print free | grep ':free;')

quale stampa

blkdiscard --offset 17408 --length 1031168 /dev/sda
blkdiscard --offset 64022904832 --length 335360 /dev/sda

Verifica che questo output sia corretto per te, aggiungi ulteriori opzioni se ti piace (dettagliato?) E infine rimuovi il echomodo in cui verrà effettivamente eseguito e dovresti essere impostato.

Il secondo comando di quell'esempio in realtà fallisce perché la lunghezza è troppo piccola - può valere la pena di controllare all'interno del loop, ignorare le regioni inferiori a 1 MB poiché è improbabile che vengano tagliate con successo.


Se si utilizza LVM anziché le partizioni, è possibile creare un LV per lo spazio non occupato e tagliare quello:

lvcreate -l100%FREE -n blkdiscard SSD-VG
blkdiscard -v /dev/SSD-VG/blkdiscard
lvremove SSD-VG/blkdiscard

Se si imposta issue_discards = 1in lvm.conf, è possibile saltare la blkdiscardchiamata poiché LVM emetterà il TRIM lvremoveda solo.


1
Grazie! Ho notato questo come la risposta perché funziona per me, anche se la risposta di Michael è valida. Aggiungerò anche ciò che ho detto nei commenti alla domanda: se non hai a blkdiscarddisposizione; puoi prendere il sorgente util-linux da github.com/karelzak/util-linux/tree/stable/v2.23 e poi compilareblkdiscard (eseguire ./autogen.sh ; ./configure ; make blkdiscard) - costruito in modo pulito (anche se potresti dover installare alcune dipendenze e modificare le configureopzioni) e come fintanto che non lo si installa, non è in conflitto con util-linux esistente.
Jason C

1
Stavo osservando guasti anche con determinati valori passati blkdiscard, ma ho notato che i valori erano basati sull'offset, non sulla lunghezza. È possibile che ci sia un problema blkdiscard, sto studiando. Vedi unix.stackexchange.com/questions/98473/…
Jason C

Ho creato uno script che elimina lo spazio libero su tutti i file system montati nonché i VG LVM gratuiti: github.com/stefanct/discard-everything
stefanct

7

hdparm --trim-sector-rangespuò tagliare un intervallo. La pagina man avverte di usarlo, quindi è meglio essere sicuri di avere l'intervallo e la sintassi giusti.

Penso che inviare un trim per tutti i dati al di fuori di una partizione sarebbe pericoloso, dato che a volte ci sono alcuni dati nascosti come il codice del bootloader o le tabelle della seconda partizione. Dovresti conoscere esattamente, quali aree al di fuori delle partizioni sono davvero inutilizzate.


Perfetto grazie! Posso prendere le dimensioni del dispositivo con hdparm, intervalli inutilizzati da sfdiske tagliare di conseguenza. So cosa c'è sul disco. Se esiste uno schema di partizionamento che nasconde i dati in aree accessibili ma non allocate, ciò comprometterebbe la funzionalità di base di qualsiasi editor di partizioni. Presumo (spero) che qualsiasi schema come questo sia stato a lungo abbandonato (non ne conosco nessuno dalla parte superiore della mia testa). Tutti gli schemi che conosco memorizzano l'MBR in ben noto spazio non allocato all'inizio del dispositivo e VBR / EBR all'interno di partizioni assegnate. Potrebbero esserci vecchi schemi oscuri che sono diversi. :)
Jason C,

Sto riscontrando delle difficoltà hdparm, ho modificato la mia domanda con i dettagli; chiedendosi se hai qualche intuizione.
Jason C,

1
Sembra che almeno parte di hdparm non funzioni su / dev / mmcblk0. Scusa, non ne ho idea.
Michael Suelmann,
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.