Глава 3. Основы FreeBSD

Этот перевод может быть устаревшим. Для того, чтобы помочь с переводом, пожалуйста, обратитесь к Сервер переводов FreeBSD.

3.1. Обзор

В этой главе рассматриваются основные команды и функциональные возможности операционной системы FreeBSD. Большая часть материала применима к любым UNIX®-подобным операционным системам. Новым пользователям FreeBSD рекомендуется внимательно ознакомиться с этой главой.

Прочитайте эту главу, чтобы узнать:

  • Как использовать и настраивать виртуальные консоли.

  • Как создавать пользователей и группы пользователей во FreeBSD и управлять ими.

  • Как работают права доступа на файлы в UNIX® и файловые флаги во FreeBSD.

  • Иерархию каталогов FreeBSD.

  • Организация дисков в FreeBSD.

  • Как монтировать и размонтировать файловые системы.

  • Что такое процессы, демоны и сигналы.

  • Что такое оболочка и как изменить среду входа по умолчанию.

  • Как использовать основные текстовые редакторы.

  • Что такое устройства и узлы устройств.

  • Как читать справочные страницы для получения дополнительной информации.

3.2. Виртуальные консоли и терминалы

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

FreeBSD/amd64 (pc3.example.org) (ttyv0)

login:

Первая строка содержит некоторую информацию о системе. amd64 указывает, что FreeBSD работает на 64-битной x86 системе. Имя хоста — pc3.example.org, а ttyv0 означает, что это «системная консоль». Вторая строка — это приглашение для входа в систему.

Поскольку FreeBSD — это многопользовательская система, требуется способ различать пользователей. Для этого необходимо, чтобы каждый пользователь вошел в систему перед получением доступа к программам. У каждого пользователя есть уникальное «имя пользователя» и личный «пароль».

Для входа в системную консоль введите имя пользователя, заданное при установке системы, как описано в Добавление пользователей, и нажмите Enter. Затем введите пароль, связанный с этим именем пользователя, и нажмите Enter. Пароль не отображается в целях безопасности.

После ввода правильного пароля будет отображено сообщение дня (MOTD), за которым последует приглашение командной строки. В зависимости от выбранной оболочки при создании пользователя, это приглашение может быть символом #, $ или %. Приглашение указывает, что пользователь теперь вошел в консоль системы FreeBSD и готов попробовать доступные команды.

3.2.1. Виртуальные консоли

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

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

Сочетания клавиш Alt+F1Alt+F8 зарезервированы в FreeBSD для переключения между виртуальными консолями. Используйте Alt+F1 для перехода к системной консоли (ttyv0), Alt+F2 для доступа к первой виртуальной консоли (ttyv1), Alt+F3 для доступа ко второй виртуальной консоли (ttyv2) и так далее. При использовании Xorg в качестве графической консоли для возврата к текстовой виртуальной консоли используется сочетание Ctrl+Alt+F1.

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

Обратитесь к kbdcontrol(1), vidcontrol(1), atkbd(4), syscons(4) и vt(4) для более технического описания консоли FreeBSD и её драйверов клавиатуры.

В FreeBSD количество доступных виртуальных консолей настраивается в этом разделе /etc/ttys:

# name    getty                         type  status comments
#
ttyv0   "/usr/libexec/getty Pc"         xterm   on  secure
# Virtual terminals
ttyv1   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv2   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv3   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv4   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv5   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv6   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv7   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv8   "/usr/X11R6/bin/xdm -nodaemon"  xterm   off secure

