netzona.al.ru
 http://netzona.al.ru :: Статьи > РазноеСтраница обновлена: 11.10.2005 
  Главная
 Программы
 Статьи
  Ссылки
  Гостевая
  Чат
  Немного о PHP
  Технология SSI
  BIOS
  Файловая система Linux
  Восстановление XP
lastimaginary.tk
NetZona.al.ru
Получить код
 
Файловая система LINUX

Подразумевается — что нужно знать простому, хотя и считающему себя профессионалом, пользователю. И потому особых подробностей здесь не ищите:

их можно обнаружить в толстых книгах про Linux или в замечательной статье Виктора Хименко "Файлы, файлы, файлы" (Мир ПК, 2000, ##2, 3).

А пользователю нужно в первую очередь осознать отличия файловой системы Linux от привычных систем DOS и Windows.

Linux позволяет работать с великим множеством файловых систем, как локальных, так и сетевых. Однако у него есть и своя, родная, файловая система, носящая название ext2fs. Построена она предельно просто и логично:

все в ней является файлами — данные, программы, каталоги, устройства (для примера — последовательные или параллельные порты). И потому файлы разделяются на типы:

  1. обычные файлы;
  2. каталоги;
  3. файлы устройств;
  4. ссылки.

Обычные файлы — это, во-первых, исполняемые двоичные файлы (типа файлов ехе или сот, но не привязанные к какому-либо расширению); во-вторых, ASCII-файлы, содержащие простой текст (не обязательно романического содержания — сюда относится и подавляющее большинство системных конфигурационных файлов); в-третьих, файлы данных, созданные какой-либо программой (текстовым процессором, графическим редактором или электронной таблицей, например) в собственном формате. Впрочем, все это пользователю DOS/Windows понятно.

Каталоги — это тоже файлы, содержащие информацию о каталогах: рекурсия — широко распространенный и любимый прием в мире Unix-систем (достаточно вспомнить расшифровку аббревиатуры проекта GNU — GNU'S Not Unix). Каталоги объединяются в иерархическое дерево, начинающееся, как и положено, с корня (/ — root, корневой каталог) и растущее ввысь и вширь; любые накопители, как монтируемые при загрузке (жесткие диски, скажем, и их логические разделы), так и подключаемые в процессе работы (CD ROM, Zip, дискеты) — не более чем ветви дерева каталогов.

Файлы устройств — понятие для Windows-мигранта непривычное. Это нужно просто запомнить: все физические устройства, присутствующие в системе (порты ввода/вывода, накопители разного рода, звуковые устройства и прочие), с точки зрения ext2fs являются файлами. Устройства эти могут быть блочными (например, накопители) или символьными (порты ввода/вывода), но это — уже подробности.

Наконец, ссылки (links) — это некий (но отдаленный, прямая параллель здесь неуместна) аналог ярлыков в Windows или теней в OS/2. Ссылка может быть прямой, или жесткой (hardlink или, часто просто, link), и символической (symlink). Первые могут указывать на любой файл в файловой системы, тогда как вторые обязаны находиться в одном дисковом разделе.

Чтобы лучше понять, что такое ссылки, давайте попробуем разобраться, что же такое с точки зрения файл ext2fs (не могу не отметить, что для себя я окончательно понял это после прочтения упомянутой статьи Виктора Хи-менко).

Так вот, файл состоит как бы из двух частей. Первая — это нумерованная в шестнадцатеричном исчислении запись — inode (адекватного перевода мне обнаружить не удалось, иногда переводится как "узел"). В ней содержится информация о размере файла, его формате, правах доступа и т. д. Вторая часть — это имя файла, связанное с inode посредством прямой ссылки.

Каковы следствия этого для конечного пользователя? Первое — имя файла, включая и расширение, не играет в Linux такой сакральной роли, как в DOS/Windows. Если в последней сменить расширение файла, скажем, psd на любое иное — открыть такой файл в Photoshop просто щелчком на его имени уже не удастся. В Linux же в общем случае файлу данных любого типа может быть присвоено любое расширение (или его может не быть, вовсе): на понимание его породившей программой это никак не отразится. Более того, файл может иметь несколько расширений (то есть групп знаков, разделенных точками): типичный пример — архивный сжатый файл .tar.gz.

Правда, некоторые программы (скажем, графические редакторы или офисные пакеты) все же требуют, чтобы файл формата TIFF имел расширение tif, и т. д. Но это — извращение генеральной линии. И вызывается тем, что имя файла неявно передается программе, то есть запускающей ее команде, в качестве одного из аргументов.

Следствие второе— теоретически (да и практически) с одним и тем же inode может быть сколько угодно ссылок, причем не обязательно идентичных. То есть один и тот же физический файл как бы выступает под разными именами. Это играет важную роль при использовании библиотек; шрифтов и в ряде других случаев.

Следствие третье — удаление файлов в Linux происходит совершенно иначе, чем в DOS/Windows. Где, как известно, удаленный обычными средствами файл продолжает физически существовать до тех пор, пока на его место не записана новая информация. На чем и основаны программы восстановления ошибочно удаленных данных, вроде прославившей Питера Нортона утилиты unerase.

В Linux файл (то есть inode ) удаляется автоматически, когда становится недоступным для системы. Это происходит тогда, когда истреблена последняя ссылка на него (а имя файла, удаляемое средствами командной строки или файлового менеджера, — и есть такая ссылка) и закрыта последняя обращающаяся к нему программа.

Таким образом, если мы удалим все файлы во всех каталогах всех уровней вложенности (а средства командной строки дают возможность сделать это играючи и даже подтверждения не запросят) — мы будем по прежнему существовать в работающей системе. И все открытые файлы данных будут существовать и смогут быть изменены, записаны, переименованы и т. д. Все это исчезнет только после перезагрузки системы. Но зато — безвозвратно: никакие либеральности unerase, undelete и прочих программ в Linux не возможны в принципе.

Правда, такая графическая среда, как KDE, имеет аналог мусорной корзины Windows. Но это просто отдельный каталог, куда помещаются файлы, полагаемые ненужными, чтобы глаза не мозолили. И откуда их можно даже не восстановить в смысле DOS, а просто скопировать обратно.

Возвращаясь к имени файла. Поскольку оно в Linux не столь свято, как в DOS/Windows, и ограничений на него много меньше. Так, абсолютно запрещенные к использованию символы — только / и \. Правда, некоторые другие специальные символы, такие, как !, @ и прочие из верхнего ряда клавиатуры, за исключением _, всякого рода скобки и кавычки, также не рекомендуются к использованию в именах файлов, особенно — в начальной позиции, но это, обычно, требование оболочки командной строки, а не системы.

Максимальная длина имени файла (включая и любое количество "расширений") — 255 знаков. А максимально возможная длина пути — 4096, что практически можно считать бесконечным. В отличие от Windows, где при стремлении программ инсталлироваться глубоко в недра каталога Program Files, ограничение на длину полного имени файла в 260 знаков становится реальностью.

А вот структура каталогов в Linux, напротив, жестко фиксирована, хотя в деталях и может разниться от дистрибутива к дистрибутиву. Конечно, обладая правами суперпользователя, ее можно изменить. Но делать это ни в коем случае не следует — в результате система может просто утратить работоспособность.

Как правило, после инсталляции системы в корневом (/root) каталоге присутствуют:

D /bin — каталог для исполнимых (иначе называемых бинарными, binary) файлов общего назначения; здесь помещаются оболочки командной строки, общие команды управления файлами и их архивации, традиционные текстовые редакторы типа vi, и т. д.; именно каталог /bin в первую очередь просматривается на предмет поиска введенной с клавиатуры команды;

  • /boot, как явствует из названия, содержит файл образа ядра, с которого загружается система;
  • /dev — каталог для файлов устройств;
  • /etc — каталог для конфигурационных файлов общего пользования;
  • /home включает в себя домашние каталоги пользователей, со всеми их программами, личными конфигурационными файлами (имеющими в сеансе этого пользователя предпочтение перед общими файлами конфигурации) и данными;
  • /lib — каталог для общесистемных библиотек (аналогов dll в Windows);
  • /mnt — каталог для монтирования сменных накопителей (вроде дискет) или временно подключаемых файловых систем (например, FAT-раздела диска);
  • /proc — виртуальная файловая система для чтения информации о процессах;
  • /root — аналог $НОМЕ для суперпользователя;
  • /sbin содержит системные двоичные файлы, используемые для системного администрирования;
  • /tmp, понятно, включает в себя всякого рода временные файлы; как правило, этот каталог автоматически очищается при перезагрузке или через некоторое время;
  • /usr — каталог для прикладных пользовательских программ со всеми их компонентами — исполнимыми, конфигурационными и разделяемыми файлами (/usr/bin, /usr/etc и /usr/share соответственно), библиотеками (/usr/lib), документацией в различных форматах (/usr/doc, /usr/man) и т. д.; важный подкаталог /usr/local предназначен для программ, не входящих в дистрибутив стандартно — сюда по умолчанию инсталлируются компилируемые из исходных текстов приложения;
  • /var — каталог для варьирующих файлов, всякого рода системных журналов, почтовых и принтерных спуллингов и т. д.

Кроме того, в дереве могут присутствовать и некоторые другие каталоги, например, /opt — для опциональных компонентов, или /misc — для всего, что не подпадает под приведенные определения.

В общем, назначение каталогов и логика их организации понятна, если затратить некоторое время на изучение их содержимого. Трудности, скорее всего, могут возникнуть с каталогом /mnt, поскольку ни DOS, ни Windows не имеют даже отдаленных аналогов этого понятия.

Когда шел разговор об инсталляции системы и создании дисковых разделов, вскользь упоминалась необходимость задать для них точку монтирования. Скажем, для созданного нами раздела под пользовательские данные такая точка определялась как /home. Тем самым мы включили этот (или любой другой) дисковый раздел в структуру дерева каталогов Linux. Или, иными словами, смонтировали его в файловую систему Linux.

Разделы жесткого диска с файловой системой ext2fs обычно монтируются автоматически, при загрузке системы. Часто так же поступают и с FAT-разделами. А в Linux Mandrake (и некоторых других дистрибутивах) предусмотрено автоматическое монтирование и для сменных накопителей — дискет и CD ROM. Вот под них-то и отведен каталог /mnt.

А вообще, что и как монтируется — описано в конфигурационном файле /etc/fstab, в котором в каждой строке указывается (слева направо) имя устройства, точка его монтирования, тип файловой системы, условия монтирования (по умолчанию, автоматическое, пользователем и т. д.) и параметры резервного копирования. Файл этот может выглядеть примерно так:

/dev/hdal /mnt/DOS_hdal vfat user,exec,conv=auto 0 0

/dev/hda2 / ext2 defaults 1 1

/dev/hda3 swap swap defaults 0 0

/dev/hda4 /home ext2 defaults 1 2

/mnt/floppy /mnt/floppy super-mount fs=vfat,dev=/dev/fd0 0 0

none /proc proc defaults 0 0

none /dev/pts devpts mode=0620 0 0

/innt/cdrom /imit/cdrom supermount fs=iso9660,devs/dev/cdromi 0 0

Из чего можно видеть, что в приведенном примере все разделы ex2fs, раздел подкачки и FAT-раздел монтируются по умолчанию, а для сменных носителей предусмотрена опция supermount, то есть монтирования при обращении и размонтирования — при прекращении его.

Если такая опция не поддерживается, сменные носители требуется монтировать вручную. Для этого дается команда mount с именем устройства и точкой монтирования в качестве аргументов. Например, с помощью

mount /dev/hdc /mnt/cdrom

монтируется CD ROM, подключенный в качестве мастера ко второму каналу IDE; содержимое его после этого можно будет увидеть в каталоге /mnt/cdrom. А перед извлечением сменного носителя (во избежание тяжких последствий, о которых — в разделе техники безопасности), его следует размонтировать командой umount (обращаю внимание — без буквы п, вопреки логике) с точкой монтирования в качестве аргумента. Разумеется, при этом обращений к файлам на носителе быть не должно.

В общем случае монтирование и размонтирование устройства требует прав администратора. Но последний может разрешить эту операцию и пользователям. Для этого в файле fstab в каждой из строчек, соответствующих устройству, к которому предполагается непосредственный доступ пользователя, в четвертой позиции нужно добавить user, например, для CD ROM примерно таким образом:

/dev/hdcl /mnt/cdrom iso9660 user 0 О

Однако для пользователя наиболее важен каталог /usr (кроме его домашнего, разумеется). Если просмотреть его внимательно, можно обнаружить в нем многочисленные повторения. Например, каталоги /usr/XllR6/bin и /usr/bin/Xll кажутся идентичными по содержанию, так же как /usr/XllR6/lib/Xll и /usr/lib/Xll. Возникает естественное желание стереть излишки для освобождения дискового пространства.

Делать этого не нужно: система не дура, и ничего в ней не происходит зря. Поскольку содержимое /usr/XllR6/bin и /usr/XllR6/lib/Xll — не более, чем символические ссылки на файлы из соответствующих разделов каталогов /usr/bin и /usr/lib. Почему?

Linux, как говорилось во Введении — Unix-подобная система, то есть полный функциональный аналог Unix. И, теоретически рассуждая, любая программа для любой версии Unix должна работать и в Linux. В чем часто (хотя и не всегда) можно убедиться на практике, если скомпилировать эту программу из исходных текстов. Так вот, Unix-системы имеют несколько различающиеся структуры каталогов. И, соответственно, пытаются искать необходимые им компоненты (вроде библиотек, шрифтов и прочего) по различным путям. Чтобы предусмотреть это, такие компоненты и дублируются в виде ссылок везде, где в этом может возникнуть необходимость.

Впрочем, даже если желание стереть эти ссылки будет непреодолимым, выполнить его в режиме обычного пользователя не удастся без дополнительных манипуляций. А некоторые каталоги (например, /root) не удается даже просмотреть. Потому что все файлы в Linux (а все, что есть в Linux, как говорилось, — это файлы) имеют еще одно непременное свойство (также зафиксированное в inode) — права доступа.

Именно понятие прав доступа вызывает наибольшие психологические сложности у Windows-мигранта. Обычный случай — только что самолично созданный или скопированный файл не удается открыть, удалить или переместить, — способен довести до тихого бешенства. Если не догадаться посмотреть в свойства файла или каталога и с удивлением узнать, что вы не имеете в отношении него соответствующих прав.

А права эти умеют быть двух родов — права принадлежности и права действия. Первые определяются для владельца файла (owner), группы пользователей (group) и всех прочих (other). В отношении же действия существуют права на чтение (read), изменение (или запись, write) и исполнение (execute).

Владелец файла — это пользователь, создавший его или скопировавший. По умолчанию он обычно (хотя и не всегда) получает на него все права. Которые подразумевают возможность просмотреть его, модернизировать и записать изменения, а также исполнить. Исполнение для одиночного файла — это возможность запуска бинарной программы или скрипта, для каталога — возможность перейти в этот каталог и просмотреть содержимое. Единственное, чего не может владелец — изменить права принадлежности, то есть сделать владельцем своих файлов дядю Петю: это привилегия исключительно администратора.

Группа обычно определяется как пользователи, работающие над общим проектом; однако в условиях автономной домашней машины это, скорее всего, ваша же скромная персона, но под другим аккаунтом (если вы послушались моего совета и создали одну учетную запись для серьезной работы, и другую — для нездоровых экспериментов). Группа обычно по умолчанию получает право чтения и исполнения, но не изменения файла или каталога.

Наконец, кто такие прочие — это ясно. Они обычно имеют право (и могут) прочитать файл, но не изменить или выполнить его.

На протяжении всего предыдущего повествования неоднократно упоминался всемогущий суперпользователь, именуемый в народе root (не путать с каталогом /root, который есть просто его домашний каталог), root-оператор, администратор и тому подобными титулами, подчеркивающими его величие и могущество. Настало время рассказать подробнее, кто это такой.

Суперпользователь — это администратор системы, ответственный за ее настройку и поддержание работоспособности. То есть, скорее всего, это опять же ваша скромная персона. Однако в этой ипостаси ваши права коренным образом отличаются от ваших прав в ранге пользователя. В частности, как root вы имеете все права действия для всех файлов системы, в том числе и право, например, запретить самому себе как пользователю читать собственные файлы (своя рука — владыка). Поскольку в этом качестве вы можете сменить не только права действия, но и права принадлежности: назначить владельцем ваших пользовательских файлов не только дядю Петю из соседнего двора, но и самого же себя как суперпользователя, запретив их чтение всем, кроме владельца...

Впрочем, вы всегда в состоянии поменять ситуацию на обратную. Для этого не нужно даже завершать свой пользовательский сеанс и начинать новый, от лица суперпользователя. Достаточно в консоли или окне терминала набрать в командной строке команду su (аббревиатура понятна? — это тот же superuser) и ввести пароль администратора: на некое время вы выступите в его качестве. Ну а после завершения всех потребных действий не забудьте вернуться в обычный пользовательский режим командой exit.

Так что если вам вдруг захотелось послушать музыку, запустив собственноручно сделанный файл mpeg, а в ответ вы получаете сообщение, что права такого не имеете (permission denied) — не нужно поминать родных создателей Linux, а следует внимательно просмотреть каталог /dev на предмет прав доступа к аудиоустройствам, владельцем которых является суперпользователь: возможно, прочие просто не имеют прав исполнения для соответствующих файлов. Выполните целительное действо, описанное в предыдущем абзаце — и наслаждайтесь музыкой в свое удовольствие.

Надеюсь, что с правами доступа к вновь созданным файлам все более или менее ясно. Несколько сложнее — с правами на файлы скопированные. Обычно вы являетесь владельцем всех файлов, расположенных в вашем домашнем каталоге по адресу /поте/ваше_имя, сокращенно обозначаемому в оболочке bash как $НОМЕ. И, соответственно, располагаете в отношении их всеми правами. Но бывают и исключения.

Например, вы могли скопировать некие файлы в каталог $НОМЕ в то время, когда по каким-либо причинам исполняли роль суперпользователя. В этом случае последний автоматически будет назначен их владельцем, со всеми вытекающими последствиями (лишняя причина никогда не проводить от его лица никаких обычных действий).

Во-вторых, ваши права ущемляются при копировании файлов с компакт-диска. В DOS/Windows, как вы помните, такие файлы автоматически получают атрибут "read only". В Linux же на них по умолчанию устанавливается запрет на запись для всех, включая и владельца.

Еще забавнее, если с помощью файлового менеджера с CD ROM копируются целые каталоги и подкаталоги. В этом случае родительский каталог копируется на винчестер, но — без всякого содержимого (правда, с соответствующим предупреждением о невозможности доступа). Поскольку для него автоматически устанавливается запрет на запись. Правда, это свойственно не всем файловым менеджерам, но — многим.

Наконец, при копировании с носителя файловой системы FAT (дискового раздела, сменного винчестера, дискеты или Zip) наследуются атрибуты исходных файлов: если последние были помечены как "read only", целевые файлы будут автоматически закрыты для записи, в том числе и для их нового владельца.

Так что права доступа — вещь в Linux наипервейшая. Хотя, повторяю, ничего особенно хитрого здесь нет — нужно просто быть внимательным.

Теперь, получив начальные представления о файловой системе Linux, можно обратиться к изучению средств манипулирования ею, то есть к файловым менеджерам.

 


NetZona.al.ru Идея, программирование и дизайн: Vasilij E-mail: webmaster20@rambler.ru