Index: src/scripts/customize_rootfs.sh |
diff --git a/src/scripts/customize_rootfs.sh b/src/scripts/customize_rootfs.sh |
index 1f1e6b787f21dcc85ac8144d9684d2a23d5c11cd..523d261274b558546668edda2f18e151bf7b184a 100755 |
--- a/src/scripts/customize_rootfs.sh |
+++ b/src/scripts/customize_rootfs.sh |
@@ -1,33 +1,53 @@ |
-#!/bin/sh |
+#!/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. |
-# Customizes the root file system of a chromium-based os. |
+# Script to customize the root file system after packages have been installed. |
+# |
# NOTE: This script should be called by build_image.sh. Do not run this |
# on your own unless you know what you are doing. |
-set -e |
+# 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 |
+ |
+# Flags |
+DEFINE_string target "x86" \ |
+ "The target architecture to build for. One of { x86, arm }." |
+DEFINE_string root "" \ |
+ "The root file system to customize." |
+ |
+# Parse command line |
+FLAGS "$@" || exit 1 |
+eval set -- "${FLAGS_ARGV}" |
-SETUP_DIR=$(dirname $0) |
+# Die on any errors. |
+set -e |
-# Read options from the config file created by build_image.sh. |
-echo "Reading options..." |
-cat "${SETUP_DIR}/customize_opts.sh" |
-. "${SETUP_DIR}/customize_opts.sh" |
+ROOT_FS_DIR="$FLAGS_root" |
+if [[ -z "$ROOT_FS_DIR" ]]; then |
+ echo "Error: --root is required." |
+ exit 1 |
+fi |
+if [[ ! -d "$ROOT_FS_DIR" ]]; then |
+ echo "Error: Root FS does not exist? ($ROOT_FS_DIR)" |
+ exit 1 |
+fi |
+# Determine default user full username. |
if [ ${CHROMEOS_OFFICIAL:-0} = 1 ]; then |
FULLNAME="Google Chrome OS User" |
else |
FULLNAME="Chromium OS User" |
fi |
-USERNAME="chronos" |
-ADMIN_GROUP="admin" |
-DEFGROUPS="adm,dialout,cdrom,floppy,audio,dip,video" |
-ADMIN_USERNAME="chronosdev" |
-CRYPTED_PASSWD_FILE="/trunk/src/scripts/shared_user_passwd.txt" |
+# Determine what password to use for the default user. |
+CRYPTED_PASSWD_FILE="${SCRIPTS_DIR}/shared_user_passwd.txt" |
if [ -f $CRYPTED_PASSWD_FILE ]; then |
echo "Using password from $CRYPTED_PASSWD_FILE" |
CRYPTED_PASSWD=$(cat $CRYPTED_PASSWD_FILE) |
@@ -39,11 +59,33 @@ else |
PASSWORD="gone now" |
fi |
+# Set up a default user and add to sudo and the required groups. |
+USERNAME="chronos" |
+SHELL="/bin/sh" |
+if [[ -x "${ROOT_FS_DIR}/bin/bash" ]] ; then |
+ SHELL="/bin/bash" |
+fi |
+echo "${USERNAME}:x:1000:1000:${FULLNAME}:/home/${USERNAME}/:${SHELL}" | \ |
+ sudo dd of="${ROOT_FS_DIR}/etc/passwd" conv=notrunc oflag=append |
+echo "${USERNAME}:${CRYPTED_PASSWD}:14500:0:99999::::" | \ |
+ sudo dd of="${ROOT_FS_DIR}/etc/shadow" conv=notrunc oflag=append |
+echo "${USERNAME}:x:1000:" | \ |
+ sudo dd of="${ROOT_FS_DIR}/etc/group" conv=notrunc oflag=append |
+# TODO: Add USERNAME to adm,dialout,cdrom,floppy,audio,dip,video groups? |
+sudo mkdir -p "${ROOT_FS_DIR}/home/${USERNAME}" |
+sudo chown 1000.1000 "${ROOT_FS_DIR}/home/${USERNAME}" |
+cat <<EOF | sudo dd of="${ROOT_FS_DIR}/etc/sudoers" conv=notrunc oflag=append |
+%adm ALL=(ALL) ALL |
+$USERNAME ALL=(ALL) ALL |
+EOF |
+sudo chmod 0440 "${ROOT_FS_DIR}/etc/sudoers" |
+ |
# Set CHROMEOS_VERSION_DESCRIPTION here (uses vars set in chromeos_version.sh) |
# Was removed from chromeos_version.sh which can also be run outside of chroot |
# where CHROMEOS_REVISION is set |
-# We have to set (in build_image.sh) and use REAL_USER due to many nested |
+# We have to set (in build_image.sh) and use REAL_USER due to many nested |
# chroots which lose $USER state. |
+. "${SCRIPTS_DIR}/chromeos_version.sh" |
if [ ${CHROMEOS_OFFICIAL:-0} = 1 ]; then |
export CHROMEOS_VERSION_DESCRIPTION="${CHROMEOS_VERSION_STRING} (Official Build ${CHROMEOS_REVISION:?})" |
elif [ "$REAL_USER" = "chrome-bot" ] |
@@ -63,7 +105,7 @@ fi |
# update service. |
# TODO(skrul): Remove GOOGLE_RELEASE once Chromium is updated to look at |
# CHROMEOS_RELEASE_VERSION for UserAgent data. |
-cat <<EOF >> /etc/lsb-release |
+cat <<EOF | sudo dd of="${ROOT_FS_DIR}/etc/lsb-release" |
CHROMEOS_RELEASE_CODENAME=$CHROMEOS_VERSION_CODENAME |
CHROMEOS_RELEASE_DESCRIPTION=$CHROMEOS_VERSION_DESCRIPTION |
CHROMEOS_RELEASE_NAME=$CHROMEOS_VERSION_NAME |
@@ -76,126 +118,133 @@ EOF |
# Turn user metrics logging on for official builds only. |
if [ ${CHROMEOS_OFFICIAL:-0} -eq 1 ]; then |
- touch /etc/send_metrics |
+ sudo touch "${ROOT_FS_DIR}/etc/send_metrics" |
fi |
-# Create the admin group and a chronos user that can act as admin. |
-groupadd ${ADMIN_GROUP} |
-echo "%admin ALL=(ALL) ALL" >> /etc/sudoers |
-useradd -G "${ADMIN_GROUP},${DEFGROUPS}" -g ${ADMIN_GROUP} -s /bin/bash -m \ |
- -c "${FULLNAME}" -p ${CRYPTED_PASSWD} ${USERNAME} |
- |
# Set timezone symlink |
-rm -f /etc/localtime |
-ln -s /mnt/stateful_partition/etc/localtime /etc/localtime |
+sudo rm -f "${ROOT_FS_DIR}/etc/localtime" |
+sudo ln -s /mnt/stateful_partition/etc/localtime "${ROOT_FS_DIR}/etc/localtime" |
# make a mountpoint for stateful partition |
-sudo mkdir -p "$ROOTFS_DIR"/mnt/stateful_partition |
-sudo chmod 0755 "$ROOTFS_DIR"/mnt |
-sudo chmod 0755 "$ROOTFS_DIR"/mnt/stateful_partition |
+sudo mkdir -p "$ROOT_FS_DIR"/mnt/stateful_partition |
+sudo chmod 0755 "$ROOT_FS_DIR"/mnt |
+sudo chmod 0755 "$ROOT_FS_DIR"/mnt/stateful_partition |
# Copy everything from the rootfs_static_data directory to the corresponding |
-# place on the filesystem. Note that this step has to occur after we've |
-# installed all of the packages but before we remove the setup dir. |
-chmod -R a+rX "${SETUP_DIR}/rootfs_static_data/." |
-cp -r "${SETUP_DIR}/rootfs_static_data/common/." / |
+# place on the filesystem. Note that this step has to occur after we've |
+# installed all of the packages. |
+TMP_STATIC=$(mktemp -d) |
+sudo cp -r "${SRC_ROOT}/rootfs_static_data/common/." "$TMP_STATIC" |
# TODO: Copy additional target-platform-specific subdirectories. |
+sudo chmod -R a+rX "$TMP_STATIC/." |
+sudo cp -r "$TMP_STATIC/." "$ROOT_FS_DIR" |
+sudo rm -rf "$TMP_STATIC" |
# Fix issue where alsa-base (dependency of alsa-utils) is messing up our sound |
# drivers. The stock modprobe settings worked fine. |
# TODO: Revisit when we have decided on how sound will work on chromeos. |
-rm /etc/modprobe.d/alsa-base.conf |
+sudo rm "${ROOT_FS_DIR}/etc/modprobe.d/alsa-base.conf" |
# Remove unneeded fonts. |
-rm -rf /usr/share/fonts/X11 |
+sudo rm -rf "${ROOT_FS_DIR}/usr/share/fonts/X11" |
# The udev daemon takes a long time to start up and settle so we defer it until |
# after X11 has been started. In order to be able to mount the root file system |
# and start X we pre-populate some devices. These are copied into /dev by the |
# chromeos_startup script. |
-UDEV_DEVICES=/lib/udev/devices |
-mkdir "$UDEV_DEVICES"/dri |
-mkdir "$UDEV_DEVICES"/input |
-mknod --mode=0600 "$UDEV_DEVICES"/initctl p |
-mknod --mode=0660 "$UDEV_DEVICES"/tty0 c 4 0 |
-mknod --mode=0660 "$UDEV_DEVICES"/tty1 c 4 1 |
-mknod --mode=0660 "$UDEV_DEVICES"/tty2 c 4 2 |
-mknod --mode=0666 "$UDEV_DEVICES"/tty c 5 0 |
-mknod --mode=0666 "$UDEV_DEVICES"/ptmx c 5 2 |
-mknod --mode=0640 "$UDEV_DEVICES"/mem c 1 1 |
-mknod --mode=0666 "$UDEV_DEVICES"/zero c 1 5 |
-mknod --mode=0666 "$UDEV_DEVICES"/random c 1 8 |
-mknod --mode=0666 "$UDEV_DEVICES"/urandom c 1 9 |
-mknod --mode=0660 "$UDEV_DEVICES"/sda b 8 0 |
-mknod --mode=0660 "$UDEV_DEVICES"/sda1 b 8 1 |
-mknod --mode=0660 "$UDEV_DEVICES"/sda2 b 8 2 |
-mknod --mode=0660 "$UDEV_DEVICES"/sda3 b 8 3 |
-mknod --mode=0660 "$UDEV_DEVICES"/sda4 b 8 4 |
-mknod --mode=0660 "$UDEV_DEVICES"/sdb b 8 16 |
-mknod --mode=0660 "$UDEV_DEVICES"/sdb1 b 8 17 |
-mknod --mode=0660 "$UDEV_DEVICES"/sdb2 b 8 18 |
-mknod --mode=0660 "$UDEV_DEVICES"/sdb3 b 8 19 |
-mknod --mode=0660 "$UDEV_DEVICES"/sdb4 b 8 20 |
-mknod --mode=0660 "$UDEV_DEVICES"/fb0 c 29 0 |
-mknod --mode=0660 "$UDEV_DEVICES"/dri/card0 c 226 0 |
-mknod --mode=0640 "$UDEV_DEVICES"/input/mouse0 c 13 32 |
-mknod --mode=0640 "$UDEV_DEVICES"/input/mice c 13 63 |
-mknod --mode=0640 "$UDEV_DEVICES"/input/event0 c 13 64 |
-mknod --mode=0640 "$UDEV_DEVICES"/input/event1 c 13 65 |
-mknod --mode=0640 "$UDEV_DEVICES"/input/event2 c 13 66 |
-mknod --mode=0640 "$UDEV_DEVICES"/input/event3 c 13 67 |
-mknod --mode=0640 "$UDEV_DEVICES"/input/event4 c 13 68 |
-mknod --mode=0640 "$UDEV_DEVICES"/input/event5 c 13 69 |
-mknod --mode=0640 "$UDEV_DEVICES"/input/event6 c 13 70 |
-mknod --mode=0640 "$UDEV_DEVICES"/input/event7 c 13 71 |
-mknod --mode=0640 "$UDEV_DEVICES"/input/event8 c 13 72 |
-chown root.tty "$UDEV_DEVICES"/tty* |
-chown root.kmem "$UDEV_DEVICES"/mem |
-chown root.disk "$UDEV_DEVICES"/sda* |
-chown root.video "$UDEV_DEVICES"/fb0 |
-chown root.video "$UDEV_DEVICES"/dri/card0 |
-chmod 0666 "$UDEV_DEVICES"/null # Fix misconfiguration of /dev/null |
+# TODO: There is no good reason to put this in /lib/udev/devices. Move it. |
+# TODO: Hopefully some of this can be taken care of by devtmpfs. |
+UDEV_DEVICES="${ROOT_FS_DIR}/lib/udev/devices" |
+sudo mkdir -p "$UDEV_DEVICES"/dri |
+sudo mkdir -p "$UDEV_DEVICES"/input |
+sudo mkdir -p "$UDEV_DEVICES"/pts |
+sudo mkdir -p "$UDEV_DEVICES"/shm |
+sudo ln -sf /proc/self/fd/0 "$UDEV_DEVICES"/stdin |
+sudo ln -sf /proc/self/fd/0 "$UDEV_DEVICES"/stdout |
+sudo ln -sf /proc/self/fd/0 "$UDEV_DEVICES"/stderr |
+sudo mknod --mode=0600 "$UDEV_DEVICES"/initctl p |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/tty0 c 4 0 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/tty1 c 4 1 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/tty2 c 4 2 |
+sudo mknod --mode=0666 "$UDEV_DEVICES"/tty c 5 0 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/ttyMSM2 c 252 2 |
+if [ ! -c "$UDEV_DEVICES"/console ]; then |
+ sudo mknod --mode=0600 "$UDEV_DEVICES"/console c 5 1 |
+fi |
+sudo mknod --mode=0666 "$UDEV_DEVICES"/ptmx c 5 2 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/mem c 1 1 |
+if [ ! -c "$UDEV_DEVICES"/null ]; then |
+ sudo mknod --mode=0666 "$UDEV_DEVICES"/null c 1 3 |
+fi |
+sudo mknod --mode=0666 "$UDEV_DEVICES"/zero c 1 5 |
+sudo mknod --mode=0666 "$UDEV_DEVICES"/random c 1 8 |
+sudo mknod --mode=0666 "$UDEV_DEVICES"/urandom c 1 9 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/sda b 8 0 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/sda1 b 8 1 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/sda2 b 8 2 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/sda3 b 8 3 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/sda4 b 8 4 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/sdb b 8 16 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/sdb1 b 8 17 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/sdb2 b 8 18 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/sdb3 b 8 19 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/sdb4 b 8 20 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/fb0 c 29 0 |
+sudo mknod --mode=0660 "$UDEV_DEVICES"/dri/card0 c 226 0 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/input/mouse0 c 13 32 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/input/mice c 13 63 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/input/event0 c 13 64 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/input/event1 c 13 65 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/input/event2 c 13 66 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/input/event3 c 13 67 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/input/event4 c 13 68 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/input/event5 c 13 69 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/input/event6 c 13 70 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/input/event7 c 13 71 |
+sudo mknod --mode=0640 "$UDEV_DEVICES"/input/event8 c 13 72 |
+sudo chown root.tty "$UDEV_DEVICES"/tty* |
+sudo chown root.kmem "$UDEV_DEVICES"/mem |
+sudo chown root.disk "$UDEV_DEVICES"/sda* |
+sudo chown root.video "$UDEV_DEVICES"/fb0 |
+sudo chown root.video "$UDEV_DEVICES"/dri/card0 |
+sudo chmod 0666 "$UDEV_DEVICES"/null # Fix misconfiguration of /dev/null |
# Since we may mount read-only, our mtab should symlink to /proc |
-ln -sf /proc/mounts /etc/mtab |
+sudo ln -sf /proc/mounts "${ROOT_FS_DIR}/etc/mtab" |
# For the most part, we use our own set of Upstart jobs that were installed |
# in /etc/init.chromeos so as not to mingle with jobs installed by various |
# packages. We fix that up now. |
-cp /etc/init/tty2.conf /etc/init.chromeos |
-rm -rf /etc/init |
-mv /etc/init.chromeos /etc/init |
+sudo cp "${ROOT_FS_DIR}/etc/init/tty2.conf" "${ROOT_FS_DIR}/etc/init.chromeos" |
+sudo rm -rf "${ROOT_FS_DIR}/etc/init" |
+sudo mv "${ROOT_FS_DIR}/etc/init.chromeos" "${ROOT_FS_DIR}/etc/init" |
# By default, xkb writes computed configuration data to |
# /var/lib/xkb. It can re-use this data to reduce startup |
# time. In addition, if it fails to write we've observed |
# keyboard issues. We add a symlink to allow these writes. |
-rm -rf /var/lib/xkb |
-ln -s /var/cache /var/lib/xkb |
+sudo rm -rf "${ROOT_FS_DIR}/var/lib/xkb" |
+sudo ln -s /var/cache "${ROOT_FS_DIR}/var/lib/xkb" |
# This is needed so that devicekit-disks has a place to |
# put its sql lite database. Since we do not need to |
# retain this information across boots, we are just |
# putting it in /var/tmp |
-rm -rf /var/lib/DeviceKit-disks |
-ln -s /var/tmp /var/lib/DeviceKit-disks |
+sudo rm -rf "${ROOT_FS_DIR}/var/lib/DeviceKit-disks" |
+sudo ln -s /var/tmp "${ROOT_FS_DIR}/var/lib/DeviceKit-disks" |
# Remove pam-mount's default entry in common-auth and common-session |
-sed -i 's/^\(.*pam_mount.so.*\)/#\1/g' /etc/pam.d/common-* |
- |
-# List all packages still installed post-pruning |
-sudo sh -c "/trunk/src/scripts/list_installed_packages.sh \ |
- > /etc/package_list_pruned.txt" |
+sudo sed -i 's/^\(.*pam_mount.so.*\)/#\1/g' "${ROOT_FS_DIR}"/etc/pam.d/common-* |
# Clear the network settings. This must be done last, since it prevents |
# any subsequent steps from accessing the network. |
-cat <<EOF > /etc/network/interfaces |
+cat <<EOF | sudo dd of="${ROOT_FS_DIR}/etc/network/interfaces" |
auto lo |
iface lo inet loopback |
EOF |
-cat <<EOF > /etc/resolv.conf |
+cat <<EOF | sudo dd of="${ROOT_FS_DIR}/etc/resolv.conf" |
# Use the connman dns proxy. |
nameserver 127.0.0.1 |
EOF |
-chmod a-wx /etc/resolv.conf |
+sudo chmod a-wx "${ROOT_FS_DIR}/etc/resolv.conf" |