Найти тему
Владимир Носков

FreeBSD. Замена HDD на SSD.

Несколько статей о FreeBSD

Доброго времени суток, соратник!

Сразу оговорюсь, что речь идёт о самой простой конфигурации обычного домашнего компьютера и вообще не идёт о серверных вариантах организации дисковых хранилищ - там замена осуществляется элементарно - вынул сбойный диск - засунул новый в корзину.

В любом современном компьютере есть, как говорят в просторечии "память".

Память - это то, что, как понятно нечто, что что-то помнит - в компьютере содержит данные. Типов памяти в компьютере много, но в общем можно подразделить на два вида "оперативная" и "долговременная". До недавнего времени основным устройством долговременного хранения данных был HDD - hard disc drive, HDD или точнее hard magnetic disk drive, HMDD. В русском варианте НЖМД - накопитель на жёстких магнитных дисках. В основе элемента хранения данных HDD вращающийся (механический) жёсткий диск покрытый магнитным, иногда оптическим или магнито-оптическим материалом.

В наше время HDD - не единственное устройство долговременного хранения данных. Появились устройства (они были и раньше, но малоёмкие, буквально на килобайты) без механической части - на основе полупроводниковых структур - то, что ещё называется флэш-память. Типов "полупроводниковой" памяти, вообще говоря, много, но то, что заменяет в компе HDD в полупроводниковом варианте, называется: Solid-State Drive, SSD - твёрдо-тельный диск.

SSD по скорости доступа в разы быстрее HDD, даже использующие общий с HDD интерфейс SATA. SSD, имеющие интерфейс NVME ещё быстрее, что даёт больший общий прирост производительности - при доступе к данным в десятки раз.

Сейчас приемлемый объём SSD (моё мнение это от 512Гб) уже не настолько поражает воображение своей ценой, как ещё несколько лет назад. Цена, хоть и больше, чем на HDD, но уже вполне сопоставимы на тот же объём ёмкости что и HDD (на очень большие - от нескольких Тб - цена отличается в разы - на очень больших объёмах выгоднее пока HDD). Объёмы в 512-1024Гб вполне доступны по цене.

Раньше так же была проблема долговечности таких носителей, но и тут вопрос уже стал не так актуален и критичен - долговечность SSD вполне укладывается в сравнимые с HDD параметры. Поэтому менять HDD на SSD вполне оправдано и в обычных домашних системах.

Как же элегантно заменить HDD на SSD?

Это действительно настолько просто, что действительно элегантно. При соблюдении определённых изначальных условий, конечно. Главное из них это файловая система zfs.

Этаак:

Есть: система с двумя жёсткими дисками, которые представляют собой массив данных в виде zpool zfs типа mirror "зеркало" - то есть два диска, которые имеют одинаковый размер и набор данных, что в случае выхода одного из них из строя - система продолжит работать и потери данных не произойдёт. Да, объём одного диска в этом случае теряется, но тут уж, что важнее - данные или их количество. Для меня критичнее безотказность системы - важные данные в моём случае на NAS (c параноидальным RAID radidz2), который фактически построен на стареньком сервере с большой корзиной для дисков общим объёмом почти 10Тб.

Чуть не забыл... HDD SATA в FreeBSD системе это устройство adaX, где X циферка порта подключения 0, 1 и т.д. SSD - nvdX. Соответственно ada0p4 и типа того это "4-тый раздел 0-диска диска ada... ".

Таким образом, в моей домашней системе были заменены диски в zfs mirror pool - HDD (2шт.) на SSD NVME (2шт.).

Начальная ситуация:

# zpool list -v

NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT

zpool0 464G 151G 321G - - 21% 32% 1.00x ONLINE -

mirror-0 464G 151G 321G - - 21% 32.0% - ONLINE

ada0p4 - - - - - - - - ONLINE

ada1p4 - - - - - - - - ONLINE

Размечаем SSD на разделы...

# gpart create -s gpt nvd0

# gpart add -a 4k -t efi -s 200M -l efi0 nvd0

# gpart add -a 4k -t freebsd-boot -s 512K -l boot0 nvd0

# gpart add -a 4k -t freebsd-zfs -l zfs0 nvd0

Записываем загрузчик на второй раздел:

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 2 nvd0

так же повторяем для второго диска не забывая менять "0" на "1" в командах:

# gpart create -s gpt nvd1

# gpart add -a 4k -t efi -s 200M -l efi1 nvd1

...

и т.д.

Есть ньюанс ... команда gpart add -a 4k -t efi -s 200M -l efi0 nvd0 автоматически форматирует (как ни странно в FAT32) и помещает в efi область uefi-загрузчик, но... почему-то для nvd0p1 делает, а для nvd1p1 - нет. Поэтому делаем небольшой хак. Но загрузчик там помещён несколько простоватый :)... Есть лучше.

Так как файловая система там FAT32 автоматически, то монтируем её и записываем туда нужное вручную, предварительно создав каталог в /boot:

# mkdir /boot/efi0 ; mkdir /boot/efi1

# mount -t msdosfs /dev/nvd0p1 /boot/efi0

