Home

Удалённо апгрейдим систему FreeBSD с 8.4-STABLE до 9.1-STABLE

Предисловие.

Есть мнение, что для успешного обновления одной ветки до другой сначала нужно обновить установленную версию до самой свежей версии в этой ветке.

В предыдущей записи я обновил систему до 8.4-STABLE, поэтому мне ничего обновлять не нужно, если же у тебя ветка 8 не обновлена до текущего состояния STABLE, то я рекомендую это сделать, иначе дальше не читай и сам себе злобный буратина. ))

 

# uname -a

FreeBSD web2.yaol.ru 8.4-PRERELEASE FreeBSD 8.4-PRERELEASE #0 r248935: Sun Mar 31 05:00:20 MSK 2013     Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.:/usr/obj/usr/src/sys/KMD  amd64

 

Теперь на обновлённой до 8.4-STABLE системе делаем следующее:

# rm -r /usr/obj/

# rm -r /usr/src/

 

Так как subversion уже установлен и работает, то этот шаг пропускаем . (Даже несмотря на то, что после обновления системы 7.4 до 8.4 я не пересобирал порты)

# cd /usr/src/devel/subversion/

# make install clean

 

Сливаем дерево исходников для 9ой версии.

# svn co svn://svn.freebsd.org/base/stable/9 /usr/src

 

(это делалось в предыдущей записи при обновлнеии 7.4 -> 8.4 => пропускаем) Так как я планирую сразу после обновления системы обновлять порты, то нужно обновить дерево портов сейчас - потом оно может не заработать из-за смены версии FreeBSD

# rm -r /usr/ports/

# svn co svn://svn.FreeBSD.org/ports/head /usr/ports

 

Теперь удалённо пересобираем систему FreeBSD.

# cd /usr/src/

# mergemaster -p

# make -j4 buildworld

# make -j4 buildkernel

# make installkernel

# make installworld

# mergemaster -iU

команда успешно выполнилась. На все вопросы по удалению и выполнению я отвечал y.

Иногда, например, при обновлении с версии 8.4 до 9.2 эта команда не срабатывает - ругается на отсутствие простейших команд. Уверен, что это из-за установки нового мира. Поэтому делаем reboot и после перезагрузки выполняем mergemaster -iU, а потом снова reboot.

 

после следующей команды система не поднялась: 

# reboot

пишет Mointing from ufs:/dev/ad4s1a failed with error 19.

 

….добрался до машины - виноват старый биос F3 на матери GigaByte GA78GM-S2H - FreeBSD не видит жёсткий диск вообще, даже в режиме IDE Native Mode - с такими граблями и 9ой версией фри я сталкивался раньше - система на эту мать и старый биос просто не устанавливается, потому что также не видит жёсткий диск. Лечится обновлением биоса до F11.

После обновления BIOS система FreeBSD загрузилась без правки каких-либо конфигов.

Таким образом констатирую успешный апдейт с версии FreeBSD 8.4 до версии 9.1

 

Дальше нужно пересобирать все порты в принудительном порядке.

Я делаю это так:

# portupgrade -farR

 

Система упала, записав в лог

kernel: pid 46569 (try), uid 0: exited on signal 10 (core dumped)

Умерла на обновлении sqlite3.o

 

Попробую тогда для начала сделать

# portupgrade -frR portupgrade

 

Снова запускаю

# portupgrade -farR

sqlite3.o прошло мимо, пошло собираться дальше.

 

(через несколько часов) Всё успешно пересобралось.

Теперь вместо устаревшей системы FreeBSD 7.4-STABLE, которая предварительно была проапгрейжена до 8.4-STABLE, имеем систему 9.1-STABLE со всеми пересобранными под неё портами.

Обновление FreeBSD 9.3 до 10.1

Пробую обновлять 9.3 до 10.1 по своей классической схеме (сначала обновляемся до stable текущей версии, в данном случае 9ой, а потом обновляюсь до 10.1-stable).

