Index: src/scripts/install_packages.sh |
diff --git a/src/scripts/install_packages.sh b/src/scripts/install_packages.sh |
deleted file mode 100755 |
index 2ed454ab67905bc7da67bcc1444281199a3094bd..0000000000000000000000000000000000000000 |
--- a/src/scripts/install_packages.sh |
+++ /dev/null |
@@ -1,313 +0,0 @@ |
-#!/bin/bash |
- |
-# Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-# Script to install packages into the target root file system. |
-# |
-# NOTE: This script should be called by build_image.sh. Do not run this |
-# on your own unless you know what you are doing. |
- |
-# Load common constants. This should be the first executable line. |
-# The path to common.sh should be relative to your script's location. |
-. "$(dirname "$0")/common.sh" |
- |
-# Script must be run inside the chroot |
-assert_inside_chroot |
-assert_not_root_user |
- |
-DEFAULT_PKGLIST="${SRC_ROOT}/package_repo/package-list-prod.txt" |
- |
-# Flags |
-DEFINE_string output_dir "" \ |
- "The location of the output directory to use [REQUIRED]." |
-DEFINE_string root "" \ |
- "The root file system to install packages in." |
-DEFINE_string arch "x86" \ |
- "The target architecture to build for. One of { x86, armel }." |
-DEFINE_string build_root "$DEFAULT_BUILD_ROOT" \ |
- "Root of build output" |
-DEFINE_string package_list "$DEFAULT_PKGLIST" \ |
- "Comma separated set of package-list files to use." |
-DEFINE_string mirror "$DEFAULT_IMG_MIRROR" \ |
- "The upstream package mirror to use." |
-DEFINE_string suite "$DEFAULT_IMG_SUITE" \ |
- "The upstream package suite to use." |
-DEFINE_string mirror2 "" "Additional package mirror to use (URL only)." |
-DEFINE_string suite2 "" "Package suite for additional mirror." |
- |
-# Parse command line |
-FLAGS "$@" || exit 1 |
-eval set -- "${FLAGS_ARGV}" |
- |
-# Die on any errors. |
-set -e |
- |
-KERNEL_DEB_PATH=$(find "${FLAGS_build_root}/${FLAGS_arch}/local_packages" \ |
- -name "linux-image-*.deb") |
-KERNEL_DEB=$(basename "${KERNEL_DEB_PATH}" .deb | sed -e 's/linux-image-//' \ |
- -e 's/_.*//') |
-KERNEL_VERSION=${KERNEL_VERSION:-${KERNEL_DEB}} |
- |
-if [[ -z "$FLAGS_output_dir" ]]; then |
- echo "Error: --output_dir is required." |
- exit 1 |
-fi |
-OUTPUT_DIR=$(readlink -f "$FLAGS_output_dir") |
-SETUP_DIR="${OUTPUT_DIR}/local_repo" |
-ROOT_FS_DIR="${OUTPUT_DIR}/rootfs" |
-if [[ -n "$FLAGS_root" ]]; then |
- ROOT_FS_DIR=$(readlink -f "$FLAGS_root") |
-fi |
-mkdir -p "$OUTPUT_DIR" "$SETUP_DIR" "$ROOT_FS_DIR" |
- |
-# Make sure anything mounted in the rootfs is cleaned up ok on exit. |
-cleanup_rootfs_mounts() { |
- # Occasionally there are some daemons left hanging around that have our |
- # root image file system open. We do a best effort attempt to kill them. |
- PIDS=`sudo lsof -t "$ROOT_FS_DIR" | sort | uniq` |
- for pid in $PIDS |
- do |
- local cmdline=`cat /proc/$pid/cmdline` |
- echo "Killing process that has open file on our rootfs: $cmdline" |
- ! sudo kill $pid # Preceded by ! to disable ERR trap. |
- done |
- |
- # Sometimes the volatile directory is left mounted and sometimes it is not, |
- # so we precede by '!' to disable the ERR trap. |
- ! sudo umount "$ROOT_FS_DIR"/lib/modules/2.6.*/volatile/ > /dev/null 2>&1 |
- |
- sudo umount "${ROOT_FS_DIR}/proc" |
-} |
- |
-# Set up repository for locally built packages; these take highest precedence. |
-mkdir -p "${SETUP_DIR}/local_packages" |
-cp "${FLAGS_build_root}/${FLAGS_arch}/local_packages"/*.deb \ |
- "${SETUP_DIR}/local_packages" |
-cd "$SETUP_DIR" |
-dpkg-scanpackages local_packages/ /dev/null | \ |
- gzip > local_packages/Packages.gz |
-cd - |
- |
-# Create the temporary apt source.list used to install packages. |
-APT_SOURCE="${OUTPUT_DIR}/sources.list" |
-cat <<EOF > "$APT_SOURCE" |
-deb copy:"$SETUP_DIR" local_packages/ |
-deb $FLAGS_mirror $FLAGS_suite main restricted multiverse universe |
-EOF |
-if [ -n "$FLAGS_mirror2" ] && [ -n "$FLAGS_suite2" ]; then |
- cat <<EOF >> "$APT_SOURCE" |
-deb $FLAGS_mirror2 $FLAGS_suite2 main restricted multiverse universe |
-EOF |
-fi |
-# Look for official file and use it if it exists |
-if [ -f ${SRC_ROOT}/package_repo/sources-official.list ]; then |
- cat ${SRC_ROOT}/package_repo/sources-official.list >> "$APT_SOURCE" |
-fi |
- |
-# Cache directory for APT to use. This cache is re-used across builds. We |
-# rely on the cache to reduce traffic to the hosted repositories. |
-APT_CACHE_DIR="${FLAGS_build_root}/apt_cache-${FLAGS_arch}/" |
-mkdir -p "${APT_CACHE_DIR}/archives/partial" |
- |
-if [ "${FLAGS_arch}" = x86 ]; then |
- APT_ARCH=i386 |
-else |
- APT_ARCH="${FLAGS_arch}" |
-fi |
- |
-# Create the apt configuration file. See "man apt.conf" |
-APT_PARTS="${OUTPUT_DIR}/apt.conf.d" |
-mkdir -p "$APT_PARTS" # An empty apt.conf.d to avoid other configs. |
-export APT_CONFIG="${OUTPUT_DIR}/apt.conf" |
-cat <<EOF > "$APT_CONFIG" |
-APT |
-{ |
- Install-Recommends "0"; |
- Install-Suggests "0"; |
- Get |
- { |
- Assume-Yes "1"; |
- AllowUnauthenticated "1"; |
- }; |
- Architecture "${APT_ARCH}"; |
-}; |
-Dir |
-{ |
- Bin { |
- dpkg "${SCRIPTS_DIR}/dpkg_no_scripts.sh"; |
- }; |
- Cache "$APT_CACHE_DIR"; |
- Cache { |
- archives "${APT_CACHE_DIR}/archives"; |
- }; |
- Etc |
- { |
- sourcelist "$APT_SOURCE"; |
- parts "$APT_PARTS"; |
- }; |
- State "${ROOT_FS_DIR}/var/lib/apt/"; |
- State |
- { |
- status "${ROOT_FS_DIR}/var/lib/dpkg/status"; |
- }; |
-}; |
-DPkg |
-{ |
- options {"--root=${ROOT_FS_DIR}";}; |
-}; |
-EOF |
- |
-# TODO: Full audit of the apt conf dump to make sure things are ok. |
-apt-config dump > "${OUTPUT_DIR}/apt.conf.dump" |
- |
-# We do a rough equivalent to debootstrap that installs the minimal |
-# packages needed to be able to run apt to install the rest. We don't |
-# use debootstrap since it is geared toward having a second stage that |
-# needs to run package maintainer scripts. This is also simpler. |
- |
-# The set of required packages before apt can take over. |
-PACKAGES="debconf libacl1 libattr1 libc6 libgcc1 libselinux1" |
- |
-# Set of packages that we need to install early so that other packages |
-# maintainer scripts can still basically run. |
-# |
-# login - So that groupadd will work |
-# base-passwd/passwd - So that chmod and useradd/groupadd will work |
-# bash - So that scripts can run |
-# libpam-runtime/libuuid1 - Not exactly sure why |
-# sysv-rc - So that we can overwrite invoke-rc.d, update-rc.d |
-EXTRA_PACKAGES="base-files base-passwd bash libpam-runtime libuuid1 login passwd sysv-rc mawk" |
- |
-# Prep the rootfs to work with dpgk and apt |
-sudo mkdir -p "${ROOT_FS_DIR}/var/lib/dpkg/info" |
-sudo touch "${ROOT_FS_DIR}/var/lib/dpkg/available" \ |
- "${ROOT_FS_DIR}/var/lib/dpkg/diversions" \ |
- "${ROOT_FS_DIR}/var/lib/dpkg/status" |
-sudo mkdir -p "${ROOT_FS_DIR}/var/lib/apt/lists/partial" \ |
- "${ROOT_FS_DIR}/var/lib/dpkg/updates" |
- |
-# Download the initial packages into the apt cache if necessary. |
-REPO="${APT_CACHE_DIR}/archives" |
-sudo APT_CONFIG="$APT_CONFIG" DEBIAN_FRONTEND=noninteractive apt-get update |
-sudo APT_CONFIG="$APT_CONFIG" DEBIAN_FRONTEND=noninteractive \ |
- apt-get --download-only install $PACKAGES $EXTRA_PACKAGES |
- |
-# Install initial packages directly with dpkg_no_scripts.sh |
-ARCH="$FLAGS_arch" |
-if [ "$ARCH" = "x86" ]; then |
- ARCH="i?86" # Match i386 | i686 |
-fi |
-for p in $PACKAGES $EXTRA_PACKAGES; do |
- PKG=$(ls "${REPO}"/${p}_*_$ARCH.deb || /bin/true) |
- if [ -z "$PKG" ]; then |
- PKG=$(ls "${REPO}"/${p}_*_all.deb) |
- fi |
- sudo ARCH="$FLAGS_arch" "${SCRIPTS_DIR}"/dpkg_no_scripts.sh \ |
- --root="$ROOT_FS_DIR" --nodpkg_fallback --unpack "$PKG" |
- sudo ARCH="$FLAGS_arch" "${SCRIPTS_DIR}"/dpkg_no_scripts.sh \ |
- --root="$ROOT_FS_DIR" --nodpkg_fallback --configure "$p" |
-done |
- |
-# Make sure that apt is ready to work. We use --fix-broken to trigger apt |
-# to install additional critical packages. If there are any of these, we |
-# disable the maintainer scripts so they install ok. |
-TMP_FORCE_NO_SCRIPTS="-o=DPkg::options::=--nodpkg_fallback" |
-sudo APT_CONFIG="$APT_CONFIG" DEBIAN_FRONTEND=noninteractive ARCH="$FLAGS_arch"\ |
- apt-get $TMP_FORCE_NO_SCRIPTS --force-yes --fix-broken install |
- |
-# TODO: Remove these hacks when we stop having maintainer scripts altogether. |
-sudo cp -a /dev/* "${ROOT_FS_DIR}/dev" |
-sudo cp -a /etc/resolv.conf "${ROOT_FS_DIR}/etc/resolv.conf" |
-sudo ln -sf /bin/true "${ROOT_FS_DIR}/usr/sbin/invoke-rc.d" |
-sudo ln -sf /bin/true "${ROOT_FS_DIR}/usr/sbin/update-rc.d" |
- |
-# Set up mounts for working within the rootfs. We copy some basic |
-# network information from the host so that maintainer scripts can |
-# access the network as needed. |
-# TODO: All of this rootfs mount stuff can be removed as soon as we stop |
-# running the maintainer scripts on install. |
-sudo mount -t proc proc "${ROOT_FS_DIR}/proc" |
-trap cleanup_rootfs_mounts EXIT |
- |
-filter_pkgs() { |
- pkglist="$1" |
- arch="$2" |
- |
- # to read list of package + version skipping empty lines and comments, and |
- # convert "foo 1.2-3" to "foo=1.2-3", use: |
- #pkgs="$(grep '^[^#]' "$pkglist" | cut -d ' ' -f 1-2 | sed 's/ /=/')" |
- |
- # read list of "package [optional arch list]" skipping empty lines and |
- # comments |
- grep '^[^#]' "$pkglist" | while read pkg archspec; do |
- case "$archspec" in |
- ""|"[$arch "*|"[$arch]"|*" $arch]") |
- echo "$pkg" |
- ;; |
- *"!$arch "*|*"!$arch]") |
- : |
- ;; |
- "["*"!"*"]") |
- echo "$pkg" |
- ;; |
- esac |
- done |
-} |
- |
-# Install packages from the given package-lists |
-PACKAGE_LISTS=$(echo "$FLAGS_package_list" | sed -e 's/,/ /g') |
-PKG_LIST_ARCH="$FLAGS_arch" |
-if [ "$PKG_LIST_ARCH" = "x86" ]; then |
- PKG_LIST_ARCH="i386" |
- FORCE_NO_SCRIPTS="" |
-else |
- # For armel we forcefully disable all maintainer scripts. |
- # TODO: Remove this when everything is whitelisted for all build variants. |
- FORCE_NO_SCRIPTS="-o=DPkg::options::=--nodpkg_fallback" |
-fi |
-for p in $PACKAGE_LISTS; do |
- COMPONENTS=$(filter_pkgs "$p" "$PKG_LIST_ARCH") |
- sudo APT_CONFIG="$APT_CONFIG" DEBIAN_FRONTEND=noninteractive \ |
- ARCH="$FLAGS_arch" \ |
- apt-get $FORCE_NO_SCRIPTS --force-yes install $COMPONENTS |
-done |
- |
-# Create kernel installation configuration to suppress warnings, |
-# install the kernel in /boot, and manage symlinks. |
-cat <<EOF | sudo dd of="${ROOT_FS_DIR}/etc/kernel-img.conf" |
-link_in_boot = yes |
-do_symlinks = yes |
-minimal_swap = yes |
-clobber_modules = yes |
-warn_reboot = no |
-do_bootloader = no |
-do_initrd = yes |
-warn_initrd = no |
-EOF |
- |
-# Install the kernel. |
-# TODO: Support for armel kernels. |
-if [ "$FLAGS_arch" = "x86" ]; then |
- sudo APT_CONFIG="$APT_CONFIG" DEBIAN_FRONTEND=noninteractive ARCH="$FLAGS_arch"\ |
- apt-get --force-yes install "linux-image-${KERNEL_VERSION}" |
-fi |
- |
-# Install optionally present rootfs static data. This can be used to blast |
-# custom firmware, kernel modules, etc. onto the image. |
-# TODO: Remove this hack at some point. |
-LOCAL_ASSETS="${FLAGS_build_root}/${FLAGS_arch}/local_assets" |
-OPTIONAL_ROOTFS_DATA="${LOCAL_ASSETS}/rootfs_data.tgz" |
-if [ -f "${OPTIONAL_ROOTFS_DATA}" ]; then |
- sudo tar -zxvf "${OPTIONAL_ROOTFS_DATA}" -C "${ROOT_FS_DIR}" |
-fi |
- |
-# List all packages installed so far, since these are what the local |
-# repository needs to contain. |
-# TODO: Replace with list_installed_packages.sh when it is fixed up. |
-dpkg --root="${ROOT_FS_DIR}" -l > \ |
- "${OUTPUT_DIR}/package_list_installed.txt" |
- |
-cleanup_rootfs_mounts |
-trap - EXIT |