Информационный поиск. Процессы, права доступа. FHS.

Информационный поиск: man и info

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

Рассмотрим, как организована локальная система чтения документации.

man

Классическая UNIX-идеология, когда всё писалось сильно связанным сообществом, подразумевала, что любой программный продукт сопровождается документацией, страницей руководства (Usage Manual). Отсюда и получила название соответствующая подсистема --- man pages. Структура всех страниц и каждой страницы в отдельности чётко сформулирована. К сожалению, есть разработчики, которые не создают страниц руководства, соответствующих этой структуре. Разработчики дистрибутива Debian используют стандарт, согласно которому, пакет не может существовать в хранилище без правильно оформленной страницы руководства, чем сильно упростили многим жизнь.

Итак, имеем две аксиомы:

  • Каждый программный продукт (утилиты, системные вызовы) должен быть документирован;
  • Структура страницы руководства жёстко регламентирована.

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

Man --- программа просмотра страниц руководства, по ней тоже существует руководство. Чтобы просмотреть его, выполним  man man. Рассмотрим структуру руководства. Оно подразделяется на секции:

  • NAME. Она содержит название и краткое описание программного продукта;
  • SYNOPSIS содержит описание объекта. Здесь в квадратных скобках указываются необязательные параметры, фигурные скобки означают выбор одного из элементов, разделённых вертикально чертой, имена объектов подчеркиваются;
  • DESCRIPTION. Достаточно полное описание того, что делает объект;
  • RETURN. Возвращаемые утилитой значения;
  • Если этот программнный продукт является утилитой, и в нем есть ключи, то существует раздел OPTIONS, их описывающий;
  • FILES. Ссылки на используемые конфигурационные файлы данной утилиты;
  • Если описываемый объект использует переменные окружения, то должна существовать секция ENVIROMENT;
  • SEE ALSO --- одна из самых важных секций, с ее помощью организуется семантическая сеть. Здесь описаны другие страницы руководства, которые автор рекомендует посмотреть, так как они связаны с описываемым объектом;
  • Секция BUGS описывает известные неполадки в работе программного продукта;
  • Секция TIPS, EXAMPLES содержит в себе примеры.

Наличие тех или иных секций --- исключительно дело автора, единственной обязательной является NAME, но указанные очень рекомендуются.

Рассмотрим программы apropos и whatis, осуществляющие поиск по секции NAME страниц руководства. Из всех страниц помощи создаётся сводная таблица (mandb), в который содержатся строчки из NAME. И apropos, и whatis занимаются поиском слова по таблице. Результатом whatis является те строки, в которых есть ключевое слово в левой части. Apropos ищет в любой части. Среди прочих программ, полезных при информационным поиске, стоит выделить groff, отвечающую за форматирование страниц для вывода на терминал.

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

  • 1 --- утилиты;
  • 2 --- системные вызовы;
  • 3 --- библиотечные вызовы;
  • 4 --- устройства;
  • 5 --- структура разл. файлов (конфигурационные);
  • 6 --- игры;
  • 7 --- всё остальное;
  • 8 --- административные команды;
  • 9 --- внутренние ядерные вызовы;
  • n --- new --- документация, еще не направленная в соответствующий раздел.

Страницы руководства находятся в /usr/share/man в каталогах man[1-8n], и в каждом каталоге лежат файлы в специальном формате, сжатые с помощью gzip. Если существует документация на языке, отличном от стандартного, то она лежит в подкаталоге с названием языка.

Такова структура manpages. Внутри страниц руководств может быть ссылка вида (See something(*)). Таким образом, получается довольно сложная иерархическая система, условно говоря, гипертекст, в котором несколько видов ссылок:

  • Ссылки внутри текста;
  • Ссылки родовые (ссылки внутри раздела);
  • Ссылки в SEE ALSO.

К сожалению, программа less (программа для поэкранного вывода длинного текста, использующаяся по-умолчанию в большинстве систем для просмотра man) не умеет интерпретировать ссылки. Эта проблема решается различными способами, например, в KDE есть просмотрщик страниц руководств, в котором переход по ссылкам реализован подобно Web-браузеру (man:<название> в адресной строке Konqueror). Или можно воспользоваться командой ! в программе less, при помощи которой можно выполнить произвольную команду шелла, и выполнить там, соответственно, переход на нужную страницу руководства.

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

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

  • Далеко не все разработчики создают отвечающие стандартам страницы руководств.

