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 |