Инструментарий
Вот они, наши основные помощники по помещению приложения в "тюрьму":
- chroot - основная утилита, описанная выше, делает системный вызов chroot()
- chrootuid - функционально отличается от просто chroot лишь тем, что может еще и менять UID процесса посредствов setuid() - эта утилита может быть полезной, если вы хотите, чтобы сервис работал не от root, а его авторы не предусмотрели такой возможности (может отсутствовать в вашем дистрибутиве)
- ldd - выводит информацию о зависимостях от общедоступных (shared) библиотек
- strace - позволяет отслеживать системные вызовы и сигналы, чрезвычайно мощная утилита
- практический опыт - чем больше, тем лучше
- с помощью ldd выясняем, какие из библиотек требуются, и копируем их в CE (естественно, сохраняя структуру каталогов)
- внимательно смотрим вывод программы и лог-файлы - часто запускаемый сервис сам говорит, что ему не хватает для работы
- анализируем лог-файлы сервиса, лежащие уже внутри CE (если таковые имеются)
- запускаем программу через strace и сохраняем вывод STDOUT в файл для дальнейшего анализа: strace chroot /chroot/service /path/to/service 2> ./strace.log
- проверяем права доступа на файлы и каталоги внутри CE
- в случае неудачи - пытаемся еще раз пройтись по этой цепочке, думаем, советуемся со знакомым гуру, идем гуглить и совершаем прочие эзотерические действия.
Если помещенное в CE приложение не работает или работает не так, как нужно, то алгоритм отладки такой:
Помимо уже упомянутых утилит, существуют и более продвинутые инструментальные решения по созданию CE, например - jailkit (работающий, кстати, не только на Linux, но и на FreeBSD, OpenBSD и MacOSX). Однако, по сути, этот пакет лишь делает за вас часть рутины, в любом случае пригодится знание того, как собрать CE руками.
Еще один практический совет - автоматизируйте свой труд, создавайте shell-скрипты генерации CE, постепенно дописывая их по ходу мигрирования сервиса в CE - тем самым вы избавите себя от ненужной механической работы и снизите вероятность ошибки.