info

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

В Debian Policy сказано, что у каждой утилиты должна быть страница руководства, в случае, если страница руководства маленькая, в секции SEE ALSO есть ссылка на страницу в info или место, где находится документация в другом формате.

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

Другие источники документации

Всё-таки, info и man --- техническая документация.

Кроме того, бывает так, что автор поленился сделать документацию в формате man/info, то может быть несколько случаев:

  • Вызвать программу с ключом -h или --help
  • Посмотреть, нет ли документации к программному продукту в непонятном формате. Такая информация лежит в каталоге /usr/share/doc/имя_пакета-номер-версии

Эта документация частично составляется мэйнтейнером.

Информационный поиск: другие ресурсы

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

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

  • Есть официальный сайт самого проекта ПСПО (linux.armd.ru). Тут решаются в основном вопросы социального порядка, так как ПСПО - это дистрибутив, который создаётся и поддерживается по заказу государства. Если вы - пользователь дистрибутива, не включающего в себя платную поддержку, то вы получаете лишь узкий пакет для решения простых проблем.

    ../linux_armd_ru.png

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

    ../altlinux_ru.png

  • Еще один ресурс - это сайт сообщества. Подобные сайты есть у почти всех дистрибутивов, у которых существуют сообщества пользователей (а в случае Linux, дистрибутив редко существует без сообщества). Для ALTLinux это freesource.info. Этот сайт создан пользователями и существует для пользователей. Уровень квалификации активно участвующих там пользователей, как правило, весьма высок. Достоинства такого рода информационных ресурсов в том, что они содержат множество различной информации, специфичной для дистрибутива. Недостатков два:
    • данные сайты поддерживаются исключительно на добровольных началах
    • информация зачастую бывает слабо структурирована, а порой и не актуальна

    ../freesource_info.png

  • Также существуют различные персональные ресурсы, например, heap.altlinux.ru
  • Для поиска по вопросам, связанным с особенностями дистрибутива ALTLinux можно воспользоваться ресурсом search.altlinux.ru.

    ../search_altlinux_org.png

  • Если на специализированных ресурсах ничего найти не удалось, то стоит использовать сетевой поисковик, например, Google. Если где-то в сети есть информация относительно какой-либо проблемы, то Google её закэширует. Типичный способ использования Google: поиск по тексту сообщения об ошибке (стоит не забыть заключить текст в кавычки). Если хотите то же самое, но на русском языке, то используйте Yandex или Rambler. Там будет достаточно много, чтобы сделать представление о том:
    • то ли вы ищете;
    • решена ли проблема хоть кем-нибудь;
    • как именно она решается в разных случаях.

    ../google.png

  • Последний ресурс, который стоит опробовать --- ресурс интерактивный, т.е. обратиться непосредственно к людям, а не к тексту. Традиционно в Linux-сообществе наиболее адекватным ресурсом считается список рассылки. Вкратце список рассылки --- это почтовый адрес, при отправлении письма на который оно также отправляется и всем другим подписчикам. Помимо списков рассылки, на которые, как правило, необходимо подписываться, существуют другие средства: форумы (но это не самый лучший способ, так как понятие дисциплины, такой как в списках рассылки, там весьма условно, кроме того, искать там весьма неудобно), IRC (реже --- jabber-конференции).

Процессы, права доступа

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

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

Рассмотрим подробнее систему прав доступа в Linux.

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

Существуют три вида доступа:

  • Чтение. Для файла --- чтение содержимого, для каталога --- возможность прочитать список файлов в каталоге;
  • Запись. Для файла --- изменение содержимого, для каталога --- изменение списка файлов в каталоге, то есть, возможность создавать файлы в каталоге и удалять их оттуда;
  • Использование. Для файлов доступ на использование означает возможность исполнения файла, для каталога --- возможность получить доступ к файлу в каталоге.

