preinit.sh 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. # Copyright (C) 2006-2013 OpenWrt.org
  2. # Copyright (C) 2010 Vertical Communications
  3. boot_hook_splice_start() {
  4. export -n PI_HOOK_SPLICE=1
  5. }
  6. boot_hook_splice_finish() {
  7. local hook
  8. for hook in $PI_STACK_LIST; do
  9. local v; eval "v=\${${hook}_splice:+\$${hook}_splice }$hook"
  10. export -n "${hook}=${v% }"
  11. export -n "${hook}_splice="
  12. done
  13. export -n PI_HOOK_SPLICE=
  14. }
  15. boot_hook_init() {
  16. local hook="${1}_hook"
  17. export -n "PI_STACK_LIST=${PI_STACK_LIST:+$PI_STACK_LIST }$hook"
  18. export -n "$hook="
  19. }
  20. boot_hook_add() {
  21. local hook="${1}_hook${PI_HOOK_SPLICE:+_splice}"
  22. local func="${2}"
  23. [ -n "$func" ] && {
  24. local v; eval "v=\$$hook"
  25. export -n "$hook=${v:+$v }$func"
  26. }
  27. }
  28. boot_hook_shift() {
  29. local hook="${1}_hook"
  30. local rvar="${2}"
  31. local v; eval "v=\$$hook"
  32. [ -n "$v" ] && {
  33. local first="${v%% *}"
  34. [ "$v" != "${v#* }" ] && \
  35. export -n "$hook=${v#* }" || \
  36. export -n "$hook="
  37. export -n "$rvar=$first"
  38. return 0
  39. }
  40. return 1
  41. }
  42. boot_run_hook() {
  43. local hook="$1"
  44. local func
  45. while boot_hook_shift "$hook" func; do
  46. local ran; eval "ran=\$PI_RAN_$func"
  47. [ -n "$ran" ] || {
  48. export -n "PI_RAN_$func=1"
  49. $func "$1" "$2"
  50. }
  51. done
  52. }
  53. pivot() { # <new_root> <old_root>
  54. /bin/mount -o noatime,move /proc $1/proc && \
  55. pivot_root $1 $1$2 && {
  56. /bin/mount -o noatime,move $2/dev /dev
  57. /bin/mount -o noatime,move $2/tmp /tmp
  58. /bin/mount -o noatime,move $2/sys /sys 2>&-
  59. /bin/mount -o noatime,move $2/overlay /overlay 2>&-
  60. return 0
  61. }
  62. }
  63. fopivot() { # <rw_root> <work_dir> <ro_root> <dupe?>
  64. /bin/mount -o noatime,lowerdir=/,upperdir=$1,workdir=$2 -t overlay "overlayfs:$1" /mnt
  65. pivot /mnt $3
  66. }
  67. ramoverlay() {
  68. mkdir -p /tmp/root
  69. /bin/mount -t tmpfs -o noatime,mode=0755 root /tmp/root
  70. mkdir -p /tmp/root/root /tmp/root/work
  71. fopivot /tmp/root/root /tmp/root/work /rom 1
  72. }