Решение проблемы с выпавшими дисками mdadm

Получил сегодня от одного из серверов на Hetzner три email сообщения с информацией о рейдах md0, md1, md2:

DegradedArray event on /dev/md/0:example.com
This is an automatically generated mail message from mdadm
running on example.com
A DegradedArray event had been detected on md device /dev/md/0.
Faithfully yours, etc.
P.S. The /proc/mdstat file currently contains the following:
Personalities : [raid6] [raid5] [raid4] [raid1]
md2 : active raid6 sdb3[1] sdd3[3]
208218112 blocks super 1.0 level 6, 512k chunk, algorithm 2 [4/2] [_U_U]
md1 : active raid1 sdb2[1] sdd2[3]
524224 blocks super 1.0 [4/2] [_U_U]
md0 : active raid1 sdb1[1] sdd1[3]
12582784 blocks super 1.0 [4/2] [_U_U]
unused devices:

Посмотрел информацию о RAID и дисках:

cat /proc/mdstat
cat /proc/partitions
mdadm --detail /dev/md0
mdadm --detail /dev/md1
mdadm --detail /dev/md2
fdisk -l | grep '/dev/sd'
fdisk -l | less

Собрался отправить тикет в техподдержку и запланировать замену выпавших SSD дисков.
Записал SMART информацию о выпавших дисках в файлы, там же был их серийный номер:

smartctl -x /dev/sda > sda.log
smartctl -x /dev/sdc > sdc.log

Удалить диски из рейда если что можно так:

mdadm /dev/md0 -r /dev/sda1
mdadm /dev/md1 -r /dev/sda2
mdadm /dev/md2 -r /dev/sda3

mdadm /dev/md0 -r /dev/sdc1
mdadm /dev/md1 -r /dev/sdc2
mdadm /dev/md2 -r /dev/sdc3

Если какой-то раздел диска отображается как рабочий, а диск нужно извлечь, то сначала помечаем раздел не рабочим и потом удаляем, например если /dev/sda1, /dev/sda2 выпали, а /dev/sda3 работает:

mdadm /dev/md0 -f /dev/sda3
mdadm /dev/md0 -r /dev/sda3

В моем случае, посмотрев информацию о выпавших дисках обнаружил что они целые и рабочие, даже лучше активных.

Посмотрел разделы дисков:

fdisk /dev/sda
p
q
fdisk /dev/sdc
p
q

Они были размечены одинаково как и прежде:

Disk /dev/sda: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00015e3f
Device Boot Start End Blocks Id System
/dev/sda1 1 1567 12582912+ fd Linux raid autodetect
/dev/sda2 1567 1633 524288+ fd Linux raid autodetect
/dev/sda3 1633 14594 104109528+ fd Linux raid autodetect

Поэтому поочередно дождавшись синхронизации каждого вернул эти диски обратно в рейд:

mdadm /dev/md0 -a /dev/sda1
mdadm /dev/md1 -a /dev/sda2
mdadm /dev/md2 -a /dev/sda3

mdadm /dev/md0 -a /dev/sdc1
mdadm /dev/md1 -a /dev/sdc2
mdadm /dev/md2 -a /dev/sdc3

По окончании команда cat /proc/mdstat уже отображалась с [UUUU].

Если диски заменили новыми, то их нужно разбить аналогично установленным.
Пример разметки диска /dev/sdb аналогично /dev/sda с MBR:

sfdisk -d /dev/sda | sfdisk --force /dev/sdb

Пример разметки /dev/sdb с GTP и назначения диску случайного UUID:

sgdisk -R /dev/sdb /dev/sda
sgdisk -G /dev/sdb

Также на новоустановленный диск необходимо установить загрузчик:

grub-install --version
grub-install /dev/sdb
update-grub

Либо через меню grub (hd0 это /dev/sda, hd0,1 — /dev/sda2):

cat /boot/grub/device.map
grub
device (hd0) /dev/sda
root (hd0,1)
setup (hd0)
quit

Если установка grub выполняется из загрузочного диска, то нужно посмотреть список разделов и выполнить монтирование, например если RAID не используется:

ls /dev/[hsv]d[a-z]*[0-9]*
mount /dev/sda3 /mnt