Увидеть назначенные права можно при помощи команды ls -l <имя файла>. При использовании этой команды кроме имени и прав доступа будут показаны: количество имен файла, владелец, группа, размер,и время последнего изменения. Первый символ в строке прав обозначает тип файла: - для обычных файлов, d для каталогов. Для специальных файлов могут использоваться другие символы.

Пример:

[user@demo $] ls -l /bin/ | head
итого 5204
-rwxr-xr-x 1 root root    2852 Ноя 23  2007 arch
lrwxrwxrwx 1 root root       4 Июл 15 21:23 awk -> gawk
-rwxr-xr-x 1 root root   13004 Май 22  2007 basename
-rwxr-xr-x 1 root root  470980 Окт  5  2007 bash
lrwxrwxrwx 1 root root       4 Июл 15 21:23 bash2 -> bash
lrwxrwxrwx 1 root root       5 Июл 15 21:22 bunzip2 -> bzip2
lrwxrwxrwx 1 root root       5 Июл 15 21:22 bzcat -> bzip2
-rwxr-xr-x 1 root root   30360 Май 18  2007 bzip2
-rwxr-xr-x 1 root root   22008 Май 18  2007 bzip2recover

Как и следовало ожидать, к файлам в каталоге /bin есть доступ на использование, то есть, исполнение.

Попробуем создать файл и запустить его:

[user@demo $] cat > MyExecutable
#!/bin/sh
echo "Hello!"
[user@demo $] ./MyExecutable
bash: ./MyExecutable: Отказано в доступе

При попытке исполнить только что созданный файл получаем ошибку --- отказано в доступе. При помощи ls -l проверим права доступа к файлу:

[user@demo $] ls -l MyExecutable
-rw-r--r-- 1 user user 24 Июл 18 16:29 MyExecutable

Как видно, права на исполнение файла ни у кого нет. Чтобы сделать возможным использование (исполнение) файла выполним команду chmod +x MyExecutable

chmod +x MyExecutable
[user@demo $] ls -l MyExecutable
-rwxr-xr-x 1 user user 24 Июл 18 16:29 MyExecutable
[user@demo $] ./MyExecutable
Hello!

Если выполнить chmod -r MyExecutable, то чтение файла станет невозможным. Доступ на запись при этом сохранится.

[user@demo $] chmod -r MyExecutable
[user@demo $] cat MyExecutable
cat: MyExecutable: Отказано в доступе
[user@demo $] ls -l MyExecutable
--wx--x--x 1 user user 24 Июл 18 16:29 MyExecutable
[user@demo $] ./MyExecutable
/bin/sh: ./MyExecutable: Отказано в доступе
[user@demo $] cat >> MyExecutable
echo "Hello?"
[user@demo $] chmod +r MyExecutable
[user@demo $] ./MyExecutable
Hello!
Hello?

Выше рассмотрен пример программы, не состоящей из машинных кодов и не исполняемой непосредственно процессором. Такие программы (называемые скриптами, от английского script --- сценарий) выполняет интерпретатор, указанный в первой строке файла после комбинации символов #! (shabang). В вышеописанном случае был указан shell. По умолчанию (в случае, когда интерпретатор не указан) используется /bin/sh.

Процессы

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

[user@demo $] ps
  PID TTY          TIME CMD
 4753 pts/2    00:00:00 bash
 6155 pts/2    00:00:00 ps
