Назад | Вернуться к оглавлению | Дальше |
Эту книгу можно купить в Интернет-магазине Bolero |
4. Знакомство с файловой системой Linux (продолжение) |
В основе механизмов разграничения доступа лежат имена пользователей и имена групп пользователей. Вы уже знаете, что в Линукс каждый пользователь имеет уникальное имя, под которым он логируется в системе. Кроме того, в системе создается некоторое число групп пользователей, причем каждый пользователь может быть включен в одну или несколько групп. Создает и удаляет группы суперпользователь, он же может изменять состав участников той или иной группы. Члены разных групп могут иметь разные права по доступу к файлам, например, группа администраторов может иметь больше прав, чем группа программистов.
В индексном дескрипторе каждого файла записаны имя так называемого владельца файла и группы, которая имеет права на этот файл. Первоначально, при создании файла его владельцем объявляется тот пользователь, который этот файл создал. Точнее - тот пользователь, от чьего имени запущен процесс, создающий файл. Группа тоже назначается при создании файла - по идентификатору группы процесса, создающего файл. Владельца и группу файла можно поменять в ходе дальнейшей работы с помощью команд chown и chgrp (подробнее о них будет сказано чуть позже).
Теперь давайте еще раз выполним команду ls -l. Но зададим ей в качестве дополнительного параметра имя конкретного файла, например, файла, задающего саму команду ls. (Обратите, кстати, внимание на эту возможность команды ls -l - получить информацию о конкретном файле, а не о всех файлах каталога сразу).
[kos@kos kos]$ ls -l /bin/ls -rwxr-xr-x 1 root root 49940 Sep 12 1999 /bin/ls
Вы видите, что в данном случае владельцем файла является пользователь root и группа root. Но нас сейчас в выводе этой команды больше интересует первое поле, определяющее тип файла и права доступа к файлу. Это поле в приведенном примере представлено цепочкой символов -rwxr-xr-x. Эти символы можно условно разделить на 4 группы.
Первая группа, состоящая из единственного символа, определяет тип файла. Этот
символ в соответствии с возможными типами файлов, рассмотренными в предыдущем
подразделе, может принимать такие значения:
- = обычный файл,
d = каталог,
b = файл блочного устройства,
c =
файл символьного устройства,
s = доменное гнездо (socket),
p = именованный канал (pipe),
l = символическая ссылка
(link).
Далее следуют три группы по три символа, которые и определяют права доступа к файлу соответственно для владельца файла, для группы пользователей, которая сопоставлена данному файлу, и для всех остальных пользователей системы. В нашем примере права доступа для владельца определены как rwx, что означает, что владелец (root) имеет право читать файл (r), производить запись в этот файл (w), и запускать файл на выполнение (x). Замена любого из этих символов прочерком будет означать, что пользователь лишается соответствующего права. В том же примере мы видим, что все остальные пользователи (включая и тех, которые вошли в группу root) лишены права записи в этот файл, то есть не могут файл редактировать и вообще как-то изменять.
Вообще говоря, права доступа и информация о типе файла в UNIX-системах хранятся в индексных дескрипторах в отдельной структуре, состоящей из двух байтов, то есть из 16 бит (это естественно, ведь компьютер оперирует битами, а не символами r,w,x). Четыре бита из этих 16-ти отведены для кодированной записи о типе файла. Следующие три бита задают особые свойства исполняемых файлов, о которых мы скажем чуть позже. И, наконец, оставшиеся 9 бит определяют права доступа к файлу. Эти 9 бит разделяются на 3 группы по три бита. Первые три бита задают права пользователя, следующие три бита - права группы, последние 3 бита определяют права всех остальных пользователей (то есть всех пользователей, за исключением владельца файла и группы файла). При этом, если соответствующий бит имеет значение 1, то право предоставляется, а если он равен 0, то право не предоставляется. В символьной форме записи прав единица заменяется соответствующим символом (r, w или x), а 0 представляется прочерком.
Право на чтение (r) файла означает, что пользователь может просматривать содержимое файла с помощью различных команд просмотра, например, командой more или с помощью любого текстового редактора. Но, подредактировав содержимое файла в текстовом редакторе, Вы не сможете сохранить изменения в файле на диске, если не имеете права на запись (w) в этот файл. Право на выполнение (x) означает, что вы можете загрузить файл в память и попытаться запустить его на выполнение как исполняемую программу. Конечно, если в действительности файл не является программой (или скриптом shell), то запустить этот файл на выполнение не удастся, но, с другой стороны, даже если файл действительно является программой, но право на выполнение для него не установлено, то он тоже не запустится.
Вот мы и узнали какие файлы в Линукс являются исполняемыми! Как видите, расширение имени файла тут не при чем, все определяется установкой атрибута "исполняемый", причем право на исполнение может быть предоставлено не всем!
Если выполнить ту же команду ls -l, но в качестве последнего аргумента ей указать не имя файла, а имя каталога, мы увидим, что для каталогов тоже определены права доступа, причем они задаются теми же самыми символами rwx. Например, выполнив команду ls -l /, мы увидим, что каталогу bin соответствует строка:
drwxr-xr-x 2 root root 2048 Jun 21 21:11 binЕстественно, что по отношению к каталогам трактовка понятий "право на чтение", "право на запись" и "право на выполнение" несколько изменяется. Право на чтение по отношению к каталогам легко понять, если вспомнить, что каталог - это просто файл, содержащий список файлов в данном каталоге. Следовательно, если Вы имеете право на чтение каталога, то Вы можете просматривать его содержимое (этот самый список файлов в каталоге). Право на запись тоже понятно - имея такое право Вы сможете создавать и удалять файлы в этом каталоге, то есть просто добавлять в каталог или удалять из него запись, содержащую имя какого-то файла и соответствующие ссылки. Право на выполнение интуитивно менее понятно. Оно в данном случае означает право переходить в этот каталог. Если Вы, как владелец, хотите дать доступ другим пользователям на просмотр какого-то файла в своем каталоге, Вы должны дать им право доступа в каталог, то есть дать им "право на выполнение каталога". Более того, надо дать пользователю право на выполнение для всех каталогов, стоящих в дереве выше данного каталога. Поэтому в принципе для всех каталогов по умолчанию устанавливается право на выполнение как для владельца, так и для группы, и для всех остальных пользователей. И, уж если Вы хотите закрыть доступ в каталог, то лишите всех пользователей (включая группу) права входить в этот каталог. Только не лишайте и себя такого права, а то придется обращаться к суперпользователю!
После прочтения предыдущего абзаца может показаться, что право на чтение каталога не дает ничего нового по сравнению с правом на выполнение. Однако разница в этих правах все же есть. Если задать только право на выполнение, Вы сможете войти в каталог, но не увидите там ни одного файла (этот эффект особенно наглядно проявляется в том случае, если Вы пользуетесь каким-то файловым менеджером, например, Midnight Commander-ом). Если Вы имеете право доступа в каком-то из подкаталогов этого каталога, то Вы можете перейти в него (командой cd), но, как говорится "втемную", по памяти, потому что списка файлов и подкаталогов текущего каталога Вы не увидите.
Алгоритм проверки прав пользователя при обращении к файлу можно описать следующим образом. Система вначале проверяет, совпадает ли имя пользователя с именем владельца файла. Если эти имена совпадают (то есть владелец обращается к своему файлу), то проверяется, имеет ли владелец соответствующее право доступа: на чтение, на запись или на выполнение (не удивляйтесь, суперпользователь может лишить некоторых прав и владельца файла). Если право такое есть, то соответствующая операция разрешается. Если же нужного права владелец не имеет, то проверка прав, предоставляемых через группу или через группу атрибутов доступа для остальных пользователей, уже даже не проверяются, а пользователю выдается сообщение о невозможности выполнения затребованного действия (обычно что-то вроде "Permission denied").
Если имя пользователя, обращающегося к файлу, не совпадает с именем владельца, то система проверяет, принадлежит ли он к группе файла. Если принадлежит, то для определения возможности доступа к файлу используются атрибуты, относящиеся к группе, а на атрибуты для владельца и всех остальных пользователей внимания не обращается. Если же пользователь не входит и в группу, то его права определяются атрибутами для остальных пользователей. Таким образом, третья группа атрибутов, определяющих права доступа к файлу, относится ко всем пользователям, кроме владельца файла и пользователей, входящих в группу файла.
Для изменения прав доступа к файлу используется команда chmod. Ее можно использовать в двух вариантах. В первом варианте Вы должны явно указать кому какое право даете или кого этого права лишаете:
$ chmod wXp имя-файлагде вместо символа w подставляется
[kos]$ chmod a+x file_nameпредоставляет всем пользователям системы право на выполнение данного файла.
[kos]$ chmod go-rw file_nameудаляет право на чтение и запись для всех, кроме владельца файла.
[kos]$ chmod ugo+rwx file_nameдает всем права на чтение, запись и выполнение. Если опустить указание на то, кому предоставляется данное право, то подразумевается, что речь идет вообще обо всех пользователях, то есть вместо
[kos]$ chmod a+x file_nameможно записать просто
[kos]$ chmod +x file_name
Второй вариант задания команды chmod основан на цифровом представлении прав. Для этого мы кодируем символ r цифрой 4, символ w - цифрой 2, а символ x - цифрой 1. Для того, чтобы предоставить пользователям какой-то набор прав, надо сложить соответствующие цифры. Получив таким образом нужные цифровые значения для владельца файла, для группы файла и для всех остальных пользователей, задаем эти три цифры в качестве аргумента команды chmod (ставим эти цифры после имени команды перед вторым аргументом, который задает имя файла). Например, если надо дать все права владельцу (4+2+1=7), право на чтение и запись - группе (4+2=6), и не давать никаких прав остальным, то следует дать такую команду:
[kos]$ chmod 760 file_nameЕсли Вы знакомы с двоичным кодированием восьмеричных цифр, то Вы поймете, что цифры после имени команды в этой форме ее представления есть не что иное, как восьмеричная запись тех самых 9 бит, которые задают права для владельца файла, группы файла и для всех пользователей.
Выполнять смену прав доступа к файлу с помощью команды chmod может только сам владелец файла или суперпользователь. Для того, чтобы иметь право сменить группу, владелец должен дополнительно быть членом той группы, которой он хочет дать права на данный файл.
Чтобы завершить рассказ о правах доступа к файлам, надо рассказать еще о двух возможных атрибутах файла, устанавливаемых с помощью той же команды chmod. Это те самые атрибуты для исполняемых файлов, которые в индексном дескрипторе файла в двухбайтовой структуре, определяющей права на файл, занимают позиции 5-7, сразу после кода типа файла.
Первый из этих атрибутов - так называемый "бит смены идентификатора пользователя". Смысл этого бита состоит в следующем. Обычно, когда пользователь запускает некоторую программу на выполнение, эта программа получает те же права доступа к файлам и каталогам, которые имеет пользователь, запустивший программу. Если же установлен "бит смены идентификатора пользователя", то программа получит права доступа к файлам и каталогам, которые имеет владелец файла программы (таким образом, рассматриваемый атрибут лучше называть "битом смены идентификатора владельца"). Это позволяет решать некоторые задачи, которые иначе было бы трудно выполнить. Самый характерный пример - команда смены пароля passwd. Все пароли пользователей хранятся в файле /etc/passwd, владельцем которого является суперпользователь root. Поэтому программы, запущенные обычными пользователями, в том числе команда passwd, не могут производить запись в этот файл. А, значит, пользователь как бы не может менять свой собственный пароль. Но для файла /usr/bin/passwd установлен "бит смены идентификатора владельца", каковым является пользователь root. Следовательно, программа смены пароля passwd запускается с правами root-а и получает право записи в файл /etc/passwd (уже средствами самой программы обеспечивается то, что пользователь может изменить только одну строку в этом файле).
Установить "бит смены идентификатора владельца" может суперпользователь с помощью команды
[root]# chmod +s file_name
Аналогичным образом работает "бит смены идентификатора группы".
Еще один возможный атрибут исполняемого файла - это "бит сохранения задачи" или "sticky bit" (дословно - "бит прилипчивости"). Этот бит указывает системе, что после завершения программы надо сохранить ее в оперативной памяти. Удобно включить этот бит для задач, которые часто вызываются на выполнение, так как в этом случае экономится время на загрузку программы при каждом новом запуске. Этот атрибут был необходим на старых моделях компьютеров. На современных быстродействующих системах он используется редко.
Если используется цифровой вариант задания атрибутов в команде chmod, то цифровое значение этих атрибутов должно предшествовать цифрам, задающим права пользователя:
[root]# chmod 4775 file_nameПри этом веса этих битов для получения нужного суммарного результата задаются следующим образом:
Если какие-то из этих трех битов установлены в 1, то несколько изменяется вывод команды ls -l в части отображения установленных атрибутов прав доступа. Если установлен в 1 "бит смены идентификатора пользователя", то символ "x" в группе, определяющей права владельца файла, заменяется символом "s". Причем, если владелец имеет право на выполнение файла, то символ "x" заменяется на маленькое "s", а если владелец не имеет права на выполнение файла (например, файл вообще не исполняемый), то вместо "x" ставится "S". Аналогичные замены имеют место при задании "бита смены идентификатора группы", но заменяется символ "x" в группе атрибутов, задающих права группы. Если равен 1 "бит сохранения задачи (sticky bit)", то заменяется символ "x" в группе атрибутов, определяющей прав для всех остальных пользователей, причем "x" заменяется символом "t", если все пользователи могут запускать файл на выполнение, и символом "T", если они такого права не имеют.
Таким образом, хотя в выводе команды ls -l не предусмотрено отдельных позиций для отображения значений битов смены идентификаторов и бита сохранения задачи, соответствующая информация выводится. Вот небольшой пример того, как это будет выглядеть:
[root]# ls -l prim1 -rwSrwsrwT 1 kos root 12 Dec 18 23:17 prim1
[root]# chown vasja имя-файла [root]# chgrp users имя-файла
[kos]$ mkdir /home/kos/book/glava5/part1Команда mkdir может использоваться со следующими опциями:
[kos]$ cat file1 > file2Собственно, первоначальное предназначение команды cat как раз и предполагало перенаправление вывода, так как эта команда создана для конкатенации, то есть объединении нескольких файлов в один:
[kos]$ cat file1 file2 ... fileN > new-fileИменно возможности перенаправления ввода и вывода этой команды и используются для создания новых файлов. Для этого на вход команды cat направляют данные со стандартного ввода (то есть с клавиатуры), а вывод команды - в новый файл:
[kos]$ cat > newfileПосле того, как Вы напечатаете все, что хотите, нажмите комбинацию клавиш [Ctrl-d] или [Ctrl-C] и все, что Вы ввели, будет записано в newfile. Конечно, таким образом создаются, в основном, короткие текстовые файлы.
Если в качестве целевого указывается существующий файл, то его содержимое будет затерто, поэтому при копировании надо соблюдать осторожность. Впрочем, можно использовать команду cp с опцией -i, тогда перед перезаписью существующего файла будет запрашиваться подтверждение (очень рекомендую Вам всегда использовать эту опцию!).
У команды cp имеется еще несколько полезных опций:
-p | Сохраняет время модификации файла и максимально возможные полномочия. Без этой опции для нового файла задаются полномочия, соответствующие полномочиям запустившего команду пользователя. |
-R или -r | Если source - каталог, то копируется как он, так и все входящие в него подкаталоги, то есть сохраняется исходная форма дерева каталогов. |
-d | Если задать эту опцию, то символические ссылки будут оставаться ссылками (а иначе вместо ссылки копируется файл, на который дается ссылка), |
-f | Перезаписывать файлы при копировании (если такие уже есть) без дополнительных предупреждений. |
Команда mv может использоваться не только для перемещения, но и для переименования файлов и каталогов (то есть перемещения их внутри одного каталога). Для этого надо просто задать в качестве аргументов старое и новое имя файла:
[kos]$ mv oldname newnameНо учтите, что команда mv не позволяет переименовать сразу несколько файлов (используя шаблон имени), так что команда
При использовании команды mv, также как и при использовании cp, не забывайте применять опцию -i для того, чтобы получить предупреждение, когда файл будет перезаписываться.
Если Вы попытаетесь использовать команду rm (без всяких опций) для удаления каталога, то будет выдано сообщение, что это каталог, и удаления не произойдет. Для удаления каталога надо удалить в нем все файлы, после чего удалить сам каталог с помощью команды rmdir. Однако можно удалить и непустой каталог со всеми входящими в него подкаталогами и файлами, если использовать команду rm с опцией -r.
Если Вы дадите команду rm *, то удалите все файлы в текущем каталоге. Подкаталоги при этом не удалятся. Для удаления как файлов, так и подкаталогов текущего каталога надо тоже воспользоваться опцией -r. Однако всегда помните, что в Линукс нет команды восстановления файлов после их удаления (даже если Вы спохватились сразу же после ошибочного удаления файла или каталога)! Так что дважды подумайте до удаления чего-либо и не пренебрегайте опцией -i.
Команда-фильтр more выводит содержимое файла на экран отдельными страницами, размером как раз в целый экран. Для того, чтобы увидеть следующую страницу, надо нажать на клавишу пробела. Нажатие на клавишу [Enter] приводит к смещению на одну строку. Кроме клавиш пробела и [Enter] в режиме паузы еще некоторые клавиши действуют как управляющие (например, клавиша [b] возвращает Вас на один экран назад), но мы здесь не будем приводить полного их перечня, как и перечня опций команды. Вам для начала надо еще только запомнить, что выйти из режима просмотра можно с помощью клавиши [q] (или [Q]), так как если Вы этого не знаете, то Вам придется долго и нудно нажимать пробел, пока Вы не доберетесь до конца длинного файла. Обо всех опциях команды more Вы можете прочитать в интерактивном руководстве man или info.
Утилита less, разработанная в рамках проекта GNU, содержит все функции и команды управления выводом, имеющиеся в программе more, и некоторые дополнительные, например, позволяет использовать клавиши управления курсором ("стрелки" вверх и вниз, а также клавиши PgUp и PgDown) для перемещения по тексту.
Команды more и less позволяют производить поиск подстроки в просматриваемом файле, причем команда less позволяет производить поиск как в прямом, так и в обратном направлении. Для организации поиска строки символов string надо набрать в командной строке программы в нижней части экрана (там, где двоеточие) /string. Если искомая строка будет найдена, будет отображен соответствующий кусок текста, причем найденная строка будет находиться в самом верху экрана.
Общий синтаксис команды find имеет следующий вид:
[kos]$ find /home/kos/doc /usr/doc /usr/locale/doc -name instr.txtНачалом "критерия_поиска", определяющего, что именно должна искать программа find, считается первый аргумент, начинающийся на "-", "(", ")"', "," или "!". Все аргументы, предшествующие "критерию_поиска", трактуются как имена каталогов, в которых надо производить поиск. Если не указано ни одного пути, поиск производится только в текущем каталоге и его подкаталогах.
Чаще всего поиск проводится по именам файлов, как это показано в предыдущем примере, то есть "критерий_поиска" задается как "-name имя_файла". Вместо опции -name можно использовать опцию -path, тогда команда будет искать совпадения в полном имени файла, с указанием пути. Например, команда
[kos]$ find . -path './sr*sc'найдет в текущем каталоге подкаталог './src/misc'. Вместо полного имени файла или каталога в этом примере использован так называемый "шаблон имени". Поскольку шаблоны имен файлов могут использоваться не только с командой find, но и со многими другими командами (включая уже рассмотренные команды chmod, chown, chgrp, cp, rm, cat, mv), то правилам составления шаблонов стоит уделить некоторое внимание.
Чаще всего шаблоны имен файлов строятся с помощью специальных символов
"*" и "?". Значок "*" используется для замены произвольной
строки символов. В Linux
"*" соответствует всем файлам, за
исключением скрытых;
".*" соответствует всем скрытым файлам (но также
текущему каталогу "." и каталогу уровнем выше "..": не забывайте
об этом!);
"*.*" соответствует только тем файлам и каталогам, которые
имеют "." в середине имени, или оканчиваются на точку;
"p*r"
соответствует и "peter" и "piper";
"*c*" соответствует и "picked" и
"peck".
Значок ? заменяет один произвольный символ, поэтому index?.htm будет соответствовать именам index0.htm, index5.htm и indexa.htm.
Кроме "*" и "?" в Linux при задании шаблонов имен можно использовать квадратные скобки [], в которых дается либо список возможных символов, либо интервал, в который должны попадать возможные символы. Например, [abc]* соответствует всем именам файлов, начинающимся с a, b, c; *[I-N1-3] соответствует файлам, оканчивающимся на I, J, K, L, M, N, 1, 2, 3.
А теперь вернемся к команде find и расскажем подробнее о том, какие критерии поиска возможны. Несколько примеров простых критериев поиска перечислены в следующей таблице:
-name шаблон | Ищет файлы, имена которых соответствуют шаблону. |
-group имя | Ищет файлы, принадлежащие указанной группе. |
-size число[c] | Ищет файлы, размером в число 512-байтных блоков. Если после числа стоит символ c, значит размер указан в байтах (символах). |
-mtime число | Ищет файлы, которые в последний раз изменялись число дней назад. |
-newer образец | Ищет файлы, которые изменялись после изменения файла, указанного в образце. |
-type тип_файла | Ищет файлы указанного типа. Тип задается символом b (блок-ориентированные устройства), c (байт-ориентированные устройства), d (файл каталога), f (обычный файл), p (именованный канал) либо l (символическая ссылка). |
Другие простые критерии Вы можете узнать, если просмотрите man-страницу о команде find. Здесь же надо только сказать, что из простых критериев можно строить более сложные с помощью логических операций and, or или операции отрицания, знаком которой служит восклицательный знак. Например, если Вы хотите найти все файлы, имена которых оканчиваются на .txt и .doc, то критерий можно записать как ( -name *.txt -or -name *.doc ). Можно комбинировать таким образом любое число критериев (и не только простых!). Если операция не указана явно, то подразумевается -and, то есть вместо ( -name *.txt -and -name *.doc ) можно записать просто ( -name *.txt -name *.doc ). Если применяется только одна операция -and или !, то скобки обычно можно опустить, а с операцией -or и в сложных выражениях скобки необходимы. Перед скобкой нужно поставить обратную косую черту, а после скобки - пробел. Например, если Вы хотите найти каталог по его имени, то можно сделать это командой
[kos]$ find /home/kos -name doc -type dили (с соблюдением правил построения сложных критериев)
[kos]$ find /home/kos \( -name doc -and -type d \)В следующем примере мы ищем файлы по следующему критерию: либо имя файла оканчивается на *.tmp, либо размер файла больше 100 Кбайт.
[kos]$ find /home/kos \( \( -name *.tmp \) -or \( -size +200 \) \)В последнем примере стоит обратить внимание на то, что перед значением размера стоит знак +. Такой знак можно использовать с любым числовым параметром в критериях поиска команды find. Он означает, что нужно искать файлы, у которых значение параметра больше заданного. Соответственно, знак - означает, что надо искать файлы, у которых значение параметра меньше заданного. Если знак + или - отсутствует, ищутся файлы, у которых значение параметра равно заданному.
Чтобы закончить рассмотрение команды find, надо сказать еще о том, что после критерия поиска в этой команде можно сразу же задать операцию, которая будет применяться ко всем файлам, найденным по указанному критерию. Простейшим примером такой операции является команда -print.
[kos]$ find /home/kos -name *.tmp -printпо которой выдаются на экран список имен всех найденных файлов с указанием полного пути к файлу. Эта операция применяется по умолчанию, то есть когда никаких операций вообще не указано (как это было во всех приведенных выше примерах). Другим примером операции, применяемой ко всем найденным файлам, может служить операция -exec cmd {} \;, где cmd - произвольная команда оболочки shell. То есть в этом случае ко всем найденным файлам (их именами заменяются поочередно фигурные скобки) применяется команда cmd. За cmd {} в этом случае должна следовать точка с запятой, экранированная обратной косой чертой. Например, если Вы хотите удалить в текущем каталоге все файлы, к которым пользователи не обращались в течение 30 дней, дайте команду:
[root]# find . -type f -atime +30 -exec rm {} \;Вместо -exec можно поставить -ok, тогда перед выполнением указанной команды cmd применительно к каждому файлу будет запрашиваться подтверждение.
В общем, команда find является очень мощным, полезным и чрезвычайно адаптируемым инструментом поиска в файловой системе. Все ее возможности здесь не перечислены, изучайте соответствующую man-страницу. И будьте очень осторожны с применением таких возможностей команды, как вызов других команд, применяемых ко всем найденным файлам. Помните, что изменения часто необратимы!
Можно еще в виде предисловия отметить, что обычно жесткий диск предварительно разбивается на разделы (особенно современные диски, имеющие емкость, исчисляемую десятками гигабайт). Создание разделов облегчает выполнение резервного копирования, решение задач разграничения полномочий, повышает производительность и ограничивает потенциальный ущерб, наносимый вышедшими из-под контроля программами. Поэтому в дальнейшем будем говорить о создании файловой структуры в одном разделе (диск, не имеющий разделов, можно тоже рассматривать как один раздел).
Еще один момент, существенный в контексте этого раздела, связан с тем, что Линукс может работать с разными типами файловых систем. "Родной" файловой системой для него в настоящее время является "вторая расширенная файловая система" (second extended filesystem) ext2fs. Ho в Линукс можно работать и с 16-разрядной файловой системой FAT, создаваемой в MS-DOS, и с 32-разрядной FAT, разработанной для MS Windows 95, и с файловой системой ISO9660 , используемой для записи информации на CD-ROM, и с другими типами файловых систем. То есть, при рассмотрении вопросов создания и монтирования файловых систем надо постоянно помнить о том, что типы файловых систем на разных носителях могут различаться.
Итак, вначале рассмотрим случай, когда требуется создать в каком-то разделе диска файловую систему. Пока что будем предполагать, что создается файловая система типа ext2fs (рассмотрение вопроса о создании файловых систем других типов отложим до раздела 21). Создание файловой системы типа ext2fs подразумевает создание в данном разделе на диске суперблока, таблицы индексных дескрипторов и совокупности блоков данных. Делается все это все с помощью команды mkfs. В простейшем случае достаточно дать эту команду в следующем формате:
[root]# mkfs -t ext2 /dev/hda5
[root]# mkfs -t ext2 /dev/fd0Можно сказать, что мы "отформатировали дискету", но учтите, что в DOS или Windows такие дискеты не читаются.
После выполнения команды mkfs в указанном разделе будет создана файловая система ext2fs (еще раз повторю, что подробнее о том, что скрывается за этими словами, Вы узнаете в разделе 21). В новой файловой системе автоматически создается один каталог с именем lost+found. Он используется программой fsck в экстренных случаях, поэтому не удаляйте его. Для того, чтобы начать работать с новой файловой системой (например, переписать какие-то файлы на новый носитель), необходимо подключить ее в общее дерево каталогов, что делается с помощью команды mount.
В качестве параметров команде mount надо, как минимум, указать устройство и "точку монтирования". Точкой монтирования называется тот каталог в уже существующем и известном системе дереве каталогов, который будет теперь служить корневым каталогом для подключаемой файловой системы. Пример: команда
[root]# mount /dev/hdb1 /mnt/disk2подсоединяет файловую систему первого раздела на втором жестком диске к каталогу /mnt/disk2 (этот каталог должен существовать!).
Отметим, что после монтирования файловой системы в каталог /mnt/disk2 прежнее содержимое этого каталога станет для Вас недоступно (так же, как информация о прежнем владельце и правах доступа к этому каталогу) до тех пор, пока Вы не размонтируете вновь подключенную файловую систему (это содержимое не уничтожается, а просто становится временно недоступным). Поэтому в качестве точек монтирования лучше использовать пустые каталоги (заранее заготовленные).
В той простейшей форме, которую мы использовали в приведенном выше примере, команда mount будет работать только при условии, что все недостающие ей для выполнения параметры она найдет в файле /etc/fstab. Если же такого файла не существует или он не содержит необходимых данных, надо применять полную форму команды mount:
mount -t type device pathгде type задает тип файловой системы, device указывает, на каком устройстве (в каком разделе) она находится, а path задает точку монтирования.
Конфигурационный файл /etc/fstab используется в основном для того, чтобы обеспечить автоматическое монтирование файловых систем в процессе загрузки. Каждая строка этого файла содержит описание одной файловой системы и состоит из 6 полей, разделяемых пробелами (для удобочитаемости поля обычно выравнивают, но делать это не обязательно):
[root]# mount -a -t nomsdos,extмонтирует все файловые системы, за исключением тех, которые относятся к типам msdos и ext.
Когда монтируется файловая система, упомянутая в файле /etc/fstab, то в команде монтирования достаточно указать только один аргумент - либо имя устройства, либо точку монтирования. Все остальные параметры команда mount возьмет из файла /etc/fstab.
Обычно монтировать файловые системы может только суперпользователь, но если в поле опций монтирования указать опцию user, то соответствующую файловую систему смогут смонтировать все пользователи. Так, если в /etc/fstab имеется строка
/dev/cdrom /cd iso9660 ro,user,noauto,unhideто любой пользователь сможет смонтировать файловую систему на своем CDROM, используя команду
mount /dev/cdromили
mount /cdВ следующей таблице приведены еще некоторые опции, которые могут использоваться в команде mount и в файле /etc/fstab:
Команды mount и umount (см. ниже) поддерживают в актуальном состоянии таблицу (или перечень) смонтированных файловых систем. Этот перечень сохраняется на диске в виде файла /etc/mtab. Этот файл можно просмотреть непосредственно или вывести на экран командой mount без аргументов.
Если Вы хотите монтировать какую-то систему только для чтения из нее, то в соответствующей строке файла /etc/fstab надо указать опцию r (read only, по умолчанию подразумевается w, то есть и чтение, и запись), либо использовать команду mount с параметром -r.
Перед тем как отключить от компьютера носитель, на котором расположена файловая система, (чаще всего это требуется делать с дискетами в дисководе, но иногда и с носителями других типов), необходимо "размонтировать" файловую систему (другими словами, "размонтировать носитель"). Эта операция выполняется с помощью команды umount (замечание для тех, кто знает английский язык: имя команды не является правильным английским словом, так что не вставляйте в него лишнюю букву "n"!). В качестве аргумента команде umount надо дать либо имя устройства, либо точку монтирования.
Демонтировать файловую систему может только тот пользователь, который ее смонтировал (и суперпользователь, конечно). Для того, чтобы операцию демонтирования мог выполнить любой пользователь, в поле параметров соответствующей строки файла /etc/fstab надо указать опцию users (вместо user).
Демонтирование файловой системы возможно только тогда, когда в ней нет открытых файлов (в частности, не должно быть запущено программ, файлы которых расположены в данной системе) и в системе нет процессов, использующих эту файловую систему (т.е. демонтируемая файловая система не должна быть занятой).
Надо признать, что, в сравнении с DOS или Windows, работа с дискетами и другими сменными носителями (CD-ROM, Iomega Zip и т.п.) в ОС типа UNIX менее удобна. Для того, чтобы обратиться к дискете, Вы должны вначале смонтировать ее в какой-то каталог в файловой структуре. А для смены дискеты требуется вначале размонтировать предыдущую дискету, а затем смонтировать новую. То же самое с другими сменными носителями. Поскольку с дискетами и другими сменными носителями так или иначе приходиться работать, лучше сразу заготовить в файловой структуре стандартные каталоги для монтирования всех имеющихся в Вашем распоряжении типов сменных носителей. Например, создать каталог /mnt, а в нем подкаталоги floppy, cdrom, zip и т.д.
Пожалуй, это все, что нужно знать начинающему пользователю системы Линукс о файловых системах. В который уже раз повторю, что здесь была рассмотрена только одна сторона файловых систем, обращенная к пользователям, то есть в основном, логика построения структуры каталогов и файлов. Обратная сторона файловой системы, ее внутреннее устройство, а также различные типы файловых систем, в настоящем разделе только упоминались по мере необходимости. Всем этим вопросам будет посвящен раздел 21 "Обратная сторона файловой системы".
Назад | Вернуться к оглавлению | Дальше |
В.А.Костромин Последние изменения в содержание файла внесены 23 декабря 2000 г. |