Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Файловая система —> gmirror

Создание зеракала gmirror с разбивкой gpart и использованием меток glabel

Автор: lissyara.


Жил был сервер, с одним диском. Недолго, месяца два =) Потом как-то "резко" стал важным звеном инфраструктуры, и, соответственно, кроме бэкапирования было решено доткнуть второй диск и сделать зеркало - программное, т.к. контроллер в нём ставить банально некуда (это HP ProLiant MicroServer, и все PCI разъёмы в нём уже заняты сетевухами).

Вполне естественно, что куда-то ехать и что-то делать лениво, поэтому диск дотыкают специально обученные люди, ну а я из дома делаю зеркало. Наличия ssh на сервер вполне достаточно.

Итого, после дотыкания диска имеем:
bsd1$ dmesg -a | grep ada
ada0 at ahcich0 bus 0 scbus0 target 0 lun 0
ada0: <VB0250EAVER HPG9> ATA-8 SATA 2.x device
ada0: Serial Number Z3TR4KJ3
ada0: 300.000MB/s transfers (SATA 2.x, UDMA5, PIO 8192bytes)
ada0: Command Queueing enabled
ada0: 238475MB (488397168 512 byte sectors: 16H 63S/T 16383C)
ada0: Previously was known as ad4
ada1 at ahcich1 bus 0 scbus1 target 0 lun 0
ada1: <VB0250EAVER HPG9> ATA-8 SATA 2.x device
ada1: Serial Number Z3TSPMND
ada1: 300.000MB/s transfers (SATA 2.x, UDMA5, PIO 8192bytes)
ada1: Command Queueing enabled
ada1: 238475MB (488397168 512 byte sectors: 16H 63S/T 16383C)
ada1: Previously was known as ad6
bsd1$ uname -a
FreeBSD bsd1.XXXX.ru 10.0-RELEASE FreeBSD 10.0-RELEASE #0 r260789: Thu Jan 16
 22:34:59 UTC 2014 root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
bsd1$ 

ada0 - на нём живёт система, ada1 - доткнули. Выглядит это таким образом:
bsd1$ df -h
Filesystem           Size    Used   Avail Capacity  Mounted on
/dev/ada0p2          222G    2,2G    202G     1%    /
devfs                1,0K    1,0K      0B   100%    /dev
linprocfs            4,0K    4,0K      0B   100%    /proc
tmpfs                5,3G    4,0K    5,3G     0%    /tmp

Прописываем загрузку модуля geom_mirror в /boot/loader.conf
bsd1$ grep mirror /boot/loader.conf
geom_mirror_load="YES"
bsd1$ 

Перезагружаем машину, проверяем загрузился ли модуль:
bsd1$ kldstat | grep mirr
 4    1 0xffffffff818be000 23288    geom_mirror.ko
bsd1$ 

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

Итак, создаём зеркало из одного второго диска, первый в него доткнём потом:
bsd1$ gmirror label -v -b round-robin gm0 /dev/ada1
Metadata value stored on /dev/ada1.
Done.
bsd1$ 

Бэкапим таблицу разделов с первого диска, и, разворачиваем её на созданное зеркало:
bsd1$ gpart backup ada0 > /tmp/gpart.txt
bsd1$ gpart restore mirror/gm0 < /tmp/gpart.txt

Записываем загрузчик:
bsd1$ gpart bootcode -b /boot/pmbr mirror/gm0
bootcode written to mirror/gm0
bsd1$ gpart bootcode -p /boot/gptboot -i 1 mirror/gm0

Создаём файловую систему:
bsd1$ newfs -U /dev/mirror/gm0p2

Также, прибиваем метки к разделам - всё таки по меткам работать удобней, нежели по названиям дисков:
bsd1$ glabel label rootFS /dev/mirror/gm0p2
bsd1$ glabel label swapFS /dev/mirror/gm0p3

Монтируем раздел зеркала, переносим содержимое файловой системы:
bsd1$ mount /dev/label/rootFS /mnt
bsd1$ tar --one-file-system --create --file=- / | (cd /mnt; tar -xvf -)

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

