Не удалось смонтировать oldroot после pivot_root и chroot в Linux

Вопрос или проблема

Я работаю над встроенной системой Linux (ядро-5.10.24) и использую busybox в качестве init. Я создал 2 раздела rootfs в системе, и хочу использовать pivot_root и chroot для смены rootfs между ними.

Когда система впервые загрузилась, команда mount показала следующее.

# mount
ubi0:rootfs на / тип ubifs (rw,relatime,assert=read-only,ubi=0,vol=0)
devtmpfs на /dev тип devtmpfs (rw,relatime,size=42008k,nr_inodes=10502,mode=755)
proc на /proc тип proc (rw,relatime)
tmpfs на /tmp тип tmpfs (rw,relatime)
tmpfs на /run тип tmpfs (rw,nosuid,nodev,relatime,mode=755)
sysfs на /sys тип sysfs (rw,relatime)
devpts на /dev/pts тип devpts (rw,relatime,mode=600,ptmxmode=000)
tmpfs на /dev/shm тип tmpfs (rw,relatime)

Теперь я смонтировал 2-й rootfs в /mnt, затем запустил pivot_root и chroot.

# mount -t ubifs /dev/ubi1_0 /mnt/
# cd /mnt
# pivot_root . oldroot
# chroot . sh
# umount /oldroot
umount: не удается размонтировать /oldroot: Устройство или ресурс заняты

Я смонтировал proc после pivot_root и chroot, и команда mount показала следующее.

# mount -t proc proc /proc
# mount
ubi0:rootfs на /oldroot тип ubifs (rw,relatime,assert=read-only,ubi=0,vol=0)
devtmpfs на /oldroot/dev тип devtmpfs (rw,relatime,size=42008k,nr_inodes=10502,mode=755)
proc на /oldroot/proc тип proc (rw,relatime)
tmpfs на /oldroot/tmp тип tmpfs (rw,relatime)
tmpfs на /oldroot/run тип tmpfs (rw,nosuid,nodev,relatime,mode=755)
sysfs на /oldroot/sys тип sysfs (rw,relatime)
devpts на /oldroot/dev/pts тип devpts (rw,relatime,mode=600,ptmxmode=000)
tmpfs на /oldroot/dev/shm тип tmpfs (rw,relatime)
/dev/ubi1_0 на / тип ubifs (rw,relatime,assert=read-only,ubi=1,vol=0)
proc на /proc тип proc (rw,relatime)

Я проверил комментарии и ответы на Невозможно размонтировать после pivot_root

и попробовал скрипт, но у меня по-прежнему возникла та же ошибка.

Что мне делать, чтобы umount /oldroot после pivot_root и chroot?

Ответ или решение

Устранение проблемы "Failed to umount oldroot after pivot_root and chroot" в Linux

Введение

При работе с встраиваемыми системами на базе Linux, особенно с использованием pivot_root и chroot, могут возникнуть сложности при попытке демонтажа старой корневой файловой системы. В вашем случае, вы столкнулись с ошибкой "umount: can’t unmount /oldroot: Device or resource busy" после выполнения команд pivot_root и chroot. Рассмотрим причины этой проблемы и возможные решения.

Причины проблемы

Основной причиной ошибки "Device or resource busy" при попытке демонтажа /oldroot могут быть следующие факторы:

  1. Количество монтированных точек: После выполнения pivot_root, все монтируемые файловые системы относительно старого корня остаются активными, и если среди них есть активные записи или процессы, связанные с /oldroot, это может препятствовать его демонтажу.

  2. Активные процессы: Процессы, работающие в пространстве старого корня, могут удерживать файловые дескрипторы открытыми, таким образом блокируя успешный демонтаж.

  3. Монтирование дополнительных файловых систем: Если во время работы с /oldroot или после монтирования второго корня вы подключили дополнительные файловые системы (например, proc, tmpfs и пр.), они могут быть связаны с /oldroot, что делает его занятым.

Шаги по устранению проблемы

Для успешного демонтажа /oldroot, выполните следующие шаги:

  1. Проверка активных процессов: Используйте команду lsof или fuser, чтобы определить, какие процессы использует /oldroot и остановите их. Например:

    lsof +D /oldroot
  2. Освобождение монтированных точек: Убедитесь, что все монтированные файловые системы, такие как proc и sys, были отключены. Сначала выполните их демонтаж:

    umount /proc
    umount /sys
  3. Использование of --lazy флага: Если вам необходимо принудительно демонтировать /oldroot, можно воспользоваться флагом --lazy, который позволит отделить файловую систему от системы монтирования, даже если она занята:

    umount --lazy /oldroot
  4. Порядок операций: Убедитесь, что вы сначала выполняете chroot, а потом монтируете proc и другие файловые системы на новом корне, прежде чем пытаться выполнить демонтаж старого корня. Измените порядок выполнения на:

    # cd /mnt
    # pivot_root . oldroot
    # mount -t proc proc /proc
    # chroot . sh
  5. Проверка монтирования: Убедитесь, что все точки монтирования отображаются и проверяйте, чтобы никакие пользовательские или системные утилиты не использовали /oldroot.

Заключение

Следуя данным рекомендациям, вы сможете устранить ошибку "Failed to umount oldroot after pivot_root and chroot" в Linux при использовании busybox в вашей встраиваемой системе. Правильный порядок операций и освободение ресурсов, связанных со старой корневой файловой системой, помогут вам успешно выполнить демонтаж. Если проблема сохраняется, обратите внимание на состояние и логи системы, что может дать более глубокое понимание текущей ситуации.

Оцените материал
Добавить комментарий

Капча загружается...