在pivot_root之后无法卸载

在pivot_root之后无法卸载

在主板上,我想刷新我当前 rootfs 所在的(NAND)分区,而无需重新启动并能够检查刷新是否成功。

为此,我尝试:

  • 杀死所有不必要的进程
  • 挂载包含另一个 rootfs 的 SD 卡(当前 rootfs 的挂载点将在 SD 卡上可用)
  • 在SD卡的rootfs和原始rootfs之间运行pivot_root
  • 运行 chroot 以使用 SD 卡根。
  • 卸载旧的根分区
  • 刷新一个新的 rootfs
  • ivot_root 回到 rootfs 分区

不幸的是,我无法卸载原始根分区。

首先基本上是pivot_root手册页中描述的步骤:

mount /dev/hda1 /new-root
cd /new-root
pivot_root . old_root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root # <== unable to unmount

Killing some processes:

ps
  PID USER       VSZ STAT COMMAND
        1 root      1524 S    init [3]
        2 root         0 SW<  [kthreadd]
        3 root         0 SW<  [ksoftirqd/0]
        4 root         0 SW<  [watchdog/0]
        5 root         0 SW<  [events/0]
        6 root         0 SW<  [khelper]
      126 root         0 SW<  [kblockd/0]
      132 root         0 SW<  [kseriod]
      136 root         0 SW<  [kmmcd]
      159 root         0 SW   [pdflush]
      160 root         0 SW   [pdflush]
      161 root         0 SW<  [kswapd0]
      209 root         0 SW<  [aio/0]
      213 root         0 SW<  [nfsiod]
      220 root         0 SW<  [cifsoplockd]
      807 root         0 SW<  [kapmd]
      873 root         0 SW<  [mtdblockd]
      919 root         0 SW<  [rpciod/0]
      925 root         0 SWN  [jffs2_gcd_mtd3]
      927 root         0 SW<  [mmcqd]
     1806 root      2908 R    -bash
     2456 root      2072 R    ps
mount /dev/mmcblk0p0 /mnt/disk
umount /sys
umount /tmp
cat /proc/mounts
 rootfs / rootfs rw 0 0
 /dev/root / jffs2 rw 0 0
 /proc /proc proc rw 0 0
 /dev/mmcblk0p0 /mnt/disk ext2 rw,errors=continue 0 0

我想我必须找到一种卸载方法/dev/root,或者/rootfs不会/mnt/disk成为问题,因为它仍然在使用中,但是,它是我想要 chroot 的 SD 卡?

umount /proc

cd /mnt/disk
pivot_root . old-root
mount -t proc none /proc
ls -l /proc/1
-r--------    1 root     root             0 Nov 30 01:17 auxv
--w-------    1 root     root             0 Nov 30 01:17 clear_refs
-r--r--r--    1 root     root             0 Nov 30 01:16 cmdline
-rw-r--r--    1 root     root             0 Nov 30 01:17 coredump_filter
lrwxrwxrwx    1 root     root             0 Nov 30 01:17 cwd -> //
-r--------    1 root     root             0 Nov 30 01:17 environ
lrwxrwxrwx    1 root     root             0 Nov 30 01:16 exe -> /old_root  /sbin/init*
dr-x------    2 root     root             0 Nov 30 01:17 fd/
dr-x------    2 root     root             0 Nov 30 01:17 fdinfo/
-r--------    1 root     root             0 Nov 30 01:17 limits
-r--r--r--    1 root     root             0 Nov 30 01:17 maps
-rw-------    1 root     root             0 Nov 30 01:17 mem
-r--r--r--    1 root     root             0 Nov 30 01:17 mountinfo
-r--r--r--    1 root     root             0 Nov 30 01:17 mounts
-r--------    1 root     root             0 Nov 30 01:17 mountstats
dr-xr-xr-x    5 root     root             0 Nov 30 01:17 net/
-rw-r--r--    1 root     root             0 Nov 30 01:17 oom_adj
-r--r--r--    1 root     root             0 Nov 30 01:17 oom_score
-r--------    1 root     root             0 Nov 30 01:17 pagemap
-r--------    1 root     root             0 Nov 30 01:17 personality
lrwxrwxrwx    1 root     root             0 Nov 30 01:17 root -> //
-rw-r--r--    1 root     root             0 Nov 30 01:17 sched
-r--r--r--    1 root     root             0 Nov 30 01:17 smaps
-r--r--r--    1 root     root             0 Nov 30 01:16 stat
-r--r--r--    1 root     root             0 Nov 30 01:17 statm
-r--r--r--    1 root     root             0 Nov 30 01:17 status
dr-xr-xr-x    3 root     root             0 Nov 30 01:17 task/
-r--r--r--    1 root     root             0 Nov 30 01:17 wchan
cat /proc/mounts
rootfs / rootfs rw 0 0
/dev/root /old_root jffs2 rw 0 0
/dev/mmcblk0p0 / ext2 rw,errors=continue 0 0
none /proc proc rw 0 0
exec chroot . sh <dev/console >dev/console 2>&1
umount /old_root
umount: can't umount /old_root/: Device or resource busy
fuser -m /old_root/
#> 1 # <= issue here

我想知道我是否忘记了什么(也许我的策略只是被破坏了?)

我尝试过与chroot / switch_root.我也尝试过使用 SD 卡 rootfs 来mount --move /proc代替/sys

内核版本:2.6.29.4 ← rootfs存在,那么是否可以umount root? Busybox版本:1.16.1

答案1

我相信,您仍然从旧根执行命令umount /old_root,因此它很忙。

我曾经做过一个类似的脚本,以下内容对我有用:

#!/bin/sh

 mount -v -n -t proc  -onodev,noexec,nosuid proc  /proc
 mount -v -n -t sysfs -onodev,noexec,nosuid sysfs /sys

 mount -v -t ext4 /dev/sdb1 /mnt/root                           

 mount --move /dev  /mnt/root/dev/                                  
 mount --move /proc /mnt/root/proc/                                 
 mount --move /sys  /mnt/root/sys/                                  

 echo "Switching root filesystem..."
 cd /mnt/root                                               
 pivot_root . mnt/tmp/                                          

 exec chroot . /sbin/init   

那么,在新的根目录中,新的 init 执行的第一个命令是umount /mnt/tmp/

答案2

其实我的问题很容易解决,我只需要重新启动init runninginit u

陷阱:

  • rootfs关于旧分区的卸载,我们不关心/dev/root

  • 一旦我chrooted,我就没有安装a /proc,因此fuser -m /old_root没有输出

相关内容