Редактирование: UNИX, весна 2008, 07 лекция (от 26 марта)
Материал из eSyr's wiki.
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 3: | Строка 3: | ||
'''Диктофонная запись:''' http://esyr.org/lections/audio/uneex_2008_summer/uneex_08_03_26.ogg | '''Диктофонная запись:''' http://esyr.org/lections/audio/uneex_2008_summer/uneex_08_03_26.ogg | ||
- | + | Зачем нужны хардлинки? | |
- | + | # Если есть программа, которая меняет своё поведение в зависимости от имени. Для чего это нужно --- экономить байты | |
- | + | # Когда имена лежат в разных каталогах, при чём, если такой способ использования, что пользователеь файлом попользовался и удалил | |
- | + | ||
- | + | ||
- | Зачем нужны | + | |
- | # Если есть программа, которая меняет своё поведение в зависимости от имени | + | |
- | # Когда | + | |
<!-- 3. Если нужно условно говоря написать конфиг, но специфичность его такова, что это специфичной функции типа маллок, и там может быть например, что забивать --- это симлинк --> | <!-- 3. Если нужно условно говоря написать конфиг, но специфичность его такова, что это специфичной функции типа маллок, и там может быть например, что забивать --- это симлинк --> | ||
- | == | + | == Два маленьких дополнения: софтлинки и ACL == |
- | Жёсткие ссылки это хороший инструмент, но у | + | Жёсткие ссылки это хороший инструмент, но у которого есть два крупных недостатка: |
- | * Вы не можете по определению создать жесткую ссылку на файл | + | * Вы не можете по определению жесткой ссылки создать эту самую жесткую ссылку на файл в другой ФС (т.к. жесткая ссылка влкючает в себя inode, а их нумерация в каждой ФС своя) |
- | * Вы не можете создать жёсткую ссылку на каталог, это запрещено. Почему это решили запретить: предположим, у нас есть | + | * Вы не можете создать жёсткую ссылку на каталог, это запрещено. Почему это решили запретить: предположим, у нас есть директория d1, а в нём d2, ссылающийся на ту же иноду, что и d1. Фактически, для одного объекта есть два имени: d1 и d1/d2. Можете представить себе рекурсивный разбор (точнее, пожалуй, обход --Pavel): d1, потом d2, потом снова d2, и так, пока память не кончится. И поскольку вы никогда не сможете отличить, какое из имён главное, а какое дополнительное, то так делать запрещено. |
- | Для решения этих проблем есть другой объект ФС: символьная ссылка (такие файлы в выводе ls -l обозначаются символом l | + | Для решения этих проблем есть другой объект ФС: символьная ссылка (такие файлы в выводе ls -l обозначаются символом l). Это файл, в котором хранится "настоящее" имя файла. Там хранится некая подстановка: при обращении к этой ссылке из пути выкидывается имя файла-ссылки и подставлется его содержимое: например, если файл-ссылка .../f1 содержит значение d2/f3/, то обращение фактически будет к .../d2/f3/. И, наконец, если значение файла-ссылки начинается на /, то он и будет взят за фактический путь целиком. |
- | Символьные ссылки придуманы для того, чтобы обойти оба ограничения | + | Символьные ссылки придуманы для того, чтобы обойти оба ограничения жестких ссылок. Здесь любая программа точно может отличить символьную ссылку, и большинство вменяемых программ (по умолчанию) по ним не ходят. |
- | + | Про конфиг: вы можете использовать отладочные конфиг-файлы, например, для функции malloc. В trusted системах бывает нужно, чтобы malloc всегда возвращал память чистую, заполненную нулями. Это можно настроить в некотором конфиге и попросить malloc при каждом вызове читать настройки из этого файла. Однако же, действие это состоит из трех операций (открыть файл, прочитать настройки, закрыть файл). Известно, что символьной ссылке в качестве значения ей прописать все что угодно, это необязательно должен быть реально существующий файл. Можно прописать в неё нужную нам строчку, и тогда для чтения её потребуется не три файловых операции, а одна: readlink(). | |
- | == | + | === ACL === |
- | В UNIX | + | В UNIX исп. субъект-субъектная модель со множественным субъектом. Все объекты в ФС нумеруются по одному и тому же списку --- множественных субъектов. Субъекты бывают как уникальные --- пользователи, так и множественные, т.е. группы. И все права субъектов вычисляются по простой арифметике. Всё это в общем довольно естественный способ задания прав доступа, тем не менее, существует несколько use case'ов, когда субъект-субъектная модель работает неудобно. Например, если какому-то пользозвателю надо что-то запретить. Это можно в этой модели реализовать: надо созд. спец. группу, перетаскивать всех пользователей туда, кроме провинившегося, и назначить этому файлу эту группу... Есть теоретическое обоснование, почему эта модель неполная: когда для некоторого файла одной группе надо дать права только на запись, другой --- только на чтение. Чтобы только наметить, в какой парадигме она решается: есть не только уникальная идентификация пользователя, но и объекта. Чтобы облегчить/усложнить себе жизнь, можем еще ввести множественные объекты, т.е. группы объектов, и вот эти уникальные и групповые идентификаторы объектов к пользователям отношения не имеют, там своя классификация. И на основе этих 4 таблиц: список пользователей, групп пользователей, объектов, групп объектов, можно изобразить права, кто что с чем может делать. Тогда эта задача вполне легко решается. Это стандартизовано: такой объектный способ доступа стандартизован в POSIX, называется ACL (access control list), и слово list выдаёт нам его отличие: в субъект-субъектной модели вместе с каждым объектом можно хранить очень мало информации --- 9 битов плюс ещё немного, суммарно в районе 60 бит), а в этой модели, что описано сейчас, этой информации может быть столько, что на сами объекты на диске места останется с гулькин нос. Чтобы это обойти, водружаются групповые политики, правила наследования .... с одной стороны, это сильно загромождает понимание того, кто что в итоге может, особенно введение наследования. Не смотря на то,что оно подджерживается большинством Линух-систем, пользоваться ей надо в исключительных случаях. Был случай, когда школьники пришли на олимпиаду, а им всем оказался разрешен доступ на сетевой диск на запись, именно из-за какой-то ошибки в ACL. |
- | + | Соответствующие команды (если нужный пакет установлен) называются setfacl/getfacl. | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | Соответствующие команды (если нужный пакет установлен) называются getfacl | + | |
= Краткий обзор шелла как ЯП = | = Краткий обзор шелла как ЯП = | ||
Строка 84: | Строка 71: | ||
... | ... | ||
esac | esac | ||
- | + | На самом деле жутко удобная штука, потому что используются wildcards. | |
== Функции == | == Функции == | ||
Строка 95: | Строка 82: | ||
В шелле есть команда trap, которая позволяет перехватывать сигналы, посылаемые процессы. Синтаксис: | В шелле есть команда trap, которая позволяет перехватывать сигналы, посылаемые процессы. Синтаксис: | ||
trap <функция> сигнал | trap <функция> сигнал | ||
- | B тогда обработчик --- не система, а функция. Никаких специфич. парам. там нет. Единственное, среди списка сигналов есть специальное слово EXIT, которое словом не является, а является флагом выхода из скрипта, функция ыполняется после завершения скрипта. Для чего это нужно --- для того, чтобы удалять файлы, созданные mktemp, например. Делается это следующим образом: пишется функция, которая создаёт временный файл и добавляет его в переменную, написать | + | B тогда обработчик --- не система, а функция. Никаких специфич. парам. там нет. Единственное, среди списка сигналов есть специальное слово EXIT, которое словом не является, а является флагом выхода из скрипта, функция ыполняется после завершения скрипта. Для чего это нужно --- для того, чтобы удалять файлы, созданные mktemp, например. Делается это следующим образом: пишется функция, которая создаёт временный файл и добавляет его в переменную, написать onexit() { trap - EXIt; cleanfile} |
- | + | ||
- | + | ||
- | + | ||
ДЗ: привести пример, что можно, или доказать, что нельзя с использованием сигналов сделать очередь для диспетчеризации процессов на разные процессоры... | ДЗ: привести пример, что можно, или доказать, что нельзя с использованием сигналов сделать очередь для диспетчеризации процессов на разные процессоры... |