Операционная система FreeBSD



Почему именно FreeBSD?


Операционная система FreeBSD - это одна из разновидностей операционной системы UNIX для персональных компьютеров, базирующихся на архитектуре процессоров Intel (386, 486, Pentium, Pentium II). FreeBSD работает также на процессорах AMD и Cyrix , совместимых с Intel и с недавнего времени на процессорах Alpha. FreeBSD предоставляет широкий набор функций, которые ранее были доступны только на более дорогих компьютерах:

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

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

Полную сетевую поддержку TCP/IP. Это означает, что машина с операционной системой FreeBSD может легко взаимодействовать с другими операционными системами, а также работать в качестве сервера, предоставляющего различные сетевые услуги. Вы можете организовать на ней WWW- или ftp-сервер, установить маршрутизатор и систему безопасности (firewall), защищающую корпоративную сеть от внешнего мира.

Защиту и полное разделение памяти между процессами. Это значит, что приложения (и, соответственно, пользователи) не могут навредить друг другу. В любом случае, если одно приложение "зависнет", то это никоим образом не отразится на работе других.

Двоичную совместимость со многими программами, созданными для систем SCO,BSDI, NetBSD, Linux и 386BSD. Большое число готовых к работе приложений, находящихся в коллекции переносимых пакетов (Port Packages Collection). Зачем долго и упорно искать их в сети, когда можно взять все это прямо здесь?

Еще большее число дополнительных и легко переносимых приложений, имеющихся в Internet. Исходные коды FreeBSD совместимы со многими коммерческими системами UNIX (например, Linux, SCO), и большинство приложений, если и требуют, то совсем немного изменений для их компиляции.

Страничная организация виртуальной памяти (VM) с подкачкой страниц по требованию и общий кэш для VM и буфера I/O позволяют удовлетворять непомерные аппетиты приложений, в то же время, не причиняя неудобств другим пользователям.

Разделяемые библиотеки (Unix-овый эквивалент MS-Windows DLL) обеспечивают эффективное использование дискового пространства и памяти.

Полный набор средств разработки для языков C, C++ и Fortran. В коллекции пакетов можно найти много других языков для передовых исследований и разработок.

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

Обширная on-line документация.

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

Изучив этот курс, Вы, конечно, не станете сразу "крутым админом". Для этого требуется, прежде всего, практика и еще раз практика!

Итак, если у Вас есть желание "покопаться в Юниксе" и/или Вам наскучил Windows, то милости просим:

Шрифты и условные обозначения
Символ # означает приглашение операционной системы (точнее оболочки, shell) на ввод команды. Имена файлов, аргументы команд и сами команды, которые следует набирать на клавиатуре без изменений, даны жирным шрифтом, например:

# cp /kernel /kernel.old

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

# mv <файл> <каталог>, т.е. нужно <файл> заменить именем реального файла, а <каталог> - именем реального каталога.

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

# ls /usr/home/mag /* вывести содержимое каталога /usr/home/mag */
.forward .login .profile /* список файлов в каталоге /usr/home/mag */

Текст, заключенный в квадратные скобки [ ] в синтаксисе команд является необязательным.

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

Фигурные скобки { } указывают на то, что нужно выбрать один из элементов, разделенных вертикальной чертой |. Например записи команды:

# stick [-p] {yes | no} <файл> :

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

# stick yes /etc/passwd
# stick -p no /root
# stick no /etc/passwd /root
# stick -p yes /etc/passwd /root

Символы подстановки shell:

Звездочка * означает любое количество символов.
Вопросительный знак ? означает ровно один символ.
Тильда ~ означает домашний каталог текущего пользователя.
Запись ~user означает домашний каталог пользователя user.

Работа с man- страницами
Man-страницы в системах семейства UNIX - это аналог Help- систем в Microsoft Windows.

Man-страницы (их название говорит о том, что эти страницы предназначены для работы с командой man) содержат полное описание отдельных команд, форматов файлов и библиотечных подпрограмм. Обычно они доступны в диалоговом режиме (on-line).

Во всех UNIX-системах man-страницы делятся на разделы. Номера разделов man-страниц и описание их содержимого для ОС FreeBSD приведены ниже:

Команды и прикладные программы пользовательского уровня.
Системные вызовы и коды ошибок ядра.
Библиотечные вызовы.
Драйверы устройств и сетевые протоколы.
Стандартные форматы файлов.
Игры и демонстрационные программы.
Различные файлы и документы.
Команды системного администрирования.

Команда man <заголовок> форматирует конкретную страницу документации и посылает ее на терминал пользователя посредством программы more или другой программы, которая задана в переменной среды PAGER. Аргумент <заголовок> - это, как правило, имя команды, устройство или имя файла, о которых необходимо получить справочную информацию. Поиск по разделам руководства осуществляется в порядке возрастания номеров, но разделы, описывающие команды (1 и 8), обычно просматриваются в первую очередь.

Команда man <раздел> <заголовок> вызывает man-страницу из указанного раздела. Так, команда man tty читает man-страницу для команды tty, а команда man 4 tty - man-страницу для последовательного драйвера.

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

setenv MANPATH /home/user/myman:/usr/share/man

в файле .login, .cshrc, .shrc или .profile (эти файлы выполняются при регистрации пользователя в системе в зависимости от shell пользователя) Вашего каталога можно указать команде man провести поиск сначала в иерархии локальных man-страниц, а затем в /usr/share/man. Версия этой команды в sh или bash будет иметь такой вид:

MANPATH = /home/user/myman:/usr/share/man
export MANPATH

Команда man -k <ключевое_слово> печатает список man-страниц, в строке пояснений к которым имеется <ключевое_слово>.

Пример: man -k mail

aliases(5) - aliases file for sendmail
biff(1) - be notified if mail arrives and who it is from ctm_smail(1),
ctm_rmail(1) - send and receive ctm deltas via mail
forward(5) - mail forwarding instructions
from(1) - print names of those who have sent mail
mail(1) - send and receive mail
mail.local(8) - store mail in a mailbox
mailaddr(7) - mail addressing description
mailq(1) - print the mail queue
mailstats(8) - display mail statistics
makemap(8) - create database maps for sendmail
msgs(1) - system messages and junk mail program
newaliases(1) - rebuild the data base for the mail aliases file
praliases(8) - display system mail aliases
rmail(8) - handle remote mail received via uucp
sendmail(8) - an electronic mail transport agent
smrsh(8) - restricted shell for sendmail

База данных ключевых слов обычно хранится в файле whatis в корневом каталоге иерархии man-страниц (/usr/share/man). Если в систему вводятся дополнительные man-страницы, то, возможно, потребуется модифицировать этот фал с помощью catman -w.

Наберите man whatis, и Вы увидите:

APROPOS(1) FreeBSD General Commands Manual APROPOS(1)
NAME apropos, whatis - search the whatis database SYNOPSIS
apropos _k_e_y_w_o_r_d ...
whatis _k_e_y_w_o_r_d ...
DESCRIPTION
apropos searches a set of database files containing short descriptions of
system commands for keywords and displays the result on the standard output.
whatis displays only complete word matches.
RETURN VALUES
The apropos utility exits 0 on success, and 1 if no keyword matched.
SEE ALSO man(1), makewhatis(1)
BSD Jan 15, 1991 1

Теперь посмотрим на вывод команды whatis man:

catman(1) - preformat man pages
man(1) - format and display the on-line manual pages
man(7) - quick reference guide for the -man macro package
manpath(1) - determine user's search path for man pages
pod2man(1) - translate embedded Perl pod directives into man pages

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

Благодарности
В первую очередь благодарю всех сотрудников компании "IP Communications" (www.ipc.ru), где автор проходил курс изучения и администрирования OC UNIX. Особую благодарность выражаю главному преподавателю курсов Мисуренко Алексею Геннадиевичу, а так же директору компании Ротенштейн Владимиру Самуиловичу за помощь в предоставлении материалов.

Так же выражаю благодарность Паскаль Ивану (pascal@tsu.ru) за предоставленную возможность воспользоваться некоторыми материалами по администрированию ОС FreeBSD, находящимися на сайте www.tsu.ru/~pascal/. Ну и конечно огромное сердечное СПАСИБО всем, кто принимал участие в составлении и переводе официальных FAQ для FreeBSD!

Контакты
Замечания, предложения, комментарии, сообщения об обнаруженных в этом курсе ошибках присылайте, пожалуйста, по адресу: andre@fedorov.de Автор отвечает, как правило, на все письма, но иногда будьте терпеливы. Надеюсь, курс Вам понравится. Желаю удачи в освоении операционной системы FreeBSD.


Инсталляция системы
Где взять дистрибутив?
Аппаратное обеспечение
Подготовка к инсталляции
Установка FreeBSD
Установка программного обеспечения
Вопросы и ответы
Упражнение

Где взять дистрибутив?
В первую очередь все основные готовые версии FreeBSD доступны с ftp://ftp.FreeBSD.org/pub/FreeBSD в России - ftp.ru.

Для получения списка серверов, с которых можно скачать свежую версию FreeBSD, обратитесь на www.freebsd.org. Если Вы хотите приобрести компакт-диск с FreeBSD, обратитесь на www.freebsd.org.ru.

Диск с ОС FreeBSD также можно приобрести у компании CDROM, по адресу:

Walnut Creek CDROM
4041 Pike Lane, Suite F
Concord, CA 94520
USA

Заказ: +1 800 786-9907
FAX: +1 925 674-0821
email: WC Orders address
WWW: WC Home page

Аппаратное обеспечение
В настоящий момент FreeBSD работает на персональных компьютерах от 386sx до Pentium II (хотя 386sx не рекомендуется), с большим разнообразием шин: ISA, VLB, EISA и PCI. Предоставляется поддержка для основных конфигураций устройств IDE и ESDI, различных SCSI контроллеров, сетевых карт и карт последовательного доступа.

Для запуска FreeBSD требуется как минимум 4 Мб RAM. Если версия вашей системы 2.2.8 и выше, вам потребуется не менее 5 Мб RAM. Если Вы планируете использовать X Window System, то Вам потребуется не менее 8 Мб RAM.

Для примера, конфигурация моего ПК: AMD K6-400, 64 Mb RAM, SIS6326 video 4 Mb RAM integrated, HDD 3.2 Gb, Sound blaster ALS4000, floppy 3.5", PS/2 mouse.

Подготовка к инсталляции
Инсталлировать FreeBSD можно с различных носителей (раздела DOS, CD-ROM, через FTP и NFS). В данном курсе будет описана процедура инсталляции ОС FreeBSD 3.1-RELEASE с существующего раздела DOS.

На существующем разделе DOS создайте каталоги

C:BIN и положите туда все файлы из директории bin
C:SRC и положите туда все файлы из директории src
C:FLOPPIES и положите туда все файлы из директории floppies
C:TOOLS и положите туда все файлы из директории tools дистрибутива FreeBSD.

Если же у Вас нет дефицита места на диске C:, то Вы можете просто смело скопировать все каталоги с дистрибутива ОС FreeBSD в корневой каталог C:.

С помощью утилиты fdimage из каталога tools создайте загрузочный диск (предварительно вставив чистую отформатированную дискету в дисковод a:) из образа диска в директории C:FLOPPIES

c:TOOLSfdimage c:FLOPPIESkern.flp a:
Аналогично сделаем дискету с mfsroot.flp:

c:TOOLSfdimage c:FLOPPIESmfsroot.flp a:
Инсталляционные дискеты подготовлены и можно приступать к установке самой операционной системы.

Установка FreeBSD
Вставьте дискету с kern.flp в дисковод а: и перезапустите компьютер.

После того, как система считает информацию с дискеты, она попросит вставить вторую дискету: mfsroot.flp.

Вставьте эту дискету и нажмите клавишу <Enter>.

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

Через некоторое время ядро ОС FreeBSD опросит устройства вашего компьютера и запустит программу инсталляции, которая предоставит Вам меню для начала инсталляции.

Выберете пункт меню Keymap и установите раскладку клавиатуры в Russia KOI8-R.
Выберите в меню Custom подменю Options.
Укажите нужный Вам редактор (я, например, плохо знаю редактор vi, поэтому пользуюсь /usr/bin/ее)
Выберите Media, как "Инсталляция с существующей DOS-partition".
Нажмите <Q> для возврата в главное меню.

Теперь нужно указать программе установки область диска для инсталляции.

Выберите пункт Partition. Программа сообщит Вам, какие есть на диске разделы и их тип. Создайте с помощью команды <С> раздел (в системе FreeBSD он именуется - "слайс"). На запрос о количестве секторов, выделяемых под раздел, нажмите <ОК>, если хотите использовать все оставшееся место, либо введите их количество. Если Вам трудно оперировать секторами, можно указать размер и в мегабайтах, поставив букву <М>. На запрос о типе файловой системе наберите 165 и нажмите <ОК>. Нажмите <Q> для возврата в главное меню.

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

Это ответственный момент. Внимательно посмотрите на меню используемых команд. Если не хотите делать это вручную, то нажмите <А>, и программа все сделает сама.

Для примера, свой диск 3.2 Gb, я разделил таким образом:

2.2 Gb - DOS-partition
1.0 Gb - FreeBSD-slice

Для FreeBSD место разделил так:

- wd0s1 2200M <none> <dos>
- wd0s2a 100M / UFS Y
- wd0s2b 125M swap
- wd0s2e 575M /usr UFS Y
- wd0s2f 200M /var UFS Y

Пространство для swap достаточно сделать в два раза больше размера оперативной памяти компьютера.

Нажмите <Q>.

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

Следующий пункт - выбор инсталлируемого пакета. Если Вы копировали каталог /src с дистрибутива FreeBSD, то советую установить исходные коды ядра, они нам понадобятся при его переконфигурации. Если Вы не собираетесь этого делать (что бывает крайне редко), то укажите Distribution >> Custom >> bin, т.е. установить только исполняемые файлы.

Выберите Commit.

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

Если Вы уверены, что все сделали правильно - жмите <ОК>. По завершении инсталляции компьютер перегрузится (не забудьте вынуть дискету из дисковода а:).

Как видите, установка FreeBSD совсем не сложнее, чем MS Windows ;-).

Установка программного обеспечения
Существует большое количество программ в виде пакетов (packages) и портов (ports).

Что такое package?

