[OpenWrt-Devel] [EXPERIMENTAL] [PATCH] base-files busybox: Detect LXC guest and act appropriately
Daniel Dickinson
openwrt at daniel.thecshore.com
Tue Feb 16 02:13:11 EST 2016
Felix didn't like my previous approach which was an lxc-specific tarball
generation.
Do either you have an actual suggestion of what you'd like to see, so
that I can do something that will keep you both happy?
Regards,
Daniel
On 16/02/16 02:10 AM, John Crispin wrote:
> 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