build_rootfs.sh 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #!/bin/sh
  2. set -e
  3. usage() {
  4. echo "Usage: $0 [-a|--arch <arch>] [-v|--version <version>] [-d|--disable-services <services>] [-s|--subarch <subarch>] [-o|--output <dst file>] [-p|--packages <packages>] [-f|--files <files>] [-m|--metadata <metadata.yaml>] [-u|--upgrade] <src tar>"
  5. exit 1
  6. }
  7. arch=x86
  8. subarch=64
  9. version=
  10. packages=
  11. dst_file=/dev/stdout
  12. files=
  13. services=
  14. metadata=
  15. metadata_dir=
  16. upgrade=
  17. temp=$(getopt -o "a:d:o:p:s:f:m:u:v:" -l "arch:,disable-services:,output:,packages:,subarch:,files:,metadata:,upgrade,version:,help" -- "$@")
  18. eval set -- "$temp"
  19. while true; do
  20. case "$1" in
  21. -a|--arch)
  22. arch="$2"; shift 2;;
  23. -v|--version)
  24. version="$2"; shift 2;;
  25. -d|--disable-services)
  26. services="$2"; shift 2;;
  27. -s|--subarch)
  28. subarch="$2"; shift 2;;
  29. -p|--packages)
  30. packages="$2"; shift 2;;
  31. -o|--output)
  32. dst_file="$2"; shift 2;;
  33. -f|--files)
  34. files="$2"; shift 2;;
  35. -m|--metadata)
  36. metadata=`basename $2`
  37. metadata_dir=`dirname $2`
  38. shift 2;;
  39. -u|--upgrade)
  40. upgrade=1; shift 1;;
  41. --help)
  42. usage;;
  43. --)
  44. shift; break;;
  45. esac
  46. done
  47. if [ $# -ne 1 -o -z "$version" ]; then
  48. usage
  49. fi
  50. src_tar=$1
  51. base=`basename $src_tar`
  52. dir=/tmp/build.$$
  53. files_dir=files/
  54. instroot=$dir/rootfs
  55. cache=dl/packages/$version/$arch/$subarch
  56. test -e $cache || mkdir -p $cache
  57. OPKG="env LD_PRELOAD= IPKG_NO_SCRIPT=1 IPKG_INSTROOT=$instroot $SDK/staging_dir/host/bin/opkg -o $instroot --cache $cache"
  58. unpack() {
  59. mkdir -p $instroot
  60. cat $src_tar | (cd $instroot && tar -xz)
  61. mkdir -p $instroot/var/lock/
  62. }
  63. pack() {
  64. echo Pack rootfs
  65. (cd $instroot && rm -rf var/lock/)
  66. if test -n "$metadata"; then
  67. (cd $dir && tar -cz *) > $dst_file
  68. else
  69. (cd $dir/rootfs && tar -cz *) > $dst_file
  70. fi
  71. }
  72. pack_squashfs() {
  73. echo Pack rootfs squashfs
  74. mksquashfs $dir $dst_file
  75. }
  76. disable_root() {
  77. sed -i -e 's/^root::/root:*:/' $instroot/etc/shadow
  78. }
  79. add_file() {
  80. file=$1
  81. src_dir=$2
  82. dst_dir=$3
  83. src=$src_dir/$file
  84. dst=$dst_dir/$file
  85. if test -d $src; then
  86. test -d $dst || mkdir -p $dst
  87. elif test -f $src; then
  88. cp $src $dst
  89. foo=$(dirname $file)
  90. if [ "$foo" = "./etc/init.d" ]; then
  91. echo Enabling $file
  92. set +e
  93. env IPKG_INSTROOT=$instroot sh $instroot/etc/rc.common $dst enable
  94. set -e
  95. fi
  96. fi
  97. }
  98. add_files() {
  99. src_dir=$1
  100. dst_dir=$2
  101. for f in $(cd $src_dir && find); do
  102. add_file $f $src_dir $dst_dir
  103. done
  104. }
  105. add_package() {
  106. local ipkg=$1
  107. $OPKG install --force-downgrade $ipkg
  108. }
  109. add_packages() {
  110. local dir=$1
  111. for f in $dir/*.ipk; do
  112. add_package $f
  113. done
  114. }
  115. opkg_update() {
  116. $OPKG update
  117. }
  118. update_packages() {
  119. local upgradable="$($OPKG list-upgradable|grep -e '^.* - .* - .*'|cut -d ' ' -f 1)"
  120. for pkg in $upgradable; do
  121. echo Upgrading $pkg
  122. $OPKG upgrade $pkg
  123. done
  124. }
  125. install_packages() {
  126. local packages="$1"
  127. for pkg in $packages; do
  128. echo Install $pkg
  129. $OPKG install --force-downgrade $pkg
  130. done
  131. }
  132. disable_services() {
  133. local services="$1"
  134. for service in $services; do
  135. echo Disabling $service
  136. env IPKG_INSTROOT=$instroot sh $instroot/etc/rc.common $instroot/etc/init.d/$service disable
  137. done
  138. }
  139. create_manifest() {
  140. $OPKG list-installed > $instroot/etc/openwrt_manifest
  141. }
  142. unpack
  143. disable_root
  144. if test -n "$metadata"; then
  145. add_file $metadata $metadata_dir $dir
  146. fi
  147. add_files templates/ $dir/templates/
  148. opkg_update
  149. if test -n "$upgrade"; then
  150. update_packages
  151. fi
  152. install_packages "$packages"
  153. disable_services "$services"
  154. add_files $files_dir $instroot
  155. if test -n "$files"; then
  156. add_files $files $instroot
  157. fi
  158. create_manifest
  159. pack
  160. #pack_squashfs