21.4. Използване на make world

Веднъж като синхронизирате вашето локално сорс дърво от дадена версия на FreeBSD (FreeBSD-STABLE, FreeBSD-CURRENT и т.н.) можете да го използвате за да рекомпилирате системата.

Направете резервно копие Трябва да знаете, че е много важно да се направи бакъп на вашата система преди да извършите това. Независимо, че rebuilding the world е (поне докато следвате тези инструкции) една лесна за изпълнение задача, то неминуемо ще има случаи когато ще направите грешка или грешки направени от други хора в сорс дървото ще остави вашата система unbootable.

Подсигурете резервно копие. И fixit floppy диск под ръка. Може би никога няма да ги използвате, но е по-добре да изгаете на сигурно за да не съжалявате после!

Запишете се в правилния пощенски списък FreeBSD-STABLE и FreeBSD-CURRENT браншовете са по естествен начин постоянно в разработка . Хората които допринасят в FreeBSD са човешки същества и понякога се случват грешки.

Понякога тези грешки могат да бъдат доста безобидни, като просто карат вашата система да изписва диагностично предупреждение. Но промяната може и да катастрофална, оставяйки вашата система unbootable или да разруши вашите файлови системи (или по-лошо).

Ако проблеми като тези се случат се изпращат ``heads up'' предупреждения до съответните пощенски списъци, обясняващи характера на проблема и кои системи са засегнати. Когато проблема се реши се изпраща ``all clear'' обявление.

Ако се опитвате да следвате FreeBSD-STABLE или FreeBSD-CURRENT и не четете FreeBSD-STABLE mailing list или FreeBSD-CURRENT mailing list съответно, тогава си търсите белята.

21.4.1. Четете /usr/src/UPDATING

Преди да направите каквото и да било, прочетете /usr/src/UPDATING (или съответно файл където е копието на вашия сорс код). Този файл ще съдържа важна информация за проблемите които може да срещнете или да определя реда по който трябва да изпълните дадени команди. Ако UPDATING противоречи на нещо което ще прочетете тук, то UPDATING има приоритет.

Important: Четенето на UPDATING не е приемливо заместване на записването в правилните пощенски списъци, както е описано по-горе. Двете изисквания са допълващи се, не изключващи се.

21.4.2. Проверете /etc/make.conf

Прегледайте файловете /etc/defaults/make.conf и /etc/make.conf. Първият съдържа някои дефиниции по подразбиране - повечето от които са коментирани. За да ги използвате когато рекомпилирате вашата система от сорс ги добавете в /etc/make.conf. Имайте предвид, че всичко което добавите в /etc/make.conf също ще бъде използвано всеки път когато изпълните make, така, че е добра идея да ги настроите на нещо подходящо за вашата система.

Обикновения потребител вероятно ще изкопира CFLAGS и NOPROFILE редовете от /etc/defaults/make.conf в /etc/make.conf и ще ги откоментира.

Прегледайте и другите дефиниции (COPTFLAGS, NOPORTDOCS и т.н.) и решете дали ще са ви от полза.

21.4.3. Осъвременяване на файловете в /etc

Директорията /etc съдържа голяма част от вашата системна конфигурационна информация, както и скриптовете които се изпълняват при стартирането на системата. Някои от тези скриптове се променят от дадена версия на FreeBSD към друга.

Някои от конфигурационните файлове също се използват във ежедневната работа на системата. В частност /etc/group.

Има случаи когато инсталационната част на ``make world'' очаква да съществуват определени usernames и groups. Когато се изпълнява upgrade-а може да се окаже, че тези users или groups не съществуват. Това причинява проблеми при upgrading.

Скорошен пример за това беше когато беше добавен user smmsp. Потребителите се сблъскваха с неуспешния инсталационен процес когато mtree(8) се опитваше да създаде /var/spool/clientmqueue.

Решението е да се прегледа /usr/src/etc/group и да се сравни списъка от групи с вашия такъв. Ако има някакви groups в новия файл които ги няма във вашия файл тогава ги изкопирайте. По същия начин трябва да преименувате rename всички groups в /etc/group които имат същото GID но под различно име от тези в /usr/src/etc/group.

