mirror of
https://github.com/opnsense/src.git
synced 2026-02-21 00:40:33 -05:00
Currently, if the linux service is run twice, mount(8) fails with:
mount: linprocfs: Device busy
mount: linsysfs: Device busy
mount: devfs: Device busy
mount: fdescfs: Device busy
mount: tmpfs: Device busy
It is a bit more user-friendly if before running mount(8) the service
checks if there are any file systems left to be mounted. This patch
implements this behavior.
Also, while here, create mount points directories (as suggested by
otis).
Reviewed by: trasz
Approved by: trasz (src)
Differential Revision: https://reviews.freebsd.org/D32463
85 lines
1.9 KiB
Bash
Executable file
85 lines
1.9 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# $FreeBSD$
|
|
#
|
|
|
|
# PROVIDE: linux
|
|
# REQUIRE: kldxref zfs
|
|
# KEYWORD: nojail
|
|
|
|
. /etc/rc.subr
|
|
|
|
name="linux"
|
|
desc="Enable Linux ABI"
|
|
rcvar="linux_enable"
|
|
start_cmd="${name}_start"
|
|
stop_cmd=":"
|
|
|
|
linux_mount() {
|
|
local _fs _mount_point
|
|
_fs="$1"
|
|
_mount_point="$2"
|
|
shift 2
|
|
if ! mount | grep -q "^$_fs on $_mount_point ("; then
|
|
mkdir -p "$_mount_point"
|
|
mount "$@" -t "$_fs" "$_fs" "$_mount_point"
|
|
fi
|
|
}
|
|
|
|
linux_start()
|
|
{
|
|
local _emul_path _tmpdir
|
|
|
|
case `sysctl -n hw.machine_arch` in
|
|
aarch64)
|
|
load_kld -e 'linux64elf' linux64
|
|
;;
|
|
amd64)
|
|
load_kld -e 'linuxelf' linux
|
|
load_kld -e 'linux64elf' linux64
|
|
;;
|
|
i386)
|
|
load_kld -e 'linuxelf' linux
|
|
;;
|
|
esac
|
|
|
|
_emul_path="$(sysctl -n compat.linux.emul_path)"
|
|
|
|
if [ -x ${_emul_path}/sbin/ldconfigDisabled ]; then
|
|
_tmpdir=`mktemp -d -t linux-ldconfig`
|
|
${_emul_path}/sbin/ldconfig -C ${_tmpdir}/ld.so.cache
|
|
if ! cmp -s ${_tmpdir}/ld.so.cache ${_emul_path}/etc/ld.so.cache; then
|
|
cat ${_tmpdir}/ld.so.cache > ${_emul_path}/etc/ld.so.cache
|
|
fi
|
|
rm -rf ${_tmpdir}
|
|
fi
|
|
|
|
# Linux uses the pre-pts(4) tty naming scheme.
|
|
load_kld pty
|
|
|
|
# Explicitly load the filesystem modules; they are usually required,
|
|
# even with linux_mounts_enable="NO".
|
|
load_kld fdescfs
|
|
load_kld linprocfs
|
|
load_kld linsysfs
|
|
|
|
# Handle unbranded ELF executables by defaulting to ELFOSABI_LINUX.
|
|
if [ `sysctl -ni kern.elf64.fallback_brand` -eq "-1" ]; then
|
|
sysctl kern.elf64.fallback_brand=3 > /dev/null
|
|
fi
|
|
|
|
if [ `sysctl -ni kern.elf32.fallback_brand` -eq "-1" ]; then
|
|
sysctl kern.elf32.fallback_brand=3 > /dev/null
|
|
fi
|
|
|
|
if checkyesno linux_mounts_enable; then
|
|
linux_mount linprocfs "${_emul_path}/proc" -o nocover
|
|
linux_mount linsysfs "${_emul_path}/sys" -o nocover
|
|
linux_mount devfs "${_emul_path}/dev" -o nocover
|
|
linux_mount fdescfs "${_emul_path}/dev/fd" -o nocover,linrdlnk
|
|
linux_mount tmpfs "${_emul_path}/dev/shm" -o nocover,mode=1777
|
|
fi
|
|
}
|
|
|
|
load_rc_config $name
|
|
run_rc_command "$1"
|