# mkdir -p /boot/efi0/efi/boot

# mkdir -p /boot/efi0/efi/freebsd/

Этих загрузчиков в /boot несколько:

loader.efi

loader_4th.efi

loader_lua.efi    

loader_simp.efi

можно выбрать любой - отличаются картинками при загрузке.

Копируем:

# cp /boot/loader.efi /boot/efi0/efi/boot/bootx64.efi

# cp /boot/loader.efi /boot/efi0/efi/freebsd/loader.efi

А вот для второго диска просто продублируем этот раздел с первого на второй:

# dd if=/dev/nvd0p1 of=/dev/nvd1p1 bs=1M

Проверим, что там:

# mount -t msdosfs /dev/nvd1p1 /boot/efi1

# ls -1R /boot/efi1/

efi

/boot/efi1/efi:

boot

freebsd

/boot/efi1/efi/boot:

bootx64.efi

/boot/efi1/efi/freebsd:

loader.efi

Всё что нужно.

Ну и то самое шикарное и элегантное в zfs:

Делаем операцию замены:

# zpool replaсe zpool0 ada0p4 nvd0p4

ждём завершения и наблюдаем:

# zpool status -v 1

затем:

# zpool replaсe zpool0 ada1p4 nvd1p4

# zpool list -v

NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT

zpool0 464G 151G 321G - - 21% 32% 1.00x ONLINE -

mirror-0 464G 151G 321G - - 21% 32.0% - ONLINE

nvd0p4 - - - - - - - - ONLINE

nvd1p4 - - - - - - - - ONLINE

Во время процедуры и после завершения замены система полностью остаётся работоспособной и доступной. Разве, что слегка притормаживает - всё-таки данные гоняются в системе активно и иногда ощущается притормаживание, например в браузинге.

Да... есть небольшой нюанс... Разделы для zfs у SSD получились на 10Гб больше тех, что на HDD - это не хорошо они "пропадут" за зря. Так как имеющийся пул имеет размер 464Gb. Поэтому надо скорректировать размер пула.

# zpool set autoexpand=on zpool0

# zpool online -e zpool0 nvd0p4

# zpool online -e zpool0 nvd1p4

# zpool list -v

NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT

zpool0 474G 151G 331G - - 21% 32% 1.00x ONLINE -

mirror-0 474G 151G 331G - - 21% 32.0% - ONLINE

nvd0p4 - - - - - - - - ONLINE

nvd1p4 - - - - - - - - ONLINE

Получаем увеличение на 10Гб - было 464 стало 474 прибавилось и свободное место 321 -> 331. (Потеряшка нашёлся).

Есть ещё некоторая проблема - фрагментация 21% ... это много. Но к сожалению (пока?) zfs не имеет возможности дефрагментироваться... Её можно устранить только создавая новый пул и перенося данные на новый.

Говорят работают над проблемой, но пока решения нет. Но... хочу обрадовать, что для SSD проблема фрагментации фактически ... не существует - она критична для HDD, где скорость получения или записи данных, определяется механической частью "диск-головка" и для механических систем время позиционирования довольно велико и поэтому при большой фрагментации файлов головке чтения-записи диска надо постоянно перемещаться и соответствующим образом позиционироваться по "дорожкам и секторам" в поисках фрагментов искомого файла или свободного места (фрагментация именно свободного пространства очень неприятный момент при записи/удалении больших файлов). В SSD же такой проблемы нет - ввиду отсутствия, как вращающегося диска, так и перемещающейся головки - скорость получения данных в общем определяется скоростью распространения сигналов по проводникам кристалла памяти, а это фактически в идеальном варианте может быть скорость света :), но конечно это не так: делаем поправку на скорость работы системы "кодирования/управления" - поэтому на уровень фрагментации в случае SSD обращать внимания не стоит, наверное пока мы не выйдем на ёмкости порядка эксабайт и больше, но это будет оооочень не скоро.

Так... Выключаем систему:

# poweroff

Отключаем физически все уже ненужные HDD (у меня они пойдут в NAS).

В BIOS выставляем правильные параметры загрузки и прочее нужное.

Загружаемся в обновлённую систему...

Однако... OS взлетает фактически как "вжиииик и всё" :)... Время не замерял, но точно в разы быстрее HDD. По ощущениям "раз в пять"...

Если на "HDD" можно вдумчиво лицезреть лог загрузки, а на FreeBSD это просто обязательное занятие - видеть, как и, что там инициализируется и подгружается (можно, конечно, отключить и поставить обои какие-нито, но зачем? Это ж не тру :)). С SSD же это занятие становится не таким интересным - ничего не успеваешь прочитать - всё улетает вверх и вот тебе логин (в текстовую консоль или графическую) - разве, что при ошибке остановится... и притормаживает на командах инициализации сети и запроса синхронизации времени от внешнего сервера, что понятно от SSD не зависит.

