Прямий доступ до диска з python (simhdd)

image
Добрий день, колеги. З часу написання першої статті минуло досить багато часу. За цей час моя бібліотека для доступу до диска навчилася працювати з вбудованими SMART-тестами та їх логами а також механізмами безпеки сучасних накопичувачів.

На цей раз я розповім про створення програми для тестування жорстких дисків на базі цієї бібліотеки.

Мені потрібно додаток, який можна запустити на сервері з hot-swap кошиком і тестувати на ньому диски, замінюючи їх по мірі проходження тестів. Кращим рішенням для цього мені здалося запускати процес тестування кожного диска в окремому потоці. Оскільки досвіду багатопоточного програмування в python у мене не було, я почав вивчати питання. Для створення багатопоточних додатків в пітоні є модуль threading. Оскільки потоки створюються в межах одного процесу, немає жодної проблеми з доступом до загальних даних. Все виглядає дуже просто. На жаль мене чекала проблема. Моя бібліотека відмовилася працювати в режимі багатопоточності. Значить шлях мій лежав до написання програми з декількома процесами та усіма принадами межпроцессного взаємодії. У пітоні для цього є модуль multiprocessing.

Архітектура програми мені бачилася наступним чином: Основний потік займається взаємодією з користувачем. Виводить список дисків, приймає команди і відображає прогрес тестів. Кожна команда диска запускається в окремому процесі. Щоб бути впевненим, що тест виконається саме на тому диску, на який віддавалася команда в меню, (диски наприклад, можна випадково переставити місцями і забути перечитати в програмі) ключем для виконання команди зроблений серійний номер диска. Перед виконанням команди перевіряється відповідність серійного номера переданого команді при запуску, серійним номером підключеного диска. При неспівпаданні номерів команда відхиляється зі звуковим сигналом. Корисна функція, щоб випадково не запустити деструктивний тест на диску, підключеному щоб подивитися SMART.

Для обміну даними між основним процесом і процесами тестування було створено кілька словників. Ключами словників є серійні номери дисків. Мені не дуже подобається рішення у вигляді пачки словників, але кращого я поки не придумав.

image
Ось, як виглядає головне вікно програми.

Кожен диск у програмі має режим, в якому він знаходиться. За замовчуванням це режим простою «idle». При запуску тесту цей режим змінюється на назву виконуваного тесту. Процес тесту регулярно перевіряє відповідність режиму своїй назві а при незбігу перериває тест. Таким чином основний процес може перервати виконання тесту помінявши диску режим на idle. Програма може запускати на дисках вбудовані SMART-тести (Short і Extended), перевіряти диски послідовним читанням та записом. При цьому тест запису зроблений циклічним, яке прописує диск знову і знову, відзначаючи скільки циклів було зроблено. Безперервний циклічний запис дозволяє «добити» диски у яких «сиплеться» поверхню, але які ще не набрали потрібну кількість помилок для повернення постачальнику. За кілька днів у такому режимі вони зазвичай доходять до стану SMART status bad, що є підставою для заміни. На екрані, при тестуванні показується швидкість проходження тесту (де це можливо), кількість помилок диска і кількість «повільних» секторів. Час, після якого сектор рахується «повільним» задається константою в програмі. Також програма вміє відображати основну інформацію з диска, SMART і логи SMART-тестів.

image

Тест запису може прописувати диск як нульовими значеннями так і унікальним партерному, за яким можна буде визначити, що диск вже тестувався цією програмою. Метод запису перемикається теж константою. Оскільки програма розрахована на завантаження тестового середовища по мережі, в ній є можливість відключити в меню пункт виходу з програми.

Ось така вийшла утилітка, може кому згодиться. Код утиліти і бібліотеки, на якій вона побудована доступний на github.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.