Package (Пакет) - это архив типа *.tgz (tar-архив, сжатый zip'ом), в котором лежат уже собранные исполняемы файлы программ, описания и руководства к ним, необходимые конфигурационные файлы и т.п.

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

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

Некоторые пакеты для нормальной работы требуют наличие установленных в системе других пакетов (обычно это библиотеки). В таких случаях программа установки проверяет наличие всего необходимого.

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

В чем заключается регистрация пакета?

В директории /var/db/pkg создается директория с тем же названием, что и пакет, в которую помещаются несколько файлов. В этих файлах находится

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

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

Как установить пакет?

Чтобы установить пакет, наберите команду

pkg_add <имя архива пакета >

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

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

Как удалить пакет?

Чтобы установить пакет, наберите команду

pkg_delete <имя пакета>.

Точное имя пакета можно подсмотреть в /var/db/pkg. (Даже если Вы каждый день пользуетесь программой, это еще не значит, что Вы безошибочно назовете имя пакета, откуда его поставили, например bash-2.02.1.tgz)

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

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

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

И, наконец, кое-какой "мусор" все равно может остаться. Например, если для какой-то программы каждый пользователь может иметь собственный конфигурационный файл в своей домашней директории, естественно, программа удаления пакета их удалять не будет.

Информацию об этих командах смотрите в man-страницах:

man pkg_add - установка пакетов,
man pkg_delete - удаление пакетов,
man pkg_info - вывод информации об установленных пакетах.

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

Установка "портов" (ports).

Что такое ports?

Ports - это описание процесса "сборки" пакета (package).

Как можно установить port?

Для этого c любого хоста из Internet (смотри раздел "Где взять дистрибутив") из директории ports (такая директория есть для текущих версий FreeBSD) заберем нужный нам "свежий" port.

Коллекция ports постоянно изменяется: добавляются новые приложения, исправляются ошибки и т.д. Поэтому, рекомендуется производить обновление коллекции ports. Строгих правил здесь нет, но по возможности делайте обновление хотя бы 2-3 раза в месяц.

Для установки приложения zoo из коллекции ports введите команды:

# cd /usr/ports/archivers/zoo
# make
# make install
# make clean

Для переустановки приложения:

# cd /usr/ports/archivers/zoo
# make reinstall
# make clean

Для удаления приложения:

# cd /usr/ports/archivers/zoo
# make deinstall

Заключение
Вы закончили изучение главы курса, в которой рассматривались вопросы инсталляции системы FreeBSD 3.1-RELEASE, а так же программного обеспечения. Теперь Вы умеете инсталлировать систему, знаете, что такое package (пакет) и port. Можете инсталлировать и удалять программное обеспечение. Ниже приводятся некоторые вопросы и ответы, которые могли бы возникнуть у Вас в процессе изучения раздела, а так же простое упражнение. Изучите вопросы и ответы и выполните упражнение. Не переходите к изучению следующего раздела курса, если у Вас остались неясности.

Вопросы и ответы
Вопрос: Какой файл нужно скачать для установки FreeBSD?

Ответ: До выхода в свет релиза FreeBSD 3.1 для установки вам был нужен только один файл с образом дискеты, floppies/boot.flp. Однако, начиная с версии 3.1, во FreeBSD была добавлена базовая поддержка для очень широкого спектра оборудования, что требует значительно большего дискового пространства, поэтому для установки FreeBSD версий 3.x и 4.x используются два образа дискет, находящиеся в файлах floppies/kernel.flp и floppies/mfsroot.flp. Эти образы нужно перенести на дискеты с помощью таких утилит, как fdimage или dd(1).

Если Вы хотите скачать дистрибутив самостоятельно (например, для установки с раздела DOS), вот список рекомендованных частей дистрибутива:

bin/
manpages/
compat*/
doc/
src/ssys.*
Вопрос: Загрузка с установочной дискеты прерывается на сообщении ``Probing Devices...''.

Ответ: Если у вас установлены устройства IDE Zip или Jaz, отключите их и попробуйте снова. Они могут мешать инсталляционной программе. После того, как система будет установлена, Вы можете снова подключить устройства.

Вопрос: Может ли Windows 9х сосуществовать с FreeBSD?

Ответ: Сначала проинсталлируйте Windows 9х, затем FreeBSD. Менеджер загрузки FreeBSD будет управлять процессом загрузки Win9х или FreeBSD. Если Вы после этого ещё раз проинсталлируете Windows 9х, то в процессе установки менеджер загрузки будет грубо удалён.

Вопрос: Windows 9х уничтожила мой менеджер загрузки! Как мне его вернуть?

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

Запустите DOS, перейдите в каталог tools/ вашего дистрибутива FreeBSD и найдите программу bootinst.exe. Запустите её следующим образом:
bootinst.exe boot.bin

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

Загрузитесь с установочной дискеты FreeBSD и перейдите в меню установки Custom install. Выберите пункт Partition. Выберите устройство, на котором будет располагаться для ваш менеджера загрузки (это будет самый первый диск) и когда Вы перейдете к редактированию разделов, первым делом (то есть ещё не делая никаких изменений) выберите (W)rite. Последует запрос на подтверждение, ответьте yes, и когда Вы попадёте в меню выбора менеджера загрузки, выберите пункт "Boot Manager". Менеджер загрузки будет переписан на диск. Теперь нужно выйти из меню установки и загрузиться с винчестера как обычно.
Вопрос: Моя система не загружается!

Ответ: См. главу курса "Начальная загрузка и останов системы", раздел "Неисправности в процессе загрузки"

Упражнение:
С какого-либо хоста, описанного в разделе "Где взять дистрибутив" скачайте пакет bash-2.02.1.tgz (из каталога /packages/shells).

Инсталлируйте этот пакет.

Посмотрите содержимое установленного пакета

Удалите пакет

Ответы к упражнению:

Положите скачанный пакет в каталог /var/tmp

# pkg_add /var/tmp/bash-2.02.1.tgz
# cd /var/db/pkg/bash-2.02.1.tgz
# ls -l

В каждом package присутствуют следующие файлы:

+COMMENT - содержит комментарии

+CONTENTS - отражает содержимое пакета

+DESC - содержит описание пакета

# pkg_delete /var/db/pkg/bash-2.02.1.tgz



Начальная загрузка и останов системы
Этапы начальной загрузки
Командные файлы начальной загрузки
Вход в систему и выход из нее; программа login
Перезагрузка и останов системы
Неисправности в процессе загрузки
Вопросы и ответы

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

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

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

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

Процесс начальной загрузки состоит из этапов:

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

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

Конфигурация аппаратных средств

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

Системные процессы

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

swapper - процесс 0;
init - процесс 1;
pagedaemon - процесс 2.

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

Если систему нужно запустить в однопользовательском режиме, администратор на запрос boot: в командной строке вводит -s, а ядро передает информацию процессу init. При загрузке в однопользовательском режиме init просто запускает на системной консоли интерпретатор команд и ждет, пока он завершит работу (после нажатия Ctrl + D или ввода команды exit), а затем продолжает выполнять процесс запуска. В однопользовательском режиме всегда используется интерпретатор sh.

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

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

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

В системе FreeBSD эти файлы хранятся в каталоге /etc, их имена начинаются буквами rc, и они выполняют функции:

установка имени компьютера;
установка часового пояса;
проверка дисков командой fsck (только в автоматическом режиме);
монтирование файловых систем;
удаление файлов из каталога /tmp;
конфигурирование сетевых интерфейсов;
запуск процессов-демонов и сетевых служб;
включение учета и контроля квот (в данном курсе не рассматривается).
Вход в систему и выход из нее; программа login
Во время начальной загрузки запускается демон init. Одна из его задач - породить процесс getty на каждом порту терминала, который определяется в файле /etc/ttys. Процесс getty устанавливает исходные характеристики порта (в частности, скорость передачи и контроль четности) и выводит на экран регистрационное приглашение login:.

Последовательность событий при полной регистрации выглядит так:

Пользователь вводит регистрационное имя по приглашению login: процесса getty.
getty выполняет программу login, используя в качестве аргумента указанное имя.
login запрашивает пароль и сверяет имя и пароль с записанными в файле /etc/passwd.
login выводит на экран из файла /etc/motd "сообщение дня".
login запускает интерпретатор shell, указанный в бюджете пользователя и устанавливает переменную среды TERM.
shell выполняет соответствующие файлы запуска (если это Bourne-shell, выполняется файл .profile, если C-shell - .login и .cshrc, если Korn-shell - .profile и .kshrc).


shell выводит на экран приглашение и ожидает ввода информации.

Когда пользователь выходит из системы (после нажатия Ctrl + D или ввода команды exit), управление возвращается демону init, который пробуждается и порождает новый процесс getty на порту терминала.

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

выключить питание;
дать команду shutdown;
использовать команды halt и reboot;
послать процессору init сигнал TERM;
уничтожить процесс init.
Выключение питания

Запомните раз и навсегда - такой способ останова неприемлем!!!. Это может привести не только к потере данных, но и к повреждению системных файлов.

Команда shutdown

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

Команда halt

Команда halt выполняет все основные операции, необходимые для останова системы. Для вызова этой команды можно в командной строке указать shutdown с опцией -h или просто ввести halt.

Команда reboot (ее алиас - fastboot)

Команда reboot почти идентична команде halt. Различие заключается в том, что машина перезагружается, а не останавливается. Команда reboot эквивалентна команде shutdown -r.

Посылка процессу init сигнала 15 (TERM)

Когда демон init получает сигнал TERM, он обычно уничтожает все пользовательские процессы, демоны, процессы getty и возвращает систему в однопользовательский режим.

# sync (эта команда сбросит "все, что нужно" на диск)

# kill -15 1 (демон init всегда имеет pid=1)

Уничтожение процесса init

# kill -9 1

Результаты уничтожения процесса init вообще говоря непредсказуемы. Процесс init настолько важен для работы системы, что если его уничтожить, то компьютер автоматически перезагрузится (некоторые ядра при этом выдают сообщение kernel panic). Это очень грубый способ перезагрузки. Лучше пользоваться командами shutdown или reboot.

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

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

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

Дефектные блоки начальной загрузки

Как правило, в устройство управления ПЗУ машины встроена информация о том, как выполнять начальную загрузку системы.

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

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

Повреждение файловых систем

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

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

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

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

Неверная конфигурация ядра

Перестраивая и заменяя ядро, Вы каждый раз рискуете тем, что оно однажды перестанет работать, и Вы окажетесь в очень затруднительном положении. Обязательно примите меры по обеспечению возможности загрузки старого ядра на случай неожиданной проблемы. Рекомендуется держать старое ядро системы под рукой даже в повседневной работе (назовите его, скажем, kernel.super.old, и пусть оно лежит себе спокойно рядом с повседневным kernel в корневом каталоге, и ждет "своего часа").

Ошибки в сценариях запуска

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

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

Ответ: Для FreeBSD конфигурационным файлом является /etc/rc.conf. Все параметры указываются здесь, а остальные конфигурационные файлы /etc/rc* просто его используют.

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

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

Файл /etc/rc.serial предназначен для инициализации коммуникационных адаптеров (например, установки характеристик работы последовательных портов).

Файл /etc/rc.i386 предназначен для настройки специфичных для архитектуры Intel параметров, таких, как эмуляция iBCS2 или характеристик системной консоли ПК.

В каталоге, указанном в файле /etc/rc.conf, вы можете создавать свои файлы автозапуска:


# Location of local startup files.
local_startup=/usr/local/etc/rc.d

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

Это простой и понятный метод для добавления дополнительных служб без редактирования файла /etc/rc.local. Многие порты/пакаджи предполагают, что каталог /usr/local/etc/rc.d предназначен для размещения запускаемых при загрузке системы скриптов.

Вопрос: Как запретить перезагрузку по клавишам Control-Alt-Delete?

Ответ: Если вы используете драйвер консоли syscons (который является стандартным) во FreeBSD 2.2.7-RELEASE и выше, перегенерируйте и установите новое ядро со строчкой

options SC_DISABLE_REBOOT
в конфигурационном файле. Если же вы используете драйвер консоли PCVT во FreeBSD 2.2.5-RELEASE и выше, то укажите следующую строку в конфигурационном файле:

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

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

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

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

# return
# exit

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

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

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

Дефектные блоки начальной загрузки

Как правило, в устройство управления ПЗУ машины встроена информация о том, как выполнять начальную загрузку системы.

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

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

Повреждение файловых систем

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

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

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

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

Неверная конфигурация ядра

Перестраивая и заменяя ядро, Вы каждый раз рискуете тем, что оно однажды перестанет работать, и Вы окажетесь в очень затруднительном положении. Обязательно примите меры по обеспечению возможности загрузки старого ядра на случай неожиданной проблемы. Рекомендуется держать старое ядро системы под рукой даже в повседневной работе (назовите его, скажем, kernel.super.old, и пусть оно лежит себе спокойно рядом с повседневным kernel в корневом каталоге, и ждет "своего часа").

Ошибки в сценариях запуска

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

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

Ответ: Для FreeBSD конфигурационным файлом является /etc/rc.conf. Все параметры указываются здесь, а остальные конфигурационные файлы /etc/rc* просто его используют.

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

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

Файл /etc/rc.serial предназначен для инициализации коммуникационных адаптеров (например, установки характеристик работы последовательных портов).

Файл /etc/rc.i386 предназначен для настройки специфичных для архитектуры Intel параметров, таких, как эмуляция iBCS2 или характеристик системной консоли ПК.

В каталоге, указанном в файле /etc/rc.conf, вы можете создавать свои файлы автозапуска:

# Location of local startup files.
local_startup=/usr/local/etc/rc.d

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

Это простой и понятный метод для добавления дополнительных служб без редактирования файла /etc/rc.local. Многие порты/пакаджи предполагают, что каталог /usr/local/etc/rc.d предназначен для размещения запускаемых при загрузке системы скриптов.

Вопрос: Как запретить перезагрузку по клавишам Control-Alt-Delete?

Ответ: Если вы используете драйвер консоли syscons (который является стандартным) во FreeBSD 2.2.7-RELEASE и выше, перегенерируйте и установите новое ядро со строчкой

options SC_DISABLE_REBOOT
в конфигурационном файле. Если же вы используете драйвер консоли PCVT во FreeBSD 2.2.5-RELEASE и выше, то укажите следующую строку в конфигурационном файле:

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

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

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

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

# return
# exit




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

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

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

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

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

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

Не вдаваясь в подробности, можно сказать, что

каждый процесс имеет идентификатор юзера (userID). Обычно он совпадает с userID'ом того юзера, который запустил этот процесс.
процессы, которые запустились автоматически, тоже имеют userID, как будто их запустил реальный юзер. Чей именно userID получают эти программы обычно определяется теми программами, которые их стартуют (программа-загрузчик, cron, inetd и т.д.). В простейших случаях программы-"потомки" просто "наследуют" userID от программы-"родителя", но некоторые "родители" могут запускать программы с другим userID (не совпадающим с собственным).
некоторые программы в процессе выполнения могут поменять свой userID и, соответственно, получить права, которые сам юзер не имел. Естественно, для того, чтобы программа могла это сделать, администратор должен "разрешить" ей такое поведение (подробнее об этом будет сказано ниже). Кстати, изменение userID'а делается не только, когда нужно "расширить" права программы, но и наоборот - "сузить" до прав какого-нибудь конкретного юзера.
если процесс может изменять свой userID, то различают "реальный userID" и "эффективный userID" (есть еще "сохраненный userID"). Реальный userID - это идентификатор юзера, который запустил процесс (или userID процесса-"родителя"). А эффективный - это новый userID, который задача получила во время выполнения.
права на файл (или директорию) определяются по "эффективному userID" процесса. В простейшем случае, когда userID не меняется, "реальный" и "эффективный" userID'ы совпадают и можно говорить просто об userID'е процесса. Или даже просто о правах юзера (а не процесса) на файл.
Какие атрибуты файла определяют "праводоступа".

Все юзеры для каждого файла (или директории) делятся на три категории

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

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

Итак. В заголовок файла записывается идентификатор юзера (userID), который считается его владельцем. Заметьте, что "хозяином" может быть только один определенный юзер.

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

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

Наберите команду

ls -l
(аналог команда dir в MS DOS) и вы увидите несколько строчек типа

-rw-r--r-- 1 bob users 4297 23мар 17:37 list_us
-rwxr-xr-x 1 bob users 1502 17мар 12:03 myProg
-rw-r--r-- 1 bob users 5354 12мар 23:51 tmp.dat
\________/ \_/ \___/ \__/ \__________/ \______/
"права" владелец группа длина дата имяфайла

В третьей колонке вы видите имя (login name) юзера - "хозяина" этих файлов (в данном случае это - bob). В четвертой колонке - название группы, приписанной также к этим файлам (в данном случае - users). И, наконец, в самой первой колонке (набор знаков типа "r", "w" и "-") сами permissions для всех трех категорий пользователей.

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

Основные биты доступа (чтение/запись/выполнение)

Рассмотрим подробнее - что представляют собой "права доступа".

При распечатке содержимого директории (например, командой ls) каждая строчка имеет вид

-rw-r--r-- 1 bob users 4297 13мар 21:45 files1

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

Она состоит из десяти знаков. Однако, самый первый знак не имеет отношения к permissions, а обозначает "тип этого объекта". Поскольку, в директории кроме файлов могут находиться поддиректории и, кроме того, в Юниксе, кроме обычных файлов существуют другие объекты ("линки", "очереди", "сокеты" и т.п.), которые также находятся в директориях и имеют атрибуты как и у обычных файлов. Так вот, первый символ как раз и показывает - что за объект мы видим, обычный файл (значок "-"), поддиректорию (значок "d") или еще какой-нибудь специфический объект ("l", "s", "p"...).

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

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

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

Для файлов.

Первый бит, обозначается буквой "r" (read), и означает, что юзеру, подпадающему под соответствующую категорию, разрешается читать содержимое этого файла. То есть он может посмотреть содержимое файла, а также скопировать этот файл. Кстати, это не означает, что юзер сможет запустить его на выполнение (если это программа). Второй бит, обозначается буквой "w" (write) и разрешает писать в файл. То есть юзер сможет изменить содержимое файла (например, каким-нибудь редактором), дописать что-нибудь в конец или стереть все содержимое. Обратите внимание, этот бит еще не дает право удалить сам файл из директории или изменить ему название (это определяется правами на саму директорию), но дает возможность сделать этот файл пустым (нулевой длины) или скопировать в него содержимое другого файла (и тем самым "подменить" его). И, наконец, третий бит, обозначается буквой "x" (eXecute), позволяет запустить на выполнение этот файл, если он представляет собой программу или командный файл. Обратите внимание, что это также основной признак, по которому система догадывается о "запускаемости" этого файла. Часто начинающие пользователи составив какой-нибудь командный файл, забываю установить на него бит "исполнения" хотя бы для себя - владельца этого файла. В результате, при попытке запустить его, система сообщает, что "вы не имеете права" (выполнять этот файл). Естественно, что в данном случае причина не в том, что "злобный" администратор существенно "урезал" права этого юзера, а в том, что он сам забыл "наделить себя правом" (вполне законным).

Для директорий.

Первый бит ("r") разрешает читать оглавление этой директории, то есть список файлов и поддиректорий, находящихся в ней. Однако, этот бит еще не дает возможность зайти в эту директорию (командой cd) или получить доступ к содержимому, то есть читать/запускать/изменять файлы, даже если "права доступа" установленные на самих файлах это позволяют. Поэтому, само по себе "право чтения" директории практически бесполезно и этот бит, как правило ставиться только вместе с битом "x". Немного забегая вперед, рассмотрим сразу третий бит - "x". Для директорий он как раз означает, что юзер может получит доступ к "компонентам", то есть отдельным файлам и поддиректориям. Только при наличии это бита, система разрешит войти в эту директорию и выполнить какое-нибудь действие с файлом, если сами файлы ("права доступа" на них) это позволят. Кстати, обратите внимание, что если даже внутренние поддиректории имеют "нормальные" права для какой-то категории юзеров, а вышестоящая директория - нет (отсутствует бит "x"), то этим юзерам не удастся "занырнуть" в поддиректории, минуя вышестоящую. Система проверяет полный "путь" до конечной директории или файла (например, /usr/share/misc/fonts) и, если хотя бы один из компонентов этого пути не имеет соответствующего бита, то юзеру будет отказано в доступе. Наконец, бит "w", установленный на директории, позволяет изменять оглавление директории. То есть, разрешает создавать новые файлы (или копировать другие файлы в эту директорию), менять названия файлов и удалять файлы.

Обратите внимание на "разделение полномочий" между теми permissions, которые стоят на файле и теми, которые на директории.

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

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

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

И последнее замечание. Все эти биты не имеют никакого эффекта для юзера root (и программ, которые во время выполнения поменяли свой "эффективный userID" на "рутовый"). То есть, он может делать с файлом или директорией все что хочет.

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

Дополнительные биты доступа

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



Бит suid.

Бит suid. Расшифровывается как Set user ID, переводится как "установить идентификатор юзера". Поскольку подходящего русскоязычного термина не существует, его обычно называют "суидный" бит, а файлы, на которых он установлен - "суидными".

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

Обычно это делается для того, чтобы юзер мог выполнить действия, которые требуют привилегий root'а (например, поменять свой пароль). Естественно, что для этого владельцем такой программы должен быть юзер root.

Понятно, что такая программа является "потенциально опасной". В "нормальном" случае она не позволит обычному юзеру сделать то, что выходит за пределы его полномочий (например, программа passwd разрешит юзеру изменить только собственный пароль, но не пароли других юзеров). Но, даже незначительная ошибка в такой программе может привести к тому, что "злоумышленник" сможет заставит ее выполнить еще какие-нибудь действия, не предусмотренные автором программы. Кстати, большинство известных способов "взлома" системы заключаются не в том, чтобы узнать пароль root'а, а как раз в том, чтобы заставить какую-нибудь из "суидных" программ выполнять действия необходимые "взломщику".

Вообще говоря, использование "суидных" программ (когда они нужны и для чего) - достаточно обширная тема выходящая за рамки разговора о permissions. Замечу только, что это не единственный путь сменить "эффективный userID". Это можно сделать из самой программы, вызвав специальную системную функцию, но для этого программы должна уже иметь права root'а. То есть, ее должен запустить юзер root, или она должна быть "суидной", как сказано выше.

Возвращаясь к разговору о "правах доступа", надо сказать, что у такого файла permissions выглядят как **s****** (если еще и установлен бит x для владельца файла) или как **S****** (если бит x не установлен). Однако, ставить suid бит на неисполняемые файлы обычно не имеет смысла (по крайней мере в FreeBSD). Хотя, существуют программы, которые проверяли этот бит даже для текстовых файлов. Также, это бит не несет никакого смысла, если его поставить на директорию, хотя никто не запрещает это сделать.

Бит sgid

Бит sgid. Расшифровывается как Set group ID, переводится как "установить идентификатор группы".

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

Permissions такого файла выглядят как *****s*** (если установлен бит x для группы) или *****S** (если соответствующего бита x нет). Также как и в предыдущем случае, бит sgid для неисполняемых файлов никакого смысла не имеет.

Что касается бита sgid на директории...

Для FreeBSD (и других BSD-систем) этот бит, опять же, не оказывает никакого действия. Но в некоторых других Unix-системах он означает, что, когда файлы создаются в такой директории, в их атрибутах проставляется группа та же, что и у директории. Другими словами, файлы, создаваемые в такой директории "наследуют" группу от директории.

Бит sticky

Бит sticky. Никак не расшифровывается, переводится как "липкий".

Выглядит в permissions, как ********t (если вместе с битом x для "всех остальных") или ********T (если соответствующего бита x нет).

Для директорий его смысл заключается в том, что удалить файл из такой директории (или переименовать) может только владелец файла. Напомню, что в обычном случае (без такого бита) возможность удалять файлы (как и создавать) определяется правом записи (бит w) на директории. То есть, если какой-либо юзер принадлежит к категории, для которой разрешена запись в директорию, он может удалить в ней любой файл, независимо от атрибутов (владельца, группы, permissions) самого файла.

Применяют этот бит, обычно, на директориях, которые являются "публичными" (например, /tmp). Такие директории имеют права доступа, позволяющие всем юзерам создавать там свои файлы и удалять их. Однако было бы неправильно, что любой другой юзер мог по ошибке или "из вредности" удалять файлы, к которым он не имеет никакого отношения. Для того чтобы предотвратить возможность удаления файла "посторонним" юзером, как раз и служит sticky бит.

Этот бит может ставиться также на исполняемые файлы. В этом случае он означает, что файл, даже после завершения работы, должен оставаться в памяти (конечно, не в ОЗУ, а в swap).

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

Сочетания битов доступа.
Для файлов

Обычно права на файл (например, для "всех остальных") устанавливаются

--- никаких прав (нельзя ни читать, ни изменять содержимое)
r-- только чтение
rw- и чтение и запись (изменение) файла.

Если файл является "исполняемым", то права могут выглядеть

--- опять же, никаких прав (читать нельзя, запускать нельзя)
r-x можно запустить файл-задачу на выполнение
rwx можно не только запустить, но и что-нибудь в нем поменять
Остальные сочетания (например -w- или --x) кажутся бессмысленными.
Однако, это не всегда так. Рассмотрим подробнее.

Права -w- означают, что юзер из соответствующей категории не может прочитать этот файл, но может в него писать.

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

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

Правда, при этом никто не мешает тем же юзерам просто не читая, записать в этот файл что-нибудь, удалив при этом все старое содержимое файла. Или даже скопировать туда файл нулевой длины (или /dev/null), при этом, естественно, вообще никакого "содержимого" у вашего файла не станет. Однако, чтобы предотвратить такую ситуацию можно поставить на тот же файл флаг "только дозапись". Он не помешает вам читать свой файл, а другим юзерам дописывать в него что-нибудь. Правда, не даст даже вам стирать из файла все лишнее или удалить файл, пока вы не "снимите" флаг.

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

Права --x на самом деле вполне законная комбинация. Она означает, что запустить эту задачу можно (и получить от нее какой-то результат). Нельзя только скопировать этот файл себе или "залезть" в него отладчиком.

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

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

Для директорий

Для директорий обычно права доступа устанавливаются

--- никаких прав

r-x нормальные права для "посещения" директории, но без права изменения (создавать/удалять/переименовывать файлы)

rwx полный доступ (делай там что хочешь)

Имеет ли смысл устанавливать какие-либо другие сочетания?

Ну, во-первых, если отсутствует бит доступа --x (доступ к содержимому), то любая комбинация из двух остальных ничего полезного не даст.

Комбинация r-- даст возможность получить список файлов в этой директории, например командой ls, и не более того. Причем посмотреть можно будет только имена файлов, а такие подробности, как владелец/группа/permissions будут недоступны. В такую директорию нельзя "войти" командой cd. И, даже если внутри нее поддиректории имеют вполне нормальные права доступа (например, r-x), попасть в них будет невозможно.

Комбинации -w- и rw- имеют еще меньше смысла. Все равно, изменить что-нибудь в директории с такими правами доступа не удастся.

А вот сочетания --x и -wx на самом деле вполне осмысленны.

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

Аналогично и с поддиректориями. Если вы не хотите, чтобы кто-нибудь просто "бродя" по вашим директориям наткнулся на директорию с "секретным" содержанием, но, в тоже время, не против чтобы некоторые близкие друзья могли туда "захаживать" и знакомится с новыми пополнениями, "спрячьте" свои "приватные" директории в директорию (например private) с доступом --x. Тогда ваши друзья смогут попасть в нужную поддиректорию, указав полный путь (cd private/pictures), а случайные посетители ее просто не найдут (если, конечно, этот посетитель не root).

Конечно, "секретность" в этом случае будет не полной, поскольку, если посторонний каким-то образом узнает правильное название файла или поддиректории, то получит те же возможности, что и "близкие друзья".

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

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

владелец - полные права (rwx)
группе доверенных лиц - тоже самое, но без права изменения (r-x)
всем остальным - никаких прав (---)
Вообще-то, обычно права назначаются даже еще проще. Поскольку, группы составляет root и рядовые юзеры, как правило, не выбирают себе соседей по группе, то их файлы и директории имеют одинаковые "допуски" для группы и "всех остальных". Например, для "несекретных" файлов (директорий) - rwxr-xr-x, а те, которые владелец хочет оградить от посторонних rwx------.

Но в данном случае речь не об этом. Что будет, если "всем остальным" дать доступ, пусть и ограниченный, а для группы "особо приближенных" - наоборот убрать (выглядеть это будет примерно так - rwx---r-x)?

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

Трудно судить - можно ли извлечь из этого какую-то пользу. Тем более, что составить "черный список" может только root. И, кроме того, не забудьте, что количество групп, в которые может входить юзер, ограничено, поэтому не стоит без особой надобность "плодить" дополнительные списки. Но, во всяком случае, возможность поступить таким образом есть.

Флаги.
Кроме уже рассмотренных атрибутов (владелец, группа, "права доступа"), существует еще один атрибут, который ограничивает возможные действия с файлом - "набор флагов". Кстати, по умолчанию команда ls флаги не показывает (и большинство "файлменеджеров" - тоже). Для того, чтобы она их показала, надо указать ключ -lo. С помощью флагов можно запретить изменять содержимое файла, его название или и то и другое.

Флаги являются более "сильнодействующим средством" чем permissions. Они действуют одинаково для всех юзеров, не разделяя их на категории. Более того, их действие не может игнорировать и владелец файла и даже root. Единственное отличие владельца и root'а от прочих пользователей в том, что они могут убрать флаги с файла (и то не всегда) и только потом уже делать то, что им хочется.

Рассмотрим их подробнее.

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

На самом деле, "снятие" флагов - вопрос более сложный. Он зависит от того, в каком "режиме безопасности" находится система. Но об этом немного позднее.

По своему назначению флаги делятся на

append - разрешается только "дописывать" файл (естественно, файл должен также иметь permssion "w"). Без этого флага, если юзеру из соответствующей категории разрешается писать в файл, он может как добавить что-либо к содержимому файла, так и "убавить", то есть стереть часть содержимого. При установленном флаге append, любой юзер (даже root) сможет только добавить что-нибудь в конец файла, но не сможет ничего изменить в уже имеющемся содержимом.

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

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

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

Как уже говорилось, эти три флага существуют в двух вариантах - "юзерские" и "суперюзерские". То есть, на самом деле их шесть

три "юзерских" - uappend, uunlink и uimmutable
и три "суперюзерских" - sappend, sunlink и simmutable.
Вообще-то, существует еще два "непарных" флага. Это флаги

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



Несколько слов о "режиме безопасности".
Дело в том, что в FreeBSD система может находится на разных "уровнях безопасности". Существует четыре уровня

-1 - система безопасности выключена
0 - система безопасности включена, но никаких ограничений нет
1 - "режим безопасности", установлен ряд ограничений на работу с внешними устройствами и операции с флагами
2 - "повышенная безопасность", еще больше ограничений, чем на уровне 1.
Подробнее о том, в чем заключаются ограничения и как меняются "уровни безопасности", можно прочитать в man init (отмечу только, что "по умолчанию" система стартует с уровнем -1, то есть "безопасность" выключена).

Для нас в данный момент важно только, что на уровне 1 и 2, даже суперюзеру (root'у) запрещено снимать флаги sappend и simmutable.

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

А вот "взломщик", проникший в систему, даже если каким-то образом и получит root'овские права, не сможет изменить "жизненно важные файлы" (если, конечно, они защищены флагом simmutable) или "почистить логи" (если они защищены флагом sappend), чтобы "замести следы" своего пребывания в системе.

С какими правами файл "рождается"
На самом деле вопрос поставлен не совсем корректно.

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

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

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

Какие же у только что созданного файла будут владелец, группа и права доступа?

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

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

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

Группа
Группа создаваемого файла в FreeBSD определяется немного необычно. Она всегда "наследуется" от директории, в которой этот файл создается. То есть файл будет иметь ту же группу, которую имеет директория.

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

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

В других разновидностях Unix группа файлу, обычно, присваивается та, которая является "первичной" группой юзера, создающего файл (то есть, та, которая записана в его бюджете). А для того, чтобы группа, как и в FreeBSD "наследовалась" от директории, на самой директории должен стоять бит sgid.

Права доступа
Права доступа, которые будут у "свежеиспеченного" файла определяются параметром umask. Он задает - какие биты прав доступа НЕ НАДО выставлять в permissions.

Если это параметр равен нулю, то у всех создаваемых файлов права доступа будут одинаковые для всех категорий и выглядеть как rw-rw-rw. Директории (созданные, например, командой mkdir) будут иметь права доступа rwxrwxrwx. Такие же права доступа получатся и у исполняемых файлов, которые создают различные трансляторы (они, естественно, ставят биты "исполняемости" на результат своей работы).

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

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

Еще раз напоминаю, что биты в umask отмечают - какие биты прав доступа НЕ надо ставить при создании файла. То есть, если вы хотите, чтобы у категории "все остальные" вообще не было никаких прав, а "группе допущенных" не ставился бит разрешающий запись, то umask должна выглядеть как 027.

В FreeBSD по умолчанию в командных файлах, которые выполняются при входе в систему, у всех юзеров (включая root) вставлена команда, которая задает umask равной 022. То есть отменяются только биты разрешения записи для группы и "всех остальных". Если вас это не устраивает, вы можете изменить аргумент в соответствующем файле (обычно это файлы .login или .profile в домашней директории юзера) или поменять параметр umask в любой момент "вручную".

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

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

Во-первых, при копировании (например, командой cp) создается новый файл. А при перемещении (например, командой mv) меняется только место расположения файла (и, возможно, имя).

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

Строго говоря, если копирование делает root, то эти правила действуют и для него (то есть, владельцем полученной копии будет root, группа будет взята от директории, а права выставятся в соответствии с umask). Однако, root может изменить поведение команды cp. У этой команды есть ключ (-p - сохранять permissions) который означает, что надо сохранить все атрибуты (владельца, группу и permissions) при копировании.

Обычный же юзер, даже используя ключ -p не сможет сохранить владельца и группу, но получит permissions такие же, как у оригинального файла. К тому же биты suid и sgid при этом также "сбрасываются".

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

А вот при перемещении файла все атрибуты сохраняются (даже "опасные" биты suid и sgid). Однако, не забудьте, что для того, чтобы обычный юзер смог переместить чужой файл, он должен иметь право записи и в ту директорию, куда файл переносится и в ту, откуда он переносится (поскольку, там запись о файле должна быть удалена). Такие ситуации в нормальной системе, как правило, не встречаются.

Как поменять...
Владельца и группу.

Во-первых, надо отметить - кто может поменять для файла (директории) владельца и группу.

Безусловно, это может сделать root.

Поменять владельца файла не может никто, кроме root.

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

Для изменения владельца файла служит команда chown ("change owner"). С ее помощью можно заодно заменить и группу, хотя для изменения этого атрибута есть специальная команда chgrp ("change group").

Подробно об этих командах можно прочитать в соответствующих man-страницах (man chown и man chgrp). Поэтому, рассмотрим только их краткое описание.

Команда chown
Команда chown выглядит очень просто.

chown <новый владелец> <имя файла>

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

chown <новый владелец>:<новая группа> <имя файла>

Кстати, никто не мешает указать в команде "старого" владельца, тогда изменится только группа.

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

Если же вы хотите, чтобы аналогичная операция была проделана не только в текущей директории, но и во всех "нижележащих" поддиректориях, вам поможет ключ -R (recursively).

Например, команда

chown -R bob:users *

заменит владельца на bob, а группу на users для всех файлов и поддиректорий, находящихся в текущей директории и "ниже", то есть в самих поддиректориях.

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

chgrp <новая группа> <имя файла>

Естественно, все, что было сказано о команде chown относительно выполнения ее над несколькими файлами и о ключе -R, также относится и к команде chgrp.

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

Итак, для изменения прав доступа (permissions) служит команда chmod ("change mode"). В целом эта команда выглядит, как и предыдущие (которые меняют владельца игруппу).

chmod <что сделать> <имя файла>

Но, в отличии от предыдущих команд, второй аргумент ("что сделать") имеет несколько более сложный вид.

В нем можно выделить три части

"категория юзеров"
"операция"
"биты прав доступа"

u (user) владелец
g (group) группа
o (other) все остальные
a (all) все три категории
-
+
=
r
w
x
s или t

Как понятно из таблицы, первой задается категория юзеров (владелец, группа или "все остальные"). Причем, можно поставить сразу несколько букв, обозначив тем самым сразу несколько категорий. Например, go будет означать, что права меняются сразу и для группы и для "всех остальных". Если надо изменить права сразу для трех категорий, можно написать три буквы - ugo или одну букву a (все три категории).

Следом указывается "операция" (добавить права или наоборот - убрать). И, наконец, после "операции" один или несколько битов доступа, которые требуется изменить. Значение этих битов подробно рассматривалось выше, поэтому здесь не будем на них останавливаться.

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

А знак "=" означает сразу и то и другое. Дело в том, что если вы укажете, например o+x это будет означать - добавить бит x для категории "остальные", но никак не повлияет на биты r и w для этой же категории. А указав действие как o=rx, вы тем самым скажете системе - "установить биты r и x, и убрать бит w, если он там был".

Бит s имеет разный смысл (suid или sgid) в зависимости от того, в какой части permissions он находится. Поэтому, если вы хотите поставить именно suid бит, то "что сделать" должно выглядеть как u+s, а если вам нужен sgid, то - g+s. Sticky бит ставится командой chmod a+t ... .

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

Например, можно задать команду

chmod a=rx,u+w mydir
это будет означать - "для всех категорий права r-x, а для владельца еще и w (право записи)".

Кроме того, команда chmod (точнее - ее первый аргумент) имеет еще одну форму.

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

Восьмеричное представление выбрано потому, что при переводе в него двоичного числа, каждая группа из трех бит "сворачивается" в одну цифру. Таким образом, вам надо просто указать три цифры, каждая из которых описывает отдельную категорию юзеров (точнее - права для этой категории). Например, permissions rwxr-xr-x можно представить в восьмеричном виде как 755. И, следовательно, такие права могут быть выставлены командой

chmod 755 myfile
Что касается выполнения этой операций над несколькими файлами или "рекурсивного" обхода всех поддиректорий, здесь все так же, как для команд chown, chgrp. В качестве имени файла может быть задан "шаблон", а для обхода всех поддиректорий используйте ключ -R.

И, конечно, обязательно прочтите man chmod.

Флаги.
Команда, которая ставит/убирает флаги - chflags ("change flags"). Формат ее достаточно простой

chflags <флаги> <имя файла>
Аргумент <флаги> - это название флага или нескольких флагов через запятую. Названия флагов описаны в разделе о флагах. Кроме того, эта команда понимает и сокращенные названия.

sappend - sappnd
uappend - uappnd
sunlink - sunlnk
uunlink - uunlnk
simmutable - schange или schg
uimmutable - uchange или uchg
arcived - arch
nodump не сокращается

Для того, чтобы убрать флаг, надо указать его название с префиксом no - nosappnd, nosunlnk, noschg и т.п.

Исключение составляет флаг nodump. Чтобы его убрать нужно сказать не nonodump, а просто dump.

Естественно, как и предыдущие команды chflags может применяться к нескольким файлам и "рекурсивно" обходить поддиректории (ключ тот же -R).



Управление процессами
Понятие процесса
Компоненты процесса
Состояние процесса, "заблудшие" процессы
Сигналы, посылка сигналов, команда kill
Приоритет выполнения процесса, команда nice
Текущий контроль процессов, команды ps и top
Защита фоновых процессов, команда nohup

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

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

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

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

Каждому новому процессу присваивается уникальный номер PID. Фактическое значение PID большой роли не играет, оно назначается ядром просто по порядку, начиная с 0 и до 65535. Когда номера заканчиваются, ядро вновь начинает с 0, пропуская еще существующие в системе PID.

Идентификатор родительского процесса

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

Помимо собственного идентификатора PID каждый процесс имеет атрибут своего родительского процесса - PPID.

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

Каждый процесс имеет UID - идентификационный номер пользователя, создавшего данный процесс. Вносить изменения в процесс может только его создатель и привилегированный пользователь (root). У процесса также есть EUID - это так называемый "эффективный" UID.

Он используется для того, чтобы определить, к каким ресурсам у процесса есть права доступа. Как правило, EUID и UID совпадают. Различаются они для программ, у которых установлен бит смены идентификатора пользователя (так называемые suid - программы).

Аналогично, GID - идентификационный номер группы пользователя, создавшего данный процесс, EGID - "эффективный" GID. Когда процесс запускается, его GID равен GID родительского процесса. Если процесс попытается обратиться к файлу, на который у владельца нет прав доступа, ядро проверит, можно ли разрешить обращение на основании EGID.

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

Свопированный - процесс находится в swap-разделе на диске

Остановленный - процесс приостановлен

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

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

Свопированный процесс не существует в оперативной памяти. Он записан в swap-раздел на диске и ждет "своего часа".

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

Основные разновидности таких процессов - зависшие и неуправляемые процессы.

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

Ну а неуправляемый системный процесс может (внезапно впав в буйство) просто "крушить" все на своем пути.

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

Формат этой команды kill <-сигнал> pid, где <-сигнал> - номер или символьное имя посылаемого процессу сигнала. Команду kill чаще всего используют для прекращения выполнения процесса. Наиболее часто используемые сигналы:

9 (KILL) - гарантированное уничтожение процесса

15 (TERM) - программное завершение процесса

1 (HUP) - сигнал отбоя. Многие системные процессы при получении этого сигнала перечитывают свои конфигурационные файлы. Вообще рекомендуется давать сигнал HUP перед посылкой сигнала KILL.

Иногда, правда редко, процессы впадают в такие состояния, что их нельзя "убить" даже выдав команду kill -9 pid.

В этом случае самый эффективный способ "убить" процесс - команда reboot.

Приоритет выполнения процесса, команда nice
От приоритета процесса зависит, какую часть времени центрального процессора он получит. Выбирая процесс для выполнения, ядро находит процесс с самым высоким "внутренним приоритетом". Непосредственно изменить значение внутреннего приоритета невозможно, но можно повлиять на него, изменяя так называемое nice-значение.

Для этой цели используется команда nice. Формат этой команды:

nice <относительный приоритет от процесса-родителя> <команда>. Относительный приоритет в системе FreeBSD находится в пределах от -20 до +20.

Важно запомнить: Чем ниже значение nice - тем выше приоритет процесса.

Пример:

# nice -10 /usr/local/mygame
Если пользователь не предпримет особых мер, то новый процесс унаследует приоритет своего родителя. Пользователь может увеличить значение nice (т.е. понизить приоритет), но не сможет уменьшить его, даже для возврата процесса к приоритету, полученному при "рождении".

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

В системе FreeBSD существует команда renice, с помощью которой можно изменить приоритет уже запущенному процессу. Ее формат:

renice <приоритет> [-p pid] [-g <группа>] [-u <пользователь>]
Пример:

# renice +1 -p 989 -u daemon root -p 32
В примере понижается на 1 приоритет процессов с номерами PID 989 и 32, а так же у всег процессов, владельцами которых являются daemon и root.

Текущий контроль процессов, команды ps и top
Для текущего контроля состояния процессов в системе используется команда ps.

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

-a - выдает информацию о всех пользовательских процессах

-е - показывает значения переменных окружения

-h - при выводе на PAGER (more или less) выводит заголовок листинга

-m - сортирует вывод по используемой памяти

-r - сортирует вывод по использованию времени центрального процессора

-x - вывод команды не ассоциирован с терминалами (т.е. показываются также например и процессы-демоны)

Наберите команду

# ps -ax
Посмотрим на листинг (здесь показана для краткости только одна строчка помимо заголовка и только часть полей):

USER PID STAT START TIME COMMAND
bob 1167 R+ 5:57PM 0:00.04 ps -ax
USER - имя владельца процесса
PID - идентификатор процесса
STAT - текущий статус процесса
R = выполнимый, T = остановленный
I = ожидающий, S = ожидающий (> 20 сек)
Z = зомби
Дополнительные флаги:
W = процесс свопирован
+ = процесс в приоритетном режиме своего терминала
START - время запуска процесса
TIME - время центрального процессора, потребленное процессом
COMMAND - имя и аргументы команды

Для самостоятельного изучения вам дается команда top.

Вывод этой команды аналогичен выводу команды ps.

Замечу только использование команды top - довольно дорогое удовольствие, т.к. она сама "пожирает" довольно много ресурсов системы. Не стоит ею злоупотреблять.

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

# cat /var/log/messages | grep fetchmail > fetchmail.log &
Но если, к примеру, вы используете в качестве shell интерпретатор sh, и сразу же после этой команды выйдете из системы командой exit (или Ctrl+D), интерпретатор пошлет сигнал отбой (HUP) этому процессу (как впрочем, и всем, им порожденным).

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

# nohup cat /var/log/messages | grep fetchmail > fetchmail.log &
В этом случае, сигнал отбоя от sh будет проигнорирован.

Правда у команды nohup есть побочные эффекты: она увеличивает значение nice на +5
если стандартный файл вывода не переназначен, то весь вывод пойдет в файл nohup.out (в нашем случае этого не произойдет)Замечание: Если вы пользуетесь csh или другими современными интерпретаторами, то вы вполне можете обходиться без команды nohup.

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

Ответ: Используйте команду killall.



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

Пользователь (user), пользовательский бюджет (user account)
Все системы семейства Unix, соответственно и FreeBSD - системы многопользовательские.

Для нормальной и стабильной работы системы нужно:

Во-первых, разграничить права различных пользователей системы (пользователя часто называют - "юзер", от английского слова user) - какие файлы они могут читать/писать/изменять, какие программы запускать и т.п.

Во-вторых, дать возможность каждому юзеру создавать свою "среду обитания" (environment - окружение) - иметь свои настройки для любимых программ, свои директории, настройки терминала и т.п.

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

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

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

Словосочетание "user account" в контексте Unix обычно переводится "пользовательский бюджет" или "личная учетная карточка пользователя".

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

Каждому юзеру присваивается уникальный номер (user ID), именно этот цифровой номер и используется внутри операционной системы при проверке прав доступа, сборе и хранении статистики и т.д. Однако оперировать все время номерами юзеров не удобно. Поэтому, каждому юзеру кроме номера присваивается еще уникальное имя (login name).

Если в какой-нибудь системной команде требуется в качестве аргумента указать юзера, обычно используется это "login name". И, наоборот, если какая-либо программа в своем выводе как-нибудь упоминает конкретных юзеров, она обычно называете их этим именем, а не просто печатает номер юзера.

То есть, между user ID и login name должно быть всегда однозначное соответствие. Просто user ID используется во внутренних данных системы, а login name (или просто login) - при общении человек-компьютер.

Итак. В учетной карточке юзера хранится

Name
Password
user ID
group ID
General information
Home dir
Shell
кроме того есть еще поля, которые часто не используются (кстати, они располагаются между group ID и General Information)

Class
Password change time
Account expiration time
Назначение этих полей.

Name

Это уникальное имя юзера (login name). Его спрашивают при входе в компьютер. Оно используется в командах администрирования.

Password

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

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

user ID

Уникальный номер юзера. Он однозначно соответствует имени (Name) и используется внутри системы.

group ID

Номер группы, к которой принадлежит юзер. Подробнее о группах см. далее.

General information

Это просто некоторые анкетные данные того реального человека, который скрывается под Name. Это поле можно и не заполнять. Обычно там пишут просто реальное имя/фамилию юзера (например, John Doe).

Однако, полностью это поле может состоять из:

Full Name - Имя Фамилия,
Location - адрес (имеется в виду рабочее место),
Office Phone - рабочий телефон,
Home Phone - домашний телефон
Home dir
Домашний каталог юзера. Именно в этом каталоге помещаются настроечные файлы для различных программ с настройками под конкретного юзера. Здесь же юзеру дается полная свобода создавать/удалять свои файлы.
Shell

Программа, которая запускается для юзера, когда он входит в систему. Обычно это "исполнитель команд", или по другому shell (оболочка) (аналог command.com в системе DOS), который принимает команды с терминала и, в свою очередь, запускает программы, необходимые юзеру.

В современных Unix'ах обычно есть несколько таких shell (sh, csh, tcsh, bash ...) из которых можно выбрать наиболее подходящий "по вкусу".

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

Class

Это поле пока ничего не означает. По замыслу, юзер может принадлежать к некоему login-классу. При этом, когда он будет входить в систему, могут быть сделаны какие-нибудь установки (например заданы переменные среды), общие для всех юзеров этого класса. Естественно, должна быть еще некая база данных, в которой указанно - что делать для юзера из конкретного класса (или не делать). Но, сейчас (по крайней мере до версии 3.1) это поле никакими программами не используется.

Password change time

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

Account expiration time

А здесь администратор задает дату, после которой доступ юзеру в систему будет запрещен. То есть, account юзера сохраняется (и все его файлы тоже), но войти в систему он не сможет (пока не договорится с администратором :-).

Подробнее обо всем этом можно прочитать на соответствующей man-странице.

man 5 passwd.

Для чего используется бюджет пользователя?
А вот это - очень не простой вопрос.

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

Обычные юзеры
Псевдо-юзеры
Почтовые юзеры
Гостевой вход
Автоматический запуск коммуникационных программ
Обычные юзеры

Когда обычный юзер заходит в систему (с физического терминала или по сети), он должен сказать свое имя (Login Name) и пароль (Password). Соответствующая программа сверяет эти данные с теми, что записаны в бюджете пользователя и, если они совпадают, разрешает вход в систему. То есть запускается программа, которая указана как Shell в бюджете пользователя. Юзер с помощью этой программы может запускать другие. При этом ему можно создавать/удалять/писать/читать файлы, которые находятся в его Home dir (тоже указана в бюджете).

Псевдо-юзеры

Часто бывает полезно ограничить некоторым программам (которые запускаются автоматически - ftp-сервер, www-сервер и т.п.) доступ к файлам и директориям.

Например, вы создаете на своей машине WWW-сервер. Естественно, его назначение - выдавать в сеть какие-то документы (файлы *.html), специально предназначенные для публичного обозрения. В то же время, не хотелось бы, чтобы он (из-за возможных ошибок или злонамеренных "закладок" в программе) мог выдавать наружу другие файлы, находящиеся в системе.

В Unix предусмотренно, что права на чтение каждого файла можно связать с определенным пользователем. Юзер может читать файлы, для которых он является "хозяином" или "владельцем" (на самом деле разграничение прав несколько более сложное, но в данном объяснении это не важно). Все остальные файлы можно сделать для него недоступными.

Таким образом, для решения задачи нужно

зарегистрировать фиктивного пользователя - например, www;
все файлы, к которым должна иметь доступ программа WWW-сервера, объявить "собственностью" юзера www (естественно, что ваши секретные файлы должны быть недоступны этому самому www);
объяснить системе, что когда запускается программа WWW-сервера, все должно выглядеть так, как будто его запустил реальный юзер www.
Все остальное сделается автоматически средствами Unix.

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

Следовательно, в бюджете такого фиктивного юзера не нужен реальный пароль (вместо пароля ставится какая-нибудь абракадабра, так, чтобы никто не мог даже подобрать его. Лучше поставить знак "*", поскольку в настоящих шифрованных паролях такой знак никогда не встречается), никакой General information, не нужна также Home dir (хотя, иногда имеет смысл объявить его домашней директорией ту, где лежат его данные) и Shell.

Особым случаем псевдо-юзера является юзер ftp. Дело в том, что у ftp-сервера могут быть две задачи. Первая - дать возможность реальным пользователям этой машины перекачивать свои файлы из этого компьютера (или, наоборот, "закачивать") по сети. Вторая - предоставить некую "свалку" файлов всем желающим (то, что обычно называют "анонимный ftp"). В первом случае каждый реальный юзер говорит серверу свое имя и пароль и получает доступ к файлам такой же, как если бы он вошел в систему. Во втором случае, если вы не зарегистрированы в качестве юзера на этой машине, вы можете сказать, что вы - юзер anonymous или юзер ftp. В этом случае, программа ftp-сервер проверяет - зарегистрирован ли в БД учетных карточек псевдо-юзер ftp (именно ftp, а не anonymous) и, если такой юзер зарегистрирован, то пускает вас в домашнюю директорию (Home dir) этого юзера, там и должна лежать "свалка" файлов для всех желающих.

Таким образом, в учетной карточке псевдо-юзера ftp существенным являются в основном поля Name и Home dir. Остальные, обычно, значения не имеют.

Таких псевдо-юзеров в любой системе существует несколько.

Почтовые юзеры.

Если в качестве сервера электронной почты используется Unix-машина, то самым простым способом обеспечить прием почты и поддержание "почтового ящика" для конкретного человека - это зарегистрировать его как обычного юзера этой машины. (Точнее, это единственный стандартный способ.) Кроме того, для того, чтобы никто посторонний не мог получить доступ к "почтовому ящику", при соединении с "почтовым сервером" используется процедура аналогичная входу в систему обычного юзера - то есть POP-клиент должен предъявить серверу имя и секретный пароль юзера. Причем, обычно, программа POP-сервер ищет эти имя и пароль в той же базе.

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

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

А, самое главное, не должно быть реальной программы Shell. Вместо нее лучше всего подставить какую-нибудь программу, которая просто напечатает сообщение типа: "Вам сюда нельзя" и завершит работу. В качестве такой программы можно использовать /bin/date - она напечатает текущую дату и завершится.

Кстати, если поле Shell просто оставить пустым, то система все равно впустит юзера и даст ему "исполнителя команд" /bin/sh.

"Гостевой вход"

Поскольку, вместо Shell (программы, которая автоматически запускается для вошедшего юзера) можно использовать любую программу, можно сделать небольшую информационную систему для публичного просмотра. Для этого регистрируется пользователь, например, guest (гость). В качестве Shell у этого юзера должна быть программа, которая позволяет просмотреть документы, предназначенные для публики (какая-нибудь BBS, www-browser или другая, специально для этого написанная программа). Естественно, надо принять меры предосторожности, чтобы эта программа не могла прочитать другие файлы из вашего компьютера и не могла записать ничего лишнего на диск.

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

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

Если к компьютеру подключен модем, он может оказывать различные услуги через телефонные линии (BBS, прием/передачу e-mail, IP-доступ и т.п.). Если один и тот же телефонный вход используется для различных услуг, то возникает проблема - как обеспечить запуск различных коммуникационных программ для разных клиентов.

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

Например, можно зарегистрировать пользователей:

UUCPuser - для которого запускается программа uucico (из пакета uucp),
PPPuser - для которого запускается драйвер, для связи по протоколу PPP,
SLIPuser - для которого запускается драйвер, для связи по протоколу SLIP.

Теперь, если клиент, позвонивший на модем, введет в качестве Login name PPPuser (например), то для него на этом конце модемной линии включится драйвер PPP и он получит IP доступ по этому протоколу.

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

Особенностью бюджета такого юзера, как и в предыдущем случае, является нестандартный Shell. Может отсутствовать Home dir (это зависит от коммуникационной программы, некоторые из них пытаются извлечь некоторые настроечные данные из домашней директории юзера).

Где хранятся бюджеты?
В системе FreeBSD существует четыре файла, которые имеют отношение к БД учетных карточек. Все они находятся в директории /etc.

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

/etc/spwd.db - основная БД, именно отсюда соответствующие программы берут нужные им данные. Данные хранятся в двоичном виде, то есть простым редактором там ничего не сделаешь.

/etc/master.passwd - та же БД, но в текстовом виде. Этот файл можно читать и изменять обычным текстовым редактором. Но, если вы будете его менять, потом нужно будет запустить соответствующую утилиту, которая сделает изменения и в остальных трех файлах.

/etc/pwd.db - то же, что и spwd.db, но без паролей (в поле password просто стоит знак *)

/etc/passwd - то же, что и master.passwd, но без паролей.

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

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

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

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

Заметьте, что, для того, чтобы пустить в свою систему реального юзера, надо не только добавить новую учетную карточку для него. Еще надо создать ему домашнюю директорию и, желательно, положить туда некоторые стартовые файлы (типа config.sys и autoexec.bat в системе DOS). При этом надо правильно установить права нового юзера на эти файлы.

Для того, чтобы не делать эту работу вручную, существует специальная утилита (см. ниже). Но, если вам нужно зарегистрировать псевдо-юзера или "почтового юзера", она не очень подходит. В этом случае лучше воспользоваться более примитивными средствами.

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

pwd_mkdb
vipw
adduser
pw useradd
Еще что-нибудь
pwd_mkdb

Собственно, эта утилита только преобразует файл master.passwd в три остальных файла (см. "Где хранятся бюджеты").

Вы можете любым текстовым редактором добавить строчку в master.passwd, взяв за образец любую из тех строчек, которые там уже есть (желательно, перед этим внимательно прочитать man 5 passwd). Если, после этого запустить команду

pwd_mkdb -p /etc/master.passwd
то она сделает соответствующие изменения в spwd.db, pwd.db, passwd.

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

passwd <имя юзера>
Конечно, это самый сложный способ, но... Если вы когда-нибудь возьметесь написать свою программу для регистрации, то она должна будет просто сформировать правильную строчку для файла master.passwd, занести ее в этот файл, а потом просто вызвать pwd_mkdb. Кстати, остальные программы, о которых дальше идет речь, именно так и делают.

vipw

Эта программа слегка автоматизирует процесс описанный выше. Она сама запускает текстовый редактор, а, по выходу из редактора, pwd_mkdb.

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

Запись в master.passwd вам все равно придется составить самостоятельно. При этом не забудьте, что Name и userID должны быть уникальными для каждого юзера.

Важное замечание по поводу текстового редактора. Программа vipw сама редактором не является. Она запускает текстовый редактор, который задан переменной окружения EDITOR, а если таковой не найдет, то редактор vi. Причем, обычно, при установке FreeBSD в стартовых файлах для root эта переменная устанавливается, но это тот же vi.

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

adduser

Это самая "продвинутая" программа для добавления нового юзера. Она задает вопросы, касающиеся нового юзера, сама проверяет имя и user ID на уникальность (причем, для user ID она сама предложит подходящее значение), создает домашнюю директорию для юзера и копирует туда заготовки настроечных файлов, и даже может послать приветственное письмо вновь зарегистрированному юзеру. Естественно, она же делает запись в БД учетных карточек.

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

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

Поэтому, в этой ситуации, вам придется подчищать за ней все лишнее, что она сделает.

Как поменять данные в бюджете?
Во-первых, для изменения секретного пароля юзера (поле Password) надо использовать специальную команду

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

Все остальные поля можно поменять с помощью утилиты vipw или chpass. Программа vipw позволяет редактировать запись непосредственно в файле master.passwd. Естественно, вы должны представлять себе формат этой записи (об этом можно прочитать в man 5 passwd).

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

Login: NewUser
Password: .....
Uid [#]: 1000
Gid [#]: 1000
... и т.д.

Особенно, программа chpass полезна, если вы захотите изменить Password change time (дату, когда система предложит юзеру поменять пароль) или Account expiration time (дату, после которой не пускать юзера в систему). Дело в том, что в самой учетной карточке эти даты хранятся в цифровом формате, понятном только самой системе, а chpass показывает и воспринимает их в "человеческом" виде (месяц, день, год).

Заметьте, что vipw вообще не проверяет корректность данных, а chpass проверяют только отдельные поля (и то, иногда отделывается предупреждениями). Ни одна из них не проверяет на уникальность Name и user ID. Поэтому, пользуйтесь ими с осторожностью.

И, наконец, опять замечание по поводу текстового редактора. Ни одна из описанных "полноэкранных" утилит не имеет своего редактора и вызывает тот редактор, который задан переменной окружения EDITOR (если таковой не обнаружится, используется редактор vi). Не забудьте указать, в качестве значения этой переменной, ваш любимый текстовый редактор.



Пользовательские бюджеты и группы часть 2
Kак удалить пользователя?
Что может поменять пользователь в своем бюджете?
Как временно убрать пользователя (не удалить, но запретить вход)?
Что такое группа?
Где хранится информация о группах?
Как создать или удалить группу?
Как поменять принадлежность юзера к группе (группам)?
Привилегированный пользователь
Вопросы и ответы
Упражнения

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

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

Что надо удалить?

Во-первых, домашнюю директорию юзера. Кстати, если администратор не предпринимал никаких действий, чтобы дать юзеру возможность писать в другие директории, то все файлы, которые мог "наплодить" юзер должны лежать в его Home dir. Если же вы дали юзеру права создавать файлы в других директориях (в публичном ftp архиве или в директории www сервера, например), то, возможно, надо "почистить" и там.

Во-вторых, "почтовый ящик" юзера в директории /var/mail (или /var/spool/mail). Сделайте это обязательно, даже если юзер просил пока не удалять почту. Дело в том, что название этого файла совпадает с Name юзера, а права на чтение/запись определяются его user ID, и, естественно, должны соответствовать друг другу.

Не вдаваясь в подробности, могу сказать, что если вы вскоре зарегистрируете нового пользователя с тем же user ID (он же освобождается), но с другим именем, или наоборот - с таким же именем, как у старого юзера, но с другим user ID, то у этого нового юзера возникнут серьезные проблемы с получением почты.

В-третьих. Могут быть еще где-то раскиданы файлы, владельцем которых был этот юзер. Например, в директории /tmp, /usr/tmp, /var/tmp.

Найти все эти файлы можно с помощью программы find. Например, так

find / -user <юзер>

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

С помощью этой же команды можно и удалить все найденные файлы

find / -user <юзер> -delete

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

find / -user <юзер> -exec rm -i {} ;

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

в файлах /etc/group, /etc/login.access, /etc/ftpusers
в таблицах программы sendmail: /etc/aliases и т.п. (virtusertable, genericstable и др.)
если у вас отдельным юзерам разрешается запускать задачи с помощью cron, то юзер может упоминаться в /etc/crontab или в /var/cron/allow, /var/cron/deny, а, также, может быть его индивидуальная crontab в /var/cron/tabs/
если юзерам разрешается пользоваться пакетным выполнением программ, то юзер может упоминаться в /var/at/at.allow, /var/at/at.deny
если у вас ведется квотирование дискового пространства, то должна быть quote для этого юзера
если юзер пользуется IP связью через модем, то он может упоминаться в файлах, лежащих в /etc/sliphome или /etc/ppp
от имени юзера могут запускаться какие-нибудь демоны (особенно это касается псевдо-юзеров), тогда имя юзера может быть в /etc/inetd.conf или /etc/rc.local.
Итак, вы видите, что полное удаление юзера из системы в общем случае очень не простая задача.

Однако, в большинстве случаев все гораздо проще.

Самый простой способ удалить юзера

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

rmuser <имя юзера>
Во всяком случае, кроме удаления бюджета, она удаляет

его домашнюю директорию;
его почтовый ящик в /var/mail;
упоминания о юзере в /etc/group;
персональную crontab юзера;
пакетные задания юзера в /var/at/jobs.
В большинстве случаев этого вполне достаточно.

Что может поменять сам пользователь в своем бюджете?
Естественно, любой юзер может поменять свой пароль (и даже желательно, чтобы он это делал время от времени).

Делается это командой passwd, той же, которой пользуется администратор. Разница в том, что администратор может поменять пароль любому юзеру, вызвав эту команду с именем юзера в качестве аргумента. А обычный юзер может поменять только свой пароль.

Кроме того, юзер, как и администратор, может воспользоваться программой chpass. Естественно, он может редактировать только свою учетную карточку. При этом, он сможет поменять в ней только поля Shell и General information (свое реальное имя, адрес, телефон).

Как временно убрать пользователя (не удалить, но запретить вход)?
Бывают такие ситуации, когда надо запретить юзеру пользоваться вашей машиной временно. Конечно, самый простой способ - удалить его учетную карточку, но не трогать остальные файлы. Однако, этот способ имеет кучу недостатков:

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

Первый способ

Этот способ заключается в том, что в бюджет надо вписать <Account expiration time> (с помощью программы chpass), естественно, поставив там уже прошедшую дату. В этом случае, юзер как бы существует в системе - письма к нему идут, файлы сохраняются, во всех диагностиках, где может встретиться его имя, оно отображается правильно. Но, в то же время, если юзер попытается войти в систему, ему просто выдастся сообщение, что "ваш account истек".

Однако, это способ тоже не лишен недостатков. Чтобы понять - почему, надо рассмотреть подробнее, что значит "доступ в систему" юзера.

Обычный юзер может войти в систему (и пользоваться ее ресурсами) через терминал или по сети, с помощью telnet. При этом должна проработать программа login (которая проверит имя и пароль юзера и, если все правильно, запустит для него Shell). Эта же программа обычно вызывается для тех, кто заходит через модем и устанавливает IP соединение по модемной линии (PPP или SLIP). (Кстати, программе login можно запретить пропускать юзера, если прописать правильную строчку (запрещающую вход конкретному юзеру) в файле /etc/login.access. Как это правильно сделать, можно посмотреть в man login.access). Но, кроме того, юзер может (если, конечно, ваша система предоставляет такой сервис):

иметь доступ к своим файлам через FTP, тогда проверкой имени/пароля занимается ftpd (программа-сервер FTP);
читать свою почту через POP-сервер, тогда проверкой имени/пароля занимается программа popper (или другой РОР-сервер);
иметь доступ к своей домашней директории через сервер samba, тогда проверкой имени/пароля занимается программа smbd;
пользоваться удаленным запуском программ (rlogin, rsh и т.п.), тогда проверкой имени/пароля занимаются соответствующие демоны (rlogind, rshd и т.д.);
Так вот. Проблема в том, что не все перечисленные демоны (программы-серверы), ответственные за допуск юзера к ресурсам, могут обращать внимание на "Account expiration time". И, следовательно, все равно дадут юзеру возможность воспользоваться своими услугами.

Второй способ

Другой способ "отсечь" юзера заключается в том, чтобы "испортить" ему пароль. Для этого достаточно добавить к зашифрованному паролю, хранящемуся в учетной карточке, один знак. Обычно, ставят знак <*> в начале пароля, поскольку этот знак не может встретиться в нормальном зашифрованном пароле и, во-первых, пароль в этом случае невозможно подобрать, а во-вторых, такое "искажение" пароля легче потом искать, когда вы будете возвращать юзера обратно. Сделать такую манипуляцию можно программой vipw или chpass.

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

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

Кроме того, есть случаи, когда этот способ не работает. Дело в том, что удаленные сервисы могут не проверять пароль, если у юзера в домашней директории в соответствующем файле (.rhosts) записаны адреса машин "пользующихся доверием" и он осуществляет доступ именно с этих машин. В этом случае, проверяется только адрес машины (и имя юзера под которым он зарегистрирован там), а пароль не запрашивается, следовательно, описанный метод не сработает. (Кстати, предыдущий метод account expiration в этом случае должен работать.)

Так как же все таки надо поступить?

Способ с "испорченным" паролем более универсальный, но все-таки неправильный.

Самый правильный путь - подбирать всех демонов таких, которые правильно отрабатывают запрет входа (например, через <account expiration>). Кстати, те демоны, которые у Вас из "родного" дистрибутива, должны правильно обрабатывать такой запрет. Проблемы могут возникнуть только с программами от других разработчиков.

Кроме того, для юзеров, запускающих "IP по модему", обычно, другой способ входа недоступен. Поэтому можно смело пользоваться <account expiration> или запретом в /etc/login.access.

Ну и хочу напомнить, что "не стесняйтесь" читать man- страницы, там все очень хорошо описано.

man 5 passwd - описывает структуру учетной карточки (user account)

man adding_user - общие слова о добавлении юзера. Кстати, там есть рекомендации - каким должно быть Login name

man pwd_mkdb

man vipw

man adduser

man passwd - изменение пароля

man chpass - другие изменения в учетной карточке

man rmuser

man login.access

man login.conf

А, также, в каждом из них есть раздел See Also (смотри также...). Их тоже можно почитать, хотя, в основном, они все ссылаются друг на друга.

Что такое группа?
Группа - это группа (из юзеров). J. Тавтология конечно, но это самое точное определение.

В системах Unix все юзеры объединяются в группы. Причем,

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

Как и индивидуальные юзеры, каждая группа имеет свое имя (group name) и числовой номер (groupID). Естественно, они однозначно соответствуют друг другу. Так же, как и для индивидуальных юзеров, groupID используется внутри системы, а имя (group name) при вводе и выводе сообщений для пользователей (хотя, в большинстве команд, можно указывать вместо имени и groupID).

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

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

Где хранится информация о группах?
Здесь есть маленькая тонкость. На самом деле надо рассмотреть два вопроса:

Где хранится имя и номер группы?

Как определяется список "членов" группы?

Где хранится имя и номер группы?

В файле /etc/group. Это просто текстовый файл, в котором каждая строчка описывает одну группу. Отдельные поля разделяются двоеточием. Назначение полей:

имя группы (group name)
пароль группы (group passwd)
номер группы (group ID)
список (через запятую) юзеров, входящих в группу (group members).
Поле <пароль группы> в системе FreeBSD пока никакими программами не используется, и там обычно ставится звездочка <*>.

Таким образом, файл /etc/group определяет - какие группы существуют в данной системе и устанавливает соответствие между именем и номером группы.

А, что касается принадлежности юзеров определенной группе, то этот вопрос немного сложнее.

Как определяется список членов группы?

Каждый юзер должен входить, по крайней мере, в одну группу. Эта группа (точнее ее groupID) прописывается в бюджете юзера (user account), в поле groupID (см. Какие данные хранятся в бюджете пользователя?).

А, чтобы тот же юзер стал членом еще какой-нибудь группы, его можно записать (его login name) непосредственно в файл /etc/group, в поле "group members" (см. выше), соответствующей группы. Таким образом, членами какой-либо группы являются

юзеры, которые перечисленные в файле /etc/group в списке юзеров этой группы
юзеры, в учетной карточке которых, стоит groupID этой группы.
Как создать или удалить группу?
Это достаточно просто сделать "вручную". Файл /etc/group, хранящий информацию о группах имеет простой формат и его можно менять любым текстовым редактором.

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

Для удаления группы, просто удалите соответствующую строчку.

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

Программы addgroup и rmgroup.

Назначение этих программ понятно из названия.

addgroup добавляет группу в список групп. Достоинство этого способа (в отличии от добавления группы вручную) заключается только в том, что эта программа может сама подобрать для вновь создаваемой группы groupID, который пока не используется другими группами. Ну и, естественно, не сделает никаких ошибок в /etc/group. Хотя формат /etc/group настолько простой, что там трудно ошибиться.

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

rmgroup - удаляет заданную группу из /etc/group. Достоинство этого способа в том, что вам не придется искать нужную строчку в файле /etc/group. Кроме того, она не даст вам удалить те группы, которые имеют "жизненно важное значение" для системы.

Естественно, более подробно об этих программах можно почитать:

man addgroup

man rmgroup

Программа pw.

Программа pw - универсальная утилита для администрирования (создания, удаления, изменения, просмотра) и юзеров и групп. Мы не будем рассматривать ее в данном курсе, а оставим Вам для самостоятельного изучения !!!

О безопасности.

Файл /etc/group по умолчанию может читаться всеми юзерами, а изменять его может только root (администратор системы). Не надо менять эти условия.

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

Так вот, даже если есть реальная необходимость некоторым юзерам (не имеющим прав администратора) время от времени создавать новые группы или менять "список членов" какой-либо группы, не надо давать им право менять содержимое /etc/group. Это сильно ослабит безопасность системы!!! (Если такая необходимость действительно существует, лучше решать эту проблему, написав специальную программу, которая позволит отдельным юзерам изменять некоторые группы.)

Как поменять принадлежность юзера к группе (группам)?
Это зависит от того, о какой группе идет речь.

Если вы хотите поменять ему основную группу (первичную), то надо исправить соответствующее поле (group ID) в его бюджете (user account).

Кстати, если вы проделаете такую операцию с реальным юзером, не забудьте, что его домашняя директория и файлы, находящиеся в ней принадлежат группе, в которой раньше находился юзер. Так что, очень желательно поменять соответствующий атрибут у всех файлов и директорий этого юзера. Если же вы хотите добавить юзера еще в какую-нибудь группу или, наоборот, исключить его из членов группы (не первичной для этого юзера), то исправления надо делать в файле /etc/group в поле <group members> соответствующей группы.

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

addgroup

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

addgroup games doom

добавит юзера doom в группу games.

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

pw groupmod

Изучите работу этой команды самостоятельно !!!

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

Привилегированный пользователь
Системным администраторам приходится отменять действие защитных механизмов UNIX в самых разных ситуациях. Для обеспечения такой возможности система выделяет среди всех идентификаторов пользователей один особый, нулевой, который принадлежит привилегированному пользователю. По соглашению UNIX-системы определяют для этого UID пользовательский бюджет под именем <root>.

Вот примеры операций, которые может выполнить только привилегированный пользователь:

монтирование и демонтирование файловых систем;
изменение командой chroot корневого каталога процесса;
создание файлов устройств;
установка системных часов;
изменение принадлежности файлов;
увеличение лимитов использования ресурсов и назначение приоритетов процессов;
задание host-имени системы;
конфигурирование сетевых интерфейсов;
остановка системы.
Примером возможностей привилегированного пользователя может служить способность принадлежащего ему процессора изменять по своему усмотрению параметры принадлежности. Один из таких случаев - программа login; процесс, который приглашает Вас при входе в систему ввести свой пароль. Он изначально выполняется как корневой. Если веденные имя и пароль пользователя правильны, то login заменяет свои UID и GID соответствующими идентификаторами указанного пользователя и запускает интерпретатор команд shell. После того как корневой процесс, изменив свою принадлежность, станет обычным пользовательским процессором, восстановить свое предыдущее привилегированное состояние он не сможет.

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

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

su <имя пользователя>. Как и при входе в бюджет root, система запросит пароль пользователя <имя пользователя>.

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

Важное замечание: Использовать команду su могут только члены группы wheel.

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

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

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

Вопрос: Я забыл пароль администратора! Что мне делать?

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

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

Ответ: Вы не являетесь членом группы wheel. Отредактируйте файл /etc/group (для этого надо войти в систему как root), добавив в строку wheel:*:0:root через запятую свой login (wheel:*:0:root, mylogin)

Упражнения.
Добавьте юзера theUser с помощью команды adduser, установив ему в качестве shell - /bin/csh.
С помощью команды vipw установите ему в качестве shell - /usr/local/bin/bash.
Войдите в систему под именем theUser. Какое приглашение от системы Вы видите? (bash-2.02$).
Удалите юзера theUser (сначала командой rmuser, потом создайте снова и удалите с помощью vipw).
Изучите работу команды pw (man pw).



Конфигурирование и перегенерация ядра.
Зачем это нужно?
Этапы процесса перегенерации
Создание драйверов устройств
Упражнения
Вопросы и ответы

Зачем это нужно?
При инсталляции FreeBSD у вас создалось в системе ядро (файл /kernel), которое вполне работоспособно. Зачем же его переделывать?

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

В эту конфигурацию встроена поддержка ВСЕХ типов накопителей (HDD и CD) и ВСЕХ сетевых карт, которые на данный момент поддерживаются FreeBSD. Это вполне логично - вы должны иметь возможность поставить свой Unix и дополнительные программы на тот HDD, который имеется у вас и суметь войти в сеть, какой бы сетевой карточкой вы ни пользовались.

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

Таким образом, перегенерировать ядро необходимо для того, чтобы:

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

А без второго вы, скорее всего, не сможете решать свои задачи.

Этапы процесса перегенерации
В общем виде этот процесс выглядит так:

установить исходные коды ядра (как правило их устанавливают в процессе инсталляции системы);
составить свою конфигурацию ядра (конфигурационный файл);
запустить программу config, которая создаст необходимые файлы *.h и *.c в соответствии с вашей конфигурацией;
скомпилировать новое ядро с помощью программы make;
установить новое ядро (make install);
перезагрузиться.
Теперь рассмотрим эти пункты более подробно.

Установка исходных кодов ядра.

Прежде всего, посмотрите в директорию /usr/src/sys если она не пустая, то все что вам нужно уже на месте. И вы можете спокойно перейти к следующему пункту.

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

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

Перейдите в директорию /usr/src/sys/i386/conf.

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

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

Вам необходимо составить свой конфигурационный файл. Его название значения не имеет. Можете назвать его, например, myKERNEL. Обычно ему дают то же название, что и доменное имя машины, либо (удобно, если вы заготавливаете несколько ядер для выполнения разных задач) - FIRST (SECOND, THIRD и т.п.).

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

Если вы возьмете за основу GENERIC, то вам придется убрать оттуда описания всех лишних устройств и дописать необходимые вам options.

Если же вы возьмете за основу LINT, то все редактирование будет заключаться в удалении всего ненужного. Это может оказаться весьма и весьма утомительным занятием.

Возьмем за основу файл GENERIC. Скопируйте его:

cp GENERIC myKERNEL

Теперь нужно отредактировать его любым текстовым редактором.

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

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

machine (в нашем случае это "i386", т.е. процессор совместимый с Intel 386 );
cpu "I586_CPU"
"I386_CPU" - 386-е процессоры;

"I486_CPU" - 486-е процессоры, включая AMD-5x86;

"I586_CPU" - 586-e процессоры: Pentium, Pentium MMX, AMD-K5, AMD-K6;

"I686_CPU" - 686-е процессоры: Pentium Pro, Pentium II;

ident myKERNEL (идентификатор, или название ядра).
options
config
controller
device
pseudo-device
Проверить список устройств в вашей системе можно с помощью следующей команды:

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

Что же нужно, чтобы сделать все правильно?

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

После того, как вы закончили редактировать свою конфигурацию, наберите команду

/usr/sbin/config myKERNEL
Она создаст в директории /usr/src/sys директорию compile/myKERNEL (о чем и сообщит вам в конце своей работы) и поместит туда файлы, необходимые для компиляции ядра. Так же эта команда попросит вас "не забыть" выполнить команду make depend.

Выполните команды

Компиляция нового ядра

Находясь в директории /usr/src/sys/compile/myKERNEL и наберите команду

# make
она сделает все что нужно.

Учтите, что ядро системы - достаточно сложная программа, поэтому ее компиляция потребует довольно много времени. От 15-20 минут на процессоре Pentium до часа, на 386 процессоре.

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

Установка нового ядра

После того, как компиляция ядра успешно завершилась, наберите команду

# make install
она переименует старое ядро в /kernel.old и поместит в корневую директорию ваш новый /kernel. После этого нужно перегрузить компьютер.

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

Только не торопитесь. Если новое ядро опять окажется неработоспособным, вы можете попасть в неприятную ситуацию, так как после очередной инсталляции ядра командой make install получится:

kernel.old - предыдущая неработающая версия ядра

kernel - новая, но столь же бесполезная.

Но даже теперь не отчаивайтесь. У вас должен был остаться в корневой директории файл kernel.GENERIC и вы можете всегда загрузить его (конечно, если вы не удалили его ранее в целях экономии места на диске). Поэтому на подсказку Boot: надо набрать kernel. GENERIC.

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

# cd /
# chflags noschg kernel
# cp kernel kernel.new
# cp kernel.old kernel
# chflags schg kernel
# reboot

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

И напоследок, проверьте наличие файла /boot.config. Если этого файла нет - создайте его:

# echo /boot/loader " /boot.config
В каталоге /boot должны содержаться файлы:

boot0
boot1
boot2
loader

Создание драйверов устройств.
Если вы добавили в конфигурации ядра устройства (реальные или pseudo-device), возможно потребуется создать для них файлы-устройства в директории /dev. Какие-то общие рекомендации по этому поводу дать трудно, поскольку это зависит от того - какие устройства были добавлены в конфигурационный файл.

Во всяком случае, если вы знаете какого файла (в /dev) не хватает, его можно создать с помощью программки MAKEDEV, которая лежит в той же /dev. Это даже не программа, а командный файл, в начале которого есть комментарии, в которых более-менее подробно описаны возможные аргументы (имена устройств) для MAKEDEV. Если в ядро включен, например, Sound Blaster 16, но устройства snd0 нет в каталоге /dev (проверить это можно командой ls /dev), нужно создать его:

# cd /dev
# sh MAKEDEV snd0
Упражнения
Упражнения в данной главе, на мой взгляд, задавать бессмысленно, поскольку сам процесс построения нового ядра FreeBSD само по себе очень хорошее упражнение в деле освоения операционной системы.

Вопросы и ответы
Вопрос: Я не могу скомпилировать ядро. Отсутствует _hw_float.

Ответ: Вы, возможно, удалили npx0 из вашего файла конфигурации ядра, потому что у вас нет сопроцессора. Это неправильно. Даже если у вас нет математического сопроцессора, вы должны включить поддержку npx0



Интерактивные интерфейсы пользователей
Командные интерпретаторы
Базовые возможности командных интерпретаторов
Перенаправление ввода/вывода и организация конвейера
Управление ходом выполнения. Циклы
Передача аргументов. Команда shift
Упражнение

Командные интерпретаторы
Командный интерпретатор (по-другому - оболочка, shell) в операционных системах семейства UNIX предназначен для выполнения в основном следующих функций:

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

sh - Bourne shell.
csh - С-shell.
ksh - Korn-shell.
bash - Bourne Again shell.
Как правило, все shell находятся в каталоге /bin. Но это не обязательно. Вы помните, что когда мы рассматривали вопросы установки packages, то установили интерпретатор bash в каталог /usr/local/bin. Все установленные в системе оболочки перечислены в файле /etc/shells.

Наберите команду cat /etc/shells, и вы увидите примерно следующее:

/bin/sh
/bin/csh
/usr/local/bin/bash
Если строка в файле, в котором записаны команды интерпретатора, начинается на # , то эта строка - комментарий. Это не относится к самой первой строке файла. Она должна содержать запись, типа #!/bin/sh. Это указывает, что для выполнения команд будет вызван интерпретатор /bin/sh. Далее рассмотрим возможности и языки командных интерпретаторов.

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

Переменные и подстановка значений

Все переменные в языке shell - текстовые. Их имена должны начинаться с буквы и могут состоять из латинских букв, цифр и знака подчеркивания (_). Bash поддерживает как простые переменные, так и массивы. Для установки переменной используется оператор =:

Для простых переменных

<имя>=<значение>
Для массивов

<имя>[индекс]=<значение>, либо
<имя>=(<значение1> <значение2> : <значениеN>), либо
<имя>=([индекс1]=<значение1> [индекс2]=<значение2> : [индексN]=<значениеN>)

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

Например:

# hour=14
# echo $hour
14
# hourth=24
# echo $hourth
24
# echo ${hour}th
14th

Двойные кавычки ( " ), одиночные кавычки ( ' ), обратные кавычки ( ` ) Кавычки могут использоваться для создания строк. Например:

"Hello, world!"
'Good bye'
Кроме того, кавычки могут отменять действие следующих специальных символов:

` ~ ! # $ % ^ & * ( ) - + = | ; ' " , . < > ?
Значения этих специальных символов в строках, заключенных в одиночные кавычки '<строка>' отменяются. В строках, заключенных в двойные кавычки "<строка>" также отменяются значения специальных символов, за исключением ! $ ` {. Обратная наклонная черта также отменяет действие специальных символов.

Не путайте одиночные и обратные кавычки. Пример:

# dat=`date` (здесь стоят обратные кавычки)
# echo $dat
Mon Jun 05 14:17:20 2000

# dat='date' (здесь стоят одиночные кавычки)
# echo $dat
date
Конвейеры и списки

Несколько команд могут быть объединены с помощью символов канала |. В этом случае они образуют конвейер.

<команда1> | <команда2> | <команда3> :
Символ канала | соединяет стандартный вывод команды <команда1> со стандартным вводом команды <команда2> и т.д.

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

Примеры:

# ps -ax | more
# ls -l | grep "profile"

Кроме конвейеров, команды могут объединяться в списки. Даже сами конвейеры могут быть объединены в списки. Это делается с помощью команд ; && ||.

Команда ; просто последовательно выполняет оду команду или конвейер за другой (другим):

# make depend ; make ; make install
# cat /etc/passwd | grep root ; echo "User root"

Для того, чтобы управлять выполнением следующей команды в списке в зависимости от состояния выхода предыдущей, используются команды && (логическое И) и || (логическое ИЛИ).

Примеры:

# mkdir mydir && cd mydir
В этом случае команда cd mydir будет выполнена только в том случае, если успешно (состояние выхода равно 0) завершится команда mkdir mydir.

# cat /home/bob/.profile || echo "Нет файла .profile"
В этом случае либо на экран будет выведено содержимое файла /home/bob/.profile, либо сообщение о том, что такого файла нет.

Перенаправление ввода-вывода
Команды и списки могут содержать операторы < и > - перенаправления стандартного ввода и стандартного вывода соответственно.

Например:

# ps -ax > /etc/proc
выводит текущее состояние процессов не на экран, а в файл /etc/proc. Если к этому моменту такого файла не было, то он будет создан. Если он существовал, то его старое содержимое будет уничтожено новой информацией.

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

# ps -ax >> /etc/proc
Кроме того, существует стандартный вывод ошибок. Он имеет дескриптор 2. Т.е. если мы не хотим получать сообщения об ошибках на стандартный вывод, то можно использовать перенаправление таким образом:

# cat /etc/proc 2>err.log (ошибки, если возникнут, будут выведены в файл err.log) либо

# cat /etc/proc 2>/dev/null (ошибки будут выведены <никуда>, их посмотреть будет невозможно).

Ввод перенаправляется аналогичным образом. Например, команда

# mail bob@com.com < /home/mail.txt

отправит содержимое файла /home/mail.txt по адресу bob@com.com.

Оператор << означает, что ввод для данной команды находится <ЗДЕСЬ>. Пример:

# mail bob@com.com << end
Hello, Bob!
end
По этой команде в тело письма войдет все, что встретится до указанного нами ограничителя ввода end.

Управление ходом выполнения. Циклы
Управлять ходом выполнения сценария на языке bash можно, используя кострукцию операторов if-fi. Оператор if имеет вид:

if <условие 1>; then
<список операторов 1>
elif <условие 2>; then
<список операторов 2>
else
<список операторов 3>
fi

Работает эта конструкция так:

Если выполнено <условие 1>, то выполняется <список операторов 1>.

Если невыполнено <условие 1>, но выполнено <условие 2>, то выполняется <список операторов 2>.

Если невыполнено <условие 1> и невыполнено <условие 2>, то выполняется <список операторов 3>.

В конструкции if-fi операторы elif и else являются необязательными.

В качестве условия проверки может быть использована любая команда (или список команд). Тогда условие будет считаться выполненным, если команда (список команд) завершилась с кодом 0 (т.е. выполнилась нормально). Но на практике чаще используют команду test для проверки какого-либо выражения. Команда test записывается так:

test <выражение> или же [<выражение>]. Ниже приводится список опций, используемых при выполнении команды test.

-d file Истинно, если файл file существует и является директорией.
-e file Истинно, если файл file существует.
-f file Истинно, если файл file существует и является обычным файлом.
-k file Истинно, если файл file существует и для него установлен sticky-бит.
-L file Истинно, если файл file существует и является символической ссылкой.
-r file Истинно, если файл file существует и его можно читать.
-s file Истинно, если файл file существует и имеет ненулевой размер.
-t file Истинно, если файл file открыт на терминале.
-w file Истинно, если файл file существует и в него можно записывать.
-x file Истинно, если файл file существует и является выполняемым.
-O file Истинно, если файл file существует и принадлежит текущему пользователю.
file1 -nt file2 Истинно, если файл file1 создан (изменен) позднее, чем файл file2.
file1 -ot file2 Истинно, если файл file1 создан (изменен) раньше, чем файл file2.
-z <строка> Истинно, если длина строки <строка> равна нулю.
-n string Истинно, если длина строки <строка> не равна нулю.
string1 = string2 Истинно, если строки равны.
string1 != string2 Истинно, если строки не равны.
! <выражение> Истинно, если выражение ложно.
<выражение1> -a <выражение2> Истинно, если оба выражения истинны.
<выражение1> -o <выражение2> Истинно, если хотя бы одно из выражений истинно.
<число1> -eq <число2> Истинно, если число <число1> равно числу <число2>.
<число1> -ne <число2> Истинно, если число <число1> не равно числу <число2>.
<число1> -lt <число2> Истинно, если число <число1> меньше числа <число2>.
<число1> -le <число2> Истинно, если число <число1> меньше или равно числа <число2>.
<число1> -gt <число2> Истинно, если число <число1> больше числа <число2>.
<число1> -ge <число2> Истинно, если число <число1> больше или равно числа <число2>. Числами <число1> и <число2> могут быть положительные и отрицательные целые числа.
Пример:

if [ -x /usr/games/pool ] ; then
/usr/games/pool
else
echo "не могу запустить файл"
fi
Этот же пример можно записать по-другому:

[ -x /usr/games/pool ] && /usr/games/pool || echo "не могу запустить файл"

Циклы реализуются с помощью конструкций for, while.

Цикл for записывается так:

for <переменная> in <список>
do
<команды>
done

Пример 1:

for i in 1 2 3
do
echo $i
done

Пример 2:

for file in /etc/p*
do
echo $file
done

Этот цикл эквивалентен команде ls /etc/p*.

Цикл while имеет вид:

while <условие>
do
<команды>
done

Команды в теле цикла выполняются до тех пор, пока остается истинным <условие>.

Пример:

i=1
while [ $i -lt 5 ]
do
echo $i
i = $(($i+1))
# можно было бы написать i=`expr $i + 1`
done

Другим вариантом цикла while является until.

until <условие>
do
<команды>
done

В этом случае команды в теле цикла выполняются до тех пор, пока <условие> остается ЛОЖНЫМ.

i=1
until ! [ $i -lt 5 ]
do
echo $i
i=`expr $i + 1`
done

Заметим, что по команде break можно выйти из тела цикла. Это справедливо и для цикла for и для while (until). Пример:

i=1
while [ $i -gt 0 ]
do
echo $i
i=`expr $i + 1`
if [ $i -eq 10 ] ; then
break
fi
done

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

# /usr/games/pool file1.txt user1M
Для того, чтобы можно было работать с переданными аргументами, существует девять переменных - $1, $2, : , $9. Они позиционно соответствуют переданным аргументам. Т.е. в нашем примере $1 содержит строку "file.txt", а $2 содержит строку "user1". Кроме того, в переменной $# содержится количество переданных аргументов. В нашем случае - 2.

Но что делать, если нужно передать, скажет, 15 аргументов ? Как получить доступ к аргументу с номером больше 9 ?

Для этой цели существует команда shift, которая просто осуществляет сдвиг аргументов на одну позицию <влево>. Т.е. $1 получает значение $2, $2 - $3 и т.д. При этом значение, которое было в $1 до сдвига - теряется. При этом сдвиге так же уменьшается на 1 значение $#.

Рассмотрим это на примере. Создайте такой файл

#!/usr/local/bin/bash
i=1
while [ $# -eq 0 ]
do
echo "Аргумент $i - $1"
shift
i=`expr $i + 1`
done

Назовите его, например, my_shift.

Запустите его так:

# my_shift p1 p2 p3 p4
На экране вы увидете:

Аргумент 1 - p1
Аргумент 2 - p2
Аргумент 3 - p3
Аргумент 4 - p

Упражнения
Создайте в своей домашней директории несколько файлов с произвольным текстом.
Напишите скрипт, который бы принимал в качестве параметров имена этих файлов и добавлял их содержимое в файл, который передан первым в командной строке.
Запустите скрипт. Затем откройте файл-приемник, и проверьте, все ли правильно работает?
Ответ (пример скрипта):

#!/usr/local/bin/bash
if [ $# -gt 1 ] ; then
file=$1
i=$#
shift
while [ $# -eq 0 ]
do
cat $1 >> $file
shift
done
echo "Всего к файлу $file добавлено `expr $i - 1` файлов"
else
echo "Недостаточно аргументов"
fi




Система X Window
Введение
Система X Window представляет собой графическую оболочку для операционных систем семейства Unix.

Топологически X Window состоит из двух частей: это Х-сервер и Х-клиент.

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

Функции Х-клиента - это обработка сообщений, полученных от Х-сервера, работа с различными ресурсами системы (запуск и останов процессов, работа с файловой системой и т.п.).

Другими словами - Х-сервер не знает, что делает Х-клиент в системе, а Х-клиент не подозревает, что делает Х-сервер с переданной ему информацией.

Ну совсем, как в известном фильме - "Ничего не вижу, ничего не слышу".

Здесь важно заметить, что т.к. Х-сервер работает с видеокартой, то соответственно он должен быть правильно подобран при инсталляции X Window.

Инсталляция X Window
Самый простой способ инсталлировать X Window - это выбрать нужный пункт меню при инсталляции FreeBSD (раздел Distributions). Но если вы этого не сделали, или же у вас просто не было X Window на инсталляционном диске, то скачайте, например с хоста ftp.freebsd.org содержимое каталога /pub/FreeBSD/releases/i386/3.4-RELEASE/XF86335.

Сохраните все файлы в одной директории, например /usr/XFree86.

Создайте директорию /usr/X11R6, в которую мы будем инсталлировать X Window.

# mkdir /usr/X11R6
Далее, находясь в директории /usr/X11R6 запустим пред-инсталляционный скрипт.

# cd /usr/X11R6
# sh /usr/XFree86/preinst.sh

После завершения скрипта нужно запустить программу распаковки extract (предварительно сделав ее выполняемой).

# chmod 755 /usr/XFree86/extract
# cd /usr/X11R6
# /usr/XFree86/extract /usr/XFree86/X*.tgz
# /usr/XFree86/extract /usr/XFree86/Servers/X*.tgz

Наконец, запустим пост-инсталляционный скрипт.

# sh /usr/XFree86/postinst.sh
После того, как скрипт произведет необходимые обновления системы, инсталляция X Window будет завершена.

После инсталляции запустите XF86Setup и сконфигурируйте X Window под ваш видеоадаптер.

В заключении, замечу, что сама по себе X Window предоставляет не очень много удобств и сервисов. Поэтому инсталлируйте из коллекции ports какой-нибудь менеджер окон (Window Manager). Наиболее удобные, на мой взгляд, fvwm и kde.

К тому же, если вы установите kde, то из той же коллекции ports вы сможете установить и много полезного ПО для работы в X Window



Регистрация в системе и учет системных ресурсов
Регистрация системных соsобщений, система syslog
Конфигурационный файл демона syslogd
Учет продолжительности соединений

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

демон syslogd и его конфигурационный файл /etc/syslog.conf
библиотечные программы openlog, syslog, closelog, которые используются программистами для обмена данными с syslogd (в данном курсе они не рассматриваются)
программа пользовательского уровня logger для записи сообщений
Демон syslogd запускается во время начальной загрузки и работает непрерывно. Если вы изменили конфигурационный файл /etc/syslog.conf, нужно перезапустить syslogd, послав ему сигнал HUP (или 1). Сделать это можно, узнав по команде ps -ax pid процесса syslogd, введя затем команду kill.

# ps -ax | grep syslogd
# kill -1 <pid>

Можно поступить проще. В файле /var/run/syslog.pid записан pid процесса syslogd. Поэтому можно дать команду:

# kill -1 `cat /var/run/syslog.pid`
(здесь используются обратные кавычки).
Демон syslogd по этой команде закроет все файлы регистрации, перечитает файл /etc/syslog.conf и запустит регистрацию снова.

Конфигурационный файл демона syslogd
Действиями демона syslogd управляет файл конфигурации /etc/syslog.conf. Это простой текстовый файл, в котором пустые строки и строки со знаком # в первой позиции игнорируются. Формат файла следующий:

<селектор> <действие>.
Например,

mail.err /var/log/mail.errors
Эта строка обеспечит запись всех ошибок, связанных с доставкой почты в файл /var/log/mail.errors.

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

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

К тому же в поле <селектор> может содержаться один или несколько селекторов, разделенных точкой с запятой. Селектор может содержать группу средств, разделенных запятыми. Селектор может содержать символы * и none, которые означают соответственно "все" и "ничего".

Примеры селекторов:

средство.уровень действие

средство1,средство2.уровень действие

средство1.уровень1;средство2.уровень2 действие

*.уровень действие

*.уровень;средство.none действие

Ниже в таблицах перечислены основные имена средств и уровней серьезности системы syslog.

Средство Программы, использующие его

kern Ядро системы

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

mail Система электронной почты

daemon Системные демоны

auth Системы защиты и полномочий

lpr Система печати

news Система телеконференций

cron Демон cron

local0-7 Восемь уровней локального сообщения

syslog Внутренние сообщения системы syslog

ftp Демон ftpd

* Все вышеперечисленные средства

Уровень Значение уровня

emerg Экстренные ситуации

alert Срочные ситуации

crit Критические состояния

err Состояния ошибок

warning Предупреждения

notice Необычные состояния

info Информационные сообщения

debug Отладочная информация

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

Действие Описание

имя_файла Записать сообщение в файл на локальной машине

@имя_машины Переслать сообщение демону syslogd на указанную машину

@IP_адрес То же, только указан IP-адрем машины

пользователь1, Вывести сообщение на экраны указанных пользователей ...

пользовательN

* Вывести сообщение на экраны всех пользователей

Пример:

*.emerg /dev/console

*.err;auth.notice /dev/console

*.err;auth,mail,user.info /var/log/messages

mail.err /var/log/mail.log

mail.info @192.168.0.1

Говоря о системе syslog, нужно упомянуть о команде logger, которая позволяет вносить записи в системный журнал из shell-сценариев.

Эту команду удобно использовать для проверки изменений, внесенных в файл /etc/syslog.conf.

Например, если вы добавили в файл /etc/syslog.conf строку

local5.warning /var/log/local.log

и хотите проверить, работает ли она, то введите команду

# logger -p local5.warning "Local test"

Посмотрите файл /var/log/local.log. Если строчки "Local test" в нем нет, значит вы скорее всего забыли послать демону syslogd сигнал HUP.

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

Эта команда обобщает информацию, которая записывается в файл /var/log/wtmp всякий раз, когда пользователь регистрируется в системе. В файл /var/log/wtmp записывается информация об имени пользователя, номере порта (терминала), времени входа в систему и выхода из нее.

Команда ac дает разбивку по пользователям (опция -p) и/или по датам (опция -d), показывает время, проведенное в системе, в часах.

# ac -p
login connect-hrs
bob 23.78
mark 14.24
andre 0.65
root 7.89
...
total 675.47
Можно после опции -p задать имена пользователей.

# ac -p bob root
login connect-hrs
bob 23.78
root 7.89
total 31.67

Результат выполнения команды ac -d

# ac -d
date connect-hrs
May 1 total 63.81
May 2 total 78.36
May 3 total 523.14
May 4 total 759.78
May 5 total 635.24

Видно, что 1 и 2 Мая - выходные J.

Опции можно объединить.

# ac -dp bob
date connect-hrs
May 2 total 2.67
May 4 total 6.72
May 5 total 4.29

С помощью команды last можно определить время входа пользователя в систему и выхода из нее. Информация выводится либо по конкретному пользователю, или же по порту (терминалу). Формат команды:

last bob (информация по пользователю bob)

last ttyv1 (информация по терминалу ttyv1).

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



Краткое описание некоторых полезных команд
adduser - добавить пользователя в систему
addgroup - добавить группу в систему
cat - вывод файлов в стандартный вывод
chgrp - смена группы, владеющей файлами
chmod - изменяет права доступа к файлу
chown - изменение принадлежности файла пользователю и группе
cp - копирование файлов
cron - демон для запуска команд по расписанию
dd - преобразование файла во время его копирования
df - свободное суммарное пространство на диске
echo - выводит строки текста
expr - вычислить значение выражения
group - файл группы пользователя
rmgroup - Удалить группу
kill - завершить процесс
killall - завершить процессы по имени
ln - создает связи между файлами
login - начинает сессию в системе
ls - выдает содержимое каталогов
mkdir - создать директории
mv - переместить/переименовать файлы
named - сервер доменных имен Internet
named.reload - заставляет сервер доменных имен синхронизировать свою базу данных
named.restart - остановить и перезапустить сервер имен
nice - запустить программу с измененным приоритетом
passwd - изменяет пароль пользователя
rm - удаляет файлы
su - сменить ID пользователя или стать суперпользователем root
sudo - выполняет команду как суперпользователь root
test - проверяет типы файла и сравнивает значения
uname - вывести информацию о системе
vipw - редактировать файл паролей
w - показывает пользователей в системе, и что они делают
who - показывает пользователей, вошедших в систему


Некоторые важные файлы:
/etc/crontab - таблицы для управления демоном cron
/etc/motd - файл, содержащий "сообщение дня"
/etc/passwd - файл паролей
/etc/services - список Internet сетевых служб
/etc/shells - файл, содержащий список доступных shells

Обновлено: 12.03.2015