LINUX-BG Адрес : http://www.linux-bg.org |
Крайна цел: FreeBSD |
От: zlatozar Публикувана на: 24-02-2006 Адрес на статията: http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=devs&key=380207153 |
За мен разликата в поддръжката на UNIX системите най-общо може да се
сведе до инсталиране и правилен update. Разбира се има много други неща,
но като за начало трябва да се научим да правим това. От там нататък
свикваме с идеологията и научаваме "триковете". Дали ни харесва?
Многознаяително се казва - въпрос на вкус. Когато започнах да се
занимавам с FreeBSD нещата при update ми изглеждаха сложни. Те ще
останат такива ако човек не прояви любопитство и желание за развитие.
Научете какво е CVS, make, merge и разбира се езика С! Експериметирайте!
Питайте! На мен ми трябваше доста време да разбера и да автоматизирам
update-a. В тази статия ще се опитам да опиша нещата, макар и с
правописни грешки. Искам ми се да бъда полезен и за това не се колебайте
да ме питате и поправяте. Надявам се да учим заедно.
Първата трудност идва с разделянето на твърдия диск(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ви говори много повече. Дано съм го обяснил добре, защото почвам с инсталацията и няма връщане назад. Водя се от принципа: "Ако се чупи нещо, то да е колкото се може по-рано". Така се предпазвам от безкрайно търсене в FreeBSD Google за решаването на някой проблем. Правя базовата система и не бързам с X - desktop . Стъпките, които ще предложа тук са съвсем начални, но те са достатъчни за лесна по-нататъчна надстройка и подръжка. Някои неща съм спестил, а в някои съм изложил в дълбочина. Инсталацията обаче може да поеме в толкова много посоки, че е невъзможно да се опише. Налага се да ми се доверите. Когато се появи менюто избирам Custom . От там разделям диска (40G): 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 пo възможност в началото на диска. Ще имате и нуждата от 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 система! Когато менютата са пред вас ще ви бъде по-лесно. Тук искам да направя едно голямо отклонение. Нещо като разяснявне на идеологията, малко история и леко намигване към Linux феновте. Ще се опитам и да ви въведа в FreeBSD терминологията. Мнoго хора използват Linux (някоя от многото дистрибуции). Общо взето всички сме съгласни, че е добре да се използва тип Unix операционна система, но винаги сме на различно мнение за това коя от многото разновидности е "вярната". За да разберем как и защо една Unix система е по-добра от друга, трябва да навлезем дълбоко под повърхността. Нещо, което остава често незабелязано е начина на разработка, йерархията в екипите и начина на пускане на версия. Понякога се отчитат само полирания графичен интерфейс и начина на инсталация или на градски слухове от рода "един пич ми каза". Често срещан цитат от BSD фолклора е: "BSD е тогава, когато група Unix хакери се опитват да портнат Unix на PC и е Linux, когато група PC хакери опитват да напишат UNIX за PC" И това е така. Историята на двете операционни системи го доказва. Докато BSD се систематизира и се проекира, Linux просто набъбва. Ще припомня, че BSD е пряк наследник на UNIX разработен от през 60-те години от Кен Томсон и Денис Ритчи. Докато Linux се започва от самото "нищо" от Линус като студент. И е важно да се отбележи, че това е само ядро на ОС. Linux e щастлива приказка. И така нека да започнем с нещата, за които си заслужава да обърнете по-специално отношение на BSD операционата система. Първо: The Base System Термина "базова система" обърква доста Linux потребителите, защото тази идея не съществува в техния свят. Linux винаги е бил конгломерат. ls, ps, tar и т.н са "допънителни екстри" взети от някъде. За да бъде компютъра използваем му трябва нещо повече от ядро. Linux няма ясна граница между "базова система" и "екстри". Как стоят нещата при BSD? BSD винаги е имал централизиран начин на разработка. "Базова система" се разработва като самостоятелен модул и в него има всичко, което прави компютъра работещ и е готов за допълнителна надстройка. Видахте колко бързо инсталирахме нещата. BSD няма GNU ls или GNU libc, BSD използва BSD ls и BSD libc. X-a не е част от "базовата система" той е допълнителен пакет, който може да се инсталира. Основната разлика е, къде се разработват. Дори и да се използва някои GNU пакет, той се "пипва", така че да може да "пасне" в BSD схемата. Примерно: gcc e FreeBSD компилатор базиран на GNU gcc Всичко се прави така, че системата да работи като цяло, а не на парче. В Linux, "Linux дистрибуорите" решават, кое ще бъде необходимия минимум. Дистрибуции като Debian и Gentoo се справят доста добре. И въпреки всичко Вие можете да подмените примерно libc с пакет взет от някой трети, докато това в FreeBSD не може да стане. Второ: The Ports System "Екстрите" са по желание на клиента. В BSD те се наричат "портове". Тъй като това са програми от "трети лица", са неоходими допълнителни усилия те да станат част от дистрибуцията, тоест на жаргон те трябва да бъдат "портнати". До сега има 13654 портнати приложения и те непрекъснато растат. Една от разликите е, че Linux потребителите инсталират binary пакети, докато FreeBSD потребителите компилират сорсове(могат и binary). При BSD е така заради инструмените, които се предоставят за update и install. Това ще го разгледаме по-късно. В Gentoo съществува подобна идея Portage системата. Трето: Release Engineering FreeBSD използва CVS, за да следи версиите на всеки файл. Какво е CVS, предполагам че знаете. Всички BSD-a дават начин да видите кода, да четете коментарите и да намирате разликата. Много страно е, че Linux не ползваше до скоро revision system. Сега както знаете Линус използва BitKeeper, която забележете е комерсиална. Използването на CVS-a е важно, защото нещата се развиват устойчиво и консистентно всяка една минута. Вие по всяко време можете да изтеглите сорсовете и да компилирате. Linux по-скоро се асемблира! Дава се определено ядро и всичко започва да се "захваща" за него. В FreeBSD има две основни направления след пускане на версията - "CURRENT" и "STABLE", която е и продукционната. Като правило, в "STABLE" се слагат security paches, а в "STABLE" освен това като допълнително могат да се слагат и нови неща. Debian имат почти същия план за работа - "stable", "unstable". Трябва да подчертая, че това са "branches" в CVS дървото, това не се release. За да поемем един от двата пътя използваме съотвтните CVS tags RELENG_X_Y и HEAD. Четвърто: Upgrading Тъй като FreeBSD се разработва като едно цяло, ние можем лесно да вземем цялата "base system" и всички сорсове на портнатите приложения. Забележете, че вземаме промените до последната секунда! После стартирате "buildworld", за да компилирате т.н. userland и после "buildkernel" и имате компилирана работеща операционна система. Пак пропускам подробностите, които ще разгледаме по-нататък. Пето: Ports Когато инсталирате допълнителните приложения вие можете да избирате, дали да инсталирате като "ports"(source) или като "packages" (precompiled binaries). И в двата случая всички "dependancy" ще бъдат решени. После ще ви предложа начин за подържане на системата ви up-to-date посредством CVSup. Ако знаете малко C и нещичко за Makefile ще ви бъде от полза. Всяко приложение се намира в определена директория. Бих казал, че BSD е по-породиста и възпитавана в по-строги правила. Като цяло е тествана от няколко поколения програмисти Тя винаги работи и от там логото: "The Power to Serve". Дава избор HEAD, CURRENT и STABLE. Ako се появи проблем той се поправя много бързо и вие можете да ги вземете на минутата(CVS). Тъй като имате и сорсовете можете да фикснете проблема сами. FreeBSD e направена да работи като едно цяло. И не на последно място FreeBSD може да стартира Linux приложения. Стига отклонения, влизаме в пътя. Може би е добре да разясня каква ми е идеята. Искам да направя компютър, който да го ползвам за 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 със следното съдържание: *default host=cvsup.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 biologyKроя планове и за автоматизация. Един скрипт, които да пускам, докато си пия сутришното кафе и той да ми подсказва какво трябва да 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, помага при разгадаването на съобщенията за грешка. Забележка 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! ) Параметрите са следните: 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 -> Знаете какво е "merge" в CVS, нали? Ще ви трябва при следващата команда mergemaster -p make installworld mergemaster shutdown -r now Сега като я препрочитам "материята е доста сложна". Надявам се поне малко да съм помогнал и да съм създал интерес. Трудно ми е да опростя нещата ще се иска допълнително четене, да знаете. За мен и FreeBSD може да намерите повече тук http://zlatozar.blogspot.com << Размисли по HFSC | Въведение в динамичната оптимизация >> |
Авторите на сайта, както и техните сътрудници запазват авторските права върху собствените си материали публикувани тук,
но те са copyleft т.е. могат свободно да бъдат копирани и разпространявани с изискването изрично да се упоменава името на автора,
както и да се публикува на видно място, че те са взети от оригиналния им URL-адрес на този сървър (http://www.linux-bg.org). Авторските права на преводните материали принадлежат на техните автори. Ако с публикуването тук на някакъв материал неволно са нарушени нечии права - след констатирането на този факт материалът ще бъде свален.
All trademarks, logos and copyrights mentioned on this site are the property of their respective owners.
|