После переноса, правим новый и старый fstab до такого состояния:
bsd1$ cat /mnt/etc/fstab 
# Device                Mountpoint      FStype  Options Dump    Pass#
/dev/label/rootFS       /               ufs     rw      1       1
/dev/label/swapFS       none            swap    sw      0       0
linprocfs               /proc           linprocfs rw    0       0
tmpfs                   /tmp            tmpfs   rw,nosuid,noexec 0 0
bsd1$
bsd1$ cp -p /mnt/etc/fstab /etc/fstab

(можно было поправить один, до переноса. Но - я об этом подумал уже после =)) и перезагружаем машину.

При перезагрузке происходит следующий фокус: загрузка начинается с диска ada0 - который не в зеркале. С него грузится ядро, запускается... Доходит до монтирования файловых систем и монтирует файловую систему с зеркала - которое пока стоит из одного диска ada1. Итого, после перезагрузки получаем такое:
bsd1$ df -h
Filesystem           Size    Used   Avail Capacity  Mounted on
/dev/label/rootFS    222G    2,2G    202G     1%    /
devfs                1,0K    1,0K      0B   100%    /dev
linprocfs            4,0K    4,0K      0B   100%    /proc
tmpfs                5,3G    4,0K    5,3G     0%    /tmp
bsd1$
bsd1$ swapinfo 
Device          1K-blocks     Used    Avail Capacity
/dev/label/swapFS   4074644        0  4074644     0%
bsd1$ 

Втыкаем в зеркало второй диск:
bsd1$ gmirror insert gm0 ada0
bsd1$ gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada1 (ACTIVE)
                      ada0 (SYNCHRONIZING, 0%)

Процесс прошёл. Ввиду того что рейд софтверный, скорость синхронизации можно посмотреть обычными методами:
bsd1$ iostat -w 1
       tty            ada0             ada1            pass0             cpu
 tin  tout  KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s  us ni sy in id
   0    29 126.12 549 67.62  126.97 546 67.74   0.33   0  0.00   0  0  1  1 98
   0   236 126.75 613 75.88  128.00 608 76.00   0.00   0  0.00   0  0  2  0 97
   0    76 126.81 616 76.29  128.00 611 76.41   0.00   0  0.00   0  0  1  0 99
   0    80 126.83 652 80.72  128.00 645 80.59   0.00   0  0.00   0  0  2  0 98
   0    80 126.72 598 74.05  128.00 592 74.05   0.00   0  0.00   0  0  1  0 99
   0    80 126.63 650 80.42  128.00 644 80.54   0.00   0  0.00   0  0  2  1 97
   0    80 126.79 633 78.35  128.00 626 78.22   0.00   0  0.00   0  0  2  1 97
^C
bsd1$ 

Через 50 минут - всё готово:
bsd1$ gmirror status
      Name    Status  Components
mirror/gm0  COMPLETE  ada1 (ACTIVE)
                      ada0 (ACTIVE)
bsd1$ 

В лог событий также пишутся сообщения о статусе зеркала:
bsd1$ tail -5 /var/log/messages
Jul 27 19:26:00 bsd1 newsyslog[1647]: logfile turned over due to size>100K
Jul 27 19:27:01 bsd1 kernel: GEOM_MIRROR: Device gm0: rebuilding provider ada0.
Jul 27 20:18:18 bsd1 kernel: GEOM_MIRROR: Device gm0: rebuilding provider ada0
 finished.
bsd1$ 



размещено: 2014-07-27,
последнее обновление: 2014-07-27,
автор: lissyara


alex, 2014-07-28 в 9:34:56

> tar --one-file-system --create --file=- / | (cd /mnt; tar -xvf -)
dump -a0Lf- ... | restore -rf- ... не нравится?

Alex Keda, 2014-07-28 в 10:55:44

Нет. пару раз оно у меня "залипало". А с tar проблем никогда не было. Разве что --one-file-system забудешь =))

