linux

40
1. Въведение 1.1.Какво означава Linux ? Linux е свободна Unix-подобна операционна система започната от Linus Torvalds със съдействието на програмисти от целия свят. Linux е независима POSIX-реализация и поддържа истинска многозадачност, виртуална памет, споделени библиотеки, зареждане при поискване, чисто управление на паметта, мрежови услуги съгласно стандартите TCP/IP, както и други услуги достъпни в Unix-подобните системи. Тъй като е защитена от лиценза GNU General Public License , изходните текстове на програмите формиращи Linux са достъпни за всеки. 1.2.Основни понятия в Linux Като многозадачна операционна система Linux във всеки един момент от работата си поддържа няколко активни програми в паметта. Най-важната и същевременно задължителна програма е ядрото (kernel).То се занимава с управлението на хардуера, паметта, разпределя ресурсите на компютъра между обикновените програми, управлява мрежовия трафик, файловата система и прави още куп важни неща. Останалите активно работещи програми се наричат процеси (process). При стартиране на Linux най-напред в паметта се зарежда и стартира ядрото, което като се намести и разбере че компютъра е в добро здраве, стартира първия процес в системата, който се нарича init. Този процес стартира други процеси (които му се падат деца), те пък стартират още процеси (които са внучета на init), докато накрая нормално работещата Linux система се оказва с около 20-200 стартирани процеса, изпълняващи най- разнообразни задачи. Ние не взаимодействаме пряко с на ядрото. Всички видими дейности в системата се извършват от процесите. Те пък възлагат на ядрото да извършва входно/изходни операции и други важни неща. Процесите могат да си предават един на друг информация по няколко начина, най-важният от които е мрежовата комуникация (networking). Подобно на телефонните разговори между хора, всеки процес може да се опита да се свърже с друг процес, работещ на сьщия или на отдалечен компютьр. Ако другият процес 'вдигне телефона' (приеме TCP връзка), започва обмен на информация. Ако компютърът има един процесор, във всеки един момент може да работи най-много един процес (или ядрото). Но ядрото, използвайки особеностите на хардуера така превключва активните процеси, че създадава илюзията за едновременна работа на всички стартирани процеси.

Upload: haralampi-popov

Post on 19-Aug-2014

105 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: Linux

1. Въведение1.1.Какво означава Linux ?

Linux е свободна Unix-подобна операционна система започната от Linus Torvalds със съдействието на програмисти от целия свят.

Linux е независима POSIX-реализация и поддържа истинска многозадачност, виртуална памет, споделени библиотеки, зареждане при поискване, чисто управление на паметта, мрежови услуги съгласно стандартите TCP/IP, както и други услуги достъпни в Unix-подобните системи.

Тъй като е защитена от лиценза GNU General Public License, изходните текстове на програмите формиращи Linux са достъпни за всеки.

1.2.Основни понятия в Linux

Като многозадачна операционна система Linux във всеки един момент от работата си поддържа няколко активни програми в паметта.

Най-важната и същевременно задължителна програма е ядрото (kernel).То се занимава с управлението на хардуера, паметта, разпределя ресурсите на компютъра между обикновените програми, управлява мрежовия трафик, файловата система и прави още куп важни неща.

Останалите активно работещи програми се наричат процеси (process). При стартиране на Linux най-напред в паметта се зарежда и стартира ядрото, което като се намести и разбере че компютъра е в добро здраве, стартира първия процес в системата, който се нарича init. Този процес стартира други процеси (които му се падат деца), те пък стартират още процеси (които са внучета на init), докато накрая нормално работещата Linux система се оказва с около 20-200 стартирани процеса, изпълняващи най-разнообразни задачи.

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

Процесите могат да си предават един на друг информация по няколко начина, най-важният от които е мрежовата комуникация (networking). Подобно на телефонните разговори между хора, всеки процес може да се опита да се свърже с друг процес, работещ на сьщия или на отдалечен компютьр. Ако другият процес 'вдигне телефона' (приеме TCP връзка), започва обмен на информация.

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

Page 2: Linux

Oсновно понятие в Linux е и файловата система (file system). Тя е йерархична, съдържа файлове, директории, препратки към файлове, както и специални файлове, които са логически образ на хардуерните устройства. Освен това тя е виртуална, тоест дървото от директории може да съдържа прикачени (mounted) едновременно дискови дялове (partitions), принадлежащи на най-различни операционни системи.

Linux е многопотребителска (multiuser) система - различни потребители могат едновременно да ползват компютъра, като всеки от тях има ясно дефинирани права за достъп до различните ресурси на системата. Администраторът на системата (root) има върховни права, останалите потребители са с ограничени права, което ги лишава от възможността да правят големи поразии. Старайте се винаги когато е възможно да работите като обикновен потребител!

Целта на учебника е да изясни основните принципи на Linux. Той не се занимава с детайли. Голяма част от понятията, термините и програмите в Linux са аналогични за всички UNIX-подобни операционни системи, особено за системите с отворен код (FreeBSD, NetBSD, OpenBSD). Това е сложна среда, създавана, синхронизирана и тествана от хиляди програмисти в продължение на 30 години. В тази среда взаимодействията между програмите и стандартите за това взаимодействие са по-важни от реализацията на самите програми. Не се плашете от тази сложност. Постарайте се да научите общите принципи и да усвоите техниката бързо да намирате информация по възникнал проблем, а не да изучавате всичко в дълбочина.

1.3.Как да започнем да учим Linux ?

За да го правите пълноценно, добре е да си инсталирате Linux. Съществуват различни дистрибуции (готови комплекти за инсталиране и ползване), които се различават в дребни детайли. Всяка дистрибуция съдържа инструкции за инсталация, настройка и ползване.

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

Има няколко важни източника на детайлна информация:

HOWTO документите ще ви светнат как да инсталирате и ползвате някои важни средства. Те са предназначени за начинаещи. Обикновено се намират в директорията /usr/doc/HOWTO и /usr/doc/HOWTO/mini. Има ги и на много места в Мрежата.

Командата man име_на_програма_или_функция дава детайлна информация за начина на ползване на съответната програма/функция. Още по-подробна информация за параметрите и начина на използване на програмите и функциите дава командата info име_на_програма_или_функция, чийто текст е организиран с хипертекстови връзки.

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

Стандартите за работа на Мрежата са описни в документите RFC (Requests For Comments). Те са в директория /usr/doc/RFC или подобна а също и на много места в Мрежата.

Най-точната, но и най-трудна за разбиране документация са самите изходни текстове на програмите. Те са за тези, които искат да вникнат в най-

Page 3: Linux

дребните детайли от работата на конкретна програма, с евентуалната цел да поправят грешки или да подобрят работата й.

WhatIs.com е хубав тълковен речник за компютърни термини.

1.4 Кратка история на Linux

Linux е започнатa от Линус Торвалдс, (студент по това време) като програма-хоби.

В началото на разработката на системата той искал тя да прилича на MINIX (малка UNIX ОС разработена от Andy Tanenbaum), затова първите дискусии относно Линукс се провели в USENET групата comp.os.minix.

Най-ранната фаза в работата на Линукс е била съсредоточена върху превключването между задачите в защитеният режим на процесорите 80386, като всичко пишел на асемблер.

Линус пише:

"Мина доста време, докато някой устройства заработиха и оправянето на бъгове стана по-лесно. На този етап започнах да използвам С и това ускори работата ми. Това е също фазата когато вече бях сигурен, че искам да направя "по-добър MINIX". Надявах се да компилирам gcc под Линукс някои ден. Два месеца се занимавах с дребни неща, след няколко дни имах и работещ хард диск (драйвера бе пълен с бъгове, но се случи така че работеше на моята машина), както и малка файлова система. Това беше версия 0.01 (около краят на Август 1991). Не беше нищо особено. Нямаше драйвер за флопи и почти нищо не можеше да прави. Не мисля че някой някога я е компилирал. Но тогава аз вече бях вманиачен и не исках да спирам преди да оставя МINIX далеч назад."

На 5-ти Октомври 1991 Линус обявява първата "официална" версия на Линукс 0.02. В тази версия Линус пуска GNU BASH и gcc (C компилатор) но нищо друго не се държи стабилно. Това е и периода, през който други програмисти се включват в проекта и помагат за неговото развитие. Броят им нараства за версия 0.10. След няколко нови версии Линус пуска версия 0.95 (Март 1992), което показва и неговото вярване че системата е почти готова за "официален" старт (версия 1.0 се слага когато софтуера е завършен и без грешки).

През следващите години в изграждането на Linux се включват повечето недоволни от комерсиалния софтуер. Обменяйки идеи и програми по Мрежата, хиляди хакери реализират мечтата си да имат мощна операционна система направена по техен вкус, достъпна за промени, извън контрола на големите корпорации.

В момента Linux е съвкупност от множество програми (няколко хиляди). Всички съществени програми са защитени от лиценза GNU GPL или сходен лиценз за свободен софтуер. Това прави Linux обществена ОС - тя няма собственик в нормалния смисъл на думата. Ти си собственик на Linux, както и всички останали хакери и обикновени потребители. Можеш да го подобриш и усъвършенстваш, може само да го ползваш.

2. Първи стъпки  

Page 4: Linux

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

2.1.Потребители root и user

   Достъпът до всяка Linux система става чрез потребителски account, установен от системния администратор. Това означава, че на всеки потребител се задава потребителско име за идентификация, парола, собствена директория и му се задават права за достъп до системата. Всичко това се прави чрез администраторски account, наречен root. Linux често се използва и само от един потребител, но дори и тогава не следва да се използва root account-а за ежедневна работа. За да разберем защо нека разгледаме по-подробно какъв е този потребител root.

