contrib/nm-live-vm: merge branch 'contrib/nm-live-vm'
Merge script to create a VM image with NetworkManager. Signed-off-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:
4
contrib/fedora/nm-live-vm/.gitignore
vendored
Normal file
4
contrib/fedora/nm-live-vm/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
.build.log
|
||||
nm-live-vm/
|
||||
nm-live-vm.tar.gz
|
||||
nm-live-vm-bundle.sh
|
20
contrib/fedora/nm-live-vm/README
Normal file
20
contrib/fedora/nm-live-vm/README
Normal file
@@ -0,0 +1,20 @@
|
||||
NetworkManager live VM scripts
|
||||
------------------------------
|
||||
|
||||
This set of scripts can be used to build a live initramfs image suitable for
|
||||
testing NetworkManager in a virtual environment. The scripts themselves are
|
||||
intended to be used by a power user who can adapt them to their needs. The
|
||||
result, on the contrary, is intended to be used by anyone who wants to play
|
||||
with NetworkManager on the command line.
|
||||
|
||||
Building the initramfs image:
|
||||
|
||||
sudo ./build.sh [-n name] [-b branch/commit]
|
||||
|
||||
You may have to update ./build.sh to suit your distribution. The included
|
||||
version is prepared for Fedora 20 and the image is also build using Fedora 20
|
||||
repositories.
|
||||
|
||||
Then you can distribute the self-extracting archive and run it on other machines:
|
||||
|
||||
./nm-live-vm-bundle.sh
|
154
contrib/fedora/nm-live-vm/build.sh
Executable file
154
contrib/fedora/nm-live-vm/build.sh
Executable file
@@ -0,0 +1,154 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
set -vx
|
||||
|
||||
die() {
|
||||
echo "$@" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
BASEDIR="$(readlink -f "$(dirname "$0")")"
|
||||
cd "$BASEDIR" || die "Could not switch directory."
|
||||
|
||||
# copy output also to logfile
|
||||
exec > >(tee ./.build.log)
|
||||
exec 2>&1
|
||||
|
||||
if git rev-parse --git-dir 2> /dev/null; then
|
||||
INSIDE_GIT=1
|
||||
else
|
||||
INSIDE_GIT=
|
||||
fi
|
||||
|
||||
NAME="nm-live-vm"
|
||||
if [[ $INSIDE_GIT ]]; then
|
||||
NM_BRANCH="HEAD"
|
||||
else
|
||||
NM_BRANCH=master
|
||||
fi
|
||||
|
||||
BUILD_PACKAGES="qemu febootstrap mock rpmdevtools"
|
||||
ARCH=i386
|
||||
ROOT="${ROOT:-"fedora-20-$ARCH"}"
|
||||
TREE="/var/lib/mock/$ROOT/root"
|
||||
PACKAGES="kernel passwd git autoconf automake libtool intltool gtk-doc libnl3-devel
|
||||
dbus-glib-devel libgudev1-devel libuuid-devel nss-devel ppp-devel newt-devel libndp-devel
|
||||
readline-devel
|
||||
gobject-introspection-devel
|
||||
pygobject3
|
||||
dhclient dnsmasq
|
||||
bash-completion man-db man-pages vim-minimal
|
||||
firewald
|
||||
vim
|
||||
wget
|
||||
gdb valgrind lsof strace nmap-ncat tcpdump
|
||||
net-tools bridge-utils vconfig
|
||||
openssh-server
|
||||
teamd libteam"
|
||||
KERNEL_URL=http://kojipkgs.fedoraproject.org/packages/kernel/3.12.9/301.fc20/i686/kernel-3.12.9-301.fc20.i686.rpm
|
||||
KERNEL=`basename "${KERNEL_URL%.rpm}"`
|
||||
#RELEASE="http://kojipkgs.fedoraproject.org/packages/fedora-release/20/1/noarch/fedora-release-20-1.noarch.rpm"
|
||||
#PACKAGES="systemd bash"
|
||||
|
||||
check_root() {
|
||||
test "$EUID" -eq 0
|
||||
}
|
||||
|
||||
do_prepare() {
|
||||
echo "Installing build packages..."
|
||||
check_root || die "$0 must be run as root"
|
||||
rpm -q $BUILD_PACKAGES || yum install $BUILD_PACKAGES || exit 1
|
||||
echo
|
||||
}
|
||||
|
||||
do_chroot() {
|
||||
echo "Building the chroot..."
|
||||
mock -r "$ROOT" --init || exit 1
|
||||
mock -r "$ROOT" --install $PACKAGES || exit 1
|
||||
#mock -r "$ROOT" --installdeps NetworkManager || exit 1
|
||||
mock -r "$ROOT" --chroot cp /sbin/init /init || exit 1
|
||||
echo
|
||||
}
|
||||
|
||||
do_build() {
|
||||
echo "Building NetworkManager..."
|
||||
|
||||
if [[ $INSIDE_GIT ]]; then
|
||||
# make first a local, bare clone of our git repository and copy it into the chroot.
|
||||
# nm-make-script.sh will try to fetch from it first, to save bandwidth
|
||||
GIT1="`git rev-parse --show-toplevel`"
|
||||
GIT2="`mktemp --tmpdir -d nm.git-XXXXXXXXX`"
|
||||
git clone --bare "$GIT1" "$GIT2" || die "Could not make local clone of git dir"
|
||||
mock -r "$ROOT" --chroot 'rm -rf /NetworkManager-local.git'
|
||||
mock -r "$ROOT" --copyin "$GIT2" "/NetworkManager-local.git" || die "Could not copy local repositoy"
|
||||
rm -rf "$GIT2"
|
||||
fi
|
||||
|
||||
# run the make script in chroot.
|
||||
mock -r "$ROOT" --copyin nm-make-script.sh "/usr/local/sbin/" || exit 1
|
||||
mock -r "$ROOT" --chroot "/usr/local/sbin/nm-make-script.sh \"$NM_BRANCH\"" || exit 1
|
||||
test -f "$TREE/usr/sbin/NetworkManager" || die "NetworkManager binary not found"
|
||||
echo
|
||||
}
|
||||
|
||||
do_live_vm() {
|
||||
echo "Preparing kernel and initrd..." || exit 1
|
||||
mkdir -p $NAME || exit 1
|
||||
cp $TREE/boot/vmlinuz* $NAME/vmlinuz || exit 1
|
||||
mock -r "$ROOT" --chroot "{ ( cd / ; \
|
||||
echo '/dev/sda1 /mnt/sda1 vfat defaults 0 0' >> /etc/fstab ; \
|
||||
find -not \( \
|
||||
-path ./tmp/initramfs.img -o \
|
||||
-path './var/cache/yum/*' -o \
|
||||
-path './boot' \
|
||||
\) -xdev -print0 | \
|
||||
cpio -o0c ) || exit 1; } | gzip > /tmp/initramfs.img || exit 1" || die "error creating initramfs"
|
||||
cp "$TREE/tmp/initramfs.img" "$NAME/" || exit 1
|
||||
cp run.sh $NAME/run.sh
|
||||
}
|
||||
|
||||
do_archive() {
|
||||
echo "Creating the archive..."
|
||||
tar -czvf $NAME.tar.gz $NAME || exit 1
|
||||
EXTRACT_SCRIPT=$(sed -e "s/__NAME_PLACEHOLDER__/$NAME/g" < self-extract.sh)
|
||||
echo "$EXTRACT_SCRIPT" | cat - ${NAME}.tar.gz > ${NAME}-bundle.sh || exit 1
|
||||
chmod +x ${NAME}-bundle.sh || exit 1
|
||||
echo "Successfully completed"
|
||||
echo
|
||||
echo "Now you can run and/or distribute: ${NAME}-bundle.sh"
|
||||
}
|
||||
|
||||
|
||||
if [ "$1" = "-n" ]; then
|
||||
test -n "$2" || { echo "Name for initramfs is expected"; exit 1; }
|
||||
NAME=$2
|
||||
shift 2
|
||||
fi
|
||||
|
||||
if [ "$1" = "-b" ]; then
|
||||
test -n "$2" || { echo "NM branch (commit) is expected"; exit 1; }
|
||||
NM_BRANCH=$2
|
||||
shift 2
|
||||
fi
|
||||
|
||||
if [[ $INSIDE_GIT ]]; then
|
||||
NM_BRANCH="$(git rev-parse -q --verify "$NM_BRANCH")" || die "Could not resolve branch $NM_BRANCH"
|
||||
fi
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
check_root && do_prepare
|
||||
do_chroot
|
||||
do_build
|
||||
do_live_vm
|
||||
do_archive
|
||||
exit 0
|
||||
fi
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
do_$1; shift
|
||||
exit 0
|
||||
done
|
||||
|
||||
echo "Wrong number of arguments."
|
||||
exit 1
|
79
contrib/fedora/nm-live-vm/nm-make-script.sh
Executable file
79
contrib/fedora/nm-live-vm/nm-make-script.sh
Executable file
@@ -0,0 +1,79 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -vx
|
||||
|
||||
die() {
|
||||
echo "$@" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
COMMIT=${1:-origin/master}
|
||||
|
||||
URL="${2:-"git://anongit.freedesktop.org/NetworkManager/NetworkManager"}"
|
||||
|
||||
passwd -d root
|
||||
test -d /NetworkManager || (
|
||||
git init /NetworkManager
|
||||
cd /NetworkManager
|
||||
|
||||
# check if there is a local git repository and fetch from it first (should be faster)
|
||||
test -d "/NetworkManager-local.git" && (
|
||||
git remote add local "/NetworkManager-local.git"
|
||||
git fetch local
|
||||
git remote remove local
|
||||
rm -rf "/NetworkManager-local.git"
|
||||
)
|
||||
git remote add origin "$URL"
|
||||
)
|
||||
cd /NetworkManager/ || exit 1
|
||||
git fetch origin || die "Could not fetch $URL"
|
||||
git checkout -f "$COMMIT" || exit 1
|
||||
git clean -fdx
|
||||
export CFLAGS='-g -Og'
|
||||
export CXXFLAGS='-g -Og'
|
||||
./autogen.sh --prefix=/usr \
|
||||
--exec-prefix=/usr \
|
||||
--libdir=/usr/lib \
|
||||
--sysconfdir=/etc \
|
||||
--localstatedir=/var \
|
||||
--with-nmtui=yes \
|
||||
--enable-gtk-doc || exit 1
|
||||
make || exit 1
|
||||
#make check || exit 1
|
||||
make install || exit 1
|
||||
cat <<EOF > /etc/NetworkManager/NetworkManager.conf
|
||||
[main]
|
||||
plugins=ifcfg-rh
|
||||
debug=RLIMIT_CORE
|
||||
[logging]
|
||||
level=DEBUG
|
||||
domains=ALL
|
||||
EOF
|
||||
/bin/systemctl enable NetworkManager.service || exit 1
|
||||
/bin/systemctl enable sshd.service || exit 1
|
||||
|
||||
git config --global user.name "NetworkManager Test VM"
|
||||
git config --global user.email "networkmanager-maint@gnome.bugs"
|
||||
|
||||
cat <<EOF > /root/.vimrc
|
||||
EOF
|
||||
|
||||
cat <<EOF > /root/.bashrc
|
||||
LS_OPTIONS='--color=auto -Q'
|
||||
alias l='ls \$LS_OPTIONS -la'
|
||||
alias ll='ls \$LS_OPTIONS -l'
|
||||
EOF
|
||||
|
||||
# allow login for root via SSH, without password!!
|
||||
sed -e 's/^#\?\(PermitRootLogin *\).*/\1yes/' \
|
||||
-e 's/^#\?\(PermitEmptyPasswords *\).*/\1yes/' \
|
||||
-i /etc/ssh/sshd_config
|
||||
|
||||
# disable rate limiting of the journal
|
||||
sed -e 's/^#\?\(RateLimitInterval *= *\).*/\10/' \
|
||||
-e 's/^#\?\(RateLimitBurst *= *\).*/\10/' \
|
||||
-i /etc/systemd/journald.conf
|
||||
|
||||
mkdir /mnt/sda1
|
||||
|
||||
git gc
|
43
contrib/fedora/nm-live-vm/run.sh
Executable file
43
contrib/fedora/nm-live-vm/run.sh
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Three network interfaces
|
||||
NET_OPTIONS="-net nic -net user,hostfwd=tcp:127.0.0.1:10022-:22 -net nic -net user -net nic -net user"
|
||||
|
||||
OS="Linux"
|
||||
if [ -f /etc/redhat-release ]; then
|
||||
OS=`cat /etc/redhat-release | cut -d" " -f1,2,3,4`
|
||||
fi
|
||||
|
||||
DIR="$(dirname "$(readlink -f "$0")")"
|
||||
SDIR="$DIR/share"
|
||||
MEMORY=$((3*1024))
|
||||
|
||||
mkdir "$SDIR"
|
||||
|
||||
cd "$DIR"
|
||||
|
||||
if [ "$OS" == "Red Hat Enterprise Linux" ]; then
|
||||
# qemu-kvm is installed in /usr/libexec on RHEL6
|
||||
# and redirects its output to VNC server
|
||||
|
||||
rpm -q qemu-kvm tigervnc >&2 || exit 1
|
||||
|
||||
PATH=$PATH:/usr/libexec
|
||||
|
||||
qemu-kvm -vnc :0 -m $MEMORY $NET_OPTIONS -kernel vmlinuz -append "video=1024x768 rootfstype=ramfs" -initrd initramfs.img &
|
||||
|
||||
sleep 1
|
||||
vncviewer localhost
|
||||
|
||||
else
|
||||
# all other distros
|
||||
|
||||
QEMU="qemu-kvm"
|
||||
which $QEMU &>2 || {
|
||||
ARCH=`uname -m`
|
||||
which qemu-system-$ARCH &>2 || { echo "Neither '$QEMU' nor 'qemu-system-$ARCH' available"; exit 1; }
|
||||
QEMU="qemu-system-$ARCH -enable-kvm"
|
||||
}
|
||||
|
||||
$QEMU -m $MEMORY -net nic $NET_OPTIONS -drive "file=fat:rw:$SDIR,cache=none" -kernel vmlinuz -append "video=1024x768 rootfstype=ramfs" -initrd initramfs.img
|
||||
fi
|
17
contrib/fedora/nm-live-vm/self-extract.sh
Normal file
17
contrib/fedora/nm-live-vm/self-extract.sh
Normal file
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
|
||||
NAME=__NAME_PLACEHOLDER__
|
||||
BUNDLE=`readlink -f "$0"` || exit 1
|
||||
TEMP=`mktemp -d "$PWD/$NAME.XXXXXXXXXX"` || exit 1
|
||||
|
||||
echo "Extracting to: $TEMP"
|
||||
cd "$TEMP" || exit 1
|
||||
sed '1,/^__MARK__$/d' "$BUNDLE" > $NAME.tar.gz || exit 1
|
||||
tar -xvf $NAME.tar.gz || exit 1
|
||||
cd $NAME || exit 1
|
||||
|
||||
./run.sh || exit 1
|
||||
|
||||
#rm -rf "$TEMP"
|
||||
exit 0
|
||||
__MARK__
|
Reference in New Issue
Block a user