Настройка Linux


Введение

Привилегированный пользователь и меры предосторожности

Настройки в Unix делятся на две группы. Первая -- те, что выполняются для всей машины -- настройки ОС, а также настройки для всех пользователей. Они могут делаться только администратором. Вторая -- настройки, которые влияют на окружение одного конкретного пользователя, и выполняются им самим.

Администратор в Unix носит имя "root". Этот пользователь обладает абсолютной властью: он может делать любые действия без ограничений, в том числе на него не распространяются права доступа на файлы -- он может просмотреть, модифицировать и удалить любой файл.

Поскольку надежность Unix в значительной степени определяется тем, что обычный пользователь не может нанести никакого вреда системе -- у него просто нет прав на это, то "всемогущесть" root содержит в себе и опасность.

Поэтому при использовании персонального компьютера под Unix надо учитывать несколько простых правил:

  1. Никогда не работать как пользователь "root" -- для выполнения рутинных задач (редактирование текстов, рисование картинок, вычисления, электронная почта, Интернет и т.д.) работать как обычный, непривилегированный пользователь. Это не даст, например, по ошибке стереть жизненно важный для системы файл.
  2. Перед редактированием общесистемных файлов обязательно создавать резервную копию -- это позволит вернуть все изменения обратно, если что-то не заработает, а также обнаружить случайные ошибки, сравнив две версии файла командой diff.

    Например, перед редактированием файла /etc/X11/XF86Config стоит выполнить команду

    cp -p /etc/X11/XF86Config /etc/X11/XF86Config.old

    (ключ "-p" сохранит время модификации исходного файла).

  3. Никогда не делать того, чего не знаешь, или последствия чего не понимаешь. Если есть какие-то сомнения -- надо внимательно почитать документацию, или спросить совета у более знающего человека.

Вообще при внесении каких-либо изменений надо всегда пользоваться правилом "семь раз отмерь, один раз отрежь".


Для того, чтобы временно "превратиться" из обычного пользователя в "root", используется команда su.

У обычных пользователей приглашение shell заканчивается символом "%" (zsh, tcsh) --

bobby:/tmp%
или "$" (bash) --

[mickey@bobby /tmp]$
У "root" же приглашение всегда заканчивается символом "#" --

bobby:/tmp#

Где находятся настройки в Unix

Конфигурация в Unix представлена огромным числом файлов, большая часть из которых расположена в директории /etc/ и ее поддиректориях. Конфигурация системы X-Window и большинства X-программ расположена в поддиректориях /usr/X11R6/lib/X11/ (но для унификации многие из них перенесены в /etc/X11/, а на старом месте оставлены символьные линки туда). Конфигурация многих прикладных программ (таких, как mc, joe и т.д.) расположена в их специальных директориях (зачастую это /usr/lib/имя-программы/) -- это надо смотреть в их документации.

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

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

Хотя и существуют "красивые" графические программы, служащие для избавления администратора от ручной работы с текстовыми файлами, они чрезвычайно далеки от совершенства (а то, что есть в RedHat начиная с 5.1, вообще не выдерживает никакой критики).


Создание и удаление пользователей

Что есть пользователь в Unix

Наличие пользователя в Unix определяется в нескольких местах:

  1. Файл /etc/passwd -- список пользователей и их основных свойств.
  2. Файл /etc/group -- список групп пользователей.
  3. Директория типа /home/user -- домашняя директория.
  4. Файл /var/spool/mail/user -- почтовый ящик.

Местоположение домашней директории определяется администратором при "создании" пользователя, а почтовые ящики все расположены в одной директории, имя которой зависит от типа ОС -- например, во FreeBSD это /var/mail/.

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

Кроме того, при использовании сетевых информационных систем NIS или NIS+ часть содержимого файлов /etc/passwd и /etc/group может быть распределена по сети.

Файл /etc/passwd


Необходимым и достаточным условием "существования" пользователя в системе является его наличие в файле /etc/passwd.

Это текстовый файл, в каждой строке которого находится информация об одном пользователе. Каждая строка состоит из 7 полей, разделенных двоеточиями:

account:encpassword:UID:GID:GECOS:homedir:shell

Поля имеют следующий смысл:

