Най-простичката дефиниция за
файлова система е набор от файлове,
структурирани по някакъв начин и съхранени върху
запомнящо устройство.
Едно от основните предимства на 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. за
ползотворните забележки по отношение на
текста на тази статия)