[user@demo $] ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 10:28 ?        00:00:00 init [5]
root         2     1  0 10:28 ?        00:00:00 [migration/0]
root         3     1  0 10:28 ?        00:00:00 [ksoftirqd/0]
root         4     1  0 10:28 ?        00:00:00 [watchdog/0]
root         5     1  0 10:28 ?        00:00:00 [events/0]
root         6     1  0 10:28 ?        00:00:00 [khelper]
root         7     1  0 10:28 ?        00:00:00 [kthread]
root        10     7  0 10:28 ?        00:00:00 [kblockd/0]
root        11     7  0 10:28 ?        00:00:00 [kacpid]
root        92     7  0 10:28 ?        00:00:00 [cqueue/0]
root        93     7  0 10:28 ?        00:00:00 [kseriod]
root       132     7  0 10:28 ?        00:00:00 [pdflush]
root       133     7  0 10:28 ?        00:00:00 [pdflush]
root       134     7  0 10:28 ?        00:00:00 [kswapd0]
root       135     7  0 10:28 ?        00:00:00 [aio/0]
root       635     7  0 10:28 ?        00:00:00 [kjournald]
root       733     1  0 10:28 ?        00:00:00 /sbin/udevd --daemon
root       953     7  0 10:28 ?        00:00:00 [khubd]
root      1039     7  0 10:28 ?        00:00:00 [kgameportd]
root      1052     7  0 10:28 ?        00:00:00 [kpsmoused]
root      2448     1  0 10:29 ?        00:00:00 /sbin/auditd
root      2450  2448  0 10:29 ?        00:00:00 /sbin/audispd
root      2451     7  0 10:29 ?        00:00:00 [kauditd]
rpc       2481     1  0 10:29 ?        00:00:00 /sbin/portmap -l
syslogd   2607     1  0 10:29 ?        00:00:00 /sbin/syslogd -u syslogd -j /v
klogd     2636     1  0 10:29 ?        00:00:00 /sbin/klogd -c 1 -x -u klogd -
100       2938     1  0 10:29 ?        00:00:00 /usr/bin/dbus-daemon --system
root      2990     1  0 10:29 ?        00:00:00 /usr/sbin/acpid
110       3030     1  0 10:29 ?        00:00:00 /usr/sbin/hald
root      3031  3030  0 10:29 ?        00:00:00 hald-runner
root      3036  3031  0 10:29 ?        00:00:00 hald-addon-input: Listening on
110       3044  3031  0 10:29 ?        00:00:00 hald-addon-acpi: listening on
root      3049  3031  0 10:29 ?        00:00:01 hald-addon-storage: polling /d
root      3186     1  0 10:29 ?        00:00:00 /usr/sbin/gpm -m /dev/psaux -t
root      3216     1  0 10:29 ?        00:00:00 /usr/sbin/crond
root      3270     1  0 10:29 ?        00:00:00 /usr/sbin/atieventsd
root      3299     1  0 10:29 ?        00:00:00 /usr/sbin/rundm /dev/tty1 /dev
root      3310  3299  0 10:29 ?        00:00:00 xdm -nodaemon
root      3401  3310  3 10:29 tty7     00:13:21 X -nolisten tcp -auth /etc/X11
root      3414  3310  0 10:29 ?        00:00:00 -:0
root      3415     1  0 10:29 ?        00:00:00 /usr/sbin/cupsd
dhcpd     3471     1  0 10:29 ?        00:00:00 /usr/sbin/dhcpd
root      3733     1  0 10:29 ?        00:00:00 /usr/libexec/postfix/master
postfix   3750  3733  0 10:29 ?        00:00:00 qmgr -l -t fifo -u -c
root      3807     1  0 10:29 tty1     00:00:00 /bin/login
root      3808     1  0 10:29 tty2     00:00:00 /sbin/mingetty tty2
root      3809     1  0 10:29 tty3     00:00:00 /sbin/mingetty tty3
root      3810     1  0 10:29 tty4     00:00:00 /sbin/mingetty tty4
root      3811     1  0 10:29 tty5     00:00:00 /sbin/mingetty tty5
root      3812     1  0 10:29 tty6     00:00:00 /sbin/mingetty tty6
user    3836  3414  0 10:34 ?        00:00:00 /bin/sh /etc/xdg/xfce4/xinitrc
user    3888     1  0 10:34 ?        00:00:00 /usr/bin/dbus-launch --sh-synt
user    3889     1  0 10:34 ?        00:00:00 /usr/bin/dbus-daemon --fork --
user    3892     1  0 10:34 ?        00:00:00 ssh-agent -u
user    3952  3836  0 10:34 ?        00:00:00 /bin/sh /etc/xdg/xfce4/xinitrc
user    3953  3952  0 10:34 ?        00:00:00 xscreensaver -no-splash
user    3956  3836  0 10:34 ?        00:00:00 /usr/bin/xfce4-session
user    3960     1  0 10:34 ?        00:00:02 xfce-mcs-manager
user    3962     1  0 10:34 ?        00:00:03 xfwm4
user    3964     1  0 10:34 ?        00:00:15 xfce4-panel
user    3966     1  0 10:34 ?        00:00:00 Thunar --daemon
user    3968     1  0 10:34 ?        00:00:00 /usr/lib/gam_server
user    3970     1  0 10:34 ?        00:00:03 xfdesktop
user    3972  3964  0 10:34 ?        00:00:02 /usr/lib/xfce4/panel-plugins/x
user    3973  3964  0 10:34 ?        00:00:00 /usr/lib/xfce4/panel-plugins/x
root      3977  3807  0 10:34 tty1     00:00:00 -bash
user    4090     1  0 10:41 ?        00:00:00 /bin/sh /usr/bin/xbrowser /usr
user    4096  4090  0 10:41 ?        00:00:00 /bin/sh /usr/lib/firefox/run-m
user    4101  4096  0 10:41 ?        00:02:19 /usr/lib/firefox/firefox-bin /
user    4107     1  0 10:42 ?        00:00:00 /usr/lib/gconfd-2 14
user    4143     1  0 10:53 ?        00:00:09 /usr/bin/Terminal
user    4144  4143  0 10:53 ?        00:00:00 gnome-pty-helper
user    4146  4143  0 10:53 pts/0    00:00:00 bash
user    4273  4143  0 12:49 pts/1    00:00:00 bash
user    4311  4273  0 13:15 pts/1    00:00:00 bash
user    4751  4311  0 14:52 pts/1    00:00:00 script -t 5.script
user    4752  4751  0 14:52 pts/1    00:00:00 script -t 5.script
user    4753  4752  0 14:52 pts/2    00:00:00 bash -i
postfix   4909  3733  0 15:29 ?        00:00:00 pickup -l -t fifo -u -c
user    6013     1  0 15:51 ?        00:00:00 xbindkeys
user    6162  4753  0 16:41 pts/2    00:00:00 ps -ef