Суперпотребител root

   Когато бъде инсталирана една Linux система един потребител се създава автоматично. Той се нарича root или суперпотребител, защото няма нещо, до което този потребител да няма достъп или да не може да направи. Всички останали потребители не биха могли да изтрият нищо освен своите собствени файлове, докато суперпотребителя може да унищожи всички системни файлове само с една единствена команда. Това е най-мощния потребителски account. Пред този потребител няма никакви забрани и ограничения. Когато се включите в системата като root няма защо да се тревожите за собствеността върху файловете, достъпа до тях или пък софтуерните настройки - можете да правите всичко по всяко време.    Това е особено привлекателно за начинаещите, които като се сблъскат с даден проблем във връзка със собствеността или правата на достъп вместо да го решат избират по-лесния път и работят като root. Докато прибързано не извършат някоя глупост и сринат системата, често и непоправимо. Затова основно правило е root-account-а да се използва само и единствено за администриране. Направете си друг потребител за ежедневната работа. Това е желателно да бъде първото нещо, което следва да направите, когато си инсталирате нова Linux машина.    Именно поради значимостта на командите, които подавате като root, използването на този потребител е свързано и с промяна на обичайния prompt на командния ред.    Важно е да се отбележи, че този потребител може да се нарича всякак - няма правило, което да изисква той да се казва root.

Потребителски account-и

Page 5: Linux

    Дори и да сте единственият потребител на вашата Linux машина трябва да сте запознат с потребителските account-и и управлението на потребителите. Всеки потребител, независимо дали сте вие, ваши приятели или пък клиенти за да се включат логически към администрираната от вас Linux система трябва да имат уникално потребителско име и парола. Изключение правят някои специални потребители, които могат и да нямат парола.    Цялата информация за потребителите се съдържа във файла /etc/passwd - най-обикновен текстов файл, чийто собственик е суперпотребителя и само той може да редактира съдържанието му, останалите потребители по дефиниция могат само да го четат. Всички редове в този файл имат строго определен формат:

username:password:userID:groupID:comment:home_directory:login_comm

    Нека разгледаме един примерен файл /etc/passwd - това е моят /etc/passwd файл, взет от домашния ми компютър:

root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:daemon:x:2:2:daemon:/sbin:adm:x:3:4:adm:/var/adm:lp:x:4:7:lp:/var/spool/lpd:sync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:news:x:9:13:news:/var/spool/news:uucp:x:10:14:uucp:/var/spool/uucp:operator:x:11:0:operator:/root:games:x:12:100:games:/usr/games:gopher:x:13:30:gopher:/usr/lib/gopher-data:ftp:x:14:50:FTP User:/home/ftp:nobody:x:99:99:Nobody:/:postgres:x:100:233:PostgreSQL Server:/var/lib/pgsql:/bin/bashxfs:x:101:101:X Font Server:/etc/X11/fs:/bin/falsegdm:x:42:42::/home/gdm:/bin/bashyovko:x:500:100:Yovko Lambrev:/home/yovko:/bin/bashnataly:x:501:100:Natalia Staikova:/home/nataly:/bin/bash

    Всеки ред от този файл е съставен от седем полета разделени от двоеточия. Ако нищо не се въведе между две двоеточия полето остава празно, но двоеточията задължително трябва да съществуват. Как да тълкуваме тези седем полета:

username е уникалното потребителско име за логическо включване към систематаpassword е паролата за съответния потребител (кодирана)

Page 6: Linux

userID (UID) е уникално число, което идентифицира потребителя пред операционната системаgroupID (GID) е уникално число, което определя групата на потребителя

comment е някакъв коментар (обикновено истинското име на потребителя, телефон и др.)home_directory е директорията, в която попада потребителя след логическото си включванеlogin_comm е команда, която се изпълнява при логическото включване на потребителя (тази команда обикновено стартира някаква шел програма)

    Обърнете внимание, че тази структура на /etc/passwd се използва в почти всички UNIXTM системи.

Потребителски имена

    Потребителското име е символен низ, обикновено до 14 знака (в някои системи до 8), което уникално определя даден потребител. В една система не може да има двама потребителя с едно и също потребителско име. Желателно е да избирате кратки и ясни потребителски имена тъй като те са в основата на комуникациите с останалите потребители на системата. Обикновено потребителското име съвпада с истинското име на потребителя, прякора му, инициалите му или някаква тяхна комбинация.    Важно е да се отбележи, че съществува конвенция, според която потребителските имена трябва да се изписват с малки букви. Малките и големите букви са от значение при всички Linux (и UNIXTM) системи. Например mitko и Mitko са две съвсем различни потребителски имена. Тъй като повечето команди се пишат с малки букви прието и потребителските имена да се изписват така, а и за да избегнете опасността от недоглеждане потребителят mitko да получава пощата на потребителя Mitko, само защото някой не е забелязал главната буква. В потребителското име се допускат символи за подчертаване, числа и дори повечето специални символи, но тъй като името започва да изглежда странно (а не са изключени проблеми с някои приложения) съветът ми да се стремите към някоя простичка буквена комбинация.

Пароли

    Операционната система записва паролата на потребителя кодирана във второто поле. Само самия потребител може да променя паролата си чрез командата passwd и разбира се администратора.

Някои версии (вече повечето) не записват паролите във файла /etc/passwd заради проблеми свързани със сигурността. (Както си спомняте вече споменахме, че този файл може да бъде прочетен от всички потребители на системата.) В такъв случай паролите се пазят в друг файл, назоваван shadow password file и обикновено се казва /etc/shadow. Когато паролите са записани в такъв файл (отново кодирани), тогава полето password в /etc/passwd съдържа просто знака x. Така е и в приведения по-горе примерен файл.

Ето как изглежда един примерен shadow файл:

root:K/c6663skpiAEF:10766:0:99999:7:::bin:*:10766:0:99999:7:::daemon:*:10766:0:99999:7:::

Page 7: Linux

adm:*:10766:0:99999:7:::lp:*:10766:0:99999:7:::sync:*:10766:0:99999:7:::shutdown:*:10766:0:99999:7:::halt:*:10766:0:99999:7:::mail:*:10766:0:99999:7:::news:*:10766:0:99999:7:::uucp:*:10766:0:99999:7:::operator:*:10766:0:99999:7:::games:*:10766:0:99999:7:::gopher:*:10766:0:99999:7:::ftp:*:10766:0:99999:7:::nobody:*:10766:0:99999:7:::postgres:!!:10766:0:99999:7:::xfs:!!:10766:0:99999:7:::gdm:!!:10766:0:99999:7:::yovko:uYU42zvcFaCGI:10766:0:99999:7:::nataly:$1$Az3Y52v7$40GjOcEbHYUAqZ9eCFXLg.:10821:-1:99999:-1:-1:-1:135518564

    Когато потребителя въведе паролата си login програмата извършва семпла логическа операция с блок от нули и сравнява резултата със записаното във файла с паролите. Ако съвпадат потребителя получава достъп в противен случай достъпът му се отказва.    Обърнете внимание, че преобразуването на паролата до нейния кодиран вид е кратковременна и простичка операция докато обратното не е така. Ако случайно успеете някак да откраднете файла с паролите на някоя UNIXTM система не мислете, че е лесно да възстановите от кодираните последователности техните първообрази.    Полето за парола може да се използва и за ограничаване на достъпа. Това се използва за специални потребителски имена като lp или nobody. Ако в полето за парола бъде записана звездичка (*) всеки опит за логическо включване към системата посредством  тези потребителски имена ще бъде отхвърлян.    Логично следва въпроса какво ще стане ако оставим това поле празно - ами всеки, който използва това потребителско име ще получи незабавен достъп до системата с правата на този потребител без да бъде питан за парола. Вие преценявате доколко можете да си позволите да имате такива потребители.    Не е много умно да редактирате полето за парола с текстов редактор тъй като паролите са кодирани и вие не можете да пресъздадете метода на кодиране. Това, което ще постигнете като резултат е, че повече няма да можете да използвате това потребителско име, а пък ако го направите с root забравете, че повече ще можете да администрирате системата си. За смяна или въвеждане на пароли използвайте командата passwd.

    Всеки потребител получава асоцииран с потребителското му име уникален потребителски идентификатор (UserID или UID) това е число, което операционната система използва за да идентифицира всяко нещо свързано с конкретния потребител.    Повечето UNIXTM системи използват идентификаторите от 0 до 99 за специални UID, а числата от 100 нагоре за потребителите. В горния примерен /etc/passwd файл можете да видите, че суперпотребителя root има UID 0, а обикновените потребители yovko и nataly имат съответно номера 500 и 501.

    Този идентификатор се използва за да се обозначи принадлежността на даден потребител към някоя група потребители. Групите се използват от организационни съображения и са свързани с правата за достъп до файловете. Това подробно ще разгледаме малко по-долу. Номерата на GID започват от 0. Някои системи запазват номера от 0 до 49 (други само от 0 до 9) за системни групи, а останалите са предоставени за потребителски.

Page 8: Linux

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

HOME директория

    Директорията, в която попада потребителя след log-ването си към системата обикновено е неговата home директория. Нормално е всеки потребител да има такава директория. В горния пример можете да видите, че потребителят yovko има home директория /home/yovko, a home директорията на root е /root.    Обикновено потребителя има пълни права в home директорията, но това съвсем не е задължително. Може да му бъде отнета собствеността върху някои файлове - това е класически подход за ограничаване на правата на даден потребител, например с отнемането на собствеността и правото да редактира profile файла си, който се изпълнява след логическо включване към системата.

    Тази команда се изпълнява веднага след като потребителя се включи към системата. В общия случай това е команда, която стартира някакъв shell, но може да бъде и произволно приложение. Ако това поле е оставено празно в повечето UNIXTM системи се стартира Bourne shell. Шелът по подразбиране за Linux e bash (Bourne Again Shell).   

Запазени (системни) потребителски имена

    В примерния /etc/passwd има около една дузина потребители, които са създадени от операционната система по време на инсталацията и имат специално предназначение:

Потребителят root е суперпотребителя (UID 0) и има неограничен достъп. Собственик е на много системни файлове.

daemon се използва за системни процеси. Използва се само за да притежава някои процеси и за да се установяват правилно техните права.

