Вопрос или проблема
Я работаю над встроенной системой 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
могут быть следующие факторы:
-
Количество монтированных точек: После выполнения
pivot_root
, все монтируемые файловые системы относительно старого корня остаются активными, и если среди них есть активные записи или процессы, связанные с/oldroot
, это может препятствовать его демонтажу. -
Активные процессы: Процессы, работающие в пространстве старого корня, могут удерживать файловые дескрипторы открытыми, таким образом блокируя успешный демонтаж.
-
Монтирование дополнительных файловых систем: Если во время работы с
/oldroot
или после монтирования второго корня вы подключили дополнительные файловые системы (например,proc
,tmpfs
и пр.), они могут быть связаны с/oldroot
, что делает его занятым.
Шаги по устранению проблемы
Для успешного демонтажа /oldroot
, выполните следующие шаги:
-
Проверка активных процессов: Используйте команду
lsof
илиfuser
, чтобы определить, какие процессы использует/oldroot
и остановите их. Например:lsof +D /oldroot
-
Освобождение монтированных точек: Убедитесь, что все монтированные файловые системы, такие как
proc
иsys
, были отключены. Сначала выполните их демонтаж:umount /proc umount /sys
-
Использование of
--lazy
флага: Если вам необходимо принудительно демонтировать/oldroot
, можно воспользоваться флагом--lazy
, который позволит отделить файловую систему от системы монтирования, даже если она занята:umount --lazy /oldroot
-
Порядок операций: Убедитесь, что вы сначала выполняете
chroot
, а потом монтируетеproc
и другие файловые системы на новом корне, прежде чем пытаться выполнить демонтаж старого корня. Измените порядок выполнения на:# cd /mnt # pivot_root . oldroot # mount -t proc proc /proc # chroot . sh
-
Проверка монтирования: Убедитесь, что все точки монтирования отображаются и проверяйте, чтобы никакие пользовательские или системные утилиты не использовали
/oldroot
.
Заключение
Следуя данным рекомендациям, вы сможете устранить ошибку "Failed to umount oldroot after pivot_root and chroot" в Linux при использовании busybox
в вашей встраиваемой системе. Правильный порядок операций и освободение ресурсов, связанных со старой корневой файловой системой, помогут вам успешно выполнить демонтаж. Если проблема сохраняется, обратите внимание на состояние и логи системы, что может дать более глубокое понимание текущей ситуации.