Каждый процессор имеет идентификатор (pid). Новые процессы порождаются существующими, поэтому в информации о процессе указывается также идентификатор родителя(ppid). Если процесс завершается, то родителем его дочерних поцессов становится init. Некоторые части ядра системы также зарегистрированы как процессы. Такие процессы указываются в квадратных скобках. Это сделано для того, чтобы предоставить возможность общаться с ядром посредством сигналов. Сигналы --- это один из способов межпроцессного взаимодействия. Список доступных сигналов показывается по команде kill -l.

[user@demo $] kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

С одного терминала можно запустить несколько процессов, но только один из них, так называемый foreground процесс, будет иметь доступ к вводу с терминала и выпонять в интерактивном режиме. Остальные процессы должны работать в фоновом режиме (имея возможность выводить данные на терминал, но не получать их оттуда). Для запуска процесса в фоновом режиме необходимо в конце команды дописать &}. Фоновый процесс можно сделать интерактивным при помощи команды fg или же завершить, используя ps -H чтобы узнать идентификатор нужного процесса, и kill непосрпедственно для завершения.

Ограничение прав доступа

Почему существуют три группы прав доступа?

Каждый пользователь системы так же имеет уникальный идентификатор (uid). В информации о процессе содержится идентификатор пользователя, запустившего процесс (или родителя процесса). Первоначально идентификатор пользователя содержится в информации, ассоциированной с login shell.

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

Пример:

[user@demo $] ls -ld /etc/tcb
drwx--x--- 41 root shadow 4096 Июл 17 13:15 /etc/tcb

Информация о том, какие пользователи принадлежат к каким группам хранится в /etc/passwd (там указана основная группая) и /etc/group (дополнительные).

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

[user@demo $] id
uid=500(user) gid=500(user) группы=10(wheel),14(uucp),19(proc),22(cdrom),71(floppy),80(cdwriter),81(audio),83(radio),119(xgrp),422(camera),423(scanner),500(user)

Процессы, права доступа

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

Алгоритм этого следующий:

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

Изменять права доступа к файлам может только владелец (либо суперпользователь -- см. ниже). UID сменить нельзя, GID можно менять только на группу из своего списка групп.

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