bin е собственик на изпълнимите файлове adm притежава счетоводните и log файловете uucp се използва за UUCP комуникации и достъп до файловете

    Повечето имат звездичка в полето за парола, което забранява използването им при login процедура.

Добавяне на потребители

    Можете да добавите потребители към системата си като просто редактирате /etc/passwd файла или да използвате скрипт, който ще го направи вместо вас. Разбира се и двете неща можете да направите само като root.

Преди да редактирате /etc/passwd файл направете си резервно копие!

Page 9: Linux

    Нека да добавим потребителя suncho към нашата система. Нека той да има home директория /home/sample и да ползва bash шел. Тъй като UID номерата 500 и 501 са заети, задваме на новия потребител UID 502 и го оставяме в групата на обикновените потребители users (GID 100). Значи трябва да добавим следния ред в края на нашия /etc/passwd файл:    suncho::502:100:Samo za primer:/home/sample:/bin/bash

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

    passwd suncho

    Ще бъдете подканен да въведете парола. Масова практика е тя да съвпада с потребителското име, като се очаква потребителя да си я смени при първото си логическо включване. Това обаче крие опасност някой друг недобросъвестен потребител да присвои този account.    Можете да оставите на потребителя сам да установи паролата си, но той може и да не забележи, че се log-ва без парола или пък да му хареса така, а проблемите ще рефлектират при вас, когато се появят. А ще се появят обещавам ви.    Запомнете едно - хората мразят да помнят, въвеждат и променят паролите си. Вие като администратор трябва да ги принуждавате за това.       Сега остава да създадем home директорията на новия потребител с командата:    mkdir /home/sampleИ да прехвърлим собствеността и на потребителя suncho:    chown suncho /home/sample

    Всички потребители трябва да принадлежат към някоя група. Това означава да добавите потребителското име на потребителя на съответния ред за групата в /etc/group файла. Ако потребителя принадлежи към няколко групи добавете името му към съответните редове за тези групи в /etc/group.     Ако всичко това ви се вижда толкова сложно проверете дали вашата система ще изпълни командите useradd или adduser. А може би ще ви хареса и командата vipw.

Групи

    Всеки потребител на UNIXTM система принадлежи на някаква група. Групата е обединение на потребители по някакви причини. Например от една група могат да бъдат хората от един отдел, от друга - вашите клиенти или приятелите ви. Така е по-лесно да имате еднакви права за достъп до определени файлове или разпределени ресурси като мрежови принтер например. Всеки потребител може да шронадлежи към няколко групи, но в определен момент от време той е член само на една от тях. Това е свързано с правата за достъп тъй като Linux може да присъедини на потребителя само един идентификатор на групата (GID).    Потребителите от една група могат да имат повече права за достъп до устройства, файлове, файлови системи или цели машини в сравнение с потребителите, които не принадлежат на тази група.    Информацията за групите се съдържа във файла /etc/group, който изглежда примерно така:

root::0:rootbin::1:root,bin,daemondaemon::2:root,bin,daemonsys::3:root,bin,adm

Page 10: Linux

adm::4:root,adm,daemontty::5:disk::6:root,adm lp::7:lpmem::8:kmem::9:wheel::10:rootfloppy::11:rootmail::12:mailnews::13:newsuucp::14:uucpman::15:manusers::100:gamesnogroup::-1:

    Лесно е да предположите какъв е формата на файла:

име_на_групата:парола:GID:списък_потребители

Името на групата е уникално символно име както и това на потребителя.

Паролата на групата трябва да бъде въведена от потребител, който пожелае да се присъеднини към групата. Не всички версии на Linux и UNIXTM използват това поле!

GID е уникалният групов идентификатор.

Списъкът на потребителите съдържа потребителските имена на потребителите, които принадлежат към групата.

    Всяка Linux система има няколко системни групи - такива са bin, mail, uucp, sys и др. Не е добра идея да имате потребители от тези групи тъй като това означава да им дадете големи привилегии.     Добавянето на група е аналогично на добавянето на потребители. Само, че не всички Linux системи имат скриптове addgroup или groupadd и трябва да редактирате /etc/group сами.

Командата su

    Понякога се налага да изпълните някоя команда като друг потребител. Например ако сте администратор, а искате да създадете файл с правата на suncho, например. Или пък ако сте обикновен потребител и искате за малко да станете root. Разбира се едното решение е да напуснете системата и след това да се включите като другия, но има и алтернатива на този подход и тя е командата su.

    Например ако искате да станете root достатъчно е да напишете:

su root

    Разбира се, че ще трябва да въведете и паролата на root. Въведете командата su без аргумента root системата счита, че искате да станете root, така че можете да не уточнявате потребителско име ако ставате root.

Page 11: Linux

    Ако обаче сте обикновен потребител или root и искате да станете yovko задължително трябва да уточните това с командата:

su yovko

    Разликата е, че Linux няма да пита за паролата на yovko ако сте root. Нали ви казах, че root може всичко.

    За да станете пак такъв какъвто сте бил напишете exit или натиснете Ctrl+D.

2.2.Файлова система, права за достъп    Най-простичката дефиниция за файлова система е набор от файлове, структурирани по някакъв начин и съхранени върху запомнящо устройство.    Едно от основните предимства на Linux е, че поддържа множество файлови системи. Това го прави особено гъвкав при съвместно съжителство с други операционни системи. Без да се замислям мога да ви изброя поне 15 файлови системи, които Linux без проблем поддържа - например ext и ext2, майкрософтските msdos, ntfs и vfat, xia, minix, umsdos, iso9660, ufs, proc, sysv, ncp, smb, affs, hpfs, ntfs, а и непрекъснато се добавят нови.    Linux, както и UNIXTM не използват идентификатори на устройствата за различните файлови системи, а организират всичко в една единствена йерархична дървовидна структура. Всяка нова файлова система, която трябва да бъде достъпна за Linux се добавя към тази дървовидна структура като неино под-дърво. Мястото където присъединяваме (монтираме) добавяната файлова система се нарича точка на монтиране и задължително трябва да съществува във файловата система на Linux.    Вашият твърд диск трябва да бъде разделен на логически дялове преди да можете да го използвате. Всеки дял може да съдържа една файлова система. Устройства, които съдържат файлова система се наричат блокови.    Да предположим, че имаме IDE твърд диск, който е свързан като master към първия IDE канал на дънната ви платка, който е разделен на два (първични) дяла. Тогава първото блоково устройство (първия дял на диска) се нарича /dev/hda1, а втория /dev/hda2. Ако нашия диск беше свързан към втория IDE канал на компютъра тогава двете блокови устройства щяха да бъдат съответно /dev/hdc1 и /dev/hdc2.     Това се определя по следната простичка схема:

  IDE0 IDE1master hda hdcslave hdb hdd

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

Файловата система на Linux се нарича ext2 (пълното и наименование е The Second Extended File System), която е наследник на ext, която от своя страна е наследила minix (първата файлова система, която е ползвала Linux). Създадена е от Remy Card през 1993. При тази файлова система данните се пазят в блокове от данни с еднаква дължина. Тя обаче може да се променя при отделните ext2 файлови системи. Този размер на блоковете се определя при създаването на файловата система. Но не пречи да имаме две ext2 файлови системи с различни дължини на тези блокове.

Page 12: Linux

    Файловата система може да бъде разгледана в два аспекта. На високо ниво под файлова система се разбира разположението на директориите и файловата йерархия в един дял, а на ниско ниво представлява начина на форматиране на блоковото устройство. Тук ще разгледаме файловата система само от високо ниво, тъй като ниското ниво обикновено е в интереса на тесен кръг от специалисти. Ако все пак някой се интересува от по-подробна информация за суперблоковете, полетата в тях и описанията им може да потърси из Интернет или да ми пише на адрес [email protected] да му изпратя такава.    Една типична организация на директориите в една Linux система е следната:

/  |-- bin|-- boot|-- dev|-- etc|-- homе|    '-- yovko|-- lib|-- lost+found|-- mnt

Page 13: Linux

|    |-- cdrom|    |-- fat|    '-- floppy|-- proc|-- root|-- sbin|-- tmp|-- usr|    |-- X11R6|    |-- bin|    |-- doc|    |-- etc|    |-- games|    |-- include|    |-- lib|    |-- local|    |    |-- bin|    |    |-- doc|    |    |-- etc|    |    |-- games|    |    |-- lib|    |    |-- man|    |    |-- sbin|    |    '-- src|    |-- man|    |-- sbin|    |-- src|    |    |-- linux -> linux-2.2.15-5|    |    |-- linux-2.2.15-5|    |-- tmp|-- var

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