След 4.6-RELEASE можете да изпълните mergemaster(8) в pre-buildworld mode с подадена -p опция. Това ще сравни само тези файлове които са съществени за успеха на buildworld или installworld. Ако вашата стара версия на mergemaster не поддържа -p, то използвайте новата версия от сорс дървото когато го използвате за първи път:

# cd /usr/src/usr.sbin/mergemaster
# ./mergemaster.sh -p

Tip: Ако сте параноид, можете да проверите вашата система за да видите кои файлове се притежават от групата която преименувате или изтривате:

# find / -group GID -print

ще покаже всички файлове притежавани от групата GID (което може да бъде group name или numeric group ID).

21.4.4. Преминаване в Single User Mode

Може да искате да компилирате системата в еднопотребителски режим. Освен очевидното, че така нещата ще минат малко по-бързо, реинсталирането на системата ще променя доста важни системни файлове като всички стандартни system binaries, libraries, include файлове и т.н. Променяйки това на нормално работеща система (в частност ако имате активни потребители по това време) е заявка за проблеми.

Друг метод е да компилирате системата в многопотребителки режим, и тогава да преминете в еднопотребителски за да извършите инсталацията. Ако искате по този начин да го направите, просто се замислете над следните стъпки докато компилацията приключи. Можете да отложите преминаването в еднопотребителски режим докато ви се наложи да installkernel или installworld.

Като суперпотребител можете да изпълните:

# shutdown now

от работеща система, което ще ви доведе до преминаване в еднопотребителски режим.

Алтернативно, рестартирайте системата и на boot prompt-а подайте -s флаг. Системата ще зареди в еднопотребителки режим. след което в shell prompt-а изпълнете:

# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a

Това ще провери файловите системи, ще ги премонтира / read/write, ще монтира и всички други UFS файлови системи описани в /etc/fstab и ще включи използването на swap.

Note: Ако вашия CMOS часовник е настроен на локално време, а не на GMT (а това е така, ако изхода на командата date(1) не показва правилното време и часова зона), то може да се наложи да изпълните и следната команда:

# adjkerntz -i

Това ще осигури правилната настройка на локалната часова зона -- като без това впоследствие може да се сблъскате с някои проблеми.

21.4.5. Премахнете /usr/obj

Докато частите на системата се рекомпилират, то те се подвизават в директории които (по подразбиране) са под /usr/obj. Тези директории наподобяват тези от /usr/src.

Можете да ускорите ``make world'' процеса и верояно да си спестите някои проблеми със зависимости след като премахнете тази директория.

Някои файлове под /usr/obj може да имат сложен immutable флаг (вижте chflags(1) за повече информация) който преди това трябва да се премахне.

# cd /usr/obj
# chflags -R noschg *
# rm -rf *

21.4.6. Прекомпилиране на сорсовете

21.4.6.1. Запазване на изхода

Добра идея е да се запази изхода който ще получите от стартирания make(1) в отделен файл. Ако нещо се обърка ще имате копие на съобшението за грешка. Ако това не помогне на вас да диагностицирате проблема, то може да бъде от помощ на други ако изпратите вашия проблем до някой пощенски списък на FreeBSD.

Най-лесния начин да се направи това е да се използва script(1) командата с параметър определящ името на файла в който да се запази целия изход. Направете го точно преди rebuilding the world, след което изпълнете exit когато процеса завърши.

# script /var/tmp/mw.out
Script started, output file is /var/tmp/mw.out   
# make TARGET
... compile, compile, compile ...     
# exit
Script done, ...

Ако правите това, то не запазвайте изхода в /tmp. Тази директория може да бъде изтрита при следващото стартиране на системата. По-добро място за запазване е в /var/tmp (както в предния пример) или в домашната директория на root.

21.4.6.2. Компилиране на Base System

Трябва да сте в /usr/src директорията:

# cd /usr/src

(освен, ако разбира се вашия сорс код не е някъде другаде, в който случай влезте в съответната директория).

За да rebuild the world ще използвате командата make(1). Тази команда чете инструкциите от Makefile, който описва как програмите от които се състои FreeBSD трябва да бъдат рекомпилирани, редът по които трябва да бъдат компилирани и т.н.

Общия формат на командата която ще изпълните ще е следния:

# make -x -DVARIABLE target

В този пример, -x е опция която подавате на make(1). Вижте справочната страница на make(1) за опциите които можете да подавате.

