Home    Решения    Услуги    Download    Публикации    Работа    Продукти    Документи
 

 

 
Print this page/Отпечатай тази страница  

 

Файлова система на Linux. Права за достъп до файловете

от Йовко Ламбрев ([email protected])

(Статията е включена в първия български online Учебник за Linux, написан от доброволци от българското Linux общество)




 

 

    Най-простичката дефиниция за файлова система е набор от файлове, структурирани по някакъв начин и съхранени върху запомнящо устройство.
    Едно от основните предимства на 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 IDE1
master hda hdc
slave hdb hdd

    Всъщност файловата система дори не е необходимо да бъде локална за машината. Може да се намира някъде другаде из мрежата на друг компютър.
    Файловата система на Linux се нарича ext2 (пълното и наименование е The Second Extended File System), която е наследник на ext, която от своя страна е наследила minix (първата файлова система, която е ползвала Linux). Създадена е от Remy Card през 1993. При тази файлова система данните се пазят в блокове от данни с еднаква дължина. Тя обаче може да се променя при отделните ext2 файлови системи. Този размер на блоковете се определя при създаването на файловата система. Но не пречи да имаме две ext2 файлови системи с различни дължини на тези блокове.
    Файловата система може да бъде разгледана в два аспекта. На високо ниво под файлова система се разбира разположението на директориите и файловата йерархия в един дял, а на ниско ниво представлява начина на форматиране на блоковото устройство. Тук ще разгледаме файловата система само от високо ниво, тъй като ниското ниво обикновено е в интереса на тесен кръг от специалисти. Ако все пак някой се интересува от по-подробна информация за суперблоковете, полетата в тях и описанията им може да потърси из Интернет или да ми пише на адрес [email protected] да му изпратя такава.
    Една типична организация на директориите в една Linux система е следната:


|-- bin
|-- boot
|-- dev
|-- etc
|-- homе
|    '-- yovko
|-- lib
|-- lost+found
|-- mnt
|    |-- 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

    Тази команда монтира файловата система на компакт-диска в 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, но сега не ни интересува съдържанието, а просто съществуването на файла. Иначе трябва да получите нещо такова като резултат:

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.txt
drwxr-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, но той няма отношение към разглежданата тема в момента.)

    Какво направихме дотук - един файл 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.txt
drwxr-xr-x  2 yovko users 1024 Sep  8 18:19 sample

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

    chmod -w ./sample.txt

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

    chmod -rwx ./sample.txt

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

  • 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.txt
drwxr-xr-x  2 yovko users 1024 Sep  8 18:19 sample

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

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

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

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

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


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

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

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

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

000    0
001    1
010    2
011    3
100    4
101    5
110    6
111    7


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

    chmod 640 ./sample.txt

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

Собственик Група Останалите
r w x r w x r w x
1 1 1 1 1 0 1 0 0
111 110 100
7 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.


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


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

    man chgrp

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

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

 

(Заб.: Специални благодарности на Влади Белперчинов-Шабански от DataMax Ltd. за ползотворните забележки по отношение на текста на тази статия)