boot.sh 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #!/bin/sh
  2. # Copyright (C) 2006-2010 OpenWrt.org
  3. # Copyright (C) 2010 Vertical Communications
  4. boot_hook_add() {
  5. local hook="${1}_hook"
  6. local value="$2"
  7. local sep=" "
  8. eval "$hook=\"\${$hook:+\${$hook}\${value:+\$sep}}\$value\""
  9. }
  10. boot_run_hook() {
  11. local boot_func
  12. for boot_func in $(eval "echo \"\$${1}_hook\""); do
  13. $boot_func "$1" "$2"
  14. done
  15. }
  16. find_mtd_part() {
  17. local PART="$(grep "\"$1\"" /proc/mtd | awk -F: '{print $1}')"
  18. local PREFIX=/dev/mtdblock
  19. PART="${PART##mtd}"
  20. [ -d /dev/mtdblock ] && PREFIX=/dev/mtdblock/
  21. echo "${PART:+$PREFIX$PART}"
  22. }
  23. jffs2_ready () {
  24. mtdpart="$(find_mtd_part rootfs_data)"
  25. magic=$(hexdump $mtdpart -n 4 -e '4/1 "%02x"')
  26. [ "$magic" != "deadc0de" ]
  27. }
  28. dupe() { # <new_root> <old_root>
  29. cd $1
  30. echo -n "creating directories... "
  31. {
  32. cd $2
  33. find . -xdev -type d
  34. echo "./dev ./jffs ./mnt ./proc ./tmp"
  35. # xdev skips mounted directories
  36. cd $1
  37. } | xargs mkdir -p
  38. echo "done"
  39. echo -n "setting up symlinks... "
  40. for file in $(cd $2; find . -xdev -type f;); do
  41. case "$file" in
  42. ./rom/note) ;; #nothing
  43. ./etc/config*|\
  44. ./usr/lib/opkg/info/*) cp -af $2/$file $file;;
  45. *) ln -sf /rom/${file#./*} $file;;
  46. esac
  47. done
  48. for file in $(cd $2; find . -xdev -type l;); do
  49. cp -af $2/${file#./*} $file
  50. done
  51. echo "done"
  52. }
  53. pivot() { # <new_root> <old_root>
  54. mount -o move /proc $1/proc && \
  55. pivot_root $1 $1$2 && {
  56. mount -o move $2/dev /dev
  57. mount -o move $2/tmp /tmp
  58. mount -o move $2/sys /sys 2>&-
  59. mount -o move $2/jffs /jffs 2>&-
  60. return 0
  61. }
  62. }
  63. fopivot() { # <rw_root> <ro_root> <dupe?>
  64. root=$1
  65. {
  66. if grep -q mini_fo /proc/filesystems; then
  67. mount -t mini_fo -o base=/,sto=$1 "mini_fo:$1" /mnt 2>&- && root=/mnt
  68. else
  69. mount --bind / /mnt
  70. mount --bind -o union "$1" /mnt && root=/mnt
  71. fi
  72. } || {
  73. [ "$3" = "1" ] && {
  74. mount | grep "on $1 type" 2>&- 1>&- || mount -o bind $1 $1
  75. dupe $1 $rom
  76. }
  77. }
  78. pivot $root $2
  79. }
  80. ramoverlay() {
  81. mkdir -p /tmp/root
  82. mount -t tmpfs root /tmp/root
  83. fopivot /tmp/root /rom 1
  84. }