Как автоматически смонтировать с chroot?

Так что в chroot у меня есть файл /etc/fstab. Если я бегу mount -a в chroot монтирует перечисленные разделы. Однако даже при использовании auto вариант, они не монтируются при входе в chroot.

Каков наилучший способ заставить автомонтирование работать с chroot? Я знаю, что одним из способов было бы просто поставить mount -a в каком-то файле запуска, но было бы лучше, если бы он работал аналогично реальной среде. (В частности, одна из точек монтирования /usr, поэтому я боюсь, что это не будет работать правильно, если это не произойдет достаточно рано в процессе запуска.)

1 ответ

Вот в чем дело: на самом деле в chroot нет процесса запуска .

Когда вы запускаете что-то вроде, скажем,, то, что происходит, почти то же самое, что и бег обычно . Единственное отличие состоит в том, что перед выполнением всех этих действий оно немного настраивает внутреннее состояние в таблице процессов, так что всякий раз, когда какой-либо код в новом процессе пытается прочитать путь, ядро ​​«солгает» ему, передавая содержимое вместо вместо содержимого . А поскольку каждый поиск абсолютного пути в системе Linux начинается с чтенияи поочередное удаление каталога оттуда, это означает, что новый процесс будет находить объекты только в(за исключением некоторых нишевых крайних случаев, связанных с относительными путями). Но в остальном бег — это, по сути, просто запуск обычного процесса.

Если вы хотите запустить процесс запуска, подобный тому, который происходит при первом запуске вашей системы Ubuntu, вам нужно нечто большее, чем . Что вам понадобится, так это что-то, что запускает специальный процесс инициализации, который будет отвечать за запуск всех других системных служб (регистратора, средства запуска запланированных задач, сетевого менеджера, диспетчера графического отображения и т. д.), одна из которых - это то, что вызывает. Только после того, как все эти системные службы запустятся, он запустит то, что вы изначально хотели запустить, например . (И если бы вы сделали это по-настоящему, вам потребовались бы способы предотвратить вмешательство этого нового процесса инициализации в тот, который запустил саму Ubuntu. По сути, вам пришлось бы изобретать Docker заново.)

В вашем случае, в зависимости от того, что вы пытаетесь сделать, вам может потребоваться или не потребоваться полный процесс запуска системы. Если да, просто используйте Docker или какой-нибудь его аналог — для этого и созданы контейнеры. Но если вы этого не сделаете, вы, вероятно, сможете обойтись сценарием-оболочкой, который смонтирует все, что вам нужно для монтирования, а затем запустит оболочку или все, что вы захотите. Ваш сценарий-обертка может быть таким простым:

      #!/bin/sh

mount -a
exec "$@"

и если вы сохраните его как, вы можете использовать его так:

      chroot /newroot /usr/local/sbin/mount-and-run /bin/sh

который будет работать, который, в свою очередь, вызовет , который выполнит монтирование, а затем, в свою очередь, вызовет. (Если вы хотите размонтировать что-либо передвыходит, тогда все становится немного сложнее, но это уже тема для другого вопроса.)

Другие вопросы по тегам