Как можем да монтираме файлова система? Това ни се налага непрекъснато, защото всяка дискета или компакт-диск е различна файлова система и не бихте могли да прочетете съдържанието на една дискета без преди това да я монтирате. Командата за монтиране на файлова система е mount. Необходимо е да се посочи типът на файловата система, къде се намира тя (кое е блоковото устройство) и къде (в коя директория) да се монтира. Ето как можем да монтираме CD-то си (предполагаме, че то е свързано като master-устройство към втория IDE канал (често CD-то се свързва като slave на същия IDE канал с твърдия диск, най-често първия тогава вместо hdc трябва да напишете hdb):

    mount -t iso9660 ro /dev/hdc /mnt/cdrom

Page 14: Linux

    Тази команда монтира файловата система на компакт-диска в CD-ROM устройството в директорията /mnt/cdrom като read-only (само за четене). Сега в директорията /mnt/cdrom имате съдържанието на CD-то си. То разбира се не е там - само така изглежда. Когато решите да го смените трябва го демонтирате иначе няма как да го извадите от устройството. Командата е umount:

    umount /dev/hdc

    Аналогично можете да монтирате и дискети- флопито ви е блоково устройство /dev/fd0, ако имате второ флопи то ще е /dev/fd1. Файловата му система може да е различна- съобразете се с това- msdos, vfat, ext2 ? Препоръчвам ви много внимателно да прочетете помощните страници на mount. Командата за получаване на помощ е man:

    man mount

    Съществува един конфигурационен файл за автоматично монтиране на файловите ви системи - той е /etc/fstab. Разгледайте го - ако решите, че си струва да прочетете малко за него- поздравявам ви- имате нюх. Можете много да си облекчите живота.

    След логическо включване към системата вие попадате във вашата home директория. Нека предположим, че сме потребителя yovko и нашата home-директория е /home/yovko. Значи след включването ни към системата това е нашата текуща директория.    Командата за промяна на текущата директория е cd.    Тук е мястото да кажем, че описанието на пътищата до файловете в Linux става по два начина: с абсолютен (наричан още и глобален) и относителен път като разделителя е /    Абсолютен се нарича този път, който започва от коренната директория, която се обозначава също с /    Когато използваме относителен път Linux счита, че тръгваме от текущата директория (тази в която се намираме в момента). Например ако сме в директорията /home/yovko и искаме да попаднем в директорията /mnt използвайки относителен път трябва да напишем следната команда:

cd ../../mnt

    Тук както и в DOS с . се означава текущата директория, а с .. предишната- родителската директория (едно ниво по-назад) само, че ако в DOS сте свикнали да пишете слято командата и двете точки ще трябва да отвикнете- интервалът между тях е задължителен. Ако използвахме абсолютен път командата щеше дабъде:

cd /mnt

    Командата, с която можем да проверим коя е текущата ни директория е pwd.    Нека създам един файл в своята директория /home/yovko например така:

date > sample.txt

    Тази команда ще разпечата текущата дата и час в текстов файл sample.txt. Можете да видите съдържанието му с командата cat ./sample.txt, но сега не ни интересува съдържанието, а просто съществуването на файла. Иначе трябва да получите нещо такова като резултат:

Page 15: Linux

Wed Sep  8 18:17:50 EEST 1999

    Командата, с която можем да проверим какви файлове съдържа текущата директория (ако имаме права за това разбира се) е ls.     Нека подадем командата в този и вид:

ls -l

    Ще получим следното:

drwx------ 40 yovko users 1024 Sep  8 14:51 .drwxr-xr-x  7 root  root  1024 Aug 18 19:23 ..-rw-r--r--  1 yovko users   30 Sep  8 18:17 sample.txt

    Нека разгледаме подробно полученото. Когато се създаде един файл той е собственост на автора си. Така е и с нашият файл sample.txt, който аз създадох като потребител yovko. Този потребител е от група users. Следователно нашият файл е собственост на потребителя yovko. Така би било ако създадем и директория. Нека го направим. Командата е mkdir:

mkdir sample

    И пак да разгледаме съдържанието на директориите:

drwx------ 40 yovko users 1024 Sep  8 14:51 .drwxr-xr-x  7 root  root  1024 Aug 18 19:23 ..-rw-r--r--  1 yovko users   30 Sep  8 18:17 sample.txtdrwxr-xr-x  2 yovko users 1024 Sep  8 18:19 sample

    Как да различаваме обикновените файлове от директориите? Директориите се обозначават с d в началото на описанието им. Какво означават останалите девет символа? Това са правата за достъп до съответния файл или директория от различните потребители. Трябва да разглеждате тези знаци (наричат се флагове за достъп) в групи по три като наличието на знак е дадено право, а наличието на тире е липса на това право. Знаците могат да бъдат r за четене (read), w за запис (write) и x за изпълнение (execute). Значението на трите групи е следното - първите три знака са правата на собственика(автора), следващите три са правата на групата, на която е член собственика, а последните три са правата на всички останали потребители.

Собственик Група Останалитеr w x r w x r w x

Интересено е какво означава да имаме право да изпълняваме файл, който е директория - това означава, че можем да преглеждаме съдържанието на тази директория. Ако това ви се вижда глупаво след като имате право за четене там помислете за ситуация, в която не знаете точното име на файл от директория, в която имате право само за четене. Вие можете да достигнете файла само ако знаете точното му име и го зададете с абсолютен или относителен път и докато го помните няма проблем да го четете или изпълнявате, но само него. В тази директория може да има още файлове, за които и не подозирате, защото нямате право да разлистите съдържанието и.  (Заб.: Някои файлове вместо x може да имат знака s - това означава, че програмата ще се стартира не с правата на този, който я стартира, а с правата на собственика и. Има и още едно означение t - така наречения sticky-bit, но той няма отношение към разглежданата тема в момента.)

Page 16: Linux

    Какво направихме дотук - един файл sample.txt, който неговият собственик може да чете, както и да пише в него. Едно малко уточнение - щом имаме права за писане във файл това разбира се означава и че можем и да го изтрием. Групата на собственика може само да чете този файл. Всички останали потребители също могат да само да четат този файл. Това обикновено са правата, които са зададени по подразбиране на всеки нов файл.    Нека да разгледаме и директорията, която създадохме - тя се казва sample. (В нашия случай файлът и директорията имат различни имена - sample.txt и sample - това обаче не е задължително. В Linux може да имате съвпадение на имената на файл и директория - т.е. можеше и файлът да наречем sample без това да доведе до проблем, както би било с други операционни системи.) Собственик на тази директория е отново потребителят yovko, принадлежащ на групата users - т.е. аз и аз имам право да чета, пиша, както и да преглеждам съдържанието на тази директория. Потребителите от групата users, както и всички останали потребители могат само да четат файлове от тази директория, както и да я разлистват, но не могат да създават файлове там.

    Как можем да променим правата за достъп до файловете? Командата за смяна на флаговете за достъп е chmod. Да предположим, че имаме файл viki във /tmp директорията, който искаме да направим изпълним за всички. Командата е:

    chmod +x /tmp/viki

    След тази команда операционната система ще включи флага за изпълнение на този файл.    Нека да направим същото с нашия файл sample.txt и да видим как ще се променят флаговете. (С уточнението, че това действие няма никакъв смисъл, защото нашия файл нищо не прави и не е логично да го правим изпълним. Целта е само образователна.). Командата разбира се е:

    chmod +x ./sample.txt

    И да видим какво се промени след тази наша намеса с командата ls -l

drwx------ 40 yovko users 1024 Sep  8 14:51 .drwxr-xr-x  7 root  root  1024 Aug 18 19:23 ..-rwxr-xr-x  1 yovko users   30 Sep  8 18:17 sample.txtdrwxr-xr-x  2 yovko users 1024 Sep  8 18:19 sample

    Появиха се три флага x за изпълнение, съответно за собственика, групата и всички останали потребители.    Сещате ли се вече какво ще направи командата

    chmod -w ./sample.txt

    Ами разбира се, че ще изключи на всички правата за писане в този файл. Синтаксисът е много прост + включва, а - изключва даден флаг, а с r, w или x уточняваме кой флаг да се промени. Естествено можем да променяме няколко флага или дори всички. Например така:

    chmod -rwx ./sample.txt

    Сега нашият файл стана много симпатичен ;-)    Резонен е въпроса как да променим правата само на собственика или само на групата, а не толкова глобално за всички. Ами преди знака + или - поставяме опция чии права искаме да променим като опциите са следните:

Page 17: Linux

u - собственика (user) g - групата (group) o - останалите (others) a - всички (all) - това е по подразбиране

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

    chmod g+w ./sample.txt

    А за да дадем всички права на собственика трябва да напишем следното:

    chmod u+rwx ./sample.txt

    По същия начин се процедира и със s флага, когато е необходимо.    Има още един начин за управление на правата върху файловете и директориите и той е посредством осмична бройна система. Нека предположим, че имаме следното състояние:

drwx------ 40 yovko users 1024 Sep  8 14:51 .drwxr-xr-x  7 root  root  1024 Aug 18 19:23 ..-rw-r-----  1 yovko users   30 Sep  8 18:17 sample.txtdrwxr-xr-x  2 yovko users 1024 Sep  8 18:19 sample

    И отново да разгледаме флаговете за достъп на файла sample.txt. Нека се уговорим да отбелязваме с единица състоянието на включен флаг и с нула липсата на право - ще се получи това:

Собственик Група Останалитеr w x r w x r w x1 1 0 1 0 0 0 0 0

    Сега нека разгледаме тази последователност от нули и единици като три двоични числа - 110, 100 и 000.

Собственик Група Останалитеr w x r w x r w x1 1 0 1 0 0 0 0 0

110 100 000

    Двоичната аритметика казва, че това са числата съответно 6, 4 и 0.

Малко математика

Преобразуването от двоична в десетична система  става по следния простичък алгоритъм:

Най-младшия разряд има тежест 20=1 Следващият 21=2, а третият 22=4

Следователно всички възможни комбинации са:

Page 18: Linux

000    0001    1010    2011    3100    4101    5110    6111    7

    Което означава, че до това състояние можем да достигнем чрез командата:

    chmod 640 ./sample.txt

    Какво трябва да направим за да дадем на собственика всички права, на групата само за четене и писане, а на всички останали само за четене - т.е. тази конфигурация:

Собственик Група Останалитеr w x r w x r w x1 1 1 1 1 0 1 0 0

111 110 1007 6 4

    Разбира се, че

    chmod 764 ./sample.txt

    Ако ви се вижда сложно запомнете само, че изпълнението на файл е единица, писането - двойка, а четенето - четворка. И събирайте четене и писане е 4+2 значи 6 - просто е, нали? Опитайте и ще свикнете след 5 минути.

    Как да сменим собственика на един файл? Командата за това е chown. Ако предположим, че ние сме потребителя yovko и притежаваме файла viki.gif в нашата home директория /home/yovko, но искаме да го "подарим" на потребителя nataly достатъчно е да напишем:

    chown nataly /home/yovko/viki.gif

    Трябва да отбележим, че въпреки, че този файл е в нашата home директория, собственик на този файл вече е nataly и повече не сме в състояние да променяме правата или собственика му. Въпрос на добра воля е nataly да ни върне собствеността върху този файл. Друг, който може да го направи разбира се е root.

    Можете да сменяте правата и собствеността само на вашите собствени файлове.

    Можем да сменим и групата с командата chgrp, но това ви оставям като домашно задание да прочетете в man-страниците на вашия Linux. Командата естествено е:

    man chgrp

    Виртуална файлова система (VFS)

