ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)
Вторник, 7 января, 2025

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

Как автоматизировать монтирование / разработку в средах 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.

Ключевые особенности

  1. Гибкие входные данные: Работает с любым каталогом и командой chroot.
  2. Обработка ошибок: предотвращает сбои, вызванные отсутствием каталогов или неправильными аргументами.
  3. Автоматическая очистка: Позволяет избежать оставления подключенных ресурсов в случае прерывания работы.
  4. Поддержка псевдотерминала: обеспечивает совместимость с интерактивными инструментами, такими как 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

 

2. Сохраняйте аргументы

CHROOT_DIR="$1"
shift # Удалите первый аргумент (путь к 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"

 

5. Функция очистки

cleanup() { 
 sudo umount "$ CHROOT_DIR / dev / pts"
 sudo umount "$ CHROOT_DIR / dev"
}
trap cleanup EXIT

 

6. Введите Chroot

sudo chroot "$CHROOT_DIR" "$@"

 

7. Автоматическая очистка

 

Шаг 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. Замените его на свой.

 

Какое решение Вам следует использовать?

 

Заключение

Вручную монтировать и размонтировать /dev каждый раз при использовании chroot неэффективно. Используя systemd-nspawn или скрипт-оболочку, вы можете автоматизировать этот процесс и сэкономить время. Выберите метод, который лучше всего подходит для вашего рабочего процесса, и наслаждайтесь более удобной работой с mmdebstrap!

Exit mobile version