account
Имя пользователя.
encpassword
Зашифрованный пароль.
UID
Числовой идентификатор пользователя (User IDentifier).
GID
Числовой идентификатор первичной группы этого пользователя (Group IDentifier).
GECOS
Информация о пользователе -- полное имя, телефон, комната и т.д.
homedir
Домашняя директория.
shell
Интерпретатор команд -- программа, запускаемая для данного пользователя при входе в систему.

Пример:

root:5YOyOop0O2yoE:0:0:The Superuser:/root:/bin/zsh

В "свежеустановленной" системе всегда есть пользователь "root" и некоторое количество псевдопользователей, необходимых для работы системы -- "bin", "mail", "daemon" и т.д. У специальных пользователей UID всегда меньше 100.

Предупреждение
Во многих ОС информация из /etc/passwd "размазана" по нескольким файлам (в том числе в Linux -- /etc/shadow), поэтому просто редактировать /etc/passwd "руками" нельзя!

Зашифрованный пароль. При записи паролей в Unix применяется необратимое шифрование по алгоритму DES. Поэтому даже имея доступ к зашифрованному паролю, нельзя узнать сам пароль. Система же, когда надо проверить пароль, зашифровывает строку, введенную пользователем и сравнивает ее с той, что содержится в /etc/passwd.

Однако эта схема не защищает от так называемых "словарных атак" (dictionary attacks), когда берется, например словарь, и все слова из него последовательно зашифровываются и сравниваются с тем, что записано в /etc/passwd.

Поэтому в большинстве современных систем применяются так называемые "теневые файлы паролей" (shadow passwords) -- в /etc/passwd вместо пароля стоит "*" или "x", а сам шифрованный пароль содержится в файле /etc/shadow или подобном, доступ к которому есть только у пользователя "root".

Linux также поддерживает /etc/shadow (стабильная поддержка в RedHat есть с версии 5.0, в 4.2 она несколько "кривая"), но это при необходимости надо отдельно включить, один раз выполнив команду pwconv.

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

Числовые идентификаторы -- UID и GID. В ядре Unix для идентификации пользователя служит не имя, а 16-битное число -- так называемый UID.

Имя же может быть практически любым -- оно используется только при входе в систему, а также тогда, когда нужно именно имя пользователя (в адресах электронной почты, в finger, talk) и в программах rsh, rlogin, ssh и им подобных.

Пользователь с UID=0 -- супервизор, он имеет имя "root".

В принципе, ничто не мешает создать нескольких пользователей с разными именами, паролями и home-директориями, но с одинаковыми UID -- у всех у них будут одинаковые права. Но при создании Unix этот фокус не предусматривался, так что некоторые программы могут работать не совсем корректно.

Аналогично группа пользователя определяется числовым идентификатором GID. Но, в отличие от UID, один и тот же GID может быть присвоен нескольким пользователям -- все они будут принадлежать к одной группе.

UID и GID должны совпадать на всех машинах. Аналогично тому, как имена пользователей используются в протоколах RLOGIN и SSH, и должны совпадать у одного пользователя на разных машинах, числовые идентификаторы используются сетевой файловой системой NFS. И если в rlogin и т.п. можно указать другое имя пользователя, в NFS такой возможности нет.

Поэтому для того, чтобы пользователь "vasya" на машине Bobby считался "эквивалентом" пользователя "vasya" на машине Garry, и имел по NFS доступ с правильными правами, числовые идентификаторы на обеих машинах должны совпадать. (Что интересно, одинаковость имен для NFS неважна.)

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

Файл /etc/group


Файл /etc/group по формату очень похож на /etc/passwd, но в нем перечислен список групп, существующих на машине, и пользователи, к ним принадлежащие.

Для работы с ним служат команды groupadd, groupdel и groupmod.

Манипуляции с пользователями

Хотя в принципе пользователей можно создавать "руками", путем редактирования файла /etc/passwd и еще некоторых действий, этого никогда не надо делать.

В разных ОС (и даже в разных версиях одной ОС) для манипуляций с пользователями зачастую служат разные команды. Пожалуй, единственной "универсальной" командой является passwd. Поэтому рассмотрим команды, используемые в RedHat Linux 5.2.

