2010-03-29

FreeBSD mbr->gpt. Миграция с одного диска на другой

На одной халтуре начал загибацца диск, или шлейф дырявый был. В общем не знаю, при первых таймаутах на запись диска было срочно принято решение мигрировать на другой диск. Машина была старая, решили поменять на новую. В процессе мы перепишем fstab на старой машине для безпроблемной загрузки на новой, и, собственно, перенесем данные с одного винта на другой, нарезав его на желаемые разделы. Поехали (пишу по памяти, возможны неточности)

# 1. На существующей машине поправим fstab для загрузки по ufsid (т.к. на второй машине есть винт, и фиг знает кто пойдет первый, sata или ide)
# ufsid можно посмотреть командой dumpfs _mount_point | head -2
[root@gw1 ~]# mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1e on /tmp (ufs, local, soft-updates)
/dev/ad0s1f on /usr (ufs, local, soft-updates)
/dev/ad0s1d on /var (ufs, local, soft-updates)
[root@gw1 ~]# dumpfs / | head -2
magic   19540119 (UFS2) time    Wed Feb 24 11:49:23 2010
superblock location     65536   id      [ 4baa0c99 45991624 ]
[root@gw1 ~]#
# Собственно эти метки прописываем в fstab, это позволит беспроблемно загрузиться на другой машине
# Единственный вопрос - swap. На нём нет fs, поэтому сделаем метку вручную через glabel
[root@gw1 ~]# sysctl kern.geom.debugflags=16
kern.geom.debugflags: 0 -> 16
[root@gw1 ~]# glabel label swap /dev/ad0s1b
[root@gw1 ~]# swapinfo
Device          1K-blocks     Used    Avail Capacity
/dev/ad0s1b        524288        0   524288     0%
[root@gw1 ~]# swapoff -a
swapoff: removing /dev/ad0s1b as swap device
[root@gw1 ~]# glabel status
      Name  Status  Components
label/swap     N/A  ad0s1b
# Ага, есть метки. Приводим fstab к нужному виду
[root@gw1 ~]# cat /etc/fstab
# Device                        Mountpoint      FStype  Options         Dump    Pass#
/dev/label/swap                 none            swap    sw              0       0
/dev/ufsid/4baa0c9945991624     /               ufs     rw              1       1
/dev/ufsid/4baa0ca057f22ea0     /tmp            ufs     rw              2       2
/dev/ufsid/4baa0ca2a832fcc5     /usr            ufs     rw              2       2
/dev/ufsid/4baa0ca724335a95     /var            ufs     rw              2       2
[root@gw1 ~]#
# В общем все, винт готов к вставке в другую машину. В моему случае проблем не было вообще, 
# т.к. вместе с винтом в новую машину переехали две 3com сетевухи, и не нужно было прописывать 
# сетевые настройки на новой машине.
# FreeBSD загрузилась на новой машине, смотрим винты
[root@gw1 ~]# # ls -l /dev/ad*
crw-r-----  1 root  operator    0,  67 Mar 29 11:53 /dev/ad0
crw-r-----  1 root  operator    0,  68 Mar 29 11:53 /dev/ad0s1
crw-r-----  1 root  operator    0,  69 Mar 29 15:53 /dev/ad0s1a
crw-r-----  1 root  operator    0,  70 Mar 29 15:53 /dev/ad0s1b
crw-r-----  1 root  operator    0,  71 Mar 29 11:53 /dev/ad0s1c
crw-r-----  1 root  operator    0,  72 Mar 29 15:53 /dev/ad0s1d
crw-r-----  1 root  operator    0,  73 Mar 29 15:53 /dev/ad0s1e
crw-r-----  1 root  operator    0,  78 Mar 29 11:53 /dev/ad4
# Ага, нужный винт появился. Надо его нарезать на разделы (Этот диск в виртуалке, размер реального винта был 120 гигов)
[root@gw1 ~]# gpt show ad4
     start      size  index  contents
         0  16777216
[root@gw1 ~]# gpt create -f ad4 # -f - затереть mbr, если есть.
[root@gw1 ~]# gpt show ad4
     start      size  index  contents
         0         1         PMBR
         1         1         Pri GPT header
         2        32         Pri GPT table
        34  16777149
  16777183        32         Sec GPT table
  16777215         1         Sec GPT header
# Установим загрузчик
[root@gw1 ~]# gpt boot ad4
# Нарезаем разделы (-s размер раздела в секторах. Сектор hdd 512 байт. (2Gb * 1024^3) / 512 = 4194304
# Под корень
[root@gw1 ~]# gpt add -s 4194304 -t ufs ad4
# Аналогично для других разделов с соответствующими разделами. Для swap меняем -t на swap. 
# Результаты в удобном виде можно посмотреть командой gpart show
# Чисто как пример (это с виртуалки)
[root@gw1 ~]# gpart show
=>      34  16777149  ad1  GPT  (8.0G)
        34       128    1  freebsd-boot  (64K)
       162   4194304    2  freebsd-ufs  (2.0G)
   4194466  12582717       - free -  (6.0G)
[root@gw1 ~]#
# Соответственно в /dev
[root@gw1 ~]# ls -l /dev/ad4*
crw-r-----  1 root  operator    0,  78 Mar 29 12:05 /dev/ad4
crw-r-----  1 root  operator    0,  89 Mar 29 11:53 /dev/ad4p1
crw-r-----  1 root  operator    0,  91 Mar 29 11:53 /dev/ad4p2
.....
# Надеюсь, мы запомнили схему разбивки винта и у нас не возникнет проблем с сопоставлением разделов

Ну а далее все не просто, а очень просто. Делаем newfs на нужные разделы (но не надо забывать, что на корень soft updates не делают!),
стопаем все сервисы на серваке, dump'им текущие файловые системы, ресторим дампы на примонтированные новые разделы (вот где главное не ошибиться!).
Правим fstab на примонтированном новом корне (я сделал все также по ufsid и glabel на swap).
Отмонтируем новые разделы, выключаем сервак, вынимаем старый винт - PROFIT!

Замечу, что я делал это все через ssh, сервак был далеко, соответственно делал через multiuser.
Если возникнут проблемы - можно подоткнуть старый винт на время и исправлять ошибки. Операция в общем-то тривиальная. На серваке в этот момент стояло: апач (web-морда для почты, управление прокси-сервером, mpd, никаких сайтов для клиентов), mysql, racoon, sams, mpd, isc-dhcpd. Ничего особенного. После переезда все чувсвтуют себя хорошо.

Комментариев нет: