Новости :

Так ли страшен черт, как его малюют, или UNIX для веб-мастера

Так ли страшен черт, как его малюют, или UNIX для веб-мастера

Эту заметку я хочу начать со смелого утверждения: каждый, кто хоть каким-то боком связан с разработкой веб-сайтов, должен знать хотя бы основы UNIX. Не подумайте, что я фанатик, выступающий с кличем "Вынь - маст дай!" и призывающий всех установить "Линукс" в качестве рабочей системы, как раз наоборот: я твердо уверен, что ничего более удобного для пользователя, чем Windows, пока что не придумали.

Но дело в том, что всевозможные клоны UNIX - это операционные системы, созданные профессионалами и, что значительно более важно, для профессионалов. Но ведь и разработка сайтов - тоже занятие для профессионалов! А если добавить к этому тот факт, что на абсолютном большинстве серверов установлен именно UNIX, то без умения совершать в нем хотя бы базовые операции становится сложно... Не убедил? Давайте посмотрим примеры...

Захотелось вам, например, подправить скрипт у себя на сайте. Вы его подредактировали в Windows и по FTP выложили на сервер, правильно? Но пока вы его выкладывали, сервер выдавал ошибку вашим посетителям... А если вдруг свет выключили в тот момент, когда скрипт закачивался? Вероятность, конечно, мала, но я, например, один раз так "попал"... Или другой пример: хотите вы быстро посмотреть, сколько было заходов на какую-то страницу вашего сайта. Проще всего, разумеется, заглянуть в лог-файл "Апача". А как? Скачать его все по тому же FTP? А если этот лог несколько весит несколько десятков мегабайт (что не редкость)? Не проще ли зайти на сервер и посмотреть прямо там?.. Да и мало ли что еще может потребоваться: "Апач" перезапустить, загрузку сервера посмотреть, таблицу базы подредактировать...

Сразу оговорюсь: я не собираюсь писать учебник по Юниксу, а только хочу рассказать о самых основных действиях, которые приходится выполнять практически любому веб-мастеру.

Подключение к серверу обычно происходит через протокол telnet (что плохо, потому что ваши пароли и команды передаются в открытом виде и любой установленный в сети сниффер их перехватит), либо через SSH (Secure SHell). Для подключения вам потребуется терминальная программа - мне больше всех нравится PuTTY. Теперь, когда к серверу вы подключились и увидели приглашение командной строки, надо понять, что делать дальше...

Небольшое вступление

Пользователи Windows и DOS привыкли, что адрес файла выглядит как c:\dir1\dir2\filename.ext В Юниксе немножко по другому: /dir1/dir2/filename.ext. То есть понятие диска отсутствует, все адреса начинаются с корня - /. Обратите внимание, что используется прямой слэш, а не обратный - это очень распространенная ошибка. Путь к файлу может быть абсолютный (от корня, как показано выше) или относительный (так же, как и в ДОСе). Две точки, как и в ДОСе, означают вышестоящую директорию, одна точка - текущую.

В UNIX используется прямой слэш, а не обратный

Самая главная команда в UNIX'е - это man (сокращение от MANual). Юникс очень хорошо и подробно документирован, и если вы забыли параметры какой-то команды, то, набрав "man команда", вы получите подробную справку по этой команде. Одно из свойств UNIX'а - практически каждая команда понимает различные уточняющие параметры, и параметров этих могут быть сотни! Так что man вам очень пригодится... Нажатие любой клавиши позволяет перейти на следующий экран справки, работают стрелки для прокрутки вверх и вниз, а если где-то в середине справки вы нашли то, что искали, то до конца проматывать не обязательно - для выхода достаточно нажать "q" на клавиатуре. Большинство команд также понимают параметр --help (два минуса и слово help без пробелов) и выдают краткую справку о своем назначении и параметрах.

Читайте доки - они рулез!
Одна из проблем, часто вызывающих панику у пользователей - это выход из программ (типичный способ выхода из vi у начинающих пользователей - это reset на локальной машине или закрытие консоли на удаленной). Пугаться не стоит - в абсолютном большинстве программ вас спасет нажатие клавиши "q" или сочетанием Ctrl-C. А для завершения сеанса работы воспользуйтесь командами exit, logout или quit - разные системы могут использовать разные команды.

Данные, выдаваемые одной командой, можно подавать на вход другой - для этого используется вертикальная черта. Например, "cat myscript.pl | more" выводит скрипт с разбивкой на страницы. Можно выводимые данные и в файл записать с помощью > (перезаписать файл) или >> (дописать в конец файла).

Еще надо учитывать, что большие и маленькие буквы в UNIX'e различаются. file.txt и File.txt - это два разных файла, которые вполне могут лежать в одной директории.

Файловые операции

Посмотреть, где вы находитесь, можно с помощью команды pwd. Перейти в нужную директорию - cd. Удалить файл или директорию - rm или rmdir соответственно. Скопировать - cp. Переместить или переименовать - mv, создать директорию - mkdir. Назначение и использование этих команд, думаю, подробных пояснений не требует...

Reset - не единственный способ выйти из программы
Для того чтобы посмотреть список файлов в директории, используется ls. Понимает эта команда кучу параметров (смотрите документацию), из которых весьма полезным, на мой взгляд, является -l, который выводит детальный листинг. Листинг выглядит примерно следующим образом:

drwxr-xr-x 2 DimDim None 0 Apr 14 21:00 bin 
-rwxr-xr-x 1 DimDim None 57 Apr 14 21:01 cygwin.bat 
-rw-r--r-- 1 DimDim None 766 Apr 16 09:08 cygwin.ico 
drwxr-xr-x 9 DimDim None 0 Apr 14 20:22 etc 
drwxr-xr-x 3 DimDim None 0 Apr 14 21:55 home 
drwxr-xr-x 9 DimDim None 0 Apr 14 21:00 lib 
drwxr-xr-x 2 DimDim None 0 Apr 14 21:00 tmp 
drwxr-xr-x 16 DimDim None 0 Apr 14 21:00 usr 
drwxr-xr-x 7 DimDim None 0 Apr 14 20:25 var 
lrwxrwxrwx 1 DimDim None 120 Apr 16 08:08 www -> /usr/www

В первой колонке указан тип файла (первый прочерк говорит, что это обычный файл, d - директория, l - ссылка) и права доступа (r - читать, w - писать, x - выполнять; первые три символа - для владельца файла, вторые - для его группы, третьи - для всех остальных). Также можно увидеть владельца файла, его (файла) размер (цифры перед датой), дату модификации и имя. Имя со стрелкой говорит, что это ссылка, и показывает, куда она ведет.

ls - список файлов в директории
Ссылки - это примерно то же самое, что и ярлыки в Windows. Использовать их удобно во многих случаях - например, если вы храните скрипты в своей домашней директории и хотите быстро дать к ним доступ серверу, то достаточно создать ссылку на домашнюю директорию и поместить ее среди ваших веб-файлов - она сразу станет видна в браузере. Другое использование - если вы даете пользователям скачивать файлы и хотите, чтобы один и тот же файл был доступен под разными именами - например, myprog_ver_3.4.zip и myprog.zip. Можно, конечно, просто скопировать файл, но зачем тратить лишнее место на диске?.. Для создания ссылок используется команда ln (от слова link). Например, для рассмотренного выше случая с файлом надо написать "ln -s myprog_ver_3.4.zip myprog.zip". Параметр -s говорит, что мы создаем символьную ссылку (такую же, как ярлык в Windows). Есть еще "жесткая" ссылка - это примерно то же самое, как если бы мы присвоили файлу еще одно имя, причем эти имена стали бы совершенно равноправными. Делать ссылки на директории тоже можно - и этим удобно пользоваться, чтобы давать короткие имена или "объединять" директории, находящиеся в разных местах.

Ссылки удобны и экономят место
Иногда бывает необходимо найти нужный файл. Для этого используется команда find, у которой есть очень много параметров, позволяющих проводить поиск по самым разным критериям. Например "find /usr -name test*" найдет все файлы в директории /usr и ее поддиректориях, имя которых начинается на test.

Права доступа

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

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

Ограничением UNIX является невозможность определить права для конкретного пользователя (кроме владельца), так что вы не сможете, например, разрешить выполнение скрипта только веб-серверу. Впрочем, это редко вызывает какие-то проблемы у веб-мастеров.

Для установки прав доступа используется команда chmod (CHange MODe). Права удобнее указывать в числовом формате: 4 - это право на чтение, 2 - на запись, 1 - на выполнение. Сумма этих чисел дает окончательный набор прав, например 6 - это чтение и запись, но без выполнения, 7 - все права, 5 - чтение и выполнение... Таким образом, для скриптов, например, удобно указывать "chmod 755 myscript.cgi" - вы оставляете себе все права, а всем остальным разрешаете скрипт читать и выполнять (вы же не хотите, чтобы веб-сервер мог ваш скрипт изменить?). Для обычных файлов можно указывать 644 - вы сами можете файл модифицировать, а остальные - только читать.

Работа с текстами

Неправильно настроенные права доступа - одна из самых распространенных ошибок! Вывод содержимого файла на экран выполняет команда cat. Также полезными являются head, которая выводит начало файла, и tail, которая выводит его конец. Head и tail понимают полезный параметр -n, указывающий, сколько строк вам надо вывести. Например "head -n 30 myfile.txt" выведет на экран первые 30 строк вашего файла. У команды tail есть еще один очень полезный параметр: -f, который выводит строки по мере их записи в файл. С помощью "tail -f errorlog", например, очень удобно в реальном времени отслеживать появление ошибок, да и вообще смотреть логи при тестировании чего-либо.

Одна из самых используемых в UNIX'e команд - это grep. Она позволяет выбрать только те строки, которые вас интересуют. Использовать ее очень удобно для обработки данных, выводимых другими командами - например, если вы хотите посмотреть все сообщения об открытии какой-то страницы в логе сервера, то можно просто написать "cat /var/log/httpd/access.log | grep mypage" (помните, что вертикальная черта передает выход одной команды на вход другой?). А если таких строк оказывается слишком много, то можно выход grep'а в свою очередь подать, например, на вход tail'а... У grep'а есть огромное количество параметров, разным способом влияющих на его поведение - очень советую почитать и поэкспериментировать, можно обнаружить много полезного. Кроме того, есть вариант этой команды egrep, который в запросах поиска понимает регулярные выражения, что тоже бывает очень удобно.

Просмотр логов - дело нужное!
Одним из самых распространенных текстовых редакторов в Юниксе является vi. В то же самое время, он является одним из наиболее сложных в освоении для пользователей Windows. На самом деле, сложного в нем ничего нет - надо просто понять, что у него два режима - командный и ввода текста. При старте vi запускается в командном режиме.

Использовать vi удобно в тех случаях, когда вам требуется немного подправить какой-то скрипт, страницу или файл конфигурации, лежащий на сервере. Это действительно проще, чем копировать файл к себе, редактировать, а потом снова выкладывать по FTP. Немножко потренируйтесь, и сами в этом убедитесь!

Например, вы заметили, что в файле написали "карова" вместо "корова". Запускаете vi: "vi myfile.htm". Теперь надо перейти к нужному месту (чтобы не листать всю страницу) "/карова" и нажать "ввод". Как только вы нажмете "слэш", курсор перепрыгнет вниз и будет ждать ввода строки для поиска. После того как вы ее введете и нажмете "ввод", редактор найдет первое вхождение этого слова и передвинет курсор туда. В принципе, никто не мешает вам просто прокручивать текст стрелками на клавиатуре, нажимая Ctrl-F (перемещение на страницу вперед) или Ctrl-B (на страницу вверх). Если вам потребуется найти не первое, а второе встречаемое в тексте слово "карова", то повторно текст можно и не вводить - достаточно нажать косую черту и enter. А если вместо косой черты использовать знак вопроса, то поиск будет идти не сверху вниз, а снизу вверх.

Теперь мы подводим курсор к букве "а", которую хотим заменить, и нажимаем "x" (икс) - эта команда удаляет символ справа от курсора. Можно также использовать "X" (большой икс), тогда удалится символ слева от курсора. Полезными являются также команды "dd" (удаление строки) и "D" (удаление от курсора до конца строки). Все это время мы оставались в командном режиме vi - то есть все символы, которые мы нажимали на клавиатуре, редактор считал командами, которые надо выполнить, а не текстом, который надо вставить в файл. Теперь пришла пора переключиться в режим редактирования.

Нажимаем "i" (начать ввод текста перед текущей позицией курсора). В принципе, могут пригодиться и другие команды, в зависимости от того, как написан ваш файл: "a" - начать ввод после курсора, "A" - ввод в конце текущей строки, "I" - ввод в начале текущей строки, "o" - новая строка ниже текущей, "O" - новая строка выше текущей. Но мы уже нажали "i" и теперь нам надо напечатать "о", вместо той "а", которую мы успешно удалили. Просто нажимаем на клавиатуре нужную букву и видим, как она вставилась в текст. Обратите внимание, что редактор все еще находится в режиме ввода текста, то есть можно продолжать печатать. Для того чтобы снова переключиться в командный режим, нажимаем кнопку "Esc" на клавиатуре. Сложность в том, что внешне командный и "редакторский" режимы не различаются. Поэтому, если вы запутались, то просто нажмите ескейп - если вы уже были в командном режиме, то редактор даст звуковой сигнал, а если были в режиме редактирования, то перейдете в командный, после чего никто не мешает снова нажать "i" и продолжать вводить текст.

Теперь отредактированный файл надо сохранить. Нажимаем ":" (двоеточие) и видим, как курсор перепрыгнул вниз, ожидая вашей команды. Нажимаем "w" и ввод. Все, файл сохранен! Но вы все еще в редакторе... Для выхода еще раз нажимаем двоеточие и "q". В принципе, можно было после первого двоеточия набрать "wq", тогда редактор бы сохранил файл и сразу закрылся (так обычно и делают). Здесь может возникнуть еще одна сложность - если вы отредактировали файл, а потом передумали его менять, то при попытке выйти из редактора он вам скажет, что, дескать, файл не сохранен, и откажется вас отпускать. Для того чтобы настоять на своем, можно после команды поставить восклицательный знак, тогда редактор поймет, что вы настроены серьезно, и не станет с вами спорить.

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

