монтировать dev, proc, sys в среде chroot?

87

Я пытаюсь создать образ Linux с выбранными пакетами.
Я пытаюсь создать пакеты, которые собираюсь использовать на ноутбуке XO, потому что на реальном оборудовании XO компиляция пакетов занимает очень много времени, если я могу собрать все нужные мне пакеты и просто прошить Изображение на XO, я могу сэкономить время и пространство.

Когда я попытался установить некоторые пакеты, его не удалось настроить из-за отсутствия каталогов proc, sys, dev. Итак, я узнал из других мест, что мне нужно «смонтировать» хост-процесс, ... каталоги в моей среде chroot.

Я видел два синтаксиса и не уверен, какой использовать.

В хост-машине:

  mount --bind /proc <chroot dir>/proc 

и другой синтаксис (в среде chroot):

  mount -t proc none /proc

Какой я должен использовать, и в чем разница?

Патрик
источник
Осторожно: предоставление доступа к дисковым устройствам означает, что вы потеряете некоторые из преимуществ ' chroot()'. В частности, определенные могут читать файлы за пределами своего раздела файловой системы, если вы не будете осторожны.
Джонатан Леффлер
2
@ Джонатан Леффлер: это не похоже на проблему того, что он делает.
Zifre
@JonathanLeffler пользователь root в chroot всегда может выйти из него в любом случае.
LtWorf

Ответы:

43

Для /procи /sys, я полагаю, вы могли бы использовать любой метод. Обе они являются специальными файловыми системами, поэтому их можно воссоздавать любое количество раз (метод bind mount использует то же самое монтирование, что и хост-система, тогда как другой метод использует новое монтирование). Я всегда видел рекомендованное в руководствах крепление для крепления, поэтому я бы использовал это. Насколько я знаю, нет действительно важной разницы.

Однако /devобычно это монтирование tmpfs, которым управляет udev, поэтому это должна быть та же самая файловая система, что и на главном компьютере. Это означает, что вам нужно будет использовать метод bind mount.

Если этот chroot будет на некоторое время, вы можете поместить эти записи в /etc/fstabхост-систему, чтобы упростить процесс.

Zifre
источник
Я хотел бы спросить, имеет ли смысл копировать (связывать) proc / sys с хоста на какую-то другую машину? Почему они должны соответствовать этой машине?
ransh
@ransh, имеет смысл, если вы связываете / proc с $ chrootdir / proc, у вас будет возможность обрабатывать процесс и то, что происходит внутри / proc обеих систем из обеих систем; Например: из chroot вы можете проверить, запущена ли программа на хосте ... и т. д.
Иона
Может быть, sys typeфайловой системы ( сегодня ) больше не существует?
174140
111

Arch Linux вики предлагает следующие команды:

cd /mnt/arch # or where you are preparing the chroot dir
mount -t proc proc proc/
mount --rbind /sys sys/
mount --rbind /dev dev/
gacrux
источник
2
Они также, казалось, работали на меня в Ubuntu.
isaaclw
4
В моем случае (также Ubuntu) мне также потребовалось "mount -o bind / dev / pts dev / pts".
Томас
Пожалуйста, включите ссылку на источник.
пенополистирол летать
@styrofoamfly Добавлено.
gacrux
1
С 2019 года вики ArchLinux теперь доступны --rbindдля sysи dev.
Саад Малик
12

В Gentoo Handbook специально вызываются эти две команды для повторного монтирования / proc и / dev. Я использовал их несколько раз.

mount -t proc none /mnt/chroot/proc
mount -o bind /dev /mnt/chroot/dev

Я подозреваю, что / sys - это обычная папка, поэтому вы можете создать жесткую ссылку.

ln /sys /mnt/chroot/sys
Роберт
источник
17
Вы не можете жестко связать каталог (обычно), как вы предлагаете для / sys, и если вы используете символическую ссылку, она сломается, как только вы выполните chroot.
Они добавили несколько новых, основанных на systemd. Возможно, это хорошая идея добавить их.
АЗП
1

В этом популярном вопросе стоит отметить, что Arch Linux создал скрипт arch-chroot ; скачатьarch-install-scripts-15-1-any.pkg.tar.xz

Это решение различных проблем, связанных как с Arch-Linux, так и с Manjaro , где я тоже успешно его использовал. Возможно, больше Архи- производных, таких как Парабола , также совместимы.

Хотя простой стандарт chrootво вторичную установку Manjaro не позволит вам запустить

pacman --sync linux

(серебряная пуля после сбоя системы), заменив строку на

arch-chroot /run/media/*YOURSELF*/manja-disk2

позволит вам исправить вашу вторичную Arch-производную установку через

pacman --sync linux

Как колдовство. Сценарий bash arch-chrootзаботится /dev /sys /procи о многом другом, которое стандарт оставил в покое chroot.

смотрите также: Использование arch-chroot

у парень
источник
-1

Существуют и другие псевдофайловые системы и местоположения tmpfs. Это на Debian:

/dev/pts 
/run
/run/shm
/proc/sys/fs/binfmt_mist
/var/lib/nfs/rpc_pipefs
/proc/fs/nfsd
/proc/bus/usb

Это должно быть в порядке , чтобы смонтировать usbfs, rpc_pipefsи devptsпсевдо-файловые системы изнутри корня. Я не рекомендую привязываться /procк chroot'ам /proc, поскольку ядро ​​имеет концепцию пространств имен и может на самом деле помещать разные вещи в процесс chroot.

Обновление: в соответствии с этим потоком списка рассылки , / sys не должен быть подключен с привязкой, особенно если процессы chroot используют свое собственное пространство имен сети.

Неправильно монтировать систему /varили /runна chroot, если у chroot есть собственное пространство имен pid.

Брайан Минтон
источник
Спекуляция? На суперпользователе (и других стековых форумах) обычно лучше подождать или исследовать и отвечать с помощью связанных источников, если вы не уверены. Это сделано для того, чтобы не рисковать распространением ошибочных подсказок. Извините, если разочаровал и удачи!
Саймон Б.
@SimonB. Я добавил ссылку в список рассылки, поддерживающий идею, что / sys не должен быть подключен.
Брайан Минтон
С пространством имен pid вы говорите о более продвинутых функциях пространства имен пользователя, которые мы можем найти в современных ядрах Linux (то есть, на основе функций «контейнеров»), в то время как когда мы используем термин chroot, мы ссылаемся на традиционное изменение пространства имен файлов ( и ничего больше).
Йохан Буле
-1

Самый простой способ - использовать цикл for:

cd /

for i in proc sys dev; do mount -o bind $i /folder/$i; done
oleberlin
источник