Showing posts with label freebsd. Show all posts
Showing posts with label freebsd. Show all posts

Thursday, October 19, 2006

Thoughts on HFSC

Реших да напиша стятия за PF ама то като гледам с каква скорост се развивата няма да стане скоро. Затова ще опитам да си разясня HFCS планировчика. Ще поясня основните неща, оптимизацията и "хватките" са си ваше дело.

Откъде идва името HFSC? Това е съкращение на Hierarchical Fair Service Curve Algorithm. Ето и каква е идеята. Добре е планировчика да се самонаглася и да взема рашения според случая - selfadopted.
В HFSC има ДВА планировчика(packet schedularas). Първия е гарантирания или т.н. realtime, а втория linkshare. HFSC ще избере автоматично, коj от двата ще използва ako на места параметрите се препокриват. Параметрите, които контролират тези два планировчика са:

realtime - той контролира минималната ширина (bandwidth), която се изисква от опашката. Когато има възможност HFSC предпочита този, той е default. Големината му ще нараства докато се достигне лимита на канала или се достигне upperlimit ограничението. Ако нямаме realtime планировчик или "интернета" ни е малко и не можем да гарантираме нужния минимум, ще се използва linkshare. Този параметър e опционален.

Още по нагледно:


if (there is an eligible packet)
/* real-time criteria */
send eligible packet with min. deadline d ;
else
/* link-sharing criteria */
send packet with min. virtual time v ;


linkshare - той определя колко да се вземе трафика за текущата от опашката баща (parent queue). Разпределя пропорционално интернета. Ако имаме излишък той ще се използва според допълнителните параметри или докато се достигне upperlimit (ako e упоменат). И този параметър е опционален.

Mалко по особено е. Където са дефинирани realtime и linkshare и параметрите в тях се препокриват ще се предпочете realtime. Realtime е планировчика по подразбиране. И още нещо, ако в дефиницията на опашката (а не в altq) не се използва linkshare задължително трябва да се напише bandwidth! В противен случай pfctl ще се оплаче. Запомнете го, макар май се промени това в новите версии на pf.

Надлежно показвам какво съм видял в кода:

ls - linkshare
rt - realtime
ul - upper limit

/* if link_share is not specified, use bandwidth */
if (opts->lssc_m2 == 0)
opts->lssc_m2 = pa->bandwidth;

if ((opts->rtsc_m1 > 0 && opts->rtsc_m2 == 0) ||
(opts->lssc_m1 > 0 && opts->lssc_m2 == 0) ||
(opts->ulsc_m1 > 0 && opts->ulsc_m2 == 0)) {

warnx("m2 is zero for %s", pa->qname);
return (-1);
}

Пример:

altq on $ext_if hfsc bandwidth 45Mb
queue{dns, ssh, www, mail, other}
queue dns bandwidth 10%
queue ssh bandwidth 10%
queue mail bandwidth 20%
queue www bandwidth 40%
queue other hfsc(default)


upperlimit - това е максималното количество "интернет", което някоя от опашките може да използва. И още нещо, което се разбира ама аз да си го кажа: Стойността на upperlimmit трябва да е по-голяма от лимитите поставени в realtime и linkshare. Този параметър е опционален.

Нуждаем се и от малко теория. Ето и необходимата порция.
След всеки един от тези параметри има число, което указва каква част от интернет потока трябва да се задели или от следните 3 числа (m1 d m2). Какво заначат тези числа

m1 - първоначалното количество интернет.
d - забавянето (time delay, in milliseconds)
m2 - корекция на количеството интернет

Тези параметри определят така наречената "сервизна крива" (service curve). Tя може да бъде два типа:
изпъкнала (convex) при m1 > m2
вдлъбната (concave) при m1 < m2.

ВАЖНО:
1) realtime параметрите не могат да бъдат по-големи от 75% от целия ни интернет (total interface bandwidth)
2) кривата на realtime трябва да е винаги изпъкнала (m1 > m2).

Да онагледим нещата:

# PARENT QUEUE DEFINITION
altq on $ext_if hfsc bandwidth 45Mb
queue{dmznet, prvnet, others}