Система обновилась. Загрузилась. Даже не понадобилось перегружаться перед mergemaster -iU.

полный upgrade ports я не делал, видимо поэтому случились следующие две проблемы:

Возникла проблема с pkg, на системе он был какой-то версии типа 1.3. Вру, или в новой версии был этой версии, а установленный был сильно старый. Короче ругалось на `pkg cannot parse configuration file` и man pkg.conf(5).

svn версия оказалась также устаревшей, необходимо сделать upgrade. Причём у меня там был svn, который пользовал формат репозитория 29. А пришедший с системой svnlite - версию 31.

Чтобы починить pkg сделал только rm /usr/local/etc/pkg.conf из отсюда http://muff.kiev.ua/content/pkg-oshibka-pkg-packagesite-pkgconf-deprecated-please-create-repository-configuration-file

потом запустил pkg info или как-то так и оно предложило запустить pkg-чего-то там с нужным параметрами. Запустил. В итоге оказался в списке установленных файлов пакетов только pkg.

в /usr/src сделал yes|make delete-old и потом yes|make delete-old-libs

Как оказалось удалилось дофига всего, включая откуда-то нарисовавшиеся cvsup файлы.

Перестал запускаться старый svn `Shared object "libssl.so.6" not found, required by "svn"`. Видимо удалились старые либы.

Однако сами файлы от svn в системе остались. Как их удалять я фиг знает. Видимо нужно будет установить svn заново, а потом его удалить, потому что есть svnlite или забить и в системе останутся бесхозные файлы. perl был какой-то там 5.12. Теперь наверняка поставится 5.16. Останутся ли там бесхозные файлы - не знаю.

По всей видимости на рабочей машине перед апгрейдом нужно будет обновляться до последней установленной (9.3) stable версии и делать portupgrade -a, а потом уже обновлять систему до последней следующей (10.1) stable.

FreeBSD 10: RAID1 - Mirroring

 

Предисловие.

Пришло время пробовать FreeBSD 10. И завести её на gmirror'е. Делал на основе своей предыдущей инстукции как поставить/замиррорить систему FreeBSD 9.1 на RAID1 с помощью gmirror.

Итого. Вернёмся к официальному FreeBSD handbook'у http://www.freebsd.org/doc/handbook/geom-mirror.html

 

Процесс - FreeBSD gmirror raid1.

Ставим FreeBSD 10, как мы это обычно делаем (без игр, без ports, без src, потому что последние два мы потом сольём с помощью svnlite. Насколько я помню, с установленными этими папками svnlite не обновляет эти деревья). Без всяких заморочек. Перегружаемся в свежеустановленную систему. Все описанные дальше команды я делал через ssh-подключение.

Если до этого оставались какие-то хвосты от предыдущих попыток запустить gmirror или же там есть какие-то другие разметки от других систем, то делаем:

# gpart destroy -F ada1 - на ada0 оно было всё стёрто в процессе установки.

Далее следуем инструкциям из FreeBSD HandBook 20.4.3 (номер не проверял в этот раз)

# gmirror load

# diskinfo -v ada0 |head -n3
ada0
        512             # sectorsize
        320071851520   # mediasize in bytes (298G)

# diskinfo -v ada1 | head -n3
ada1
        512             # sectorsize
        320071851520   # mediasize in bytes (298G)

# geom zero load

# gnop create -s 320071851520 gzero
Это число взято из предыдущей команды.

# gmirror label -v gm0 gzero.nop ada1
Metadata value stored on gzero.nop.
Metadata value stored on ada1.
Done.

# gmirror forget gm0

А вот дальше начинается интересное - я решил посмотреть, что показывает команда gpart show из инструкции (заглянул так сказать вперёд) и оказалось вот что:

# gpart show ada0 (далее вывод оставил из предыдущей статьи. Разве что на этих дисках в конце было свободно 92M)
=>        34  1953525101  ada0  GPT  (931G)
          34           6        - free -  (3.0k)
          40         128     1  freebsd-boot  (64k)
         168  1944059768     2  freebsd-ufs  (927G)
  1944059936     8388608     3  freebsd-swap  (4.0G)
  1952448544     1076591        - free -  (525M)

