Move /sys on pivot_root too
[openwrt.git] / package / base-files / files / bin / firstboot
1 #!/bin/sh
2 # $Id: firstboot 5544 2006-11-17 03:07:10Z nbd $
3 . /etc/functions.sh
4
5 partname="rootfs_data"
6 mtdpart="$(find_mtd_part $partname)"
7
8 rom=$(awk '/squashfs/ {print $2}' /proc/mounts)
9 jffs=$(awk '/jffs2/ {print $2}' /proc/mounts)
10
11 dupe() { # <new_root> <old_root>
12 cd $1
13 echo -n "creating directories... "
14 {
15 cd $2
16 find . -xdev -type d
17 echo "./dev ./jffs ./mnt ./proc ./tmp"
18 # xdev skips mounted directories
19 cd $1
20 } | xargs mkdir -p
21 echo "done"
22
23 echo -n "setting up symlinks... "
24 for file in $(cd $2; find . -xdev -type f;); do
25 case "$file" in
26 ./rom/note) ;; #nothing
27 ./etc/config*|\
28 ./usr/lib/ipkg/info/*) cp -af $2/$file $file;;
29 *) ln -sf /rom/${file#./*} $file;;
30 esac
31 done
32 for file in $(cd $2; find . -xdev -type l;); do
33 cp -af $2/${file#./*} $file
34 done
35 echo "done"
36 }
37
38 pivot() { # <new_root> <old_root>
39 mount -o move /proc $1/proc && \
40 pivot_root $1 $1$2 && {
41 mount -o move $2/dev /dev
42 mount -o move $2/tmp /tmp
43 mount -o move $2/sys /sys 2>&-
44 mount -o move $2/jffs /jffs 2>&-
45 return 0
46 }
47 }
48
49 fopivot() { # <rw_root> <ro_root> <dupe?>
50 root=$1
51 {
52 mount -t mini_fo -o base=/,sto=$1 $1 /mnt 2>&- && root=/mnt
53 } || {
54 [ "$3" = "1" ] && {
55 mount | grep "on $1 type" 2>&- 1>&- || mount -o bind $1 $1
56 dupe $1 $rom
57 }
58 }
59 pivot $root $2
60 }
61
62 ramoverlay() {
63 mkdir -p /tmp/root
64 fopivot /tmp/root /rom 1
65 }
66
67 # invoked as an executable
68 [ "${0##*/}" = "firstboot" ] && {
69
70 [ -z "$mtdpart" ] && {
71 echo "MTD partition not found."
72 exit 1
73 }
74
75 [ -z "$rom" ] && {
76 echo "You do not have a squashfs partition; aborting"
77 echo "(firstboot cannot be run on jffs2 based firmwares)"
78 exit 1
79 }
80
81 [ "$1" = "switch2jffs" ] && {
82 mtd erase "$partname"
83
84 # try to avoid fs changing while copying
85 mount -o remount,ro none / 2>&-
86
87 # copy ramoverlay to jffs2
88 mount "$mtdpart" /rom/jffs -t jffs2
89 echo -n "copying files ... "
90 cp -a /tmp/root/* /rom/jffs 2>&-
91 echo "done"
92
93 # switch back to squashfs (temporarily)
94 # and park the ramdisk ontop of /tmp/root
95 pivot /rom /mnt
96 mount -o move /mnt /tmp/root
97
98 # /jffs is the overlay
99 # /rom is the readonly
100 fopivot /jffs /rom
101
102 # try to get rid of /tmp/root
103 # this will almost always fail
104 umount /tmp/root 2>&-
105
106 # fs is clean
107 jffs2root --clean
108 exit 0
109 }
110
111 # script run manually
112 [ \! -z "$jffs" ] && {
113 echo "firstboot has already been run"
114 echo "jffs2 partition is mounted, only resetting files"
115 grep mini_fo /proc/filesystems >&-
116 [ $? != 0 ] && {
117 dupe $jffs $rom
118 exit 0
119 } || {
120 rm -rf $jffs/* 2>&-
121 mount -o remount $jffs / 2>&-
122 exit 0
123 }
124 }
125
126 mtd erase "$partname"
127 mount "$mtdpart" /jffs -t jffs2
128 fopivot /jffs /rom 1
129 }
This page took 0.04403 seconds and 5 git commands to generate.