-DVARIABLE подава променлива на Makefile. Поведението на Makefile се контролира от тези променливи. Това са същите променливи които се настройват в /etc/make.conf и това е просто друг начин за тяхната настройка.

# make -DNOPROFILE target

е друг начин да се каже, че профилираните библиотеки (profiled libraries) не трябва да се компилират и съответства на

NOPROFILE=    true     #    Avoid compiling profiled libraries

реда в /etc/make.conf.

target указва на make(1) какво искате да направите. Всеки Makefile дефинира няколко на брой и различни ``targets'' и избора на target определя какво ще се случи.

Някои targets са изброени в Makefile, но не са предвидени за изпълнение от вас. Вместо това те се използват от build процеса да раздели стъпките необходими за рекомпилирането на системата на множество под-стъпки.

През повечето време няма да е нужно да подавате някакви параметри на make(1) така, че вашия команден ред ще изглежда като този:

# make target

Започвайки от версия 2.2.5 на FreeBSD (в действителност първо е било направено в FreeBSD-CURRENT бранша и после пригодено за за FreeBSD-STABLE някъде между 2.2.2 и 2.2.5) world target е разделен на две части: buildworld и installworld.

Както подсказват имената buildworld компилира цялото новто дърво в /usr/obj, а installworld инсталира това дърво на настоящата система.

Това е много полезно поради две причини. Първо, ви позволява да направите компилацията безопасно знаейки, че компоненетите на работещата система няма да бъдат засегнати. Компилацията е ``self hosted''. Поради това, вие безопасно можете да изпълните buildworld на система работеща в многопотребителски режим без страх от странични ефекти. Но все още е препоръчително да изпълнявате installworld частта в еднопотребителски режим.

Второ, позволява ви да използвате NFS mounts за да осъвремените няколко системи от вашата мрежа. ако имате три машини, A, B и C които искате да осъвремените изпълнете make buildworld и make installworld на A. А след това B и C ще NFS mount /usr/src и /usr/obj от A и тогава ще можете да изпълните make installworld за да инсталирате резултата от компилацията на B и C.

Въпреки, че world target все още съществува, горещо се препоръчва да не се използва.

Изпълнете

# make buildworld

Сега е възможно да се укаже -j опция на make която ще го накара да размножи няколко различни едновременни процеса. Това е най-полезно за машини с няколко процесора. Обаче, поради това, че доста от компилационния процес е свързан в IO отколкото с процесора, то това също ще е полезно и за еднопроцесорни машини.

На обикновена еднопроцесорна машина можете да изпълните:

# make -j4 buildworld

Тогава make(1) ще има до 4 процеса изпълняващи се по едно и също време. Емпирични доказателства изпратени до пощенските списъци показват, че това дава най-добра производителност.

Ако имате многопроцесорна машина и използвате SMP конфигурирано ядро опитайте стойности между 6 и 10 и вижте как те ускоряват нещата.

Имайте предвид, че това е все още до някаква степен експериментално и някои промени в сорс дървото може евентуално да чупят тази възможност. Ако world-а не се изкомпилира използвайки този параметър, то опитайте отново без него преди да съобщавате за проблеми.

21.4.6.3. Продължителност

Много фактори влияят на продължителността на компилацията, но понастоящем на 500 MHz Pentium® III в 128 MB RAM му отнема около 2  часа за да изкомпилира FreeBSD-STABLE дървото, без трикове или съкращения по време на процеса. Дървото на FreeBSD-CURRENT ще отнеме малко повече.

21.4.7. Компилиране и инсталиране на ново ядро

За да получите всички преимущества на вашата нова система трябва да прекомпилирате ядрото. Това е практически необходимо, защото определени memory structures може да са се променили и програми като ps(1) и top(1) няма да работят докато не компилирате ядро от версията на сорс дървото от което са получени тези програми.

Най-простият и безопасен начин да направите това е да компилирате и инсталирате ядро базорано на GENERIC. Независимо, че GENERIC може и да няма всички необходими драйвери за вашите устройства, то той трябва да съдържа всички необходимо за да зареди системата обратно в еднопотребителки режим. Това е добър тест, че новата система работи правилно. След като заредите от GENERIC и се убедите, че вашата система работи, можете да компилирате ново ядро базирано на вашия нормален кернелски конфигурационен файл.