Создание пользователя. Для создания пользователя служит команда useradd. Самый простой вариант -- useradd имя, при этом будут подобраны "первые попавшиеся" UID и GID, а в качестве home-директории и shell будут уставлены значения по умолчанию.

Лучше же всегда пользоваться такой формой команды:

useradd -m -d home-dir -u UID -g GID имя

Это позволяет создать пользователя "с нужными свойствами".

Ключ "-m" указывает useradd, что надо создать home-директорию данного пользователя (по умолчанию она может быть прописана в /etc/passwd, но не создана на диске) и сделать его ее владельцем. В нее будут скопированы файлы из директории /etc/skel/ ("скелет" home-директории).

Замечание
В случае, если домашняя директория имеет вид "/home/group/user", то директория /home/group/ должна уже существовать -- useradd делает только саму home-директорию, а все промежуточные директории (в данном случае /home и /home/group) должны уже существовать.

Удаление пользователя. Для удаления служит команда userdel. Ей надо указать имя пользователя и ключ "-r" (для удаления home-директории). Пример:

userdel -r mickey

Изменение "свойств" пользователя. Первое, что надо сделать после создания пользователя -- назначить ему пароль. Для этого служит команда passwd.

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

bobby:~% passwd
Changing password for mickey
(current) UNIX password: 
New UNIX password: 
Retype new UNIX password: 
passwd: all authentication tokens updated successfully
bobby:~% _

Root же может сменить пароль любого пользователя, что и надо сделать сразу после его создания:

bobby:~# passwd mickey
New UNIX password: 
Retype new UNIX password: 
passwd: all authentication tokens updated successfully
bobby:~# _

Предупреждение
Используя команду passwd из-под root, надо не забывать указать имя пользователя -- иначе будет изменен пароль пользователя "root". Это довольно распространенная ошибка.

Изменить shell пользователя можно командой chsh, которая спросит полное имя shell (с директорией). В Linux и BSD-системах пользователь может сам менять свой shell, а в ОС клона SystemV -- только супервизор. Примеры:

bobby:~% chsh
Changing shell for mickey.
Password: 
New shell [/bin/zsh]: /bin/bash
Shell changed.
bobby:~% _

bobby:~# chsh -s /bin/zsh mickey
Changing shell for mickey.
Shell changed.
bobby:~# _

Пользователь не может поставить в качестве своего shell произвольную программу -- только одну из тех, что перечислены в файле /etc/shells.

Где еще брать информацию о работе с пользователями

Следует посмотреть man-страницы passwd(5), group(5), useradd(8), userdel(8), usermod(8), groupadd(8), groupdel(8), groupmod(8), passwd(1), chsh(1), shells(5), chfn(1).

Кроме того, много полезной информации содержится в главах 3, 5 и 6 книги "UNIX: руководство системного администратора".


Переменные окружения, стартовые файлы shell

Переменные окружения

Для настройки поведения многих программ служат так называемые переменные окружения.

Некоторые переменные окружения
НазваниеНазначение
PATH Пути для поиска программ -- список директорий, разделенных двоеточиями
PROMPT, prompt, PS1 Вид приглашения shell
DISPLAY Имя дисплея для X-программ
TERM Тип терминала
EDITOR Текстовый редактор, который будут использовать программы mc, vipw, crontab и т.д. вместо vi
PAGER Программа просмотра текстовых файлов, которую будут использовать команды man, apropos и т.д. (в Linux man и apropos по умолчанию используют /usr/bin/less -is
HOME* Домашняя директория пользователя
USER*
LOGNAME*
Login-имя пользователя
SHELL* Имя основного shell

Символом "*" помечены те переменные, которые являются "информационными" и которые не следует изменять.

Переменная prompt используется в Tcsh, PS1 -- в Bash, а в Zsh PROMPT и PS1 -- это просто два имени одной и той же переменной. Интерпретация этой переменной зависит от используемого shell; в Zsh это строка, в которой могут содержаться специальные %-последовательности, позволяющие вставлять в приглашение имя компьютера, текущей директории, время и т.д.

Работа с переменными окружения в значительной степени зависит от того, какой shell используется. В Zsh и Bash это делается одними командами, а в Tcsh -- другими. Мы рассмотрим команды, используемые в Zsh.

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

export DISPLAY=localhost:0

Вокруг символа "=" не должно быть пробелов, а если пробелы есть в присваиваемом значении, то его надо заключить в кавычки.

Чтобы посмотреть значение переменной, можно воспользоваться командой echo:

bobby:~% echo $DISPLAY
:0.0
bobby:~% echo $TERM
xterm
bobby:~% _

Посмотреть список всех переменных можно командой export без параметров.

Для удаления переменной окружения (это не то же самое, что присвоение ей пустой строки!) используется unset:

bobby:~% export VAR=abc
bobby:~% export | grep VAR
VAR=abc
bobby:~% export VAR=
bobby:~% export | grep VAR
VAR=''
bobby:~% unset VAR
bobby:~% export | grep VAR
bobby:~% _

Переменная окружения PATH

Эта переменная заслуживает того, чтобы поговорить о ней особо.

Когда мы пишем команду и нажимаем <Enter>, то shell (после проверки, не встроенная ли это команда) ищет исполняемый файл с таким именем по всем директориям, которые перечислены в PATH.

Хотя использование PATH очень похоже на то, что есть в Dos/Windows, имеются два важных отличия.

Во-первых, директории в списке разделяются не точками с запятыми, а двоеточиями (это сделано потому, что ";" -- специальный символ для shell -- разделитель команд).

Во-вторых, если в Dos PATH задает альтернативные директории для поиска команды, когда она не найдена в текущей, то в Unix команды ищутся только в директориях, перечисленных в PATH -- если "." там не указана (а обычно так и есть), то в текущей директории программа искаться не будет. Для запуска программы из текущей директории надо явно указать путь -- например, "./myprog".

Чтобы добавить, к примеру, директорию /usr/games в конец PATH, используется команда

export PATH=$PATH:/usr/games

Стартовые файлы shell

Переменные DISPLAY, TERM, HOME, USER/LOGNAME, SHELL и частично PATH устанавливаются автоматически соответствующими компонентами системы. Остальные же переменные надо или уставлять вручную, или из стартовых файлов shell -- как это всегда и делается.

При запуске каждый shell просматривает некоторые файлы, чтобы считать из них свои настройки и переменные окружения, а также для выполнения некоторых стартовых команд -- аналогично тому, что в Dos делается в файле autoexec.bat. Эти файлы называются стартовыми (startup files). Кроме того, практически все shell при выходе исполняют команды из файлов завершения (shutdown files) -- обычно в них помещают команду очистки экрана.

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

В Zsh есть три категории стартовых файлов.

  • Первая -- файлы настройки окружения /etc/zshenv и ~/.zshenv, обрабатываемые при любом запуске shell, в том числе для интерпретации командных файлов и при выполнении команды с удаленного компьютера по rsh.

    В них следует помещать команды настройки переменных окружения. Ни в коем случае нельзя вставлять сюда команды, выводящие что-либо на терминал или еще как-либо с ним взаимодействующие (например, stty)!

  • Вторая -- файлы стартовых команд /etc/zshrc и ~/.zshrc, используемые, если shell запущен в интерактивном режиме (т.е. для взаимодействия с пользователем, а не для исполнения командного файла или какой-либо иной команды). Если находясь в Zsh выполнить команду zsh для вызова еще одной копии, то эти файлы будут исполнены заново.

    В эти файлы следует помещать определения функций (functions), псевдонимов (aliases) и настроек клавиш (key bindings) -- т.е. те настройки, что используется при интерактивной работе shell.

  • Третья группа -- login-файлы /etc/zprofile и ~/.zprofile, а также /etc/zlogin и ~/.zlogin. Отличие между ними в том, что zprofile исполняются до, а zlogin -- после zshrc; реально это несколько избыточно, так что обычно команды вставляются только или в zprofile (именно так в RedHat), или в zlogin.

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

Все файлы идут парами -- сначала shell берет файл из /etc/, в котором лежат общесистемные настройки, а затем -- из home-директории, так что каждый пользователь может подправить окружение по своему усмотрению. Если какого-либо из этих файлов нет, то никакого сообщения об ошибке не выдается. Zsh, в отличие от Bash, всегда просматривает оба файла -- и общесистемный, и пользовательский.

Естественно, крайне неразумно со стороны системного администратора вставлять какие-либо команды типа who в общесистемные login-файлы -- ведь пользователи не смогут изменить это поведение.

При завершении работы просматриваются файлы /etc/zlogout и ~/zlogout.

Данная последовательность полностью описана в man-странице по zsh.


Добавление и удаление пакетов в RedHat Linux: менеджер пакетов rpm

Что такое пакеты

Как уже отмечалось, весь Linux состоит из пакетов. В RedHat работу с пакетами выполняет программа rpm (RedHat Package Manager), а сами файлы, содержащие пакеты, имеют расширение .rpm. Кроме RedHat существует еще несколько дистрибутивов Linux, использующих rpm; самые известные -- Caldera, SuSE и KSI. Их так и называют -- rpm-системы.

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

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

Некоторые расширения .rpm-файлов
РасширениеНазначение
.i386.rpm Пакет для Linux/Intel
.src.rpm Исходный код пакета (никогда не устанавливайте .src.rpm -- потом не удалите!)
.alpha.rpm Пакет для Linux/Alpha
.sparc.rpm Пакет для Linux/Sparc (Sun)
.ppc.rpm Пакет для Linux/PowerPC
.noarch.rpmПакет для всех архитектур (обычно содержит данные -- файлы конфигурации, шрифты и т.д.)

Кроме того, само имя пакета состоит из собственно названия и версии. Например, lynx-2.8.2-3.i386.rpm -- программа lynx, версия 2.8.2, build 3. К сожалению, формальных правил, позволяющих понять, где кончается имя и начинается версия, нет.

Файлы пакетов обычно расположены в одном из трех мест -- в дистрибутиве, в разделе дополнений (updates) или в резделе "пожертвований" (contrib). В ИЯФ для RedHat 5.2/Intel это соответственно

ftp://rdist.inp.nsk.su/pub/Linux/redhat-5.2/i386/RedHat/RPMS/

ftp://rdist.inp.nsk.su/pub/Linux/redhat-5.2/updates/i386/

ftp://rdist.inp.nsk.su/pub/Linux/contrib/libc6/i386/

Пакеты с исходными кодами всегда лежат в директориях SRPMS/, и содержат исходный код для всех архитектур.

Использование rpm

Хотя rpm выполняет все функции работы с пакетами (включая создание .i386.rpm из .src.rpm), сейчас рассмотрим лишь основные действия.

Установка. Для установки пакета используется команда rpm -i (Install), которой указывается полное имя файла, содержащего пакет. Пример:

rpm -i lynx-2.8.2-3.i386.rpm

Если пакет уже установлен, rpm откажется его устанавливать. Если же это новая версия (т.е. делается не установка, а обновление), то надо воспользоваться командой rpm -U (Upgrade); фирма RedHat рекомендует "для красоты" использовать форму rpm -Uvh -- при этом "прогресс" в установке показывается индикатором из символов "#". Пример:

bobby:~# rpm -Uvh wu-ftpd-2.4.2b18-2.1.i386.rpm
wu-ftpd                     ##################################################
bobby:~# _

Если требуется установить несколько пакетов, то можно указать их все в одной команде (через пробелы). Иногда это нужно -- например, при обновлении программы, состоящей из нескольких пакетов (например, Netscape), чтобы rpm не выдавал ошибок из-за зависимостей пакетов.

Удаление. Для удаления установленного пакета используется команда rpm -e (Erase). Ей указывается имя пакета (можно без версии), и без суффикса ".i386.rpm". Пример:

rpm -e lynx

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

Информация. Чтобы узнать, установлен ли некий пакет, служит команда rpm -q (Query). Ей также указывается имя пакета, а она выдает его полное имя, если он установлен. Примеры:

bobby:~# rpm -q lynx
lynx-2.8.1-5
bobby:~# rpm -q seyon
package seyon is not installed
bobby:~# _

Маленькие и заглавные буквы в именах пакетов различаются. Поскольку часто не помнишь точное имя пакета (и уж тем более, какие буквы там на каком регистре), можно воспользоваться командой rpm -qa (Query All packages -- показать все пакеты) в сочетании с командой grep:

bobby:~# rpm -qa | grep -i after
AfterStep-1.5-0.7
AfterStep-APPS-1.5-0.3
bobby:~# _


Файловые системы

Дерево директорий и монтирование

В Unix, в отличие от Dos/Windows, разным разделам дисков не присваиваются разные буквы, а все они образуют единое дерево директорий. Процесс добавления ("приклейки") раздела в любое место дерева называется монтированием (mounting). Разделы могут монтироваться как автоматически при загрузке, так и во время работы системы. "Отклейка" раздела от дерева называется размонтированием (unmounting).

При монтировании надо указывать системе три параметра: раздел, который надо смонтировать, директорию, в которой должен быть "виден" этот раздел (ее называют точкой монтирования -- mount point), и тип файловой системы. Кроме того, можно указывать дополнительные параметры -- например то, что смонтировать следует только для чтения (readonly).

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

Названия физических устройств

Для ссылки на физический раздел всегда используется файл устройства, расположенный в директории /dev/. В разных клонах Unix используются разные способы именования физических разделов на дисках. Рассмотрим тот, который используется в Linux.

Все IDE-устройства в Linux имеют имена, начинающиеся на "hd" (Hard Drive), а SCSI-диски -- "sd" (SCSI Drive). Первый IDE-диск называется hda, второй -- hdb, третий -- hdc и т.д.

Разделы на дисках называются так же, как и сам диск, с добавлением числа, обозначающего номер раздела. Основные (primary) разделы имеют номера от 1 до 4, а дополнительные (logical) -- от 5 до 16. Даже если есть только один основной раздел, а остальные -- логические, то первый логический раздел будет иметь номер 5, а номера 2,3,4 будут неиспользованы.

Например, /dev/hda2 -- второй раздел первого IDE-диска; /dev/hdd7 -- седьмой (логический) раздел четвертого IDE-диска (slave-диск на втором IDE-контроллере).

Такая схема более удобна, чем используемая в Dos/Windows, где при добавлении/удалении нового диска или раздела часть букв дисков обязательно "съезжает".

Большинство современных CD-ROM для PC также подключаются к IDE. Поскольку на компакт-дисках нет разделов, то для ссылки на CD-ROM используется имя IDE-устройства -- чаще всего /dev/hdc. Инсталлятор обычно распознает CD-ROM и делает в /dev/ символьный линк типа cdrom->/dev/hdc.

Монтирование "руками"

Для монтирования служит команда mount. Обычно используется следующий формат:

mount -t тип устройство директория

В ключе "-t" указывается тип файловой системы.

Некоторые типы файловых систем
НазваниеСистема
ext2 Основная файловая система Linux (second extended filesystem)
msdos Система MS-DOS (имена 8.3)
vfat Система Windows95 (включая FAT32 в ядрах 2.2)
hpfs Система OS/2
ntfs Система WindowsNT (в ядрах 2.2)
iso9660Система CD-ROM -- включая стандартную ISO9660, RockRidge (9660 с расширениями Unix), Joliet (система для CD в Windows95/NT)
nfs Сетевая файловая система Unix
proc Специальная система ядра Unix

Пример (смонтировать раздел Windows95 C: (первый раздел первого диска)) в директорию /mnt/c):

mount -t vfat /dev/hda1 /mnt/c

Замечание
Директория, в которую производится монтирование, должна существовать -- сам ее mount не сделает.

Для указания дополнительных опций используется ключ "-o", которому указывается список опций, разделенных запятыми (без пробелов!).

Одна из самых часто используемых опций -- "ro", означающая монтирование только для чтения (ReadOnly). Ее противоположность -- "rw" (Read/Write).

Чтобы при монтировании разделов Dos/Window правильно обрабатывались имена файлов с русскими буквами, следует указывать опции "codepage=866,iocharset=windows-1251" (означает "кодировка на диске -- cp866, кодировка на экране и клавиатуре -- koi8-r"). Пример:

mount -t vfat /dev/hda1 /mnt/c -o codepage=866,iocharset=windows-1251

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

umount /dev/hda1
и

umount /mnt/c
сделают одно и то же.

Если какие-то файлы или директории из этой файловой системы используются, то umount выдаст ошибку и ничего не сделает:

bobby:~# umount /mnt/c
umount: /mnt/c: device is busy
bobby:~# _

Под "использованием" директории понимается также то, что для какого-то процесса эта директория является текущей. Например, добиться занятости /mnt/c можно, просто выполнив в любом окне команду cd /mnt/c.

Чтобы узнать, кто является "виновником", можно воспользоваться командой fuser с ключом "-m" или программой lsof.

