blob: 1ba5e0e6d6b95d7da68a5e8c82868a27a23871bf [file] [log] [blame]
# Copyright (c) 2011 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.
# cros-disks upstart job
env CROS_DISKS_OPTS=''
# Set the default polling interval in milliseconds on block devices.
# This in-kernel polling mechanism is available since kernel 2.6.38.
# The poll timer slack is set to 25% in kernel (linux/block/genhd.c).
# With a polling interval <= 1 second, the system seems to react to
# eject requests from a CD-ROM drive more responsively.
env BLOCK_DEFAULT_POLL_MSECS=1000
env BLOCK_DEFAULT_POLL_MSECS_SYSFS_PATH=/sys/module/block/parameters/events_dfl_poll_msecs
# Minimum log level defined in base/logging.h.
# 0:INFO, 1:WARNING, 2:ERROR, 3:ERROR_REPORT, 4:FATAL
# -1:VLOG(1), -2:VLOG(2), etc
# Set to log only INFO or above by default.
env CROS_DISKS_LOG_LEVEL=1
# Importing the TZ environment variable to allow the time zone to be changed
# for tests.
import TZ
start on starting system-services
stop on stopping system-services
pre-start script
# The TZ variable is only allowed to exist in test builds for running
# autotests. The existence, even if set to empty, of TZ interferes with the
# regular functioning of the system timezone.
if crossystem "cros_debug?0" && [ -n "${TZ+set}" ]; then
logger -t "${UPSTART_JOB}" "TZ variable set in non-debug mode"
exit 1
fi
# Set default polling interval on block devices.
# This only affects block devices with removable media, which do not
# support asynchronous media change/eject events.
if [ -f "${BLOCK_DEFAULT_POLL_MSECS_SYSFS_PATH}" ]; then
echo "${BLOCK_DEFAULT_POLL_MSECS}" > "${BLOCK_DEFAULT_POLL_MSECS_SYSFS_PATH}"
fi
# Load the FUSE module, which is used by various FUSE mounters.
# cros-disks should still run even if the FUSE module fails to load.
logger -t "${UPSTART_JOB}" "Loading FUSE module"
modprobe fuse || logger -t "${UPSTART_JOB}" "Failed to load FUSE module"
# /run/fuse is used to hold temporary directories for individual
# FUSE mount helpers invocations.
dirs="/run/fuse"
mkdir -p ${dirs}
chown cros-disks:cros-disks ${dirs}
chmod 0775 ${dirs}
end script
post-stop script
if [ -f "${BLOCK_DEFAULT_POLL_MSECS_SYSFS_PATH}" ]; then
# Disable default polling on block devices.
echo 0 > "${BLOCK_DEFAULT_POLL_MSECS_SYSFS_PATH}"
fi
end script
respawn
expect fork
# Run cros-disks under Minijail as follows:
# - Enter new IPC (-l) namespace.
#
# - Remain in the original network namespace in order to join to the system
# DBus.
#
# - Remain in the original cgroup namespace as it isn't supported on systems
# running kernel 3.8. TODO(benchan): Put cros-disks in new cgroup namespace
# once all systems support it.
#
# - Temporarily skip new mount (-v) and PID (-p) namespace as cros-disks
# needs to access /home/user/<hash> for archive support, which isn't
# accessible inside a new mount namespace. TODO(benchan): Put cros-disks in
# new mount and PID namespace after archive support in cros-disks is
# deprecated (chromium:707327).
#
# - To let upstart track the cros-disks process properly according to the
# 'expect fork' stanza, Minijail exits immediately after fork (-i) while
# cros-disks stays in foreground (--foreground) without daemonizing itself.
#
# - Use -K to prevent Minijail from remounting the shared mount at /media as
# private.
# TODO(benchan): Remove -K once Minijail provides a finer control over
# what should be remounted private and what can remain shared (b:62056108).
#
# - Do not lock SECBIT_KEEP_CAPS (-B 0x20) such that nested minijail invocations
# can enable the bit again to pass capabilities.
#
exec minijail0 -u cros-disks -g cros-disks -G \
-c cap_chown,cap_setgid,cap_setuid,cap_sys_admin,cap_sys_chroot,cap_mknod,cap_setpcap=e \
--ambient -B 0x20 \
-i -l -n \
-- /usr/bin/cros-disks --foreground \
--log_level="${CROS_DISKS_LOG_LEVEL}" ${CROS_DISKS_OPTS}