Trim и SSD с корпусом USB 3.0 не работает - UASP не поддерживается?

Я установил один 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

7
задан 9 March 2013 в 03:40

4 ответа

Ваш SSD сообщает hdparm для поддержки TRIM (hdparm -I = Запрос идентификационной информации непосредственно с накопителя).

TRIM, однако, управляется контроллером привода.

Вполне вероятно, что контроллер жесткого диска USB3 внешнего жесткого диска не поддерживает TRIM (большинство внешних контроллеров не поддерживают).

В этом случае вы не получите никаких возможностей TRIM, даже если ваш SSD его поддерживает.

0
ответ дан 9 March 2013 в 03:40

Если 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 теперь.

1
ответ дан 9 March 2013 в 03:40

Это программная проблема, в настоящее время 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.

0
ответ дан 9 March 2013 в 03:40

Этот вопрос заслуживает обновленного ответа теперь, когда на рынке есть USB-корпуса, поддерживающие обрезку. Например, если в вашем корпусе используется микросхема JMICRON JMS583, она поддерживает обрезку.

Я собираюсь включить только шаги, необходимые для его работы, если он поддерживается, но если вы хотите более подробное пошаговое руководство, см. ссылку на источник ниже.

  1. Получите идентификатор поставщика и продукта из lsusb
  2. Создайте /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"
  1. Перезагрузите конфигурацию udev sudo service udev force-reload
  2. Убедитесь, что у вас не установлен корпус USB, а затем повторно подключите корпус USB.
  3. Вы можете проверить, поддерживается ли обрезка с помощью lsblk --discard /dev/sda

См.: https://www.glump.net/howto/desktop/enable-trim-on- an-external-ssd-on-linux

2
ответ дан 1 July 2020 в 13:35

Другие вопросы по тегам:

Похожие вопросы: