Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
lxc
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
lxc
Commits
3be6e5ff
Commit
3be6e5ff
authored
Jul 21, 2016
by
Stéphane Graber
Committed by
GitHub
Jul 21, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1092 from LicoMonch/extend-debian-template
simple enhancements of lxc-debian-template-script
parents
5de15f6a
ade83cbf
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
134 additions
and
131 deletions
+134
-131
lxc-debian.in
templates/lxc-debian.in
+134
-131
No files found.
templates/lxc-debian.in
View file @
3be6e5ff
...
@@ -54,7 +54,7 @@ find_interpreter()
...
@@ -54,7 +54,7 @@ find_interpreter()
continue
continue
fi
fi
interpreter_path
=
$(
sed
-n
"/^interpreter/s/interpreter
\(
[^[:space:]]*
\)
/
\1
/p"
"
$file
"
)
interpreter_path
=
$(
sed
-n
"/^interpreter/s/interpreter
\(
[^[:space:]]*
\)
/
\1
/p"
"
$file
"
)
interpreter
=
$(
basename
$interpreter_path
)
interpreter
=
$(
basename
"
$interpreter_path
"
)
if
[
"
$given_interpreter
"
=
"
$interpreter
"
]
;
then
if
[
"
$given_interpreter
"
=
"
$interpreter
"
]
;
then
echo
"
$interpreter_path
"
echo
"
$interpreter_path
"
...
@@ -72,9 +72,9 @@ configure_debian()
...
@@ -72,9 +72,9 @@ configure_debian()
# squeeze only has /dev/tty and /dev/tty0 by default,
# squeeze only has /dev/tty and /dev/tty0 by default,
# therefore creating missing device nodes for tty1-4.
# therefore creating missing device nodes for tty1-4.
for
tty
in
$(
seq
1
$num_tty
)
;
do
for
tty
in
$(
seq
1
"
$num_tty
"
)
;
do
if
[
!
-e
$rootfs
/dev/tty
$tty
]
;
then
if
[
!
-e
"
$rootfs
/dev/tty
$tty
"
]
;
then
mknod
$rootfs
/dev/tty
$tty
c 4
$tty
mknod
"
$rootfs
/dev/tty
$tty
"
c 4
"
$tty
"
fi
fi
done
done
...
@@ -92,18 +92,18 @@ l6:6:wait:/etc/init.d/rc 6
...
@@ -92,18 +92,18 @@ l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin
z6:6:respawn:/sbin/sulogin
1:2345:respawn:/sbin/getty 38400 console
1:2345:respawn:/sbin/getty 38400 console
$(for
tty
in
$(
seq
1
$num_tty
)
;
do
echo
"c
${
tty
}
:12345:respawn:/sbin/getty 38400 tty
${
tty
}
linux"
;
done
;
)
$(for
tty
in
$(
seq
1
"
$num_tty
"
)
;
do
echo
"c
${
tty
}
:12345:respawn:/sbin/getty 38400 tty
${
tty
}
linux"
;
done
;
)
p6::ctrlaltdel:/sbin/init 6
p6::ctrlaltdel:/sbin/init 6
p0::powerfail:/sbin/init 0
p0::powerfail:/sbin/init 0
EOF
EOF
# symlink mtab
# symlink mtab
[
-e
"
$rootfs
/etc/mtab"
]
&&
rm
$rootfs
/etc/mtab
[
-e
"
$rootfs
/etc/mtab"
]
&&
rm
"
$rootfs
/etc/mtab"
ln
-s
/proc/self/mounts
$rootfs
/etc/mtab
ln
-s
/proc/self/mounts
"
$rootfs
/etc/mtab"
# disable selinux in debian
# disable selinux in debian
mkdir
-p
$rootfs
/selinux
mkdir
-p
"
$rootfs
/selinux"
echo
0
>
$rootfs
/selinux/enforce
echo
0
>
"
$rootfs
/selinux/enforce"
# configure the network using the dhcp
# configure the network using the dhcp
cat
<<
EOF
>
$rootfs
/etc/network/interfaces
cat
<<
EOF
>
$rootfs
/etc/network/interfaces
...
@@ -121,44 +121,62 @@ EOF
...
@@ -121,44 +121,62 @@ EOF
# reconfigure some services
# reconfigure some services
# but first reconfigure locales - so we get no noisy perl-warnings
if
[
-z
"
$LANG
"
]
;
then
cat
>>
"
$rootfs
/etc/locale.gen"
<<
EOF
en_US.UTF-8 UTF-8
EOF
chroot
"
$rootfs
"
locale-gen en_US.UTF-8 UTF-8
chroot
"
$rootfs
"
update-locale
LANG
=
en_US.UTF-8
else
encoding
=
$(
echo
"
$LANG
"
|
cut
-d
.
-f2
)
chroot
"
$rootfs
"
sed
-e
"s/^#
\(
${
LANG
}
${
encoding
}
\)
/
\1
/"
\
-i
/etc/locale.gen 2> /dev/null
cat
>>
"
$rootfs
/etc/locale.gen"
<<
EOF
$LANG
$encoding
EOF
chroot
"
$rootfs
"
locale-gen
"
$LANG
"
"
$encoding
"
chroot
"
$rootfs
"
update-locale
LANG
=
"
$LANG
"
fi
# remove pointless services in a container
# remove pointless services in a container
chroot
$rootfs
/usr/sbin/update-rc.d
-f
checkroot.sh disable
chroot
"
$rootfs
"
/usr/sbin/update-rc.d
-f
checkroot.sh disable
chroot
$rootfs
/usr/sbin/update-rc.d
-f
umountfs disable
chroot
"
$rootfs
"
/usr/sbin/update-rc.d
-f
umountfs disable
chroot
$rootfs
/usr/sbin/update-rc.d
-f
hwclock.sh disable
chroot
"
$rootfs
"
/usr/sbin/update-rc.d
-f
hwclock.sh disable
chroot
$rootfs
/usr/sbin/update-rc.d
-f
hwclockfirst.sh disable
chroot
"
$rootfs
"
/usr/sbin/update-rc.d
-f
hwclockfirst.sh disable
# generate new SSH keys
# generate new SSH keys
if
[
-x
$rootfs
/var/lib/dpkg/info/openssh-server.postinst
]
;
then
if
[
-x
"
$rootfs
/var/lib/dpkg/info/openssh-server.postinst"
]
;
then
cat
>
$rootfs
/usr/sbin/policy-rc.d
<<
EOF
cat
>
"
$rootfs
/usr/sbin/policy-rc.d"
<<
EOF
#!/bin/sh
#!/bin/sh
exit 101
exit 101
EOF
EOF
chmod
+x
$rootfs
/usr/sbin/policy-rc.d
chmod
+x
"
$rootfs
/usr/sbin/policy-rc.d"
if
[
-f
$rootfs
/etc/init/ssh.conf
]
;
then
if
[
-f
"
$rootfs
/etc/init/ssh.conf"
]
;
then
mv
$rootfs
/etc/init/ssh.conf
$rootfs
/etc/init/ssh.conf.disabled
mv
"
$rootfs
/etc/init/ssh.conf"
"
$rootfs
/etc/init/ssh.conf.disabled"
fi
fi
rm
-f
$rootfs
/etc/ssh/
ssh_host_
*
key
*
rm
-f
"
$rootfs
/etc/ssh/"
ssh_host_
*
key
*
DPKG_MAINTSCRIPT_PACKAGE
=
openssh
DPKG_MAINTSCRIPT_NAME
=
postinst
chroot
$rootfs
/var/lib/dpkg/info/openssh-server.postinst configure
DPKG_MAINTSCRIPT_PACKAGE
=
openssh
DPKG_MAINTSCRIPT_NAME
=
postinst
chroot
"
$rootfs
"
/var/lib/dpkg/info/openssh-server.postinst configure
sed
-i
"s/root@
$(
hostname
)
/root@
$hostname
/g"
$rootfs
/etc/ssh/
ssh_host_
*
.pub
sed
-i
"s/root@
$(
hostname
)
/root@
$hostname
/g"
"
$rootfs
/etc/ssh/"
ssh_host_
*
.pub
if
[
-f
"
$rootfs
/etc/init/ssh.conf.disabled"
]
;
then
if
[
-f
"
$rootfs
/etc/init/ssh.conf.disabled"
]
;
then
mv
$rootfs
/etc/init/ssh.conf.disabled
$rootfs
/etc/init/ssh.conf
mv
"
$rootfs
/etc/init/ssh.conf.disabled"
"
$rootfs
/etc/init/ssh.conf"
fi
fi
rm
-f
$rootfs
/usr/sbin/policy-rc.d
rm
-f
"
$rootfs
/usr/sbin/policy-rc.d"
fi
fi
# set initial timezone as on host
# set initial timezone as on host
if
[
-f
/etc/timezone
]
;
then
if
[
-f
/etc/timezone
]
;
then
cat
/etc/timezone
>
$rootfs
/etc/timezone
cat
/etc/timezone
>
"
$rootfs
/etc/timezone"
chroot
$rootfs
dpkg-reconfigure
-f
noninteractive tzdata
chroot
"
$rootfs
"
dpkg-reconfigure
-f
noninteractive tzdata
elif
[
-f
/etc/sysconfig/clock
]
;
then
elif
[
-f
/etc/sysconfig/clock
]
;
then
.
/etc/sysconfig/clock
.
/etc/sysconfig/clock
echo
$ZONE
>
$rootfs
/etc/timezone
echo
"
$ZONE
"
>
"
$rootfs
/etc/timezone"
chroot
$rootfs
dpkg-reconfigure
-f
noninteractive tzdata
chroot
"
$rootfs
"
dpkg-reconfigure
-f
noninteractive tzdata
else
else
echo
"Timezone in container is not configured. Adjust it manually."
echo
"Timezone in container is not configured. Adjust it manually."
fi
fi
...
@@ -199,9 +217,9 @@ install_packages()
...
@@ -199,9 +217,9 @@ install_packages()
local
rootfs
=
"
$1
"
;
shift
local
rootfs
=
"
$1
"
;
shift
local
packages
=
"
$*
"
local
packages
=
"
$*
"
chroot
${
rootfs
}
apt-get update
chroot
"
${
rootfs
}
"
apt-get update
if
[
-n
"
${
packages
}
"
]
;
then
if
[
-n
"
${
packages
}
"
]
;
then
chroot
${
rootfs
}
apt-get
install
--force-yes
-y
--no-install-recommends
${
packages
}
chroot
"
${
rootfs
}
"
apt-get
install
--force-yes
-y
--no-install-recommends
${
packages
}
fi
fi
}
}
...
@@ -213,42 +231,43 @@ configure_debian_systemd()
...
@@ -213,42 +231,43 @@ configure_debian_systemd()
num_tty
=
$4
num_tty
=
$4
# this only works if we have getty@.service to manipulate
# this only works if we have getty@.service to manipulate
if
[
-f
${
rootfs
}
/lib/systemd/system/getty
\@
.service
]
;
then
if
[
-f
"
${
rootfs
}
/lib/systemd/system/getty
\@
.service"
]
;
then
sed
-e
's/^ConditionPathExists=/# ConditionPathExists=/'
\
sed
-e
's/^ConditionPathExists=/# ConditionPathExists=/'
\
-e
's/After=dev-%i.device/After=/'
\
-e
's/After=dev-%i.device/After=/'
\
<
${
rootfs
}
/lib/systemd/system/getty
\@
.service
\
<
"
${
rootfs
}
/lib/systemd/system/getty
\@
.service"
\
>
${
rootfs
}
/etc/systemd/system/getty
\@
.service
>
"
${
rootfs
}
/etc/systemd/system/getty
\@
.service"
fi
fi
# just in case systemd is not installed
# just in case systemd is not installed
mkdir
-p
${
rootfs
}
/
{
lib,etc
}
/systemd/system
mkdir
-p
"
${
rootfs
}
/{lib,etc}/systemd/system"
mkdir
-p
${
rootfs
}
/etc/systemd/system/getty.target.wants
mkdir
-p
"
${
rootfs
}
/etc/systemd/system/getty.target.wants"
# Fix getty-static-service as debootstrap does not install dbus
# Fix getty-static-service as debootstrap does not install dbus
if
[
-e
$rootfs
//lib/systemd/system/getty-static.service
]
;
then
if
[
-e
"
$rootfs
//lib/systemd/system/getty-static.service"
]
;
then
local
tty_services
=
$(for
i
in
$(
seq
2
$num_tty
)
;
do
echo
-n
"getty@tty
${
i
}
.service "
;
done
;
)
local
tty_services
tty_services
=
$(for
i
in
$(
seq
2
"
$num_tty
"
)
;
do
echo
-n
"getty@tty
${
i
}
.service "
;
done
;
)
sed
's/ getty@tty.*/'
"
$tty_services
"
'/g'
\
sed
's/ getty@tty.*/'
"
$tty_services
"
'/g'
\
$rootfs
/lib/systemd/system/getty-static.service
|
\
"
$rootfs
/lib/systemd/system/getty-static.service"
|
\
sed
's/\(tty2-tty\)[5-9]/\1'
"
${
num_tty
}
"
'/g'
>
$rootfs
/etc/systemd/system/getty-static.service
sed
's/\(tty2-tty\)[5-9]/\1'
"
${
num_tty
}
"
'/g'
>
"
$rootfs
/etc/systemd/system/getty-static.service"
fi
fi
# This function has been copied and adapted from lxc-fedora
# This function has been copied and adapted from lxc-fedora
rm
-f
${
rootfs
}
/etc/systemd/system/default.target
rm
-f
"
${
rootfs
}
/etc/systemd/system/default.target"
chroot
${
rootfs
}
ln
-s
/dev/null /etc/systemd/system/udev.service
chroot
"
${
rootfs
}
"
ln
-s
/dev/null /etc/systemd/system/udev.service
chroot
${
rootfs
}
ln
-s
/dev/null /etc/systemd/system/systemd-udevd.service
chroot
"
${
rootfs
}
"
ln
-s
/dev/null /etc/systemd/system/systemd-udevd.service
chroot
${
rootfs
}
ln
-s
/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
chroot
"
${
rootfs
}
"
ln
-s
/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
# Make systemd honor SIGPWR
# Make systemd honor SIGPWR
chroot
${
rootfs
}
ln
-s
/lib/systemd/system/halt.target /etc/systemd/system/sigpwr.target
chroot
"
${
rootfs
}
"
ln
-s
/lib/systemd/system/halt.target /etc/systemd/system/sigpwr.target
# Setup getty service on the ttys we are going to allow in the
# Setup getty service on the ttys we are going to allow in the
# default config. Number should match lxc.tty
# default config. Number should match lxc.tty
(
cd
${
rootfs
}
/etc/systemd/system/getty.target.wants
(
cd
"
${
rootfs
}
/etc/systemd/system/getty.target.wants"
for
i
in
$(
seq
1
$num_tty
)
;
do
ln
-sf
../getty
\@
.service getty@tty
${
i
}
.service
;
done
)
for
i
in
$(
seq
1
"
$num_tty
"
)
;
do
ln
-sf
../getty
\@
.service getty@tty
"
${
i
}
"
.service
;
done
)
# Since we use static-getty.target; we need to mask container-getty@.service generated by
# Since we use static-getty.target; we need to mask container-getty@.service generated by
# container-getty-generator, so we don't get multiple instances of agetty running.
# container-getty-generator, so we don't get multiple instances of agetty running.
# See https://github.com/lxc/lxc/issues/520 and https://github.com/lxc/lxc/issues/484
# See https://github.com/lxc/lxc/issues/520 and https://github.com/lxc/lxc/issues/484
(
cd
${
rootfs
}
/etc/systemd/system/getty.target.wants
(
cd
"
${
rootfs
}
/etc/systemd/system/getty.target.wants"
for
i
in
$(
seq
0
$num_tty
)
;
do
ln
-sf
/dev/null container-getty
\@
${
i
}
.service
;
done
)
for
i
in
$(
seq
0
"
$num_tty
"
)
;
do
ln
-sf
/dev/null container-getty
\@
"
${
i
}
"
.service
;
done
)
return
0
return
0
}
}
...
@@ -256,42 +275,42 @@ configure_debian_systemd()
...
@@ -256,42 +275,42 @@ configure_debian_systemd()
# Check if given path is in a btrfs partition
# Check if given path is in a btrfs partition
is_btrfs
()
is_btrfs
()
{
{
[
-e
$1
-a
$(
stat
-f
-c
'%T'
$1
)
=
"btrfs"
]
[
-e
"
$1
"
-a
"
$(
stat
-f
-c
'%T'
"
$1
"
)
"
=
"btrfs"
]
}
}
# Check if given path is the root of a btrfs subvolume
# Check if given path is the root of a btrfs subvolume
is_btrfs_subvolume
()
is_btrfs_subvolume
()
{
{
[
-d
$1
-a
$(
stat
-f
-c
'%T'
$1
)
=
"btrfs"
-a
$(
stat
-c
'%i'
$1
)
-eq
256
]
[
-d
"
$1
"
-a
"
$(
stat
-f
-c
'%T'
"
$1
"
)
"
=
"btrfs"
-a
"
$(
stat
-c
'%i'
"
$1
"
)
"
-eq
256
]
}
}
try_mksubvolume
()
try_mksubvolume
()
{
{
path
=
$1
path
=
$1
[
-d
$path
]
&&
return
0
[
-d
"
$path
"
]
&&
return
0
mkdir
-p
$(
dirname
$path
)
mkdir
-p
"
$(
dirname
"
$path
"
)
"
if
which btrfs
>
/dev/null 2>&1
&&
is_btrfs
$(
dirname
$path
)
;
then
if
which btrfs
>
/dev/null 2>&1
&&
is_btrfs
"
$(
dirname
"
$path
"
)
"
;
then
btrfs subvolume create
$path
btrfs subvolume create
"
$path
"
else
else
mkdir
-p
$path
mkdir
-p
"
$path
"
fi
fi
}
}
try_rmsubvolume
()
try_rmsubvolume
()
{
{
path
=
$1
path
=
$1
[
-d
$path
]
||
return
0
[
-d
"
$path
"
]
||
return
0
if
which btrfs
>
/dev/null 2>&1
&&
is_btrfs_subvolume
$path
;
then
if
which btrfs
>
/dev/null 2>&1
&&
is_btrfs_subvolume
"
$path
"
;
then
btrfs subvolume delete
$path
btrfs subvolume delete
"
$path
"
else
else
rm
-rf
$path
rm
-rf
"
$path
"
fi
fi
}
}
cleanup
()
cleanup
()
{
{
try_rmsubvolume
$cache
/partial-
$release
-
$arch
try_rmsubvolume
"
$cache
/partial-
$release
-
$arch
"
try_rmsubvolume
$cache
/rootfs-
$release
-
$arch
try_rmsubvolume
"
$cache
/rootfs-
$release
-
$arch
"
}
}
download_debian
()
download_debian
()
...
@@ -343,7 +362,7 @@ openssh-server
...
@@ -343,7 +362,7 @@ openssh-server
;;
;;
esac
esac
wget https://ftp-master.debian.org/keys/
${
gpgkeyname
}
.asc
-O
-
--quiet
\
wget https://ftp-master.debian.org/keys/
${
gpgkeyname
}
.asc
-O
-
--quiet
\
| gpg
--import
--no-default-keyring
--keyring
=
${
releasekeyring
}
| gpg
--import
--no-default-keyring
--keyring
=
"
${
releasekeyring
}
"
fi
fi
# check the mini debian was not already downloaded
# check the mini debian was not already downloaded
try_mksubvolume
"
$cache
/partial-
$release
-
$arch
"
try_mksubvolume
"
$cache
/partial-
$release
-
$arch
"
...
@@ -355,22 +374,22 @@ openssh-server
...
@@ -355,22 +374,22 @@ openssh-server
# download a mini debian into a cache
# download a mini debian into a cache
echo
"Downloading debian minimal ..."
echo
"Downloading debian minimal ..."
if
[
"
$interpreter
"
=
""
]
;
then
if
[
"
$interpreter
"
=
""
]
;
then
debootstrap
--verbose
--variant
=
minbase
--arch
=
$arch
\
debootstrap
--verbose
--variant
=
minbase
--arch
=
"
$arch
"
\
--include
=
$packages
--keyring
=
${
releasekeyring
}
\
--include
=
$packages
--keyring
=
"
${
releasekeyring
}
"
\
"
$release
"
"
$cache
/partial-
$release
-
$arch
"
$MIRROR
"
$release
"
"
$cache
/partial-
$release
-
$arch
"
"
$MIRROR
"
if
[
$?
-ne
0
]
;
then
if
[
$?
-ne
0
]
;
then
echo
"Failed to download the rootfs, aborting."
echo
"Failed to download the rootfs, aborting."
return
1
return
1
fi
fi
else
else
debootstrap
--foreign
--verbose
--variant
=
minbase
--arch
=
$arch
\
debootstrap
--foreign
--verbose
--variant
=
minbase
--arch
=
"
$arch
"
\
--include
=
$packages
--keyring
=
${
releasekeyring
}
\
--include
=
$packages
--keyring
=
"
${
releasekeyring
}
"
\
"
$release
"
"
$cache
/partial-
$release
-
$arch
"
$MIRROR
"
$release
"
"
$cache
/partial-
$release
-
$arch
"
"
$MIRROR
"
if
[
$?
-ne
0
]
;
then
if
[
$?
-ne
0
]
;
then
echo
"Failed to download the rootfs, aborting."
echo
"Failed to download the rootfs, aborting."
return
1
return
1
fi
fi
mkdir
-p
$(
basename
"
$cache
/partial-
$release
-
$arch
/
$interpreter_path
"
)
mkdir
-p
"
$(
basename
"
$cache
/partial-
$release
-
$arch
/
$interpreter_path
"
)
"
cp
"
$interpreter
"
"
$cache
/partial-
$release
-
$arch
/
$interpreter_path
"
cp
"
$interpreter
"
"
$cache
/partial-
$release
-
$arch
/
$interpreter_path
"
if
[
$?
-ne
0
]
;
then
if
[
$?
-ne
0
]
;
then
echo
"failed to copy
$interpreter
to
$cache
/partial-
$release
-
$arch
/
$interpreter_path
"
echo
"failed to copy
$interpreter
to
$cache
/partial-
$release
-
$arch
/
$interpreter_path
"
...
@@ -402,17 +421,17 @@ copy_debian()
...
@@ -402,17 +421,17 @@ copy_debian()
# make a local copy of the minidebian
# make a local copy of the minidebian
echo
-n
"Copying rootfs to
$rootfs
..."
echo
-n
"Copying rootfs to
$rootfs
..."
try_mksubvolume
$rootfs
try_mksubvolume
"
$rootfs
"
if
which btrfs
>
/dev/null 2>&1
&&
\
if
which btrfs
>
/dev/null 2>&1
&&
\
is_btrfs_subvolume
"
$cache
/rootfs-
$release
-
$arch
"
&&
\
is_btrfs_subvolume
"
$cache
/rootfs-
$release
-
$arch
"
&&
\
is_btrfs_subvolume
$rootfs
;
then
is_btrfs_subvolume
"
$rootfs
"
;
then
realrootfs
=
$(
dirname
$config
)
/rootfs
realrootfs
=
"
$(
dirname
"
$config
"
)
"
/rootfs
[
"
$rootfs
"
=
"
$realrootfs
"
]
||
umount
$rootfs
||
return
1
[
"
$rootfs
"
=
"
$realrootfs
"
]
||
umount
"
$rootfs
"
||
return
1
btrfs subvolume delete
$realrootfs
||
return
1
btrfs subvolume delete
"
$realrootfs
"
||
return
1
btrfs subvolume snapshot
"
$cache
/rootfs-
$release
-
$arch
"
$realrootfs
||
return
1
btrfs subvolume snapshot
"
$cache
/rootfs-
$release
-
$arch
"
"
$realrootfs
"
||
return
1
[
"
$rootfs
"
=
"
$realrootfs
"
]
||
mount
--bind
$realrootfs
$rootfs
||
return
1
[
"
$rootfs
"
=
"
$realrootfs
"
]
||
mount
--bind
"
$realrootfs
"
"
$rootfs
"
||
return
1
else
else
rsync
-Ha
"
$cache
/rootfs-
$release
-
$arch
"
/
$rootfs
/
||
return
1
rsync
-Ha
"
$cache
/rootfs-
$release
-
$arch
"
/
"
$rootfs
"
/
||
return
1
fi
fi
return
0
return
0
}
}
...
@@ -434,21 +453,21 @@ install_debian()
...
@@ -434,21 +453,21 @@ install_debian()
return
1
return
1
fi
fi
if
[
$flushcache
-eq
1
]
;
then
if
[
"
$flushcache
"
-eq
1
]
;
then
echo
"Flushing cache..."
echo
"Flushing cache..."
cleanup
cleanup
fi
fi
echo
"Checking cache download in
$cache
/rootfs-
$release
-
$arch
... "
echo
"Checking cache download in
$cache
/rootfs-
$release
-
$arch
... "
if
[
!
-e
"
$cache
/rootfs-
$release
-
$arch
"
]
;
then
if
[
!
-e
"
$cache
/rootfs-
$release
-
$arch
"
]
;
then
download_debian
$cache
$arch
$release
"
$interpreter
"
"
$interpreter_path
"
download_debian
"
$cache
"
"
$arch
"
"
$release
"
"
$interpreter
"
"
$interpreter_path
"
if
[
$?
-ne
0
]
;
then
if
[
$?
-ne
0
]
;
then
echo
"Failed to download 'debian base'"
echo
"Failed to download 'debian base'"
return
1
return
1
fi
fi
fi
fi
copy_debian
$cache
$arch
$rootfs
$release
copy_debian
"
$cache
"
"
$arch
"
"
$rootfs
"
"
$release
"
if
[
$?
-ne
0
]
;
then
if
[
$?
-ne
0
]
;
then
echo
"Failed to copy rootfs"
echo
"Failed to copy rootfs"
return
1
return
1
...
@@ -472,25 +491,25 @@ copy_configuration()
...
@@ -472,25 +491,25 @@ copy_configuration()
# Generate the configuration file
# Generate the configuration file
# if there is exactly one veth network entry, make sure it has an
# if there is exactly one veth network entry, make sure it has an
# associated hwaddr.
# associated hwaddr.
nics
=
`
grep
-e
'^lxc\.network\.type[ \t]*=[ \t]*veth'
$path
/config |
wc
-l
`
nics
=
$(
grep
-ce
'^lxc\.network\.type[ \t]*=[ \t]*veth'
"
$path
/config"
)
if
[
$nics
-eq
1
]
;
then
if
[
"
$nics
"
-eq
1
]
;
then
grep
-q
"^lxc.network.hwaddr"
$path
/config
||
sed
-i
-e
"/^lxc
\.
network
\.
type[
\t
]*=[
\t
]*veth/a lxc.network.hwaddr = 00:16:3e:
$(
openssl rand
-hex
3|
sed
's/\(..\)/\1:/g; s/.$//'
)
"
$path
/config
grep
-q
"^lxc.network.hwaddr"
"
$path
/config"
||
sed
-i
-e
"/^lxc
\.
network
\.
type[
\t
]*=[
\t
]*veth/a lxc.network.hwaddr = 00:16:3e:
$(
openssl rand
-hex
3|
sed
's/\(..\)/\1:/g; s/.$//'
)
"
"
$path
/config"
fi
fi
## Add all the includes
## Add all the includes
echo
""
>>
$path
/config
echo
""
>>
"
$path
/config"
echo
"# Common configuration"
>>
$path
/config
echo
"# Common configuration"
>>
"
$path
/config"
if
[
-e
"
${
LXC_TEMPLATE_CONFIG
}
/debian.common.conf"
]
;
then
if
[
-e
"
${
LXC_TEMPLATE_CONFIG
}
/debian.common.conf"
]
;
then
echo
"lxc.include =
${
LXC_TEMPLATE_CONFIG
}
/debian.common.conf"
>>
$path
/config
echo
"lxc.include =
${
LXC_TEMPLATE_CONFIG
}
/debian.common.conf"
>>
"
$path
/config"
fi
fi
if
[
-e
"
${
LXC_TEMPLATE_CONFIG
}
/debian.
${
release
}
.conf"
]
;
then
if
[
-e
"
${
LXC_TEMPLATE_CONFIG
}
/debian.
${
release
}
.conf"
]
;
then
echo
"lxc.include =
${
LXC_TEMPLATE_CONFIG
}
/debian.
${
release
}
.conf"
>>
$path
/config
echo
"lxc.include =
${
LXC_TEMPLATE_CONFIG
}
/debian.
${
release
}
.conf"
>>
"
$path
/config"
fi
fi
## Add the container-specific config
## Add the container-specific config
echo
""
>>
$path
/config
echo
""
>>
"
$path
/config"
echo
"# Container specific configuration"
>>
$path
/config
echo
"# Container specific configuration"
>>
"
$path
/config"
grep
-q
"^lxc.rootfs"
$path
/config 2> /dev/null
||
echo
"lxc.rootfs =
$rootfs
"
>>
$path
/config
grep
-q
"^lxc.rootfs"
"
$path
/config"
2> /dev/null
||
echo
"lxc.rootfs =
$rootfs
"
>>
"
$path
/config"
cat
<<
EOF
>>
$path
/config
cat
<<
EOF
>>
$path
/config
lxc.tty =
$num_tty
lxc.tty =
$num_tty
...
@@ -517,55 +536,39 @@ post_process()
...
@@ -517,55 +536,39 @@ post_process()
local
packages
=
"
$*
"
local
packages
=
"
$*
"
# Disable service startup
# Disable service startup
cat
>
${
rootfs
}
/usr/sbin/policy-rc.d
<<
EOF
cat
>
"
${
rootfs
}
/usr/sbin/policy-rc.d"
<<
EOF
#!/bin/sh
#!/bin/sh
exit 101
exit 101
EOF
EOF
chmod
+x
${
rootfs
}
/usr/sbin/policy-rc.d
chmod
+x
"
${
rootfs
}
/usr/sbin/policy-rc.d"
# If the container isn't running a native architecture, setup multiarch
# If the container isn't running a native architecture, setup multiarch
if
[
"
$interpreter
"
=
""
-a
"
${
arch
}
"
!=
"
${
hostarch
}
"
]
;
then
if
[
"
$interpreter
"
=
""
-a
"
${
arch
}
"
!=
"
${
hostarch
}
"
]
;
then
# Test if dpkg supports multiarch
# Test if dpkg supports multiarch
if
!
chroot
$rootfs
dpkg
--print-foreign-architecture
2>&1
;
then
if
!
chroot
"
$rootfs
"
dpkg
--print-foreign-architecture
2>&1
;
then
chroot
$rootfs
dpkg
--add-architecture
${
hostarch
}
chroot
"
$rootfs
"
dpkg
--add-architecture
"
${
hostarch
}
"
fi
fi
fi
fi
# Write a new sources.list containing both native and multiarch entries
# Write a new sources.list containing both native and multiarch entries
>
${
rootfs
}
/etc/apt/sources.list
>
"
${
rootfs
}
/etc/apt/sources.list"
if
[
"
$interpreter
"
!=
""
-a
"
${
arch
}
"
=
"
${
hostarch
}
"
]
;
then
if
[
"
$interpreter
"
!=
""
-a
"
${
arch
}
"
=
"
${
hostarch
}
"
]
;
then
write_sourceslist
${
rootfs
}
${
release
}
${
arch
}
write_sourceslist
"
${
rootfs
}
"
"
${
release
}
"
"
${
arch
}
"
else
else
write_sourceslist
${
rootfs
}
${
release
}
write_sourceslist
"
${
rootfs
}
"
"
${
release
}
"
fi
fi
# Install Packages in container
# Install Packages in container
if
[
-n
"
${
packages
}
"
]
;
then
if
[
-n
"
${
packages
}
"
]
;
then
local
pack_list
=
"
`
echo
${
packages
}
|
sed
's/,/ /g'
`
"
local
pack_list
pack_list
=
"
${
packages
//,/
}
"
echo
"Installing packages:
${
pack_list
}
"
echo
"Installing packages:
${
pack_list
}
"
install_packages
${
rootfs
}
${
pack_list
}
install_packages
"
${
rootfs
}
"
"
${
pack_list
}
"
fi
fi
# Re-enable service startup
# Re-enable service startup
rm
${
rootfs
}
/usr/sbin/policy-rc.d
rm
"
${
rootfs
}
/usr/sbin/policy-rc.d"
# reconfigure locales
if
[
-z
"
$LANG
"
]
;
then
cat
>>
$rootfs
/etc/locale.gen
<<
EOF
en_US.UTF-8 UTF-8
EOF
chroot
$rootfs
locale-gen en_US.UTF-8 UTF-8
chroot
$rootfs
update-locale
LANG
=
en_US.UTF-8
else
encoding
=
$(
echo
$LANG
|
cut
-d
.
-f2
)
chroot
$rootfs
sed
-e
"s/^#
\(
${
LANG
}
${
encoding
}
\)
/
\1
/"
\
-i
/etc/locale.gen 2> /dev/null
cat
>>
$rootfs
/etc/locale.gen
<<
EOF
$LANG
$encoding
EOF
chroot
$rootfs
locale-gen
$LANG
$encoding
chroot
$rootfs
update-locale
LANG
=
$LANG
fi
# end
# end
}
}
...
@@ -573,7 +576,7 @@ clean()
...
@@ -573,7 +576,7 @@ clean()
{
{
cache
=
${
LXC_CACHE_PATH
:-
"
$LOCALSTATEDIR
/cache/lxc/debian"
}
cache
=
${
LXC_CACHE_PATH
:-
"
$LOCALSTATEDIR
/cache/lxc/debian"
}
if
[
!
-e
$cache
]
;
then
if
[
!
-e
"
$cache
"
]
;
then
exit
0
exit
0
fi
fi
...
@@ -586,7 +589,7 @@ clean()
...
@@ -586,7 +589,7 @@ clean()
fi
fi
echo
-n
"Purging the download cache..."
echo
-n
"Purging the download cache..."
rm
--preserve-root
--one-file-system
-rf
$cache
&&
echo
"Done."
||
exit
1
rm
--preserve-root
--one-file-system
-rf
"
$cache
"
&&
echo
"Done."
||
exit
1
exit
0
exit
0
)
9>
$LOCALSTATEDIR
/lock/subsys/lxc-debian
)
9>
$LOCALSTATEDIR
/lock/subsys/lxc-debian
...
@@ -639,7 +642,7 @@ EOF
...
@@ -639,7 +642,7 @@ EOF
options
=
$(
getopt
-o
hp:n:a:r:cI:F
-l
arch
:,clean,help,enable-non-free,mirror:,name:,packages:,path:,release:,rootfs:,security-mirror:,interpreter-path:,flush-cache
--
"
$@
"
)
options
=
$(
getopt
-o
hp:n:a:r:cI:F
-l
arch
:,clean,help,enable-non-free,mirror:,name:,packages:,path:,release:,rootfs:,security-mirror:,interpreter-path:,flush-cache
--
"
$@
"
)
if
[
$?
-ne
0
]
;
then
if
[
$?
-ne
0
]
;
then
usage
$(
basename
$0
)
usage
"
$(
basename
"
$0
"
)
"
exit
1
exit
1
fi
fi
eval set
--
"
$options
"
eval set
--
"
$options
"
...
@@ -659,7 +662,7 @@ flushcache=0
...
@@ -659,7 +662,7 @@ flushcache=0
while
true
while
true
do
do
case
"
$1
"
in
case
"
$1
"
in
-h
|
--help
)
usage
$0
&&
exit
1
;;
-h
|
--help
)
usage
"
$0
"
&&
exit
1
;;
--
)
shift
1
;
break
;;
--
)
shift
1
;
break
;;
-a
|
--arch
)
arch
=
$2
;
shift
2
;;
-a
|
--arch
)
arch
=
$2
;
shift
2
;;
...
@@ -715,7 +718,7 @@ else
...
@@ -715,7 +718,7 @@ else
fi
fi
interpreter_path
=
$(
find_interpreter
"
$interpreter
"
)
interpreter_path
=
$(
find_interpreter
"
$interpreter
"
)
if
[
$?
-ne
0
]
;
then
if
[
$?
-ne
0
]
;
then
echo
"no binfmt interpreter using
$(
basename
$interpreter
)
"
1>&2
echo
"no binfmt interpreter using
$(
basename
"
$interpreter
"
)
"
1>&2
exit
1
exit
1
fi
fi
fi
fi
...
@@ -736,7 +739,7 @@ if [ "$(id -u)" != "0" ]; then
...
@@ -736,7 +739,7 @@ if [ "$(id -u)" != "0" ]; then
exit
1
exit
1
fi
fi
current_release
=
`
wget
${
MIRROR
}
/dists/stable/Release
-O
- 2> /dev/null |
head
|awk
'/^Codename: (.*)$/ { print $2; }'
`
current_release
=
$(
wget
"
${
MIRROR
}
/dists/stable/Release"
-O
- 2> /dev/null |
head
|awk
'/^Codename: (.*)$/ { print $2; }'
)
release
=
${
release
:-${
current_release
}}
release
=
${
release
:-${
current_release
}}
valid_releases
=(
'wheezy'
'jessie'
'stretch'
'sid'
)
valid_releases
=(
'wheezy'
'jessie'
'stretch'
'sid'
)
if
[[
!
"
${
valid_releases
[*]
}
"
=
~
(
^|[^[:alpha:]]
)
$release
([
^[:alpha:]]|
$)
]]
;
then
if
[[
!
"
${
valid_releases
[*]
}
"
=
~
(
^|[^[:alpha:]]
)
$release
([
^[:alpha:]]|
$)
]]
;
then
...
@@ -747,41 +750,41 @@ fi
...
@@ -747,41 +750,41 @@ fi
# detect rootfs
# detect rootfs
config
=
"
$path
/config"
config
=
"
$path
/config"
if
[
-z
"
$rootfs
"
]
;
then
if
[
-z
"
$rootfs
"
]
;
then
if
grep
-q
'^lxc.rootfs'
$config
2> /dev/null
;
then
if
grep
-q
'^lxc.rootfs'
"
$config
"
2> /dev/null
;
then
rootfs
=
$(
awk
-F
=
'/^lxc.rootfs[ \t]+=/{ print $2 }'
$config
)
rootfs
=
$(
awk
-F
=
'/^lxc.rootfs[ \t]+=/{ print $2 }'
"
$config
"
)
else
else
rootfs
=
$path
/rootfs
rootfs
=
$path
/rootfs
fi
fi
fi
fi
# determine the number of ttys - default is 4
# determine the number of ttys - default is 4
if
grep
-q
'^lxc.tty'
$config
2> /dev/null
;
then
if
grep
-q
'^lxc.tty'
"
$config
"
2> /dev/null
;
then
num_tty
=
$(
awk
-F
=
'/^lxc.tty[ \t]+=/{ print $2 }'
$config
)
num_tty
=
$(
awk
-F
=
'/^lxc.tty[ \t]+=/{ print $2 }'
"
$config
"
)
else
else
num_tty
=
4
num_tty
=
4
fi
fi
install_debian
$rootfs
$release
$arch
$LXC_CACHE_PATH
"
$interpreter
"
"
$interpreter_path
"
$flushcache
install_debian
"
$rootfs
"
"
$release
"
"
$arch
"
"
$LXC_CACHE_PATH
"
"
$interpreter
"
"
$interpreter_path
"
"
$flushcache
"
if
[
$?
-ne
0
]
;
then
if
[
$?
-ne
0
]
;
then
echo
"failed to install debian"
echo
"failed to install debian"
exit
1
exit
1
fi
fi
configure_debian
$rootfs
$name
$num_tty
configure_debian
"
$rootfs
"
"
$name
"
$num_tty
if
[
$?
-ne
0
]
;
then
if
[
$?
-ne
0
]
;
then
echo
"failed to configure debian for a container"
echo
"failed to configure debian for a container"
exit
1
exit
1
fi
fi
copy_configuration
$path
$rootfs
$name
$arch
$num_tty
copy_configuration
"
$path
"
"
$rootfs
"
"
$name
"
$arch
$num_tty
if
[
$?
-ne
0
]
;
then
if
[
$?
-ne
0
]
;
then
echo
"failed write configuration file"
echo
"failed write configuration file"
exit
1
exit
1
fi
fi
configure_debian_systemd
$path
$rootfs
$config
$num_tty
configure_debian_systemd
"
$path
"
"
$rootfs
"
"
$config
"
$num_tty
post_process
${
rootfs
}
${
release
}
${
arch
}
${
hostarch
}
"
${
interpreter
}
"
${
packages
}
post_process
"
${
rootfs
}
"
"
${
release
}
"
${
arch
}
${
hostarch
}
"
${
interpreter
}
"
"
${
packages
}
"
if
[
!
-z
"
$clean
"
]
;
then
if
[
!
-z
"
$clean
"
]
;
then
clean
||
exit
1
clean
||
exit
1
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment