Вопрос или проблема
Я хочу протестировать NVMe SSD, который подключен к слоту PCIe на моей материнской плате. Процедура тестирования – это специфический алгоритм, который записывает нагрузки на SSD, в то время как SSD подвергается радиации (например, нейтронам).
Я использую Fedora 22 с ядром 4.4.6.
Мое текущее программное обеспечение успешно работает с SATA SSD. Поскольку SSD может перестать реагировать из-за радиации, иногда требуется его перезагрузка для возобновления операций. Это становится возможным благодаря внешнему управляемому блоку питания.
Теперь я хотел бы портировать свое программное обеспечение для тестирования NVMe SSD PCIe. Я модифицировал расширитель PCIe для внешнего применения напряжения к SSD; полученные линии питания (+12В и 3,3В) изолированы от линий питания разъема PCIe. С этой конфигурацией SSD хорошо распознается и работает при загрузке с включенным внешним источником питания.
Удаление устройства и повторное сканирование шины PCI работают, пока NVMe SSD включен, а именно:
echo 1 > /sys/bus/pci/devices/0000\:01\:00.0/remove
после:
echo 1 > /sys/bus/pci/rescan
работает. Однако, если я выключаю и затем включаю устройство после его удаления, повторное сканирование шины PCI rescan
не работает (и никаких сообщений не появляется в dmesg
).
Если я “жестко” выключаю SSD (с помощью моего контролируемого блока питания) без удаления SSD в sysfs
, я получаю следующее:
[ 192.688934] nvme 0000:01:00.0: Статус сбоя: ffffffff, сброс контроллера
[ 192.689274] Попытка освободить несуществующий ресурс <000000000000e000-000000000000e0ff>
[ 192.699900] nvme 0000:01:00.0: Отказ в изменении состояния питания, в настоящее время в D3
[ 192.699946] Попытка освободить несуществующий ресурс <000000000000e000-000000000000e0ff>
[ 192.699953] nvme 0000:01:00.0: Устройство не удалось возобновить
Очевидно, что повторное сканирование шины PCI ничего не дает.
Вопрос: что необходимо сделать, чтобы обеспечить циклическое выключение SSD без перезагрузки моей тестовой станции? Из аналогичных тем я понимаю, что эта проблема не тривиальна, поэтому я был бы рад широкому спектру решений (или подсказок), включая:
- Добавление параметров загрузки ядра
- Использование команд
setpci
(подсказки?) - Использование дополнительной логики, например, модификации проводки на расширителе PCIe, чтобы “обмануть” шину PCIe
- Модификации в исходном коде ядра (подсказки?)
Это маловероятно, чтобы снова заставить устройство работать, но может сделать устройство достаточно отзывчивым, чтобы ответить на удаление. Пока устройство в порядке, сохраните все регистры конфигурации PCI, а после циклического отключения восстановите их. Вы можете продвинуться в этом, найдя слот контроллера.
$ lspci | grep SATA
00:1f.2 SATA контроллер: Intel Corporation 7 Series Chipset Family 6-port SATA Controller [AHCI mode] (rev 04)
Затем перечислите имена регистров и передайте каждый из них в setpci (вам не нужно быть root):
$ setpci --dumpregs |
awk -v slot="00:1f.2" 'NR>1 && !/ E?CAP/{
reg = tolower($NF)
printf "%s=",reg
system("setpci -s " slot " " reg)
}'
Это даст вам строки похожие на
vendor_id=8086
device_id=1e03
command=0407
status=02b0
base_address_0=0000f0b1
base_address_1=0000f0a1
base_address_2=0000f091
base_address_3=0000f081
base_address_4=0000f061
base_address_5=f7c06000
Очевидно, что некоторые из этих регистров только для чтения или имеют только для чтения биты. Идея заключается в том, чтобы вызвать sudo setpci -s "$slot"
с каждой из этих строк, игнорируя этот аспект.
Вышеуказанное обрабатывает только базовые регистры конфигурации PCI. Однако вам также нужно сохранить и восстановить некоторые регистры возможностей. Это потребует больше усилий, в зависимости от регистра. Вам также нужно быть root, чтобы их прочитать. Например,
sudo setpci -s 00:1f.2 CAP_MSI+0.l CAP_MSI+4.l CAP_MSI+8.l
выведет регистры возможностей MSI:
00017005
fee0200c
000041b1
Сравните это с значениями, показанными командой
sudo lspci -s "$slot" -vvv
...
Возможности: [80] MSI: Включить+ Количество=1/1 Маскируемый- 64bit-
Адрес: fee0200c Данные: 41b1
Ответ или решение
Циклическое питание NVMe SSD, подключенного через PCIe: Руководство по решению проблемы
Тестирование твердотельного накопителя (SSD) NVMe при воздействии радиации – это сложная задача, требующая тщательного подхода при управлении питанием и состоянием устройства. Данная статья опишет, какие шаги можно предпринять для успешного циклического питания NVMe SSD, подключенного к слоту PCIe на материнской плате, без необходимости перезагрузки тестовой станции.
Проблема
Вы столкнулись с несколькими проблемами:
- SSD NVMe перестает отвечать на команды после обесточивания.
- Повторное сканирование шины PCI не фиксирует устройство после его повторного включения.
- Невозможность восстановления работы накопителя без перезагрузки системы.
Пути решения
Существует несколько методов, которые могут помочь в решении указанных проблем:
-
Корректное управление питанием и сброс устройства:
- Для того чтобы эффективно управлять состоянием NVMe SSD, рекомендуется использовать команды, связанные с
setpci
, для сброса конфигурационных и управляющих регистров устройства после его повторного включения.
- Для того чтобы эффективно управлять состоянием NVMe SSD, рекомендуется использовать команды, связанные с
-
Использование
setpci
для сохранения и восстановления конфигурации:- Перед отключением питания накопителя сохраните текущие регистры конфигурации устройства. Это может помочь восстановить его состояние после повторного включения.
- Пример команды для создания резервной копии регистров:
setpci --dumpregs | awk -v slot="00:01.0" 'NR>1 {print "setpci -s " slot " " $1 " = " $3}'
- После повторного включения выполните сохраненные команды для восстановления состояния устройства.
-
Добавление параметров загрузки ядра:
- В некоторых случаях вам может понадобиться настроить параметры ядра для более лучшего управления состоянием PCIe устройств. Попробуйте добавление параметра
pci=nocrs
(если не требуется включение ресурсов PCI) при загрузке, чтобы отключить автоматическую настройку ресурсов.
- В некоторых случаях вам может понадобиться настроить параметры ядра для более лучшего управления состоянием PCIe устройств. Попробуйте добавление параметра
-
Использование логики управления на уровне аппаратного обеспечения:
- Если есть возможность, дополните вашу модификацию PCIe-удлинителя элементами, которые могут "обмануть" PCIe шину о том, что устройство было совершено нормально отключено и повторно подключено. Например, можно использовать логические элементы или другие схемы, которые обеспечивают временное наличие устройства на шине.
-
Изменения в исходном коде ядра:
- Если традиционные подходы не помогают, можно рассмотреть возможность внести изменения в исходный код ядра Linux для улучшения обработки состояния устройства. Это, конечно, требует глубоких знаний и понимания внутренностей ядра Linux и PCIe.
Заключение
Процесс циклического питания NVMe SSD через PCIe является сложной задачей, которая требует как программного, так и аппаратного подхода к решению. Успешный подход включает в себя управление питанием устройства, использование команд для работы с регистрами PCIe, применение необходимых параметров загрузки ядра и возможные изменения в аппаратной конфигурации устройства.
Запомните, что подобные эксперименты несут в себе риск, и необходимо тщательно планировать действия, чтобы минимизировать вероятность повреждений как аппаратных, так и программных.