Ако осъвременявате до FreeBSD 4.0 или по-ново тогава старата процедура за компилиране на ядрото (както е описана в Chapter 9) се изоставя. Вместо това, трябва да изпълните тези команди след като сте built the world с buildworld.

Note: Ако искате да компилирате custom ядро и вече имате конфигурационен файл, просто използвайте KERNCONF=MYKERNEL като това:

# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL

В FreeBSD 4.2 и по-стари трябва да замените KERNCONF= с KERNEL=. 4.2-STABLE който е бил изтеглен преди 2 Февруари 2001 не разпознава KERNCONF=.

Имайте предвид, че ако сте увеличили kern.securelevel над 1 и сте настроили noschg или подобни флагове във вашето kernel binary, то може да се наложи да преминете в еднопотребителски режим за да използвате installkernel. В противен случай трябва да можете да изпълните и двете команди от многопотребителски режим без проблеми. Вижте init(8) за детайли относно kern.securelevel и chflags(1) за детайли отностно различните файлови флагове.

Ако осъвременявате до версия на FreeBSD под 4.0 трябва да използвате старата процедура за компилиране на ядрото. Обаче се препоръчва да използвате нова версия на config(8), използвайки команден ред като този.

# /usr/obj/usr/src/usr.sbin/config/config KERNELNAME

21.4.8. Рестартиране в еднопотребителски режим

Трябва да рестартирате в еднопотребителски режим за да изтествате новото ядро. Направете това следвайки инстарукциите в Section 21.4.4.

21.4.9. Инсталиране на новите System Binaries

Ако компилирате версия на FreeBSD която е достатъчно нова за да има make buildworld тогава сега трябва да използвате installworld за да инсталирате новите system binaries.

Run

# cd /usr/src
# make installworld

Note: Ако сте указвали променливи на make buildworld командния ред, то трябва да укажете същите в командния ред на make installworld. Това не е задължително за други опции; например -j никога не трябва да се използва с installworld.

Например, ако изпълните:

# make -DNOPROFILE buildworld

Трябва да инсталирате резултата с:

# make -DNOPROFILE installworld

иначе ще се направи опит да се инсталират profiled libraries които не са били компилирани по време на фазата на make buildworld.

21.4.10. Осъвременяване на файловете които не са осъвременени от make world

Правенето на world нямада осъвремени някои директории (в частност /etc, /var и /usr) с нови или променени файлове.

Най-простият начин да се осъвременят тези файлове е да се използва mergemaster(8), какво е възможно да се направи ръчно ако така предпочитате. Независимо кое от двете ще изберете, то подсигурете бакъп на /etc в случай, че нещо се обърка.

21.4.10.1. mergemaster

Contributed by Tom Rhodes.

Програмата mergemaster(8) е Bourne скрипт който ще ви помогне да определите разликите между вашите конфигурационни файлове в /etc и конфигурационните файлове в сорс дървото /usr/src/etc. Това е препоръчителното решение за запазване на системните конфигурационни файлове упдейтнати спрямо тези от сорс дървотоe.

mergemaster беше инстегриран в FreeBSD base system между 3.3-RELEASE и 3.4-RELEASE, което означава, че го има във всички -STABLE и -CURRENT системи започвайки от 3.3.

За да започнете просто изпълнете mergemaster и наблюдавайте. mergemaster ще направи временна root среда, започвайки от / надолу и ще я напълни с различни системни конфигурационни файлове. Тези файлове ще бъдат сравнени с тези които са понастоящем инсталирани на вашата система. Файловете които се различават ще бъдат показани в diff(1) формат със знак + представящ добавени или модифицирани редове и със знак - представящ редовете които ще бъдат ще бъдат премахнати напълно или заменени от нов ред. Разгледайте diff(1) страницата за повече информация относно синтаксиса diff(1) и как се показват разликите между файловете.

mergemaster(8) ще ви покаже всеки файл който се различава и в този момент ще направите избора или изтриете новия файл (представен като временен файл) или да инсталирате временния файл както е така немодифициран или да слеете (merging) временния файл с този който е в момента инсталиран или да прегледате резултатите от diff(1) отново.

