Как автоматизировать монтирование/разработку в средах Chroot В Linux

Если вы используете mmdebstrap для создания минимальных систем на базе Debian, вам может быть неудобно вручную монтировать и размонтировать каталог /dev каждый раз, когда вы используете chroot. Хорошая новость в том, что есть способы автоматизировать этот процесс! В этой статье мы покажем вам, как повысить эффективность работы, автоматически монтируя /dev при входе в среду chroot и размонтируя при выходе.
Зачем автоматизировать Монтаж /dev?
При создании среды chroot по умолчанию она не имеет доступа к каталогу /dev хост-системы. Это может вызывать ошибки при выполнении таких команд, как apt update, поскольку программам требуется доступ к файлам устройств, таким как /dev/null.
[...] /usr/bin/apt-key: 95: cannot create /dev/null: Permission denied /usr/bin/apt-key: 95: cannot create /dev/null: Permission denied E: gpgv, gpgv2 or gpgv1 required for verification, but neither seems installed Err:3 http://deb.debian.org/debian bookworm-updates InRelease gpgv, gpgv2 or gpgv1 required for verification, but neither seems installed [...]
Вы можете решить эту проблему, вручную монтируя/dev ([[Устранение неполадок с mmdebstrap]]) каждый раз, когда используете chroot. Но это утомительно и занимает много времени. Автоматизация этого процесса сэкономит вам силы и упростит рабочий процесс.
Решение 1. Используйте systemd-nspawn для автоматизации монтирования /dev в Chroot
systemd-nspawn — это инструмент командной строки, входящий в состав systemd, который позволяет создавать и запускать облегчённые изолированные системные контейнеры в системах Linux. Он позволяет выполнять команды или даже целые операционные системы в изолированной среде.
Инструмент systemd-nspawn может автоматически обрабатывать монтирование /dev и других каталогов.
Шаг 1: Установка systemd-nspawn
В системах на базе Debian установите его с помощью:
sudo apt update sudo apt install systemd-container
Шаг 2: Введите Chroot с помощью systemd-nspawn
Создайте среду chroot с помощью mmdebstrap:
mmdebstrap --variant=minbase stable /tmp/debian-rootfs
Затем введите chroot, используя команду:
sudo systemd-nspawn -D /tmp/debian-rootfs
systemd-nspawn автоматически монтирует /dev, /proc и /sys внутри chroot. Когда вы выходите из chroot, он автоматически размонтирует эти каталоги.
Решение 2: используйте скрипт Chrootmnt для автоматического монтирования и размонтирования /dev в средах Chroot
Chrootmnt — это скрипт Bash для монтирования и размонтирования /dev в среде chroot, обеспечивающий беспрепятственный доступ к устройствам и автоматическую очистку для безопасного управления системой Linux.
Ключевые особенности
- Гибкие входные данные: Работает с любым каталогом и командой chroot.
- Обработка ошибок: предотвращает сбои, вызванные отсутствием каталогов или неправильными аргументами.
- Автоматическая очистка: Позволяет избежать оставления подключенных ресурсов в случае прерывания работы.
- Поддержка псевдотерминала: обеспечивает совместимость с интерактивными инструментами, такими как SSH, screen и tmux.
Шаг 1: Создайте скрипт
Сохраните следующий скрипт как chrootmnt.sh:
# ------------------------------------------------------------------
# Название скрипта: chrootmnt.sh
# Описание: сценарий Bash для монтирования и размонтирования /dev
# внутри среды chroot
# Веб-сайт: https://gist.github.com/ostechnix
# Версия: 1.0
# Использование: ./chrootmnt.sh /путь/к/команде chroot аргументы
# ------------------------------------------------------------------
# Проверка ввода
if [ $# -lt 2 ]; then
echo "Usage: $0 /path/to/chroot command [args...]"
exit 1
fi
# Путь к каталогу chroot
CHROOT_DIR="$1"
shift # Удалите первый аргумент (путь к chroot)
# Убедитесь, что каталог chroot существует
if [ ! -d "$CHROOT_DIR" ]; then
echo "Ошибка: каталог chroot $CHROOT_DIR не существует."
exit 1
fi
# Подключите /dev и /dev/pts
sudo mount --bind /dev "$CHROOT_DIR/dev"
sudo mount --bind /dev/pts "$CHROOT_DIR/dev/pts"
# Обработка отключения при выходе
cleanup() {
sudo umount "$CHROOT_DIR/dev/pts"
sudo umount "$CHROOT_DIR/dev"
}
trap cleanup EXIT
# Войти в chroot
sudo chroot "$CHROOT_DIR" "$@"
Вот пошаговое объяснение того, как работает скрипт:
1. Проверка входных данных
if [ $# -lt 2 ]; then
echo "Usage: $0 /path/to/chroot command [args...]"
exit 1 fi
- Гарантирует, что пользователь предоставит по крайней мере два аргумента:
- Путь к каталогу chroot.
- Команда (например,
/bin/bash) для выполнения внутри chroot.
- Если аргументы отсутствуют, он отображает инструкции по использованию и завершает работу.
2. Сохраняйте аргументы
CHROOT_DIR="$1" shift # Удалите первый аргумент (путь к chroot)
- Сохраняет путь к каталогу chroot в
CHROOT_DIR. - Используется
shiftдля удаления этого аргумента, оставляя только команду и её необязательные аргументы.- Пример: Если входные данные являются:
./chrootmnt.sh /tmp/debian-rootfs /bin/bashCHROOT_DIR=/tmp/debian-rootfs- Оставшиеся аргументы (
/bin/bash) передаются вchroot.
- Пример: Если входные данные являются:
3. Проверка каталога
if [ ! -d "$CHROOT_DIR" ]; then echo "Ошибка: каталог Chroot $CHROOT_DIR не существует." exit 1 fi
- Подтверждает существование указанного каталога chroot.
- Если каталог отсутствует, он выводит сообщение об ошибке и завершает работу.
4. Смонтируйте /dev и /dev/pts
sudo mount --bind /dev "$CHROOT_DIR/dev" sudo mount --bind /dev/pts "$CHROOT_DIR/dev/pts"
- Связывает хост-процессы
/devи/dev/ptsвнутри chroot./dev: Предоставляет файлы устройства (например,/dev/null,/dev/tty)./dev/pts: Поддерживает псевдотерминалы (используемые такими программами, как SSH и screen).
- Гарантирует, что программы внутри chroot могут правильно обращаться к устройствам и терминалам.
5. Функция очистки
cleanup() {
sudo umount "$ CHROOT_DIR / dev / pts"
sudo umount "$ CHROOT_DIR / dev"
}trap cleanup EXIT
- Определяет функцию (
cleanup), которая отключает/devи/dev/pts. - Регистрирует эту функцию для автоматического запуска при завершении работы скрипта (успешном или с ошибкой).
- Предотвращает выход устаревших креплений, если что-то пойдет не так.
6. Введите Chroot
sudo chroot "$CHROOT_DIR" "$@"
- Использует
chrootкоманду для переключения в указанный корневой каталог (CHROOT_DIR). - Выполняет команду, предоставленную в качестве дополнительных аргументов (
$@).- Пример:
./chrootmnt.sh /tmp/debian-rootfs /bin/bash- Выполняется
/bin/bashвнутри chroot.
- Выполняется
- Пример:
7. Автоматическая очистка
- Когда сеанс
chrootзавершается (нормально или из-за ошибки), скрипт автоматически:- Размонтируется
/dev/pts. - Размонтируется
/dev.
- Размонтируется
Шаг 2: Сделайте скрипт исполняемым
Выполните следующую команду, чтобы сделать скрипт исполняемым:
chmod +x chrootmnt.sh
Шаг 3: Используйте скрипт
Во-первых, убедитесь, что вы создали среду chroot:
mmdebstrap --variant=minbase stable /tmp/debian-rootfs
Теперь, вместо использования sudo chroot /tmp/debian-rootfs, используйте скрипт для ввода chroot:
Запустите оболочку внутри /tmp/debian-rootfs:
./chrootmnt.sh /tmp/debian-rootfs /bin/bash
Запустите команду (например, ls -l /) внутри chroot:
./chrootmnt.sh /tmp/debian-rootfs ls -l /
Просто убедитесь, что вы ввели правильный путь к среде chroot. В данном случае каталог chroot — /tmp/debian-tootfs. Замените его на свой.
Какое решение Вам следует использовать?
systemd-nspawn: Лучше всего подходит для продвинутых пользователей, которым нужен опыт, подобный контейнерному.- Скрипт Chrootmnt: Лучше всего подходит для простоты и автоматизации.
Заключение
Вручную монтировать и размонтировать /dev каждый раз при использовании chroot неэффективно. Используя systemd-nspawn или скрипт-оболочку, вы можете автоматизировать этот процесс и сэкономить время. Выберите метод, который лучше всего подходит для вашего рабочего процесса, и наслаждайтесь более удобной работой с mmdebstrap!
Редактор: AndreyEx