home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / sbin / mkinitramfs < prev    next >
Encoding:
Text File  |  2006-12-21  |  6.9 KB  |  293 lines

  1. #!/bin/sh
  2.  
  3. umask 0022
  4.  
  5. # Defaults
  6. keep="n"
  7. CONFDIR="/etc/initramfs-tools"
  8. verbose="n"
  9. errors_to="2>/dev/null"
  10. BUSYBOXDIR="/usr/lib/initramfs-tools/bin/"
  11. # BUSYBOXDIR="/bin"
  12.  
  13. OPTIONS=`getopt -o d:ko:r:v --long supported-host-version:,supported-target-version: -n "$0" -- "$@"`
  14.  
  15. # Check for non-GNU getopt
  16. if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
  17.  
  18. eval set -- "$OPTIONS"
  19.  
  20. while true; do
  21.     case "$1" in
  22.     -d)
  23.         CONFDIR="$2"
  24.         shift 2
  25.         if [ ! -d "${CONFDIR}" ]; then
  26.             echo "${0}: ${CONFDIR}: Not a directory" >&2
  27.             exit 1
  28.         fi
  29.         ;;
  30.     -o)
  31.         outfile="$2"
  32.         shift 2
  33.         ;;
  34.     -k)
  35.         keep="y"
  36.         shift
  37.         ;;
  38.     -r)
  39.         ROOT="$2"
  40.         shift 2
  41.         ;;
  42.     -v)
  43.         verbose="y"
  44.         shift
  45.         ;;
  46.     --supported-host-version)
  47.         supported_host_version="$2"
  48.         shift 2
  49.         ;;
  50.     --supported-target-version)
  51.         supported_target_version="$2"
  52.         shift 2
  53.         ;;
  54.     --)
  55.         shift
  56.         break
  57.         ;;
  58.     *)
  59.         echo "Internal error!" >&2
  60.         exit 1
  61.         ;;
  62.     esac
  63. done
  64.  
  65. if [ -n "$supported_host_version" ] || [ -n "$supported_target_version" ]; then
  66.     if [ -n "$supported_host_version" ]; then
  67.         host_upstream_version="${supported_host_version%%-*}"
  68.     fi
  69.     if [ -n "$supported_target_version" ]; then
  70.         target_upstream_version="${supported_target_version%%-*}"
  71.         if dpkg --compare-versions "$target_upstream_version" lt "2.6.12"; then
  72.             exit 2
  73.         fi
  74.     fi
  75.     echo "Depreciation warning: use ramdisk=mkinitramfs-kpkg."
  76.     exit 0
  77. fi
  78.  
  79. # For dependency ordered mkinitramfs hook scripts.
  80. . /usr/share/initramfs-tools/scripts/functions
  81. . /usr/share/initramfs-tools/hook-functions
  82.  
  83. . "${CONFDIR}/initramfs.conf"
  84. EXTRA_CONF=''
  85. for i in /usr/share/initramfs-tools/conf.d/* ${CONFDIR}/conf.d/*; do
  86.     EXTRA_CONF="${EXTRA_CONF} $(basename $i | grep '^[a-z0-9][a-z0-9\._-]*$' | grep -v '\.dpkg-.*$')";
  87. done
  88. for i in ${EXTRA_CONF}; do
  89.     if [ -e  ${CONFDIR}/conf.d/${i} ]; then
  90.         . ${CONFDIR}/conf.d/${i}
  91.     elif [ -e  /usr/share/initramfs-tools/conf.d/${i} ]; then
  92.         . /usr/share/initramfs-tools/conf.d/${i}
  93.     fi
  94. done
  95.  
  96. if [ -n "${UMASK}" ]; then
  97.     umask "${UMASK}"
  98. fi
  99.  
  100. if [ -z "${outfile}" ]; then
  101.     usage
  102. fi
  103.  
  104. touch "$outfile"
  105. outfile="$(readlink -f "$outfile")"
  106.  
  107. # And by "version" we really mean path to kernel modules
  108. # This is braindead, and exists to preserve the interface with mkinitrd
  109. if [ ${#} -ne 1 ]; then
  110.     version="$(uname -r)"
  111. else
  112.     version="${1}"
  113. fi
  114.  
  115. # Check that we're using a new enough kernel version, first for ourselves,
  116. # then for each of the hooks, which can have a MINKVER variable defined
  117. check_minkver ${version}
  118. check_minkver ${version} /usr/share/initramfs-tools/hooks
  119. check_minkver ${version} ${CONFDIR}/hooks
  120.  
  121. case "${version}" in
  122. /lib/modules/*/[!/]*)
  123.     ;;
  124. /lib/modules/[!/]*)
  125.     version="${version#/lib/modules/}"
  126.     version="${version%%/*}"
  127.     ;;
  128. esac
  129.  
  130. case "${version}" in
  131. */*)
  132.     echo "$PROG: ${version} is not a valid kernel version" >&2
  133.     exit 1
  134.     ;;
  135. esac
  136.  
  137. if [ -d "${outfile}" ]; then
  138.     echo "${outfile} is a directory"
  139.     exit 1
  140. fi
  141.  
  142. MODULESDIR="/lib/modules/${version}"
  143.  
  144. if [ ! -e "${MODULESDIR}" ]; then
  145.     echo "Cannot find ${MODULESDIR}"
  146.     exit 1
  147. fi
  148. if [ ! -e "${MODULESDIR}/modules.dep" ]; then
  149.     depmod ${version}
  150. fi
  151.  
  152. DESTDIR="$(mktemp -t -d mkinitramfs_XXXXXX)" || exit 1
  153. __TMPCPIOGZ="$(mktemp -t mkinitramfs-OL_XXXXXX)" || exit 1
  154.  
  155. DPKG_ARCH=`dpkg --print-installation-architecture`
  156.  
  157. # Export environment for hook scripts.
  158. #
  159. export MODULESDIR
  160. export version
  161. export CONFDIR
  162. export DESTDIR
  163. export DPKG_ARCH
  164. export verbose
  165.  
  166. # Private, used by 'catenate_cpiogz'.
  167. export __TMPCPIOGZ
  168.  
  169. for d in bin conf/conf.d etc lib modules sbin scripts ${MODULESDIR}; do
  170.     mkdir -p "${DESTDIR}/${d}"
  171. done
  172.  
  173. # MODULES=list case.  Always honour.
  174. for x in "${CONFDIR}/modules" /usr/share/initramfs-tools/modules.d/*; do
  175.     if [ -f "${x}" ]; then
  176.         add_modules_from_file "${x}"
  177.     fi
  178. done
  179.  
  180. if [ "${MODULES}" = "dep" ]; then
  181.     dep_add_modules
  182. fi
  183.  
  184. if [ "${MODULES}" = "most" ]; then
  185.     auto_add_modules
  186. fi
  187.  
  188. if [ "${MODULES}" = "netboot" ]; then
  189.     auto_add_modules base
  190.     auto_add_modules net
  191. fi
  192.  
  193. # Have to do each file, because cpio --dereference doesn't recurse down
  194. # symlinks.
  195.  
  196. # klibc
  197. ln -s /usr/lib/klibc/bin/* ${DESTDIR}/bin
  198. ln -s /lib/klibc-*.so ${DESTDIR}/lib
  199. copy_exec /usr/share/initramfs-tools/init /init
  200. cp -a /usr/share/initramfs-tools/scripts/* "${DESTDIR}/scripts"
  201. for f in $(cd ${CONFDIR}/scripts && \
  202.     find . \( -name '*.dpkg*' -prune -o -name '*~' -prune \) \
  203.         -o -type f -print); do
  204.     mkdir --parents "${DESTDIR}/scripts/$(dirname "${f}")"
  205. cp -p "${CONFDIR}/scripts/${f}" "${DESTDIR}/scripts/$(dirname "${f}")"
  206. done
  207. echo "DPKG_ARCH=${DPKG_ARCH}" > ${DESTDIR}/conf/arch.conf
  208. copy_exec "${CONFDIR}/initramfs.conf" /conf
  209. for i in ${EXTRA_CONF}; do
  210.     if [ -e "${CONFDIR}/conf.d/${i}" ]; then
  211.         copy_exec "${CONFDIR}/conf.d/${i}" /conf/conf.d
  212.     elif [ -e "/usr/share/initramfs-tools/conf.d/${i}" ]; then
  213.         copy_exec "/usr/share/initramfs-tools/conf.d/${i}" /conf/conf.d
  214.     fi
  215. done
  216.  
  217. # ROOT hardcoding
  218. if [ -n "${ROOT}" ]; then
  219.     echo "ROOT=${ROOT}" > ${DESTDIR}/conf/conf.d/root
  220. fi
  221.  
  222. # Busybox
  223. if [ "x${BUSYBOX}" = "xn" ]; then
  224.     ln -s ${DESTDIR}/bin/sh.shared ${DESTDIR}/bin/sh
  225.     echo "Warning: Busybox is required for successful boot!"
  226. else
  227.     rm -f ${DESTDIR}/bin/sh
  228.     rm -f ${DESTDIR}/bin/busybox
  229.     copy_exec ${BUSYBOXDIR}/busybox /bin/busybox
  230.     ln -s ${BUSYBOXDIR}/busybox ${DESTDIR}/bin/sh
  231. fi
  232.  
  233. # Modutils
  234. copy_exec /sbin/modprobe /sbin
  235. copy_exec /sbin/depmod /sbin
  236. copy_exec /sbin/rmmod /sbin
  237. mkdir -p "${DESTDIR}/etc/modprobe.d"
  238. cp -a /etc/modprobe.d/* "${DESTDIR}/etc/modprobe.d"
  239.  
  240. run_scripts /usr/share/initramfs-tools/hooks
  241. run_scripts "${CONFDIR}"/hooks
  242.  
  243. # FIXME: Remove this Raid block after Etch releases
  244. if [ -x /sbin/mdadm ] && [ ! -f /usr/share/initramfs-tools/hooks/mdadm ]; then
  245.     # use mkinitrd magic for Sarge backwards compat
  246.     rootraiddev="$(df / | sed -rne 's,^(/dev/[^[:space:]]+).*,\1,p')"
  247.     echo "rootraiddev=${rootraiddev}" > ${DESTDIR}/conf/mdrun.conf
  248.     mdadm=$(mdadm --detail "${rootraiddev}")
  249.     echo "${mdadm}" | awk '
  250.         $1 == "Number" && $2 == "Major" { start = 1; next }
  251.         $1 == "UUID" { print "uuid=" $3; next }
  252.         !start { next }
  253.         $2 == 0 && $3 == 0 { next }
  254.         { devices = devices " " $NF }
  255.         END { print "devices='\''" devices "'\''" }' \
  256.         >> ${DESTDIR}/conf/mdrun.conf
  257.     copy_exec /sbin/mdadm /sbin
  258.     for x in md linear multipath raid0 raid1 raid456 raid5 raid6 raid10; do
  259.         manual_add_modules ${x}
  260.     done
  261. fi
  262. [ -x /sbin/mdrun ] && copy_exec /sbin/mdrun /sbin
  263.  
  264. # FIXME: Remove this LVM block after Etch releases
  265. if [ -x /sbin/vgchange ] && [ -d /lib/lvm-200 ] \
  266.     && [ ! -f /usr/share/initramfs-tools/hooks/lvm2 ]; then
  267.     copy_exec /lib/lvm-200/vgchange /sbin
  268.     for x in dm_mod dm_snapshot dm_mirror; do
  269.         manual_add_modules ${x}
  270.     done
  271. fi
  272.  
  273. # Apply DSDT to initramfs
  274. if [ -e "${CONFDIR}/DSDT.aml" ]; then
  275.     copy_exec "${CONFDIR}/DSDT.aml" /
  276. fi
  277.  
  278. [ "${verbose}" = y ] && echo "Building cpio ${outfile} initramfs"
  279. (cd "${DESTDIR}" && find . | cpio --quiet --dereference -o -H newc | gzip -9 >"${outfile}") || exit 1
  280.  
  281. if [ -s "${__TMPCPIOGZ}" ]; then
  282.     cat "${__TMPCPIOGZ}" >>"${outfile}" || exit 1
  283. fi
  284.  
  285. if [ "${keep}" = "y" ]; then
  286.     echo "Working files in ${DESTDIR} and overlay in ${__TMPCPIOGZ}"
  287. else
  288.     rm -rf "${DESTDIR}"
  289.     rm -rf "${__TMPCPIOGZ}"
  290. fi
  291.  
  292. exit 0
  293.