Так. Загрузилось. Логинимся. Логин и загрузка Plasma 5 сек, а не минута+, как раньше. Осматриваемся... Все данные на месте... Запуск браузера... практически мгновенно и так в общем всё остальное. Кстати, в zfs есть ещё одно свойство - при работе драйвер zfs анализирует наиболее часто используемые системой и пользователями файлы и осуществляет так называемый prefetch data - zfs драйвер по своему интеллектуальному пониманию загружает данные в зависимости от того, чем ваша программа пользовалась до этого или собирается пользоваться, например, считали часть данных из файла, то логично, что и остальное будете читать - а система уже подгрузит всё остальное до того, как реально эти данные понадобятся - насколько там интеллектуальность высокая (нет не высокая) - понадобятся не понадобятся - повезёт понадобятся, а нет будут выкинуты.

Процедура замены дисков может быть довольно длительной, в зависимости от конкретной конфигурации и количества данных на вашей системе. У меня это заняло около трёх часов на всё - это возня с системником под столом и +борьбу с любопытным котом, который норовил залезть в системник... примерно полчаса на копирование важных данных на домашний NAS (ибо!) и собственно операция zpool replace дисков в zpool примерно около часа на каждый диск.

Кстати, если ваша система поддерживает Hot-plug работу с дисками, то систему вообще не надо было бы перезагружать. Но так, как NVME такого не позволяют, то не получилось без перезагрузки (одно из кредо FreeBSD - "работать, работать, работать и не перегружаться никогда"... это в общем возможно... :). А вот если бы была замена HDD на HDD или SSD c интерфейсом SATA, то получилось бы...

Да, наверное, важное замечание...

Установленные мной SSD "безбуфферные" (точнее очень малобуфферизованные всего 64Мб, как в HDD) потому при больших потоках проседают изрядно, но всё равно они быстрее HDD при прочих равных. А так, как в основном на моём компе - это "тупить в инете" и редко обрабатывать музон (для DAT-магнитофона) и корежить изредка видео, компилить всякое, то этого хватит за глаза. Для хранения всего есть NAS - там ~10Тб... По гигабиту ethernet на nfs считай, что, как с HDD почти :).

Буфферизованные SSD, конечно, зело хорошо: быстро, более надёжно (за счёт меньшего количества обращений к ячейкам, долговечность всё ещё зависит от технологии ячеек, но тут отдельный разговор), есть более расширенная диагностика. Но при бытовом, которое может быть даже вполне профессиональным, в общем не сильна будет видна разница. Всё-таки интенсивность обращений не такая огромная, как в серверах или высоконагруженных рабочих станциях - там "гражданские" буфферизованные тоже, может так случиться, не долго протянут, если это не специализированные SSD. Да и нужно понимать, что "наработка на отказ" это вероятностный процесс... может случиться прямо сейчас, а может не случиться никогда. А вот о цене устройства этого не скажешь - цена есть тут и прямо сейчас.

Таким образом: для домашней системы получилось вполне хорошо и более чем.

Как-то так. FreeBSD форева.

Что почём:

Два диска SSD обошлись в 3700р. SSD 512Гб.

Поймал момент на али (наши барыги накручивают oт100%) - бакс изрядно падал. Сейчас такие же ~4800, когда начал отслеживать было и 6700.

Теперь вот только сижу и думаю... А зачем оно мне было надо... Вроде и раньше норм всё работало... При 32Гб памяти кешировалось всё и вся, а что долго грузилось, так оно и особо не парило: пришёл, включил, пока переоделся, чайник включил, котеек утешил своим присутствием (их два кот весь чёрный и кошечка вся беленькая), оно уже загружено и готово... Но так-то оно (с SSD) лучше да... Надеюсь проработают, хвала Великому Коннектию, долго...

Удачи.

Кошечка белая
Кошечка белая
Чёрный кот. То самое, когда "Если долго смотреть во тьму - тьма посмотрит на тебя".
Чёрный кот. То самое, когда "Если долго смотреть во тьму - тьма посмотрит на тебя".
Собственно герой опуса. SSD NVME 512Gb.
Собственно герой опуса. SSD NVME 512Gb.

П.С.: Заменить HDD на SSD можно и в типе пула stripe или в любой ситуации, когда по какой-либо причине у вас не zfs. В каком-то смысле всё ещё проще: загружаетесь с USB - LiveOS и всего одна команда повторенная два раза и копирование может быть одновременным сразу для обоих дисков источников и дисков реципиентов:

# dd if=/dev/ada0 of=/dev/nvd0 bs=1024M & ; dd if=/dev/ada1 of=/dev/nvd1 bs=1024M & ; gstat -p

и наблюдаем несколько часов :)...

Остальное далее так же... за исключением того, что всё будет, в зависимости от размера дисков, ооочень долго... полагаю будет часов 5-7... можно ставить на ночь и спать.

Кстати, этот способ работает, что очевидно, для любых дисков - ведь производится побитовое копирование носителей, для любой установленной на дисках ОС. Ограничения, конечно есть, но в данном случае не имеют значения.

П.С2.: Редактор в Дзене жуть... ВК делайте что-нибудь. Что-то с форматированием текста и вставку кода прог тоже... Невозможно. Очень нервически редактировать тут.