Page 19: Linux

    Това е едно невероятно свойство на Linux, което не може да ви предложи никоя друга операционна система.В Linux реалните файлове са отделени от операционната система и нейните средства чрез интерфейсен слой, наречен виртуална файлова система - Virtual File System (VFS). Именно този интерфейс спомага Linux да поддържа толкова много и различни файлови системи. Достатъчно е просто да се създаде един софтуерен интерфейс към VFS. Така всички особености на която и да е файлова система се представят така, че изглеждат идентични за останалата част на ядрото на операционната система и програмите изпълнявани върху нея. На всичко отгоре това става съвсем прозрачно.    VFS на Linux е оптимизирана така, че скоростта на достъпа до файловете да е възможно най-бърза като при това можете да сте съвсем сигурни, че файловете и данните в тях са съхранени коректно. VFS на Linux кешира в паметта информацията за всяка монтирана файлова система като при това се грижи да обновявя тази кеширана информация при всяко създаване, запис или изтриване на файл или директория.

2.3.Конзола, терминал, telnet и шел    Тази част разглежда няколко основни терминологични понятия, които се в същината на всяка UNIXTM и Linux система. За някои от тях има теоретични спорове, за други няма общоприети дефиниции и те често се използват интуитивно. Не искам текста по-долу да се приема като дефиниционен - това е моето тълкувание на тези понятия.

   

Конзола

    Терминът е исторически. Идва от времето, когато компютрите са заемали огромни помещения и в средата на залата е имало един терминал, на който са излизали системните съобщения и на който можел да седне администратора или да се намеси при определена ситуация. Сега може би най-точната дефиниция е, че на конзолата излизат системните съобщения. Често се казва, че root-а или системния администратор работят на конзолата, обикновено се визира работното място. Това строго погледнато не е много точно, но не може и да се твърди, че е погрешно. Друга съвсем некоректна употреба на понятието е, че когато не използваме графична среда работим на конзола. Съществува и приложение X конзола, която може да прихване конзолата - т.е. системните съобщения.    Съществува още едно понятие т. нар. виртуална конзола - това са (обикновено) шестте терминални прозореца, които превключвате с клавишните комбинации Alt+F1 до F6. Струва ми се, че по-доброто название е виртуални терминали. Обърнете внимание, че системните съобщения излизат на първа "виртуална конзола" дори и никой да не е log-нат в системата. 

Page 20: Linux

    Терминал

   Терминал е интерфейса, който стои между шела (обвивката) и потребителя. Названието също е историческо. Терминал се нарича работното място на потребителя. Това може да бъде нормален компютър или само (много грубо казано) монитор с клавиатура. Много популярни терминали са DASI 300, Tektronix 401X, HP2645A и др. Това като хардуерно понятие. Когато говорим за терминал обаче в общия случай трябва да си представяте не хардуер, а именно програма, която по някакъв начин подпомага шела да комуникира с вас - седящия пред клавиатурата.

    Telnet

    Командата telnet позволява да остановите връзка с отдалечена система по telnet протокол. След логическо включване към тази система вие можете да използвате ресурсите и така, както и ако стояхте пред неин терминал. Протоколът telnet осигурява двустранната комуникация между двете системи по TCP/IP. Telnet протокола се описва от RFC 854 и RFC 855 (RFC-Request for Comment са стандартизационните документи на всички протоколи върху TCP/IP, т.е. за всичко в Интернет. Публикуват се от консултантската група за създаване на Интернет стандарти Internet Architecture Board - IAB).    Как можем да направим telnet до отдалечена машина? Първото необходимо условие е да бъдем потребители на тази машина, в противен случай не, че няма да можем да направим telnet, но няма да можем да се включим логически към системата, което обезсмисля опитите ни. Второто е да знаем името на машината (или нейният IP адрес). Да допуснем, че сме потребители на машината grex.cyberspace.org, която има IP адрес 204.212.46.130. Всичко, което трябва да направим е следното:

    telnet grex.cyberspace.org

или

    telnet 204.212.46.130

    След осъществяване на връзката ще получите login-промпт, подканящ ви да въведете потребителското си име, а след това и паролата.

    Ако нямате account в друга машина можете да пробвате telnet и до своята собствена. Просто напишете

    telnet 127.0.0.1

и ще видите познатия ви login-промпт на своята собствена машина. IP адресът 127.0.0.1 е специален - нарича се loopback и сочи към вашата система.    Можете да направите telnet и до порт, различен от стандартния за telnet протокол. Ако например напишете

    telnet 127.0.0.1:80

всъщност изпращате заявка към порт 80, където обичайно "подслушва" вашият web-сървър Apache, ако разбира се сте си го инсталирали. Е - той обикновено отказва telnet сесията.

    Шел

Page 21: Linux

    Ядрото на операционната система комуникира с вас благодарение на обвивката си, английският термин, за която е шел (shell). Това всъщност представлява програма, която се нарича още и команден интерпретатор. Тя чете въведените редове от терминала и изпълнява различни операции в зависимост от това, какво е въведено. Обвивката се опитва да преобразува въвежданите конструкции в инструкции, които ядрото е в състояние да разбере.    Всеки потребител при логическото си включване в системата стартира свое копие на шел в паметта. Това се прави за да може той да работи без да пречи на останалите потребители на системата.    Обвивката възприема всичко до първия интервал като команда, а всичко останало като аргументи на командата. Аргументите също се разделят с интервал.    Повечето версии на Linux позволяват на потребителя да променя своя шел с командата chsh или passwd -s. Когато подавате такава команда Linux търси файла /etc/shells. Само тези команди, които съществуват в този файл ще бъдат изпълнени. Това е направено от съображения за сигурност. Разбира се този файл трябва да не може да бъде редактиран от обикновените потребители.    Можете да проверите кои са възможните обвивки с командата:

    chsh -l

    Някои версии не поддържат опцията -l на командата chsh и в този случай ще трябва да погледнете направо във файла /etc/shells. Ето съдържанието на един примерен /etc/shells файл:

/bin/bash/bin/sh/bin/ash/bin/bsh/bin/tcsh/bin/csh/bin/bash2

    

    BASH шел

   Шелът по подразбиране в Linux се нарича bash - това е абревиатура от Bourne Again Shell, създаден от Free Software Foundation и както личи от името е имал за база Bourne shell от UNIXTM.   По какво можете да познаете, че bash е стартиран и очаква вашите команди - ако сте root вашият промпт е #, a ako сте "простосмъртен" потребител той е $. Това е само за да ви напомня значимостта на командите, които подавате, но не означава, че root стартира по-различно копие на bash от това на всички останали потребители.    Всяка обвивка (обкръжение) има свои променливи на обкръжението. Техните стойности се установяват от командния интерпретатор при стартирането му и имат различни стойности за различните потребители. Ето ви още една причина за всеки потребител да се стартира отделно копие на интерпретатора. Стойностите на тези променливи могат да се променят в процеса на работа.    Например ако не ви харесва знака $ за промпт достатъчно е да смените променливата на обкръжението PS1.

3.Мрежата

Page 22: Linux

3.1.Свещените протоколи

Интернет (Мрежата) съществува най-вече заради наличието и спазването на ясни и добре описани правила за обмен и обработка на информация между различни хардуерни устройства, компютри и компютърни програми. Тези правила се наричат протоколи. Те са детайлно описани в документи, наречени RFC (Requests For Comment). Можете да ги намерите лесно в Мрежата (просто попитайте любимата си търсачка за RFC). Вероятно имате най-важните и в поддиректорията /usr/doc/rfc на вашата Linux дистрибуция.

За нуждите на мрежовата работа има създаден т.нар. OSI седем-слоен модел, чрез който най-грубо работите в мрежата се разделят на слоеве (нива). За да съществува възможност за комуникация, протоколите поддържат функциите на няколко слоя едновременно. Модела изглежда така:

Application layer предоставя големи приложенията, използващи услуги от по-долния слой. Пример за програма от това ниво е Netscape.

Presentation layer осигурява конкретни услуги. Много протоколи дефинират такива услуги - FTP, HTTP, SMTP, POP3, DNS, BOOTP, DHCP, IRC и пр.

Session layer организира правилния обмен на данни между програмите. Протоколите отнасящи се до това ниво (TCP, UDP) използват механизма на портовете, за да разпределят пакетите между различните програми, а също и различни техники за осигуряване на непрекъснат и коректен поток от данни.

Transport layer пренася пакети информация от една крайна точка до друга в нехомогенна среда (между отдалечени устройства). Най-важният протокол свързан с този слой е IP.

Network layer пренася пакети информация в хомогенна среда (между пряко свързани устройства), като например point-tо-point връзка (PPP,SLIP).

Link layer установява и контролира връзката между устройства, а също реализира схеми за компресиране на предаваните данни. Важни протоколи - LCP, PPP, ARP.

Psychical layer кодира цифровите сигнали по аналогови линии.

Всички протоколи имат своето значение за работата на мрежата, и без съгласуваното им спазване работата на Мрежата е немислима. Ето по няколко думи за най-важните:

IP (Internet Protocol) пренася малки пакети информация между произволни два компютъра, закачени в Мрежата (без гаранция за успех на отделната пратка). Вижте по-подробно обяснение в статия 3.2 (следващата по ред)

TCP (Transmission Control Protocol) организира непрекъснат и подреден поток от информация между две програми (разговор между програмите). Изполва като основа за работата си протокола IP. TCP изгражда връзката, накъсва разговора на пакети, изпраща ги и от отсрещната страна на връзката сглобява пакетите. Грижи се за повторно изпращане на загубените пакети и за пренареждане на тези, пристигнали в разбъркан порядък. За програмите TCP-връзката изглежда като два последователни файла - един за писане и един за четене.

