ТЗ
Общие сведения
Необходимо реализовать "псевдо файловую систему" (далее ПФС), которая будет обеспечивать поддержку легковесных контейнеров и решать следующие три задачи:
- Персонализация части файлов в /proc для обычных пользователей (или групп пользователей),
- Персонализация файлов-устройств терминалов в /dev/pts для обычных пользователей (или групп пользователей),
- Проецирование некоторых частей файловой системы родительского контейнера, на части дочернего контейнера.
Под легковесным контейнером понимается chroot, в котором доступны части ФС родительского контейнера. В этом chroot выполняются все процессы пользователей этого контейнера. ПФС proc и devpts доступны в chroot только частично (подробнее в "персонализации"). Для каждого контейнера определяется перечень пользователей (перечень UID), все процессы которых выполняются в этом контейнере.
Под персонализацией понимается особое ограничение доступа, такое, что доступ предоставляется только к "собственной информации" (Вася знает все про себя, а Петя все про себя, но друг про друга они ничего не знают). Допустим в контейнер А назначены 3 пользователя П1, П2 и П3. Это означает что все процессы этих пользователей будут видеть (иметь информацию) о процессах пользователей П1, П2 и П3, но они не будут иметь информацию обо всем окружающем мире: процессах родительской системы и процессах пользователей всех "соседних" контейнеров.
Третья из выше описанных задач имеет наименьший приоритет и сейчас прекрасно реализуется комплексом mount'ов и symlink'ов. Как следствие — в первую очередь должны быть грамотно реализованы первые две задачи.
При реализации может быть как написан модуль к ядру, так и использоваться FUSE.
Основные требования к разрабатываемому ПО:
- корректность и завершенность — должно удовлетворять ТЗ, и не содержать ошибок (приводящих к деперсонализации);
- стабильность — должно быть стабильным, не вызывать сбоев и утечек памяти (планируется использование 24*365);
- ресурсосбережение — контейнер, в особенности пустой, должен использовать минимальное количество системных ресурсов (планируется одновременный запуск от нескольких сотен до десятков тысяч контейнеров на одном компьютере, при этом в подавляющем большинстве контейнеров большую часть времени "ничего не будет выполняться", они будут пусты);
- производительность — все операции, связанные с обращением к ПФС proc и devpts не должны быть более чем в 2 раза медленнее оригинальных, при обращении к остальным файлам (над которыми произведено проецирование) не должно теряться более нескольких процентов производительности.
Далее рассмотрены три описанных задачи отдельно с большими подробностями.
Далее везде, где не сказано обратное, под "/" понимается корень chroot, а не корень родительской системы (родительского контейнера).
Персонализация proc
В /proc содержатся:
- директории, описывающие процессы,
- другие файлы и директории, предоставляющие общесистемную информацию.
Информация процессов
Допустим, что следующая команда осуществит монтирование "proc с персонализацией":
# mount -t jailproc proc /proc -o users=1001,1002,1003
Существует 3 случая:
- Доступ к /proc одного из пользователей.
- Доступ к /proc пользователя root.
- Доступ к /proc стороннего пользователя (ситуация маловероятна, но возможна).
В первом случае доступ предоставляется к процессам (к информации о процессах), принадлежащим пользователям 1001, 1002, 1003.
Во втором случае доступ предоставляется ко всем процессам, без ограничений.
В третьем случае не предоставляется информации ни о каких процессах.
В первом случае доступ предоставляется не ко всем файлам, а содержимое некоторых файлов преобразуется. Все это должно происходить согласно следующему алгоритму (будет расширяться):
- Отображаются только: cmdline, environ, limits, mounts, stat, statm, status.
- Содержимое файла mounts генерируется по отдельному алгоритму. Основные особенности:
- в нем указывается /proc, /dev и /root.
- размер /root указывается не на основании реально имеющегося места на диске, а на основании использования дисковой квоты контейнера (продумать подробнее).
- ...
Во втором случае предоставляется доступ ко всем файлам, их содержимое не преобразуется.
Общесистемная информация
На подобии файлов с информацией о конкретном процессе файлы с информацией о системе в целом показываются по следующему алгоритму (будет расширяться):
- Отображаемые файлы: mounts, cpuinfo, crypto, devices, execdomains, filesystems, interrupts, loadavg, locks, meminfo, modules, stat, swaps, uptime, version, self.
- Содержимое mounts генерируется по отдельному алгоритму (смотреть выше).
- self — это symlink на директорию с информацией о текущем процессе.
- ...
Персонализация devpts
Допустим, что следующая команда осуществит монтирование "depvpts с персонализацией":
# mount -t jaildevpts devpts /dev/pts -o users=1001,1002,1003
Как описано выше — существует 3 случая (пользователь контейнера, пользователь root, сторонний пользователь).
В первом случае доступ предоставляется только к файлам принадлежащим пользователям контейнера.
Во втором случае — доступ предоставляется к файлам, принадлежащим пользователям контейнера и к файлам принадлежащим пользователю root.
Проецирование частей родительской системы
...
TODO по ТЗ
- Дописать алгоритм фильтрации обращений к информации о процессе.
- Дописать алгоритм фильтрации обращений к информации о системе в целом.
- Продумать что делать с "дисковыми квотами" (фактически — ответ на вопрос "а что показывать по df").
- Расписать подробности "проецирования"