# gpart backup ada0
GPT 128
1   freebsd-boot         40        128
2    freebsd-ufs        168 1944059768
3   freebsd-swap 1944059936    8388608

И! У меня в конце оказалось 92 свободных мегабайт. Видимо потому что инсталлятор по умолчанию оперирует гигабайтам. Поэтому следующий шаг из официального handbook'а FreeBSD я пропускаю. В нём размер последнего слайса/партиции/etc уменьшается на 1 сектор, в результате чего команда gpart show начинает показывать - free -  (31k) в последней строке. У меня там итак уже 525M свободно.

# gpart backup ada0 > table.ada0
Если же у тебя нет свободного места в конце диска, то нужно последнее число в последней строке уменьшить на 1 (на единицу).

На моём примере должно было бы получиться
3   freebsd-swap 1944059936    8388607

# gpart restore mirror/gm0 < table.ada0

# gpart show mirror/gm0
=>        34  1953525100  mirror/gm0  GPT  (931G)
          34           6              - free -  (3.0k)
          40         128           1  freebsd-boot  (64k)
         168  1944059768           2  freebsd-ufs  (927G)
  1944059936     8388608           3  freebsd-swap  (4.0G)
  1952448544     1076590              - free -  (525M)

# newfs -U /dev/mirror/gm0p2
/dev/mirror/gm0p2: 949247.9MB (1944059768 sectors) block size 32768, fragment size 4096
        using 1517 cylinder groups of 626.09MB, 20035 blks, 80256 inodes.
        with soft updates