Работа с программами

vi уже отредактировали свои тексты?
Для запуска программы надо просто набрать ее имя, нужные параметры и нажать ввод. Сложность в том, что, пока такая программа работает, вы ничего делать не можете - надо ждать ее завершения. А если программа работает долго? Или вообще это сервер, который должен висеть и ждать запросов? Тоже не беда! Для того чтобы запустить программу в фоновом режиме, надо после нее поставить "&". Посмотреть список фоновых программ, которые вы запустили, можно командой "jobs". В полученном списке все команды будут пронумерованны, и если какую-то из них вы захотите "вытащить на поверхность", то можно сказать, например, "fg 1". Для того чтобы перевести в фон запущенную программу можно использовать "bg". Названия fg и bg - это от слов foreground и background, так что запоминаются легко. Но если программа уже работает, то команду "bg" ввести не получится, так что сначала надо будет сказать Ctrl-Z (после чего программа приостановится), а потом уже воспользоваться jobs и bg.

Однако у фоновых программ есть свои сложности - если вы выйдете из системы, то программа будет "убита". А в фоне часто запускаются такие программы, которые считают что-то довольно долго... Так что же - сидеть и ждать? Нет. Тут пригодится nohup, которая не даст убить программу при вашем отключении. То есть, написав "nohup myverylongprogram &", вы можете спокойно отключаться, а заглянув на сервер через часок-другой, посмотреть результаты работы программы.

Для того чтобы посмотреть, какие программы сейчас запущены, используется команда "ps". У нее довольно много параметров, указывающих, какими именно процессами вы интересуетесь, и в каком формате надо показывать результаты. Полезными параметрами являются "a" (показывать не только ваши процессы, но и других пользователей), "l" (выводит более подробную информацию о каждом процессе) и "w" (не обрезает строку на 80-м символе). Так как на сервере обычно выполняется очень много программ, то для отбора нужных записей удобно бывает перенаправить вывод в grep.

У каждого процесса есть PID - Process ID. Если вы решите какую-то задачу убить, то вам понадобится команда kill. В качестве параметра к ней указывается PID того процесса, к которому вы хотите kill применить. На самом деле, kill не убивает процесс, а передает ему какой-то сигнал, на который процессы реагируют. В частности, можно, например, заставить сервер перечитать файл конфигурации. Более подробно - в справке.

Учтите, что многие серверные программы не любят, когда им напрямую посылают команды, а содержат в своей поставке специальные управляющие утилиты. Например, для Apache это apachectl, для PostgreSQL - pg_ctl и т.д.

Чем занят сервер

Команда ps выводит список процессов, запущенных в данный момент времени. Причем список этот длинный, и для того чтобы дать понять, насколько загружен сервер, мало приспособлен. В отличие от него, команда top выводит и обновляет в реальном времени список запущенных процессов, причем сортирует их по степени использования процессорных ресурсов. То есть вы сразу можете увидеть, какая из программ является наиболее ресурсоемкой, и как себя чувствует сервер в целом - в верхней строке top выводит справочную информацию о состоянии сервера: загрузку памяти, файла подкачки и процессора, разбивку загрузки между системными и пользовательскими программами, количество выполняющихся процессов...

В дополнение к top удобно использовать vmstat и iostat - эти программы тоже выдают информацию о состоянии машины, но в более "техническом" формате... Впрочем, такой формат, пожалуй, даже более удобен для вычисления причин различных неприятностей - достаточно бывает посмотреть на динамику изменения того или иного параметра. О параметрах и выводимой этими программами информации почитайте в справке - вы сможете настроить их на отслеживание именно тех вещей, которые вызывают у вас подозрения...

Часто оказываются полезными команды df и du. Первая позволяет посмотреть, сколько места занято и свободно на дисках, а вторая показывает размер директорий вместе с поддиректориями (параметр -d указывает глубину вложенности, которую надо смотреть). Обе эти (и некоторые другие) утилиты лучше запускать с параметром -h - тогда они будут показывать размер в кило- мега- и т.п. байтах, а не в блоках. Например "du -h -d2 /usr".

Заключение

Вот, пожалуй, и все. Разумеется, я прекрасно понимаю, что этой статьи абсолютно недостаточно для более-менее полного знакомства с UNIX, но я ведь и не ставил перед собой такой задачи. Для этого существуют сотни очень толстых книжек... Я же всего лишь, как и обещал в начале статьи, постарался рассказать о самых базовых вещах, которые могут понадобиться любому веб-мастеру. Надеюсь, что это окажется кому-то полезным.

Комментарии: (0) | UNIX | 2006-03-18

Основы операционной системы UNIX - 01. Введение. 02. История

Основы операционной системы UNIX - 01. Введение

Этот краткий (предположительно, 16 часов, из которых 6 - практические занятия) вводный курс предназначен для ознакомления с архитектурой, особенностями и основными средствами ОС UNIX. При успешном освоении, курс позволит свободно и продуктивно работать в ОС UNIX в качестве пользователя и продолжить изучение администрирования или программирования этой операционной системы.

Изложение ведется, в основном, без привязки к особенностям какой-либо версии UNIX, но при необходимости конкретизации, она делается для систем SVR4, в частности, ОС Solaris 8.

В последней версии (1.2, 11 марта 2004 года) обновлена хронология основных событий в истории ОС UNIX.

Основы операционной системы UNIX - 02. История

История ОС UNIX началась в 1969 году в одном из подразделений AT&T Bell Laboratories, когда на "малоиспользуемой" машине DEC PDP-7 Кен Томпсон (Ken Thompson), Деннис Ричи (Dennis Ritchie) и другие (прежде занимавшиеся созданием ОС Multics) начали работу над операционной системой, названной ими первоначально Unics (UNiplexed Information and Computing System). В течение первых 10 лет развитие UNIX происходило, в основном, в Bell Labs. Соответствующие начальные версии назывались "Version n" (Vn) и предназначались для ЭВМ DEC PDP-11 (16-битовая) и VAX (32-битовая).

Версии Vn разрабатывались группой Computer Research Group (CRG) в Bell Labs. Поддержкой занималась другая группа, Unix System Group (USG). Разработкой также занималась группа Programmer's WorkBench (PWB), привнесшая систему управления исходным кодом sccs, именованные каналы и ряд других идей. В 1983 году эти группы были объединены в одну, Unix System Development Lab.

Хронология основных событий в истории ОС UNIX

Ниже в хронологическом порядке представлены наиболее существенные версии и события в истории UNIX вплоть до марта 2004 года, а также некоторая информация о взаимосвязях между ними:

1971

V1. Первая версия UNIX Time-Sharing System на ассемблере для PDP-11/20. Включала файловую систему, системный вызов fork() для порождения процессов, утилиты типа cat, ed, roff. Использовалась для обработки текстов при подготовке патентов. Системный вызов pipe() и поддержка программных каналов появилась в V2.

1973

V4. Версия, переписанная на языке C, что сделало UNIX легко переносимой на другие платформы. Язык C создавался для разработки ОС UNIX.

1974

V5. Появление первых версий в Bell Labs (PWB/UNIX, MERT).

1975

V6. Первая версия UNIX, широко распространенная за пределами Bell Labs, в частности, в университетах. С этого времени начинается появление множества других версий и UNIX становится популярной ОС. На базе этой версии в Калифорнийском университете в Беркли (UCB) создавалась 1.xBSD (для PDP-11).

1978

Версия 2.xBSD (Berkeley Systems Development) для PDP-11, созданная группой Computer Systems Research Group (CSRG) в Беркли. Поддержка сети DARPA, первая реализация стека протоколов TCP/IP. Командный интерпретатор csh. В дальнейших версиях (до 1980): поддержка виртуальной памяти, termcap, curses, редактор vi.

1979

V7. "Последняя настоящая UNIX", включала компилятор языка C, командный интерпретатор sh, систему uucp, была перенесена на 32-разрядный VAX. При этом размер ядра составлял около 40 Кбайт!

1981

4.1BSD: управление заданиями, автоматическое конфигурирование ядра. System III - первый коммерческий UNIX от AT&T, реализация именованных каналов (FIFO).

1982

UNIX начинают использовать создатели рабочих станций: SunOS 1.0 (на базе 4.1BSD) от Sun Microsystems и HP-UX (на базе System III) от Hewlett-Packard.

1983

4.2BSD: полная поддержка TCP/IP, сокетов, Ethernet. Файловая система UFS с поддержкой длинных имен файлов и символьных связей. AT&T System V: поддержка основных утилит и средств BSD, добавлен пакет средств межпроцессного взаимодействия (IPC).

1984

SVR2: функции в командном интерпретаторе sh, первые попытки стандартизации. SCO XENIX - первый коммерческий UNIX на Intel-архитектуре. Создание Free Software Foundation (FSF) и начало проекта GNU - создание свободно распространяемой UNIX-подобной ОС и соответствующих утилит.

1985

V8 (модули STREAMS). Появление архитектуры микроядра Mach. Реализации стандарта SVR2: SCO XENIX SystemV/286, Interactive 386/ix. Появление ОС Minix.

1986

4.3BSD для VAX. SVR3: модули STREAMS из V8, TLI, поддержка динамически загружаемых библиотек. V9 (дополнения из 4.3BSD). Появление операционных систем AIX (IBM) и A/UX (Apple).

1987

SVR3.2: SCO XENIX SV/386. Появление ОС IRIX (SVR3.0).

1988

4.3BSD Tahoe - 4.3BSD с исходниками. Создание SVR4 на базе System V, BSD и SunOS (X11, NFS, система виртуальной памяти, динамически подключаемые библиотеки). Добавлены: командный интерпретатор ksh, ANSI C, возможности поддержки национальных языков, соответствие стандартам POSIX, X/Open. Появление компьютера NeXT с ОС NeXTSTEP (4.3BSD + Mach 2.0).

1990

4.3BSD Reno: поддержка различных платформ, NFS, SLIP, Kerberos. SUN Solaris 1 (SunOS 4.1.4). Появление OSF/1 от Open Software Foundation: микроядро Mach 2.6 + SVR4, SMP, нити, Motif GUI.

1991

BSD Net2 (4.3BSD Lite) - не содержит спорного кода AT&T. Появление ОС GNU HURD. Появление ОС Linux (на базе Minix). Выделение из AT&T отдельного подразделения USL (Unix System Laboratories), владеющего кодом AT&T UNIX и System V.

1992

4.4BSD: виртуальная память как в Mach 2.5, журнализируемая файловая система UFS. Закрытие CSRG в Беркли. SVR4.2: журнализируемая файловая система Veritas FS, списки контроля доступа ACL, динамически загружаемые модули ядра. USL UnixWare 1 - реализация SVR4.2. SunOS 5 = Solaris 2 (SunOS 4 + SVR4).

1993

Появление ОС FreeBSD. Solaris 2.2. NeXTSTEP 3.2. IRIX 5.3, HP-UX 9.04, AIX 4.0, Linux 0.99, UnixWare 1.1.

1994

OSF 1.3: микроядро Mach 3, поддержка 64-битовых платформ. FreeBSD 2.0, SCO OpenDesktop 3.2.4. UnixWare 1.1.2. Linux 1.0.9. USL куплена компанией Novell.

1995

Появление OpenBSD и NetBSD. Solaris 2.5. Появление Digital UNIX (DEC OSF/1). Появление SCO OpenServer 5.0. UnixWare 2.0: SVR4.2 MP от Novell. Novell продает UnixWare и весь исходный код AT&T компании SCO. Выход HP-UX 10 (с добавлениями из UnixWare). Завершение работ над A/UX.

1996

FreeBSD 2.1.6. OpenBSD 2.0. IRIX 6.3. Linux 2.0.21. OpenSTEP 4 - завершение проекта NeXTSTEP. SCO UnixWare 2.1. Микроядро Mach 4.

1997

FreeBSD 2.2.5, OpenBSD 2.2, NetBSD 1.3, Solaris 2.6 (под SPARC и Intel), SCO OpenServer 5.0.4. IRIX 6.4. GNU Hurd 0.2 (+ Mach 4). Linux 2.0.28.

1998

FreeBSD 3.0 (+4.4BSD), Solaris 7, DigitalUNIX 4, SCO: OpenServer 5.0.5, UnixWare 7 (SVR5). HP-UX 11.0. Linux 2.0.36. IBM: проект Monterey (AIX 4.3 + SVR5).

1999

FreeBSD 3.4. OpenBSD 2.6, NetBSD 1.4. Появление Mac OS X и проекта Darwin (Mach 4 + FreeBSD 3.1). Solaris 8 beta. Компанию DEC купил Compaq: Tru64 Unix V.5.0. (DigitalUNIX). IRIX 6.5.6. SCO: OpenServer 5.0.5a, UnixWare 7.1.1. AIX 4.3.3. Linux 2.2.13.

2000

FreeBSD 4.0-4.2. OpenBSD 2.8. NetBSD 1.5. Solaris 8. Apple: Mac OS X Server, Darwin 1.2.1. Tru64 Unix V.5.1. IRIX 6.5.10. SCO: OpenServer 5.0.6. Компания SCO продала все свои ОС компании Caldera (Caldera OpenLinux). Hurd A1, Linux 2.4.0, 2.2.18. HP-UX 11i. AIX 5L alpha (проект Monterey).

2001

FreeBSD 4.4. OpenBSD 3.0. NetBSD 1.5.2. Mac OS X 10.1.2. SUN: Solaris 8 10/01, Solaris 9 alpha (не для Intel-архитектуры). Tru64 Unix V.5.1A, IRIX 6.5.13. SCO OpenServer 5.0.6a. Hurd h3. Caldera: OpenUNIX 8: UnixWare 7.1.1 + LKP=Linux 2.4.0 - прозрачная поддержка Linux-приложений. Linux 2.4.17, 2.0.39, 2.2.20. AIX 5L v.5.1.

2002

FreeBSD 4.7. OpenBSD 3.2. NetBSD 1.6. Mac OS X 10.2 (Jaguar). Darwin 6.2. SUN: Solaris 8 12/02, Solaris 9 OE. QNX 6.2. IRIX 6.5.18. Debian GNU/Hurd J2. SCO: UnixWare 7.1.3 (в продолжение OpenUNIX 8. Caldera снова стала SCO...). Linux (влияние IRIX и AIX, в частности, файловые системы): 2.5.2-2.5.52 - экспериментальное ядро. 2.4.20, 2.2.23. HP-UX 11i v1.6. AIX 5L v.5.2.