Если используется программный RAID:

ls /dev/md*
mount /dev/md2 /mnt

Либо LVM:

ls /dev/mapper/*
mount /dev/mapper/vg0-root /mnt

И выполнить chroot:

chroot-prepare /mnt
chroot /mnt

После монтирования можно восстанавливать GRUB как я писал выше.

Смотрите также другие мои статьи:
Как я делал заявку в Hetzner на замену диска в рейде
Решение ошибки «md: kicking non-fresh sda1 from array»
Решение предупреждения «mismatch_cnt is not 0 on /dev/md*»
mdadm — утилита управления программными RAID массивами
Описание типов RAID
Диагностика HDD используя smartmontools
Восстановление GRUB Linux

Добавление диска к LVM

Допустим у нас уже настроен LVM, например как я описывал в этой статье — Настройка и использование LVM

Переключимся на root пользователя:

sudo -i

Если нет возможности горячей замены дисков, выключаем сервер, подключаем новый диск, включаем сервер и смотрим имя нового диска (в моем случае это /dev/sdd):

fdisk -l

Посмотрим существующие группы и сколько осталось свободного места:

vgdisplay

Посмотрим список физических томов:

pvdisplay

Приступаем к разметке нового диска:

fdisk /dev/sdd
n
p
1
Enter
Enter
t
8e
w

Теперь создадим физический том:

pvcreate /dev/sdd1

Посмотрим список логических томов:

lvdisplay

Расширим его добавив новый раздел (где ixnfo — группа томов):

vgextend ixnfo /dev/sdd1

Посмотреть список физических томов можно так:

pvscan

Посмотрим путь логического тома (в моем случае /dev/ixnfo/temp) и добавим новый раздел:

lvextend /dev/ixnfo/temp /dev/sdd1

Посмотрим размер смонтированного логического тома:

df -h

Так так размер не изменился, исправим это командой:

resize2fs /dev/ixnfo/temp

Готово.

Настройка и использование LVM

LVM (Logical Volume Management) Управление Логическими Томами, позволяет собрать несколько дисков и областей из дисков в один логический том и потом снова разбить как угодно.

PV (Physical Volume) — физический том (раздел или целый диск)
VG (Volume Group) — группа томов (единый диск собранный из физических томов)
LV (Logical Volume) — логические разделы

Переключимся на root пользователя:

sudo -i

Установим LVM если он еще не установлен (Ubuntu/Debian):

apt-get install lvm2

Посмотрим информацию о дисках:

fdisk -l

На тесте имею /dev/sda с системой и не размеченный /dev/sdb.

Сделаем физическим разделом весь /dev/sdb без разбивки на разделы:

pvcreate /dev/sdb

Посмотреть список физических томов можно командой:

pvdisplay

Создадим группу томов с именем ixnfo:

vgcreate ixnfo /dev/sdb

Удалить при необходимости можно так:

vgremove ixnfo

Пример просмотра существующих групп и сколько осталось свободного места:

vgdisplay

Для теста создадим логический том temp размером 100 мегабайт:

lvcreate -L100 -n temp ixnfo

Посмотреть список логических томов можно командой:

lvdisplay

Отформатируем его:

mkfs.ext4 -L temp /dev/ixnfo/temp

Создадим папку, смонтируем созданный том:

mkdir /mnt/temp
mount /dev/ixnfo/temp /mnt/temp

Отмонтировать можно так:

umount /mnt/temp/

Смотрите также:
Добавление диска к LVM
Управление разделами диска в Ubuntu используя fdisk

Как определить тип файла в Linux?

В Linux есть отличная встроенная утилита file, которая определяет тип файлов и много другой информации о файлах.

Допустим у нас есть файлы без расширения и чтобы посмотреть информацию о всех файлах в текущей директории выполним команду:

file *

Для конкретного файла:

file NAME

Сброс пароля администратора ABillS

Для сброса пароля администратора необходимо выполнить следующий SQL запрос в базу данных ABillS:

UPDATE admins SET password=ENCODE('NEW_PASSWORD', 'test12345678901234567890') WHERE aid=1;

Где test12345678901234567890 переменная $conf{secretkey} в файле /usr/abills/libexec/config.pl.

Настройка маскарадинга (NAT) в Ubuntu

Для примера выполню настройку маскарадинга IPv4 (NAT) на Ubuntu Server.
Сначала нужно включить поддержку пересылки пакетов в /etc/sysctl.conf, чтобы трафик мог ходить между разными сетевыми интерфейсами.
Проверим текущее состояние:

Читать далее «Настройка маскарадинга (NAT) в Ubuntu»

Обновление прошивки Kingston SSD

На тесте обновлю прошивку SSD накопителя Kingston SV300S37A 120Gb.

1) Скачаем официальную утилиту Kingston SSD Manager с обновлением встроенного ПО
http://www.kingston.com/ru/support/technical/downloads/90700

2) Запустим скачанную утилиту и если есть прошивка новее, то отобразится кнопка «Update to firmware …», её и нажмём для запуска процесса обновления, который будет длится несколько секунд.

Готово, смотри видео как это делал я:

Установка ISC DHCP для ABillS

Приведу пример установки ISC DHCP сервера для ABillS в Ubuntu Server.

Переключимся на root пользователя:

sudo -i

Установим пакет:

apt-get install isc-dhcp-server
ln -s /usr/abills/Abills/modules/Dhcphosts/leases2db.pl /usr/abills/libexec/leases2db.pl

Запускаем:

/usr/abills/libexec/leases2db.pl -d LEASES=/var/lib/dhcp/dhcpd.leases

Изменим владельца файла:

chown www-data /etc/dhcp/dhcpd.conf

Откроем config.pl в редакторе:

nano /usr/abills/libexec/config.pl

Добавим параметры:

$conf{DHCPHOSTS_CONFIG}='/etc/dhcp/dhcpd.conf';
$conf{DHCPHOSTS_LEASES}='/var/lib/dhcp/dhcpd.leases';
$conf{DHCPHOSTS_RECONFIGURE}='/usr/bin/sudo /etc/init.d/isc-dhcp-server restart';

Откроем в редакторе:

nano /etc/sudoers

Добавим строку сделав возможность запуска сервиса системой:

www-data   ALL = NOPASSWD: /etc/init.d/isc-dhcp-server

Заходим в веб интерфейс Abills, открываем меню «Настройка» — «IP (DHCP) Сети» — «IP (DHCP) Сети«, добавляем сети если необходимо, потом «Показать dhcp.conf, Переконфигурировать» и «Переконфигурировать«.

Посмотреть запущен ли isc-dhcp-server можно командой:

/etc/init.d/isc-dhcp-server status
netstat -tulpn | grep :67

Логи пишутся в файл /var/log/syslog

Можно также настроить экспорт DHCP истории, чтобы видеть её в меню «Отчёт» — «DHCP История».
Для этого сделаем ссылку:

ln -s /usr/abills/Abills/modules/Dhcphosts/dhcp_log2db.pl /usr/abills/libexec/dhcp_log2db.pl

Отделив DHCP логи в отдельный файл как я писал в статье ниже и добавив в автозагрузку скрипт с командой:

tail -F /var/log/dhcpd.log | /usr/abills/libexec/dhcp_log2db.pl

Смотрите также мои статьи:
Установка и настройка isc-dhcp-server в Ubuntu
Утилита для захвата и анализа пакетов tcpdump

Использование wipe в Linux

wipe — утилита для безопасного полного стирания информации.

Команда установки в Linux Ubuntu/Debian:

sudo apt-get install wipe

Опишу некоторые ключи запуска:
-f Отключение запросов подтверждения.
-r Рекурсивно. Удаляет все подкаталоги, символические ссылки не трогаются.
-c Если права каталога только для чтения, то будут изменены на запись.
-i Подробный информационный режим.
-s Тихий режим, большинство сообщений не выводятся.
-q Быстрый режим, директории перезаписываются случайными данными 4 раза.
-Q Количество циклов перезаписи. Стандартно 4.
-a Остановить выполнение при ошибке.
-R Установка случайного устройства.
-l Указание размера блока устройства, например при использовании дискет и т.д..
-D Следовать по символическим ссылкам, стандартно они не трогаются.
-v Отображение версии программы.
-h Отображение справки.

Читать далее «Использование wipe в Linux»