[OpenWrt-Devel] [EXPERIMENTAL] [PATCH] base-files busybox: Detect LXC guest and act appropriately

John Crispin blogic at openwrt.org
Tue Feb 16 02:10:43 EST 2016


i think having lxc specific hooks sprayed over a pile a scripts is the
wrong approach, so NAK on this one.

	John


On 16/02/2016 08:03, openwrt at daniel.thecshore.com wrote:
> From: Daniel Dickinson <openwrt at daniel.thecshore.com>
> 
> I have a patch that it will be some time before I personally will have some time
> to test but have noted that there are others interested in LXC on OpenWrt and
> therefore am tossing out this untested patch in case someone is interested in
> trying it out.
> 
> Basically you can use this patch and build .tar.gz rootfs to use as your
> LXC rootfs (that part I tested with a different way of generating the .tar.gz
> that made a .tar.gz specifically for LXC) (i.e. don't use a template but
> rather use lxc-create with the extracted tar.gz as your rootfs, assuming on the
> LXC host you have enabled the appropriate kernrel parameters to be able to use
> LXC).  Generating the .tar.gz does *not* require the special kernel parameters,
> and in fact for the .tar.gz the kernel build is mostly irrelevant since it's
> just the rootfs).
> 
> Two things need to be verified with this patch:
> 
> 1) That is works correctly as LXC rootfs
> 2) Confirmation of my test results that it doesn't break non-LXC builds (I use this patch on live systems and haven't seen any bad effects on non-LXC systems).
> 
> Certain aspects of OpenWrt will fail when run as in LXC guest,
> therefore detect when we are inside and LXC guest session and
> avoid problematic actions.
> 
> Signed-off-by: Daniel Dickinson <openwrt at daniel.thecshore.com>
> ---
>  package/base-files/files/etc/init.d/boot              | 14 +++++++-------
>  package/base-files/files/etc/init.d/clearvar          | 15 +++++++++++++++
>  package/base-files/files/etc/init.d/sysfixtime        |  7 ++++++-
>  package/base-files/files/etc/uci-defaults/lxc-inittab | 13 +++++++++++++
>  package/base-files/files/sbin/inlxc                   | 11 +++++++++++
>  package/utils/busybox/files/sysntpd                   |  6 +++++-
>  6 files changed, 57 insertions(+), 9 deletions(-)
>  create mode 100755 package/base-files/files/etc/init.d/clearvar
>  create mode 100644 package/base-files/files/etc/uci-defaults/lxc-inittab
>  create mode 100755 package/base-files/files/sbin/inlxc
> 
> diff --git a/package/base-files/files/etc/init.d/boot b/package/base-files/files/etc/init.d/boot
> index ccd0afe..23c45be 100755
> --- a/package/base-files/files/etc/init.d/boot
> +++ b/package/base-files/files/etc/init.d/boot
> @@ -18,9 +18,9 @@ uci_apply_defaults() {
>  }
>  
>  boot() {
> -	[ -f /proc/mounts ] || /sbin/mount_root
> -	[ -f /proc/jffs2_bbc ] && echo "S" > /proc/jffs2_bbc
> -	[ -f /proc/net/vlan/config ] && vconfig set_name_type DEV_PLUS_VID_NO_PAD
> +	/sbin/inlxc || [ -f /proc/mounts ] || /sbin/mount_root
> +	/sbin/inlxc || [ -f /proc/jffs2_bbc ] && echo "S" > /proc/jffs2_bbc
> +	/sbin/inlxc || [ -f /proc/net/vlan/config ] && vconfig set_name_type DEV_PLUS_VID_NO_PAD
>  
>  	mkdir -p /var/run
>  	mkdir -p /var/log
> @@ -33,15 +33,15 @@ boot() {
>  	touch /var/log/lastlog
>  	touch /tmp/resolv.conf.auto
>  	ln -sf /tmp/resolv.conf.auto /tmp/resolv.conf
> -	grep -q debugfs /proc/filesystems && /bin/mount -o noatime -t debugfs debugfs /sys/kernel/debug
> +	/sbin/inlxc || grep -q debugfs /proc/filesystems && /bin/mount -o noatime -t debugfs debugfs /sys/kernel/debug
>  	[ "$FAILSAFE" = "true" ] && touch /tmp/.failsafe
>  
> -	/sbin/kmodloader
> +	/sbin/inlxc || /sbin/kmodloader
>  
>  	# allow wifi modules time to settle
>  	sleep 1
>  
> -	/sbin/wifi detect > /tmp/wireless.tmp
> +	/sbin/inlxc || /sbin/wifi detect > /tmp/wireless.tmp
>  	[ -s /tmp/wireless.tmp ] && {
>  		cat /tmp/wireless.tmp >> /etc/config/wireless
>  	}
> @@ -54,7 +54,7 @@ boot() {
>  	/sbin/reload_config
>  
>  	# create /dev/root if it doesn't exist
> -	[ -e /dev/root -o -h /dev/root ] || {
> +	/sbin/inlxc || [ -e /dev/root -o -h /dev/root ] || {
>  		rootdev=$(awk 'BEGIN { RS=" "; FS="="; } $1 == "root" { print $2 }' < /proc/cmdline)
>  		[ -n "$rootdev" ] && ln -s "$rootdev" /dev/root
>  	}
> diff --git a/package/base-files/files/etc/init.d/clearvar b/package/base-files/files/etc/init.d/clearvar
> new file mode 100755
> index 0000000..59fc607
> --- /dev/null
> +++ b/package/base-files/files/etc/init.d/clearvar
> @@ -0,0 +1,15 @@
> +#!/bin/sh /etc/rc.common
> +# Copyright (C) 2013-2014 OpenWrt.org
> +
> +START=00
> +
> +clearvar() {
> +	find /var -mindepth 1 ! -path '/var/run*' -print0 |xargs -0 rm -rf
> +	find /tmp/run -mindepth 1 ! -name ubus.sock -print0 |xargs -0 rm -rf
> +	mkdir /var/log /var/cache /var/state /var/etc /var/lock
> +}
> +
> +boot() {
> +	/sbin/inlxc && clearvar
> +}
> +
> diff --git a/package/base-files/files/etc/init.d/sysfixtime b/package/base-files/files/etc/init.d/sysfixtime
> index ab946f6..2833b0d 100755
> --- a/package/base-files/files/etc/init.d/sysfixtime
> +++ b/package/base-files/files/etc/init.d/sysfixtime
> @@ -7,7 +7,7 @@ STOP=90
>  RTC_DEV=/dev/rtc0
>  HWCLOCK=/sbin/hwclock
>  
> -boot() {
> +sysfixtime() {
>  	start && exit 0
>  
>  	local curtime="$(date +%s)"
> @@ -23,3 +23,8 @@ stop() {
>  	[ -e "$RTC_DEV" ] && [ -e "$HWCLOCK" ] && $HWCLOCK -w -f $RTC_DEV && \
>  		logger -t sysfixtime "saved '$(date)' to $RTC_DEV"
>  }
> +
> +boot() {
> +	/sbin/inlxc || sysfixtime
> +}
> +
> diff --git a/package/base-files/files/etc/uci-defaults/lxc-inittab b/package/base-files/files/etc/uci-defaults/lxc-inittab
> new file mode 100644
> index 0000000..fd1a4a9
> --- /dev/null
> +++ b/package/base-files/files/etc/uci-defaults/lxc-inittab
> @@ -0,0 +1,13 @@
> +#!/bin/sh
> +
> +if /sbin/inlxc; then
> +cat >/etc/inittab <<EOF
> +::sysinit:/etc/init.d/rcS S boot
> +::shutdown:/etc/init.d/rcS K shutdown
> +tty1::askfirst:/bin/ash --login
> +tty2::askfirst:/bin/ash --login
> +tty3::askfirst:/bin/ash --login
> +tty4::askfirst:/bin/ash --login
> +EOF
> +fi
> +
> diff --git a/package/base-files/files/sbin/inlxc b/package/base-files/files/sbin/inlxc
> new file mode 100755
> index 0000000..fd9754e
> --- /dev/null
> +++ b/package/base-files/files/sbin/inlxc
> @@ -0,0 +1,11 @@
> +#!/bin/sh
> +
> +# Shamelessly stolen from virt-what (GPL-2+)
> +
> +if [ -e "/proc/1/environ" ] &&
> +    cat "/proc/1/environ" | tr '\000' '\n' | grep -Eiq '^container='; then
> +    exit 0
> +fi
> +
> +exit 1
> +
> diff --git a/package/utils/busybox/files/sysntpd b/package/utils/busybox/files/sysntpd
> index f73bb83..bbe005d 100755
> --- a/package/utils/busybox/files/sysntpd
> +++ b/package/utils/busybox/files/sysntpd
> @@ -12,7 +12,7 @@ validate_ntp_section() {
>  		'server:list(host)' 'enabled:bool:1' 'enable_server:bool:0'
>  }
>  
> -start_service() {
> +start_sysntpd() {
>  	local server enabled enable_server peer
>  
>  	validate_ntp_section ntp || {
> @@ -35,6 +35,10 @@ start_service() {
>  	procd_close_instance
>  }
>  
> +start_service() {
> +	/sbin/inlxc || start_sysntpd
> +}
> +
>  service_triggers()
>  {
>  	procd_add_reload_trigger "system"
> 
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list