# Проверка состояния жестких дисков в Linux Тремя наиболее популярными инструментами для сканирования дисков в Linux являются **badblocks**, **fsck** и **GSmartControl**. Получить список всех HDD подключенных в систему можно например с помощью команды: ``` fdisk -l ``` в результате получим листинг всех подключенных накопителей, их размер и имена устройств в системе. Если необходимо посмотреть какие устройства и куда смонтированы, то это можно сделать с помощью команды: ``` mount ``` Также можно получить краткий вывод списка подключенных HDD с указанием их разделов, размеров, и точек монтирования при помощи команды: ``` lsblk ``` ## Проверка состояние диска с помощью fsck Команда **fsck** (от англ. File System Consistency Check) используется для проверки и восстановления файловых систем в Unix-подобных ОС, таких как Linux, macOS и FreeBSD. Утилита считывает метаданные файловой системы и сравнивает их с реальными данными на диске. Если fsck обнаруживает какие-либо ошибки, утилита **предлагает методы их решения**. Утилита fsck по умолчанию входит в состав дистрибутивов Linux. Для её использования не требуется никаких специальных шагов или процедуры установки. > **Важно!** Перед запуском утилиты следует размонтировать диск. Запуск fsck на смонтированном диск приведет к повреждению данных. Базовый синтаксис: ``` fsck ``` здесь: * **filesystem** - может быть устройство, точка монтирования или раздел, в том числе LVM. * **options** - параметры, которые можно использовать с утилитой fsck. Наиболее часто применяемые параметры: * **-p** - утилита автоматически исправит найденные ошибки * **-с** - проверка файловой системы на поврежденные сектора Список параметров: * -a - Устаревшая опция. Указывает исправлять все найденные ошибки без одобрения пользователя. * -r - Применяется для файловых систем ext. Указывает fsck спрашивать пользователя перед исправлением каждой ошибки. * -n - Выполняет только проверку ФС, без исправления ошибок. Используется также для получения информации о ФС. * -c - Применяется для файловых систем ext3/4. Помечает все повреждённые блоки для исключения последующей записи в них. * -f - Принудительно проверяет ФС, даже если ФС исправна. * -y - Автоматически подтверждает запросы к пользователю. * -b - Задаёт адрес суперблока. * -p - Автоматически исправлять найденные ошибки, без вопросов к пользователю. Заменяет устаревшую опцию -a. * -A - Проверяет все ФС. * -С [] - Показывает статус выполнения. Здесь fd – дескриптор файла при отображении через графический интерфейс. * -l - Блокирует устройство для исключительного доступа. * -M - Запрещает проверять примонтированные ФС. * -N - **Тестовый запуск** - в выводе команды печатается, что могло бы произойти, но никаких реальных действий не выполняется. * -P - Проверять вместе с корневой ФС. * -R - Пропускает проверку корневой ФС. Может использоваться только совместно с опцией -A. * -r [] - Выводит статистику для каждого проверенного устройства. * -T - Не показывать заголовок при запуске. * -t <тип> - Задаёт ФС для проверки. Можно задавать несколько ФС, перечисляя через запятую. * -V - Выводит подробное описание выполняемых действий. Более подробную информацию об утилите fsck можно найти на ее справочной странице: ``` man fsck ``` ### Использование fsck с графическим интерфейсом Утилита fsck это инструмент командной строки, но она может быть использована и через графический интерфейс. В частности программа GParted предлагает функцию, позволяющую проверить вашу файловую систему. Соответственно если GParted не установлена в системе, то сначала необходимо её установить: ``` sudo apt-get install gparted ``` Затем следует открыть GParted и в правом верхнем углу окна программы выбрать диск, который необходимо проверить. Далее в окне программы нажмите на соответствующем разделе диска ПКМ и выберите «Проверить». {{ :linux:administration:fsck-gparted-check-filesystem.jpg?direct&600 |}} ## Сканирование с помощью badblocks Команда **badblocks** сканирует диски на наличие поврежденных секторов. Этот инструмент осуществляет чтение и запись данных в каждый сектор диска. Если **badblocks** встречает поврежденный блок, то помечает его как плохой. Синтаксис: ``` $ sudo badblocks [параметры] /dev/имя_раздела_диска ``` где: * **/dev/имя\_раздела\_диска** - имя устройства для проверки * **параметры** - необязательные параметры проверки Некоторые параметры: * **-b** - установка размера блока в байтах. Этот параметр желательно определять всегда. Размер используемого блока зависит от типа создаваемой файловой системы и её размера. * **-о** - определение имени файла, куда программа размещает номера сбойных блоков. Затем этот файл может быть передан программе, проверяющей/создающей файловую систему, для исключения отмеченных блоков. * **-i** - установка имени файла, в котором находятся номера сбойных блоков. Использование параметра позволяет исключить повторное обращение к этим блокам при сканировании. * **-p** - установка количества проходов проверки, по умолчанию только одна; * **-n** - использовать безопасный тест чтения и записи, во время этого теста данные не стираются; * **-s** - отображение номеров проверяемых блоков (т.е. показывает прогресс сканирования раздела); * **-v** - отображение максимально подробной информации во время работы программы * **-w** - установка использования режима записи при проверке, на каждый блок записывается определённая последовательность байт, что стирает данные, которые хранились там раньше - **Гарантированная потеря данных!** * **-e** - позволяет указать количество битых блоков, после достижения которого дальше продолжать тест не надо; * **-f** - по умолчанию утилита пропускает тест с помощью чтения/записи если файловая система смонтирована чтобы её не повредить, эта опция позволяет всё таки выполнять эти тесты даже для смонтированных систем; > **Важно:** перед использованием badblocks рекомендуется размонтировать диск.
По умолчанию утилита выполняет сканирование диска **без вывода какой-либо информации на экран**. Чтобы получить данные о результате работы badblocks, **используйте с командой опцию -v**
Пример использования: ``` sudo badblocks -v -n /dev/sda2 -o ~/bad_sectors.txt ``` Используя полученный в результате файл (т.е. ~/bad\_sectors.txt) мы при помощи программы **e2fsck** можем пометить сбойные блоки и они в дальнейшем будут игнорироваться системой: ``` e2fsck -l ~/bad_sectors.txt /dev/sda2 ``` > **ВНИМАНИЕ!** Данная операция должна проводиться на размонтированной файловой системе, либо в режиме read-only! Проверенное устройство и устройство на котором будут помечаться сбойные блоки должно быть одно и тоже! . ## Оценка состояния и работоспособности дисков с помощью GSmartControl GSmartControl — это инструмент с графическим интерфейсом (GUI), предназначенный для **мониторинга и управления жесткими дисками и твердотельными накопителями (SSD)**. Эта утилита проверяет состояние дисков и сканирует их для поиска поврежденных секторов. Инструмент работает при помощи технологии **SMART (Self-Monitoring, Analysis and Reporting)**. Она используется для получения информации о состоянии дисков, их температуре и количестве часов работы. Больше информации по применению здесь: [[gsmartcontrol|Gsmartcontrol]] ## Проверка диска при помощи программы dd Диск может быть проверен на ошибки при помощи программы [[https://ru.wikipedia.org/wiki/Dd?ysclid=mm0g3ykqj283665155|dd]]. Следующая команда просто выполняет поблочное чтение диска, ничего плохого не случится: ``` dd if=/dev/ada0 of=/dev/null bs=512 status=progress ``` При встрече первого бэд-блока программа завершится с ошибкой: ``` dd: /dev/ada0: Input/output error MiB) transferred 395.000s, 8111 kB/s 6266577+0 records in 6266577+0 records out 3208487424 bytes transferred in 404.157958 secs (7938697 bytes/sec) ``` Чтобы сканирование при встрече бэд-блока продолжалось (таким образом выясним сколько всего бэд-блоков на диске): ``` dd if=/dev/ada0 of=/dev/null bs=8M status=progress conv=noerror ``` Приведенные выше команды осуществляют вывод ошибок в терминал. Чтобы выполнить вывод ошибки в терминал и записать вывод с ошибками в файл можно использовать следующий вариант: ``` dd if=/dev/ada0 of=/dev/null bs=8M conv=noerror | & tee /tmp/log.txt ``` .