最近又了解了一些linux下usb硬盘盒的信息,作了一些实践,认识有些突破。
总结我做过的一些测试
1)linux下对usb2sata/nvme芯片的trim支持
usb转sata/nvme的trim支持实际上依赖于UASP,usb硬盘盒世纪上被当作scsi设备对待,trim在scsi下就是unmap,因此usb转接芯片必须能够把操作系统发出的scsi unmap指令翻译成sata 的trim。linux下用下面命令查询usb芯片对unmap的支持
# sg_vpd -a /dev/sda
Logical block provisioning VPD page (SBC):
Unmap command supported (LBPU): 1
Write same (16) with unmap bit supported (LBPWS): 0
Write same (10) with unmap bit supported (LBPWS10):
LBPU这一项很多uasp主控都支持,ASM1153e/1351/2362、jms583/576/580、vl716/711-q4、rtl9210b,三星T5等,而linux上面三个选项有一个支持就可以trim,当然linux默认情况下还需要LBPME为1,否则需要手动设置udev规则指定使用unmap
然而LBPME项ASM1153e/1351/2362、jms583、 甚至三星T5都不支持,只有rtl9210b满足
sudo sg_readcap -l /dev/sdc
Read Capacity results:
Protection: prot_en=0, p_type=0, p_i_exponent=0
Logical block provisioning: lbpme=0, lbprz=0
Last LBA=488397167 (0x1d1c596f), Number of logical blocks=488397168
Logical block length=512 bytes
Logical blocks per physical block exponent=0
Lowest aligned LBA=0
这样运行fstrim或者blkdiscard都会报错
fstrim: /media/xxx/xxxxxxxxx: the discard operation is not supporte
blkdiscard: /dev/sdc: BLKDISCARD ioctl failed: Operation not supporte
需要添加这样的udev规则(idVendor:idProduct是USB设备号)
ACTION=="add|change", ATTRS{idVendor}=="174c", ATTRS{idProduct}=="0583", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap
这样ASM1153e/1351/2362、jms583/576/580、vl716/711-q4在linux下都可以支持trim,可以运行blkdiscard/fstrim
PS:一个ASM1351盒子默认固件在windows下不能识别为SSD,linux下LBPU也是0,但是更新固件后win10识别为SSD,linux下LBPU也变成1了。
2)Trimcheck测试
Jms576/580 win10下trimcheck显示支持trim,但是win10不识别为SSD,上面说了linux下Jms576/580的LBPU为1支持trim. 两票对一票,我选trimcheck和linux获取到的LBPU靠谱
vl716/711-q4在为win10下用trimcheck显示不支持trim,但是把trimcheck第一次运行后拿到linux下面运行fstrim,然后再次在win上运行trimcheck显示trim成功。当然测试的用的文件系统是ntfs。这说明windows下vl716/711确实不支持trim而linux下确实支持。这也巩固了我对trimcheck和LBPU的信心。
win10 不能把jms576/580识别为SSD,这很可能是windows的问题。
3)win10 的碎片整理和优化驱动器工具
ASM 1153e/1531/2632、jms583、rtl9210b可以被识别为SSD.
vl716/711-q4、Jms576/578/580不能识别为固态
这个工具是用来手动在windows下发出retrim操作的。windows对trim操作的队列大小有一定限制,如果删除操作过多trim请求数量超过限制后windows就将这些trim请求丢弃,然后定期执行retrim以保证所有无效块都得到trim。
如果我们上面2)里面的结论正确,即jms576/580支持常规的trim,那么即使不运行retrim,问题也不是很大。但是jms576/580在win10下既然能够执行trim,却不能被一个trim相关的工具识别为固态这又有些奇怪了。然后l716/711-q4在linux下支持trim,为和windows不支持?
由于我对ssd/trim/usb/usap等缺乏理论知识,以上观点基本是靠实践摸索的,理解和表达上的错误在所难免。对于windows如何识别固态硬盘,linux为何LBPME为0不甚理解。希望这些信息对想了解这个问题的人有帮助.,希望有识之士指正和补充。
附上一些参考链接:
https://www.zhihu.com/question/305139112https://www.glump.net/howto/desktop/enable-trim-on-an-external-ssd-on-linuxhttps://wiki.archlinux.org/index.php/Solid_state_drive#External_SSD_with_TRIM_supporthttps://spod.cx/blog/enabling_trim_support_via_VL817_usb_sata_adaptor.shtmlhttps://social.technet.microsoft.com/Forums/windowsserver/en-US/2cfc8c18-57ed-435d-a648-049cdda329bf/will-windows-do-unmap-on-usb-drives-in-any-casehttp://salutepc.altervista.org/ssd-on-usb-3-0-3-1-with-trim-support-windows-linux.htmlhttps://bbs.archlinux.org/viewtopic.php?id=236280https://bbs.archlinux.org/viewtopic.php?id=244636