Глава 10. Системное администрирование

10.1. Где расположены файлы конфигурации системы?
10.2. Как проще всего добавить пользователя?
10.3. Почему после редактирования моего файла crontab я получаю сообщения вида root: not found?
10.4. Команда su выдает, что you are not in the correct group to su root, когда я пытаюсь сменить привилегии на root.
10.5. Я сделал ошибку в файле rc.conf или в каком-то другом файле начальной загрузки, и теперь не могу его отредактировать из-за того, что файловая система находится в режиме только для чтения. Что мне делать?
10.6. У меня проблемы с установкой принтера.
10.7. Раскладка клавиатуры неверна.
10.8. У меня при загрузке появляются сообщения вида unknown: <PNP0303> can't assign resources
10.9. Почему не получается заставить работать дисковые квоты?
10.10. Поддерживает ли FreeBSD вызовы IPC из System V?
10.11. Какое другое программное обеспечение для почтового сервера можно использовать вместо sendmail?
10.12. Я забыл пароль пользователя root! Что делать?
10.13. Как запретить перезагрузку по нажатию Control+Alt+Delete?
10.14. Как преобразовать текстовые файлы DOS в формат UNIX®?
10.15. Как прервать процесс по имени?
10.16. Почему su(1) выдаёт сообщение о том, что я не вхожу в root ACL?
10.17. Как деинсталлировать Kerberos?
10.18. Что случилось с /dev/MAKEDEV?
10.19. Как добавить в систему дополнительные псевдотерминалы?
10.20. Как перечитать содержимое /etc/rc.conf и перестартовать /etc/rc без перезагрузки системы?
10.21. Я пытался обновить мою систему до последней -STABLE, а получил -BETAx, -RC или -PRERELEASE! Что происходит?
10.22. Я попытался установить новое ядро, однако утилита chflags(1) не сработала. Как это обойти?
10.23. Не получается изменить системное время больше чем на одну секунду! Как это обойти?
10.24. В rpc.statd; есть ошибка работы с памятью! Он использует 256 Мбайт оперативной памяти!
10.25. Почему я не могу снять с файла флаг schg?
10.26. Почему в SSH аутентификация посредством файла .shosts не включена по умолчанию в последних версиях FreeBSD?
10.27. Что такое vnlru?
10.28. Что означают различные состояния памяти, показываемые утилитой top?
10.29. Сколько свободной памяти доступно?
10.30. Что такое /var/empty? Я не могу его удалить!

10.1.

Где расположены файлы конфигурации системы?

Основным настроечным файлом является /etc/defaults/rc.conf (обратитесь к rc.conf(5)). Скрипты начального запуска системы, такие как /etc/rc и /etc/rc.d (обратитесь к rc(8)), просто включают этот файл. Не редактируйте этот файл! Вместо этого, если в файле /etc/defaults/rc.conf имеется параметр, который вы хотите изменить, то вы должны скопировать строчку с ним в файл /etc/rc.conf и поменять его значение именно здесь.

Например, если вы хотите запустить named(8), поставляемый сервер DNS, то всё, что вам нужно сделать, это:

# echo 'named_enable="YES"' >> /etc/rc.conf

Чтобы запустить местные сервисы, поместите скрипты в каталог /usr/local/etc/rc.d. У этих скриптов должен быть выставлен бит выполнимости, по умолчанию используются права доступа 555.

10.2.

Как проще всего добавить пользователя?

Используйте команду adduser(8) или pw(8) в случае выполнения более сложных операций.

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

10.3.

Почему после редактирования моего файла crontab я получаю сообщения вида root: not found?

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

# crontab /etc/crontab

Это неправильно. Системный crontab-файл имеет формат, отличный от пользовательских crontab-файлов, которые обновляет утилита crontab(1) (страница Справочника по crontab(5) описывает отличия более подробно).

Если это именно то, что вы сделали, то дополнительный crontab-файл является просто копией файла /etc/crontab в неправильном формате. Удалите его такой командой:

# crontab -r

В следующий раз при редактировании файла /etc/crontab, вам не нужно делать ничего для оповещения утилиты cron(8) о сделанных изменениях, так как она распознает их автоматически.