super-block backups (for fsck_ffs -b #) at:
 192, 1282432, 2564672, 3846912, 5129152, 6411392, 7693632, 8975872, 10258112, 11540352, 12822592,
....

# gpart bootcode -b /boot/pmbr  -p /boot/gptboot -i 1 mirror/gm0

bootcode written to mirror/gm0

далее лезем в /etc/fstab, чтобы заменить /dev/ada0* на /dev/mirror/gm0*

Handbook рекомендует сделать копию

# cp /etc/fstab /etc/fstab.orig

# vi /etc/fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/mirror/gm0p2       /               ufs     rw      1       1
/dev/mirror/gm0p3       none            swap    sw      0       0

Далее в файл vi /boot/loader.conf добавляем строку geom_mirror_load="YES"

echo 'geom_mirror_load="YES"' >> /boot/loader.conf

Теперь пришло время скопировать систему с /dev/ada0p2 на /dev/mirror/gm0p2

# mount /dev/mirror/gm0p2 /mnt

# mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
/dev/mirror/gm0p2 on /mnt (ufs, local, soft-updates)

 Дальше забиваем временно на FreeBSD Handbook и клонируем раздел с помощью команды pax

# cd /

# pax -p eme -X -rw . /mnt
pax: /mnt/./var/run/devd.pipe skipped. Sockets cannot be copied or extracted
pax: /mnt/./var/run/log skipped. Sockets cannot be copied or extracted
pax: /mnt/./var/run/logpriv skipped. Sockets cannot be copied or extracted

Скопировалось буквально за минуту.

# df -h
Filesystem           Size    Used   Avail Capacity  Mounted on
/dev/ada0p2          897G    703M    825G     0%    /
devfs                1.0k    1.0k      0B   100%    /dev
/dev/mirror/gm0p2    897G    703M    825G     0%    /mnt

Теперь перегружаемся.
(необязательно) В BIOS на загрузку выбираем другой жёсткий диск. (обычно F12 при загрузке)
Если всё пойдёт, как должно, то мы загрузимся с mirror/gm0

# reboot

 Загрузилось.

# mount
/dev/mirror/gm0p2 on / (ufs, local, soft-updates)
devfs on /dev (devfs, local, multilabel)

Журналирование куда-то делось. Непонятно, должно ли оно было там быть на gmirror разделах - не знаю.

ВНИМАНИЕ! Теперь, мы в миррор будем подключать наш изначальный диск ada0 - все данные при этом на нём сотрутся.

На данный момент статус таков:

# gmirror status
      Name    Status  Components
mirror/gm0  COMPLETE  ada1 (ACTIVE)

# gmirror insert gm0 ada0
В ответ не было сказано ни слова, хотя в handbook'е написан некий вывод GEOM_MIRROR: Device gm0: rebuilding provider ada0.

# gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada1 (ACTIVE)
                      ada0 (SYNCHRONIZING, 0%)

Синхронизирует оно всё это очень вяло как-то. При этом нагрузки на проц нету никакой.

А вот и ответ.

Оно, видимо, клонирует всю поверхность диска без разбора.

# gstat
dT: 1.002s  w: 1.000s
 L(q)  ops/s    r/s   kBps   ms/r    w/s   kBps   ms/w   %busy Name
    0      0      0      0    0.0      0      0    0.0    0.0| cd0
    0      0      0      0    0.0      0      0    0.0    0.0| iso9660/FREEBSD_INSTALL
    2   1277      0      0    0.0   1277 161984    1.0   83.0| ada0
    0   1266   1266 162106    0.5      0      0    0.0   54.0| ada1
    1   1266   1266 162106    0.6      0      0    0.0   56.1| mirror/gm0
    0      0      0      0    0.0      0      0    0.0    0.0| mirror/gm0p1
    0      0      0      0    0.0      0      0    0.0    0.0| mirror/gm0p2
    0      0      0      0    0.0      0      0    0.0    0.0| mirror/gm0p3 

Насколько я помню - у меня там было занято 823M из 298G.

Вот и всё. Теперь можно обновлять систему до STABLE и ставить порты через svnlite.

Обновляем исходники FreeBSD (src-дерево) с помощью subversion.

Обновляем FreeBSD src-дерево с помощью subversion.

В версии FreeBSD 10 используем уже установленный в системе svnlite.

Ставим subversion из портов.

# cd /usr/ports/devel/subversion

# make install clean

 

Теперь обновляем исходники FreeBSD.

При первом запуске (при переезде с cvs на svn) рекомендуется удалить директорию /usr/src/ целиком, равно как и /usr/ports/, потому что в них в обеих в каждой поддиректории есть директория CVS (или они у меня остались там с незапамятных времён?!), а она теперь не нужна.

Для обновления до 9-STABLE делаем так (в понятиях cvsup это было бы RELENG_9):

# svn co svn://svn.freebsd.org/base/stable/9 /usr/src

8-STABLE

# svn co svn://svn.freebsd.org/base/stable/8 /usr/src

10-STABLE

# svnlite co svn://svn.freebsd.org/base/stable/10 /usr/src

 

Для релизов нужно пользоваться другой веткой. Для 7.4-RELEASE:

# svn co svn://svn.freebsd.org/base/release/7.4.0 /usr/src

А если хочется 8.2-RELENG и ни разу не 8.3, тогда пользуем releng/

# svn co svn://svn.freebsd.org/base/releng/8.2 /usr/src

 

Всё дерево исходников для просмотра через браузер смотреть тут:

http://svnweb.freebsd.org/base/

 

После выполнения команды svn в первый раз будет создана директория /usr/src/.svn и в следующие разы для обновления дерева исходников достаточно будет использовать команду

# svn up /usr/src

Чтобы посмотреть информацию о текущем состоянии svn-репозитория запускаем.

# svn info /usr/src

 

Чтобы обновить /usr/ports/ используем команду.

# svn co svn://svn.FreeBSD.org/ports/head /usr/ports

FreeBSD 10:

# svnlite co svn://svn.FreeBSD.org/ports/head /usr/ports

А при последующих запусках:

# svn up /usr/ports

FreeBSD 10:

# svnlite up /usr/ports