Избора да изтриете временния файл ще укаже на mergemaster(8), че искаме да запазиме нашия понастоящем инсталиран файл непроменен и да се изтрие новата версия. Тази опция не е препоръчителна освен ако не виждате никаква причина да за да промените понастоящем инсталирания файл. По всяко време можете да получите помощ като изпълните ? в промпта на mergemaster(8). Ако потребителя избере да прескочи някой файл, то той ще бъде представен отново след като се справите с всички останали файлове.

Избора да инсталирате немодифициран временен файл ще замени настоящия файл с новия. За повечето немодифицирани файлове това е най-доброто решение.

Избора да слеете промените във файла ще ви стартира текстов редактор със съдържанието на двата файла. Можете да ги слеете преглеждайки двата файла и да изберете части от двата за да създадете крайния продукт. Когато файловете са сравнявани страна по страна, то клавиша l ще избере лявата страна, а клавиша r ще избере съдържанието на дясната. Крайния изход ще бъде файл съдържащ двете части, който може да бъде инсталиран. Тази опция обикнове се използва за файлове които са били модифицирани от потребителя.

Избора да погледнете резултата от diff(1) отново ще ви покаже разликите между файловете точно както mergemaster(8) направи преди това преди да ви пита да направите избор.

След като mergemaster(8) завърши със системните файлове ще ви попита за останалите опции. mergemaster(8) може да попита дали искате да rebuild-нете файла password и/или да изпълните MAKEDEV(8) ако използвате версия на FreeBSD преди 5.0 и ще завърши с опция за изтриване на останалите временни файлове.

21.4.10.2. Ръчно осъвременяване

Ако желаете да направите осъвременяването ръчно, то не можете просто да изкопирате файловете от /usr/src/etc в /etc и да ги получите работещи. Някой от тези файлове трябва да бъдат първо ``инсталирани''. Това е понеже директорията /usr/src/etc не е копие на това което вашето /etc би трябвало да изглежда. Освен това, има файлове който трябва да бъдат в /etc, но не са в /usr/src/etc.

Ако използвате mergemaster(8) (както се препоръчва), то можете са преминете напред към следващата секция.

Най-простият начин да се направи това ръчно е да се инсталират файловете в нова директория след което да се претърсят за откриване на разликите.

Направете резервно копие на съществуващото/etcВъпреки, че на теория нищо няма да докосва тази директория автоматично, то винаги е добре да сме подсигурени. Така, че изкопирайте съществуващото /etc някъде на сигурно място. Нещо като:

# cp -Rp /etc /etc.old

-R изпълнява рекурсивно копиране, -p запазва times и ownerships за файловете и подобни.

Трябва да изградите кух набор от директории за да инсталирате новото /etc и останалите файлове вътре. /var/tmp/root е подходящ избор, като има и множество поддиректории необходими вътре в тази директория.

# mkdir /var/tmp/root
# cd /usr/src/etc
# make DESTDIR=/var/tmp/root distrib-dirs distribution

Това ще изгради необходимата директорийна структура и ще инсталира файловете. Доста от поддиректориите които са били създадени в /var/tmp/root са празни и трябва да бъдат изтрити. Най-простия начин да се направи това е:

# cd /var/tmp/root
# find -d . -type d | xargs rmdir 2>/dev/null

Това ще премахне всички празни директории. (Standard error е пренасочен към /dev/null за да подтисне предупрежденията за директориите които не са празни.)

/var/tmp/root сега сидържа всички файлове които трябва да се намират на подходящите места под /. Сега трябва да преминете през всеки от тези файлове определяйки с какво се различават от вече съществуващите файлове.

Забележете, че някои от файловете които са били инсталирани в /var/tmp/root започват с ``.''. В момента на писането единствените такива файлове са shell startup files в /var/tmp/root/ и /var/tmp/root/root/, въпреки, че може да има и други (в зависимост кога четете това). Изпълнете ls -a за да ги идентифицирате.

Най-простия начин да се направи това е да се използва diff(1) за да се сравнят двата файла:

# diff /etc/shells /var/tmp/root/etc/shells

Това ще ви покаже разликите между вашия /etc/shells файл и новия /var/tmp/root/etc/shells файл. Използвайте това за да решите дали да сливате с промените които сте направили или да изкопирате новия файл върху стария.