2003

FreeBSD 5.1, FreeBSD 4.9. OpenBSD 3.4. NetBSD 1.6.1. Mac OS X 10.3.2. Darwin 6.6-7.2. SUN: Solaris 9 OE 12/03, Solaris 9 x86 PE, Solaris 10 Preview. QNX 6.2.1. IRIX 6.5.22. Debian GNU/Hurd K5. Tru64 Unix V5.1B-1. SCO: UnixWare 7.1.3/OKP (OpenServer Kernel Personality), OpenServer 5.0.7. Linux: 2.6.0, 2.4.23, 2.2.25. HP-UX 11i v2 (в том числе, для Intel Itanium).

2004

FreeBSD 5.2. NetBSD 1.6.2. Solaris 10 Software Express 02/04. IRIX 6.5.23. Linux: 2.6.3, 2.4.25, 2.2.26, 2.0.40.

Ожидается:

  • дальнейшее развитиие ветки Linux 2.6 и обновления по старым веткам ядер (2.0, 2.2, 2.4);
  • Solaris 10 (вышла);
  • последовательное развитиие FreeBSD, OpenBSD, NetBSD, других веток BSD.
  • дальнейшее развитие Mac OS X и Darwin;
  • дальнейшее последовательное развитие IRIX.

Современные версии ОС UNIX

Итак, в настоящее время (начало 2004 года - В.К.) мы имеем на платформе Intel x86 следующие основные версии UNIX:

  • FreeBSD 5.2;
  • OpenBSD 3.4;
  • NetBSD 1.6.2;
  • Linux 2.0, 2.2, 2.4, 2.6 в виде множества различных дистрибутивов;
  • Solaris 9;
  • SCO OpenServer 5.0.7 и UnixWare 7.1.3

На других платформах (основные версии):

  • Linux 2.6.x (практически все платформы);
  • NetBSD 1.6.2 (практически все платформы);
  • Mac OS X 10.3.2 (PowerPC);
  • AIX 5L v5.2 (PowerPC);
  • Solaris 9, 10 (SPARC);
  • HP-UX 11i (PA-RISC, Intel Itanium);
  • Tru64 Unix V.5.1B-1 (Alpha);
  • IRIX 6.5.23 (MIPS)

Основные характеристики

ОС UNIX имеет следующие основные характеристики:

  • переносимость;
  • вытесняющая многозадачность на основе процессов, работающих в изолированных адресных пространствах в виртуальной памяти;
  • поддержка одновременной работы многих пользователей;
  • поддержка асинхронных процессов;
  • иерархическая файловая система;
  • поддержка независимых от устройств операций ввода-вывода (через специальные файлы устройств);
  • стандартный интерфейс для программ (программные каналы, IPC) и пользователей (командный интерпретатор, не входящий в ядро ОС);
  • встроенные средства учета использования системы.

Архитектура ОС UNIX

Архитектура ОС UNIX - многоуровневая. На нижнем уровне, непосредственно над оборудованием, работает ядро операционной системы. Функции ядра доступны через интерфейс системных вызовов, образующих второй уровень. На следующем уровне работают командные интерпретаторы, команды и утилиты системного администрирования, коммуникационные драйверы и протоколы, - все то, что обычно относят к системному программному обеспечению. Наконец, внешний уровень образуют прикладные программы пользователя, сетевые и другие коммуникационные службы, СУБД и утилиты.

Основные функции ядра

Основные функции ядра UNIX (которое может быть монолитным или модульным) включают:

  • планирование и переключение процессов;
  • управление памятью;
  • обработку прерываний;
  • низкоуровневую поддержку устройств (через драйверы);
  • управление дисками и буферизация данных;
  • синхронизацию процессов и обеспечение средств межпроцессного взаимодействия (IPC).

Системные вызовы

Системные вызовы обеспечивают:

  • сопоставление действий пользователя с запросами драйверов устройств;
  • создание и прекращение процессов;
  • реализацию операций ввода-вывода;
  • доступ к файлам и дискам;
  • поддержку функций терминала.

Системные вызовы преобразуют процесс, работающий в режиме пользователя, в защищенный процесс, работающий в режиме ядра. Это позволяет процессу вызывать защищенные процедуры ядра для выполнения системных функций.

Системные вызовы обеспечивают программный интерфейс для доступа к процедурам ядра. Они обеспечивают управление системными ресурсами, такими как память, пространство на дисках и периферийные устройства. Системные вызовы оформлены в виде библиотеки времени выполнения. Многие системные вызовы доступны через командный интерпретатор.

Пользовательские процессы и процессы ядра

Пользовательские процессы образуют следующие два уровня и:

  • защищены от других пользовательских процессов;
  • не имеют доступа к процедурам ядра, кроме как через системные вызовы;
  • не могут непосредственно обращаться к пространству памяти ядра.

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

Пользовательский процесс работает в режиме ядра, когда начинает выполнять код ядра через системный вызов.

Обмен данными между пространством ядра и пользовательским пространством

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

Пользовательская область процесса содержит информацию о процессе, необходимую ядру:

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

Пользовательский процесс не может обращаться к пространству ядра, но ядро может обращаться к пространству процесса.

Системное программное обеспечение

ОС UNIX обеспечивает ряд стандартных системных программ для решения задач администрирования, переконфигурирования и поддержки файловой системы, в частности:

  • для настройки параметров конфигурации системы;
  • для перекомпоновки ядра (если она необходима) и добавления новых драйверов устройств;
  • для создания и удаления учетных записей пользователей;
  • создания и подключения физических файловых систем;
  • установки параметров контроля доступа к файлам.

Для решения этих задач системное ПО (работающее в пользовательском режиме) часто использует системные вызовы.

Комментарии: (0) | UNIX | 2006-04-04

Основы операционной системы UNIX - 03. Пользователи и группы

Основы операционной системы UNIX - 03. Пользователи и группы

UNIX - многопользовательская операционная система. Пользователи, занимающиеся общими задачами, могут объединяться в группы. Каждый пользователь обязательно принадлежит к одной или нескольким группам. Все команды выполняются от имени определенного пользователя, принадлежащего в момент выполнения к определенной группе.

В многопользовательских системах необходимо обеспечивать защиту объектов (файлов, процессов), принадлежащих одному пользователю, от всех остальных. ОС UNIX предлагает базовые средства защиты и совместного использования файлов на основе отслеживания пользователя и группы, владеющих файлом, трех уровней доступа (для пользователя-владельца, для пользователей группы-владельца, и для всех остальных пользователей) и трех базовых прав доступа к файлам (на чтение, на запись и на выполнение). Базовые средства защиты процессов основаны на отслеживании принадлежности процессов пользователям.

Для отслеживания владельцев процессов и файлов используются числовые идентификаторы. Идентификатор пользователя и группы - целое число (обычно) в диапазоне от 0 до 65535. Присвоение уникального идентификатора пользователя выполняется при заведении системным администратором нового регистрационного имени. Значения идентификатора пользователя и группы - не просто числа, которые идентифицируют пользователя, - они определяют владельцев файлов и процессов. Среди пользователей системы выделяется один пользователь - системный администратор или суперпользователь, обладающий всей полнотой прав на использование и конфигурирование системы. Это пользователь с идентификатором 0 и регистрационным именем root.

При представлении информации человеку удобнее использовать вместо соответствующих идентификаторов символьные имена - регистрационное имя пользователя и имя группы. Соответствие идентификаторов и символьных имен, а также другая информация о пользователях и группах в системе (учетные записи), как и большинство другой информации о конфигурации системы UNIX, по традиции, представлена в виде текстовых файлов. Эти файлы - /etc/passwd, /etc/group и /etc/shadow (в системах с теневым хранением паролей) - детально описаны ниже.

Файл /etc/passwd

Каждая строка (учетная запись) в файле /etc/passwd описывает одного известного системе пользователя и имеет семь разделенных двоеточиями полей. Пример записи:

user_01:x:169:10:Student:/home/user_01:/bin/sh

Назначение полей этой записи представлено в следующей таблице.

Таблица 1. Поля файла /etc/passwd и их назначение

Поле

Назначение

Имя пользователя (регистрационное имя)

Содержит символьное имя пользователя, используемое при регистрации в системе. В пределах одной машины должно быть уникальным. Регистрационное имя должно состоять из алфавитно-цифровых символов (нижнего регистра), без пробелов, с максимальной длиной, определяемой конкретной ОС. Наиболее часто используется максимальная длина - восемь символов. Дублирование имен пользователей приводит к определенным осложнениям. Например, дубликаты появляются тогда, когда администратор использует в имени более 8 символов. Тогда для системы jarmstrong то же, что jarmstroff. Когда имя так продублировано, система использует первую найденную для него запись в файле /etc/passwd и игнорирует последующие.

Пароль

Поле хранит зашифрованный пароль. Допускается пустое поле. При использовании системы теневого хранения паролей, в этом поле находится только метка пароля (x), а зашифрованный пароль хранится в другом месте. Правила задания пароля обычно находятся в файле /etc/default/passwd, (например, директива PASSLENGТH=число в этом файле задает минимальное количество символов в пароле). Некоторые системы также учитывают регистр, а в некоторых предусматривается использование как минимум одного не алфавитно-цифрового символа.

Идентификатор пользователя

Поле хранит числовой идентификатор пользователя, который связан с его регистрационным именем. Любой созданный пользователем файл или запущенный процесс ассоциируется с его числовым идентификатором.

Идентификатор группы

Содержит числовой идентификатор группы. Любой созданный пользователем файл ассоциируется с его идентификатором группы. Указанная здесь группа является основной (первичной) для данного пользователя.

Комментарий

Содержит комментарий - любую алфавитно-цифровую строку. Предположительно это поле содержит информацию о реальном владельце регистрационного имени. ОС UNIX не задает его формат, так что подойдет любой. Некоторые программы печати и электронной почты используют это поле для вывода настоящего имени пользователя.

Начальный каталог

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

Начальная команда

Определяет командную среду пользователя (обычно запускается один из командных интерпретаторов UNIX, но, теоретически, можно указать любую команду). Это поле можно изменять.

Файл /etc/group

Этот файл соотносит числовые идентификаторы групп с символьными именами. Каждая строка файла /etc/group содержит четыре поля. Поля разделяются двоеточиями. Назначение полей этой записи представлено в табл. 2.

Таблица 2. Поля файла /etc/group и их назначение

Поле Назначение
Имя группы Содержит (уникальное) символьное имя группы.
Пароль группы Группы могут иметь пароли, хотя использование паролей групп - явление редкое. В примере данное поле пустое - это значит, что пароль отсутствует.
Идентификатор группы Содержит числовой идентификатор группы.
Список пользователей Содержит список регистрационных имен пользователей данной группы. Имена в этом списке разделяются запятыми. Пользователи могут принадлежать к нескольким группам и, при необходимости, переключаться между ними с помощью команды newgrp.

Пример записи из файла /etc/group:

bin::2:root,bin,daemon

Файл /etc/shadow

Этот файл используется в системах с теневым хранением паролей, где они вынесены из доступного всем пользователям на чтение файла /etc/passwd для повышения безопасности системы. Здесь (помимо собственно зашифрованных паролей) хранятся дополнительные ограничения, связанные с регистрационным именем и паролем пользователя. Доступ к этому файлу на чтение имеет только пользователь root, а работают с ним команды passwd и login.

Файл содержит по одной записи из восьми полей, разделенных двоеточиями, для каждой учетной записи в системе. Назначение полей этой записи представлено в табл. 3.

Таблица 3. Поля файла /etc/shadow и их назначение

Номер поля Назначение
1 Имя пользователя.
2 Зашифрованный по особому алгоритму (обычно, DES или MD5) пароль.
3 Количество дней между 01.01.1970 (началом эры UNIX) и днем последнего изменения пароля.
4 Минимальное количество дней между изменениями пароля.
5 Срок действия пароля пользователя.
6 За сколько дней система будет начинать предупреждать пользователя о необходимости изменения пароля.
7 Сколько дней пользователь может не работать в системе, прежде чем его регистрационное имя будет заблокировано.
8 Дата, после которой имя пользователя нельзя будет использовать в системе.

Системные регистрационные имена

Каждая версия ОС UNIX резервирует несколько специальных регистрационных имен для предопределенных системных целей. Так, в UNIX SVR4 системными считаются регистрационные имена, соответствующие идентификаторам от 0 до 100. Наиболее часто резервируются регистрационные имена, представленные в табл. 4.

Таблица 4. Системные регистрационные имена в ОС UNIX SVR4

Регистрационное имя Назначение
root Регистрационное имя суперпользователя, администратора системы, соответствующее идентификатору 0. Единственное имя, обязательно имеющееся в любой UNIX-системе. Пользователь root не связан никакими ограничениями по доступу. Для выполнения большинства программ администрирования используется регистрационное имя root, обеспечивающее гарантированный доступ к необходимым ресурсам.
daemon Владелец процессов, реализующих пользовательские службы.
sys Владелец выполняемых пользовательских системных команд UNIX (часто соответствует идентификатору 0).
bin Владелец стандартных пользовательских утилит UNIX (часто соответствует идентификатору 0).
adm Псевдопользователь, владеющий файлами системы журнализации.
cron Псевдопользователь, владеющий соответствующими файлами, от имени которого выполняются процессы подсистемы запуска программ по расписанию.
news Псевдопользователь, от имени которого выполняются процессы системы телеконференций (дискуссионных групп или групп новостей).
nobody Псевдопользователь, используемый при работе сетевой файловой системы NFS.
uucp Псевдопользователь подсистемы UUCP, позволяющий передавать почтовые сообщения и файлы между UNIX-хостами.
lp, lpd Псевдопользователь, от имени которого выполняются процессы системы печати, владеющий соответствующими файлами.

Точно так же задаются и системные группы в файле /etc/group. В SVR4 зарезервированными считаются имена групп с идентификаторами от 0 до 100.