По этой причине крайне не рекомендуется выполнять обыденные действия от лица суперпользователя, так как аккаунт суперпользователя предназначен для административных действий. Так же, есть необходимость иметь некоторые запущенные от лица суперпользователя процессы. В дистрибутивах ALT Linux и OWL стараются активно минимизировать их количество.

Вопрос: может ли процесс поменять свой UID? Да, но только если у него сначала был UID = 0. Для этго существует системный вызов setuid. Основное использование этой возможности --- программы для входа пользователя в систему, login или *dm. Они выполняются от лица суперпользователя. После логина порождается новый процесс, у которого меняется UID. Получается стройная система: какие-то программы запускаются "под рутом" (от лица суперпользователя), дальше они работают от лица пользователей. А затем уже UID наследуется. При такой организации пользователь, что бы он не делал, не может повысить себе права (по крайней мере без использования "дыр" в программном обеспечении).

У этой стройной архитектуры есть один изъян --- пользователю иногда бывает необходимо совершать действия от лица суперпользователя. При этом входить в систему как root не хочется, хочется всего лишь запустить от его лица программу. Типичные действия, для которых это нужно --- смена пароля, настройка. Для этого существует механизм получения прав суперпользователя обычным пользователем. А именно, при запуске процесса наследуется UID родительского процесса за одним исключением --- если у файла установлен setuid-бит, и этот файл исполнимый, то при его исполнении процесс получает UID не пользователя, а файла. При отображении прав доступа в формате rwx это обозначается так: rws. Аналогично, можно установить setgid, и процесс будет наследовать вместо основной группы пользователя группу файла.

Также, существует специальная программа sudo, которая позволяет определить список команд, который можно выполнять пользователю от лица другого пользователя. Еще есть более простая программа, su, которая позволяет изменить ID пользователя в активном шелле.

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

FHS

  • И вообще, Linux FHS для меня являлся символом устойчивости Unix-подобных систем в меняющемся мире. Созерцание структуры каталогов оказывало на меня примерно такое же действие, как на некоторых представителей человечества -- созерцание эрмитажных атлантов, поддерживающих небо...

    • -- mutabor in sisyphus@

      • -- fortunes.ALT

Иерархия стандартных каталогов в Линукс достаточно жёстко предопределена. Файловая система образует единую структуру --- дерево, "растущее" из корня (каталог /). Определённая группа людей выпускает ревизии документа под названием Filesystem Hierarchy Standard (FHS), в который включаются рекомендации по поводу того, как должна выглядеть файловая система в POSIX-совместимой ОС. В ПСПО ALT Linux данный документ поставляется в пакете с соответствующим названием --- fhs.

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

/bin содержит используемые при старте исполняемые файлы, необходимые для выведения системы в штатный режим.

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

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

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

/home --- это каталог, в котором хранятся домашние каталоги пользователей (в них пользователи хранят свои данные).

/lib предназначен для хранения библиотек, необходимых для старта системы.

Отступление: библиотеки

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

  2. Нужных нам функций может набраться довольно много. Наступит момент, когда мы поймём, что сотню функций не слишком-то удобно хранить в сотне файлов. Гораздо лучше собрать все, к примеру, математические функции в один большой файл --- архив специального вида. При сборке программ, использующих эти функции, компоновщик должен уметь разархивировать этот файл и забирать из него нужные фрагменты --- отдельные скомпилированные функции. Такой архив --- сборник объектных файлов --- называется библиотекой. При компиляции любой из наших программ достаточно будет сказать: "Эта программа должна быть собрана с использованием математической библиотеки".

  3. Оказывается, что и такой подход порождает свои проблемы. Напишем 30 программ, использующих синус, и соберем их с поддержкой нашей математической библиотеки. Результатом будут 30 исполняемых файлов, в каждом из которых будет храниться один и тот же машинный код, вычисляющий синус. Понятно, что это ничем не мотивированный перерасход дискового пространства. Было бы гораздо удобней, если содержимое нашей библиотеки хранилось в файловой системе в единственном экземпляре. Кроме того, есть и более неприятная проблема: если библиотеку потребуется изменить (к примеру, если мы обнаружим ошибку, из-за которой синус нуля дает -7), то все использующие её программы также потребуют пересборки (а если одну из них мы пересобрать забудем?). Выход один --- следует отказаться от принципа, согласно которому все необходимое для работы программы кладётся внутрь ее исполняемого файла при компиляции. Решающая описанные проблемы схема выглядит следующим образом. При сборке наших программ указывается, что для их работы нужно подгрузить математическую библиотеку. Оформленные соответствующим способом библиотеки называются динамическими: они не входят в исполняемый файл, а загружаются в память в момент запуска использующей их программы. Понятно, что если при запуске такой программы нужной для её работы динамической библиотеки в соответствующем месте не окажется, то запуститься программа не сможет. Чтобы определить, какие динамические библиотеки нужны той или иной программе, пользуются утилитой ldd.

