Если вы используете 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. Но это утомительно и занимает много времени. Автоматизация этого процесса сэкономит вам силы и упростит рабочий процесс.
systemd-nspawn — это инструмент командной строки, входящий в состав systemd, который позволяет создавать и запускать облегчённые изолированные системные контейнеры в системах Linux. Он позволяет выполнять команды или даже целые операционные системы в изолированной среде.
Инструмент systemd-nspawn
может автоматически обрабатывать монтирование /dev
и других каталогов.
systemd-nspawn
В системах на базе Debian установите его с помощью:
sudo apt update sudo apt install systemd-container
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, он автоматически размонтирует эти каталоги.
Chrootmnt — это скрипт Bash для монтирования и размонтирования /dev
в среде chroot, обеспечивающий беспрепятственный доступ к устройствам и автоматическую очистку для безопасного управления системой Linux.
Ключевые особенности
Сохраните следующий скрипт как 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
/bin/bash
) для выполнения внутри chroot.
2. Сохраняйте аргументы
CHROOT_DIR="$1" shift # Удалите первый аргумент (путь к chroot)
CHROOT_DIR
.shift
для удаления этого аргумента, оставляя только команду и её необязательные аргументы../chrootmnt.sh /tmp/debian-rootfs /bin/bash
CHROOT_DIR
= /tmp/debian-rootfs
/bin/bash
) передаются в chroot
.
3. Проверка каталога
if [ ! -d "$CHROOT_DIR" ]; then echo "Ошибка: каталог Chroot $CHROOT_DIR не существует." exit 1 fi
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).
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
.
Выполните следующую команду, чтобы сделать скрипт исполняемым:
chmod +x chrootmnt.sh
Во-первых, убедитесь, что вы создали среду 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
: Лучше всего подходит для продвинутых пользователей, которым нужен опыт, подобный контейнерному.
Вручную монтировать и размонтировать /dev
каждый раз при использовании chroot неэффективно. Используя systemd-nspawn
или скрипт-оболочку, вы можете автоматизировать этот процесс и сэкономить время. Выберите метод, который лучше всего подходит для вашего рабочего процесса, и наслаждайтесь более удобной работой с mmdebstrap
!