Изменение действующего идентификатора пользователя

Команда su предназначена для временного изменения действующего (эффективного) идентификатора пользователя и сеанса пользователя. Она имеет следующий синтаксис:

su [-] [регистрационное_имя [аргументы ...]

Команда su запрашивает пароль (у всех пользователей, кроме root, и если пароль существует). В случае соответствия пароля создается новый сеанс от имени нового пользователя. В следующем примере сохраняется среда пользователя с именем user01, включая текущий рабочий каталог и переменные среды:

$ logname
user01
$ su informix
Password:
$ logname
user01
$ echo $LOGNAME
user01
$ set
HOME=/home/user01
LOGNAME=user01
MAIL=/var/mail/user01
PWD=/home/user01
...
$ exit
$

Если введена команда su - регистрационное_имя, то система предоставляет пользователю командный интерпретатор и среду в соответствии с указанным регистрационным именем:

$ logname
user01
$ su - informix
Password:
$ logname
user01
$ echo $LOGNAME
informix
$ set
HOME=/home3/informix
LOGNAME=informix
MAILPATH=/usr/mail/informix
PWD=/home3/informix
...
$ exit
$

Команда в формате su регистрационное_имя -c аргументы воспринимает аргумент как команду, которую необходимо выполнить с регистрационным именем нового пользователя. Для выполнения команды запрашивается пароль нового пользователя и используются его права доступа. После завершения выполнения происходит возврат в среду пользователя, вызвавшего команду su. Таким образом, если пользователю, например, надо удалить файл пользователя с регистрационным именем new_user, необходимо выполнить команду:

$ su new_user -c "rm file"
Password:
$

Команда su без указания регистрационного имени позволяет получить права пользователя root. При этом необходимо знать и правильно ввести пароль пользователя root. Если пользователь работает под регистрационным именем root, вводить пароль при изменении действующего идентификатора не нужно.

Изменение действующего идентификатора группы

Сразу после регистрации пользователь работает от имени основной группы (задана в файле /etc/passwd). Кроме основной, пользователь может принадлежать к любому количеству дополнительных групп. Эти группы задаются путем указания регистрационного имени в четвертом поле строки в файле /etc/group, описывающей дополнительную группу. Членство в дополнительных группах либо учитывается при определении прав доступа автоматически (BSD-системы), либо для перехода в дополнительную группу и изменения тем самым действующего идентификатора группы используется команда newgrp (SVR4) со следующим синтаксисом:

/usr/bin/newgrp [ группа ]

Команда newgrp встроена в некоторые командные интерпретаторы (sh, ksh).

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

При вызове без операнда, команда newgrp переводит пользователя в его основную группу, отменяя тем самым действие предыдущих команд newgrp.

Если во втором поле записи соответствующей группы в файле /etc/group указан пароль (т.е. если это поле не пустое) и пользователь не указан в четвертом поле как член группы, при переходе в группу у пользователя запрашивается пароль. Единственный способ создать пароль группы - воспользоваться командой passwd для задания пароля одной из учетных записей пользователей, а затем скопировать зашифрованный пароль из файла /etc/shadow в файл /etc/group. Пароли групп сейчас используют редко.

Изменение пароля и характеристик учетной записи, связанных с регистрацией

Команда passwd позволяет любому пользователю изменить пароль или получить список атрибутов текущего пароля для своего регистрационного_имени. Привилегированные пользователи могут запускать passwd для выполнения этих функций для любого пользователя, а также для установки атрибутов пароля для любого пользователя.

Пароль обычно задается администратором при создании учетной записи пользователя для владельца регистрационного_имени. В дальнейшем пользователь может изменить пароль с помощью команды passwd.

Команда passwd имеет следующий синтаксис:

passwd [регистрационное_имя]
passwd [-l|-d][-f][-x max][-n min][-w warn] регистрационное_имя
passwd -s [-a]
passwd -s [регистрационное_имя]

Опции команды представлены в табл. 5. Обычные пользователи могут использовать только опцию -s.

Таблица 5. Опции команды passwd

Опция Назначение
-s Показывает атрибуты пароля для регистрационного_имени пользователя. Любой пользователь может задавать данную опцию.
-l Блокирует запись пароля для регистрационного_имени.
-d Удаляет пароль для регистрационного_имени, так что у пользователя с этим регистрационным_именем пароль не запрашивается.
-f Заставляет пользователя изменить пароль при следующей регистрации в системе, делая пароль для регистрационного_имени устаревшим.
-x max Задает для пользователя с указанным регистрационным_именем количество дней, в течение которых пароль будет действителен.
-n min Задает минимальное количество дней между изменениями пароля для пользователя с указанным регистрационным_именем. Всегда используйте эту опцию с опцией -x, если только max не установлен в -1 (устаревание отключено). В этом случае, min устанавливать не нужно.
-w warn Задает, за сколько дней (относительно max) пользователя с данным регистрационным_именем будут предупреждать о предстоящем устаревании пароля.
-s -a Показывает атрибуты паролей для всех пользователей.

Правила построения паролей

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

  • Пароль должен содержать не менее PASSLENGTH символов, как определено в файле /etc/default/passwd. Значение PASSLENGTH должно быть не менее 3. Учитываются только первые восемь символов пароля.
  • Пароль должен содержать не менее двух буквенных символов и одной цифры или специального символа. (В данном случае к буквенным символам относятся все прописные и строчные буквы.)
  • Пароль должен отличаться от регистрационного имени пользователя и от любого слова, получаемого циклическим (circular shift) или обратным (reverse shift) сдвигом этого регистрационного имени. (Соответствующие прописные и строчные буквы считаются совпадающими.)

Эти требования не распространяются на пользователя root.

Действие команды passwd

При использовании для изменения пароля команда passwd запрашивает у обычных пользователей их старый пароль, если он задан. Если с момента задания старого пароля прошло достаточно много времени, passwd затем предлагает пользователю дважды ввести новый пароль; в противном случае программа прекращает работу. Затем passwd проверяет, удовлетворяет ли новый пароль описанным выше правилам построения. При вводе нового пароля второй раз, две копии нового пароля сравниваются. Если они не совпадают, цикл запроса нового пароля повторяется, но не более двух раз.

Пользователь root может изменять любой пароль; команда passwd не запрашивает у него старый пароль.

Устаревание паролей

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

Информация о паролях всех пользователей системы хранится в файле /etc/shadow, который могут читать только привилегированные пользователи. Каждая строка пользователя в файле /etc/shadow содержит четыре параметра, определяющих устаревание пароля (поля 3-6, см. табл. 3). Последние три из этих параметров можно установить опциями командной строки -n, -x и -w, соответственно. При отсутствии опций, их значения берутся из файла /etc/default/passwd.

Показ атрибутов пароля

Когда команда passwd используется для показа атрибутов пароля, результаты выдаются в следующем формате:

login_name status lastchanged minimum maximum warn

или, если отсутствует информация, связанная с устареванием пароля,

login_name status

Поля определены следующим образом:

login_name

Регистрационное имя пользователя.

status

Статус пароля для регистрационного_имени: PS означает наличие пароля, LK означает, что регистрация заблокирована, а NP означает отсутствие пароля.

Стандартные значения атрибутов

Присваивая значения набору параметров в файле /etc/default/passwd, администратор может управлять устареванием и длиной паролей. Можно задать следующие параметры:

MINWEEKS

Минимальное количество недель перед тем, как пароль можно будет изменить. Сразу после установки системы этот параметр имеет значение 0.

MAXWEEKS

Максимальное количество недель, в течение которых пароль можно не изменять. Сразу после установки системы этот параметр имеет значение 24.

WARNWEEKS

Количество недель перед устареванием пароля, когда необходимо предупреждать пользователя. Сразу после установки системы этот параметр имеет значение 1.

PASSLENGTH

Минимальное количество символов в пароле. Сразу после установки системы этот параметр имеет значение 6.

Обратите внимание, что аргументы опций команды passwd (min, max и warn), а также соответствующие поля файла /etc/shadow задают параметры устаревания в днях; тогда как соответствующие поля файла /etc/default/passwd (MINWEEKS, MAXWEEKS и WARNWEEKS) - в неделях.

Просмотр базы данных учетных записей

Для просмотра базы данных учетных записей системы предназначена команда logins. Команда logins выдает информацию о пользовательских и системных регистрационных именах. Содержание выдаваемой информации управляется опциями команды и может включать: регистрационное имя, идентификатор пользователя, описание учетной записи в файле /etc/passwd (реальное имя пользователя или другая информация), имя основной группы, идентификатор основной группы, имена групп, идентификаторы групп, начальный каталог, начальный командный интерпретатор и четыре параметра устаревания пароля.

По умолчанию выдается следующая информация: регистрационное имя, идентификатор пользователя, имя основной группы, идентификатор основной группы и поле описания учетной записи в файле /etc/passwd. Результат сортируется по идентификатору пользователя, в результате чего сначала идут системные регистрационные имена, а затем - пользовательские.

Команда logins имеет следующий синтаксис:

logins [-dmopstuxa] [-g группы] [-l рег_имена]

Действие опций команды logins представлено в табл. 6.

Таблица 6. Опции команды logins

Опция Назначение
-d Выбирает регистрационные имена с дублирующимися идентификаторами пользователя.
-m Показывает все группы, к которым принадлежит пользователь.
-o Форматирует вывод в виде одной строки полей, разделенных двоеточиями.
-p Выбирает регистрационные имена без паролей.
-s Выбирает все системные регистрационные имена.
-t Сортирует результат по регистрационному имени, а не по идентификатору пользователя.
-u Выбирает все пользовательские регистрационные имена.
-x Выдает расширенную информацию о каждом выбранном пользователе. Эта расширенная информация включает начальный каталог, начальный командный интерпретатор и информацию об устаревании паролей, причем каждый элемент выдается в отдельной строке. Информация о пароле содержит статус пароля (PS при наличии пароля, NP при отсутствии пароля или LK для заблокированного регистрационного имени), дату последнего изменения пароля, количество дней, через которое потребуется изменить пароль, минимальное количество дней между изменениями и за сколько дней пользователь начнет получать (при регистрации) предупреждающее сообщение об устаревании пароля.
-a Добавляет к результату два поля, связанных с устареванием пароля. Они показывают, сколько дней пароль можно не использовать, перед тем как он автоматически деактивируется, и дату устаревания пароля.
-g Выбирает всех пользователей, принадлежащих указанной группе, сортируя список по идентификатору пользователя. Можно указывать несколько групп в виде списка через запятую.
-l Выбирает указанное регистрационное имя. Можно указывать несколько регистрационных имен в виде списка через запятую.

При совместном использовании нескольких опций будут показаны учетные записи, удовлетворяющие любому из критериев. При совместном использовании опций -l и -g информация о пользователе будет выдаваться один раз, даже если он принадлежит к нескольким указанным группам.

Получение списка зарегистрировавшихся пользователей

Для получения списка пользователей, работающих сейчас в системе, используется команда who со следующим синтаксисом:

/usr/bin/who [ -abdHlmpqrstTu ] [ файл ]
/usr/bin/who -q [ -n x ] [ файл ]
/usr/bin/who am i

Последний вариант выдает строку, соответствующую запрашивающему сеансу, и может использоваться для самоидентификации.

Утилита who выдает имя пользователя, терминал, время регистрации, время, прошедшее после последней выполненной команды, а также идентификатор процесса командного интерпретатора. Для получения этой информации она просматривает файл /var/adm/utmp. Если указан файл (который должен иметь формат utmp(4)), информация берется из него.

В общем случае, результат имеет следующий вид:

имя [состояние] терминал время [ожидание] [pid] [комментарий] [статус выхода]

где:

имя

регистрационное имя пользователя

состояние

возможность записи на терминал

терминал

имя терминала из каталога /dev

время

время регистрации пользователя

ожидание

время, прошедшее после последнего действия пользователя

pid

идентификатор процесса командного интерпретатора

комментарий

строка комментария из файла /etc/inittab (SVR4)

статус выхода

статус возврата для "мертвых" процессов

Опции команды who представлены в табл. 7.

Таблица 7. Опции команды who

Опция Назначение
-a Обрабатывает /var/adm/utmp или указанный файл с опциями -b, -d, -l, -p, -r, -t, -T и -u.
-b Выдает дату и время последней перезагрузки.
-d Выдает все процессы, прекращенные и не перезапущенные процессом init. Для "мертвых" процессов будет выдано поле статуса выхода. Это может пригодиться для выяснения причины прекращения процесса. Только для SVR4.
-H Выдает заголовки столбцов.
-l Выдает только терминалы, на которых система ожидает регистрации пользователей. В качестве имени для них выдается LOGIN. Остальные поля - такие же, как и для пользователей, но поле состояния не выводится.
-m Выдает информацию только о текущем терминале.
-n x Выдает по x пользователей в строке. Значение x должно быть не менее 1. Опция -n может использоваться только с опцией -q.
-p Выдает информацию об активных процессах, запущенных ранее процессом init. В поле имени выдается имя программы, запущенной процессом init в соответствии с файлом /sbin/inittab. Поля состояния, терминала и ожидания в этом случае не имеют смысла. Поле комментария показывает идентфикатор строки из файла /sbin/inittab, запустившей этот процесс. Только для SVR4.
-q (quick who) Выдает только имена и количество зарегистрированных пользователей. Если задана эта опция, другие опции игнорируются.
-r Показывает текущий уровень выполнения процесса init. Только для SVR4.
-s Выдает только поля имени, терминала и времени регистрации. Используется по умолчанию.
-T То же, что и опция -s, но также выдаются поля состояния, времени ожидания, pid и комментарий. В поле состояния выдается один из следующих символов:
+ терминал разрешает запись другим пользователям;
- терминал запрещает запись другим пользователям;
? возможность записи на терминал не определена.

Рассмотрим примеры выполнения команды who в ОС Solaris 8:

[kravchuk@arturo 09:40:03 /]$ who -a | more
   .       system boot  Фев 23 15:39
   .       run-level 3  Фев 23 15:39     3      0  S
rc2             .       Фев 23 15:41  old      84  id=  s2 term=0   exit=0
root     + console      Фев 27 21:34  0:28   4612       (:0)
rc3             .       Фев 23 15:41  old     359  id=  s3 term=0   exit=0
sac             .       Фев 23 15:41  old     411  id=  sc
LOGIN      console      Фев 23 15:41  0:28    428
panaslog        .       Фев 23 15:41  old     413  id=  e1
netwatch        .       Фев 25 12:02  old     415  id=  up term=15  exit=0
zsmon           .       Фев 23 15:41  old     423
informix + pts/1        Мар 25 10:13 15:21   1796       (khomjak.profix.com)
eugene   + pts/3        Мар 22 18:23 15:24  23392       (khomjak.profix.com)
serj     + pts/4        Мар 18 10:41  old   13278       (sysadm.profix.com)
serj     + pts/15       Мар 25 11:32 14:51   3004       (sysadm.profix.com)
kravchuk + pts/14       Мар 26 09:39   .    11615       (creator.profix.com)
slavik   + pts/2        Мар 21 14:18 16:13  14526       (slavik.profix.com)
informix + pts/17       Мар 21 13:19 17:50  14012       (bachin.profix.com)
informix   pts/6        Мар 25 18:34 15:05   3572  id=t800 term=0   exit=0
(lyapota.profix.com)
lyapota    pts/7        Мар 25 18:34 17:58   3577  id=t900 term=0   exit=0
(lyapota.profix.com)
informix + pts/5        Мар  5 14:48 15:33  27664       (slavik.profix.com)
kravchuk   pts/8        Мар 25 18:24 15:15   8916  id=tB00 term=0   exit=0
--More--

В простейшем случае программа who вызывается без параметров:

[kravchuk@arturo 09:45:35 /]$ who
root       console      Фев 27 21:34    (:0)
informix   pts/1        Мар 25 10:13    (khomjak.profix.com)
eugene     pts/3        Мар 22 18:23    (khomjak.profix.com)
serj       pts/4        Мар 18 10:41    (sysadm.profix.com)
serj       pts/15       Мар 25 11:32    (sysadm.profix.com)
kravchuk   pts/14       Мар 26 09:39    (creator.profix.com)
slavik     pts/2        Мар 21 14:18    (slavik.profix.com)
informix   pts/17       Мар 21 13:19    (bachin.profix.com)
informix   pts/5        Мар  5 14:48    (slavik.profix.com)
root       pts/13       Фев 27 21:35    (:0.0)
root       pts/16       Мар 25 17:24    (:0.0)

Наконец, вот как используется команда who для самоидентификации:

[kravchuk@arturo 09:45:38 /]$ who am i
kravchuk   pts/14       Мар 26 09:39    (creator.profix.com)

Средства создания, изменения и удаления учетных записей пользователей

Поскольку база данных учетных записей организована в виде обычных текстовых файлов, основные задачи управления учетными записями могут решаться с помощью обычного текстового редактора, например, vi. Однако поскольку при этом требуется согласованное изменение нескольких файлов, в системе для управления учетными записями предлагается ряд утилит командной строки, средства на основе меню или на основе графического пользовательского интерфейса.

Для создания, изменения и удаления учетных записей все версии ОС UNIX предлагают три команды, useradd, usermod и userdel, соответственно. Они в большинстве систем имеют следующий синтаксис:

useradd [-u идентификатор [-o] [-i]] [-g группа]
   [-G группа[[,группа]...]] [-d каталог] [-s shell]
   [-c комментарий] [-m [-k skel_dir]] [-f inactive]
   [-e expire] рег_имя

usermod [-u идентификатор [-o]] [-g группа]
   [-G группа[[,группа]...]] [-d каталог [-m]]
   [-s shell] [-c комментарий] [-l новое_рег_имя]
   [-f inactive] [-e expire] рег_имя

userdel [-r] рег_имя

Эти команды позволяют выполнить только согласованные и допустимые изменения в файлах /etc/passwd, /etc/shadow и /etc/group. Команды управления учетными записями, в общем случае, может выполнять только пользователь root. Основные опции команд управления учетными записями представлены в табл. 8.

Таблица 8. Основные опции команд управления учетными записями

Опция Назначение
-u идентификатор Идентификатор пользователя (UID). Должен быть неотрицательным целым числом, не превосходящим MAXUID, определенный в sys/param.h. По умолчанию используется следующий доступный (уникальный) не устаревший UID в диапазоне пользовательских идентификаторов.
-o Эта опция позволяет продублировать UID (сделать его не уникальным). Поскольку защита системы в целом, а также целостность контрольного журнала (audit trail) и регистрационной информации (accounting information) в частности, зависит от однозначного соответствия каждого UID определенному физическому лицу, использовать эту опцию не рекомендуется.
-i Позволяет использовать устаревший идентификатор UID.
-g группа Целочисленный идентификатор или символьное имя существующей группы. Эта опция задает основную группу (primary group) для нового пользователя. По умолчанию в SVR4 используется стандартная группа, указанная в файле /etc/default/useradd. В ОС FreeBSD и Linux обычно принято по умолчанию создавать для каждого пользователя отдельную приватную основную группу, имя которой совпадает с именем пользователя.
-G группа[[,группа] ...] Один или несколько элементов в списке через запятую, каждый из которых представляет собой целочисленный идентификатор или символьное имя существующей группы. Этот список определяет принадлежность к дополнительным группам (supplementary group membership) для пользователя. Повторения игнорируются. Количество элементов в списке не должно превосходить NGROUPS_MAX-1, поскольку общее количество дополнительных групп для пользователя плюс основная группа не должно превосходить NGROUPS_MAX.
-d каталог Начальный каталог (home directory) нового пользователя. Длина этого поля не должна превосходить определенного предела (обычно - от 256 до 1024 символов). По умолчанию используется HOMEDIR/рег_имя, где HOMEDIR - базовый каталог для начальных каталогов новых пользователей, а рег_имя - регистрационное имя нового пользователя.
-s shell Полный путь к программе, используемой в качестве начального командного интерпретатора для пользователя сразу после регистрации. Длина этого поля не должна превосходить определенного предела (обычно - от 256 до 1024 символов). По умолчанию в этом поле используется стандартный командный интерпретатор /bin/sh. В качестве значения shell должен быть указан существующий выполняемый файл. В противном случае, пользователь не сможет зарегистрироваться в системе.
-c комментарий Любая текстовая строка. Обычно, это краткое описание регистрационного имени, например, фамилия и имя реального пользователя. Эта информация хранится в записи пользователя в файле /etc/passwd. Длина этого поля не должна превосходить 128 символов.
-m Создает начальный каталог нового пользователя, если он еще не существует. Если каталог уже существует, добавляемый пользователь должен иметь права на доступ к указанному каталогу.
-k skel_dir Копирует содержимое скелетного каталога skel_dir в начальный каталог нового пользователя, вместо содержимого стандартного скелетного каталога, /etc/skel. Каталог skel_dir должен существовать. Стандартный скелетный каталог содержит стандартные файлы, определяющие среду работы пользователя. Заданный администратором каталог skel_dir может содержать аналогичные файлы и каталоги, созданные для определенной цели.
-f inactive Максимально допустимое количество дней между регистрациями, когда это имя еще не объявляется недействительным. Обычно в качестве значений используются положительные целые числа.
-e expire Дата, начиная с которой регистрационное имя больше нельзя будет использовать; после этой даты никакой пользователь не сможет получить доступ под этим регистрационным именем. (Эта опция удобна при создании временных регистрационных имен.) Вводить значение аргумента expire (представляющего собой дату) можно в любом поддерживаемом локалью формате (кроме Julian date). Например, можно ввести 10/6/99 или October 6, 1999.
-l новое_рег_имя Строка печатных символов, задающая новое регистрационное имя для пользователя. Она не должна содержать двоеточий (:) и переводов строк (\n). Кроме того, она не должна начинаться с прописной буквы.
-r При удалении учетной записи удалить начальный каталог пользователя из системы. Этот каталог должен существовать. После успешного выполнения команды файлы и подкаталоги в начальном каталоге будут недоступны.
рег_имя Строка печатных символов, задающая регистрационное имя для нового пользователя. В ней не должно быть двоеточий (:) и символов перевода строки (\n). Она также не должна начинаться с прописной буквы.

Учтите, что вновь созданная учетная запись блокируется до тех пор, пока не будет выполнена команда passwd, задающая пароль новому пользователю.

Рассмотрим ряд простых примеров управления учетными записями:

# useradd -с "Student 1" -d /home/user01 -g ixusers -m -s /bin/bash user01
# usermod -с "Student 1 of UNIX Course" -G others -s /bin/ksh user01
# userdel -r user01

Средства создания, изменения и удаления групп

Для создания, изменения и удаления групп все версии ОС UNIX предлагают три команды, groupadd, groupmod и groupdel, соответственно. Они имеют следующий синтаксис:

groupadd [-g идентификатор [-o]] группа
groupmod [-g идентификатор [-o]] [-n имя] группа
groupdel группа

Эти команды позволяют выполнить только согласованные и допустимые изменения в файле /etc/group. Команды управления группами, в общем случае, может выполнять только пользователь root. Опции и операнды команд управления группами представлены в табл. 9.

Таблица 9. Опции команд управления группами

Опция Назначение
-g идентификатор Идентификатор новой группы (GID). Этот идентификатор группы должен быть неотрицательным десятеричным целым числом, не превышающим значения MAXUID, определенного в заголовочном файле <param.h>. По умолчанию выделяется уникальный идентификатор группы, не относящийся к зарезервированным. В UNIX SVR4 идентификаторы групп в диапазоне 0-100 зарезервированы.
-o Эта опция позволяет задавать дублирующийся (не уникальный) идентификатор группы.
-n имя Строка печатных символов, задающая новое имя для группы при изменении. Строка не должна содержать двоеточия (:) или переводы строк (\n).
группа Имя создаваемой, изменяемой или удаляемой группы. Имя группы не должно содержать символы двоеточия (:) или перевода строки (\n).

Учтите, что при удалении группы просто удаляется строка из файла /etc/group. Никакие изменения в файловой системе и в учетных записях пользователей команды groupmod и groupdel не производят. Соответствующие действия по согласованию, при необходимости, должен выполнять системный администратор - пользователь root.

Рассмотрим ряд простых примеров управления группами:

# groupadd -g 101 informix
# groupmod -g 102 -o -n ixusers informix
# groupdel ixusers
Комментарии: (0) | UNIX | 2006-04-04

Основы операционной системы UNIX - 04. Файлы и каталоги.

Основы операционной системы UNIX - 04. Файлы и каталоги

Операционная система выполняет две основные задачи: манипулирование данными и их хранение. Большинство программ в основном манипулирует данными, но, в конечном счете, они где-нибудь хранятся. В системе UNIX таким местом хранения является файловая система. Более того, в UNIX все устройства, с которыми работает операционная система, также представлены в виде специальных файлов в файловой системе.

Понятие логической файловой системы

Логическая файловая система в ОС UNIX (или просто файловая система) - это иерархически организованная структура всех каталогов и файлов в системе, начинающаяся с корневого каталога. Файловая система UNIX обеспечивает унифицированный интерфейс доступа к данным, расположенным на различных носителях, и к периферийным устройствам. Логическая файловая система может состоять из одной или нескольких физических файловых (под)систем, являющихся разделами физических носителей (дисков, CD-ROM или дискет).

Файловая система контролирует права доступа к файлам, выполняет операции создания и удаления файлов, а также выполняет запись/чтение данных файла. Поскольку большинство прикладных функций выполняется через интерфейс файловой системы, следовательно, права доступа к файлам определяют привилегии пользователя в системе.

Файловая система обеспечивает перенаправление запросов, адресованных периферийным устройствам, соответствующим модулям подсистемы ввода-вывода.

Ориентация и навигация в файловой системе

Иерархическая структура файловой системы UNIX упрощает ориентацию в ней. Каждый каталог, начиная с корневого (/), в свою очередь, содержит файлы и другие каталоги (подкаталоги). Каждый каталог содержит также ссылку на родительский каталог (для корневого каталога родительским является он сам), представленную каталогом с именем две точки (..) и ссылку на самого себя, представленную каталогом с именем точка (.).

Каждый процесс имеет текущий каталог. Сразу после регистрации текущим каталогом пользователя (на самом деле, процесса - начальной программы, обычно, командного интерпретатора) становится начальный каталог, указанный в файле /etc/passwd.

Каждый процесс может сослаться (назвать) на любой файл или каталог в файловой системе по имени. Способам задания имен файлов посвящен следующий подраздел.

Имена файлов в ОС UNIX

В ОС UNIX поддерживается три способа указания имен файлов:

  • Краткое имя. Имя, не содержащее специальных метасимволов косая черта (/), является кратким именем файла. По краткому имени можно сослаться на файлы текущего каталога. Например, команда ls -l .profile требует получить полную информацию о файле .profile в текущем каталоге.
  • Относительное имя. Имя, не начинающееся с символа косой черты (/), но включающее такие символы. Оно ссылается на файл относительно текущего каталога. При этом для ссылки на файл или каталог в каком-то другом каталоге используется метасимвол косой черты (/). Например, команда ls -l ../.profile требует получить полную информацию о файле .profile в родительском каталоге текущего каталога, а команда vi doc/text.txt требует открыть в редакторе vi файл text.txt в подкаталоге doc текущего каталога.
  • Полное имя. Имя, начинающееся с символа косой черты (/). Оно ссылается на файл относительно корневого каталога. Это имя еще называют абсолютным, так как оно, в отличие от предыдущих способов задания имени, ссылается на один и тот же файл независимо от текущего каталога. Например, команда ls -l /home/user01/.profile требует получить полную информацию о файле .profile в каталоге /home/user01 независимо от того, в каком каталоге выполняется.

Другие символы, кроме косой черты, не имеют в именах файлов UNIX особого значения (это не метасимволы). В частности, нет системного понятия расширения файла.

В ОС UNIX нет теоретических ограничений на количество вложенных каталогов. Тем не менее, в каждой реализации имеются практические ограничения на максимальную длину имени файла, которое указывается в командах (как и на длину командной строки в целом). Оно задается константой PATH_MAX в заголовочном файле /usr/include/limits.h. Так, в ОС Solaris 8 имя файла не может быть длиннее 1024 символов.

Получение информации о текущем каталоге

Команда pwd выдает полное имя текущего (рабочего) каталога. Команда pwd не имеет параметров. Вот пример ее использования:

$ pwd
/home/user01
$

Изменение текущего каталога

Для изменения текущего каталога используется команда cd:

cd [каталог]

Если каталог не указан, используется значение переменной среды $HOME (обычно это начальный каталог пользователя). Чтобы сделать новый каталог текущим (войти в каталог), нужно иметь для него право на выполнение. Команда cd является встроенной командой интерпретатора и использует для изменения текущего каталога соответствующий системный вызов.

Рассмотрим пример совместного использования команд cd и pwd для переходов по каталогам файловой системы:

$ pwd
/home/user01
$ cd ..
$ pwd
/home
$ cd user01/tmp
$ pwd
/home/user/tmp
$ cd
$ pwd
/home/user01

Получение информации о файлах

Для просмотра информации о типах (и других атрибутах) файлов в ОС UNIX используется команда ls со следующим синтаксисом:

ls [-abCcdeFfgiLlmnopqRrstux1] [файл ...]

Команда ls выдает информацию об указанных файлах или о файлах и каталогах в текущем каталоге (если файл не задан). Формат и подробность выдаваемой информации зависит от опций. Основные опции команды ls представлены в табл. 10:

Таблица 10. Основные опции команды ls

Опция Назначение
-a Выдает все файлы и подкаталоги, включая те, имена которых начинаются с точки (.). По умолчанию такие файлы не выдаются (они считаются скрытыми).
-F Добавляет к имени файла суффикс, показывающий его тип (см. следующий раздел). Помечает каталоги косой чертой (/), выполняемые файлы - звездочкой (*), именованные каналы (FIFO) - вертикальной чертой (|), символические связи - "собакой" (@), а сокеты - знаком равенства (=).
-i Для каждого файла выдает в первом столбце листинга номер индексного дескриптора (i-node). Об индексных дескрипторах см. в разделе, посвященном физическим файловым системам UNIX.
-l Выдает длинный листинг, включающий права доступа, количество связей, владельца, группу, размер в байтах, время последнего изменения каждого файла и, естественно, имя файла. Если файл является специальным файлом устройства, вместо размера выдаются главный и второстепенный номера устройства. Если с момента последнего изменения прошло более 6 месяцев, оно обычно выдается в формате 'месяц день год'. Для файлов, измененных позднее, чем 6 месяцев назад, время выдается в формате 'месяц день время'. Если файл является символической связью, в длинном листинге после имени файла указывается стрелочка (->) и имя файла, на который связь ссылается.
-r Изменяет порядок сортировки на обратный стандартному (обратный лексикографический или сначала самые старые файлы, в зависимости от других опций).
-R Рекурсивно выдает содержимое подкаталогов.
-t Сортирует листинг по временной отметке (сначала - самые новые), а не по имени файла. По умолчанию используется время последнего изменения. (Опции -u и -c позволяют сортировать по времени последнего обращения и времени создания, соответственно.)

Как видно из синтаксиса, можно задавать одновременно несколько опций. Вот как можно посмотреть подробную информацию о файлах в каталоге /tmp, начиная с самых давно изменявшихся:

[kravchuk@arturo 14:28:07 /tmp]$ cd /tmp
[kravchuk@arturo 14:28:07 /tmp]$ ls -lrt
-rw-rw-r--   1 root     sys         8296 Фев 23 15:39 ps_data
drwx------   2 root     root         110 Фев 23 15:41 smc898
-rw-rw----   1 root     informix       0 Фев 23 18:53 bar_dbug.log
drwxr-xr-x   2 informix informix     115 Фев 24 13:05 txt
-rw-------   1 root     other          0 Фев 25 13:50 mpQ1aGEp
-rw-------   1 remisov  software       0 Фев 25 15:03 mpwsaWPr
-rw-------   1 remisov  software       0 Фев 25 15:37 mpOFaqZs
-rw-------   1 remisov  software       0 Фев 25 16:25 mppfaa.t
-rw-------   1 remisov  software       0 Фев 26 13:30 mpUCaGDG
-rw-------   1 remisov  software       0 Фев 26 14:25 mpRfaaSI
-rw-------   1 remisov  software       0 Фев 26 16:41 mpCJaqUL
-rw-------   1 remisov  software       0 Фев 26 16:56 mpUgaatM
-rw-------   1 remisov  software       0 Фев 26 17:01 mpYua4AM
-rw-r--r--   1 informix informix     565 Фев 27 17:27 mkdb1994.err
-rw-r--r--   1 informix informix    2062 Фев 27 17:29 mkdb2003.err
-rw-------   1 root     other     314872 Фев 27 21:35 dtdbcache_:0
-rw-r--r--   1 root     other          0 Фев 27 21:35 sdtvolcheck4684
...

Основным форматом результатов ls является так называемый длинный листинг (задаваемый опцией -l). По умолчанию выдаются только имена файлов в несколько столбцов:

[kravchuk@arturo 14:31:40 /tmp]$ cd /
[kravchuk@arturo 14:31:47 /]$ ls
INFORMIXTMP   dev           home          opt           sbin
INFORMIXTMP9  devices       kernel        opt.orig      tmp
TT_DB         dt            lib           platform      usr
bin           etc           lost+found    prj           var
boot          export        mnt           proc          vol
cdrom         fs            net           root          xfn
[kravchuk@arturo 14:31:48 /]$

Часто также используется опция -F:

[kravchuk@arturo 14:31:48 /]$ ls -F
INFORMIXTMP/   dev/           home/          opt@           sbin/
INFORMIXTMP9/  devices/       kernel/        opt.orig/      tmp/
TT_DB/         dt/            lib@           platform/      usr/
bin@           etc/           lost+found/    prj@           var/
boot/          export/        mnt/           proc/          vol/
cdrom/         fs/            net/           root/          xfn/

Многочисленные примеры использования и результатов выполнения команды ls представлены в следующих разделах.

Типы файлов

В UNIX существует несколько типов файлов, различающихся по функциональному назначению и действиям операционной системы при выполнении тех или иных операций над ними. В следующих подразделах кратко представлены основные типы файлов, их признаки в длинных листингах, а также способы их создания.

Обычный файл

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

В длинном листинге признаком обычного файла является дефис (-) в первой позиции первого столбца:

-rw-rw-r--   1 root     sys         8296 Фев 23 15:39 ps_data

Обычные файлы создаются текстовыми редакторами (текстовые), компиляторами (двоичные), прикладными программами с помощью соответствующего системного вызова или путем перенаправления вывода:

[kravchuk@arturo 14:40:01 /]$ cd /tmp
[kravchuk@arturo 14:40:04 /tmp]$ >f1.txt
[kravchuk@arturo 14:40:09 /tmp]$ ls -l f1.txt
-rw-r--r--   1 kravchuk 50             0 Мар 26 14:40 f1.txt

Каталог

С помощью каталогов формируется логическое дерево файловой системы. Каталог - это файл, содержащий имена находящихся в нем файлов, а также указатели на дополнительную информацию - метаданные, позволяющие операционной системе производить действия с этими файлами. Каталоги определяют положение файла в дереве файловой системы. Любой процесс, имеющий право на чтение каталога, может прочесть его содержимое, но только ядро имеет право на запись данных каталога.

В длинном листинге признаком каталога является символ d в первой позиции первого столбца:

drwxr-xr-x   2 informix informix     115 Фев 24 13:05 txt

Каталоги создаются командой mkdir:

mkdir каталог ...

Специальный файл устройства

Обеспечивает доступ к физическим устройствам. В UNIX различают символьные (character special device) и блочные (block special device) файлы устройств. Доступ к устройствам осуществляется путем открытия, чтения и записи в специальный файл устройства.

Символьные файлы устройств используются для небуферизованного обмена данными с устройством. Блочные файлы устройств позволяют производить обмен данными в виде пакетов фиксированной длины - блоков.

В длинном листинге признаком специального символьного и блочного устройств являются символы с и b в первой позиции первого столбца, соответственно:

$ cd /devices/pci@0,0/pci-ide@7,1/ide@0
$ ls -l | more
total 0
crw-------   1 root     sys       77,  0 Фев 14 14:03 nv@0,0:0
brw-r-----   1 root     sys       29,  0 Апр 20  2001 sd@0,0:a
crw-r-----   1 root     sys       29,  0 Апр 20  2001 sd@0,0:a,raw
brw-r-----   1 root     sys       29,  1 Апр 20  2001 sd@0,0:b
crw-r-----   1 root     sys       29,  1 Апр 20  2001 sd@0,0:b,raw
brw-r-----   1 root     sys       29,  2 Апр 20  2001 sd@0,0:c
crw-r-----   1 root     sys       29,  2 Апр 20  2001 sd@0,0:c,raw
...

Специальные файлы устройство создаются командой mknod:

mknod имя b главный_номер второстепенный_номер
mknod имя c главный_номер второстепенный_номер

Главный номер устройства задает драйвер (индекс в таблице драйверов системы), или тип устройства, а второстепенный - экземпляр устройства.

Создавать специальные файлы устройств обычно может только пользователь root. Вот как можно создать новый специальный файл устройства для одного из представленных в листинге выше устройств:

# mknod slice1 b 29 1
# ls -l slice1
brw-r-----   1 root     sys       29,  1 Мар 25  2001 slice1

FIFO - именованный канал

Этот файл используется для связи между процессами по принципу очереди. Именованные каналы впервые появились в UNIX System V, но большинство современных систем поддерживают этот механизм.

В длинном листинге признаком именованного канала является символ p в первой позиции первого столбца:

[kravchuk@arturo 15:20:46 /tmp]$ find / -type p -print 2>/dev/null
/var/spool/lp/fifos/FIFO
/etc/cron.d/FIFO
/etc/saf/zsmon/_pmpipe
/etc/saf/_sacpipe
/etc/saf/_cmdpipe
/etc/initpipe
/etc/utmppipe
^C
[kravchuk@arturo 15:22:29 /tmp]$ ls -l /etc/cron.d/FIFO
prw-------   1 root     root           0 Фев 23 15:41 /etc/cron.d/FIFO

Именованные каналы создаются командой mknod:

mknod имя p

Например:

[kravchuk@arturo 15:27:17 /tmp]$ mknod p1 p
[kravchuk@arturo 15:27:18 /tmp]$ ls -l p* >p1 & cat p1
[2] 22380
prw-r--r--   1 kravchuk 50             0 Мар 26 15:17 p1
-rw-rw-r--   1 root     sys         8296 Фев 23 15:39 ps_data
[2]-  Done                    ls -l p* >p1
[kravchuk@arturo 15:27:22 /tmp]$

Связь

Каталог содержит имена файлов и указатели на их метаданные. Такая архитектура позволяет одному файлу иметь несколько имен в файловой системе. Имена жестко связаны с метаданными и, соответственно, с данными файла, в то время как сам файл существует независимо от того, как его называют в файловой системе.

Стандарт POSIX (Portable Operating System Interface) требует реализовать поддержку двух типов связей - жестких и символических. Жесткой связью (hard link) считается элемент каталога, указывающий непосредственно на некоторый индексный дескриптор. Жесткие связи очень эффективны, но у них существуют определенные ограничения, так как они могут создаваться только в пределах одной физической файловой системы. Когда создается такая связь, связываемый файл должен уже существовать. Кроме того, каталоги не могут связываться жесткой связью.

Символическая связь (symbolic link) - это специальный файл, который содержит путь к другому файлу. Указание на то, что данный элемент каталога является символической связью, находится в индексном дескрипторе. Поэтому обычные команды доступа к файлу вместо получения данных из физического файла, берут их из файла, имя которого приведено в связи. Этот путь может указывать на что угодно: это может быть каталог, он может даже находиться в другой физической файловой системе, более того, указанного файла может и вовсе не быть.

Некоторые системы накладывают ограничение на количество символических связей в пути. POSIX требует, чтобы их поддерживалось не менее 20, но действительное значение зависит от конкретной реализации. Конечно, в описании пути можно использовать сочетание символических и жестких связей.

Количество жестких связей файла (а также количество файлов в каталоге, если файл является каталогом) отображается во втором поле длинного листинга:

[kravchuk@arturo 15:27:22 /tmp]$ ls >f2.txt
[kravchuk@arturo 15:37:22 /tmp]$ ln f3.txt f2.txt
ln: cannot access f3.txt
[kravchuk@arturo 15:37:31 /tmp]$ ln f2.txt f3.txt
[kravchuk@arturo 15:37:59 /tmp]$ ls -l f?.txt
-rw-r--r--   1 kravchuk 50             0 Мар 26 14:40 f1.txt
-rw-r--r--   2 kravchuk 50           643 Мар 26 15:37 f2.txt
-rw-r--r--   2 kravchuk 50           643 Мар 26 15:37 f3.txt
[kravchuk@arturo 15:38:05 /tmp]$

В этом примере мы создали текстовый файл с листингом текущего каталога, а затем создали на него жесткую связь. Для этого используется команда ln со следующим синтаксисом:

ln [ -fns ] исходный_файл [ цель ]
ln [ -fns ] исходный_файл ... цель

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

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

Опции -f и -n требуют, соответственно, принудительно создать связь или не создавать ее, если цель задает существующий файл.

Обратите внимание, что первый аргумент команды ln должен указывать существующий файл или каталог.

В длинном листинге признаком символической связи является символ l в первой позиции первого столбца. Рассмотрим простой пример создания символической связи:

[kravchuk@arturo 15:57:41 /tmp]$ ln -s f2 f4
[kravchuk@arturo 15:57:50 /tmp]$ ls -l f*
-rw-r--r--   1 kravchuk 50             0 Мар 26 14:40 f1.txt
-rw-r--r--   2 kravchuk 50           643 Мар 26 15:37 f2.txt
-rw-r--r--   2 kravchuk 50           643 Мар 26 15:37 f3.txt
lrwxrwxrwx   1 kravchuk 50             2 Мар 26 15:57 f4 -> f2

Сокет

Сокеты позволяют представить в виде файла в логической файловой системе сетевое соединение. Создание сокетов выходит за пределы данного курса, хотя понятно, что для этого ядро предлагает соответствующий системный вызов.

В длинном листинге признаком сокета является символ s в первой позиции первого столбца. Вот какие сокеты можно найти в Solaris 8:

[kravchuk@arturo 15:38:05 /tmp]$ find / -type s -print 2>/dev/null
/var/spool/prngd/pool
/tmp/.X11-unix/X0
^C
[kravchuk@arturo 15:41:54 /tmp]$ ls -l /var/spool/prngd/pool
srwxrwxrwx   1 root     other          0 Мар 14 11:25 /var/spool/prngd/pool

Определение типа файла

Для более точного определения типа файла (например, если файл двоичный, какой программой он мог быть создан) используется команда file со следующим синтаксисом:

file [ -h ] [ -m файл_сигнатур ] [ -f файл_списка ] файл...
file [ -h ] [ -m файл_сигнатур ] -f файл_списка
file -c [ -m файл_сигнатур ]

Утилита file выполняет ряд проверок каждого из указанных файлов и всех файлов, указанных в файле_списка, если он задан, пытаясь проклассифицировать файлы. Если файл не является обычным, выдается его тип. Если же обычный файл имеет нулевую длину, он классифицируется как пустой (empty).

Если файл является текстовым, команда file проверяет первых 512 байтов и пытается определить, на каком языке программирования написан файл. Если файл является символической связью, происходит проверка и классификация файла, на который связь указывает.

При определении типа файла используется файл сигнатур. Стандартный файл сигнатур - /etc/magic. В нем хранятся числа или строки, показывающие тип файла:

0       string          PKем он сбрасывается. Значение этого бита при
            установке пользователем root зависит от версии ОС и
            иногда необходимо. Так, в ОС Solaris необходимо устанавливать
            клейкий бит для обычных файлов, используемых в качестве
            области подкачки.
        

Установка клейкого бита для каталога означает, что файл в этом каталоге может быть удален или переименован только в следующих случаях:

  • пользователем-владельцем файла;
  • пользователем-владельцем каталога;
  • если файл доступен пользователю на запись;
  • пользователем root.

Для расчета прав доступа необходимо сложить восьмеричные значения всех необходимых установленных битов. В результате получится четырехзначное восьмеричное число. Если старший разряд имеет значение 0, его можно не указывать.

Например, если необходимо задать права доступа на чтение, запись и выполнение для владельца, на чтение и выполнение для группы и на выполнение для всех остальных пользователей, получаем следующее восьмеричное значение:

Чтение для владельца: 0400
Запись для владельца: 0200
Выполнение для владельца: 0100
Чтение для группы: 0040
Выполнение для группы: 0010
Выполнение для прочих: 0001
Сумма: 0751

Итак, соответствующие права доступа - 751. В длинном листинге эти права будут представлены в виде "-rwxr-x--x" (при "сложении" буквы с дефисом в символьном представлении остается буква).

Изменение прав доступа к файлу

Для установки (изменения) прав доступа к файлу используется команда chmod. Она имеет следующий синтаксис:

chmod [ -fR ] абсолютные_права файл ...
chmod [ -fR ] символьное_изменение_прав файл ...

Команда chmod устанавливает права доступа к указанным файлам. Права доступа к файлу может изменять или устанавливать только его владелец или пользователь root. Опция -f означает, что команда не будет сообщать о невозможности установки прав доступа. Опция -R означает, что заданное изменение прав доступа будет применяться рекурсивно для всех подкаталогов, указанных в списке файлов.

Абсолютные права доступа задаются восьмеричным числом, расчет которого (в соответствии с табл. 11) описан в предыдущем разделе. Описанию синтаксиса, используемого для задания символьного изменения прав доступа, посвящен следующий подраздел.

Символьное представление изменения прав доступа

Символьное изменение прав доступа задается в виде списка, через запятую, выражений следующего вида:

[пользователи] оператор [права]

Компонент пользователи определяет, для кого задаются или изменяются права. Он может иметь значения u, g, o и a, задающие изменения прав для владельца, группы, прочих пользователей и всех категорий пользователей. Если пользователи не указаны, права изменяются для всех категорий пользователей. Однако при этом не переопределяются установки, задаваемые маской создания файлов ( umask).

Компонент оператор может иметь значения +, - или =, означающие добавление, отмену права доступа и установку в точности указанных прав, соответственно. Если после оператора = права не указаны, все права доступа для соответствующих категорий пользователей отменяются.

Компонент права задается в виде любой совместимой комбинации следующих символов:

r

право на чтение

w

право на запись

x

право на выполнение

l

блокирование изменения прав доступа

s

выполнение с эффективным идентификатором владельца или группы-владельца

t

клейкий бит

Не все сочетания символов для компонента пользователи и компонента права допустимы. Так, s можно задавать только для u или g, а t - только для u. Права x и s не совместимы с l и т.д.

Изменения прав доступа в списке выполняются последовательно, в порядке их перечисления.

Рассмотрим пример изменения прав доступа:

[kravchuk@arturo 10:51:43 /]$ cd /tmp
[kravchuk@arturo 10:51:46 /tmp]$ >f1.txt
[kravchuk@arturo 10:52:01 /tmp]$ chmod +w f1.txt
[kravchuk@arturo 10:52:13 /tmp]$ ls -l *.txt
-rw-r--r--   1 kravchuk 50             0 Мар 27 10:52 f1.txt
[kravchuk@arturo 10:52:17 /tmp]$ chmod a+w f1.txt
[kravchuk@arturo 10:52:32 /tmp]$ ls -l *.txt
-rw-rw-rw-   1 kravchuk 50             0 Мар 27 10:52 f1.txt
[kravchuk@arturo 10:52:33 /tmp]$ chmod u+x,g=x,o= f1.txt
[kravchuk@arturo 10:53:18 /tmp]$ ls -l *.txt
-rwx--x---   1 kravchuk 50             0 Мар 27 10:52 f1.txt
[kravchuk@arturo 10:53:20 /tmp]$ chmod ug-x,og+r,u=rwx f1.txt
[kravchuk@arturo 10:54:46 /tmp]$ ls -l *.txt
-rwxr--r--   1 kravchuk 50             0 Мар 27 10:52 f1.txt
[kravchuk@arturo 10:55:15 /tmp]$ chmod 644 f1.txt
[kravchuk@arturo 10:55:23 /tmp]$ ls -l *.txt
-rw-r--r--   1 kravchuk 50             0 Мар 27 10:52 f1.txt

Рассмотрим еще один пример, показывающий значение и изменение прав доступа к каталогу:

[kravchuk@arturo 11:05:38 /tmp]$ ls -l | grep d1
drw-r--r--   2 kravchuk 50           108 Мар 26 17:39 d1
[kravchuk@arturo 11:05:47 /tmp]$ cd d1
bash: cd: d1: Permission denied
[kravchuk@arturo 11:05:57 /tmp]$ chmod 744 d1
[kravchuk@arturo 11:06:26 /tmp]$ cd d1
[kravchuk@arturo 11:06:27 /tmp/d1]$ cd ..
[kravchuk@arturo 11:06:39 /tmp]$ chmod -w d1
[kravchuk@arturo 11:06:51 /tmp]$ cd d1
[kravchuk@arturo 11:06:58 /tmp/d1]$ ls
f3.txt
[kravchuk@arturo 11:06:59 /tmp/d1]$ rm f3.txt
rm: f3.txt not removed: Permission denied

Установка режима создания файла

Новый файл создается с правами доступа, определяемыми пользовательской маской режима создания файлов. Команда umask (встроенная команда интерпретатора) присваивает пользовательской маске режима создания файлов указанное восьмеричное значение. Три восьмеричные цифры соответствуют правам на чтение/запись/выполнение для владельца, членов группы и прочих пользователей, соответственно.

Команда umask имеет следующий синтаксис:

umask [ -S ] [ маска ]

Если параметры не указаны, команда umask выдает текущее значение маски. По умолчанию, значение выдается и задается в восьмеричном виде как число, которое необходимо "вычесть" из максимальных прав доступа (777 для выполняемых файлов, которые создаются компиляторами, и 666 для обычных файлов):

[kravchuk@arturo 11:22:55 /tmp/d1]$ umask
022

При такой маске обычные текстовые файлы будут создаваться с правами 666 - 022 = 644:

[kravchuk@arturo 11:33:43 /tmp]$ >f5.txt
[kravchuk@arturo 11:33:48 /tmp]$ ls -l f5*
-rw-r--r--   1 kravchuk 50             0 Мар 27 11:33 f5.txt

Операция "вычитания" для значения маски формально выполняется как побитовое логическое И дополнения маски и максимальных прав доступа. Рассмотрим пример расчета:

Двоичное значение маски: 000010010
Дополнение маски: 111101101
Максимальное значение прав: 110110110
Логическое И предыдущих двух строк: 110100100
Результирующие биты прав: 110100100 (644)

Для выполняемых файлов, создаваемых, например, компилятором языка C:

Двоичное значение маски: 000010010
Дополнение маски: 111101101
Максимальное значение прав: 111111111
Логическое И предыдущих двух строк: 111101101
Результирующие биты прав: 111101101 (755)

Опция -S требует выдавать маску в символьном виде, показывая, какие биты прав доступа будут установлены у создаваемого файла (также с учетом того, создается ли выполняемый или обычный текстовый файл):

[kravchuk@arturo 11:23:00 /tmp/d1]$ umask -S
u=rwx,g=rx,o=rx

Команду umask целесообразно включить в файлы начального запуска, задающие среду для начального командного интерпретатора.

Рассмотрим еще один пример создания файла при другом значении маски:

[kravchuk@arturo 11:33:52 /tmp]$ umask 257
[kravchuk@arturo 11:41:39 /tmp]$ umask -S
u=rx,g=w,o=
[kravchuk@arturo 11:41:43 /tmp]$ >f6.txt
[kravchuk@arturo 11:41:55 /tmp]$ ls -l f6*
-r---w----   1 kravchuk 50             0 Мар 27 11:41 f6.txt

Изменение принадлежности файла

Владелец файла, а также пользователь root может изменять владельца и группу-владельца файла. Для изменения владельца (и группы-владельца) файла используется команда chown со следующим синтаксисом:

chown [-h][-R] владелец[:группа] файл ...

Опция -h требует изменять владельца файла, на который указывает символическая связь, а не самой связи, как происходит по умолчанию. Опция -R требует рекурсивно изменить владельца во всех подкаталогах.

Для изменения только группы, владеющей файлом, используется команда chgrp:

chgrp [-h][-R] группа файл ...

Ее опции аналогичны команде chown.

Учтите, что после передачи файла другому владельцу, первоначальный владелец перестает им обладать, и будет иметь права доступа, установленные новым владельцем.

Рассмотрим простой пример:

$ ls -l
total 2
-rw-r--r--    1 user01   others           6 Dec 10 16:19 testfile
$ chown informix testfile
$ ls -l
total 2
-rw-r--r--    1 informix others           6 Dec 10 16:19 testfile
$ logname
user01
$ chown user01 testfile
UX:chown: ERROR: testfile: Not privileged

Поиск файлов

В логической файловой системе ОС UNIX - тысячи файлов, поэтому необходимы средства поиска файлов по различным критериям. Для поиска файлов предназначена команда find со следующим синтаксисом:

find каталог ... выражение

Утилита find просматривает иерархии каталогов в поисках файлов, удовлетворяющих критерию, задаваемому выражением. Выражения строятся из элементов с использованием следующих конструкций:

( элемент )

Истинно, если истинен элемент в скобках (поскольку скобки - метасимвол командного интерпретатора, их надо экранировать). Скобки используются для группировки элементов.

! элемент

Истинно, если элемент не истинен.

элемент [-a] элемент

Истинно, если истинны оба элемента. Если элементы просто перечислены подряд, предполагается эта же логическая операция И.

элемент -o элемент

Истинно, если истинен хотя бы один элемент.

Имена найденных (удовлетворяющих критерию, задаваемому выражением) файлов по умолчанию выдаются в стандартный выходной поток.

В качестве элементов выражения используются основные конструкции, представленные в табл. 12. Выражение проверяется слева направо, с учетом скобок.

Таблица 12. Основные элементы выражения в команде find

Элемент Назначение или критерий истинности
-name шаблон Истинен, если имя файла соответствует шаблону. При использовании метасимволов необходимо маскировать шаблоны от командного интерпретатора.
-type тип Истинен, если файл - указанного типа. Типы файлов задаются символами b, c, d, f, l, p и s, обозначающими, соответственно, специальное блочное устройство, специальное символьное устройство, каталог, обычный файл, символьную связь, именованный канал и сокет.
-user пользователь Истинен, если файл принадлежит пользователю, указанному по идентификатору или регистрационному имени.
-group группа Истинен, если файл принадлежит группе, указанной по идентификатору или имени.
-perm [-]права Если дефис не задан, то истинен только если права доступа в точности соответствуют указанным (как в команде chmod, проще - абсолютные). Если задан дефис, истинен, если в правах доступа файла, как минимум, установлены те же биты, что и в указанных правах.
-size n[c] Истинен, если файл имеет длину n блоков (блок - 512 байтов) или символов (если указан суффикс c). Перед размером можно указывать префикс + (не меньше), - (не больше) или = (в точности равен).
-atime n Истинен, если к файл последний раз обращались n дней назад. Перед n в элементах -atime, -ctime и -mtime можно указывать префикс + (не позже), - (не ранее) или = (ровно).
-ctime n Истинен, если файл создан n дней назад.
-mtime n Истинен, если файл был изменен n дней назад.
-newer файл Истинен, если файл - более новый, чем указанный.
-ls Всегда истинен. Выдает информацию о файле, аналогичную длинному листингу.
-print Истинен всегда. Выдает полное имя файла в стандартный выходной поток.
-exec команда {} ; Истинен, если выполненная команда возвращает код возврата 0. Команда заканчивается замаскированной точкой с запятой. В команде можно использовать конструкцию {}, заменяемую полным именем рассматриваемого файла.
-ok команда {} ; Аналогичен exec, но полученная после подстановки имени файла вместо {} команда выдается с вопросительным знаком и выполняется только если пользователь ввел символ y.
-depth Истинен всегда. Требует так обходить иерархию каталогов, чтобы файлы любого каталога всегда обрабатывались раньше, чем сам каталог (обход "в глубину").
-prune Истинен всегда. Требует не проверять файлы в каталоге, сопоставившемся с предыдущим элементом выражения. Не действует, если ранее указан элемент -depth.

В различных версиях ОС UNIX могут поддерживаться и другие компоненты выражений в команде find. Если командная строка сформирована неправильно, команда немедленно завершает работу.

Рассмотрим несколько примеров использования команды find:

[kravchuk@arturo 15:05:25 /tmp]$ find . -user kravchuk -size +0c -ls
find: cannot read dir ./smc898: Permission denied
475898122    4 -rw-r--r--  1 kravchuk 50            666 Mar 26 16:58 ./-1
473866040    4 -rw-r--r--  1 kravchuk 50              6 Mar 26 17:55 ./1.txt
475472259    4 dr-xr--r--  2 kravchuk 50            108 Mar 26 17:39 ./d1
474199552    4 -rw-r--r--  1 kravchuk 50            639 Mar 26 16:55 
./d1/f3.txt
476732956    4 -rw-r--r--  1 kravchuk 50              6 Mar 26 17:55 ./2.txt
476732980    4 -rw-r--r--  1 kravchuk 50             12 Mar 26 17:56 ./3.txt
476142563    4 -rw-r--r--  1 kravchuk 50              7 Mar 26 17:56 ./4.txt
[kravchuk@arturo 15:26:41 /tmp]$ find . -name "??.txt" -print
find: cannot read dir ./smc898: Permission denied
./d1/f3.txt
./f1.txt
[kravchuk@arturo 15:26:58 /tmp]$ find . -name d1 -prune -name "??.txt" -print
find: cannot read dir ./smc898: Permission denied
[kravchuk@arturo 15:27:09 /tmp]$ find . -name d1 -prune -o -name "??.txt" -print
find: cannot read dir ./smc898: Permission denied
./f1.txt
[kravchuk@arturo 15:27:13 /tmp]$ find . -user kravchuk -ok rm {} ;
find: cannot read dir ./smc898: Permission denied
< rm ... ./p1 >?   y
< rm ... ./-1 >?   y
< rm ... ./1.txt >?   y
< rm ... ./mpDfa4ZT >?   y
< rm ... ./d1 >?   y
rm: Unable to remove directory ./d1: File exists
< rm ... ./d1/f3.txt >?   y
< rm ... ./2.txt >?   y
< rm ... ./3.txt >?   y
< rm ... ./4.txt >?   y
< rm ... ./f1.txt >?   y
[kravchuk@arturo 15:28:35 /tmp]$ find . -user kravchuk -print
find: cannot read dir ./smc898: Permission denied
./d1
./d1/f3.txt
Комментарии: (0) | UNIX | 2006-04-04

Основы операционной системы UNIX - 05. Структура и свойства файловых систем

Основы операционной системы UNIX - 05. Структура и свойства файловых систем

Логическая файловая система - основные каталоги и их назначение

Использование общепринятых имен основных файлов и структуры каталогов существенно облегчает работу в операционной системе, ее администрирование и повышает переносимость. Типичная структура и назначение каталогов файловой системы UNIX представлена в табл. 13.

Таблица 13. Основные каталоги логической файловой системы UNIX

Каталог Назначение и содержание
/ Корневой каталог. Является основой любой файловой системы UNIX. Все остальные каталоги и файлы располагаются в рамках структуры, порожденной корневым каталогом (в нем и в его подкаталогах), независимо от их физического местонахождения. Для корневого каталога обязательно должна создаваться отдельная физическая файловая система, а сам он является точкой ее монтирования, о чем свидетельствует наличие подкаталога lost+found.
/bin Пользовательские выполняемые программы. Сейчас обычно является символической связью, указывающей на /usr/bin.
/dev Каталог для специальных файлов устройств. Может иметь подкаталоги для различных классов и типов устройств, например, dsk, rdsk, rmt, inet (в SVR4).
/etc Каталог для конфигурационных файлов. Может иметь подкаталоги для различных компонентов и служб. Конфигурационные файлы в UNIX - обычные текстовые.
/home Каталог для размещения начальных каталогов пользователей. Часто является точкой монтирования отдельной физической файловой системы.
/lib Каталог для библиотек. Сейчас обычно является символической связью, указывающей на /usr/lib.
/lost+found Подкаталог, имеющийся в каждом каталоге, являющемся точкой монтирования физической файловой системы на диске. Корневой каталог всегда представлен отдельной физической файловой системой, должен быть всегда доступен, и монтируется автоматически при запуске системы. Все остальные физические файловые системы формально не нужны для функционирования ОС UNIX.
/mnt Точка монтирования для файловых систем на съемных носителях или дополнительных дисках. Может содержать подкаталоги для отдельных типов носителей, например, cdrom или floppy. Может юыть пустым.
/opt Каталог для дополнительного коммерческого программного обеспечения. Может быть пустым или отсутствовать (в BSD-системах).
/proc Каталог псевдо-файловой системы, представляющей в виде каталогов и файлов информацию о ядре, памяти и процессах, работающих в системе.
/sbin Каталог для системных выполняемых программ, необходимых для решения задач системного администрирования.
/tmp Каталог для временных файлов. Имеет установленный клейкий бит и доступен для записи и чтения всем пользователям. Обычно создается в виде отдельной физической файловой системы, в том числе, в виртуальной памяти.
/usr В этом каталоге находятся выполняемые программы, библиотеки, заголовочные файлы, справочные руководства (/usr/share/man), исходные тексты ядра и утилит системы (Linux), растущие файлы и очереди печати (/usr/spool в BSD-системах) и т.д. Часто каталог является точкой монтирования отдельной физической файловой системы. Ниже представлены основные его подкаталоги.
/usr/bin Основные выполняемые программы и утилиты.
/usr/include Заголовочные файлы библиотек. Может содержать подкаталоги.
/usr/lib Статически и динамически компонуемые библиотеки. Может содержать подкаталоги.
/usr/local Каталог для дополнительного свободно распространяемого программного обеспечения (GNU). Содержит структуру подкаталогов, аналогичную корневому каталогу (bin, etc, include, lib и т.д.).
/var В UNIX System V и Linux этот каталог является заменителем каталога (/usr/spool), используемого для хранения растущих файлов различных сервисных подсистем, например, файлов журналов системы. Так, основной журнал системы, ведущийся демоном syslogd, размещается в виде нескольких файлов в подкаталоге /var/adm. Там же, в файле /var/adm/messages, сохраняются сообщения времени загрузки. Имеет смысл создавать отдельную физическую файловую систему для размещения этого каталога (и, возможно, его подкаталога /var/run).

Наличие, назначение и использование других каталогов верхнего уровня и подкаталогов зависит от версии ОС UNIX, установленного системного и прикладного программного обеспечения и конфигурации системы, созданной администратором.

Физические файловые системы UNIX - основные компоненты

Каждый жесткий диск состоит из одной или нескольких логических частей (групп цилиндров), называемых разделами (partitions). Расположение и размер раздела определяется при форматировании диска. В ОС UNIX разделы выступают в качестве независимых устройств, доступ к которым осуществляется как к различным носителям данных. Обычно в разделе может располагаться только одна физическая файловая система.

Имеется много типов физических файловых систем, например FAT16 и NTFS, с разной структурой. Более того, имеется множество типов физических файловых систем UNIX (ufs, s5fs, ext2, vxfs, jfs, ffs и т.д.). Ниже мы рассмотрим основные их общие особенности.

Физическая файловая система UNIX занимает раздел диска и состоит из таких основных компонентов:

  • Суперблок (superblock). Содержит общую информацию о файловой системе.
  • Массив индексных дескрипторов (ilist). Содержит метаданные всех файлов файловой системы. Индексный дескриптор (inode) содержит информацию о статусе файла и указывает на расположение данных этого файла. Ядро обращается к индексному дескриптору по индексу в массиве. Один дескриптор является корневым для физической файловой системы, через него обеспечивается доступ к структуре каталогов и файлов после монтирования файловой системы. Размер массива индексных дескрипторов является фиксированным и задается при создании физической файловой системы.
  • Блоки хранения данных. Данные обычных файлов и каталогов хранятся в блоках. Обработка файла осуществляется через индексный дескриптор, содержащий ссылки на блоки данных.

Суперблок

Суперблок содержит информацию, необходимую для монтирования и управления файловой системой в целом. В каждой файловой системе существует только один суперблок, который располагается в начале раздела. Суперблок считывается в память ядра при монтировании файловой системы и находиться там до ее отключения - демонтирования.

Суперблок содержит:

  • тип файловой системы;
  • размер файловой системы в логических блоках, включая сам суперблок, массив индексных дескрипторов и блоки хранения данных;
  • размер массива индексных дескрипторов;
  • количество свободных блоков;
  • количество свободных индексных дескрипторов;
  • флаги;
  • размер логического блока файловой системы (512, 1024, 2048, 4096, 8192).
  • список номеров свободных индексных дескрипторов;
  • список адресов свободных блоков.

Поскольку количество свободных индексных дескрипторов и блоков хранения данных может быть значительным, хранение двух последних списков целиком в суперблоке непрактично. Для индексных дескрипторов храниться только часть списка. Когда число свободных дескрипторов приближается к 0, ядро просматривает список и вновь формирует список свободных дескрипторов.

Такой подход неприемлем в отношении свободных блоков хранения данных, поскольку по содержимому блока нельзя определить, свободен он или нет. Поэтому необходимо хранить список адресов свободных блоков целиком. Список адресов свободных блоков может занимать несколько блоков хранения данных, но суперблок содержит только один блок этого списка. Первый элемент этого блока указывает на блок, хранящий продолжение списка.

Выделение свободных блоков для размещения файла производиться с конца списка суперблока. Когда в списке остается единственный элемент, ядро интерпретирует его как указатель на блок, содержащий продолжение списка. В этом случае содержимое этого блока считывается в суперблок, и блок становится свободным. Такой подход позволяет использовать дисковое пространство под списки, пропорциональное свободному месту в файловой системе. Когда свободного места практически не остается, список адресов свободных блоков целиком помещается в суперблоке.

Индексные дескрипторы

Индексный дескриптор, или inode, содержит информацию о файле, необходимую для обработки данных, т.е. метаданные файла. Каждый файл ассоциирован с одним индексным дескриптором, хотя может иметь несколько имен (жестких связей) в файловой системе, каждое из которых указывает на один и тот же индексный дескриптор.

Индексный дескриптор не содержит:

  • имени файла, которое содержится в блоках хранения данных каталога;
  • содержимого файла, которое размещено в блоках хранения данных.

Индексный дескриптор содержит:

  • номер;
  • тип файла;
  • права доступа к файлу;
  • количество связей (ссылок на файл в каталогах) файла;
  • идентификатор пользователя и группы-владельца;
  • размер файла в байтах;
  • время последнего доступа к файлу;
  • время последнего изменения файла;
  • время последнего изменения индексного дескриптора файла;
  • указатели на блоки данных файла (обычно 10);
  • указатели на косвенные блоки (обычно 3).

Размер индексного дескриптора обычно составляет 128 байтов.

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

Каждый дескриптор содержит 13 указателей. Первые 10 указателей непосредственно ссылаются на блоки данных файла. Если файл большего размера - 11-ый указатель ссылается на первый косвенный блок (indirection block) из 128 (256) ссылок на блоки данных. Если и этого недостаточно, 12-ый указатель ссылается на дважды косвенный блок, содержащий 128 (256) ссылок на косвенные блоки. Наконец последний, 13-ый указатель ссылается на трижды косвенный блок из 128 (256) ссылок на дважды косвенные блоки. Количество элементов в косвенном блоке зависит от его размера.

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

Синхронизация структуры файловой системы

При открытии файла ядро помещает копию дискового индексного дескриптора в соответствующую таблицу в памяти, которая содержит дополнительные атрибуты. В дальнейшем изменение индексного дескриптора происходит в памяти, и измененная структура файловой системы сбрасывается на диск только при выполнении специальной команды, sync. Эта команда выполняется при штатной остановке системы или явно администратором.

Если произошло нештатное прекращение работы системы, структура суперблока и массива индексных дескрипторов на диске не соответствует структуре блоков данных и может быть несогласованной.

Отсутствие синхронизации между образом файловой системы в памяти и ее данными на диске (в случае аварийной остановки системы) может привести к появлению следующих ошибок в файловой системе:

  1. Один блок адресуется несколькими дескрипторами (принадлежит нескольким файлам).
  2. Блок помечен как свободный, но в тоже время занят (на него ссылается дескриптор).
  3. Блок помечен как занятый, но в то же время свободен (ни один дескриптор на него не ссылается).
  4. Неправильное количество ссылок в дескрипторе.
  5. Несовпадение между размером файла и суммарным размером адресуемых дескриптором блоков.
  6. Недопустимые адресуемые блоки (например, расположенные за пределами файловой системы).
  7. "Потерянные" файлы (правильные дескрипторы, на которые не ссылаються записи каталогов).
  8. Недопустимые номера дескрипторов в записях каталогов.

Часть этих проблем может быть устранена специальной утилитой, fsck (см. далее в разделе, посвященном управлению файловой системой). Но принципиальное решение проблемы согласованности и целостности данных в файловых системах UNIX возможно только при использовании журнализации - предварительной записи всех изменений дисковой структуры в отдельную область на диске.

Журнализируемые файловые системы

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

Журнал выделяется из свободных блоков файловой системы и, обычно, имеет размер порядка 1 Мбайта на каждый 1 Гбайт файловой системы. Журнал сбрасывается по мере заполнения, после синхронизации структуры файловой системы с диском.

Различные версии ОС UNIX поддерживают разные реализации журнализируемых файловых систем. Это, например, файловая система ufs (Solaris), vxfs (Solaris, UnixWare), RaisorFS и ext3 (Linux), jfs (AIX и Linux) и другие. Некоторые файловые системы позволяют включать и отключать журнализацию (ufs, ext2/ext3). Естественно, журнализация несколько замедляет работу файловой системы, но, в большинстве случаев, гарантирует целостность данных.

Комментарии: (0) | UNIX | 2006-04-04


Страница 1 из 41234 »