Utilitas untuk TRIM ruang yang tidak terisi pada drive

11

Saya memiliki drive (kartu SD) dengan beberapa partisi ext4 tetapi juga beberapa ruang yang tidak terisi. The fstrimutilitas hanya dapat bekerja dalam filesystem. Sebelum saya menemukan kembali roda dan menulis satu, apakah ada utilitas lain yang dapat TRIM ruang yang tidak terisi (atau yang dapat TRIM rentang yang ditentukan secara eksplisit)?

Saya dapat memverifikasi bahwa sebagian besar ruang yang tidak terisi pada perangkat saat ini tidak diketahui bebas oleh pengontrol, seperti yang saya amati bahwa, pada kartu khusus ini, dibaca ruang yang dipangkas mengembalikan 0, tetapi pemindaian perangkat menunjukkan banyak data sampah yang tersisa.

Sunting: Saya mengalami masalah saat menggunakan hdparm. Contoh di bawah ini membuang sektor pertama, tetapi saya melihat hasil yang sama terlepas dari rentang yang saya tentukan. fstrimtidak memiliki masalah pada perangkat:

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

Saya sedang menyelidiki lebih lanjut tetapi apakah ada yang punya wawasan?

Jason C
sumber
1
Jika Anda memetakan ruang tanpa partisi dengan satu atau lebih partisi (sementara), Anda dapat menggunakannya blkdiscardpada mereka yang memotong seluruh perangkat.
frostschutz
Terima kasih! Itu terlihat seperti alat yang tepat, tetapi blkdiscardsepertinya tidak tersedia di repositori paket standar saya (Ubuntu 12.04, sepertinya tidak ada di sana util-linux).
Jason C
Saya tidak pernah bisa hdparmbekerja untuk saya karena suatu alasan, tetapi saya mengambil sumber util-linux dari github.com/karelzak/util-linux/tree/stable/v2.23 , membuatnya ( ./autogen.sh ; ./configure ; make blkdiscard) dan bekerja dengan baik. Masih bingung tentang hdparmtetapi blkdiscardmelakukan apa yang saya inginkan. Bonus: Tidak perlu membuat sistem file sementara terlebih dahulu, Anda dapat menggunakan sfdisk -luntuk mengetahui ruang antara partisi dan blkdiscardmemangkasnya.
Jason C
Oh, saya bahkan tidak sadar blkdiscardbisa bekerja dengan opsi offset / panjang. Jadi partisi sementara yang saya sarankan bahkan tidak perlu. Bagus!
frostschutz

Jawaban:

16

Jika Anda memiliki versi yang cukup baru util-linux, itu berisi alat blkdiscardyang dapat TRIM seluruh perangkat, atau rentang dalam perangkat yang menggunakan --offsetdan --lengthopsi.

Harap dicatat: blkdiscard berbahaya, jika Anda membiarkannya TRIM wilayah yang salah, data Anda hilang!

Jadi Anda bisa mengetahui wilayah (gratis) yang tidak dipartisi dari tabel partisi Anda dan kemudian TRIM mereka menggunakan alat ini. Untuk msdosdan gptpartisi, partedsediakan wilayah bebas seperti:

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

Tambahkan satu lingkaran ke sana ...

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

yang mencetak

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

Verifikasi bahwa output ini benar untuk Anda, tambahkan opsi tambahan jika Anda suka (verbose?), Dan akhirnya hapus echosehingga akan benar-benar dieksekusi, dan Anda harus mengaturnya.

Perintah kedua dari contoh itu benar-benar gagal karena panjangnya terlalu kecil - mungkin perlu memeriksa di dalam loop, abaikan daerah yang lebih kecil dari 1MB karena mereka tidak mungkin berhasil dipangkas.


Jika Anda menggunakan LVM sebagai ganti partisi, Anda bisa membuat LV untuk ruang kosong dan memotongnya:

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

Jika Anda mengatur issue_discards = 1di lvm.conf, Anda dapat melewati blkdiscardpanggilan karena LVM akan mengeluarkan TRIM lvremovedengan sendirinya.

frostschutz
sumber
1
Terima kasih! Saya telah mengatakan ini sebagai jawaban karena itu bekerja untuk saya, meskipun jawaban Michael juga valid. Juga saya akan menambahkan apa yang saya katakan di komentar pertanyaan: Jika Anda tidak memiliki blkdiscardtersedia; Anda dapat mengambil sumber util-linux dari github.com/karelzak/util-linux/tree/stable/v2.23 lalu build blkdiscard(run ./autogen.sh ; ./configure ; make blkdiscard) - itu dibangun dengan bersih (walaupun Anda mungkin harus menginstal beberapa dependensi dan configureopsi tweak ) dan sebagai selama Anda tidak menginstalnya, itu tidak bertentangan dengan util-linux yang ada.
Jason C
1
Saya mengamati kegagalan dengan nilai-nilai tertentu yang diteruskan blkdiscardjuga, tetapi memperhatikan nilai-nilai didasarkan pada offset, bukan panjangnya. Mungkin saja ada masalah di blkdiscard, saya sedang dalam proses investigasi. Lihat unix.stackexchange.com/questions/98473/…
Jason C
Saya telah membuat skrip yang membuang ruang kosong di semua sistem file yang dipasang serta LVM VG gratis: github.com/stefanct/discard-everything
stefanct
7

hdparm --trim-sector-rangesdapat memangkas rentang. Halaman manual memperingatkan untuk menggunakannya, jadi Anda lebih baik pastikan Anda mendapatkan rentang yang tepat dan sintaksis.

Saya pikir mengirim trim untuk semua data di luar partisi akan berbahaya, karena ada beberapa data tersembunyi di sana kadang-kadang seperti kode bootloader atau tabel partisi kedua. Anda harus tahu persis, area mana di luar partisi yang benar-benar tidak digunakan.

Michael Suelmann
sumber
Sempurna terima kasih! Saya dapat mengambil ukuran perangkat dengan hdparm, rentang yang tidak digunakan dari sfdisk, dan memotong sesuai. Saya tahu apa yang ada di drive. Jika ada skema partisi yang menyembunyikan data di area yang dapat diakses tetapi tidak dialokasikan, itu akan merusak fungsi dasar editor partisi mana pun. Saya menduga (harapan) bahwa skema seperti ini telah lama ditinggalkan (saya tahu tidak ada yang terlintas di kepala saya). Semua skema yang saya ketahui menyimpan MBR di ruang yang tidak terisi yang terkenal di awal perangkat, dan VBR / EBR di dalam partisi yang dialokasikan. Mungkin ada skema lama yang tidak jelas yang berbeda. :)
Jason C
Saya mengalami beberapa kesulitan dengan hdparm, saya mengedit pertanyaan saya dengan detail; bertanya-tanya apakah Anda memiliki wawasan.
Jason C
1
Sepertinya setidaknya beberapa hdparm tidak berfungsi di / dev / mmcblk0. Maaf, saya tidak punya ide lebih lanjut.
Michael Suelmann