(конец отступления)

/lost+found --- при создании большинства файловых систем этот каталог создаётся автоматически. В него могут помещаться результаты ремонта этой файловой системы --- потерянные и найденные файлы (файлы без имени, найденные при проверке, и пр.). В современных ФС, используемых в ОС Линукс, обычно применяется журналирование, так что оказавшиеся в lost+found файлы --- большая редкость.

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

/mnt --- каталог, предназначенный для подключаемых вручную (при помощи команды mount) устройств.

/opt --- каталог, обыкновенно использующийся для программных продуктов, не входящих в дистрибутив или не соблюдающих общепринятые правила оформления (FHS). Дисциплина оформления установки в /opt проста: каталог /opt/имя_продукта (чаще всего --- именно так) содержит необходимые для работы подкаталоги. В большинстве случаев, отметим, каталог /opt пустует.

/proc --- каталог с виртуальной файловой системой, специфичной для ОС Linux. Здесь в виде файлов и каталогов представлена структура процессов, а также сведения о процессоре, оперативной памяти и самой ОС.

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

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

/srv --- каталог для предоставляемых машиной данных, например сетевой файловой системы. Здесь же, к примеру, должны лежать данные, раздаваемые по протоколу FTP.

/sys --- каталог для ещё одной виртуальной файловой системы ОС Linux. Здесь представлена структура аппаратного обеспечения компьютера в том виде, в котором её воспринимает ядро ОС. Этот каталог удобно использовать, чтобы узнать, что Линукс "думает" об установленном железе. Данная возможность бывает полезна как опытным пользователям, так и выполняющим системные задачи программам-роботам.

/tmp --- каталог для хранения временных файлов.

/usr --- особый каталог с собственной внутренней иерархией подкаталогов. Мы отметим лишь некоторые из его подкаталогов.

  • /usr/bin, /usr/lib, /usr/sbin --- каталоги, аналогичные /bin, /lib и /sbin соответственно, с той разницей, что здесь лежат не являющиеся необходимыми для выведения системы в штатный режим файлы (программы, библиотеки, суперпользовательские утилиты). Так, /usr/bin содержит подавляющее большинство пользовательских приложений, /usr/lib --- пользовательских библиотек (в том числе, необходимых для программирования).

  • /usr/share --- каталог для хранения архитектурно-независимых данных (соответствующие файлы одинаково выглядят, к примеру, на 32- и 64-разрядных машинах). Понятно, что бинарные приложения сюда поместить нельзя (они принципиально другие), а вот, например, документацию --- вполне (она располагается в /usr/share/doc).

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

  • /var/cache --- разного рода кэши приложений;

  • /var/db --- базы данных нетекстового формата;

  • /var/lib --- специальные изменяемые файлы различных служб (в ПСПО ALT Linux здесь находятся, к примеру, изолированные окружения);

  • /var/lock --- файлы блокировки (запускаемые программы могут создавать здесь файлы, чтобы другие программы по наличию или отсутствию этих файлов получали информацию о возможности доступа к тому или иному ресурсу);

  • /var/log --- системные журналы;

  • /var/mail --- списки почтовых очередей;

  • /var/opt --- изменяемые данные установленных в /opt программ;

  • /var/preserv --- периодически обновляемые копии различных составляющих системы (к примеру, содержимого /etc);

  • /var/run --- информация о том, какие запущены подсистемы (services) и что в этих подсистемах происходит (например, сюда помещаются файлы, содержащие идентификаторы соответствующих процессов).


CategoryLectures CategoryPspo CategoryMpgu CategoryUneex