Em uma placa, gostaria de fazer o flash da partição (NAND) onde meu rootfs atual está sem reiniciar e ser capaz de verificar se o flash foi bem-sucedido.
Para fazer isso, tento:
- mate todos os processos desnecessários
- monte um cartão SD contendo outro rootfs (um ponto de montagem para o rootfs atual estará disponível no cartão SD)
- execute o pivot_root entre os rootfs do cartão SD e o original
- execute o chroot para usar a raiz do cartão SD.
- desmonte a partição raiz antiga
- pisca um novo rootfs
- pivot_root de volta na partição rootfs
Infelizmente, não consigo desmontar a partição raiz original.
O começo é basicamente as etapas descritas na página de manual do 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
Acho que preciso encontrar uma maneira de desmontar /dev/root
e /
ou rootfs
, mas não será /mnt/disk
um problema porque ainda estará em uso, mas é o cartão SD que quero fazer chroot para?
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
Eu gostaria de saber se eu esqueci alguma coisa (talvez minha estratégia esteja simplesmente quebrada?)
Eu tentei com chroot / switch_root
.
Eu também tentei mount --move /proc
e /sys
em vez de usar o rootfs do cartão SD.
Versão do kernel: 2.6.29.4 ← um rootfs existe então, é possível desmontar a raiz?
Versão Busybox: 1.16.1