Raid 1 в Ubuntu из новых дисков
При загрузке компьютера BIOS заботливо сообщил что на одном из дисков у меня начались проблемы. При ближайшем осмотре оказалось что на нем начали появляться перемещенные сектора, и при лимите для нотификаций в 5 у меня их было уже больше 2000. Означало это, что одному из дисков начал приходить конец..
Модель умирающего диска Toshiba DT01ACA300 (3 TB) и отработал он без малого 25.500 часов, что при работе по 8-10 часов в день составляет ~7 лет. Для "домашнего" диска вполне себе прекрасный результат. Более того, данный диск был частью Raid 1, что означало что его довольно просто заменить на аналогичный, сделать снхронизацию и жить дальше.
Посмотрев на цены и немного подумав, я решил, что пожалуй второй диск всего скорее тоже рано или поздно начнет отказывать (тк покупал оба в одно время), и менять только один нет смысла. Решил купить новые, большего объема. Почитав отзывы и сопоставив цены купил Seagate Exos 7E8 (8TB) ST8000NM000A .
Как я выбирал диск
Тут можно долго дискутировать, но мой критерий выбора был: объем + характеристики + цена + отзывы.
С объемом понятно, чем больше тем лучше. Объем напрямую влияет на цену. Отзывы тоже понятно. Остановлюсь на характеристиках.
Основных характеристик несколько: скорость вращения, тип записи. Инфу можно найти на сайте производителя, в частности вот спека по моему диску.
- Модельный объем: 8 Тб
- Тип записи: CMR
- Скорость вращения: 7200 rpm
- Скорость чтения: до 250 МБ/с
- 2 млн часов работы
Я не буду вдаваться в подробности, но советую погуглилть и почитать чем отличается тип записи CMR от SMR и какие есть недостатки и преимущества. Я искал именно CMR. Если не можете найти тип у выбранного вами диска, то попробуйте поискать по serial number по следующей ссылке:
- https://nascompares.com/answer/list-of-wd-cmr-and-smr-hard-drives-hdd/
Нашел на амазоне, цена была 145 euro.
Поле того как диски прибыли я их установил и осталось только мигрировать данные.
Настройка нового Raid 1. Как делать НЕ надо.
В моем текущей конфигурации, все порты сата заняты. В связи с этим, мой план был следующий: вытаскиваю диски из системника, вставляю новые на их места. Создаю новый рейд. Временно убираю один из других дисков и на его место вставляю один из старых, монтирую его и копирую с него данные в новый рейд.
План казался довольно простой, плюс бекап данных не был проблемой, тк в теории старые данные все еще можно было вытянуть с любого из старых дисков.
Теория, теорией, но я решил сперва эту гипотезу проверить. А проверить я решил так: помечаю "хороший" диск из рейда как сбойный, убираю его из рейда, монтирую в другую папку и убеждаюсь, что могу там увидеть данные. Немного погуглив, я даже нашел похожий кейс вот тут
- https://askubuntu.com/questions/684453/remove-mdadm-raid1-without-loosing-data
Я отмонтировал рейд массив
1 2 3 |
# umount /dev/md0 |
затем пометил "хороший" диск как сбойный
1 2 3 4 |
# mdadm --fail /dev/md0 /dev/sda1 mdadm: set /dev/sda1 faulty in /dev/md0 |
и удалил его из массива
1 2 3 4 |
# mdadm --remove /dev/md0 /dev/sda1 mdadm: hot removed /dev/sda1 from /dev/md0 |
далее я попробовал примонтировать его, но получил ошибку
1 2 3 4 5 |
# mount -t auto /dev/sda1 /mnt/disk_a mount: /mnt/disk_a: unknown filesystem type 'linux_raid_member'. dmesg(1) may have more information after failed mount system call. |
Далее, осознав что примонтировать не получится, я попробовал вернуть диск в массив. Ведь в моем понимании данные должны были сохраниться идентичными.
К сожалению, теми способами которые я попробовал, я не смог этого добиться
1 2 3 4 5 6 7 8 |
# mdadm --assemble --force /dev/md0 /dev/sda1 mdadm: Found some drive for an array that is already active: /dev/md/0 mdadm: giving up. # mdadm --manage /dev/md0 --re-add /dev/sda1 mdadm: --re-add for /dev/sda1 to /dev/md0 is not possible |
В конечном итоге, я вернул диск обратно, вот так
1 2 3 4 5 6 7 8 9 10 |
# mdadm --manage /dev/md0 --add /dev/sda1 mdadm: added /dev/sda1 # cat /proc/mdstat Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sda1[2] sdb1[1] 2930133824 blocks super 1.2 [2/1] [_U] [>....................] recovery = 0.1% (4345216/2930133824) finish=546.8min speed=107509K/sec |
но это привело к синхронизации данных, которая заняла 10+ часов с выходящего из строя диска. Мне повезло и все закончилось хорошо.
Я предполагаю, что можно было монтировать диск не напрямую, а создать новый рейд из него, типа /dev/md1 и тогда бы все заработало, но наткнулся на описание этого процесса вот тут
- https://myrtana.sk/articles/how-to-modify-existing-software-raid1-md
И решил, что остановлюсь на этапе мема из этой статьи
Я решил больше не рисковать. Не хватало экспертизы в данной задумке, да и не было время на эксперименты.
Оставалось еще два варианта синхронизации
- Вариант 1. Длинный. Не проверенный.
- Убираем один "старый" диск из рейда.
- Подкидываем "новый" диск
- Ждем 8-10 часов пока синканутся данные
- Убираем второй "старый" диск из рейда
- Ждем 8-10 часов пока синканутся данные
- Далее с помощью бубна, гугла и магии, расширяем рейд до нового размера дисков
- Тут описан процесс, если у Вас бубен уже есть
- https://4admin.info/replacing-disks-mdadm-array-increasing-size-array/
- Вариант 2. Надо много места. Надежный
- Копируем все с рейда на сторонние диски
- Убираем старые диски и пока не трогаем их (чтоб в случае чего восстановить старый рейд)
- Подкидываем новые диски. Создаем спокойно новый рейд с нуля.
- Копируем старые данные со сторонних дисков обратно.
Я выбрал "Вариант 2", тк была возможность быстро разбросать данные по другим носителям.
Настройка нового Raid 1 с нуля
Cтавим mdadm
1 2 3 |
sudo apt-get install mdadm |
У меня уже он был установлен, поэтому я пропустил этот шаг.
Тк диски у меня пустые и одинаковые, то следующим шагом можно находить имена устройств
1 2 3 |
sudo fdisk -l |
и сразу собирать вот такой командой
1 2 3 |
sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda /dev/sdb |
Но, я бы рекомендовал пойти другим путем, а именно создать разделы немного меньшего размера, и после этого собирать рейд из разделов. Причина этого в том, что если в будущем один из дисков вылетит и мы захотим заменить его на диск другого производителя такого же объема, то есть вероятность того, что доступный объем будет отличаться, что приведет к проблемам. Честно сказать, сам я не сталкивался с подобным, но такое утверждение распространено и звучит логично и убедительно.
Я не стал страдать с командной строкой и сдела все через KDE Partition Manager, где это занимаеn пару кликов.
Находим диск и жмем "New Partition Table"
Выбираем GPT и [Create partition Table]
Получаем диск с таблицей разделов
Как видно диск у меня 7,28 ТБ, хотя маркетинговая цифра у диска 8 TB. Куда же делись (8 - 7,28) * 1024 = 737 Гб? Дело в том, что "8000.." это цифра в байтах, ну а кыждый следующий порядок объема измеряется измеряется не в 1000 значений, а в 1024. Вот и получается
1 2 3 4 |
8 . 000.000.000.000 /1024/1024/1024/1024 = 7.275957 TB GB MB KB Byte |
Вот и получается 7,28. Но, как я писал выше эти 7.28 получаются округлением десятков
1 2 3 |
7,2759 => 7,276 => 7.28 |
а это значит, что неплохо оставить небольшой запас. Кто-то рекомендует 10 мб, кто-то 100 мб. Я не жадный и диск, всего скорее, не заполнится до следующей замены на 100%, поэтому оставлю побольше. Итак, выбираем неразмеченную область и жмемь [New]
Я выровнял размер раздела до 7.630.500 мб, оставив 381.83 Мб, как резерв на случай замены диска при выходе из строя на диск другого производителя.
(!) В качестве файловой системы я по привычке выбрал ext4, но тк она перезатрется при создании рейда, думаю, это не имеет значения, те можно выбрать unformatted
Теперь тоже самое проделываю с другим диском, указывая тот же размер и жмем [Apply]. Ожидаем пока операции закончатся
После окончания смотри как называются разделы, через (fdisk -l) или там же в KDE Partition Manager. У меня это /dev/sda1 и /dev/sdb1 соответственно
Теперь создаем Raid 1
1 2 3 |
sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1 |
Нас попросят подтвердить операцию, после чего напишут что процесс создания начался
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1 mdadm: /dev/sda1 appears to contain an ext2fs file system size=7813632000K mtime=Thu Jan 1 01:00:00 1970 mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store '/boot' on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90 mdadm: /dev/sdb1 appears to contain an ext2fs file system size=7813632000K mtime=Thu Jan 1 01:00:00 1970 mdadm: size set to 7813499904K mdadm: automatically enabling write-intent bitmap on large array Continue creating array? Y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. |
Теперь надо "немного" подождать, в моем случае это 630 минут или около 10 часов 🙂 Узнать прогресс можно командой
1 2 3 4 5 6 7 8 9 10 11 |
$ sudo cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sdb1[1] sda1[0] 7813499904 blocks super 1.2 [2/2] [UU] [>....................] resync = 0.1% (13843968/7813499904) finish=630.7min speed=242536K/sec bitmap: 59/59 pages [236KB], 65536KB chunk unused devices: <none> |
Если хотите наблюдать за процессом, можете использовать утилиту watch с кол-вом секунд через которые будет выведен апдейт, например 60 секунд
1 2 3 |
$ sudo watch -n60 cat /proc/mdstat |
Иногда бывает, что скорость синхронизации намеренно ограничена, проверить это можно в 2х следующих файлах, но нас интересует с постфиксом "_max"
1 2 3 4 5 6 7 |
# cat /proc/sys/dev/raid/speed_limit_max 100000 # cat /proc/sys/dev/raid/speed_limit_min 1000 |
изменить можно попросту записав новое значение в этот файл, например так лимит будет установлен в 500 Мб/с, что гораздо выше возможностей HDD
1 2 3 |
echo "500000" > /proc/sys/dev/raid/speed_limit_max |
В моем, да и в любом "домашнем" случае можно верхнее значение увеличить до максимума, чтобы снять ограничения. В промышленных системах, это используется для ограничения нагрузки на часть рейд массива с которой идет чтение, чтобы зависящие сервисы (например веб-сайты) продолжали работать.
Более расширенную иформацию можно получить вот так
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
$ sudo mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Tue Jul 25 19:29:05 2023 Raid Level : raid1 Array Size : 7813499904 (7.28 TiB 8.00 TB) Used Dev Size : 7813499904 (7.28 TiB 8.00 TB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Tue Jul 25 19:44:04 2023 State : clean, resyncing Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Consistency Policy : bitmap Resync Status : 2% complete Name : homenet100:0 (local to host homenet100) UUID : 2664905c:2331ea6e:714243e0:9e4fa753 Events : 180 Number Major Minor RaidDevice State 0 8 1 0 active sync /dev/sda1 1 8 17 1 active sync /dev/sdb1 |
Тут тоже видим, что идет синхронизация и надо ждать "Resync Status : 2% complete"
После того как синхронизация будет завершена, нужно отформатировать массив, для этого выполняем
1 2 3 |
sudo mkfs.ext4 /dev/md0 |
Далее нужно сгенерировать и добавить конфиг в mdadm.conf чтобы в случае рассинхрона, диски автоматически синхронизировались.
Делаем бекап
1 2 3 |
sudo cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.bak |
Генерируем конфиг
1 2 3 4 5 6 |
$ sudo mdadm --detail --scan ARRAY /dev/md0 level=raid1 num-devices=2 metadata=1.2 name=homenet100:0 UUID=2664905c:2331ea6e:714243e0:9e4fa753 devices=/dev/sda1,/dev/sdb1 |
1 2 3 |
и получившуюся строку вставляем в файл конфига /etc/mdadm/mdadm.conf или одной командой
1 2 3 |
sudo mdadm --detail --scan --verbose | sudo tee -a /etc/mdadm/mdadm.conf |
Осталось создать точку монтирования и примонтировать туда новый диск. Обычно диски монтируют в папку/mnt/, но в моем случае мне удобнее примонтировать раздел в корень. Создаем папку
1 2 3 |
sudo mkdir /store |
далее берем UUID диска (обратите внимание, что это НЕ uuid из команды mdstat -D)
1 2 3 4 5 6 7 |
sudo file -s /dev/md0 /dev/md0: Linux rev 1.0 ext4 filesystem data, UUID=6f173a57-1845-47ca-95b7-8cc8d232f6f4 (extents) (64bit) (large files) (huge files) # так же можно использовать blkid sudo blkid /dev/md0 |
и добавляем его в fstab
1 2 3 4 5 6 |
$ sudo nano /etc/fstab # /dev/mdo => /store UUID=6f173a57-1845-47ca-95b7-8cc8d232f6f4 /store ext4 defaults 0 2 |
Перезагружаемся и проверяем.
Последним штрихом, даем права на запись на диск для текущего или всех пользователей. В моем случае, у меня одна учетка, поэтому достаточно сделать себя владельцем
1 2 3 4 |
$ sudo chown -R vo:vo /store $ chmod -R 0755 /store |
Теперь нужно только скопировать все файлы назад.
Выводы
- Бекап, бекап и еще раз бекап.
- Если вы придумали гениальный план по миграции, и даже нашли подтверждение в интернете, что он должен сработать, все равно сделайте в начале бекап.
- Если есть время и ресурсы, сделайте рейд из маленьких дисков (например на флешке разделы по 5мб) и проверьте как ваша теория будет работать.
- Если у вас такая же как ситуация с переездом на новые диски и есть свободные sata порты, то проще всего создать новый массив с нуля и скопировать данные со старого рейд массива напрямую. Если такой возможности нет, то разбросайте данные на другие носители (внешние жесткие диски, ноут, etc) и оставьте диски из оргинального рейда до полного восстановления данных на новый рейд с этих носителей.
Author: | Tags: /
| Rating:
Leave a Reply