Щамповайте новата Root директория (/var/tmp/root) с Time Stamp, така, че лесно да можете да сравнявате разликите между версиите: Честото rebuilding the world означава, че трябва да осъвременявате често и /etc, което може да бъде доста скучна работа.

Можете да ускорите този процес със запазването на копие на последния набор от променени файлове които сте слели в /etc. Следната процедура дава една идея как да стане това.

  1. Направете world както обикновено. Когато искате да осъвремените /etc и другите директории, поставете в името на директорията и текущата дата. Ако сте правили на 14-ти February 1998 можете да направите следното:

    # mkdir /var/tmp/root-19980214
    # cd /usr/src/etc
    # make DESTDIR=/var/tmp/root-19980214 \
        distrib-dirs distribution
    
  2. Слейте промените от тази директория както е описано по-горе.

    Не изтривайте директорията /var/tmp/root-19980214 когато завършите.

  3. Когато изтеглите последната версия на сорса и го обновите, следвайте горния пример. Ще имате и директория която може да се именува /var/tmp/root-19980221 (ако имате една седмица разлика между двете осъвременявания).

  4. Сега можете да видите разликите които са били направени през изминалата седмица използвайки diff(1) за да получите рекурсивен diff между двете директории:

    # cd /var/tmp
    # diff -r root-19980214 root-19980221
    

    Обикновено разликите ще бъдат много по-малко от тези между /var/tmp/root-19980221/etc и /etc. Понеже разликите са малко е по-лесно да се мигрират промените във вашата /etc директория.

  5. Сега може да изтриете по-старата от двете /var/tmp/root-* директории:

    # rm -rf /var/tmp/root-19980214
    
  6. Повторете този процес всеки път когато се налага да сливате промени в /etc.

Може да използвате date(1) за да автоматизирате създаването на имената на директориите:

# mkdir /var/tmp/root-`date "+%Y%m%d"`

21.4.11. Осъвременете /dev

Note: Ако използвате FreeBSD 5.0 или по-ново можете спокойно да пропуснете тази секция or later. Тези версии използват devfs(5) за да алокират device nodes прозрачно за потребителя.

В повечето случаи mergemaster(8) инструмента ще разбере кога е необходимо да се осъвременят device nodes и ще предложи да го направи автоматично. Следващите инстарукции ще обяснят как да осъвремените ръчно device nodes.

С цел безопасност това е многостъпков процес.

  1. Изкопирайте /var/tmp/root/dev/MAKEDEV в /dev:

    # cp /var/tmp/root/dev/MAKEDEV /dev
    

    Ако сте използвали mergemaster(8) за да осъвремените /etc, тогава вашия MAKEDEV скрипт би трябвало да е вече осъвременен, но нищо не пречи това да се провери (с diff(1)) и да се изкопира ръчно ако е необходимо.

  2. Сега направете snapshot на вашия настоящ /dev. Този snapshot трябва да съдържа permissions, ownerships, major и minor numbers за всеки файл, но не трябва да съдържа time stamps. Най-лесния начин е да се използва awk(1) за да се отстрани част от информацията:

    # cd /dev
    # ls -l | awk '{print $1, $2, $3, $4, $5, $6, $NF}' > /var/tmp/dev.out
    
  3. Пренаправете всички device nodes:

    # sh MAKEDEV all
    
  4. Запишете още един snapshot на директорията, този път като /var/tmp/dev2.out. Сега разгледайте тези два файла за всеки device node който сте пропуснали да направите. Не би трябвало да има такива, но е по-добре да сте сигурни за да не съжалявате.

    # diff /var/tmp/dev.out /var/tmp/dev2.out
    

    Най-вероятно ще забележите disk slice несъответствия което ще доведе до команди като:

    # sh MAKEDEV sd0s1
    

    за да пренаправите slice entries. Вашата ситуация може да е различна.

21.4.12. Осъвременете /stand

Note: Тази стъпка е включена само за пълнота. Спокойно може да бъде пропусната. Ако използвате FreeBSD 5.2 или по-ново, то /rescue директорията автоматично ще бъде осъвременена с настоящите статично компилирани бинарита по време на make installworld, така, че прави излишна необходимостта да се осъвременява /stand.

За пълнота може да поискате да осъвремените файловете в /stand. Тези файлове се състоят от hard links към /stand/sysinstall бинарито. Това бинари трябва да е статично свързано, така, че да може да работи когато някоя друга файлова система (и в частност /usr) не е била монтирана.