# CHILD QUEUE DEFINITIONS
# ако пакетите се задържат до 10 сек. ще вземе 50% или повече
# от цялия интернет. Когато пакетите пристигат повече и повече и
# планировчика ги задържа повече от 10 сек. ще се опита да се коригира
# и завземе 65% от интернета.
queue dmznet hfsc(linkshare (50% 10000 65%))

# и тук е същото, само че ще се коригира към по-малко!
queue prvnet hfsc(linkshare (40% 5000 25%))
queue others hfsc(default)


Нека да поясним нещата. Може да разглеждате опашките като скачени съдове, едното е за сметка на другото. Затова сумата от параметрите от един вид не трябва да надвишават количеството интернет (total bandwith) като default опашката не влиза в тия сметки. Тези стойности могат да са %, b, Kb, Mb, Gb.

Да направим анализ. Да кажем, че в DMZ зоната има FTP сървър и в един момент почва да бълва трафик и "тръбата" от 50% не може да смогне (бави пакетите повече от 10 сек.) затова планировчика я разширява автоматично. Разширяването е за сметка обаче на privnet. Защо съм сложил съм 5 сек? Расъждавам така, ако някое типче тръгне да сваля нещо ще запълни "тръбата" и аз ще го резна като изрично намаля капациета. Второ, ако забавянето е повече от 5 сек. то някъде другаде(в случая dmz зоната) става нещо, трябва повече интернет. Хм, за оптимизацията се разбрахме не мога да кажа точно какво трябва да е забавянето (delay).
Запамети. Горната граница на разширяването може да се ограничи единствено от upperlimit.

Нещата стават още по-интересни, когато намесим и realtime. Kакто ви казах могат да бъдат дефинирани едновременно. HFSC автоматично ще избере, кои ще свърши по-добра работа. Може да изберете да имат еднакви параметри, може и да измислите нещо по-хитро. Дерзайте, но не забравяйте, че сервизната крива на realtime винаги трябва да бъде изпъкнала (m1 > m2). И от тук и простичкото правило: ако искате при забавяне да увеличите канала - linkshare, ako не - realtime.

Пример:

# PARENT QUEUE DEFINITION
altq on $ext_if hfsc bandwidth 45Mb
queue{dmznet, prvnet, others}

# CHILD QUEUE DEFINITIONS
queue dmznet hfsc(linkshare (50% 10000 65%))

# HFSC ще избере сам.
queue prvnet hfsc(realtime (40% 5000 25%) linkshare (40% 5000 25%))
queue others hfsc(default)

И остана последно смятането на количествата интернет. Сравнете следните два примера:

# CBQ
altq on $ext_if cbq bandwidth 20Mb queue{dmznet, prvnet, others}

# prvnet gets 8Mb
queue prvnet bandwidth 40% queue{host1, host2}
# host1 gets 4Mb
queue host1 bandwidth 50%

# host2 gets 4Mb
queue host2 bandwidth 50%

# HFSC
altq on $ext_if hfsc bandwidth 20Mb queue{dmznet, prvnet, others}

# prvnet gets 8Mb
queue prvnet hfsc(linkshare 40%) queue{host1, host2}
# host1 gets 4Mb
queue host1 hfsc(linkshare 20%)

# host2 gets 4Mb
queue host2 hfsc(linkshare 20%)


Какво се забелязва? CBQ разпределя параметрите спрямо parent опашката, а HFSC спрямо root! Много често се греши внимавайте!

Искам да спомена и един друг параметър, който често пипам qlimit. Той определя колко да е голяма опашката и от там колко гладко да се обработва. По подразбиране е 50 пакета. Преди да правите радикални промени поиграйте си с qlimit.

queue oRel bandwidth 128Kb qlimit 100 hfsc( linkshare 128Kb ) { oRelTCP, oRelUDP }
queue oRelTCP bandwidth 64Kb qlimit 60 hfsc( linkshare 64Kb default red )
queue oRelUDP bandwidth 64Kb qlimit 60 hfsc( linkshare 64Kb)


Какво да използваме? Ако искаме да сортираме трафика по приоритет ще се възползваме от PRIQ. Ако искаме да разпределим нещата "на калпак" - CBQ. И накрая ако искаме всичко това плюс разни други красиви добавки HFSC.