Автоматическое монтирование -- /etc/fstab

В файле /etc/fstab (File Systems TABle) содержится информация о файловых системах -- что надо монтировать при загрузке, а также то, какие типы файловых систем и точки монтирования следует использовать для определенных устройств.

Каждая строка в /etc/fstab содержит информацию об одной файловой системе и состоит из 6 полей, разделенных пробелами. Формат строки следующий:

device mountpoint fstype options dump_freq fsck_passno

Первые 4 поля мы уже рассмотрели.

В поле "dump_freq" указывается информация для программы dump (сколь часто следует выполнять резервное копирование данной файловой системы), при добавлении строк в fstab в нем можно указывать 0.

Поле "fsck_passno" используется при загрузке программой fsck (File System Check -- произносится "эфэсчек"). При добавлении строк в fstab в нем следует указывать 2 для файловых систем Unix (ext2) и 0 для NFS и систем msdos/vfat/ntfs и т.д.

Пример файла /etc/fstab:

#
# /etc/fstab
#
#device mountpoint filesystemtype options dump fsckorder

/dev/hda4     /                   ext2    defaults        1 1
/dev/hda1     /mnt/c              vfat    defaults        0 0
/dev/hda2     /usr                ext2    defaults,ro     0 2
/dev/hda3     swap                swap    defaults        0 0
/dev/fd0      /mnt/floppy         ext2    noauto          0 0
/dev/cdrom    /mnt/cdrom          iso9660 noauto,ro       0 0

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