UDP (Unreliable Datagram Protocol) за разлика от TCP при този протокол данните се изпращат без да се чака потвърждение, че са получени. Използва се там, където е по-важно комуникиращите програми да не се забавят поради чакане на потвърждението.

Page 23: Linux

PPP

FTP (File Transfer Protocol) се занимава с пренасяне на файлове между отдалечени компютри. Един от пьрвите приложни протоколи.

HTTP (HyperText Transfer Protocol) управлява обмена на WEB-страници и свързани с тях файлове и услуги. Млад приложен протокол.

SMTP (Simple Mail Transfer Protocol) извършва обмена на елекронната поща между отдалечени компютри (пощенски сървери). Пощенските клиенти го ползват при изпращане на писма.

POP3 (Post Office Protocol 3) чете електронната поща от отдалечен пощенски сървер.

DNS (Domain Name System) е удобна система за именуване на компютрите в Мрежата. Тази йерархична система от символни имена прави възможно по-лесното запомняне на имената на важните места, а също осигурява независимост на сърверите в Мрежата от доставчиците на трафик, които определят конкретния IP-адрес.

BOOTP, DHCP са два близки по семантика протокола за настройка по време на boot (началното зареждане) на IP-адрес и други мрежови параметри на компютри, които нямат предварително определени адреси.

IRC

В Linux голяма част от реализциите на протоколи, и основно на IP протокола и тези около него (UDP,TCP,ICMP) е вградена в ядрото, което води до добра производителност в мрежови условия, както и до лесно и удобно ползване на Internet под Linux.

3.2.Адреси и имена, свързване

За да си обменят информация, компютрите трябва да могат да се разпознават един с друг. Основното понятие в това разпознаване е IP-адреса. Всеки компютър в Internet има уникален адрес, за да може да изпраща и да получава информация. По-точно адресира се не самият компютър, а устройството, което го свързва в Мрежата.

Информацията в Мрежата се придвижва на пакети - сравнително малки порции от един компютър към друг, като самият пакет съдържа IP-адреса на изпращача и получателя, но не и на междинните компютри, които пакетът ще посети по пътя.

Протоколът IP (InterNet Protocol) задава правилата за адресиране на компютрите и правилата за отдалечен обмен на пакети между тях.

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

При IP протокола всяка машина има собствен IP-адрес , представляващ 4-байтово число, което за по-лесна четимост от потребители се записва като 4 еднобайтови

Page 24: Linux

числа (т.е. от 0 до 255), разделени с '.' (точка). Пример за такъв адрес е 12.124.12.41. Използвайки адреса на получателя устройства, наречени рутери (междинните компютри по пътя на пакета) вземат решение през коя от другите си връзки да пренасочат пакета.

Всъщност, машините поддържащи IP се делят на 2 вида - рутери и хостове. Рутерите имат 2 или повече интерфейса (т.е. хардуер свързан с различни среди) и изпращат пакети от някой интерфейс към друг, ако не са предназначени за тях самите. Хостовете са машини, които имат само един интерфейс и го използват само за лични нужди. Пример за хост е всеки обикновен компютър свързан към Интернет. Той от своя страна е свързан с рутера на вашия Интернет доставчик, който има повече от 1 мрежови интерфейси - по един за всеки клиент и още 1 (може и повече) за връзка с останалата част от Мрежата.

Предполага се, че Мрежата се състои от свързани помежду си по-малки мрежи (подмрежи). Поради това IP-адресите (и подмрежите) се разделят условно на няколко класа според големината на подмрежата, в която е адреса:

Клас А е за големи подмрежи, първият байт на IP-адресите в класа е от 1 до 126. Мрежата 127.0.0.0 е специална - 127.0.0.1 значи локалната машина, а 127.0.0.0 - локалната мрежа (за самата машина, не LAN-а; този термин има по-абстрактно значение). За IP-адресите от този клас първият байт е номер на подмрежата, а останалите - номер на на хоста, което позволява да съществуват 126 такива огромни подмрежи с по 255*255*255 хоста всяка.

Клас Б са адресите с първи байт от 128 до 191 и е за средноголеми подмрежи, за които първите 2 байта са идентификатор на мрежата, а останалите идентификатор на хост-а - това позволява 64*255 подмрежи с 255*255 адреса.

Клас C мрежите са от 192 до 224, и това са малки мрежи с 3 байта мрежов идентификатор, а останалите - за адрес. Това позволява 32*255*255 мрежи с по 255 адреса.

Останалите адреси с първи байт до 240 (клас D)са за multicasting, а другите са резервирани за бъдеща употреба. Клас А мрежите принадлежат на големи учреждения, които могат да си позволят да използват повече адреси отколкото им позволява Клас Б, и това са 'гиганти' като МИТ например. Клас Б се използва от големи учреждения, които нямат нужда от А мрежа, но и клас C не ги задоволява. Клас C се ползват доста от средните и малки доставчици - зони от 255 адреса, достатьчни за известен брой диал-ьпи (10-20), няколо сървъра, няколко наети линии с подмрежи по 32 адреса и т.н. За хората, които нямат нужда от 255 адреса, може зони от някой клас да се делят на по-малки от например 32 или 64 IP адреса чрез механизма на маските (netmask).

маската прилича на IP адреса по това, че е едно 32 битово число, което обаче определя докъде се простира нечия зона - например адрес 194.52.11.192 с нетмаск-а 255.255.255.224 значи ип адресите от 194.52.11.192 до 194.52.11.224 (т.е. 32 IP адреса). Всьщност, когато конвертираме нетмаската в двоичен вид, тя изглежда по следния начин: 11111111.11111111.11111111.11100000, или последните 5 бита са 0, т.е. 2^5 адреса (2 на степен 5). По сьщия начин могат да се режат и на зони с по 16, с по 128 или колкото са нужни IP. Клас D се ползва от специални приложения, като тези за видеоконференции, заедно сьс протокол, наречен IGMP. Също така всеки IP адрес, представялващ адрес на мрежа с последните битове само 0 или само 1 е т.нар. broadcast адрес, който се използва за пращане на информация до всички компютри на дадената мрежа. А специалният адрес 255.255.255.255 представлява т.нар. limited broadcast, който означава 'всички компютри на локалната мрежа' и се ползва обикновено от

Page 25: Linux

протоколите BOOTP и DHCP за откриване на сървъри, от които компютър без предварително определен адрес да получи уникален IP-адрес докато се стратира.

Дотук ставаше дума за уникални адреси - те са аналогични на междуградски телефонни номера за набиране, състоящи се от код за набиране на града (номер на подмрежата) и номер на абоната в съответния град. Освен тези уникални номера има уговорка за ползване на част от номерата за вътрешни нужди (по същия начин, както съществуват вътрешни телефонни централи в по-големите фирми). Този тип IP-адреси са предназначени за изграждане на изолирани по някакъв начин локални мрежи (интранет мрежи). Те не са пълноценни IP-адреси и за участие в обмен на данни с друг компютър от Мрежата трябва да бъдат представяни от компютър-посредник, притежаващ истински IP-адрес (този посредник се нарича proxy, firewall или маскиращ сървер в зависимост от реализираната техника за посредничество).

Номерата за интранет мрежи са:

10.xx.xx.xx за голяма интранет мрежа 172.12.xx.xx до 172.28.xx.xx за средна интранет мрежа 192.168.0.xx до 192.168.255.xx за малка интранет мрежа

Пакетът, който пътува в Мрежата по правилата на протокола IP се състои от служебна част и данни. Данните са за протоколите стоящи над IP. Служебната част съдържа следните важни парчета информация:

адреси на получателя и изпращача дължина на пакета тип на протокола стоящ над IP, за който е предназначен пакета други неща свързани с контрола по транспортирането.

Ако адреса на получателя е собствения ни компютър или компютър пряко свързан с него, Linux ще го изпрати веднага към целта. По-сложно е положението когато получателя е отдалечен компютър. В този случай се задействат алгоритмите за пренасочване (рутиране). Всеки компютър свързан в Мрежата има вътрешна таблица за рутиране. По нея се определя накъде да тръгнат пакетите, за които целта не е пряко достижима. Когато комютърът е свързан в Мрежата, в тази таблица има описан поне един рутер (gateway). Съдържанието и можем да разглеждаме с командата: netstat -r

Таблицата за рутиране се променя динамично. Най-прост пример е домашен компютър, който се закача през модем към доставчик на интернет услуги (ISP).

Преди изграждане на връзката таблицата е проста - съдържа информация само за домашния компютър и вътрешния му IP-адрес 127.0.0.1. Всички пакети които се местят ползват за получател и изпращач само този адрес.

След изграждане на връзка към доставчика, компютъра получава още един (вече уникален) IP-адрес за серийния порт, свързан с модема. По новоизградената линия има връзка към IP-адреса на доставчика. Неговия адрес става и рутер за нашия компютър. Като единствен рутер той ще поеме всички изходящи пакети, които не са адресирани към нашия компютър, а също така ще доставя всички входящи пакети.

3.3.Клиенти и сървери

Page 26: Linux

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

Типичната структура на мрежова работа изглежда така:

На постоянно работещ компютър със статичен IP адрес се стартира програма сървер. Сърверът очаква TCP връзки на предварително определен порт (честота, ако правим аналогия с радиоразпръскването).

При стартиране на програмата-клиент се изпълнява следната последователност:

адресация - определя се IP адреса на сървера и евентуално порта за връзка. свързване - клиентът инициира TCP връзка към сървера. обмен - обменят се данните, съобразно спецификата на работата. край - TCP връзката се затваря.

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

Реализацията на този необходим за сърверите паралелизъм се извършва по различни начини. В зависимост от начина им на работа можем да разделим сърверите на няколко типа - fork-сървери , select-сървери и thread-сървери.

