TRIM nedir, neden umursamalıyım?
TRIM, işletim sisteminin SSD sürücüdeki hangi alanların kullanılmamış olarak değerlendirildiğini, böylece silinmeye ve yeniden yazılmaya hazır olduğunu bilmesini sağlayan bir sistem komutudur. TRIM açıkken, bilgisayar boşa geçtiğinde SSD bu işaretlenen verileri siler. Böylece hem SSD'de yer açılır hem de yeni verilerin yazılma işlemi hızlanır. TRIM komutu işletim sisteminin yazılmak ya da silinmek istenen verinin SSD'de tam olarak hangi blokta olduğunu bilmesini sağlıyor. Böylece bir dosyaya silme komutu verildiğinde TRIM komutu dosyaların saklandığı bloğu ya da sayfayı anında temizliyor. Böylece o alana veri yazılacağı zaman sistem beklemez ve yavaşlık oluşmaz.
TRIM komutu normal olarak SATA/NVME arayüzü üzerinden çalıştığı için USB üzerinden TRIM komutu yollanamıyor. Ancak bu yazıda bir kaç komut ile TRIM'ın USB üzerinden de çalışmasını sağlayacağız.
SSD TRIM'i destekliyor mu?
Linux'ta, aşağıdaki komutlardan birini çalıştırarak TRIM'in desteklenip desteklenmediğini kontrol edebilirsiniz. İşletim sistemini SSD'den boot ettiğinizi varsayarsak bu aygıt /dev/sda
olacaktır. SSD'den boot etmiyorsanız kontrol edin ve buna göre değiştirin.
$ sudo fstrim -v /
Sistem fstrim: /: the discard operation is not supported
geri bildiriminde bulunursa TRIM etkinleştirilmemiştir.
Şunları da kontrol edebilirsiniz:
$ lsblk -D
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
loop0 0 4K 4G 0
loop1 0 4K 4G 0
loop2 0 4K 4G 0
loop3 0 4K 4G 0
loop4 0 4K 4G 0
loop5 0 4K 4G 0
sda 0 1M 32M 0
├─sda1 0 1M 32M 0
├─sda2 0 1M 32M 0
├─sda3 0 1M 32M 0
│ ├─vg-lv_root 0 1M 32M 0
│ └─vg-lv_swap 0 1M 32M 0
└─sda4 0 1M 32M 0
└─vg-lv_root 0 1M 32M 0
sr0 0 0B 0B 0
DISC-MAX değeri 0B
ise TRIM etkinleştirilmemiştir.
Cihazın firmware'inin TRIM'i destekleyip desteklemediğini kontrol etmek için root kullanıcısına geçin.
$ sudo su
İhtiyaç duyacağımız birkaç yardımcı program yükleyelim:
# apt-get install -y sg3-utils lsscsi
Aşağıdaki komutu çalıştırın veMaximum unmap LBA count
değerini kontrol edin:
# sg_vpd -p bl /dev/sda
Block limits VPD page (SBC):
...
Maximum unmap LBA count: 4194240
Maximum unmap block descriptor count: 1
...
Bunu not alın. Ardından aşağıdaki komutu çalıştırın ve unmap command supported (LBPU)
satırını kontrol edin:
# sg_vpd -p lbpv /dev/sda
Logical block provisioning VPD page (SBC):
Unmap command supported (LBPU): 1
...
unmap LBA count
0'dan büyükse ve unmap (LBPU)
1 ise, bu durumda cihaz üretici yazılımı büyük olasılıkla TRIM'i destekler.
Aşağıdaki komut ile çıkacak Logical block length
değerini de not alın:
sg_readcap -l /dev/sda
Read Capacity results:
Protection: prot_en=0, p_type=0, p_i_exponent=0
Logical block provisioning: lbpme=1, lbprz=1
Last LBA=41943039 (0x27fffff), Number of logical blocks=41943040
Logical block length=512 bytes
Logical blocks per physical block exponent=0
Lowest aligned LBA=0
Hence:
Device size: 21474836480 bytes, 20480.0 MiB, 21.47 GB
UYARI : AŞAĞIDAKİ İŞLEMLERE BAŞLAMADAN ÖNCE CİHAZINIZIN FIRMWARE'İNİN BOZULMA İHTİMALİNİ GÖZ ARDI ETMEYİN, RİSK SİZE AİTTİR.
TRIM'i etkinleştirme:
Şimdi cihazınızın firmware'inin TRIM'i desteklediğini biliyorsanız ancak şu andaTRIM aktif değilse TRIM'i etkinleştirmek için işe koyulabiliriz.
Pi'ye bağlı tüm sürücüler için mevcut provisioning_mode'u kontrol edin:
# find /sys/ -name provisioning_mode -exec grep -H . {} + | sort
/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode:full
Provisioning_mode'u full den unmap e değiştirmemiz gerekecek ancak bağlı birden fazla sürücünüz varsa hangi sürücüyü değiştirmeniz gerektiğini bulmamız gerekecek. Bunu lsscsi'yi kullanarak yapabilirsiniz:
# lsscsi
[0:0:0:0] disk Corsair Voyager GTX 0 /dev/sda
Hangi sürücüyü değiştirmeniz gerektiğini onayladıktan sonra (benim durumumda sistemde yalnızca bir tane cihaz var bu da sürücüyü bulmayı çok kolaylaştırıyor). Find komutunun döndürdüğü değeri full den unmap (boş) olacak şekilde değiştirin:
echo unmap > /sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode
Provisioning_mode
'un artık full
'den çıktığını doğrulamak için find komutunu tekrar çalıştırın.
# find /sys/ -name provisioning_mode -exec grep -H . {} + | sort
/sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/provisioning_mode
Şimdi sürücü için discard_max_bytes
değerini güncellemeniz gerekiyor. Daha önce sg_vpd -p bl /dev/sda
komutundan aldığınız maksimum unmap LBA count
değerini sg_readcap -l /dev/sda
komutundan aldığınız logical block length
değeriyle çarpın. (Sizin değerleriniz benimkilerden farklı olabilir):
# echo $((4194240*512))
2147450880
Ardından bu değeri sürücünün discard_max_bytes
ayarına yazın. Benim durumumda:
# echo 2147450880 > /sys/block/sda/queue/discard_max_bytes
Şimdi, TRIM'in etkinleştirildiğini onaylamak için şunu çalıştırın:
# fstrim -v /
/: 117.6 MiB (123346944 bytes) trimmed
Komut hata vermemelidir. Kaç bloğu temizlemesi gerektiğine bağlı olarak birkaç saniye veya daha uzun sürebilir.
TRIM'ı sistemde sürekli hale getirmek:
Pi'yi bir sonraki yeniden başlatışınızda bu değerlerin tümü sıfırlanacaktır. Yeniden başlatmanın ardından # fstrim /
komutunu çalıştırdığınızda TRIM'ın aktif olmadığını göreceksiniz.
# fstrim /
fstrim: /: the discard operation is not supported
Bu nedenle kuralların geçerliliğini sağlamak için bir udev kuralı eklemeniz gerekir:
# nano /etc/udev/rules.d/10-trim.rules
Ve bu dosyaya şunları ekleyin:
ACTION=="add|change", ATTRS{idVendor}=="1b1c", ATTRS{idProduct}=="1a0e", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"
Şimdi, muhtemelen idVendor
ve idProduct
'ı nereden edindiğimi merak ediyorsunuzdur, lsusb
komutunu kullandım:
# lsusb
Bus 002 Device 002: ID 1b1c:1a0e Corsair
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Corsair
satırına bakıldığında, vendor 1b1c
ilk kısım ve product ise 1a0e
ikinci kısımdır. Bir USB cihazı hakkında tonlarca ayrıntılı bilgi istiyorsanız lsusb -vd 1b1c:1a0e
kullanın (vendor:product belirterek).
10-trim.rules dosyanızı kaydettiğinizden emin olun, ardından Pi'yi yeniden başlatın. fstrim'i tekrar çalıştırmayı deneyin ve çalıştığından emin olun:
$ sudo fstrim -v /
/: 111.4 GiB (119574462464 bytes) trimmed
Yeniden başlatmanın ardından fstrim ilk kez çalıştırıldığında tüm boş alanı TRIM'leyecektir. Bu yüzden bu kadar büyük bir sayı verir. Bu noktadan sonra çekirdek değişen blokları izleyecek ve bir sonraki önyüklemeye kadar yalnızca bu verileri kırpacaktır.
Otomatik TRIM
TRIM komutunun arka planda otomatik olarak çalıştırıldığından emin olmak için yapmanız gereken son şey (böylece fstrim'i manuel olarak çalıştırmanız gerekmez), yerleşik fstrim.timer'ı etkinleştirmektir.
Bunu yapmak için şu komutu çalıştırın:
$ sudo systemctl enable fstrim.timer
Varsayılan olarak haftalık çalışacaktır.