Thursday, March 16, 2006

Polished FreeBSD box

И сега, когато си имаме Super FreeBSD Box е време за някой хватки, които ще ни помогнат в нашето ежедневие.



1. Клавиатурната подредба, малко е кофти. Insert, Home, End... не работят. So what?

Сложете в .inputrc.


set meta-flag on
set output-meta on
set convert-meta off

"\e[1~": beginning-of-line
"\e[2~": yank
"\e[3~": delete-char
"\e[4~": end-of-line
"\e[C": forward-char
"\e[D": backward-char
"\e[A": previous-history
"\e[B": next-history
"\C-?": delete-char
"\C-H": backward-delete-char
"\e[1~": beginning-of-line
"\e[4~": end-of-line

2. Искате ви се да имате готин emacs:

Сложете в .emacs:

;; Syntax highlight
(global-font-lock-mode t)

;; Higlight the marked region (C-SPC)
(transient-mark-mode t)


;; Some useful key bindings
(global-set-key [home] 'beginning-of-line)
(global-set-key [end] 'end-of-line)

;; Display matters
(display-time)

(setq blink-cursor nil)
(setq column-number-mode t)
(setq visible-bell t)
(setq tab-width 4)

;; wheel mouse
(global-set-key [mouse-4] 'scroll-down)
(global-set-key [mouse-5] 'scroll-up)


3. Ама мен bash по ме кефи. OK, baby!

Инсталирате си го и направете

chsh -s /usr/local/bin/bash

4. Искам prompt-та да ми е по-така!

В .bashrc се написва:

PS1="\t \u@(\[$(tput md)\]\w\[$(tput me)\])"
case `id -u` in
0) PS1="${PS1}# ";;
*) PS1="${PS1}$ ";;
esac



5. Как да mount-на флопито?

Създравате директорита /fdd в root директорията. После в /etc/fstab се добавя:

/dev/fd0 /fdd msdos rw,noauto 0 0

и сега вече се пише само: mount /fdd



6. Как лесно да си пусна настройките на X-a?


/usr/X11R6/bin/xorgconfig -textmode

7. Как да ми проработи колелцето на мишката?

Добавете следните редове в /etc/X11/xorg.conf

Option "ZAxisMapping" "4 5"
Option "Buttons" "5"

8. Искам да си играя игрички, човече?

OK, ама нещата тук не са лесни. Трябва да се инсталира nVidia драйвера. Ето и стъпките, които трябва да се следват:


--- Редактираме /boot/loader.conf. В него добавяме:

#Nvidia driver
nvidia_load="YES"

#Nvidia's agp driver
agp_load="YES"

#Linux compatibility support
linux_load="YES"


---(optional) Ако нямате инсталирани следните приложения, направете го:

cd /usr/ports/emulators/linux_base-8 && make install clean
cd /usr/ports/x11/linux-XFree86-libs && make install clean


--- Инсталираме nVidia драйвера

cd /usr/ports/x11/nvidia-driver && make install clean
cd /usr/ports/x11/nvidia-settings && make install clean


--- (IMPORTANT) Трябва да забраним FreeBSD драйвера!
Редактираме /boot/device.hints

hint.agp.0.disabled="1"


--- Конфигурираме X server, като редактираме /etc/X11/xorg.conf

# (1) Uncomment
Load "glx"

# (2) Scroll down to the "server flags" section of the file
# and insert the line shown below
Option "NvAGP" "1"

# (3) In the part that says "Driver", replace the "nv" with "nvidia",
Driver "nvidia"


--- (EXTRAS) Maлко да засилим нещата, като добавим в /etc/sysctl.conf:

#Enable AGP Side band Addressing
hw.nvidia.registry.EnableAGPSBA=1

#Enable AGP Fast Writes
hw.nvidia.registry.EnableAGPFW=1


E това е за сега, но това е само началото...


Friday, October 14, 2005

Importance to be FreeBSD (part 2)

    Разделянето на твърдия диск(HDD) е доста по-различно под FreeBSD и затова реших да отделя специална част в моята поредица. За целта ще го сравня с DOS/Linux начина. За да ви е лесно трябва да запомнте:
"UNUX partition" е нещо различно от "DOS/LINUX partition" !
    Сега вече можем да започнем. Linux следва пътя оставен от MS-DOS, при разделянето на диска. Този път обаче е ограничен от PS BIOS. Ето какво имам впредвид. Всяко HDD може да има най-много 4(четири) Primary partitions. Ако искате да имате повече от 4 partitions трябва да използвате hack-a въведен в MS-DOS 3(мисля, че първо там се появява първо). В какво се състои той? Hack-a позволява да се конвертира един от дяловете от Primary в т.н. Extended. Самият Extended от своя страна се разделя на Logical. BIOS-a "вижда" само четири дяла, но на практика можете да имате повече. Ухааа, сложно а? Ще се опитам да илюстрирам:

Най-старата идея


Primary 1
Primary 2
Primary 3
Primary 4

Еволюцията на MS DOS идеята

Primary 1
Primary 2
Primary 3
Extended
Logical 1
Logical 2
Logical 3
etc...

С тази схема на разделяне може да слагате и напасвате различни операционни системи,
но затова са нужни доста дялове, защото трябва да се придържаме към схемата. Един
пример. Да предположим, че искаме да инсталираме Windows 98, Windows 2000 и Linux. Ето и резултата:

Primary 1: Linux /boot
Primary 2: Windows 98
Primary 3: Windows 2000
Extended :
Logical 1: Linux /
Logical 2: Linux /home
Logical 3: Linux /usr
Logical 4: Linux swap
Logical 5: Shared Data


Забелязвате ли прехвърлянето от Primary към Logical. Истината е някъде другаде!
Истинските Unix системи, като *BSD и Solaris използват друга схема на разделяне, която е далеч по-гъвкава и ясна. В PC архитектурата BIOS-a все още разпознава само четири дяла(има и системи, в които този проблем не съществува).
Хм, а как тогава ще се заобиколи проблема? Unix третира всеки Primary partition(Unix въвежда термина - slice) като Extended partition! Тези slice-ве се разделят допълнително за нужните ни дялове, за да разположим директориите. Обърнете внимание, че термина partition в UNIX има друг смисъл - той е дял от slice! Така че, ако трябва да се върнем към горния пример (Windows 98, Windows 2000 и Unix) ще получим следната схема:

Primary 1: Unix slice
Primary 2: Windows 98
Primary 3: Windows 2000
Extended :
Logical 1: Shared Data

В самия UNIX slice се разполагаме удобно:

Primary 1: Unix slice
/boot
/
/home
/usr
/var
/tmp
swap
Primary 2: Windows 98
Primary 3: Windows 2000
Extended :
Logical 1: Shared Data

Ако използвате Linux модела, при пускане на DOS fdisk ще видите 3 Primary и 5 Logical в Extended дяла. Същото ще е и при пускане на Linux fdisk.
Ако пък минете по пътя на UNIX и пуснете DOS fdisk ще видите 3 Primary и 1 Logical в Extended дяла. При пускане на UNIX fdisk виждате същото, но допълнително още се показват и UNIX partitions в UNIX slice-a.

Не мога да кажа, коя идея е по-добра. Сравнявам двата метода, за да обясня по-добре идеята за UNIX slice. За мен лично при UNIX нещата стоят по-добре, една операционна система на едно място, а споделените неща на друго. При DOS/LINUX нещата се смесват, няма ясна граница и лесно може да се обърка човек.
За пълнота ще кажа и няколко думи за именоването. Всеки partition в FreeBSD се идентифицира с букви от a до h. Всеки partition може да съдържа само една файлова система. Ето и таблица на имената на устройствата:

ad ATAPI (IDE) disk
da SCSI direct access disk
acd ATAPI (IDE) CDROM
cd SCSI CDROM
fd Floppy disk


Схемата на съставяне на имената е следната:

(име на устройство)(номер на slice)(partition)


Веднага давам пример:

ad0s1a The first partition (a) on the first slice (s1) on the first IDE disk (ad0).
da1s2e The fifth partition (e) on the second slice (s2) on the second SCSI disk (da1).


Сега запис от вида:

Filesystem Size Used Avail Capacity Mounted on
/dev/ad6s1a 496M 63M 394M 14% /
/dev/ad6s1e 17G 26K 16G 0% /home
/dev/ad6s1d 16G 2.0G 13G 13% /usr
/dev/ad6s1f 1.8G 27M 1.6G 2% /var

ви говори много повече.

Wednesday, August 10, 2005

Importance to be FreeBSD (part 1)

   Тази първа част ще я посветя на инсталацията на FreeBSD. Водя се от принципа: "Ако се чупи нещо, то да е колкото се може по-рано". Така се предпазвам от безкрайно търсене в FreeBSD Google за решаването на някой проблем. Правя базовата система и не бързам с X - desktop. Стъпките, които ще предложа тук са съвсем начални, но те са достатъчни за лесна по-нататъчна надстройка и подръжка. Някои неща съм спестил, а в някои съм изложил в дълбочина. Инсталацията обаче може да поеме в толкова много посоки, че е невъзможно да се опише.
   Когато се появи менюто избирам Custom. От там разделям диска (40 GB):


Filesystem Size Mounted on
/dev/ad6s1a 512M /
/dev/ad6s1b 1G swap
/dev/ad6s1e 22G /home
/dev/ad6s1d 10G /usr
/dev/ad6s1f 2G /var
/dev/ad6s1g 838M /tmp (каквото е останало, но по-голямо от 512MB)

Отедлил съм 1G (2хRAM приблизително) за SWAP по възможност в началото на диска. Ще имате и нуждата от linprocfs ще я разберете, когато започнете да инсталирате java виртуалната машина. Не го забравяйте! В един момен трабва да добавите в fstab:
linprocfs   /compat/linux/proc   linprocfs   rw   0  0

Като втора стъпка инсталирам съвсем малко неща, които ще ми са нужни за начало. От менюто избирам Distributions и селектирам:
src(за да мога да компилирам ядрото), binaries(те са required). Така, до тук добре вече имаме базовата система. Останаха някои дребни добавки - Root Password, Time Zone, Mouse enable, Network(enable interface). Тук е и момента да се добави user. Когато се прави нов потребител, добре е да се знае, че само потребители от групата wheel могат да използват командата su. Преценете сами. Е, може да не вярвате, но имаме работеща FreeBSD система!
    Може би е добре да разясня каква ми е идеята. Искам да направя компютър, който да го ползвам за workstation. Моето PC не е първа младост, така че се старя да оптимизирам максимално FreeBSD-то. Една от първите стъпки в тази посока е инсталацията на приложенията. Искам да инсталирам от сорсовете т.н. ports. Каква е подготовката? Инсталирам надлежно както следва:

# pkg_add -r cvsup-without-gui
# pkg_add -r fastest_cvsup
# pkg_add -r portupgrade
# pkg_add -r docproj-nojadetex

Приготвям нещата за използването на cvsup. Създавам /root/cvs-supfile със следното съдържание:

#
# See variable PACKAGESITE in .cshrc(.bashrc)
# when update to next STABLE
#
*default host=cvsup7.freebsd.org
*default base=/var/db
*default prefix=/usr
*default tag=RELENG_6
*default release=cvs delete use-rel-suffix compress
src-all
doc-all tag=.

Не се изкушавайте да вземате последното ядро дори и това да не е сървър(с опцията *default tag=.). В HEAD-а на CVS попадат доста експериментални(някои неуспешни) неща има и много debug съобщения, затова като цяло системата ви ще работи по-бавно. Ако е продукционна системата, сложете *default tag=RELENG_6(STABLE release) например. За да не тегля всичко мога да укажа кои документи НЕискам. За целта създавам директориите /var/db/sup и /var/db/sup/doc-all. В /var/db/sup/doc-all поставям файла refuse. Ето какво има в него:

doc/bn_*
doc/da_*
doc/de_*
doc/el_*
doc/es_*
doc/fr_*
doc/it_*
doc/ja_*
doc/nl_*
doc/no_*
doc/pl_*
doc/pt_*
doc/ru_*
doc/sr_*
doc/tr_*
doc/zh_*

Мммда готови сме за първия старт на cvsup.
# cvsup -L2 -h  cvsup.freebsd.org /root/cvs-supfile

Тя ще обнови всички сорсове в базовата система и документацията. Ще положим малко усилия и за портовте. Използва се portsnap.

# portsnap fetch
# portsnap extract

Първата команда прави download на "порт дървото", а втората го слага в /usr/ports. Управляващия файл e /etc/portsnap.conf.
Приемете нещата там "по default" - махнете коментарите. Там може и да окажете НЕжеланите портове, за да спестите малко време.

REFUSE arabic chinese french german hebrew hungarian japanese korean
REFUSE polish portuguese russian ukrainian vietnamese
REFUSE astro biology


Kроя планове и за автоматизация. Един скрипт, които да пускам, докато си пия сутришното кафе и той да ми подсказва какво трябва да update-на. Идеята си струва, ще знам дали съм up-to-date само с една команда. Преминавам към действие. За да имам документацията само на английски са нужни малко обходни стъпки. Променям една част от /usr/doc/Makefile файла:

.if defined(DOC_LANG) && !empty(DOC_LANG)
SUBDIR = ${DOC_LANG}
.else
SUBDIR = en_US.ISO8859-1
.endif


За съжаление cvsup ще "забърше" моите промени, и затова правя хитринка:

# cp /usr/doc/Makefile /usr/doc/Makefile.orig


Ето и моя работещ cvsupScript.sh:


#!/bin/sh

#Use fastest_cvsup to find fastest geographically
#close mirror; I'll check Russion, Germany

if SERVER=`fastest_cvsup -q -c ru,de`
then
echo "Running cvsup...(src, doc)"
cvsup -g -L 2 -h $SERVER /root/cvs-supfile
else
echo "Oooops! There's a problem" 1>&2
exit 1

fi

# Before this you have to run:
# portsnap fetch && portsnap extract
echo "Updating ports tree...(/usr/ports)"
cd /usr/ports
portsnap fetch
portsnap update
make fetchindex
portsdb -u

# Also see /var/db/refuse
echo "Buiding docs..."
cd /usr/doc
cp Makefile.orig Makefile
make install > /dev/null


echo "The following ports need upgrading: "
portversion -l "<"


echo "DONE. Finished at `/bin/date`."
echo "=========================================

This script will NOT upgrade your ports!
Manually run:
(Do NOT forget to read /usr/ports/UPDATING before!)

portupgrade -varR

Only sources download:

portupgrade -aFrR

Tip: To delete unused downloaded sources run:

portsclean -D

========================================="
exit

Ура! Вече не е проблем да поддържаме системата up-to-date.
След като се стартира скрипта, той подсказва по-нататък как да се процедира.

Забележка 1: Не случайно в края на скрипта отпечатвам съобщение да се прочете /usr/ports/UPDATING. Това често се забравя и се допускат нелепи грешки. Ето пример:

===> kdelibs-3.5.0 conflicts with installed package(s):
kdebase-3.4.3_1

They install files into the same place.
Please remove them first with pkg_delete(1).
*** Error code 1

Stop in /usr/ports/x11/kdelibs3.
*** Error code 1

В новата версия на kdelibs има сменени пътища на някои библиотеки и portupgrade няма да се справи. Съобщението Please remove them first with pkg_delete(1) е вярно, но не и достатъчно. Целия алгоритъм в случая е описан в UPDATING файла. Намерете го:

cat /usr/ports/UPDATING |grep -B 2 -e "AFFECTS\:.*kdebase.*" |less

Ориентирайте се по датата(най-близката) и научете C, помага при разгадаването на съобщенията за грешка.
Друг проблем, който иска повече познания е следния:

===> Configuring for libbonobo-2.6.2
checking for a BSD-compatible install... /usr/bin/install -c -o root -g wheel
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... no
checking for nawk... nawk
checking whether gmake sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for perl... /usr/bin/perl
configure: error: XML::Parser perl module is required for intltool

Тук нещата са завоалирани. Aко караме по стандартната процедура е редно да проверим дали е инсталиран такъв parser.

pkg_info |grep parser
bison-1.75_2,1 A parser generator from FSF, (mostly) compatible with Yacc
expat-2.0.0_1 XML 1.0 parser written in C
jade-1.2.1_9 An object-oriented SGML/XML parser toolkit and DSSSL engine
libxml2-2.6.23_1 XML parser library for GNOME
p5-XML-Parser-2.34_2 Perl extension interface to James Clark's XML parser, expat

Ами този последния може би е подходящия, но за бога той съществува! Лекарството е преинсталиране!

portupgrade -r -f p5-XML-Parser

Всяко правило си има изключение.
Забележка 2: portupgrade -varR не винаги минава гладко! Понякога ни напомня, че трябва да се пусне pkgdb -F. Въпросите, които задава pkgdb -F са трудни и затова ще ги илюстрирам с пример:

# pkgdb -F
---> Checking the package registry database
Stale dependency: digikam-0.5.1 -> openldap-client-2.1.23
(net/openldap21-client):
open-motif-2.2.2_2 (score:23%) ? ([y]es/[n]o/[a]ll) [no]
New dependency? (? to help):
Skip this? ([y]es/[n]o/[a]ll) [yes]


Какво значи това? Ами няма инсталиран openldap-client-2.1.23! Опитва се да намери "нещо подобно" с не много добър успех както се вижда - score: 23%. Ако обаче резултата е повече от 70% изберете yes! Иначе лекарството е:

# cd /usr/ports/net/openldap21-client
# make install && make clean


Съвета ми е: не бързайте с отговорите! Правете провреки. Ето и друг пример:

# pkgdb -F
---> Checking the package registry database
Stale dependency: Mesa-3.4.2_2 -> fontconfig-2.2.0 (x11-fonts/fontconfig):
New dependency? (? to help): ?
[Enter] to skip, [Ctrl]+[D] to delete, [.][Enter] to abort, [Tab] to complete


Хммм. Я бързо една справка:

# pkg_info -I fontconfig\*

Е? Какъв е резултата? Ако има инсталиран fontconfig, коя версия е? Ако сте доволен от отговорите на зададените въпроси посочете fontconfig-2.2.0. Ако го няма - инсталирайте. Think!

До тук с "лошите" страни на portupgrade. Една нова възможност, която научих наскоро е да накарам portupgrade да използва pakages вместо ports при update. Така избягвам компилацията на големи пакети, примерно на OpenOffice, който е инсталиран като:

pkg_add -r openoffice.org

FreeBSD не се "бърка" при инсталирането и на packages, и на ports! За да бъдем още по-бързи в .cshrc (или .bashrc, зависи какъв shell се ползва) добавяме:

# Edit this when switch to next STABLE (see cvs-supfile)
setenv PACKAGESITE ftp://bg.freebsd.org/pub/FreeBSD/ports/i386/packages-6-stable/Latest
setenv PKG_SITES ftp://bg.freebsd.org/pub/FreeBSD/ports/i386/packages-6-stable/Latest

Това е сървъра - "ФЮТ". Много ме кефи името!
Параметрите за update са следните:

portupgrade -varRPP

Идва ред на оптимизацията на ядрото. Как се прави ново ядро? Ето подготовката:


# cd /usr/src/sys/i386/conf
# mkdir /root/kernels
# cp GENERIC /root/kernels/NEX_KERNEL
# ln -s /root/kernels/NEX_KERNEL


Преди да се захвана с ядрото оптимизирам малко компилатора. Добaвям типа на процесора(Duron 1.3G) в /etc/make.conf

CPUTYPE?=k7

и започвам с редакцията на параметрите на ядрото (моето съм го кръстил NEX_KERNEL). Аз лично махам всичко, което не ми е нужно на първо четене. После добавям параметрите за оптимизация, в случая:


machine i386
cpu I686_CPU
ident NEX_KERNEL
makeoptions COPTFLAGS="-O2 -pipe -funroll-loops -ffast-math"

options SCHED_ULE # NEW scheduler instead of SCHED_4BSD



Най-накрая слагам допълнителните неща:

# Better console
options VESA
options SC_PIXEL_MODE

# Security: PF
device pf #PF OpenBSD packet-filter firewall
device pflog #logging support interface for PF
device pfsync #synchronization interface for PF

# Traffic bandwidth( to test it use pchar, iperf )
options ALTQ
options ALTQ_CBQ # Class Bases Queueing
options ALTQ_RED # Random Early Detection
options ALTQ_RIO # RED In/Out
options ALTQ_HFSC # Hierarchical Packet Scheduler
options ALTQ_CDNR # Traffic conditioner
options ALTQ_PRIQ # Priority Queueing


Хайде да направим новото ядро:

cd /usr/src
make buildkernel KERNCONF=NEX_KERNEL
make installkernel KERNCONF=NEX_KERNEL

За да използвам pf добавям в /etc/rc.conf

## My firewall will needs this
# То read logs use: tcpdump -n -e -ttt -r /var/log/pflog > /var/log/pflog.txt
pf_enable="YES" # Enable PF (load module if required)
pf_rules="/etc/pf.conf" # rules definition file for pf
pf_flags="" # additional flags for pfctl startup
pflog_enable="YES" # start pflogd(8)
pflog_logfile="/var/log/pflog" # where pflogd should store the logfile
pflog_flags="" # additional flags for pflogd startup

## ...and to be a getaway
gateway_enable="YES" # Enable as LAN gateway

## Better console resolution
allscreens_flags="-g 100x37 VESA_800x600"


и в /etc/pf.conf (Скоро ще публикувам и специална тема за PF и traffic bandwidth)


ext_if="xl0"

altq on $ext_if priq bandwidth 150Kb queue { q_pri, q_def }
queue q_pri priority 7
queue q_def priority 1 priq(default)

pass out on $ext_if proto tcp from $ext_if to any flags S/SA keep state queue (q_def, q_pri)

pass in on $ext_if proto tcp from any to $ext_if flags S/SA keep state queue (q_def, q_pri)


Край! Готово! След reboot трябва да имаме перфектна FreeBSD основа. Надграждането на системата вече е в наши ръце. Ето как процедирам аз, когато добавям приложение. Преди всичко трябва да го намеря в CVS дървото.

# cd /usr/ports
# make search key=<ключова дума> |less

или

# make search name=<името на приложението>

След като го намеря, инсталирам:

# cd /<пътя до приложението>
# make install && make clean


И така, малко по малко изграждам моя workstation инсталираните приложения са достатъчно оптимизирани, a имам и начин за лесен update. Искам да кажа, почти лесен. Понякога някои приложения ги инсталираме с определени опции. Например Apache, да може да работи с subversion.

cd /usr/ports/www/apache20
make install WITH_BERKELEYDB=db42 && make clean

cd /usr/ports/devel/subversion
make install -DWITH_MOD_DAV_SVN && make clean

Ако машинално напишем (или се подведете от това, което съм писал по-горе хехехе):

portupgrade -varR

Всички приложения ще се ъпграйднат с параметрите, които са по default. Помислено е за всичко.

emacs /usr/local/etc/pkgtools.conf

Ориентирам се отново по коментарите и примерите. В случая:

## Apache, Subversion
MAKE_ARGS = {
'www/apache20' => 'WITH_BERKELEYDB=db42',
'devel/subversion' => 'WITH_MOD_DAV_SVN=1'
}

Приложенията се изброяват със запетая, а параметрите им са разделени с интервал. Relax - FreeBSD работи вече за мен.

Забележка 3: За да компилирам цялата система използвам следната процедура:

cd /usr/src
make buildworld (ще трябва доста да изчакате!)
make buildkernel KERNCONF=NEX_KERNEL
make installkernel KERNCONF=NEX_KERNEL
shutdown now
-> ще направи системата в "single user mode". Още малко усилия:
# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a

-> Знаете какво е CVS, нали?
mergemaster -p
make installworld
mergemaster

shutdown -r now

Когато се преминава от една версия към друга естествено трвбва да се премахнат старите весии на библиотеките и на файловете от /lib. За целта:

make delete-old
make delete-old-libs



Това в всичко пиятели. Ще правя update на статията. Следете я!

algorithms (1) cpp (3) cv (1) daily (4) emacs (2) freebsd (4) java (3) javascript (1) JSON (1) linux (2) Lisp (7) misc (8) programming (16) Python (4) SICP (1) source control (4) sql (1) думи (8)