Чтобы отключить виртуальную консоль, поставьте символ комментария (#) в начале строки, соответствующей этой виртуальной консоли. Например, чтобы уменьшить количество доступных виртуальных консолей с восьми до четырёх, добавьте # перед последними четырьмя строками, представляющими виртуальные консоли ttyv5 до ttyv8. Не комментируйте строку системной консоли ttyv0. Обратите внимание, что последняя виртуальная консоль (ttyv8) используется для доступа к графической среде, если Xorg установлен и настроен, как описано в Система X Window.

Для подробного описания каждой колонки в этом файле и доступных опций для виртуальных консолей обратитесь к ttys(5).

3.2.2. Однопользовательский режим

В меню загрузки FreeBSD есть пункт с названием "Boot Single User". При выборе этого пункта система загрузится в особый режим, известный как "однопользовательский режим". Этот режим обычно используется для восстановления системы, которая не загружается, или для сброса пароля root, если он неизвестен. В однопользовательском режиме сеть и другие виртуальные консоли недоступны. Однако предоставляется полный доступ root к системе, и по умолчанию пароль root не требуется. По этим причинам для загрузки в этом режиме необходим физический доступ к клавиатуре, и определение того, кто имеет такой доступ, является важным аспектом обеспечения безопасности системы FreeBSD.

Настройки, управляющие однопользовательским режимом, находятся в этом разделе файла /etc/ttys:

# name  getty                           type  status  comments
#
# If console is marked "insecure", then init will ask for the root password
# when going to single-user mode.
console none                            unknown  off  secure

По умолчанию статус установлен в secure. Это предполагает, что тот, кто имеет физический доступ к клавиатуре, либо не важен, либо контролируется политикой физической безопасности. Если этот параметр изменён на insecure, предполагается, что среда сама по себе небезопасна, так как любой может получить доступ к клавиатуре. При изменении этой строки на insecure FreeBSD будет запрашивать пароль root, когда пользователь выбирает загрузку в однопользовательском режиме.

Будьте осторожны при изменении этой настройки на insecure! Если пароль root забыт, загрузка в однопользовательском режиме всё ещё возможна, но может быть затруднительна для тех, кто не знаком с процессом загрузки FreeBSD.

3.2.3. Изменение видеорежимов консоли

Режим видео по умолчанию в консоли FreeBSD может быть изменён на 1024x768, 1280x1024 или любой другой, поддерживаемый графическим чипом и монитором. Для использования другого видео режима загрузите модуль VESA:

# kldload vesa

Для определения видеорежимов, поддерживаемых оборудованием, используйте vidcontrol(1). Чтобы получить список поддерживаемых видеорежимов, выполните следующую команду:

# vidcontrol -i mode

Результат выполнения этой команды выводит список видеорежимов, поддерживаемых оборудованием. Чтобы выбрать новый видеорежим, укажите режим с помощью vidcontrol(1) от имени пользователя root:

# vidcontrol MODE_279

Если новый видео-режим приемлем, его можно установить постоянным при загрузке, добавив в /etc/rc.conf:

allscreens_flags="MODE_279"

3.3. Пользователи и базовая настройка учетных записей

FreeBSD позволяет нескольким пользователям одновременно работать на компьютере. Хотя только один пользователь может находиться перед экраном и использовать клавиатуру в любой момент времени, любое количество пользователей может войти в систему через сеть. Для использования системы каждый пользователь должен иметь свою собственную учетную запись.

Эта глава описывает:

  • Типы учетных записей пользователей в системе FreeBSD.

  • Как добавлять, удалять и изменять учетные записи пользователей.

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

  • Как создавать группы и добавлять пользователей в качестве членов группы.

3.3.1. Типы учетных записей

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

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

3.3.1.1. Системные учетные записи

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

Примеры системных учетных записей: daemon, operator, bind, news и www.

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

3.3.1.2. Пользовательские учетные записи

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

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

Каждая учетная запись пользователя в системе FreeBSD имеет определенную связанную с ней информацию:

Имя пользователя

Имя пользователя вводится в приглашении login:. У каждого пользователя должно быть уникальное имя. Существует ряд правил для создания допустимых имен пользователей, которые описаны в passwd(5). Рекомендуется использовать имена, состоящие из восьми или менее строчных символов, для обеспечения обратной совместимости с приложениями.

Пароль

У каждой учетной записи есть связанный с ней пароль.

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

Идентификатор пользователя (UID) — это число, используемое для однозначной идентификации пользователя в системе FreeBSD. Команды, которые позволяют указать имя пользователя, сначала преобразуют его в UID. Рекомендуется использовать UID меньше 65535, так как более высокие значения могут вызвать проблемы совместимости с некоторым программным обеспечением.

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

Идентификатор группы (GID) — это число, используемое для однозначной идентификации основной группы, к которой принадлежит пользователь. Группы представляют собой механизм управления доступом к ресурсам на основе GID пользователя, а не его UID. Это может значительно уменьшить размер некоторых конфигурационных файлов и позволяет пользователям быть членами более чем одной группы. Рекомендуется использовать GID 65535 или меньше, так как более высокие GID могут привести к неработоспособности некоторых программ.

Класс входа (Login class)

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

Время изменения пароля

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

Время истечения срока действия учетной записи

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

Полное имя пользователя

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

Домашний каталог

Домашний каталог — это полный путь к каталогу в системе. Это стартовый каталог пользователя при входе в систему. Общепринятое соглашение — размещать все домашние каталоги пользователей в /home/имя_пользователя или /usr/home/имя_пользователя. Каждый пользователь хранит свои личные файлы и подкаталоги в собственном домашнем каталоге.

Оболочка пользователя

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

3.3.1.3. Учетная запись суперпользователя

Учетная запись суперпользователя, обычно называемая root, используется для управления системой без ограничений в правах. По этой причине её не следует использовать для повседневных задач, таких как отправка и получение почты, обычное изучение системы или программирование.

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

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

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

Вместо этого используйте su(1), чтобы стать суперпользователем. Если при выполнении этой команды указан параметр -, пользователь также унаследует окружение пользователя root. Пользователь, выполняющий эту команду, должен состоять в группе wheel, иначе команда завершится ошибкой. Пользователь также должен знать пароль учётной записи root.

В этом примере пользователь становится суперпользователем только для выполнения команды make install, так как этот шаг требует прав суперпользователя. После завершения команды пользователь вводит exit, чтобы выйти из учётной записи суперпользователя и вернуться к правам своей учётной записи.

Пример 1. Установка программы от имени суперпользователя
% configure
% make
% su -
Password:
# make install
# exit
%

Встроенная система su(1) хорошо подходит для отдельных компьютеров или небольших сетей с одним системным администратором. Альтернативой является установка пакета security/sudo или порта. Это программное обеспечение обеспечивает журналирование действий и позволяет администратору настроить, какие пользователи могут выполнять определённые команды с правами суперпользователя.

3.3.2. Управление учетными записями

FreeBSD предоставляет различные команды для управления учетными записями пользователей. Наиболее распространённые команды перечислены в Утилиты для управления учетными записями пользователей, а также приведены примеры их использования. Для получения дополнительной информации и примеров использования обратитесь к руководству (man) каждой утилиты.

Таблица 1. Утилиты для управления учетными записями пользователей

Команда

Краткое содержание

adduser(8)

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

rmuser(8)

Рекомендуемое приложение командной строки для удаления пользователей.

chpass(1)

Гибкий инструмент для изменения информации в пользовательской базе данных.

passwd(1)

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

pw(8)

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

bsdconfig(8)

Утилита для настройки системы с поддержкой управления учётными записями.

3.3.2.1. Добавление пользователя

Рекомендуемая программа для добавления новых пользователей — adduser(8). При добавлении нового пользователя эта программа автоматически обновляет /etc/passwd и /etc/group. Она также создаёт домашний каталог для нового пользователя, копирует в него стандартные конфигурационные файлы из /usr/share/skel и может отправить новому пользователю приветственное письмо. Эту утилиту необходимо запускать от имени суперпользователя.

Утилита adduser(8) интерактивна и проводит пользователя через шаги создания новой учётной записи. Как показано в Добавление пользователя в FreeBSD, можно ввести необходимую информацию или нажать Enter, чтобы принять значение по умолчанию, указанное в квадратных скобках. В этом примере пользователь был добавлен в группу wheel, что позволяет ему стать суперпользователем с помощью su(1). По завершении утилита предложит создать ещё одного пользователя или выйти.

Пример 2. Добавление пользователя в FreeBSD
# adduser

Вывод должен быть похож на следующий:

Username: jru
Full name: J. Random User
Uid (Leave empty for default):
Login group [jru]:
Login group is jru. Invite jru into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: zsh
Home directory [/home/jru]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : jru
Password   : ****
Full Name  : J. Random User
Uid        : 1001
Class      :
Groups     : jru wheel
Home       : /home/jru
Shell      : /usr/local/bin/zsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (jru) to the user database.
Add another user? (yes/no): no
Goodbye!

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

3.3.2.2. Удаление пользователя

Чтобы полностью удалить пользователя из системы, выполните команду rmuser(8) с правами суперпользователя. Эта команда выполняет следующие действия:

  1. Удаляет запись пользователя в crontab(1), если она существует.

  2. Удаляет все задания at(1), принадлежащие пользователю.

  3. Посылает сигнал SIGKILL всем процессам, принадлежащим пользователю.

  4. Удаляет пользователя из локального файла паролей системы.

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

  6. Удаляет входящие почтовые файлы пользователя из /var/mail.

  7. Удаляет все файлы, принадлежащие пользователю, из /tmp, /var/tmp и /var/tmp/vi.recover.

  8. Удаляет имя пользователя из всех групп, к которым он принадлежит в /etc/group. (Если группа становится пустой и имя группы совпадает с именем пользователя, группа удаляется; это дополняет функциональность adduser(8) в части уникальных групп для каждого пользователя.)

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

rmuser(8) не может быть использован для удаления учетных записей суперпользователя, так как это почти всегда свидетельствует о катастрофических последствиях.

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

Пример 3. rmuser Интерактивное удаление учетной записи
# rmuser jru

Вывод должен быть похож на следующий:

Matching password entry:
jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
Is this the entry you wish to remove? y
Remove user's home directory (/home/jru)? y
Removing user (jru): mailspool home passwd.

3.3.2.3. Изменить информацию о пользователе

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

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

Этотa утилитa запрашивает пароль пользователя при выходе из редактора, если только она не запущена от имени суперпользователя.

В Использование chpass суперпользователем, суперпользователь ввел chpass jru и теперь видит поля, которые можно изменить для этого пользователя. Если же команду выполнит сам jru, будут отображены и доступны для редактирования только последние шесть полей. Это показано в Использование chpass обычным пользователем.

Пример 4. Использование chpass с правами суперпользователя
# chpass jru

Вывод должен быть похож на следующий:

# Changing user database information for jru.
Login: jru
Password: *
Uid [#]: 1001
Gid [# or name]: 1001
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/jru
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:
Пример 5. Использование chpass обычным пользователем
#Changing user database information for jru.
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:

Команды chfn(1) и chsh(1) являются ссылками на chpass(1), как и ypchpass(1), ypchfn(1) и ypchsh(1). Поскольку поддержка NIS автоматическая, указывать yp перед командой не требуется. Настройка NIS описана в Сетевые серверы.

3.3.2.4. Изменение пароля пользователя

Любой пользователь может легко изменить свой пароль с помощью passwd(1). Для предотвращения случайных или несанкционированных изменений эта команда запросит исходный пароль пользователя перед установкой нового пароля:

Пример 6. Смена собственного пароля
% passwd

Вывод должен быть похож на следующий:

Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done

Суперпользователь может изменить пароль любого пользователя, указав имя пользователя при запуске passwd(1). При запуске этой утилиты с правами суперпользователя она не запрашивает текущий пароль пользователя. Это позволяет изменить пароль, если пользователь не может вспомнить исходный пароль.

Пример 7. Изменение пароля другого пользователя суперпользователем
# passwd jru

Вывод должен быть похож на следующий:

Changing local password for jru.
New password:
Retype new password:
passwd: updating the database...
passwd: done

Как и chpass(1), yppasswd(1) является ссылкой на passwd(1), поэтому NIS работает с любой из этих команд.

3.3.2.5. Создание, удаление, изменение и отображение пользователей и групп системы

Утилита pw(8) может создавать, удалять, изменять и отображать пользователей и группы. Она работает как интерфейс к системным файлам пользователей и групп. pw(8) обладает мощным набором параметров командной строки, что делает её пригодной для использования в shell-скриптах, но новым пользователям она может показаться сложнее других команд, представленных в этом разделе.

3.3.3. Управление группами

Группа — это список пользователей. Группа идентифицируется по своему названию и GID. В FreeBSD ядро использует UID процесса и список групп, к которым он принадлежит, чтобы определить, что процесс может делать. В большинстве случаев под GID пользователя или процесса обычно подразумевается первая группа в списке.

Соответствие имен групп и GID перечислено в /etc/group. Это простой текстовый файл с четырьмя полями, разделенными двоеточиями. Первое поле — имя группы, второе — зашифрованный пароль, третье — GID, а четвертое — список участников, разделенных запятыми. Полное описание синтаксиса смотрите в group(5).

Суперпользователь может изменить /etc/group с помощью текстового редактора, однако предпочтительнее редактировать файл групп с помощью vigr(8), так как это позволяет избежать некоторых распространённых ошибок. Альтернативно, для добавления и редактирования групп можно использовать pw(8). Например, чтобы добавить группу с именем teamtwo и затем убедиться, что она существует:

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

Пример 8. Добавление группы с помощью pw(8)
# pw groupadd teamtwo
# pw groupshow teamtwo

Вывод должен быть похож на следующий:

teamtwo:*:1100:

В этом примере 1100 — это GID группы teamtwo. На данный момент в teamtwo нет участников. Эта команда добавит jru в качестве участника teamtwo.

Пример 9. Добавление пользовательских учетных записей в новую группу с помощью pw(8)
# pw groupmod teamtwo -M jru
# pw groupshow teamtwo

Вывод должен быть похож на следующий:

teamtwo:*:1100:jru

Аргумент -M представляет собой разделённый запятыми список пользователей, которые будут добавлены в новую (пустую) группу или заменят членов существующей группы. Для пользователя это членство в группе отличается от (и дополняет) его основной группы, указанной в файле паролей. Это означает, что пользователь не будет отображаться как член группы при использовании groupshow с pw(8), но будет виден при запросе информации через id(1) или аналогичный инструмент. Когда pw(8) используется для добавления пользователя в группу, он только изменяет /etc/group и не пытается читать дополнительные данные из /etc/passwd.

Пример 10. Добавление нового участника в группу с помощью pw(8)
# pw groupmod teamtwo -m db
# pw groupshow teamtwo

Вывод должен быть похож на следующий:

teamtwo:*:1100:jru,db

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

Пример 11. Использование id(1) для определения членства в группе
% id jru

Вывод должен быть похож на следующий:

uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)

В этом примере jru является участником групп jru и teamtwo.

Для получения дополнительной информации об этой команде и формате файла /etc/group обратитесь к pw(8) и group(5).

3.4. Разрешения

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

В этом разделе рассматриваются традиционные права доступа UNIX®, используемые в FreeBSD. Для более детального управления доступом к файловой системе обратитесь к разделу Списки контроля доступа.

В UNIX® базовые права доступа назначаются с использованием трех типов доступа: чтение, запись и выполнение. Эти типы доступа определяют права на файл для владельца, группы и остальных (всех остальных). Права на чтение, запись и выполнение могут быть представлены буквами r, w и x. Они также могут быть представлены в виде двоичных чисел, так как каждое право либо включено, либо выключено (0). При представлении в виде чисел порядок всегда читается как rwx, где r имеет значение 4, w2, а x1.

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

Таблица 2. Права доступа UNIX®
ЗначениеРазрешениеСписок файлов каталога

0

Нет чтения, нет записи, нет выполнения

---

1

Нет чтения, нет записи, выполнение

--x

2

Нет чтения, записи, выполнения

-w-

3

Нет прав на чтение, запись, выполнение

-wx

4

Чтение, нет записи, нет выполнения

r--

5

Чтение, нет записи, выполнение

r-x

6

Чтение, запись, без выполнения

rw-

7

Чтение, запись, выполнение

rwx

Используйте аргумент -l с ls(1) для просмотра длинного списка каталога, который включает колонку с информацией о правах доступа к файлу для владельца, группы и всех остальных. Например, ls -l в произвольном каталоге может вывести:

% ls -l

Вывод должен быть похож на следующий:

total 530
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
-rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt

Рассматривая строку для файла myfile, первый (крайний слева) символ указывает, является ли этот файл обычным файлом, каталогом, специальным символьным устройством, сокетом или любым другим специальным псевдофайловым устройством. В данном примере символ - обозначает обычный файл. Следующие три символа, в этом примере rw-, указывают права для владельца файла. Следующие три символа, r--, указывают права для группы, к которой принадлежит файл. Последние три символа, r--, указывают права для всех остальных. Дефис означает, что право отключено. В этом примере права настроены так, что владелец может читать и записывать файл, группа может читать файл, а все остальные могут только читать файл. Согласно приведённой выше таблице, права для этого файла будут 644, где каждая цифра представляет одну из трёх частей прав файла.

Как система управляет правами доступа к устройствам? FreeBSD рассматривает большинство аппаратных устройств как файлы, которые программы могут открывать, читать и записывать в них данные. Эти специальные файлы устройств хранятся в /dev/.

Каталоги также рассматриваются как файлы. У них есть права на чтение, запись и выполнение. Бит выполнения для каталога имеет несколько иное значение, чем для файлов. Если каталог помечен как исполняемый, это означает, что в него можно перейти с помощью cd(1). Это также означает, что можно получить доступ к файлам внутри этого каталога, в зависимости от прав на сами файлы.

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

Существуют и другие биты разрешений, но они в основном используются в особых случаях, таких как setuid-бинарники и sticky-каталоги. Для получения дополнительной информации о правах доступа к файлам и их настройке обратитесь к chmod(1).

3.4.1. Символьные права доступа

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

ОпцияБукваПредставляет

(кто)

u

Пользователь

(кто)

g

Владелец группы

(кто)

o

Другие

(кто)

a

Все (all, "world")

(действие)

+

Добавление разрешений

(действие)

-

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

(действие)

=

Явно заданные разрешения

(права доступа)

r

Чтение

(права доступа)

w

Запись

(права доступа)

x

Выполнение

(права доступа)

t

Бит закрепления (sticky)

(права доступа)

s

Установка UID или GID

Эти значения используются с chmod(1), но с буквами вместо чисел. Например, следующая команда запретит доступ к FILE как членам группы, связанной с FILE, так и всем остальным пользователям:

% chmod go= FILE

Список, разделённый запятыми, может быть указан, если к файлу необходимо применить более одного изменения. Например, следующая команда удаляет разрешение на запись для группы и всех остальных пользователей у FILE, а также добавляет разрешение на выполнение для всех:

% chmod go-w,a+x FILE

3.4.2. Флаги файлов FreeBSD

В дополнение к правам доступа к файлам FreeBSD поддерживает использование "флагов файлов". Эти флаги добавляют дополнительный уровень безопасности и контроля над файлами, но не над каталогами. С помощью флагов файлов даже пользователь root может быть лишён возможности удалять или изменять файлы.

Флаги файлов изменяются с помощью chflags(1). Например, чтобы установить системный флаг «неудаляемый» для файла file1, выполните следующую команду:

# chflags sunlink file1

Чтобы отключить системный флаг "неудаляемый", добавьте "no" перед sunlink:

# chflags nosunlink file1

Чтобы просмотреть флаги файла, используйте -lo с ls(1):

# ls -lo file1
-rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1

Некоторые флаги файлов могут быть добавлены или удалены только пользователем root. В остальных случаях владелец файла может устанавливать его флаги. Дополнительную информацию можно найти в chflags(1) и chflags(2).

3.4.3. Установленные биты setuid, setgid и sticky

Помимо уже рассмотренных прав доступа, существуют три специальных параметра, которые должны знать все администраторы. Это права setuid, setgid и sticky.

Эти настройки важны для некоторых операций UNIX®, так как предоставляют функциональность, обычно недоступную обычным пользователям. Чтобы понять их, необходимо отметить разницу между реальным идентификатором пользователя (real user ID) и эффективным идентификатором пользователя (effective user ID).

Реальный идентификатор пользователя (UID) — это UID, который владеет или запускает процесс. Эффективный идентификатор пользователя — это UID, от имени которого выполняется процесс. Например, passwd(1) запускается с реальным UID, когда пользователь меняет свой пароль. Однако для обновления базы данных паролей команда выполняется с эффективным UID пользователя root. Это позволяет пользователям изменять свои пароли без ошибки Permission Denied.

Разрешение setuid может быть добавлено символически путем добавления права s для пользователя, как в следующем примере:

# chmod u+s suidexample.sh

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

# chmod 4755 suidexample.sh

Разрешения для файла suidexample.sh теперь выглядят следующим образом:

-rwsr-xr-x   1 trhodes  trhodes    63 Aug 29 06:36 suidexample.sh

Обратите внимание, что s теперь является частью набора прав для владельца файла, заменив бит исполнения. Это позволяет создавать программы, требующие повышенных прав, таких как passwd(1).

Опция nosuid в mount(8) приведёт к тихому отказу таких бинарных файлов без уведомления пользователя. Эта опция не полностью надёжна, так как обёртка nosuid может её обойти.

Чтобы наблюдать это в реальном времени, откройте два терминала. В одном введите passwd как обычный пользователь. Пока команда ожидает ввода нового пароля, проверьте таблицу процессов и посмотрите информацию о пользователе для passwd(1):

В терминале A:

Changing local password for trhodes
Old Password:

В терминале B:

# ps aux | grep passwd
trhodes  5232  0.0  0.2  3420  1608   0  R+    2:10AM   0:00.00 grep passwd
root     5211  0.0  0.2  3620  1724   2  I+    2:09AM   0:00.01 passwd

Хотя passwd(1) запускается от имени обычного пользователя, он использует эффективный UID root.

Разрешение setgid выполняет ту же функцию, что и разрешение setuid, за исключением того, что оно изменяет настройки группы. Когда приложение или утилита запускается с этой настройкой, оно получает разрешения в соответствии с группой, которой принадлежит файл, а не пользователем, запустившим процесс.

Чтобы установить право setgid на файл в символьном виде, добавьте право s для группы с помощью chmod(1):

# chmod g+s sgidexample.sh

В качестве альтернативы укажите в chmod(1) ведущую двойку (2):

# chmod 2755 sgidexample.sh

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

-rwxr-sr-x   1 trhodes  trhodes    44 Aug 31 01:49 sgidexample.sh

В этих примерах, даже если рассматриваемый shell-скрипт является исполняемым файлом, он не будет запускаться с другим EUID или эффективным идентификатором пользователя. Это происходит потому, что shell-скрипты не могут использовать системные вызовы setuid(2).

setuid и setgid биты прав могут снизить безопасность системы, предоставляя повышенные привилегии. Третий специальный бит прав, sticky bit, напротив, может повысить безопасность системы.

Когда sticky bit установлен на каталоге, он разрешает удаление файлов только владельцу файла. Это полезно для предотвращения удаления файлов в общедоступных каталогах, таких как /tmp, пользователями, не являющимися владельцами файла. Чтобы использовать этот режим доступа, добавьте режим t к файлу:

# chmod +t /tmp

В качестве альтернативы можно добавить единицу (1) перед набором прав доступа:

# chmod 1777 /tmp

Разрешение sticky bit отображается как t в самом конце набора разрешений:

# ls -al / | grep tmp
drwxrwxrwt  10 root  wheel         512 Aug 31 01:49 tmp

3.5. Структура каталогов

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

Точка монтирования — это каталог, в который можно подключить дополнительные файловые системы к родительской файловой системе (обычно корневой файловой системе). Это подробно описано в разделе Организация дисков. Стандартные точки монтирования включают /usr/, /var/, /tmp/, /mnt/ и /media/. Эти каталоги обычно связаны с записями в файле /etc/fstab. Этот файл представляет собой таблицу различных файловых систем и точек монтирования, которая читается системой. Большинство файловых систем в /etc/fstab автоматически монтируются при загрузке с помощью скрипта rc(8), если их запись не содержит параметра noauto. Подробности можно найти в разделе Файл fstab.

Полное описание иерархии файловой системы доступно в hier(7). В следующей таблице представлен краткий обзор наиболее распространённых каталогов.

Каталог

Описание

/

Корневой каталог файловой системы.

/bin/

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

/boot/

Программы и конфигурационные файлы, используемые при загрузке операционной системы.

/boot/defaults/

Файлы конфигурации загрузки по умолчанию. Подробности смотрите в loader.conf(5).

/dev/

Специальные файлы устройств, управляемые devfs(5)

/etc/

Системные конфигурационные файлы и скрипты.

/etc/defaults/

Файлы конфигурации системы по умолчанию. Подробности смотрите в rc(8).

/etc/periodic/

Скрипты, выполняемые ежедневно, еженедельно и ежемесячно, через cron(8). Подробности смотрите в periodic(8).

/lib/

Критические системные библиотеки, необходимые для бинарных файлов в /bin и /sbin

/libexec/

Критические системные файлы

/media/

Содержит подкаталоги, предназначенные для использования в качестве точек монтирования съемных носителей, таких как компакт-диски, USB-накопители и дискеты

/mnt/

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

/net/

Автомонтируемые NFS-ресурсы; см. auto_master(5)

/proc/

Файловая система процессов. Подробности смотрите в procfs(5).

/rescue/

Статически связанные программы для аварийного восстановления, как описано в rescue(8).

/root/

Домашний каталог для учетной записи root.

/sbin/

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

/tmp/

Временные файлы, которые обычно не сохраняются после перезагрузки системы. Часто в /tmp монтируется файловая система в памяти. Это можно автоматизировать, используя переменные, связанные с tmpmfs, из rc.conf(5), или добавив запись в /etc/fstab; подробности смотрите в mdmfs(8).

/usr/

Большинство пользовательских утилит и приложений.

/usr/bin/

Общие утилиты, инструменты программирования и приложения.

/usr/include/

Стандартные включаемые файлы языка C.

/usr/lib/

Библиотеки архивов.

/usr/libdata/

Различные вспомогательные файлы данных.

/usr/libexec/

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

/usr/local/

Локальные исполняемые файлы и библиотеки. Также используется как путь по умолчанию для установки портов FreeBSD. Внутри /usr/local должна использоваться общая структура каталогов, описанная в hier(7) для /usr. Исключениями являются каталог man, который находится непосредственно в /usr/local, а не в /usr/local/share, а документация портов располагается в share/doc/port.

/usr/ports/

Коллекция портов FreeBSD (опционально).

/usr/sbin/

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

/usr/share/

Архитектурно-независимые файлы.

/usr/src/

BSD и/или локальные исходные файлы.

/var/

Многоцелевые файлы журналов, временные, транзиентные и файлы очередей.

/var/log/

Различные системные журналы.

/var/tmp/

Временные файлы, которые обычно сохраняются после перезагрузки системы.

3.6. Организация диска

Наименьшей единицей организации, которую FreeBSD использует для поиска файлов, является имя файла. Имена файлов чувствительны к регистру, что означает, что readme.txt и README.TXT — это два разных файла. FreeBSD не использует расширение файла для определения, является ли файл программой, документом или каким-либо другим видом данных.

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

Файлы и каталоги указываются путём перечисления имени файла или каталога, за которым следует косая черта /, а затем — при необходимости — другие имена каталогов. Например, если каталог foo содержит каталог bar, в котором находится файл readme.txt, то полное имя или путь к файлу будет foo/bar/readme.txt. Обратите внимание, что это отличается от Windows®, где для разделения имён файлов и каталогов используется \. В FreeBSD не используются буквы дисков или другие обозначения накопителей в пути. Например, в FreeBSD не указывают путь вида c:\foo\bar\readme.txt.

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

Каталоги и файлы хранятся в файловой системе. Каждая файловая система содержит ровно один каталог на самом верхнем уровне, называемый корневым каталогом для этой файловой системы. Этот корневой каталог может содержать другие каталоги. Одна файловая система назначается корневой файловой системой или /. Все остальные файловые системы монтируются в корневую файловую систему. Независимо от количества дисков в системе FreeBSD, каждый каталог выглядит как часть одного и того же диска.

Рассмотрим три файловые системы: A, B и C. Каждая файловая система имеет один корневой каталог, который содержит два других каталога с именами A1, A2 (аналогично B1, B2 и C1, C2).

Назовем корневую файловую систему A. Если использовать ls(1) для просмотра содержимого этого каталога, будут видны два подкаталога, A1 и A2. Дерево каталогов выглядит следующим образом:

Дерево каталогов с корневым каталогом и двумя подкаталогами

Файловая система должна быть смонтирована в каталог другой файловой системы. При монтировании файловой системы B в каталог A1 корневой каталог B заменяет A1, а каталоги в B отображаются соответствующим образом:

Дерево каталогов с корневым каталогом и двумя подкаталогами

Любые файлы в каталогах B1 или B2 доступны по пути /A1/B1 или /A1/B2 соответственно. Файлы, которые находились в /A1, временно скрыты. Они снова станут доступны, если B будет отмонтирован из A.

Если бы B был смонтирован на A2, то диаграмма выглядела бы так:

Дерево каталогов с корневым каталогом и двумя подкаталогами

и пути будут /A2/B1 и /A2/B2 соответственно.

Файловые системы могут монтироваться одна поверх другой. Продолжая последний пример, файловая система C может быть смонтирована поверх каталога B1 в файловой системе B, что приведёт к следующей структуре:

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

Или C может быть непосредственно смонтирована в файловую систему A, в каталог A1:

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

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

Преимущества нескольких файловых систем
  • Различные файловые системы могут иметь разные параметры монтирования. Например, корневая файловая система может быть смонтирована в режиме только для чтения, что предотвращает случайное удаление или редактирование важных файлов пользователями. Разделение файловых систем, доступных для записи пользователями, таких как /home, от остальных позволяет монтировать их с опцией nosuid. Эта опция предотвращает действие битов suid/guid у исполняемых файлов, хранящихся в данной файловой системе, что может повысить безопасность.

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

  • Файловые системы FreeBSD устойчивы к потере питания. Однако отключение питания в критический момент всё же может повредить структуру файловой системы. Разделение данных между несколькими файловыми системами увеличивает вероятность успешной загрузки системы, упрощая восстановление из резервной копии при необходимости.

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

    FreeBSD предоставляет команду growfs(8), которая позволяет увеличивать размер файловой системы на лету, устраняя это ограничение. Файловая система может быть расширена только в свободное пространство раздела, в котором она находится. Если после раздела есть место, сам раздел можно расширить с помощью gpart(8). Если раздел является последним на виртуальном диске и диск расширен, то раздел также можно расширить.

3.6.2. Разделы диска

Файловые системы содержатся в разделах. Диски разделяются на разделы с использованием одной из нескольких схем разметки; см. Ручная разметка разделов. Более новая схема — GPT; старые компьютеры на базе BIOS используют MBR. GPT поддерживает разделение диска на разделы с указанием размера, смещения и типа. Она поддерживает большое количество разделов и их типов, и рекомендуется к использованию везде, где это возможно. Разделы GPT используют имя диска с суффиксом, где суффикс p1 соответствует первому разделу, p2 — второму и так далее. MBR, однако, поддерживает только небольшое количество разделов. Разделы MBR в FreeBSD называются слайсами. Слайсы могут использоваться для разных операционных систем. Слайсы FreeBSD дополнительно разбиваются на разделы с использованием меток BSD (см. bsdlabel(8)).

Номера слайсов указываются после имени устройства с префиксом s и начинаются с 1. Таким образом, "da0s1" — это первый слайс на первом SCSI-диске. На диске может быть только четыре физических слайса, но внутри физических слайсов соответствующего типа могут находиться логические слайсы. Эти расширенные слайсы нумеруются, начиная с 5, поэтому "ada0s5" — это первый расширенный слайс на первом SATA-диске. Эти устройства используются файловыми системами, которые предназначены для размещения в слайсе.

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

FreeBSD также использует место на диске для раздела подкачки (swap space), чтобы обеспечить работу виртуальной памяти. Это позволяет компьютеру вести себя так, как будто у него больше памяти, чем есть на самом деле. Когда FreeBSD исчерпывает доступную память, она перемещает часть данных, которые в данный момент не используются, в раздел подкачки, а затем возвращает их обратно (перемещая что-то другое), когда они нужны. Этот процесс называется подкачкой (paging).

Некоторые разделы BSD имеют определенные соглашения, связанные с ними.

Раздел

Соглашение

a

Обычно содержит корневую файловую систему.

b

Обычно содержит раздел подкачки.

c

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

d

Раздел d ранее имел особое значение, но сейчас это ушло в прошлое, и d может использоваться как обычный раздел.

Слайсы и «опасно выделенные» (dangerously dedicated) физические диски содержат разделы BSD, которые обозначаются буквами от a до h. Эта буква добавляется к имени устройства, поэтому «da0a» — это раздел a на первом диске da, который является «опасно выделенным». «ada1s3e» — это пятый раздел в третьем срезе второго диска SATA.

Наконец, каждый диск в системе идентифицируется. Имя диска начинается с кода, указывающего тип диска, за которым следует номер, обозначающий конкретный диск. В отличие от разделов и слайсов, нумерация дисков начинается с 0. Распространённые коды перечислены в Имена устройств дисков.

При указании раздела в слайсе укажите имя диска, s, номер слайса, а затем букву раздела. Примеры приведены в разделе Примеры имен дисков. Разделы GPT включают имя диска, p, а затем номер раздела.

Концептуальная модель диска показывает концептуальную модель разметки диска с использованием разделов MBR.

При установке FreeBSD настройте слайсы диска, если используется MBR, и создайте разделы внутри слайса, который будет использоваться для FreeBSD. Если используется GPT, настройте разделы для каждой файловой системы. В обоих случаях создайте файловую систему или область подкачки в каждом разделе и определите, где будет монтироваться каждая файловая система. Подробности о работе с разделами см. в gpart(8).

Таблица 3. Имена устройств дисков
Тип накопителяИмя устройства накопителя

SATA и IDE жёсткие диски

ada

SCSI жесткие диски и USB устройства хранения данных

da

Хранилище NVMe

nvd или nda

SATA и IDE приводы CD-ROM

cd

SCSI CD-ROM приводы

cd

Накопители на гибких дисках

fd

SCSI-ленточные накопители

sa

RAID-диски

Примеры включают aacd для Adaptec® AdvancedRAID, mlxd и mlyd для Mylex®, amrd для AMI MegaRAID®, idad для Compaq Smart RAID, twed для 3ware® RAID.

Таблица 4. Примеры названий дисков, слайсов и разделов
ИмяЗначение

ada0s1a

Первый раздел (a) на первом слайсе (s1) на первом SATA-диске (ada0).

da1s2e

Пятый раздел (e) на втором срезе (s2) второго SCSI-диска (da1).

Пример 12. Концептуальная модель диска

На этой диаграмме показано, как FreeBSD видит первый SATA-диск, подключённый к системе. Предположим, что размер диска составляет 250 ГБ, и он содержит раздел на 80 ГБ и раздел на 170 ГБ (разделы MS-DOS®). Первый раздел содержит файловую систему Windows® NTFS, C:, а второй раздел содержит установленную систему FreeBSD. В данном примере установки FreeBSD присутствуют четыре раздела с данными и один раздел подкачки.

Четыре раздела содержат файловые системы. Раздел a используется для корневой файловой системы, d — для /var/, e — для /tmp/, а f — для /usr/. Буква раздела c относится ко всему слайсу и поэтому не используется для обычных разделов.

Компоновка общего диска между Windows и FreeBSD

3.7. Монтирование и демонтирование файловых систем

Файловую систему удобно визуализировать как дерево, корнем которого является /. Каталоги /dev, /usr и другие в корневом каталоге представляют собой ветви, которые, в свою очередь, могут иметь собственные ветви, например /usr/local, и так далее.

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

Еще одна распространённая причина размещать определённые каталоги на других файловых системах — это необходимость их размещения на отдельных физических дисках или виртуальных дисках, таких как сетевые файловые системы (NFS), описанные в “Сетевая файловая система (NFS)”, или приводы CDROM.

3.7.1. Файл fstab

В процессе загрузки (Процесс загрузки FreeBSD), файловые системы, перечисленные в /etc/fstab, автоматически монтируются, за исключением записей, содержащих noauto. Этот файл содержит записи в следующем формате:

device       /mount-point fstype     options      dumpfreq     passno
device

Существующее имя устройства, как описано в Имена устройств дисков.

mount-point

Существующий каталог, на который монтируется файловая система.

fstype

Тип файловой системы, передаваемый в mount(8). Файловая система по умолчанию в FreeBSD — ufs.

options

rw для файловых систем с доступом на чтение и запись или ro для файловых систем только для чтения, за которыми могут следовать другие необходимые опции. Часто используется опция noauto для файловых систем, которые обычно не монтируются при загрузке. Другие опции перечислены в mount(8).

dumpfreq

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

passno

Определяет порядок проверки файловых систем UFS с помощью fsck(8) после перезагрузки. Файловые системы, которые следует пропускать, должны иметь значение passno, равное нулю. Корневая файловая система должна проверяться первой и иметь значение passno, равное единице. Остальные файловые системы должны иметь значения больше единицы. Если несколько файловых систем имеют одинаковое значение passno, fsck(8) попытается проверять их параллельно, если это возможно.

См. fstab(5) для получения дополнительной информации о формате /etc/fstab и его параметрах.

3.7.2. Использование mount(8)

Файловые системы монтируются с помощью mount(8). Базовая синтаксическая конструкция выглядит следующим образом:

# mount device mountpoint

Файловая система, указанная в /etc/fstab, также может быть смонтирована, если указать только точку монтирования.

Эта команда предоставляет множество опций, которые описаны в mount(8). Наиболее часто используемые опции включают:

Параметры монтирования
-a

Смонтировать все файловые системы, перечисленные в /etc/fstab, за исключением тех, которые помечены как "noauto", исключены флагом -t или уже смонтированы.

-d

Выполнить все действия, кроме самого системного вызова mount. Эта опция полезна в сочетании с флагом -v для определения того, что на самом деле пытается сделать mount(8).

-f

Принудительно смонтировать поврежденную файловую систему (опасно) или отозвать права на запись при понижении статуса монтирования файловой системы с чтения-записи на только чтение.

-r

Смонтировать файловую систему в режиме только для чтения. Это эквивалентно использованию -o ro.

-t тип_фс

Смонтировать указанный тип файловой системы или смонтировать только файловые системы данного типа, если включен параметр -a. Тип файловой системы "ufs" используется по умолчанию.

-u

Обновить параметры монтирования файловой системы.

-v

Выдавать более подробную информацию.

-w

Смонтировать файловую систему в режиме чтения-записи.

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

nosuid

Не интерпретировать флаги setuid или setgid на файловой системе. Это также полезная опция безопасности.

3.7.3. Использование umount(8)

Для размонтирования файловой системы используйте umount(8). Эта команда принимает один параметр, которым может быть точка монтирования, имя устройства, -a или -A.

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

Для размонтирования всех смонтированных файловых систем или только файловых систем указанных после -t типов используйте -a или -A. Обратите внимание, что -A не пытается размонтировать корневую файловую систему.

3.8. Процессы и Демоны

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

Каждый процесс однозначно идентифицируется числом, называемым идентификатором процесса (PID). Подобно файлам, каждый процесс имеет владельца и группу, а права владельца и группы используются для определения того, какие файлы и устройства процесс может открыть. Большинство процессов также имеют родительский процесс, который их запустил. Например, оболочка — это процесс, и любая команда, запущенная в оболочке, является процессом, для которого оболочка выступает родительским процессом. Исключением является специальный процесс init(8), который всегда запускается первым при загрузке и всегда имеет PID 1.

Некоторые программы не предназначены для постоянного взаимодействия с пользователем и отключаются от терминала при первой возможности. Например, веб-сервер отвечает на веб-запросы, а не на действия пользователя. Почтовые серверы — ещё один пример таких приложений. Эти программы называются демонами. Термин «демон» происходит из греческой мифологии и обозначает сущность, которая не является ни доброй, ни злой и незаметно выполняет полезные задачи. Именно поэтому талисманом BSD стал улыбающийся демон в кроссовках и с вилами.

Существует соглашение называть программы, которые обычно работают как демоны, с добавлением буквы "d" в конце. Например, BIND — это Berkeley Internet Name Domain, но фактическая программа, которая выполняется, называется named. Веб-сервер Apache называется httpd, а демон очереди печати — lpd. Это всего лишь соглашение об именовании. Например, основной почтовый демон для приложения Sendmail называется sendmail, а не maild.

3.8.1. Просмотр процессов

Чтобы просмотреть процессы, выполняемые в системе, используйте ps(1) или top(1). Для отображения статичного списка текущих процессов, их PID, объема используемой памяти и команд, которыми они были запущены, используйте ps(1). Для отображения всех выполняемых процессов с периодическим обновлением списка каждые несколько секунд, чтобы интерактивно наблюдать за работой компьютера, используйте top(1).

По умолчанию ps(1) отображает только команды, выполняемые и принадлежащие текущему пользователю. Например:

% ps

Вывод должен быть похож на следующий:

 PID TT  STAT    TIME COMMAND
8203  0  Ss   0:00.59 /bin/csh
8895  0  R+   0:00.00 ps

Вывод команды ps(1) организован в несколько столбцов. В столбце PID отображается идентификатор процесса. PID начинаются с 1, достигают 99999, затем снова начинаются с начала. Однако, если PID уже используется, он не будет повторно назначен. Столбец TT показывает tty, на котором выполняется программа, а STAT отображает состояние программы. TIME — это время, в течение которого программа выполнялась на CPU. Обычно это не общее время с момента запуска программы, так как большинство программ проводят много времени в ожидании событий, прежде чем им потребуется время на CPU. Наконец, COMMAND — это команда, которая использовалась для запуска программы.

Доступно несколько различных опций для изменения отображаемой информации. Один из наиболее полезных наборов — auxww, где a показывает информацию обо всех запущенных процессах всех пользователей, u отображает имя пользователя и использование памяти владельцем процесса, x показывает информацию о процессах демонов, а ww заставляет ps(1) выводить полную командную строку для каждого процесса вместо её обрезки, когда она становится слишком длинной для экрана.

Вывод команды top(1) выглядит аналогично:

% top

Вывод должен быть похож на следующий:

last pid:  9609;  load averages:  0.56,  0.45,  0.36              up 0+00:20:03  10:21:46
107 processes: 2 running, 104 sleeping, 1 zombie
CPU:  6.2% user,  0.1% nice,  8.2% system,  0.4% interrupt, 85.1% idle
Mem: 541M Active, 450M Inact, 1333M Wired, 4064K Cache, 1498M Free
ARC: 992M Total, 377M MFU, 589M MRU, 250K Anon, 5280K Header, 21M Other
Swap: 2048M Total, 2048M Free

  PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
  557 root          1 -21  r31   136M 42296K select  0   2:20  9.96% Xorg
 8198 dru           2  52    0   449M 82736K select  3   0:08  5.96% kdeinit4
 8311 dru          27  30    0  1150M   187M uwait   1   1:37  0.98% firefox
  431 root          1  20    0 14268K  1728K select  0   0:06  0.98% moused
 9551 dru           1  21    0 16600K  2660K CPU3    3   0:01  0.98% top
 2357 dru           4  37    0   718M   141M select  0   0:21  0.00% kdeinit4
 8705 dru           4  35    0   480M    98M select  2   0:20  0.00% kdeinit4
 8076 dru           6  20    0   552M   113M uwait   0   0:12  0.00% soffice.bin
 2623 root          1  30   10 12088K  1636K select  3   0:09  0.00% powerd
 2338 dru           1  20    0   440M 84532K select  1   0:06  0.00% kwin
 1427 dru           5  22    0   605M 86412K select  1   0:05  0.00% kdeinit4

Вывод разделён на две части. Заголовок (первые пять или шесть строк) показывает PID последнего запущенного процесса, среднюю загрузку системы (которая отражает, насколько система занята), время работы системы (время с последней перезагрузки) и текущее время. Остальные данные в заголовке относятся к количеству запущенных процессов, объёму используемой оперативной памяти и файла подкачки (свопа), а также времени, которое система проводит в различных состояниях процессора. Если загружен модуль файловой системы ZFS, строка ARC указывает, сколько данных было прочитано из кэша памяти, а не с диска.

Ниже заголовка расположен ряд столбцов с информацией, аналогичной выводу команды ps(1), такой как PID, имя пользователя, объем CPU времени и команда, запустившая процесс. По умолчанию top(1) также отображает объем памяти, занимаемый процессом. Эта информация разделена на два столбца: один для общего размера и один для резидентного размера. Общий размер — это объем памяти, который потребовался приложению, а резидентный размер — это объем, который оно фактически использует в данный момент.

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

3.8.2. Прекращение процессов

Один из способов взаимодействия с любым запущенным процессом или демоном — отправить сигнал с помощью kill(1). Существует множество различных сигналов; некоторые имеют определённое значение, в то время как другие описаны в документации приложения. Пользователь может отправлять сигналы только своим процессам, и попытка отправить сигнал чужому процессу приведёт к ошибке отказа в доступе. Исключением является пользователь root, который может отправлять сигналы любым процессам.

Операционная система также может отправлять сигналы процессу. Если приложение написано с ошибками и пытается получить доступ к памяти, к которой оно не должно обращаться, FreeBSD отправит процессу сигнал "Нарушение сегментации" (SIGSEGV). Если приложение было написано с использованием системного вызова alarm(3) для оповещения по истечении определенного времени, ему будет отправлен сигнал "Будильник" (SIGALRM).

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

SIGKILL не может быть проигнорирован процессом. Отправка SIGKILL процессу обычно немедленно останавливает этот процесс. [1].

Другие часто используемые сигналы — это SIGHUP, SIGUSR1 и SIGUSR2. Поскольку они предназначены для общего применения, разные программы могут реагировать на них по-разному.

Например, после изменения конфигурационного файла веб-сервера необходимо указать веб-серверу перечитать его конфигурацию. Перезапуск httpd приведёт к кратковременному простою веб-сервера. Вместо этого отправьте демону сигнал SIGHUP. Учтите, что разные демоны могут вести себя по-разному, поэтому обратитесь к документации демона, чтобы определить, приведёт ли SIGHUP к желаемому результату.

Убить случайный процесс в системе — плохая идея. В частности, init(8), PID 1, является особым. Запуск /bin/kill -s KILL 1 — это быстрый, но не рекомендуемый способ выключить систему. Всегда перепроверяйте аргументы для kill(1) перед нажатием Return.

3.9. Оболочки

Оболочка предоставляет интерфейс командной строки для взаимодействия с операционной системой. Оболочка получает команды из входного канала и выполняет их. Многие оболочки предоставляют встроенные функции для помощи в повседневных задачах, таких как управление файлами, подстановка имён файлов (file globbing), редактирование командной строки, макросы команд и переменные окружения. FreeBSD поставляется с несколькими оболочками, включая Bourne shell (sh(1)) и расширенную C shell (tcsh(1)). Другие оболочки доступны в коллекции портов FreeBSD, например zsh и bash.

Используемая оболочка — это действительно вопрос предпочтений. Программисту на C может быть удобнее работать с C-подобной оболочкой, такой как tcsh(1). Пользователь Linux® может предпочесть bash. Каждая оболочка обладает уникальными свойствами, которые могут подходить или не подходить под предпочитаемую пользователем рабочую среду, поэтому существует выбор, какую оболочку использовать.

Одной из распространённых возможностей оболочки является завершение имён файлов. Когда пользователь вводит первые несколько букв команды или имени файла и нажимает Tab, оболочка автоматически дописывает оставшуюся часть команды или имени файла. Рассмотрим два файла с именами foobar и football. Чтобы удалить foobar, пользователь может ввести rm foo и нажать Tab для завершения имени файла.

Но оболочка показывает только rm foo. Она не смогла завершить имя файла, потому что и foobar, и football начинаются с foo. Некоторые оболочки издают звуковой сигнал или показывают все варианты, если совпадает более одного имени. Пользователь должен затем ввести дополнительные символы, чтобы указать нужное имя файла. Ввод t и повторное нажатие Tab достаточно, чтобы оболочка определила, какое имя файла требуется, и заполнила остальное.

Еще одна особенность оболочки — использование переменных окружения. Переменные окружения представляют собой пару переменная/ключ, хранящуюся в окружении оболочки. Это окружение может быть прочитано любой программой, запущенной оболочкой, и поэтому содержит множество настроек программ. В Распространенные переменные окружения приведен список распространённых переменных окружения и их значений. Обратите внимание, что имена переменных окружения всегда записываются в верхнем регистре.

Таблица 5. Распространенные переменные окружения

Переменная

Описание

USER

Имя текущего вошедшего пользователя.

PATH

Двоеточием разделённый список каталогов для поиска бинарных файлов.

DISPLAY

Сетевое имя дисплея Xorg для подключения, если доступно.

SHELL

Текущая оболочка.

TERM

Имя типа терминала пользователя. Используется для определения возможностей терминала.

TERMCAP

Запись в базе данных escape-кодов терминала для выполнения различных функций терминала.

OSTYPE

Тип операционной системы.

MACHTYPE

Архитектура процессора системы.

EDITOR

Предпочитаемый текстовый редактор пользователя.

PAGER

Предпочитаемая пользователем утилита для просмотра текста постранично.

MANPATH

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

Как установить переменную окружения, зависит от используемой оболочки. В tcsh(1) и csh(1) используйте setenv для установки переменных окружения. В sh(1) и bash используйте export для установки текущих переменных окружения. В этом примере устанавливается значение EDITOR по умолчанию в /usr/local/bin/emacs для оболочки tcsh(1):

% setenv EDITOR /usr/local/bin/emacs

Эквивалентная команда для bash будет:

% export EDITOR="/usr/local/bin/emacs"

Чтобы раскрыть переменную окружения и увидеть её текущее значение, введите символ $ перед её именем в командной строке. Например, echo $TERM выведет текущее значение переменной $TERM.

Оболочки интерпретируют специальные символы, известные как метасимволы, как особые представления данных. Наиболее распространённый метасимвол — *, который обозначает любое количество символов в имени файла. Метасимволы могут использоваться для подстановки имён файлов (globbing). Например, команда echo * эквивалентна ls, поскольку оболочка выбирает все файлы, соответствующие шаблону \*, а echo выводит их в командной строке.

Чтобы предотвратить интерпретацию специального символа оболочкой, экранируйте его с помощью обратной косой черты (\). Например, echo $TERM выводит настройки терминала, тогда как echo \$TERM выводит строку $TERM буквально.

3.9.1. Изменение оболочки

Самый простой способ навсегда изменить оболочку по умолчанию — использовать chsh. Запуск этой команды откроет редактор, настроенный в переменной окружения EDITOR, которая по умолчанию установлена в vi(1). Измените строку Shell: на полный путь к новой оболочке.

Или используйте chsh -s, который установит указанную оболочку без открытия редактора. Например, чтобы изменить оболочку на bash:

% chsh -s /usr/local/bin/bash

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

Новая оболочка обязательно должна присутствовать в /etc/shells. Если оболочка была установлена из Коллекции портов FreeBSD, как описано в Установка приложений: Пакеты и порты, она должна быть автоматически добавлена в этот файл. Если её там нет, добавьте её с помощью следующей команды, заменив путь на путь к вашей оболочке:

# echo /usr/local/bin/bash >> /etc/shells

Затем снова запустите chsh(1).

3.9.2. Продвинутые методы работы с оболочкой

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

Перенаправление в оболочке — это действие отправки вывода или ввода команды в другую команду или файл. Например, чтобы сохранить вывод команды ls(1) в файл, перенаправьте вывод:

% ls > directory_listing.txt

Содержимое каталога теперь будет отображено в файле directory_listing.txt. Некоторые команды, например sort(1), могут использоваться для чтения ввода. Чтобы отсортировать этот список, перенаправьте ввод:

% sort < directory_listing.txt

Входные данные будут отсортированы и выведены на экран. Чтобы перенаправить эти данные в другой файл, можно перенаправить вывод sort(1), изменив направление:

% sort < directory_listing.txt > sorted.txt

Во всех предыдущих примерах команды выполняют перенаправление с использованием файловых дескрипторов. Каждая UNIX®-система имеет файловые дескрипторы, включая стандартный ввод (stdin), стандартный вывод (stdout) и стандартный вывод ошибок (stderr). Каждый из них имеет своё назначение: ввод может осуществляться с клавиатуры или мыши — устройств, предоставляющих входные данные. Вывод может направляться на экран или бумагу в принтере. А ошибки — это всё, что используется для диагностических или сообщений об ошибках. Все три типа считаются файловыми дескрипторами, основанными на вводе-выводе, и иногда называются потоками.

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

Оператор UNIX® pipe, |, позволяет передавать вывод одной команды напрямую или направлять его другой программе. По сути, pipe позволяет передать стандартный вывод одной команды в качестве стандартного ввода другой команды, например:

% cat directory_listing.txt | sort | less

В этом примере содержимое файла directory_listing.txt будет отсортировано, а вывод передан в less(1). Это позволяет пользователю прокручивать вывод в удобном темпе и предотвращает его исчезновение с экрана.

3.10. Текстовые редакторы

Большая часть настройки FreeBSD выполняется путём редактирования текстовых файлов, поэтому рекомендуется освоить текстовый редактор. В базовую систему FreeBSD входит несколько таких редакторов, а ещё больше доступно в Коллекции портов.

Простой редактор для освоения — это ee(1), что означает «легкий редактор». Чтобы запустить его, введите ee имя_файла, где имя_файла — это имя редактируемого файла. Внутри редактора все команды для управления его функциями перечислены в верхней части экрана. Символ каретки (^) обозначает Ctrl, поэтому ^e означает Ctrl+e. Для выхода из ee(1) нажмите Esc и выберите пункт «покинуть редактор» в главном меню. Если файл был изменен, редактор предложит сохранить изменения.

FreeBSD также включает более мощные текстовые редакторы, такие как vi(1), в составе базовой системы. Другие редакторы, например editors/emacs и editors/vim, доступны в коллекции портов FreeBSD. Эти редакторы предоставляют больше возможностей, но их освоение сложнее. Изучение более мощного редактора, такого как vim или Emacs, может сэкономить время в долгосрочной перспективе.

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

3.11. Устройства и Узлы Устройств

Устройство — это термин, в основном используемый для описания аппаратных компонентов системы, таких как диски, принтеры, видеокарты и клавиатуры. При загрузке FreeBSD большинство сообщений относятся к обнаружению устройств. Копия этих сообщений сохраняется в файле /var/run/dmesg.boot.

У каждого устройства есть имя и номер. Например, ada0 — это первый жёсткий диск SATA, а kbd0 обозначает клавиатуру.

Большинство устройств в FreeBSD должны быть доступны через специальные файлы, называемые узлами устройств, которые расположены в /dev.

3.12. Справочник

Наиболее полная документация по FreeBSD представлена в виде Справочника (manual pages). Почти каждая программа в системе имеет краткое справочное руководство, объясняющее основы работы и доступные аргументы. Эти руководства можно просматривать с помощью команды man:

% man command

где command — это название команды, о которой нужно узнать больше. Например, чтобы узнать больше о ls(1), введите:

% man ls

Страницы Справочника разделены на разделы, которые обозначают тип темы. В FreeBSD доступны следующие разделы:

  1. Пользовательские команды.

  2. Системные вызовы и коды ошибок.

  3. Функции в библиотеках C.

  4. Драйверы устройств.

  5. Форматы файлов.

  6. Развлечения и другие игры.

  7. Различная информация.

  8. Системные команды обслуживания и эксплуатации.

  9. Интерфейсы ядра системы.

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

% man 1 chmod

Это отобразит справочную страницу для пользовательской команды chmod(1). Ссылки на определённый раздел онлайн-руководства традиционно заключаются в скобки в письменной документации, поэтому chmod(1) относится к пользовательской команде, а chmod(2) — к системному вызову.

Если название страницы руководства неизвестно, используйте man -k для поиска ключевых слов в описаниях страниц руководства:

% man -k mail

Эта команда выводит список команд, содержащих ключевое слово "mail" в их описаниях. Это эквивалентно использованию apropos(1).

Чтобы прочитать описания всех команд в /usr/sbin, введите:

% cd /usr/sbin
% man -f * | more

или

% cd /usr/sbin
% whatis * |more

3.12.1. Файлы GNU Info

FreeBSD включает несколько приложений и утилит, созданных Free Software Foundation (FSF). Помимо man-страниц, эти программы могут содержать гипертекстовые документы, называемые файлами info. Их можно просматривать с помощью info(1) или, если установлен editors/emacs, в режиме info редактора emacs.

Чтобы использовать info(1), введите:

% info

Для краткого введения введите h. Для быстрой справки по командам введите ?.


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

Изменено: 24 ноября 2025 г. by Vladlen Popolitov