alex, 2014-07-28 в 14:23:45

"залипало" это как? Любопытно очень...
У меня с 2007 (тьфу тьфу тьфу) с dump - restore не было проблем, даже пару раз пользовался копиями после смерти hdd. Причем копии делались и вручную, и по планировщику на др. сервере по ssh.

Alex Keda, 2014-07-28 в 14:38:28

именно "залипало" - очущение будто к устройству типа /dev/zero прицепилось и с концами...
--
плюс, несколько раз сервер при его работе падал в панику. чаще всего с файловой системой на gjournal. лечится принудительным тестированием файловой системы, но, как говорится, осадочек остаётся...
--
в общем, я пересел на tar, все проблемы кончились, кроме вариантов когда на нечеканой файловой системе его запускаешь - тоже вплоть до паники может быть. но, в любом случае, реже чем dump/restore

alex, 2014-07-28 в 15:43:20

ясно, ну я пока что с таким не сталкивался, видимо, масштабы не те :-)
А с tar в самом-самом начале общения с unix-like системами бэкап не понравился (причем сам виноват, ман невнимательно прочитал в части --numeric-owner --uname --gname, лень было, с именами пользователей или id напортачил в итоге), так дампом и пользуюсь.
А вообще шкурка-то (софтовый массив) выделки стоила? Довольны остались?

Alex Keda, 2014-07-28 в 15:50:25

работает. просто работает =))
предыдущая версия статьи: http://www.lissyara.su/archive/gmirror/ сервер с которого статья писалась до сих пор работает. за почти 8 лет пару раз вручную запускал сборку, после того как питание особо жёстко дёргали и всё.
даже диски до сих пор работают =))

alex, 2014-07-28 в 16:17:14

ну раз оба диска работают, значит, случая оценить mirror еще не было :-D
Спасибо за статью Да и за сайт вообще: толковая информация, простое, но удобное оформление сайта, минимум рекламы!

Alex Keda, 2014-07-28 в 16:28:19

Было когда и ломались. На других серверах. Просто менял на новый и ручками втыкал. Записать как-то не догадался...
--
блин, сайт был вообще без рекламы. задрали вопросами - почему нет рекламы. необычно это выглядит в современном интернете. пришлось повесить, чтоб остали. серьёзно.

andy, 2014-10-03 в 15:31:39

Это в Москоме такие финты ушами?

Alex Keda, 2014-10-03 в 15:33:28

Не. У нас микросерверов нету. у нас не меньше юнита =))

andy, 2014-10-06 в 16:33:42

Вы в облако еще не перешли?

Alex Keda, 2014-10-06 в 17:41:13

ф топку =)

Неоригинально, 2014-12-22 в 12:54:31

Неоригинально. И заколебали уже :)

SergeySL, 2015-07-13 в 12:13:42

А что показывают gpart show и gpart status на таких зеркалах? CORRUPT?

bomich, 2017-08-13 в 20:15:56

root@zz:/usr/home/zz # gpart status
           Name  Status  Components
mirror/sysraidp1      OK  mirror/sysraid
mirror/sysraidp2      OK  mirror/sysraid
mirror/sysraidp3      OK  mirror/sysraid
root@zz:/usr/home/zz # gpart show
=>        34  1953525100  mirror/sysraid  GPT  (931G)
         34           6                  - free -  (3.0k)
         40         128               1  freebsd-boot  (64k)
        168         344                  - free -  (172k)
        512     8388608               2  freebsd-swap  (4.0G)
    8389120  1944059904               3  freebsd-ufs  (927G)
 1952449024     1076110                  - free -  (525M)

SergeySL, 2017-08-13 в 23:00:56

2 года спустя :)
У меня была проблема с кривым контроллером дисков на тестовом компе. А. Елсуков помог во всем разобраться, после этого тоже везде OK.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0458 секунд
Из них PHP: 34%; SQL: 66%; Число SQL-запросов: 77 шт.
Исходный размер: 44032; Сжатая: 9509