Предупреждение
Во многих текстовых редакторах по умолчанию включен автоматический перенос слов (word wrap). Поскольку строки в /etc/fstab обычно длинные, перед внесением изменений следует выключить автоперенос. В joe для этого надо нажать <Ctrl+T> и в появившемся меню выключить пункт Word Wrap.

Разделы для свопинга указываются в этом же файле и имеют тип "swap". Но эти строки командой mount пропускаются.

Если файловая система указана в /etc/fstab (пусть с опцией noauto), то при ручном монтировании команде mount достаточно указать лишь один параметр -- или имя устройства, или точку монтирования. Все остальное будет взято из /etc/fstab.

Следует заметить, что Linux подразумевает использование на дискетах системы ext2, а не msdos или vfat. Так что при монтировании дискеты в формате Dos следует использовать команду

mount -t vfat /mnt/floppy
.

Где еще брать информацию о работе с файловыми системами

Следует посмотреть man-страницы mount(8), umount(8), fstab(5), fuser(1), lsof(8).

Кроме того, много полезной информации содержится в главах 4 и 9 книги "UNIX: руководство системного администратора".


Сетевая файловая система NFS

Что такое NFS

Система NFS (Network File System) служит для доступа к информации, содержащейся на дисках других компьютеров. По назначению она аналогична системам SMB (Windows) и NCP (Novell).

У NFS есть существенное отличие от этих систем: при монтировании не требуется указывать пароль, а авторизация осуществляется по IP-адресу и идентификаторам пользователя и группы (UID/GID). Достоинством такого подхода является то, что монтирование по NFS может быть осуществлено без участия пользователя -- например, при загрузке системы. Недостатком является невысокий уровень security -- отсюда шутливая расшифровка аббревиатуры NFS как "No File Security".

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

Для правильной работы NFS с правами доступа к файлам требуется, чтобы UID и GID пользователей на обоих компьютерах совпадали.

Монтирование по NFS

При монтировании файловой системы по NFS в качестве типа системы надо указать "nfs", а вместо устройства -- имя компьютера и монтируемую директорию, разделенные двоеточием. Например, чтобы смонтировать директорию /dist с компьютера Rdist, можно воспользоваться командой

mount -t nfs rdist:/dist /mnt/rdist

Имя компьютера можно указывать любым образом -- короткое (rdist), полное (rdist.inp.nsk.su), или IP-адрес (193.124.167.12).

При монтировании по NFS есть большое количество опций, описанных в man-странице по nfs. Обычно же достаточно указать из соображений security "-o nosuid,nodev".

