web-dev-qa-db-ja.com

ピボットルートの後にアンマウントできません

ボード上で、現在のrootfsが存在する(NAND)パーティションを再起動せずにフラッシュし、フラッシュが成功したかどうかを確認したいと思います。

そうするために、私は次のことを試みます:

  • すべての不要なプロセスを殺す
  • 別のrootfsを含むSDカードをマウントします(現在のrootfsへのマウントポイントはSDカードで利用可能になります)
  • sDカードのrootfsと元のrootfsの間で、pivot_rootを実行します。
  • chrootを実行してSDカードルートを使用します。
  • 古いルートパーティションをアンマウントします
  • 新しいrootfsをフラッシュします
  • pivot_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が存在するので、rootをアンマウントすることは可能ですか? Busyboxバージョン:1.16.1

5
Zermingore

実際、私の問題は簡単に解決できました。init uを実行しているinitを再起動する必要がありました。

落とし穴:

  • 古いパーティションのアンマウントに関しては、rootfs/dev/rootも気にしません。

  • chrootした後、/procをマウントしなかったため、fuser -m /old_rootは出力を返しませんでした

0
Zermingore

まだ古いルートからコマンド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
400 the Cat