Inodes и директории
Специална структура от данни е свързана с всеки файл в Unix OS - inode (inode ), който съхранява мета-информация за файла (собственик, права за достъп и т.н.).
Inodes в традиционната Unix файлова система (FS) бяха комбинирани в последователно номериран масив, който даде името на структурата (индексиран възел). За да се съхрани масив от inode в традиционна FS, непрекъсната секция от логически блокове беше разпределена на диска. Размерът на този раздел определя максималния брой файлове, които могат да бъдат създадени във FS. В съвременните файлови системи тази структура може да има различни размери и набор от полета или да отсъства изобщо. Съответно класическите помощни програми за наблюдение на FS могат да дадат неправилни данни за броя на заетите и свободните FS inodes.
Един дескриптор на индекс може да се разглежда по два начина:
При реализацията на FS Access API това е стандартизирана структура от данни за обобщено представяне на файлови атрибути. В RAM inode може да бъде представен във виртуална форма -vnode. За файлови системи, които не съхраняват inodes,vnode се създава въз основа на други подходящи източници на данни.
Номерът на inode е уникален в рамките на една FS, но когато няколко FS са монтирани в едно дърво, номерата на inode ще се повтарят. Следователноvnode съхранява номера на inode плюс идентификатора на файловата система, в която се намира. За дискови файлови системи в Linux, номерът на файловата система е число, съставено от главния и второстепенния на блоковото устройство, на което се намира файловата система. За NFS изглежда, че FS номерът се определя от реда на монтиране и се увеличава последователно, започвайки от 1Ah.
Дървовидната структура на файловата система в Unix се предоставя от директориите, които съхраняват таблицатаNAME->inode съвпада. Тази таблица изисква уникалност на името, но не и уникалност на номера на Inode. Поради това всеки FS обект може да има няколко имена. Броячът на имената се съхранява в inode на обекта.
Директориите имат едно „нормално“ име в директорията от най-високо ниво, името „.“ в самата директория и името „..“ във всяка от поддиректориите. В Linux не можете да създавате други имена за директория. Нарушаването на това правило доведе до факта, че в структурата на файловата система могат да се образуват цикли и това би нарушило работата на алгоритмите за преминаване на дървото на директориите.
В Linux нормалните потребители могат да създават твърди връзки само към обекти, които притежават. Нарушаването на това правило би довело до факта, че потребителят не може да бъде сигурен, че файлът, който изтрива, наистина е изтрит от FS, т.к. файлът се изтрива само ако няма твърда връзка към него.
Има три времеви отпечатъка, свързани с всеки обект на файловата система на Unix:
- ctime – време за промяна на файловите атрибути (inode ). Промени при промяна на правата за достъп, собственика или групата на файла, както и при промяна на съдържанието на файла.
- mtime – времето на последния запис във файла.
- atime – последният път, когато е бил достъпен файлът. В зависимост от опциите, FS може да остане непроменен (оптимизация), да се промени при отваряне на файла, да се промени на всеки n секунди, докато файлът остава отворен. Извикването наstat не променяatime.
Потребителят може произволно да променяmtime иatime, включително минало или бъдещо време (например докоснете -t 200012311800 time.txt). В този случайctime ще се промени по време на операцията.
В класическия Unix няма времево клеймо за създаване на файл, което е достанеудобно за администраторите.
В конкретни реализации на FS може да има други етикети, но те не са достъпни чрез стандартните API функции. Например ex2fs има поле за време за изтриване на файлdtime, докато Sun StorEdge QFS има време за създаване на файлcreation time.
Разрешения за файлове и директории
В Unix правата за достъп до обект на файлова система се съхраняват в битовото поле на inode (inode ). Шестнадесетбитовото поле, нареченоmode, включва четири бита, указващи типа на обекта, три бита специални характеристики (suid,sgid,sticky ) и девет бита за разрешение. Правилата за интерпретиране на флаговетеmode (особеноsuid,sgid,sticky ) и правилата за тяхното манипулиране може да се различават в различните операционни системи. Този текст описва правилата на Linux.
Собственикът на файла или администраторът може да промени правата за достъп (запис в inode). Членовете на групата на файла нямат специални права върху inodes. Потребителят може да отнеме собствените си права да чете и пише във файла, но правото да пише в inode (включително правото да променя правата) се запазва от собственика на файла при всякакви обстоятелства. Потребителят не може да прехвърли собствеността върху файл на друг потребител и не може да вземе собствеността върху файл от друг потребител.
Когато собственикът или групата се променят, флаговетеsuid иsgid се изчистват. Потребителят не може да зададе флагаsgid на свой собствен файл, ако файлът принадлежи към група, на която потребителят не е член.
Когато се създава файл, винаги му се присвоява основна група собственик. В бъдеще собственикът може да присвои група към файла, в която самият той е член. Има поне две изключения от тези правила:
- Файлове, създадени в директориятакъм които е присвоен флагътsgid, наследяват групата, към която принадлежи директорията, дори ако създателят на файла не е член на тази група.
- На файловете, създадени от програма, чийто изпълним файл е зададен с флагаsgid, се дава групата, която притежава програмния файл.
Правата за достъп включват правото на четене (R__ead), писане (__W__rite) и изпълнение (e__X__ecute). Има три набора от __rwx права за собственик на файл (U__ser), файлова група (__G__roup) и други (__O__ther). Традиционно разрешенията се записват като низ от три тройки __rwx. Тройките са подредени отляво надясно в редugo. Липсващото дясно е отбелязано с тире. Набор от права може да бъде представен и като трицифрено осмично число, където 1 представлява наличието на правото, а 0 отсъствието. Напримерrwxr-xr-- е еквивалентен на 7548. Помощната програмаstat ви позволява да показвате разрешенията за файлове в осмична форма, като посочите формата%a. Например, директорията/tmp има всички разрешения, зададени за всички иsticky bit :
Разрешенията се проверяват по време на изпълнение на системни извиквания, свързани с достъп до файлове и директории, като например creat(), open(), unlink(), exec(). От трите набора права се избира този, който най-точно характеризира потребителя, който се опитва да получи достъп до файла. Правата на собственика се припокриват с правата на групата и другите, за другите членове на групата правата на групата се припокриват с правата на другите.
Разрешения за файлове
За даден файл разрешениятаrw се проверяват по време на изпълнение на извикването на ядротоopen(). В този случай правата за достъп се проверяват спрямо флаговете за достъп, предадени наopen. Правилниятx се проверява по време на извикването наexec(). За да изпълните двоични файлове веднагачетене не е задължително. Защитените от четене изпълними файлове не могат да се изпълняват под програма за отстраняване на грешки. За скриптове стартирането означава стартиране на програма за интерпретатор, която приема като първи параметър името на файла на скрипта. В този случай интерпретаторът трябва да отвори скриптовия файл за четене и е необходим десенr.
Флаговетеsuid иsgid, комбинирани с правото за изпълнение, променят ефективните права на процеса в момента, в който програмата от този файл се изпълнява чрез извикване наexec. Ефективните права съответстват на собственика (групата от собственици) на файла. Когато има право за изпълнение,suid иsgid се показват катоs в позицията на флага за изпълнение надясно. Флагътsuid (sgid ) може да бъде присвоен на файл, който няма флаг за разрешение за изпълнение за собственика (групата). Ако няма право за изпълнение,suid иsgid се показват катоS в позицията на флага за изпълнение надясно. Флагътsuid без право да бъде изпълнен от собственика няма ефект. Флагътsgid без разрешение за групово изпълнение се използва като знак за принудително заключване на файл, когато се изпълни системното извикванеfcntl(fd, F_SETLK. ).
Флагътsticky bit няма ефект върху обработката на файлове в Linux. Нещо повече, системното извикванеchmod() тихо игнорира опитите за задаване назалепващия бит, без да извежда грешка, но без да предприема каквото и да е действие. В по-старите версии на Unixзалепващият бит, в комбинация с флага за разрешение за изпълнение, показваше, че след прекратяване на програмата нейният код трябва да бъде съхранен в областта за размяна за бързо повторно изпълнение.
Разрешения за директория
Директорията може да се разглежда като таблица, съдържаща много записи, всеки от които се състои от две полета: име и номер на inode. В този модел достъп за писане додиректория означава правото за създаване и изтриване на записи, т.е. създаване на файлове в директория, създаване на нови имена за съществуващи файлове (връзка ), изтриване на имена на файлове (възможно заедно с файлове) (прекратяване на връзката ). За да изтриете файл, не е необходимо да имате право да работите с файла, достатъчно е да имате право да пишете в директорията, където се съхранява неговото фамилно име.
Правото за четене означава правото на директорията да получи списък с имена (лявата колона в нашия модел), а правото за изпълнение означава достъп до номерата на inode (дясната колона). Обикновено и двете права трябва да се използват едновременно. Ако няма разрешение за изпълнение, тогава този с разрешение за четене ще получи списък с имена на файлове в директорията, но няма да може да получи техните метаданни (собственик, размер и т.н.) или достъп до данните. Ако няма разрешение за четене, тогава става невъзможно да се знаят имената на файловете в директорията. Въпреки това, ако името е известно от други източници, тогава файлът може да бъде достъпен по стандартен начин.
Залепващият бит се използва за директории, които могат да се записват от групата или други. Този бит показва, че всеки с достъп за запис може да създава записи в директорията, но само собственикът на обекта, към който сочи записът, или собственикът на директорията може да изтрие.sTicky bit се обозначава с букватаt в позицията на правото на изпълнение за други, ако самото право съществува, и с букватаT, ако няма такова право.
Флагътsetgid, зададен на директория, кара всички обекти, създадени в тази директория, да наследят групата на директорията. Създадените поддиректории допълнително наследяват самия битsetgid.
Флагътsetuid, зададен на директория на System V и Linux, се игнорира. В BSD системиsetuid е зададен на директория,действа катоsetgid.
Традиционните разрешения, съхранени в полетоmode, не ви позволяват да задавате разрешения на ниво потребител или група. Да кажем, че не можете да разпределите права за достъп, така че потребител1 да има достъп само за четене, потребител2 да има достъп само за писане и потребител3 да има достъп само за изпълнение.
За да се преодолеят тези ограничения, съвременните реализации на Unix поддържат списъци за достъп -ACL. Отделенinode може да бъде запазен за съхраняване на списъци за достъп, което позволява разпределяне на място за тях в областта с данни на FS, без да се създава отделен видим файл.
Списъците за достъп се състоят от записи, съдържащи типа запис (потребител, група, други, маска), идентификатор на потребител или група, флагове за разрешение за четене, запис и изпълнение. Правата за достъп, съдържащи се вinode, задължително се дублират от три записа вACL - собственик, група, други. Маската определя максималните разрешения, които ще бъдат достъпни чрезACL. Ако дадете на някого разрешениеrwx и маската еr--, тогава резултатът е разрешениеr--. Ефектът на маската не важи за собственика на файла и за други.
За да укаже наличието наACL, информационните помощни програми добавят знака+ след стандартния списък с разрешения