fork-сърверът при всяка нова заявка за изграждане на TCP връзка стартира свое копие (извиква системната команда fork), като новото копие поема обслужването на новопоявилия се клиент. Така във всеки момент в системата работят толкова копия на сървера, колкото са клиентите, очакващи информация. Разбира се, трябва да има и едно излишно копие на сървера (или друга подобна програма), което да следи за появата на нови клиенти.

select-сърверът не стартира паралелни процеси, а сам организира псевдопаралелно обслужване на всичките си клиенти. За да разбере кои от свързаните клиенти му изпращат заявки той ползва системната команда select, откъдето идва името му. Реализацията на select-сървер е трудоемка и сложна, поради необходимостта от реализация на вътрешен паралелизъм, но той е единственото решение, когато обслужването на клиентите изисква синхронизация на извършваните операции. Всички сървери на системи за управление на бази данни са от този тип, за да могат да синхронизират транзакциите в базата данни. Друго предимство е по-високата скорост при голям брой кратки сеанси с клиентите, поради спестяването на времето за изпълнение на бавната команда fork. Например WEB-сървера Apache, който е модифициран fork-сървер е около 3 пъти по бавен при сервиране на статични html-страници от select-сърверите, вършещи същата работа (thttpd, mathpod). Добре написан селект-сървер извършва всички входно-изходни операции в режим nonblock, т.е. ако няма готовност за четене или писане от файл или мрежова връзка, сървера не спира, а върши друга работа.

Page 27: Linux

thread-сърверът представлява процес с няколко активни thread-а ("нишки"), т.е. подпрограми, които работят паралелно с главната програма (или процедури, за запознатите с функционалното програмиране). Когато се получи TCP заявка се стартира нова нишка, която за разлика от fork не представлява копие на програмата и не заема толкова ресурси, тази нишка започва да обработва заявката, докато в сьщото време главната програма продължава да очаква нови заявки.

Специално внимание заслужава метасървера inetd. Той се стартира при пускането на системата и се ослушва за нови клиенти на различни портове. Когато на някой от прослушваните портове се появи клиент, inetd решава кой сървер съответства на този порт, стартира го и му пренасочва вече изградената мрежова връзка, за да бъде обслужен клиента. След това inetd продължава да чака появата на нови клиенти. Така inetd позволява само с един пуснат сървер да се призовават при нужда няколко други, за да се пестят системните ресурси. Повечето fork-сървери са пригодени за съвместна работа с inetd. Конфигурационният файл /etc/inetd.conf описва кои от тях са подвластни на inetd и специфичните им параметри (порт, тип на връзката с клиента и пр.).

4. Компютърът под контрол 4.1 Синхронизация на софтуера - версии, зависимости, библиотеки

Всяка Linux система можем да разглеждаме като множество от инсталирани пакети. Особено място заемат библиотеките - това са пакети които са предназначени за ползване от други пакети, зареждат се динамично и обикновено изпълняват услуги, изисквани от някакъв конкретен стандарт. Всеки нормален пакет при работата си използва една или няколко библиотеки, а често и услуги от други нормални пакети. Всяка дистрибуция на Linux се стреми да поддържа коректни зависимости между пакетите в следните направления:

пълнота - всеки пакет се инсталира само ако библиотеките и останалите пакети от които зависи, са вече достъпни (инсталирани).

непротиворечивост - ако два или повече пакета предизвикват конфликт при съвместна работа, дистрибуцията не допуска едновременната им инсталация.

минималност - ако даден пакет не е необходим за директно ползване от собственика на компютъра и от него не зависят други пакети, той не се инсталира.

Обикновено конкретната дистрибуция поддържа специален файлов формат на пакетите си (*.rpm, *.deb), съдържащ цялата информация необходима за автоматизирано инсталиране/деинсталиране на пакета, така че да не се наруши синхронизацията на цялата система.

Случва се обаче дистрибуцията или пакета да има грешка, или пък да искате да инсталирате пакет, който все още не е адаптиран към дистрибуцията. В този случай се налага да инсталирате ръчно пакета. Следвайте такава последователност:

Снабдете се със сорсовете (изходните текстове на пакета) и документация за него !

Разберете от документацията от кои други пакети зависи ! Проверете кои от тях са инсталирани ! Инсталирайте останалите ! Чак сега компилирайте и инсталирайте мечтания пакет !

Page 28: Linux

При проследяване на зависимостите често номера на версията има голямо значение. За всеки Linux пакет това е символен низ от вида xx.yy.zz, където:

xx е основният номер на версията. 0 означава, че това е сравнително нов пакет, който все още не се ползва за отговорни задачи. 1 имат пакетите, достигнали стабилно състояние, а всеки следващ номер се дава при сериозна промяна във функционалността и стандартите.

yy е номер на поредната реализация. За много пакети (традиция, идваща от ядрото) четна реализация означава стабилна версия, предназначена за ползване при сериозна работа, а нечетната е за разработване - за изпробване на нови услуги, за откриване и отстраняване на грешки и пр.

zz е номер на кръпка (patch). Всеки пакет се изгражда чрез последователно извършване на сравнително малки промени. Тези промени се наричат кръпки. Ако разполагате с изходните текстове, можете да генерирате следващи версии само като изтеглите от Мрежата кръпките (обикновено те са на порядъци по-малки по обем) и ги залепите към старата си версия чрез командата patch.

4.2 Следене на състоянието

Колкото и автоматизиран да Ви изглежда вашият Linux, не е зле да го наглеждате от време на време и да сте наясно с методите за следене на текущото състояние. Те са толкова много и разнообразни, че за сравнително пълно изложение ще е необходим отделен учебник. Тук излагаме само най-често използваните и сравнително стари техники за контрол над компютъра, които могат да се използват от обикновена текстова конзола:

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

syslogd е демон, който записва бележки, които различни програми му изпращат за да е достъпна историята на работата им. Файлът /etc/syslog.conf описва кои типове услуги къде ще насочват съобщенията си. Обикновено резултатите от работата на syslogd се записват в различни файлове от директорията /var/log и нейните поддиректории.

who дава информация за включените потребители.

ps изписва работещите в момента процеси.

netstat дава различни справки за състоянието на мрежовите услуги - TCP връзки, таблици за рутиране, състояние на мрейовите интерфейси и пр.

last дава списък на последните свързали се към системата потребители.

df дава статистика за използваната и свободна дискова памет по всички монтирани дискови дялове.

/proc е специална файлова система, отразяваща състоянието на ядрото. В различните поддиректории ще намерите информация за компонентите на вашата система, както и за състоянието на различните процеси. Няколко команди ползват тази информация и дават по-нагледна представа за компонентите:

free за състоянието на RAM и swap паметта. top следи състоянието на процесите и системата изобщо.

Page 29: Linux

ipchains е програма за управление и следене на мрежовите връзки. Взаимодействайки със специална част от ядрото, тя задава правила за работа с мрежовите пакети. Правилата позволяват спиране, пренасочване, преброяване, маскиране на пакетите. Най-често ipchains се ползва за следене и отчитане на трафика в мрежата, за забрана на нежелани мрежови услуги и за маскиране на intranet мрежа.

4.3 Добавяне и изключване на услуги

Linux е система, която работи толкова стабилно, че не се налага да бъде рестартирана при добро поддържане. Това, както и разпределеното и малко координирано създаване на програми изисква сравнително детайлно познаване на механизмите за настройка на услугите, които ползвате на конкретния компютър. Допълнителна трудност е липсата на стандарт за стартиране на системата - всяка основна дистрибуция поддържа собствен метод за стартиране.

Временното (само за конкретната работна сесия) стартиране и спиране на програми е лесно - пускането става като напишем името на програмата, последвано от евентуални параметри. Можем накрая да сложим и символа '&', за да пуснем програмата във фонов режим. Спирането става с команда kill.

Значително по-труден за управление е процеса на стартиране на програми по време на началното зареждане на системата.

Общото между различните дистрибуции е началото на стартирането на Linux. То протича така:

след зареждането и стартирането си ядрото стартира процеса init - единственият процес без родител.

init прочита конфигурационния си файл /etc/inittab и започва да стартира системата съобразно информацията в този файл. Редовете в /etc/inittab имат вида 'етикет:ниво:действие:процес'.

Първи се пуска процеса, указан в реда с действие 'sysinit'. Ето този ред за основните дистрибуции:

o SlackWare: si:S:sysinit:/etc/rc.d/rc.S o RedHat: o Debian: si::sysinit:/etc/init.d/rcS o Caldera:

По нататък съответните скриптове съвместно с init започват да извършват дейностите по зареждане на системата, смяна на нивото и стартирането на услуги. По принцип за всяка дистрибуция скриптовете за стартиране и спиране на услуги са разположени на едно място, но в по-автоматизираните (RedHat, Debian) пускането на тези скриптове се извършва от символни линкове към тях, разположени в директории, съответстващи на нивото.

Тъй като материята е сложна, ще дам само един пример от дистрибуцията Debian. При тази дистрибуция скриптовете се намират в /etc/init.d и нека приемем, че скрипта за стартиране на SQL сървера ни е /etc/init.d/postgres. Тъй като този скрипт се пуска автоматично, той трябва да реагира на стандартен параметър, приемащ стойности:

start - за стартиране на услугата stop - за спиране restart, install, uninstall и пр. - за други работи

Page 30: Linux

Същинското пускане на скрипта обаче ще се извърши чрез символни връзки. В нашия конкретен случай искаме сървера да стартира на ниво 2, към края на стартирането на системата. За тази цел създаваме символна връзка (линк) в директория /etc/rc2.d така:

S95postgres -> ../init.d/postgres

Директорията /etc/rc2.d съдържа линкове към всички услуги, които ще бъдат пуснати или спрени при включване на ниво 2.

Буквата S в началото на името на връзката означава 'стартирай' (буква K означава 'спри').

Числото 95 в името на връзката влияе на реда на стартиране на услугите (00 се пускат първи, 99 - последни).

