aboutsummaryrefslogtreecommitdiff
path: root/init.d/devfs.in
blob: 0cc3ba0334cbec31b826d3b01e59df9475101862 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!@SBINDIR@/openrc-run
# Copyright (c) 2007-2015 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/HEAD/AUTHORS
#
# This file is part of OpenRC. It is subject to the license terms in
# the LICENSE file found in the top-level directory of this
# distribution and at https://github.com/OpenRC/openrc/blob/HEAD/LICENSE
# This file may not be copied, modified, propagated, or distributed
# except according to the terms contained in the LICENSE file.

description="Set up the /dev directory"

depend()
{
	provide dev-mount
	before dev
	keyword -docker -prefix -systemd-nspawn -vserver
}

mount_dev()
{
	local action conf_d_dir devfstype msg mountopts
	action=--mount
	conf_d_dir="${RC_SERVICE%/*/*}/conf.d"
	msg=Mounting
	# Some devices require exec, https://bugs.gentoo.org/92921
	# Users with such requirements can use an fstab entry for /dev
	mountopts="noexec,nosuid,mode=0755"
	if yesno ${skip_mount_dev:-no} ; then
		einfo "/dev will not be mounted due to user request"
		return 0
	fi
	if mountinfo -q /dev; then
		action=--remount
		mountopts="remount,$mountopts"
		msg=Remounting
	fi
	if fstabinfo -q /dev; then
		ebegin "$msg /dev according to fstab"
		fstabinfo -q $action /dev
		eend $?
		return 0
	fi
	if grep -q devtmpfs /proc/filesystems; then
		devfstype=devtmpfs
		mountopts="$mountopts,size=10M"
	elif grep -q tmpfs /proc/filesystems; then
		devfstype=tmpfs
		mountopts="$mountopts,size=10M"
	fi
	if [ -n "$devfstype" ]; then
		ebegin "$msg $devfstype on /dev"
		mount -n -t $devfstype -o $mountopts dev /dev
		eend $?
	else
		ewarn "This kernel does not have devtmpfs or tmpfs support, and there"
		ewarn "is no entry for /dev in fstab."
		ewarn "This means /dev will not be mounted."
		ewarn "To avoid this message, set CONFIG_DEVTMPFS or CONFIG_TMPFS to y"
		ewarn "in your kernel configuration or see ${conf_d_dir}/${RC_SVCNAME}"
	fi
	return 0
}

seed_dev()
{
	# Seed /dev with some things that we know we need

	if [ "${RC_SYS}" != LXC ]; then
		# creating /dev/console, /dev/tty and /dev/tty1 to be able to write
		# to $CONSOLE with/without bootsplash before udevd creates it
		[ -c /dev/console ] || mknod -m 600 /dev/console c 5 1
		[ -c /dev/tty1 ] || mknod -m 620 /dev/tty1 c 4 1
		[ -c /dev/tty ] || mknod -m 666 /dev/tty c 5 0

		# udevd will dup its stdin/stdout/stderr to /dev/null
		# and we do not want a file which gets buffered in ram
		[ -c /dev/null ] || mknod -m 666 /dev/null c 1 3

		# so udev can add its start-message to dmesg
		[ -c /dev/kmsg ] || mknod -m 660 /dev/kmsg c 1 11
	fi

	# extra symbolic links not provided by default
	[ -e /dev/fd ] || ln -snf /proc/self/fd /dev/fd
	[ -e /dev/stdin ] || ln -snf /proc/self/fd/0 /dev/stdin
	[ -e /dev/stdout ] || ln -snf /proc/self/fd/1 /dev/stdout
	[ -e /dev/stderr ] || ln -snf /proc/self/fd/2 /dev/stderr
	[ -e /proc/kcore ] && ln -snf /proc/kcore /dev/core

	# Mount required directories as user may not have them in /etc/fstab
	for x in \
		"mqueue /dev/mqueue 1777 ,nodev mqueue" \
		"devpts /dev/pts 0755 ,gid=5,mode=0620 devpts" \
		"tmpfs /dev/shm 1777 ,nodev,mode=1777 shm" \
	; do
		set -- $x
		grep -Eq "[[:space:]]+$1$" /proc/filesystems || continue
		mountinfo -q $2 && continue

		if [ ! -d $2 ]; then
			mkdir -m $3 -p $2 >/dev/null 2>&1 || \
				ewarn "Could not create $2!"
		fi

		if [ -d $2 ]; then
			ebegin "Mounting $2"
			if ! fstabinfo --mount $2; then
				mount -n -t $1 -o noexec,nosuid$4 $5 $2
			fi
			eend $?
		fi
	done
}

restorecon_dev()
{
	if [ -x /sbin/restorecon ]; then
		ebegin "Restoring SELinux contexts in /dev"
		restorecon -rF /dev >/dev/null 2>&1
		eend $?
	fi

	return 0
}

start()
{
	mount_dev
	seed_dev
	restorecon_dev
	return 0
}