blob: 9555f09135dc279ad9b9114994d9e3da26f049fc [file] [log] [blame]
# Copyright 2016 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.
description "Run /system/bin/sdcard in a container"
author "chromium-os-dev@chromium.org"
# This job is started via arc-boot-continue.conf.
# This job is stopped via arc-lifetime.conf.
# Unused, but to be compliant with sdcardfs upstart script.
import CONTAINER_PID
env PIDFILE=/run/arc/sdcard.pid
env ANDROID_ROOTFS_DIR=/opt/google/containers/android/rootfs/root
env ANDROID_MUTABLE_SOURCE=/opt/google/containers/android/rootfs/android-data
env SDCARD_ROOTFS_DIR=\
/opt/google/containers/arc-sdcard/mountpoints/container-root
env SDCARD_MOUNT_DIR=/run/arc/sdcard
env ROOT_UID=655360
env SDCARD_UID=656383
script
{
echo "Start arc-sdcard"
set -x
# Note: $SDCARD_MOUNT_DIR/... and $ANDROID_MUTABLE_SOURCE/data/...
# (including /data/media) should have been properly initialized.
# Clean up a stale pid file if exists.
rm -f $PIDFILE
# Start constructing minijail0 args...
args=""
# Pivot root.
args="$args -P $SDCARD_ROOTFS_DIR"
# Enter a new network namespace.
args="$args -e"
# Enter a new PID namespace.
args="$args -p"
# Enter a new mount namespace.
args="$args -v"
# Enter a new IPC namespace.
args="$args -l"
# Disable PRIVATE marking for all mount points.
args="$args -K"
# Use Android alt-syscall table.
args="$args -a android"
# Create PID file at $PIDFILE.
args="$args -f $PIDFILE"
# Here after, set up mount points. First, set up private mount points.
args="$args -k proc,/proc,proc,0xe" # nosuid,nodev,noexec
args="$args -b $ANDROID_ROOTFS_DIR/system/bin/sdcard,/system/bin/sdcard"
args="$args -b $ANDROID_MUTABLE_SOURCE/data,/data,1"
args="$args -b /home/chronos/user/Downloads,/Downloads,1"
# Mark PRIVATE recursively under (pivot) root, in order not to expose
# shared mount points accidentally.
args="$args -k none,/,none,0x44000" # rec,private
# Mount shared mount points.
args="$args -b $SDCARD_MOUNT_DIR,/mnt/runtime,1"
# Remount to make it writable.
args="$args -k none,/mnt/runtime,none,0x2e" # remount,nosuid,nodev,noexec
# Above mount points work confuses the binary path detection in
# libminijail. Explicitly declare /system/bin/sdcard is a static binary.
args="$args -T static"
# Finally, specify the command line arguments.
args="$args -- /system/bin/sdcard -u $SDCARD_UID -g $SDCARD_UID \
-m -w /data/media emulated"
# Unlike other services, redirect to logger.
# sdcard is maintained in Android repository, and uses stdio for logging.
exec capsh --drop=CAP_BLOCK_SUSPEND,CAP_WAKE_ALARM,CAP_SYS_BOOT \
-- -c "minijail0 $args"
} 2>&1 | logger -t "${UPSTART_JOB}"
end script
post-stop exec /usr/sbin/arc-setup --mode=unmount-sdcard \
"--log_tag=${UPSTART_JOB}"