Если вы хотите запускать что-то один раз в день, неделю или месяц, то, наверное, лучше обновить скрипты /usr/local/etc/periodic и позволить команде periodic(8), запускаемой системной утилитой cron, планировать их выполнение вместе с другими периодическими системными задачами.

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

10.4.

Команда su выдает, что you are not in the correct group to su root, когда я пытаюсь сменить привилегии на root.

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

Чтобы разрешить кому-либо менять привилегии на root, просто включите его в группу wheel.

10.5.

Я сделал ошибку в файле rc.conf или в каком-то другом файле начальной загрузки, и теперь не могу его отредактировать из-за того, что файловая система находится в режиме только для чтения. Что мне делать?

Перезапустите систему, используя в приглашении загрузчика команду boot -s для входа в однопользовательский режим. При получении приглашения на ввод полного пути до командного процессора просто нажмите Enter, а затем выполните команду mount -urw / для повторного монтирования корневой файловой системы в режиме чтения/записи. Вам может также потребоваться выполнить команду mount -a -t ufs для монтирования файловой системы, в которой расположен ваш любимый редактор. Если редактор расположен на сетевой файловой системе, то вам потребуется выполнить сетевые настройки вручную до монтирования сетевой файловой системы, либо воспользоваться редактором, находящимся в локальной файловой системе, таким, как ed(1).

Если вы собираетесь использовать полноэкранный редактор, такой, как vi(1) или emacs(1), то вам нужно будет выполнить команду export TERM=cons25, чтобы такие редакторы смогли корректно взять данные из базы данных termcap(5).

После выполнения этих шагов вы сможете отредактировать файл /etc/rc.conf так, как вы это обычно делаете для исправления ошибки. Сообщение об ошибке, выводимое сразу же после сообщений при загрузке ядра, должно указать вам на номер строки в файле, которая содержит ошибку.

10.6.

У меня проблемы с установкой принтера.

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

Некоторые принтеры для выполнения любых операций по печати требуют наличия на хосте драйвера. Такие так называемые «WinPrinters» изначально во FreeBSD не поддерживаются. Если ваш принтер не работает в DOS или Windows®, то, скорее всего, это WinPrinter. Единственное, что вам остаётся сделать в надежде на то, что вы заставите его работать, это проверить, поддерживает ли его порт print/pnm2ppa.

10.7.

Раскладка клавиатуры неверна.

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

10.8.

У меня при загрузке появляются сообщения вида unknown: <PNP0303> can't assign resources

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

 

Сообщение «can't assign resources» говорит о том, что устройство является устаревшим ISA-устройством, для которого в ядре присутствует драйвер, не поддерживающий PnP. К таким устройствам относятся контроллеры клавиатуры, микросхема контроллера программируемых прерываний, а также другие части стандартного набора. Ресурсы не могут выделены, потому что уже есть драйвер, использующий эти адреса.

 
 --Garrett Wollman , 24 апреля 2001

10.9.

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

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

    options QUOTA

    Пожалуйста, прочтите главу руководства по квотам для полной информации.

  2. Не включайте квотирование на /.

  3. Помещайте файл с квотами в ту файловую систему, которую он обслуживает, то есть:

    Файловая системаФайл квот
    /usr/usr/admin/quotas
    /home/home/admin/quotas

10.10.

Поддерживает ли FreeBSD вызовы IPC из System V?

Да, во FreeBSD в ядро GENERIC включена поддержка IPC в стиле System V, в том числе совместно используемой памяти, сообщений и семафоров. Для включения их поддержки в конфигурационный файл вашего ядра нужно добавить следующие строки.

options    SYSVSHM	  # enable shared memory
options    SYSVSEM	  # enable for semaphores
options    SYSVMSG	  # enable for messaging

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

10.11.

Какое другое программное обеспечение для почтового сервера можно использовать вместо sendmail?

sendmail является программным обеспечением для работы почтового сервера во FreeBSD, используемым по умолчанию, но вы можете с легкостью заменить его другим MTA (к примеру, установленным из портов).

В дереве портов уже имеются различные альтернативные MTA, из которых mail/exim, mail/postfix, mail/qmail и mail/zmailer являются одними из самых популярных.

Разнообразие хорошо, а тот факт, что у вас есть выбор из многих различных почтовых серверов, является хорошим признаком; поэтому попытайтесь не задавать вопросы типа «Sendmail лучше, чем qmail?» в списках рассылки. Если вы захотите получить ответ, сначала просмотрите архивы списков рассылки. Достоинства и недостатки каждого из имеющихся MTA уже обсуждались неоднократно.

10.12.

Я забыл пароль пользователя root! Что делать?

Без паники! Перезапустите систему, наберите boot -s в приглашении Boot: для входа в однопользовательский режим. На вопрос об используемой оболочке нажмите Enter. На приглашение # введите mount -urw /, чтобы перемонтировать корневую файловую систему в режиме чтения/записи, после чего выполните команду mount -a для монтирования всех файловых систем. Запустите команду passwd root, чтобы сменить пароль пользователя root, а затем exit(1) для продолжения процесса загрузки.

Примечание:

Если при входе в однопользовательский режим предлагается ввести пароль пользователя root, то это означает, что консоль была помечена как insecure в /etc/ttys. В этом случае потребуется загрузиться с установочного диска FreeBSD, выбрать оболочку Fixit из меню sysinstall(8) и выполнить указанные выше команды.

Примечание:

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

10.13.

Как запретить перезагрузку по нажатию Control+Alt+Delete?

Если вы используете драйвер консоли syscons(4) (который является стандартным), перегенерируйте и установите новое ядро с таким параметром в конфигурационном файле:

options SC_DISABLE_REBOOT

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

# sysctl hw.syscons.kbd_reboot=0

Примечание:

Оба этих метода являются взаимоисключающими. Данный sysctl(8) не существует, если вы скомпилировали ядро с параметром SC_DISABLE_REBOOT.

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

options PCVT_CTRL_ALT_DEL

10.14.

Как преобразовать текстовые файлы DOS в формат UNIX®?

Воспользуйтесь следующей командой perl(1):

% perl -i.bak -npe 's/\r\n/\n/g' file(s)

где file(s) - это один или несколько файлов для обработки. Преобразование делается в том же самом файле, оригинальные файлы сохраняются с расширением .bak.

Это преобразование также можно выполнить с помощью команды tr(1):

% tr -d '\r' < dos-text-file > unix-file

где dos-text-file - это имя файла, содержащего текст DOS, а в файл unix-file будет помещён уже преобразованный текст. Этот способ может работать гораздо быстрее, чем при использовании perl.

Еще один способ отформатировать тестовые файлы DOS состоит в использовании converters/dosunix из Коллекции Портов. Для получения дополнительной информации ознакомьтесь с документацией порта.

10.15.

Как прервать процесс по имени?

Используйте команду killall(1).

10.16.

Почему su(1) выдаёт сообщение о том, что я не вхожу в root ACL?

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

10.17.

Как деинсталлировать Kerberos?

Чтобы удалить Kerberos из системы, переустановите дистрибутив base того релиза, который у вас запущен. Если у вас есть CD-ROM, вы можете смонтировать компакт-диск (положим, в каталог /cdrom) и выполнить команду

# cd /cdrom/base
# ./install.sh

Либо вы можете задействовать опцию NO_KERBEROS в файле /etc/make.conf и выполнить полное перестроение системы.

10.18.

Что случилось с /dev/MAKEDEV?

Во FreeBSD 5.X и выше используется система devfs(8), работающая по принципу "устройства по требованию". Драйверы устройств автоматически создают новые файлы устройств, как только в них появляется необходимость, таким образом обходясь без /dev/MAKEDEV.

10.19.

Как добавить в систему дополнительные псевдотерминалы?

Если у вас много пользователей, работающих в сеансах telnet, ssh, X или в screen, то вы можете столкнуться с проблемой нехватки псевдотерминалов. По умолчанию до FreeBSD 6.2 включительно поддерживается 256 псевдотерминалов, а начиная с FreeBSD 6.3 — 512.

Подсказка:

При необходимости можно добавить дополнительные псевдотерминалы. Однако, это требует изменений в стандартной библиотеке C, ядре и /etc/ttys. Например, http://www.freebsd.org/~jhb/patches/pty_1152.patch расширяет количество псевдотерминалов до 1152. Отметим, что данный патч может быть применен без ошибок только для FreeBSD 6.3 или выше.

10.20.

Как перечитать содержимое /etc/rc.conf и перестартовать /etc/rc без перезагрузки системы?

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

На консоли выполните следующее:

# shutdown now
(Замечание: без -r или -h)

# return
# exit

10.21.

Я пытался обновить мою систему до последней -STABLE, а получил -BETAx, -RC или -PRERELEASE! Что происходит?

Краткий ответ: это же просто название. RC означает «Release Candidate». Это значит, что вскоре произойдет выход релиза. Во FreeBSD появление -PRERELEASE, как правило, равнозначно прекращению внесения изменений в код системы перед появлением релиза. (Для некоторых релизом метка -BETA использовалась точно так же, как и -PRERELEASE.)

Подробный ответ: во FreeBSD релизы выпускаются из одного из двух мест. Крупные релизы, точка-ноль, такие, как 7.0-RELEASE и 8.0-RELEASE, ответвляются от основного потока разработки, более известного как -CURRENT. Мелкие релизы, такие, как 6.3-RELEASE или 5.2-RELEASE, являлись снэпшотами активной ветки -STABLE. Начиная с 4.3-RELEASE, каждый релиз также имеет свою ветвь, которой могут следовать те, кому необходим сверхконсервативный метод обновления (как правило, внесение только тех исправлений, которые касаются вопросов обеспечения безопасности).

Когда делается релиз, то ветвь, из которой он выпускается, подвергается некоторой подготовке. Частью этого процесса является замораживание кода. Когда инициируется замораживание кода, то имя ветки изменяется для того, чтобы отразить факт близости релиза. Например, если ветка называлась 6.2-STABLE, то её имя будет изменено на 6.3-PRERELEASE, чтобы обозначить момент прекращения внесения изменений в код системы и период дополнительного тестирования перед выходом релиза. В это время исправления ошибок могут быть внесены в код системы для того, чтобы быть включенными в релиз. Когда исходный код подготовлен к выпуску релиза, имя будет изменено на 6.3-RC для обозначения того, что релиз будет сделан, скорее всего, именно из этого кода. Когда код находится на этапе RC, в нём могут исправляться только самые критичные ошибки. Как только релиз (в нашем примере 6.3-RELEASE) и ветка релиза будут созданы, ветвь будет переименована в 6.3-STABLE.

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

10.22.

Я попытался установить новое ядро, однако утилита chflags(1) не сработала. Как это обойти?

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

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

# sysctl kern.securelevel

Вы не можете понизить уровень безопасности; для установки ядра вам нужно перезагрузиться в однопользовательский режим, или изменить уровень безопасности в /etc/rc.conf, а затем выполнить перезагрузку. Обратитесь к странице Справочника по init(8) за подробной информацией об securelevel и посмотрите /etc/defaults/rc.conf и справочную страницу по rc.conf(5) для выяснения подробностей о файле rc.conf.

10.23.

Не получается изменить системное время больше чем на одну секунду! Как это обойти?

Краткий ответ: Скорее всего, вы работаете на уровне безопасности, превышающем 1. Для смены даты перезагрузите машину и войдите в однопользовательский режим.

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

# sysctl kern.securelevel

Вы не можете понизить уровень безопасности; для изменения даты вам нужно перезагрузиться в однопользовательский режим, или изменить уровень безопасности в /etc/rc.conf, а затем выполнить перезагрузку. Обратитесь к странице Справочника по init(8) за подробной информацией об securelevel и посмотрите /etc/defaults/rc.conf и справочную страницу по rc.conf(5) для выяснения подробностей о файле rc.conf.

10.24.

В rpc.statd; есть ошибка работы с памятью! Он использует 256 Мбайт оперативной памяти!