# cd /usr/src/release/sysinstall
# make all install

21.4.13. Рестартирайте

Вече сте готови. След като проверите, че всичко е на място можете да рестартирате системата. Командата shutdown(8) ще го направи:

# shutdown -r now

21.4.14. Завършване

Сега би трябвало успешно да сте осъвременили вашата FreeBSD система. Поздравления.

Ако нещата леко се объркат, лесно е да се прекомпилира дадена част от системата. Например, ако инцидентно сте изтрили /etc/magic като част от осъвременяването или сливането на /etc, то командата file(1) ще спре да работи. В този случай решението е да се изпълни:

# cd /usr/src/usr.bin/file
# make all install

21.4.15. Въпроси

21.4.15.1. Трябва ли да re-make the world за всяка промяна?
21.4.15.2. Компилацията прекъсна в множество грешки signal 11 (или друг номер на signal ). Какво става?
21.4.15.3. Мога ли да премахна /usr/obj когато съм завършил?
21.4.15.4. Може ли прекъсната компилация да бъде продължена?
21.4.15.5. Как може да ускоря making the world?
21.4.15.6. Какво да правя ако нещо се обърка?

21.4.15.1. Трябва ли да re-make the world за всяка промяна?

Няма лесен отговорна този въпрос, тъй като зависи от вида пна промяната. Например, ако просто изпълните CVSup и покаже, че следните файлове са били осъвременени:

src/games/cribbage/instr.c
src/games/sail/pl_main.c
src/release/sysinstall/config.c
src/release/sysinstall/media.c
src/share/mk/bsd.port.mk

то вероятно не си заслужава rebuilding на целия world. Просто влезте в съответната поддиректория и изпълнете make all install и това е достатъчно. Но ако нещо важно се е променило, например src/lib/libc/stdlib тогава или направете re-make на world или поне на тези части които са статично свързани (както и всичко друго което сте добавили като статично свързано).

В края на деня идва и вашия ред. Може да сте доволен от re-making the world на всеки две седмици с акумулиране на промените на такъв период от време. Или може да искате да re-make само тези неща които са се променили, но да сте убеден, че сте открили всички зависимости.

И разбира се всичко това зависи от това колко често искате да обновявате вашата система и дали следвате FreeBSD-STABLE или FreeBSD-CURRENT.

21.4.15.2. Компилацията прекъсна в множество грешки signal 11 (или друг номер на signal ). Какво става?

Това обикновено индикира за хардуерни проблеми. (Re)making the world е доста ефективен начин да натоварите вашия хардуер и често ще открива проблеми с паметта. Те обикновено се проявяват като мистериозно умиране на процеса на компилатора или получаване на странни сигнали.

Сигурна индикация за това е когато стартирате пак make и прекъсне на различно място от това на което е спрял при предишното изпълнение.

В този случай малко са нещата които можете да направите освен да започнете да търсите проблема в компоненетите на вашата машина и да опрелите в кой от тях е проблема.

21.4.15.3. Мога ли да премахна /usr/obj когато съм завършил?

Краткия отговор е да.

/usr/obj съдържа всички обектни файлове които са получени по време на компилацията. Обикновено, една от първите стъпки в процеса ``make world'' е да се премахне тази директория и да се започне на чисто. В този случай запазването на /usr/obj след като сте завършили няма много смисъл и ще освободи доста дисково пространство (понастоящем около 340 MB).

Обаче, ако знаете какво правите можете да накарате ``make world'' да пропусне тази стъпка. Това ще накара последващите компилации да завършват доста по-бързо защото повечето от сорсовете няма да е необходимо да бъдат прекомпилирани. Обратния ефект на това е, че може да се появят скрити проблеми със зависимостите причиняващи странни прекъсвания на компилационния процес. Това, често генерира шум в пощенските списъци на FreeBSD, когато някои се оплаче, че компилацията му е прекъснала неразбирайки, че се опитва да направи лоши неща.

21.4.15.4. Може ли прекъсната компилация да бъде продължена?

Това зависи от това до каква част от процеса сте стигнали преди да попаднете на проблема.

