Информационный поиск. Процессы, права доступа. 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, дистрибутив редко существует без сообщества). Для ALTLinux это freesource.info. Этот сайт создан пользователями и существует для пользователей. Уровень квалификации активно участвующих там пользователей, как правило, весьма высок. Достоинства такого рода информационных ресурсов в том, что они содержат множество различной информации, специфичной для дистрибутива. Недостатков два:
- данные сайты поддерживаются исключительно на добровольных началах
- информация зачастую бывает слабо структурирована, а порой и не актуальна
- Также существуют различные персональные ресурсы, например, heap.altlinux.ru
- Для поиска по вопросам, связанным с особенностями дистрибутива ALTLinux можно воспользоваться ресурсом search.altlinux.ru.
- Если на специализированных ресурсах ничего найти не удалось, то стоит использовать сетевой поисковик, например, Google. Если где-то в сети есть информация относительно какой-либо проблемы, то Google её закэширует. Типичный способ использования Google: поиск по тексту сообщения об ошибке (стоит не забыть заключить текст в кавычки). Если хотите то же самое, но на русском языке, то используйте Yandex или Rambler. Там будет достаточно много, чтобы сделать представление о том:
- то ли вы ищете;
- решена ли проблема хоть кем-нибудь;
- как именно она решается в разных случаях.
- Последний ресурс, который стоит опробовать --- ресурс интерактивный, т.е. обратиться непосредственно к людям, а не к тексту. Традиционно в 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 предназначен для хранения библиотек, необходимых для старта системы.
Отступление: библиотеки
Напишем программу, использующую функцию синус. Предположим, что о существовании "стандартных библиотек" мы не догадываемся, и реализуем известный алгоритм самостоятельно. Быстро выяснится, что синус используется не в одной, а в нескольких программах, а потому исходный текст нашей функции удобно хранить в отдельном файле. Однако компилировать каждый раз один и тот же код довольно неразумно. Естественно сделать это лишь однажды и записать результат в так называемый объектный файл. Он не будет предназначен для исполнения, однако будет готов к компоновке: когда мы напишем ещё одну программу, использующую синус, достаточно будет этот файл подложить в нужный момент компоновщику.
Нужных нам функций может набраться довольно много. Наступит момент, когда мы поймём, что сотню функций не слишком-то удобно хранить в сотне файлов. Гораздо лучше собрать все, к примеру, математические функции в один большой файл --- архив специального вида. При сборке программ, использующих эти функции, компоновщик должен уметь разархивировать этот файл и забирать из него нужные фрагменты --- отдельные скомпилированные функции. Такой архив --- сборник объектных файлов --- называется библиотекой. При компиляции любой из наших программ достаточно будет сказать: "Эта программа должна быть собрана с использованием математической библиотеки".
Оказывается, что и такой подход порождает свои проблемы. Напишем 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) и что в этих подсистемах происходит (например, сюда помещаются файлы, содержащие идентификаторы соответствующих процессов).