| OLD | NEW |
| (Empty) |
| 1 #!/bin/bash | |
| 2 | |
| 3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | |
| 4 # Use of this source code is governed by a BSD-style license that can be | |
| 5 # found in the LICENSE file. | |
| 6 | |
| 7 # Script to customize the root file system after packages have been installed. | |
| 8 # | |
| 9 # NOTE: This script should be called by build_image.sh. Do not run this | |
| 10 # on your own unless you know what you are doing. | |
| 11 | |
| 12 # Load common constants. This should be the first executable line. | |
| 13 # The path to common.sh should be relative to your script's location. | |
| 14 . "$(dirname "$0")/common.sh" | |
| 15 | |
| 16 # Script must be run inside the chroot | |
| 17 assert_inside_chroot | |
| 18 | |
| 19 # Flags | |
| 20 DEFINE_string arch "x86" \ | |
| 21 "The target architecture to build for. One of { x86, arm }." | |
| 22 DEFINE_string root "" \ | |
| 23 "The root file system to customize." | |
| 24 | |
| 25 # Parse command line | |
| 26 FLAGS "$@" || exit 1 | |
| 27 eval set -- "${FLAGS_ARGV}" | |
| 28 | |
| 29 # Die on any errors. | |
| 30 set -e | |
| 31 | |
| 32 ROOT_FS_DIR="$FLAGS_root" | |
| 33 if [[ -z "$ROOT_FS_DIR" ]]; then | |
| 34 echo "Error: --root is required." | |
| 35 exit 1 | |
| 36 fi | |
| 37 if [[ ! -d "$ROOT_FS_DIR" ]]; then | |
| 38 echo "Error: Root FS does not exist? ($ROOT_FS_DIR)" | |
| 39 exit 1 | |
| 40 fi | |
| 41 | |
| 42 # Determine default user full username. | |
| 43 if [ ${CHROMEOS_OFFICIAL:-0} = 1 ]; then | |
| 44 FULLNAME="Google Chrome OS User" | |
| 45 else | |
| 46 FULLNAME="Chromium OS User" | |
| 47 fi | |
| 48 | |
| 49 # Determine what password to use for the default user. | |
| 50 CRYPTED_PASSWD_FILE="${SCRIPTS_DIR}/shared_user_passwd.txt" | |
| 51 if [ -f $CRYPTED_PASSWD_FILE ]; then | |
| 52 echo "Using password from $CRYPTED_PASSWD_FILE" | |
| 53 CRYPTED_PASSWD=$(cat $CRYPTED_PASSWD_FILE) | |
| 54 else | |
| 55 # Use a random password. unix_md5_crypt will generate a random salt. | |
| 56 echo "Using random password." | |
| 57 PASSWORD="$(base64 /dev/urandom | head -1)" | |
| 58 CRYPTED_PASSWD="$(echo "$PASSWORD" | openssl passwd -1 -stdin)" | |
| 59 PASSWORD="gone now" | |
| 60 fi | |
| 61 | |
| 62 # Set up a default user and add to sudo and the required groups. | |
| 63 ADD_USER="chronos" | |
| 64 ADD_GROUPS="audio video" | |
| 65 SHELL="/bin/sh" | |
| 66 if [[ -x "${ROOT_FS_DIR}/bin/bash" ]] ; then | |
| 67 SHELL="/bin/bash" | |
| 68 fi | |
| 69 echo "${ADD_USER}:x:1000:1000:${FULLNAME}:/home/${ADD_USER}/:${SHELL}" | \ | |
| 70 sudo dd of="${ROOT_FS_DIR}/etc/passwd" conv=notrunc oflag=append | |
| 71 echo "${ADD_USER}:${CRYPTED_PASSWD}:14500:0:99999::::" | \ | |
| 72 sudo dd of="${ROOT_FS_DIR}/etc/shadow" conv=notrunc oflag=append | |
| 73 echo "${ADD_USER}:x:1000:" | \ | |
| 74 sudo dd of="${ROOT_FS_DIR}/etc/group" conv=notrunc oflag=append | |
| 75 for i in $ADD_GROUPS; do | |
| 76 sudo sed -i "s/^\($i:x:[0-9]*:.*\)/\1,${ADD_USER}/g" \ | |
| 77 "${ROOT_FS_DIR}"/etc/group | |
| 78 done | |
| 79 | |
| 80 sudo mkdir -p "${ROOT_FS_DIR}/home/${ADD_USER}" | |
| 81 sudo chown 1000.1000 "${ROOT_FS_DIR}/home/${ADD_USER}" | |
| 82 cat <<EOF | sudo dd of="${ROOT_FS_DIR}/etc/sudoers" conv=notrunc oflag=append | |
| 83 %adm ALL=(ALL) ALL | |
| 84 $ADD_USER ALL=(ALL) ALL | |
| 85 EOF | |
| 86 sudo chmod 0440 "${ROOT_FS_DIR}/etc/sudoers" | |
| 87 echo "# Allow chronos user to renice processes so that chrome will adjust tab pr
iorities" | \ | |
| 88 sudo dd of="${ROOT_FS_DIR}/etc/security/limits.conf" conv=notrunc oflag=append | |
| 89 echo "chronos hard nice 0" | \ | |
| 90 sudo dd of="${ROOT_FS_DIR}/etc/security/limits.conf" conv=notrunc oflag=append | |
| 91 | |
| 92 # Set CHROMEOS_VERSION_DESCRIPTION here (uses vars set in chromeos_version.sh) | |
| 93 # Was removed from chromeos_version.sh which can also be run outside of chroot | |
| 94 # where CHROMEOS_REVISION is set | |
| 95 # We have to set (in build_image.sh) and use REAL_USER due to many nested | |
| 96 # chroots which lose $USER state. | |
| 97 . "${SCRIPTS_DIR}/chromeos_version.sh" | |
| 98 if [ ${CHROMEOS_OFFICIAL:-0} = 1 ]; then | |
| 99 export CHROMEOS_VERSION_DESCRIPTION="${CHROMEOS_VERSION_STRING} (Official Buil
d ${CHROMEOS_REVISION:?})" | |
| 100 elif [ "$REAL_USER" = "chrome-bot" ] | |
| 101 then | |
| 102 export CHROMEOS_VERSION_DESCRIPTION="${CHROMEOS_VERSION_STRING} (Continuous Bu
ild ${CHROMEOS_REVISION:?} - Builder: ${BUILDBOT_BUILD:-"N/A"})" | |
| 103 else | |
| 104 # Use the $USER passthru via $CHROMEOS_RELEASE_CODENAME | |
| 105 export CHROMEOS_VERSION_DESCRIPTION="${CHROMEOS_VERSION_STRING} (Developer Bui
ld ${CHROMEOS_REVISION:?} - $(date) - $CHROMEOS_RELEASE_CODENAME)" | |
| 106 fi | |
| 107 | |
| 108 # Set google-specific version numbers: | |
| 109 # CHROMEOS_RELEASE_CODENAME is the codename of the release. | |
| 110 # CHROMEOS_RELEASE_DESCRIPTION is the version displayed by Chrome; see | |
| 111 # chrome/browser/chromeos/chromeos_version_loader.cc. | |
| 112 # CHROMEOS_RELEASE_NAME is a human readable name for the build. | |
| 113 # CHROMEOS_RELEASE_TRACK and CHROMEOS_RELEASE_VERSION are used by the software | |
| 114 # update service. | |
| 115 # TODO(skrul): Remove GOOGLE_RELEASE once Chromium is updated to look at | |
| 116 # CHROMEOS_RELEASE_VERSION for UserAgent data. | |
| 117 cat <<EOF | sudo dd of="${ROOT_FS_DIR}/etc/lsb-release" | |
| 118 CHROMEOS_RELEASE_CODENAME=$CHROMEOS_VERSION_CODENAME | |
| 119 CHROMEOS_RELEASE_DESCRIPTION=$CHROMEOS_VERSION_DESCRIPTION | |
| 120 CHROMEOS_RELEASE_NAME=$CHROMEOS_VERSION_NAME | |
| 121 CHROMEOS_RELEASE_TRACK=$CHROMEOS_VERSION_TRACK | |
| 122 CHROMEOS_RELEASE_VERSION=$CHROMEOS_VERSION_STRING | |
| 123 GOOGLE_RELEASE=$CHROMEOS_VERSION_STRING | |
| 124 CHROMEOS_AUSERVER=$CHROMEOS_VERSION_AUSERVER | |
| 125 CHROMEOS_DEVSERVER=$CHROMEOS_VERSION_DEVSERVER | |
| 126 EOF | |
| 127 | |
| 128 # Turn user metrics logging on for official builds only. | |
| 129 if [ ${CHROMEOS_OFFICIAL:-0} -eq 1 ]; then | |
| 130 sudo touch "${ROOT_FS_DIR}/etc/send_metrics" | |
| 131 fi | |
| 132 | |
| 133 # Set timezone symlink | |
| 134 sudo rm -f "${ROOT_FS_DIR}/etc/localtime" | |
| 135 sudo ln -s /mnt/stateful_partition/etc/localtime "${ROOT_FS_DIR}/etc/localtime" | |
| 136 | |
| 137 # make a mountpoint for stateful partition | |
| 138 sudo mkdir -p "$ROOT_FS_DIR"/mnt/stateful_partition | |
| 139 sudo chmod 0755 "$ROOT_FS_DIR"/mnt | |
| 140 sudo chmod 0755 "$ROOT_FS_DIR"/mnt/stateful_partition | |
| 141 | |
| 142 # Copy everything from the rootfs_static_data directory to the corresponding | |
| 143 # place on the filesystem. Note that this step has to occur after we've | |
| 144 # installed all of the packages. | |
| 145 TMP_STATIC=$(mktemp -d) | |
| 146 sudo cp -r "${SRC_ROOT}/rootfs_static_data/common/." "$TMP_STATIC" | |
| 147 # TODO: Copy additional arch-platform-specific subdirectories. | |
| 148 sudo chmod -R a+rX "$TMP_STATIC/." | |
| 149 sudo cp -r "$TMP_STATIC/." "$ROOT_FS_DIR" | |
| 150 sudo rm -rf "$TMP_STATIC" | |
| 151 | |
| 152 # Fix issue where alsa-base (dependency of alsa-utils) is messing up our sound | |
| 153 # drivers. The stock modprobe settings worked fine. | |
| 154 # TODO: Revisit when we have decided on how sound will work on chromeos. | |
| 155 ! sudo rm "${ROOT_FS_DIR}/etc/modprobe.d/alsa-base.conf" | |
| 156 | |
| 157 # Remove unneeded fonts. | |
| 158 sudo rm -rf "${ROOT_FS_DIR}/usr/share/fonts/X11" | |
| 159 | |
| 160 # The udev daemon takes a long time to start up and settle so we defer it until | |
| 161 # after X11 has been started. In order to be able to mount the root file system | |
| 162 # and start X we pre-populate some devices. These are copied into /dev by the | |
| 163 # chromeos_startup script. | |
| 164 # TODO: Hopefully some of this can be taken care of by devtmpfs. | |
| 165 DEVICES_DIR="${ROOT_FS_DIR}/lib/chromiumos/devices" | |
| 166 sudo mkdir -p "$DEVICES_DIR"/dri | |
| 167 sudo mkdir -p "$DEVICES_DIR"/input | |
| 168 sudo mkdir -p "$DEVICES_DIR"/pts | |
| 169 sudo mkdir -p "$DEVICES_DIR"/shm | |
| 170 sudo ln -sf /proc/self/fd "$DEVICES_DIR"/fd | |
| 171 sudo ln -sf /proc/self/fd/0 "$DEVICES_DIR"/stdin | |
| 172 sudo ln -sf /proc/self/fd/1 "$DEVICES_DIR"/stdout | |
| 173 sudo ln -sf /proc/self/fd/2 "$DEVICES_DIR"/stderr | |
| 174 sudo mknod --mode=0600 "$DEVICES_DIR"/initctl p | |
| 175 sudo mknod --mode=0640 "$DEVICES_DIR"/mem c 1 1 | |
| 176 sudo mknod --mode=0666 "$DEVICES_DIR"/null c 1 3 | |
| 177 sudo mknod --mode=0666 "$DEVICES_DIR"/zero c 1 5 | |
| 178 sudo mknod --mode=0666 "$DEVICES_DIR"/random c 1 8 | |
| 179 sudo mknod --mode=0666 "$DEVICES_DIR"/urandom c 1 9 | |
| 180 sudo mknod --mode=0660 "$DEVICES_DIR"/tty0 c 4 0 | |
| 181 sudo mknod --mode=0660 "$DEVICES_DIR"/tty1 c 4 1 | |
| 182 sudo mknod --mode=0660 "$DEVICES_DIR"/tty2 c 4 2 | |
| 183 sudo mknod --mode=0666 "$DEVICES_DIR"/tty c 5 0 | |
| 184 sudo mknod --mode=0660 "$DEVICES_DIR"/ttyMSM2 c 252 2 | |
| 185 sudo mknod --mode=0600 "$DEVICES_DIR"/console c 5 1 | |
| 186 sudo mknod --mode=0666 "$DEVICES_DIR"/ptmx c 5 2 | |
| 187 sudo mknod --mode=0666 "$DEVICES_DIR"/loop0 b 7 0 | |
| 188 sudo mknod --mode=0660 "$DEVICES_DIR"/sda b 8 0 | |
| 189 sudo mknod --mode=0660 "$DEVICES_DIR"/sda1 b 8 1 | |
| 190 sudo mknod --mode=0660 "$DEVICES_DIR"/sda2 b 8 2 | |
| 191 sudo mknod --mode=0660 "$DEVICES_DIR"/sda3 b 8 3 | |
| 192 sudo mknod --mode=0660 "$DEVICES_DIR"/sda4 b 8 4 | |
| 193 sudo mknod --mode=0660 "$DEVICES_DIR"/sdb b 8 16 | |
| 194 sudo mknod --mode=0660 "$DEVICES_DIR"/sdb1 b 8 17 | |
| 195 sudo mknod --mode=0660 "$DEVICES_DIR"/sdb2 b 8 18 | |
| 196 sudo mknod --mode=0660 "$DEVICES_DIR"/sdb3 b 8 19 | |
| 197 sudo mknod --mode=0660 "$DEVICES_DIR"/sdb4 b 8 20 | |
| 198 sudo mknod --mode=0640 "$DEVICES_DIR"/input/mouse0 c 13 32 | |
| 199 sudo mknod --mode=0640 "$DEVICES_DIR"/input/mice c 13 63 | |
| 200 sudo mknod --mode=0640 "$DEVICES_DIR"/input/event0 c 13 64 | |
| 201 sudo mknod --mode=0640 "$DEVICES_DIR"/input/event1 c 13 65 | |
| 202 sudo mknod --mode=0640 "$DEVICES_DIR"/input/event2 c 13 66 | |
| 203 sudo mknod --mode=0640 "$DEVICES_DIR"/input/event3 c 13 67 | |
| 204 sudo mknod --mode=0640 "$DEVICES_DIR"/input/event4 c 13 68 | |
| 205 sudo mknod --mode=0640 "$DEVICES_DIR"/input/event5 c 13 69 | |
| 206 sudo mknod --mode=0640 "$DEVICES_DIR"/input/event6 c 13 70 | |
| 207 sudo mknod --mode=0640 "$DEVICES_DIR"/input/event7 c 13 71 | |
| 208 sudo mknod --mode=0640 "$DEVICES_DIR"/input/event8 c 13 72 | |
| 209 sudo mknod --mode=0660 "$DEVICES_DIR"/fb0 c 29 0 | |
| 210 sudo mknod --mode=0660 "$DEVICES_DIR"/dri/card0 c 226 0 | |
| 211 sudo chown root.tty "$DEVICES_DIR"/tty* | |
| 212 sudo chown root.kmem "$DEVICES_DIR"/mem | |
| 213 sudo chown root.disk "$DEVICES_DIR"/sda* | |
| 214 sudo chown root.video "$DEVICES_DIR"/fb0 | |
| 215 sudo chown root.video "$DEVICES_DIR"/dri/card0 | |
| 216 | |
| 217 # Since we may mount read-only, our mtab should symlink to /proc | |
| 218 sudo ln -sf /proc/mounts "${ROOT_FS_DIR}/etc/mtab" | |
| 219 | |
| 220 # For the most part, we use our own set of Upstart jobs that were installed | |
| 221 # in /etc/init.chromeos so as not to mingle with jobs installed by various | |
| 222 # packages. We fix that up now. | |
| 223 sudo cp "${ROOT_FS_DIR}/etc/init/tty2.conf" "${ROOT_FS_DIR}/etc/init.chromeos" | |
| 224 sudo rm -rf "${ROOT_FS_DIR}/etc/init" | |
| 225 sudo mv "${ROOT_FS_DIR}/etc/init.chromeos" "${ROOT_FS_DIR}/etc/init" | |
| 226 | |
| 227 # By default, xkb writes computed configuration data to | |
| 228 # /var/lib/xkb. It can re-use this data to reduce startup | |
| 229 # time. In addition, if it fails to write we've observed | |
| 230 # keyboard issues. We add a symlink to allow these writes. | |
| 231 sudo rm -rf "${ROOT_FS_DIR}/var/lib/xkb" | |
| 232 sudo ln -s /var/cache "${ROOT_FS_DIR}/var/lib/xkb" | |
| 233 | |
| 234 # This is needed so that devicekit-disks has a place to | |
| 235 # put its sql lite database. Since we do not need to | |
| 236 # retain this information across boots, we are just | |
| 237 # putting it in /var/tmp | |
| 238 sudo rm -rf "${ROOT_FS_DIR}/var/lib/DeviceKit-disks" | |
| 239 sudo ln -s /var/tmp "${ROOT_FS_DIR}/var/lib/DeviceKit-disks" | |
| 240 | |
| 241 # dbus-uuidgen writes machine-id to /var/lib/dbus. | |
| 242 sudo rm -f "${ROOT_FS_DIR}/var/lib/dbus/machine-id" | |
| 243 sudo ln -s /var/cache/machine-id "${ROOT_FS_DIR}/var/lib/dbus/machine-id" | |
| 244 | |
| 245 # Remove pam-mount's default entry in common-auth and common-session | |
| 246 sudo sed -i 's/^\(.*pam_mount.so.*\)/#\1/g' "${ROOT_FS_DIR}"/etc/pam.d/common-* | |
| 247 | |
| 248 # A nice fake hostname to keep things happy. | |
| 249 echo "localhost" | sudo dd of="${ROOT_FS_DIR}/etc/hostname" | |
| 250 | |
| 251 # Clear the network settings. This must be done last, since it prevents | |
| 252 # any subsequent steps from accessing the network. | |
| 253 cat <<EOF | sudo dd of="${ROOT_FS_DIR}/etc/network/interfaces" | |
| 254 auto lo | |
| 255 iface lo inet loopback | |
| 256 EOF | |
| 257 | |
| 258 cat <<EOF | sudo dd of="${ROOT_FS_DIR}/etc/resolv.conf" | |
| 259 # Use the connman dns proxy. | |
| 260 nameserver 127.0.0.1 | |
| 261 EOF | |
| 262 sudo chmod a-wx "${ROOT_FS_DIR}/etc/resolv.conf" | |
| OLD | NEW |