По принцип (и това не е заковано и бързо правило) ``make world'' процеса компилира нови копия на основните инструменти (такива като gcc(1), и make(1)) и системните библиотеки. Тези инструменти и библиотеки впоследствие се инсталират. Новите инструменти и библиотеки след това се използват за да се прекомпилират самите те и се инсталират отново. Цялата система (сега включваща и обикновените потребителки програми като ls(1) или grep(1)) се прекомпилират в новите системни файлове.

Ако сте на последния етап и го знаете (защото сте разгледали изхода който сте запазили) тогава можете да (доста безопасно):

... fix the problem ...
# cd /usr/src
# make -DNOCLEAN all

Това няма да премахне работата от предишния ``make world''.

Ако видите съобщение:

--------------------------------------------------------------
Building everything..
--------------------------------------------------------------

в ``make world'' изхода тогава вероятно е доста безопасно да направите така.

Ако не видите тоа съобщение или не сте сигурен, тогава винаги е по-добре да играете на сигурно отколкото да съжалявате и да рестартирате компилацията от начало.

21.4.15.5. Как може да ускоря making the world?

  • Преминете в еднопотребителски режим.

  • Преместете директориите /usr/src и /usr/obj на отделни файлови системи намиращи се на отделни дискове. Ако е възможно преместете тези дискове на отделни контролери.

  • Още по-добре е да поставите тези файлови системи на отделни дискове ато използвате ccd(4) (concatenated disk driver) device.

  • Изключете profiling (с ``NOPROFILE=true'' в /etc/make.conf). Вероятно въобще не ви е необходимо.

  • Също така в /etc/make.conf може да настроите CFLAGS на нещо като -O -pipe. Оптимизацията -O2 е доста по-бавна и разликата в оптимизирането между -O and -O2 е обикновено незначителна. -pipe указва на компилатора да използва pipes, а не временни файлове за комуникация, което спестява достъп до диска (за сметка на паметта).

  • Подайте -jn опция на make(1) за да стартирате няколко процеса паралелно. Това обикновено помага независимо дали имате еднопроцесорна или многопроцесорна машина.

  • Файловата система съдържаща /usr/src може да се монтира (или ре-монтира) с опция noatime. Това спестява на файловата система презаписването на времето на достъп. Вероятно тази информация няма да ви е нужна така или иначе.

    # mount -u -o noatime /usr/src
    

    Warning Примера предполага, че /usr/src е на отделна собствена файлова система. Ако не е (ако част от /usr например) тогава трябва да използвате тази точка на монтиране, а не /usr/src.

  • Файловата система съдържаща /usr/obj може да се монтира (или ре-монтира) с опция async. Това указва, че ще се пише асинхронно на диска. С други думи записа завършава мигновенно, а данните ще бъдат записани на диска след няколко секунди. Това позволява записите да бъдат групирани по няколко и може да доведе до драстично увеличение на производителността.

    Warning Имайте предвид, че тази опция прави файловата система по-чуплива. С тази опция шанса файловата система да се озове в unrecoverable state след рестартиране поради прекъсване на захранването се увеличава.

    Ако /usr/obj е единственото нещо върху тази файлова система, тогава това не е проблем. Ако имате други важни данни на същата файлова система тогава си подсигурете обновено резервно копие на тази файлова система преди да използвате тази опция.

    # mount -u -o async /usr/obj
    

    WarningЗа горното, ако /usr/obj не е върху собствена файлова система, то го заменете със съответната точка на монтиране.

21.4.15.6. Какво да правя ако нещо се обърка?

Убедете се, че вашата среда (environment) няма остатъчни неща от предишни компилации. Това е доста лесно.

# chflags -R noschg /usr/obj/usr
# rm -rf /usr/obj/usr
# cd /usr/src
# make cleandir
# make cleandir

Да, make cleandir наистина трябва да се изпълни два пъти.

След което рестартирайте целия процес, започвайки с make buildworld.

Ако все още имате проблеми изпратете грешката и изхода от uname -a на FreeBSD general questions mailing list. Бъдете готови да отговорите на други въпроси относно вашата конфигурация и настройки!

Този и други документи можете да намерите в ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

За въпроси относно FreeBSD, прочетете документацията преди да попитате в <questions@FreeBSD.org>.
За въпроси относно този документ, e-mail <doc@FreeBSD.org>.