Sürücüde ayrılmamış alanın TRIM'ine yarar


11

Birkaç ext4 bölümlü bir sürücü (SD kart) var ama aynı zamanda ayrılmamış alan var. Yardımcı fstrimprogram yalnızca bir dosya sisteminde çalışabilir. Tekerleği yeniden icat edip bir tane yazmadan önce, ayrılmamış alanı TRIM yapabilen (veya TRIM açıkça belirlenmiş bir aralıkta olabilecek) başka bir yardımcı program var mı?

Ben cihazda ayrılmamış alanın çoğunluğu doğrulayabildikten değil ben 0'lar, bu özel kartta, görülmektedir kesilmiş uzay dönüşüne okur ettik, şu anda denetleyicisi tarafından serbest olduğu bilinen ancak cihaz gösterileri tarama bir sürü çöp verisi kaldı.

Düzenleme: Kullanırken sorun yaşıyorum hdparm. Aşağıdaki örnek ilk sektörü atmaktadır, ancak belirttiğim aralıktan bağımsız olarak aynı sonuçları görüyorum. fstrimcihazda hiçbir sorun yok:

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

Daha fazla araştırıyorum ama kimsenin içgörüleri var mı?


1
Bölümlenmemiş alanı bir veya daha fazla bölümle (geçici olarak) blkdiscardeşlerseniz, üzerlerinde tüm aygıtı kesen kullanabilirsiniz .
frostschutz

Teşekkürler! Bu doğru araca benziyor, ancak blkdiscardstandart paket depolarımda mevcut görünmüyor (Ubuntu 12.04, mevcut görünmüyor util-linux).
Jason C

Bir hdparmsebepten dolayı benim için asla çalışamadım , ancak util-linux kaynağını github.com/karelzak/util-linux/tree/stable/v2.23 adresinden aldım , ./autogen.sh ; ./configure ; make blkdiscardharika çalıştı. Hala gizemli hdparmama blkdiscardtam olarak istediğimi yapıyor. Bonus: Öncelikle geçici bir dosya sistemi oluşturmanıza gerek yoktur, sfdisk -lbölümler arasındaki boşluğu bulmak ve blkdiscardkırpmak için kullanabilirsiniz.
Jason C

blkdiscardOfset / uzunluk seçenekleriyle çalışabileceğimin farkında bile değildim . Dolayısıyla önerdiğim geçici bölümler bile gerekli değil. Güzel!
frostschutz

Yanıtlar:


16

Yeterince yeni bir sürümüne sahipseniz, tüm cihazları TRIM yapabilen util-linuxaracı blkdiscardveya --offsetve --lengthseçeneklerini kullanarak bir cihazdaki aralıkları içerir .

Lütfen dikkat: blkdiscard tehlikelidir, yanlış bölgelere TRIM yapmasına izin verirseniz, verileriniz kaybolur!

Böylece bölüm tablonuzun bölümlenmemiş (serbest) bölgelerini anlayabilir ve daha sonra bu aracı kullanarak TRIM yapabilirsiniz. İçin msdosve gptbölümler, partedböyle serbest bölgeler sağlar:

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

Bir döngü ekleyin ...

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;')

hangi baskılar

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

Bu çıktının sizin için doğru olduğunu doğrulayın, isterseniz ek seçenekler ekleyin (ayrıntılı?) Ve son echoolarak gerçekten yürütülecek şekilde kaldırın ve ayarlanmalıdır.

Bu örneğin ikinci komutu aslında uzunluk çok küçük olduğu için başarısız oluyor - döngünün içinde kontrol edilmeye değer olabilir, başarılı bir şekilde kesilmeleri olası olmadığı için 1MB'den küçük bölgeleri yok sayın.


Bölümler yerine LVM kullanıyorsanız, boş alan için bir LV oluşturabilir ve bunu düzeltebilirsiniz:

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

Kameranızı ayarladıysanız issue_discards = 1, LVM TRIM'i kendi kendine lvm.confdüzenleyeceğinden blkdiscardaramayı atlayabilirsiniz lvremove.


1
Teşekkürler! Bunu cevap olarak belirttim çünkü Michael'ın yanıtı da geçerli olsa da benim için çalışıyor. Ayrıca ben soru yorumlarında ne dediğimi katacak: Eğer varsa yok olması blkdiscardmevcut; util-linux kaynağını github.com/karelzak/util-linux/tree/stable/v2.23 adresinden alabilir ve daha sonra derleyebilirblkdiscard (çalıştırabilirsiniz ./autogen.sh ; ./configure ; make blkdiscard) - temiz inşa edilmiştir (ancak bazı bağımlılıklar ve ince ayarlar yüklemeniz gerekebilir configure) ve yüklemediğiniz sürece, varolan util-linux ile çakışmaz.
Jason C

1
Bazı değerlerin de geçtiğini gözlemledim blkdiscard, ancak değerlerin uzunluk yerine ofsete dayandığını fark ettim. Bir sorun olabilir blkdiscard, ben araştırma sürecindeyim. Bkz. Unix.stackexchange.com/questions/98473/…
Jason C

Tüm bağlı dosya sistemlerinde ve boş LVM VG'lerde boş alan bırakan bir komut dosyası oluşturdum: github.com/stefanct/discard-everything
stefanct 10:14

7

hdparm --trim-sector-rangesbir aralığı düzeltebilir. Man sayfası bunu kullanmak için uyarır, bu nedenle doğru aralık ve sözdizimine sahip olduğunuzdan emin olsanız iyi olur.

Bazı bölümler dışında bootloader kodu veya ikinci bölüm tabloları gibi bazı gizli veriler olduğu için, bir bölüm dışında tüm veriler için bir düzeltme göndermek tehlikeli olacağını düşünüyorum. Bölümlerin dışındaki hangi alanların gerçekten kullanılmadığını tam olarak bilmeniz gerekir.


Mükemmel teşekkürler! hdparmKullanılmayan aralıklarla cihaz boyutunu alabilir sfdiskve buna göre kırpabilirim. Sürüşte ne olduğunu biliyorum. Erişilebilir ancak ayrılmamış alanlardaki verileri gizleyen bir ayırma düzeni varsa, bölüm düzenleyicinin temel işlevlerini bozar. Böyle bir şemanın uzun süredir terk edildiğini (umarım) (başımın üstünden hiçbirini bilmiyorum). Bildiğim tüm şemalar, MBR'yi cihazın başlangıcında iyi bilinen ayrılmamış alanda ve tahsis edilen bölümlerde VBR'ler / EBR'lerde saklar. Farklı olan eski belirsiz planlar olabilir. :)
Jason C

Bazı zorluklar yaşıyorum hdparm, sorumu ayrıntılarla düzenledim; herhangi bir görüşünüz olup olmadığını merak ediyorum.
Jason C

1
En azından bazı hdparm, / dev / mmcblk0 üzerinde çalışmıyor gibi görünüyor. Üzgünüm, başka fikrim yok.
Michael Suelmann
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.