Нет, там нет ошибок и он не использует 256 Мбайт памяти. Для удобства rpc.statd отображает неприлично большой кусок памяти в своё адресное пространство. Здесь нет ничего неправильного с технической точки зрения, это просто сбивает с толку программы вроде top(1) и ps(1)

rpc.statd(8) отображает свой статусный файл (находящийся на /var) в свое адресное пространство. Для того, чтобы постоянно не беспокоиться о будущих переотражениях, когда файл вырастет в размерах, он просто отображает его с огромным размером заранее. Это просто заметить в исходных текстах, где как вы можете увидеть параметр длина к функции mmap(2) имеет значение 0x10000000, или одна шестнадцатая адресного пространства для IA32, то есть 256 Мбайт.

10.25.

Почему я не могу снять с файла флаг schg?

Вы работаете в системе с повышенным (то есть большим, чем 0) уровнем защиты. Понизьте уровень защиты и попробуйте еще раз. Для получения более подробной информации обратитесь к разделу FAQ об уровне защиты и справочной странице о init(8).

10.26.

Почему в SSH аутентификация посредством файла .shosts не включена по умолчанию в последних версиях FreeBSD?

Причиной, по которой .shosts аутентификация не работает по умолчанию в последних версиях FreeBSD, является то что ssh(1) не устанавливается более с битом изменения привилегий на пользователя root. Если вы хотите «исправить» это, то вы можете сделать одно из двух нижеприведённых действий:

  • Как постоянную правку, установите ENABLE_SUID_SSH в true в файле /etc/make.conf, затем перекомпилируйте и установите ssh(1) (или выполните команду make world).

  • Как временную правку, измените права доступа к файлу /usr/bin/ssh на 4555 командой chmod 4555 /usr/bin/ssh из-под администратора. А потом добавьте строку ENABLE_SUID_SSH= true в файл /etc/make.conf, чтоб это изменение осталось в силе после очередного обновления системы с помощью make world.

10.27.

Что такое vnlru?

vnlru сбрасывает и освобождает vnode, когда система достигает своего ограничения по параметру kern.maxvnodes. Этот подпроцесс ядра в основном работает вхолостую и активируется только при наличии огромного объема ОЗУ и обращении к десяткам или тысячам файлов маленького размера.

10.28.

Что означают различные состояния памяти, показываемые утилитой top?

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

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

  • Cache: (наиболее часто) страницы, которых перемещены из числа неактивных в статус, в котором они содержат данные, но которые могут часто сразу же использоваться повторно (как с их старым содержимым, так и повторно с новым). Это может быть некоторое непосредственное перемещение из состояния active в состояние cache, если известно, что страница чиста (не модифицировалась), но такое перемещение определяется политикой, зависящей от выбора алгоритма разработчиком VM-системы.

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

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

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

Есть ещё некоторые другие флаги (например, флаг занятости или счётчик занятости), которые могут изменить некоторые описанные правила.

10.29.

Сколько свободной памяти доступно?

Есть несколько понятий «свободной памяти». В одном случае это объём памяти, непосредственно доступной в данный момент без страничной выгрузки чего-либо. Этот объём равен примерно размеру очереди кэша + размер очереди на высвобождение (с учётом допустимых отклонений, зависящих от настроек системы). В другом случае «свободная память» обозначает общий объём пространства VM. Он может сложно вычисляться, но зависит от объёма раздела подкачки и памяти. Другие определения «свободной памяти» также возможны, но они достаточно бесполезны, ведь в любом случае важно сохранять низкий уровень подкачки и избегать исчерпания раздела подкачки.

10.30.

Что такое /var/empty? Я не могу его удалить!

/var/empty представляет собой каталог, который использует программа sshd(8) при выполнении разделения полномочий. Каталог /var/empty пуст, его владельцем является root и на нём установлен флаг schg.

Хотя этот каталог удалять не рекомендуется, для выполнения этой операции вам нужно сначала снять флаг schg. Обратитесь к справочным страницам по chflags(1) для получения более полной информации (и помните про ответ на вопрос о снятии флага schg).

Этот, и другие документы, могут быть скачаны с http://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.

По вопросам, связанным с этой документацией, пишите в рассылку <doc@FreeBSD.org>.