Я установил один SSD-диск (Micron C400-MTFDDAC128MAM) во внешнем корпусе USB 3.0. Теперь я хочу использовать этот диск как второй диск в моем ноутбуке с Ubuntu 12.04. Диск работает, но я хочу использовать поддержку TRIM, которая не работает должным образом.
Проверка поддержки обрезки:
user@server:~$ sudo hdparm -I /dev/sdc | grep -i TRIM
* Data Set Management TRIM supported (limit 8 blocks)
* Deterministic read data after TRIM
Диск был смонтирован со следующими параметрами:
/dev/sdc1 on /media/MICRON type ext4 (rw,nosuid,nodev,uhelper=udisks)
Но когда я запускаю команду обрезки вручную, я получаю сообщение об ошибке:
[ 112]Я использовал этот диск до того, как работал внутренний диск и обрезка, пожалуйста, помогите мне спасибо.
Вот некоторые подробности USB:
[ 1039.248050] usb 4-1: new SuperSpeed USB device number 4 using xhci_hcd
[ 1039.265597] scsi8 : usb-storage 4-1:1.0
[ 1041.547879] scsi 8:0:0:0: Direct-Access C400-MTF DDAC128MAM 0509 PQ: 0 ANSI: 5
[ 1041.549134] sd 8:0:0:0: Attached scsi generic sg2 type 0
[ 1041.550511] sd 8:0:0:0: [sdc] 250069680 512-byte logical blocks: (128 GB/119 GiB)
[ 1041.550778] sd 8:0:0:0: [sdc] Write Protect is off
[ 1041.550785] sd 8:0:0:0: [sdc] Mode Sense: 23 00 00 00
[ 1041.552520] sd 8:0:0:0: [sdc] No Caching mode page present
[ 1041.552528] sd 8:0:0:0: [sdc] Assuming drive cache: write through
[ 1041.554029] sd 8:0:0:0: [sdc] No Caching mode page present
[ 1041.554035] sd 8:0:0:0: [sdc] Assuming drive cache: write through
[ 1041.678373] sdc: sdc1
[ 1041.679982] sd 8:0:0:0: [sdc] No Caching mode page present
[ 1041.679991] sd 8:0:0:0: [sdc] Assuming drive cache: write through
[ 1041.679997] sd 8:0:0:0: [sdc] Attached SCSI disk
Как узнать, является ли запоминающее устройство, использующее UASP (USB-SCSI-протокол), которое должно поддерживать TRIM? ]
Luckyrings
Ваш SSD сообщает hdparm для поддержки TRIM (hdparm -I = Запрос идентификационной информации непосредственно с накопителя).
TRIM, однако, управляется контроллером привода.
Вполне вероятно, что контроллер жесткого диска USB3 внешнего жесткого диска не поддерживает TRIM (большинство внешних контроллеров не поддерживают).
В этом случае вы не получите никаких возможностей TRIM, даже если ваш SSD его поддерживает.
Если UNMAP не переводится правильно Вашим корпусом, можно по крайней мере вручную обрезать целый диск с помощью hdparm (это использует ata-передачу протокола SCSI и хорошо работает на моем прикреплении HDD UASP). Но необходимо вычислить секторы вручную, потому что hdparm только поддерживает обрезку 65 535 секторов за один раз. Я записал короткий сценарий, чтобы сделать математику:
#!/usr/bin/env python3
import sys
remaining = int(sys.argv[1])
i = 0
while remaining > 0:
add = min(65535, remaining)
print("%d:%d" % (i, add))
remaining -= add
i += add
Сохраните его как sectors.py
и сделайте chmod +x sectors.py
. Это приводит к списку блоков сектора, применимых с hdparm --trim-sector-ranges-stdin
. Теперь выполнитесь hdparm -I /dev/sdX
(как корень), и требуют строки, которая похожа:
LBA48 user addressable sectors: 62533296
Это - количество сектора устройств (поскольку Вы могли вычислить, это - SSD на ~32 ГБ, который я часто использую для тестирования).
Скопируйте число в следующую команду:
./sectors.py SECTOR_COUNT | sudo hdparm --trim-sector-ranges-stdin --please-destroy-my-drive /dev/sdX
ПРЕДУПРЕЖДЕНИЕ: Это сотрет ЦЕЛЫЙ ДИСК!
После того, как это закончилось, выполненный sync
и ожидайте несколько секунд. Теперь можно перечитать таблицу разделов с hdparm -z /dev/sdX
или просто цикл включения и выключения питания устройство. Поздравления, у Вас есть "новый" SSD теперь.
Это программная проблема, в настоящее время Linux, похоже, не поддерживает TRIM через USB. Проблема заключается в том, что запоминающие устройства USB используют набор команд SCSI, тогда как накопитель SSD реализует набор команд ATA. Корпус USB должен обеспечивать переводчик между этими наборами команд. Операция TRIM в ATA называется UNMAP в SCSI и DISCARD в ядре Linux. Когда Linux получает команду обрезать устройство, она ищет правильную команду для отправки на устройство. Поскольку запоминающие устройства USB выглядят как диски SCSI, Linux пытается использовать UNMAP или пару других возможных команд SCSI. В принципе, транслятор в корпусе USB часто может переводить запросы UNMAP в соответствующую ATA TRIM, хотя, возможно, существуют сложные ситуации. На практике вложения не делают этого, и вместо этого они указывают, что устройство не поддерживает UNMAP. Однако во многих корпусах реализована команда SCSI для выдачи команд ATA непосредственно на устройство. Это называется сквозным прохождением ATA. Для этого есть стандартная команда, но в некоторых корпусах вместо нее есть проприетарная команда. Фактически, hdparm -I
использует ATA passthrough для получения информации от устройства. Тот же проход можно использовать для выдачи TRIM непосредственно на устройство, но драйвер Linux в настоящее время этого не делает. Он должен был бы обнаружить, что диск SCSI на самом деле является транслятором SCSI-ATA, который поддерживает сквозное прохождение ATA, и использовать его для DISCARD вместо собственных команд SCSI.
Этот вопрос заслуживает обновленного ответа теперь, когда на рынке есть USB-корпуса, поддерживающие обрезку. Например, если в вашем корпусе используется микросхема JMICRON JMS583, она поддерживает обрезку.
Я собираюсь включить только шаги, необходимые для его работы, если он поддерживается, но если вы хотите более подробное пошаговое руководство, см. ссылку на источник ниже.
lsusb
/etc/udev/rules.d/50-usb-ssd-trim.rules
со следующим содержимым, но измените поставщика и продукта, чтобы они совпадали с найденными на шаге 1:ACTION=="add|change", ATTRS{idVendor}=="152d", ATTRS{idProduct}=="0583", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"
sudo service udev force-reload
lsblk --discard /dev/sda
См.: https://www.glump.net/howto/desktop/enable-trim-on- an-external-ssd-on-linux