summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Luttringer <seblu@seblu.net>2012-03-12 22:41:11 +0100
committerSébastien Luttringer <seblu@seblu.net>2012-03-13 12:32:42 +0100
commit788daea5db4445f02fc156132f00829e1107dc6f (patch)
tree37487c54360633dea45035046a7af1793f1ebb99
parent299c22ad5c124cb62e1ba35447440947fe4afb37 (diff)
Support additional binary formats at boot
This patch mount kernel binfmt_misc filesystem at boot and allow loading of a default configuration inspired from systemd binfmt.d way. Signed-off-by: Sébastien Luttringer <seblu@seblu.net>
-rw-r--r--Makefile4
-rwxr-xr-xarch-binfmt36
-rwxr-xr-xrc.multi3
-rwxr-xr-xrc.sysinit5
4 files changed, 46 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index 3e83e58..2cc6867 100644
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,8 @@ DIRS := \
/usr/sbin \
/etc/tmpfiles.d \
/usr/lib/tmpfiles.d \
+ /etc/binfmt.d \
+ /usr/lib/binfmt.d \
/etc/sysctl.d \
/usr/lib/sysctl.d \
/usr/lib/initscripts \
@@ -31,7 +33,7 @@ install: installdirs doc
install -m755 -t $(DESTDIR)/usr/sbin rc.d
install -m644 -t ${DESTDIR}/usr/share/man/man8 rc.d.8
install -m644 -t ${DESTDIR}/usr/share/man/man5 rc.conf.5 locale.conf.5 vconsole.conf.5 hostname.5
- install -m755 -t $(DESTDIR)/usr/lib/initscripts arch-tmpfiles arch-sysctl
+ install -m755 -t $(DESTDIR)/usr/lib/initscripts arch-tmpfiles arch-sysctl arch-binfmt
install -m644 tmpfiles.conf $(DESTDIR)/usr/lib/tmpfiles.d/arch.conf
install -m644 -T bash-completion $(DESTDIR)/etc/bash_completion.d/rc.d
install -m644 -T zsh-completion $(DESTDIR)/usr/share/zsh/site-functions/_rc.d
diff --git a/arch-binfmt b/arch-binfmt
new file mode 100755
index 0000000..6931843
--- /dev/null
+++ b/arch-binfmt
@@ -0,0 +1,36 @@
+#!/bin/bash
+#
+# /usr/lib/initscripts/arch-binfmt
+#
+# Configure additional binary formats at boot
+#
+
+shopt -s nullglob
+
+declare -a binfmt_d=(
+ /usr/lib/binfmt.d/*.conf
+ /etc/binfmt.d/*.conf
+ /run/binfmt.d/*.conf
+)
+declare -A fragments
+
+# check binfmt_misc filesystem is mounted
+mountpoint -q /proc/sys/fs/binfmt_misc ||
+ { echo "/proc/sys/fs/binfmt_misc is not mounted"; exit 1;}
+
+# files declared later in the sysctl_d array will override earlier
+# Example: `/etc/sysctl.d/foo.conf' supersedes `/usr/lib/sysctl.d/foo.conf'.
+for path in "${@:-${binfmt_d[@]}}"; do
+ [[ -f $path ]] && fragments[${path##*/}]=$path
+done
+
+for path in "${fragments[@]}"; do
+ while read -r line; do
+ [[ ${line:0:1} == '#' ]] && continue
+ printf "%s" "$line" > /proc/sys/fs/binfmt_misc/register
+ done < "$path"
+done
+
+:
+
+# vim: set ts=2 sw=2 noet:
diff --git a/rc.multi b/rc.multi
index 19623d8..20ed9bc 100755
--- a/rc.multi
+++ b/rc.multi
@@ -11,6 +11,9 @@ run_hook multi_start
# Load sysctl config files
[[ -x /usr/lib/initscripts/arch-sysctl ]] && /usr/lib/initscripts/arch-sysctl
+# Load additional binary formats
+[[ -x /usr/lib/initscripts/arch-binfmt ]] && /usr/lib/initscripts/arch-binfmt
+
# Start daemons
for daemon in "${DAEMONS[@]}"; do
case ${daemon:0:1} in
diff --git a/rc.sysinit b/rc.sysinit
index b38d350..9880995 100755
--- a/rc.sysinit
+++ b/rc.sysinit
@@ -11,8 +11,11 @@ printhl "Arch Linux\n"
printhl "${C_H2}http://www.archlinux.org"
printsep
-# mount /proc, /sys, /run, /dev, /run/lock, /dev/pts, /dev/shm (the api filesystems)
+# mount the api filesystems
+# /proc, /proc/sys/fs/binfmt_misc, /sys, /run, /dev, /run/lock, /dev/pts, /dev/shm
mountpoint -q /proc || mount -t proc proc /proc -o nosuid,noexec,nodev
+mountpoint -q /proc/sys/fs/binfmt_misc ||
+ mount -t binfmt_misc binfmt /proc/sys/fs/binfmt_misc
mountpoint -q /sys || mount -t sysfs sys /sys -o nosuid,noexec,nodev
mountpoint -q /run || mount -t tmpfs run /run -o mode=0755,nosuid,nodev
mountpoint -q /dev || mount -t devtmpfs dev /dev -o mode=0755,nosuid