Тази наглед сложна схема за стартиране/спиране на услуги позволява унифициране на процеса на пускане/спиране на системата, както и методите за инсталация на пакети. Например ако искаме SQL сървера да не се стартира при рестарт на компютъра, просто изтриваме или преименуваме съответната символна връзка.

Единствено в дистрибуцията SlackWare процеса на стартиране се описва директно. Всички скриптове се намират в /etc/rc.d, а стартирането на многопотребителското ниво се извършва от скрипта /etc/rc.d/rc.M, където пряко се викат всички услуги.

4.4 Индекс на важни системни команди

kill [-сигнал] номер_на_процес Изпраща сигнал към указания процес, обикновено с цел да го спре. При липса на 'сигнал' се изпраща TERM. По твърдата форма е 'kill -9 pid'.

nice [-n приоритет] [команда [аргумент...]] Стартира 'команда' с нов приоритет. Добавя 'приоритет' към приоритета на родителския процес. Стандартно процесите са с приоритет 0, -20 е най-висок, 19 е най-нисък, а nice добавя 10 при липса на аргумент 'приоритет'. Само 'nice' връща приоритета на текущия процес.

pidof процес Връща номера на указания процес. Можете да спрете процеса my_proc като напишете "kill -9 `pidof my_proc`".

fuser файл или мрежова връзка Връща номера на процес, който използва указания файл или мрежова връзка (socket).

ps параметри Връща списък на активните процеси.

5. Графична потребителска среда X Window 5.1 X-сървер и X-клиент

XWindow е графична среда за работа на потребителя в UNIX - съвместимите операционни системи. В Linux най-често се използва реализацията XFree86.

XWindow има клиент-сървер структура на най-ниското си ниво.

Page 31: Linux

Сърверът (наричан още X-сървер) е хардуерно зависим. Той управлява входно изходните устройства, участващи в работата. Тези устройства са графичен дисплей (като хардуер се състои от графичен контролер и монитор), клавиатура и мишка. Можем да разглеждаме X-сървера като драйвер за този комплекс от устройства. Ядрото на Linux има възможност да стартира X-сървера в режим на обикновен потребител (от съображения за сигурност на системата). Стандарта позволява да стартираме няколко копия на X-сървера за един набор графични устройства, както и различни копия за различни устройства свързани към компютъра ни.

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

Обикновено X-клиентите са организирани във йерархия:

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

По средата в тази йерархия се разполага DesktopEnvironment - използвайки управителя на прозорците, той създава цялостна среда за удобна работа на потребителя - икони, менюта, средства за обмен на данни, настройка, помощ и др. В по-старите реализции на X-среди този слой е много беден, в по-новите е развит и включва все повече интегрирани услуги и приложения.

Най-близо до потребителя са конкретните приложения - X-клиенти, извършващи специфична работа. Най-често се използват X-терминали (графични аналози на текстовите конзоли), текстови редактори и офис - програми, редактори на графика, графични Internet клиенти за email, WEB, ICQ, IRC, ftp и подобни услуги, програми за слушане на музика и гледане на филми.

5.2 Модни графични интерфейси

В момента (началото на 2001г.) са актуални две големи графични потребителски среди - KDE (K Desktop Environment) и GNOME.

6. Рай за програмисти Linux (и другите операционни системи със свободен код) са създадени от програмистите най-напред за собствено ползване, поради което изобилстват със средства за разработка - компилатори, текстови редактори, помощни програми (utility) и специални средства за осигуряване на съвместна разработка по Мрежата.

6.1 Езици за програмиране

Подобно на всяка друга UNIX-подобна ОС, единственият жизнено важен език за Linux е C. На C са написани ядрото и всички базови програми на системата, както и основните мрежови клиенти и сървери. Самите средства за разработка на C-програми - компилатор, свързващ редактор, дебъгер и пр. също са написани на C. На практика повечето базови части на Linux, с изключение на ядрото, са

Page 32: Linux

разработват от GNU Software Foundation от средата на 80-те години насам. Затова вместо името Linux, често се употребява по-дългото GNU/Linux.

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

shell

perl

C++

Lisp

Pascal

6.2 Хакерската култура

За да ползвате или създавате успешно софтуер за Linux, трябва да сте наясно с правилата и нормите за поведение в областта на Свободния софтуер.

Тези правила и норми формират хакерската култура. Индивидите в тази култура са сравнително равноправни, основната морална норма е сътрудничеството, основното средство за комуникация - Мрежата.

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

Жизненият цикъл на един пакет започва, когато някой мъдър програмист създаде нова програма и я предостави за ползване в Мрежата.

В началната фаза пакета се поддържа от създателя си и се ползва от сравнително малка група потребители, които си комуникират със собственика на пакета най-често по email, за да съобщят за грешки или да предлагат нови идеи. Огромното мнозинство от софтуерни пакети никога не напущат тази детска фаза на развитие.

Ако пакета е успешен, в разработката му се включват нови програмисти. Създава се mail-list за обмен на информация. Някой поема ролята на администратор и се грижи за актуалността на архивите и maillist-а. Обикновено през тази фаза се появява по-сериозна документация, WEB-място, news група и пр. места за обмен на информация.

Най-успешните пакети придобиват сложна инфраструктура. Администрирането им става разпределено - такъв пакет има няколко копия в мрежата (mirror), за да се улесни изтеглянето му от голям брой потребители. Софтуерния архив се поддържа от CVS (Concurrent Versions System) - система за синхронизация на изходните текстове, броят на mail-list-овете също нараства, като те се специализират - за разработчици, за начинаещи потребители, за новини и пр. Появяват се автоматизирани срества за следене на грешките в пакета. Обикновено на тази фаза пакета е достъпен за няколко операционни системи, поддържа сложни инсталационни процедури и се предлага в различни формати за разпространение.

Болшинството хакери правят свободен софтуер за удоволоствие в свободното си време. Когато мерака им секне, създадените от тях пакетите остават без поддръжка. Ако ползвате такъв пакет, трябва да разчитате само на себе си и

Page 33: Linux

останалите потребители на пакета и при нужда да организирате по-нататъшното му развитие.

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

Дори да не сте програмист, включвайте се в работата по пакетите, които ползвате най-често ! Изпращайте на групата която ги разработва съобщения за грешки, участвайте в обсъжданията на нови идеи, включвайте се в писането на учебници и документация, ако не с друго, поне с мнения и забележки !

Колкото и малък да е Вашият принос, той ще е полезен за развитието на любимия Ви пакет и ще подобри качестото на Свободния софтуер изобщо. Това е и единствения начин да заплатите свободния софтуер, който ползвате (ако не броим прякото спонсориране на проекти, което е твърде рядко явление).

Хакерската култура освен естествените си технологични аспекти се характеризира със специфични морални, икономически и социални аспекти. Някои от основните норми в тази култура откровено се разминават с нормите на съвременните елитарни общества, което често води до конфликти.

Хакерската култура се асоциира (не без основание) със социални течения като модерния анархизъм и църковната реформацията от края на XV век, с философски школи като Даоизма (създаден през V в. пр. Хр. от Лао Дзъ в Китай), и с икономически модели близки до модела на предземеделските култури, доминирани от авторитета, а не от частната собственост и пазара.

Полезни четива по темата:

Две ключови монографии на Eric S. Raymond: The Cathedral and the Bazaar и Homesteading the Noosphere.

Ram Samudrala, A primer on the ethics of ``Intellectual property'' Loyd Fueston, Is Self-Interest Sufficient to Organize an Free Economy? Юридически аспекти от Eben Moglen: " So Much for Savages : Navajo 1,

Government 0 in Final Moments of Play." и Anarchism Triumphant: Free Software and the Death of Copyright

Основния лиценз за свободния софтуер GNU General Public License, Version 2, June 1991.

6.3 Конструиране с готови модули

Основен принцип в хакерската култура е да не се пише два пъти една и съща програма. Много услуги в Linux са реализирани като малки програми, които описват само спецификата на услугата, а същинската обработка на данните се извършва от големи и добре тествани стандартни програми.

Добра илюстрация на този принцип е големия брой съществуващи Web-услуги, които се реализират чрез CGI-програми.

Common Gateway Interface (CGI) е стандартен начин за Web сървера да предаде заявка от някой Web клиент към някоя приложна програма, както и да прати създадения от нея отговор обратно на потребителя.

Page 34: Linux

Някои Web-страници съдържат форма - празни полета, пригодени за попълване от потребителя. Когато последният попълни полетата и изпрати формата, Web сърверът изпраща информацията от полетата към програма, която анализира тази информация и връща към потребителя нова страница - отговор. Тази уговорка за прехвърляне насам-натам на информация между Web-страница, разглеждана от потребителя и приложна програма, разположена на сървера се нарича именно Common Gateway Interface (CGI). Тя е част от протокола HTTP.

Ако създавате Web-услуга и искате CGI-програма да получи управлението, трябва да сервирате към клиентите HTML страница, съдържаща името на CGI-програмата в специален URL. Обикновено този URL е част от описние на форма. В примера

<FORM METHOD=POST ACTION=http://www.mybiz.com/cgi-bin/formprog.pl>

Web-сърверът, намиращ се на "mybiz.com" ще предаде управлението на CGI-програма, наречена "formprog.pl" (".pl" означава, че става дума за програма, написана на Perl, но за подобни цели могат да се използват и много други езици. Употребяват се C, C++, Perl, Pascal и др.)

Обикновено CGI-програмите са малки и за да свършат работата, която им се възлага, се обръщат към големи стандартни сървери за обработка на данни (програми за управление на бази данни като PostgreSQL и MySQL, пощенски сървери като SendMail и др.).

Типичната Web-услуга извършва прехвърляне и обработка на данни по верига от вида:

Web-клиент (Netscape) <-> Web-сървер (Apache) <-> CGI-програми <-> СУБД (PostgreSQL)

Трите големи програми в тази вериага са със свободен код и единственото, което се налага да направим, е да напишем група от CGI-програми на любимия си език за програмиране, за да опишем конкретния облик на Web-услугата.