Экспорт систем по NFS

Для того, чтобы дать другим компьютерам доступ по NFS к дискам своей машины, надо отредактировать файл /etc/exports. Формат этого файла в разных клонах Unix разный (а в SystemV и сам файл называется по другому), поэтому рассмотрим только Linux.

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

/home Tom(ro) Jerry(rw)

Здесь компьютеру Tom разрешается доступ к /home только на чтение, а компьютеру Jerry -- на чтение/запись.

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

Из опций также в большинстве случаев достаточно знать "ro" и "rw".

Из соображений security лучше всегда придерживаться очень простого правила: давать доступ к как можно меньшему количеству директорий, как можно меньшему количеству компьютеров, и с как можно меньшими правами.

Чтобы после внесения изменений в /etc/exports они сразу начали действовать, надо выполнить команду exportfs.

Автомонтировщик amd

При монтировании систем с нескольких компьютеров становится довольно неприятно постоянно отслеживать все изменения и вносить их в /etc/fstab.

Кроме того, если компьютеры A и B дают друг другу доступ, то при включении или A не сможет смонтировать системы с B, потому, что тот еще не загрузился, или наоборот (а при большем числе компьютеров ситуация еще хуже).

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

В Linux автомонтировщик называется amd, и содержится он в пакете am-utils (вплоть до RedHat 4.2 включительно этот пакет назывался amd). Хотя amd умеет также автоматически монтировать съемные носители (CD-ROM, дискеты, Zip), в основном он используется именно для NFS.

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

Одна из самых ценных возможностей, предоставляемых автомонтированием -- то, что при установке новых пакетов не требуется предварительно скачивать .rpm-файлы по FTP. Можно устанавливать прямо по NFS с сервера, беря файлы в /net/. Например, для RedHat 5.2 в ИЯФ можно использовать путь

/net/rdist/dist/redhat-5.2/i386/RedHat/RPMS/
это та же самая директория, которая видна как

ftp://rdist.inp.nsk.su/pub/Linux/redhat-5.2/i386/RedHat/RPMS/
(более конкретно -- /net/rdist/dist/ -- это то же самое, что ftp://rdist.inp.nsk.su/pub/Linux/).

Где еще брать информацию о работе с NFS

Следует посмотреть man-страницы nfs(5), exports(5), amd(5).

Кроме того, много полезной информации содержится в главах 4 и 9 книги "UNIX: руководство системного администратора".


Практические задания
  1. Создать пользователя "rabbit" с UID=20000, паролем "Qwe123x", и поставить ему в качестве shell "/bin/zsh"
  2. Прочитав man по groupadd, создать группу "beasts" с GID=5000. Создать пользователей "tom" и "jerry", принадлежащих к этой группе, так, чтобы их home-директории были /home/beasts/tom и /home/beasts/jerry соответственно.
  3. Прочитав в man-странице "zshparam" про переменную окружения PS1, изменить PS1 в текущем окне так, чтобы в приглашении показывалась текущая директория и текущее время.
  4. Сделать так, чтобы переменной PS1 присваивалось то же самое значение при входе в систему (подсказка: это делается при помощи стартовых файлов shell в home-директории). (Замечание: это задание надо выполнять не как "root", а как обычный пользователь, в своей home-директории.)

    Замечание
    Все обновленные пакеты (updates) доступны в директории /net/class/mnt/rdist/redhat-5.2/updates/i386/.

  5. Сделать upgrade пакета pine до версии 4.10.
  6. Сделать upgrade пакетов netscape-... с версии 4.07 до 4.08.
  7. Удалить пакет lynx.
  8. Смонтировать /dev/hda1 в директорию /mnt/c с типом "msdos".
  9. Вставить в /etc/fstab строку для /dev/hda1: точка монтирования -- /mnt/c, тип -- "vfat"; чтобы русские имена показывались нормально.
  10. Смонтировать "руками" class:/mnt/rdist в /mnt/rdist.
  11. Договорившись с соседом, открыть друг другу по NFS директории /home только для чтения, и затем проверить, что это работает, посмотрев содержтмое директории /net/соседский_компьютер/.

----------------------------------------

© 1999 Дмитрий Болховитянов