diff options
author | VG <vg@devys.org> | 2016-10-28 23:20:19 +0200 |
---|---|---|
committer | VG <vg@devys.org> | 2016-10-28 23:20:19 +0200 |
commit | 4f11597d495853c4ef8d10d9cadd13c231b2bec3 (patch) | |
tree | 56f48ccfa6979c7d8c22a014c113e448d60c2275 /make-vm-debootstrap | |
download | debootstrap-scripts-4f11597d495853c4ef8d10d9cadd13c231b2bec3.tar.gz debootstrap-scripts-4f11597d495853c4ef8d10d9cadd13c231b2bec3.tar.bz2 debootstrap-scripts-4f11597d495853c4ef8d10d9cadd13c231b2bec3.zip |
m
Diffstat (limited to 'make-vm-debootstrap')
-rwxr-xr-x | make-vm-debootstrap | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/make-vm-debootstrap b/make-vm-debootstrap new file mode 100755 index 0000000..667eead --- /dev/null +++ b/make-vm-debootstrap @@ -0,0 +1,392 @@ +#!/bin/bash + +set -eu + +#if [ "$UID" != "0" ]; then +# exec sudo -- "$0" "$@" +#fi + +traperror() +{ + echo "args: $*" >&2 + echo "trace: ${FUNCNAME[*]} ${BASH_LINENO[*]}" >&2 + exit 1 +} + +fail() { echo "${FUNCNAME[1]} ${BASH_LINENO[0]}: $*" >&2; exit 1; } +#trap 'fail unhandled exception' ERR +trap 'traperror $LINENO ${FUNCNAME:-main} $BASH_LINENO; trap - ERR' ERR + +exec 3>&1 +exec >debootstrap.log +echo "I: log=debootstrap.log">&2 + +RELEASE=unstable +#MIRROR=http://fr.archive.ubuntu.com/ubuntu/ +MIRROR=http://apt:9999/debian/ +ARCH=amd64 +PKGS="$(sed 's/^#.*$//'<<EOF +apt +aptitude +bash +bash-completion +bind9-host +bmon +busybox +bzip2 +curl +ed +grub2 +htop +iftop +ifupdown +iotop +iperf +iproute2 +iptables +iputils-ping +isc-dhcp-client +less +lftp +linux-image-virtual +locales +locales libui-dialog-perl dialog +locate +ncdu +ncurses-base +ncurses-term +net-tools +netbase +netcat +nload +openssh-client +openssh-server +psmisc +python3 +ranger +rsync +runit +screen +sed +sl +socat +socklog +strace +tar +tcpdump +telnet +tmux +tree +tzdata +vim +vim-nox +vim-runtime +w3m +wget +zsh +EOF +)" + + + + fail I want to fail +#false + +test0() { + traperror test + #fail test of the week + echo 'test0' >&2 + false + echo 'test0-end' >&2 +} + +test0 + +false + +#echo "Warning: will erase $BLOCKDEV with mkfs.ext4 in 10seconds...">&2 +#for i in $(seq 10 -1 0); do sleep 1; printf "%d... " $i>&2; done +#echo>&2 +#mkfs -q -F -t ext4 -L rootfs "$BLOCKDEV" || exit 1 +#mkdir -p "$DESTDIR" +#echo "mounting block device...">&2 +#mount -v -t ext4 "$BLOCKDEV" "$DESTDIR" || \ +# mount -v -t ext4 -o loop "$BLOCKDEV" "$DESTDIR" || exit 1 +#echo "In case of error, please remember to umount $DESTDIR">&2 + +# compacting qcow2 images files +# You have to zerofill the data on the disk first. +# sfill -fllvz +# Then clone the image file +# qemu-img convert -p -O qcow2 ./source.img ./packed. + +#modprobe nbd max_part=16 +#qemu-nbd -c /dev/nbd0 image.qcow2 +#partprobe /dev/nbd0 +#mount /dev/nbd0p1 /mnt/image + +echo "I: debootstraping...">&2 +qemu-debootstrap --arch="$ARCH" \ + --include="$PKGS" --components=main,universe \ + "$RELEASE" "$DESTDIR" "$MIRROR" + +if [ ! -e "$KERNEL" ];then + echo "I: wget kernel...">&2 + wget -q "$MIRROR/dists/$RELEASE/main/installer-$ARCH/current/images/netboot/ubuntu-installer/$ARCH/linux" -O "$KERNEL" +fi + +echo "I: adjust configuration...">&2 +rm -f "$DESTDIR/etc/localtime" +cat "$DESTDIR/usr/share/zoneinfo/Europe/Paris" > "$DESTDIR/etc/localtime" + +# network +cat >"$DESTDIR/etc/network/interfaces"<<EOF +auto lo +iface lo inet loopback + +auto eth0 +iface eth0 inet static +address 10.1.1.252 +netmask 255.255.255.0 +gateway 10.1.1.254 +EOF +echo "127.0.0.1 localhost localhost.localdomain">"$DESTDIR/etc/hosts" +echo "localhost">"$DESTDIR/etc/hostname" +echo "servername 10.1.1.254">"$DESTDIR/etc/resolv.conf" + +for f in "$DESTDIR"/etc/init/tty[1-6].conf; do + echo "manual">${f%.conf}.override +done + +chmod +w "$DESTDIR/etc/sudoers" +sed 's,#* *%sudo.*,%sudo ALL=(ALL) NOPASSWD: ALL,' -i "$DESTDIR/etc/sudoers" +chmod -w "$DESTDIR/etc/sudoers" + +#UUID="$(blkid "$BLOCKDEV" | sed 's/^.*UUID="\([a-zA-Z0-9-]\+\)".*$/\1/')" +cat >"$DESTDIR/etc/fstab"<<EOF +# <device> <mount point> <type> <options> <dump> <pass> +/dev/vda / ext4 errors=remount-ro,noatime 0 1 +tmpfs /tmp tmpfs mode=1777,noatime,size=128m,nodev,nosuid,noexec 0 0 +tmpfs /var/log tmpfs mode=1777,noatime,size=4m,nodev,nosuid,noexec 0 0 +tmpfs /var/tmp tmpfs mode=1777,noatime,size=128m,nodev,nosuid,noexec 0 0 + +#UUID=$UUID / ext4 errors=remount-ro,noatime 0 1 +#UUID=use blkid for uuid discovery /home ext4 noatime 0 2 +#UUID=6d9ac889-3c25-4e05-90f3-d183f8b14aca none swap sw,auto 0 0 +EOF + +mkdir -p "$DESTDIR/etc/sv/ttyS0/" +mkdir -p "$DESTDIR/etc/service/" +cat >"$DESTDIR/etc/sv/ttyS0/run"<<"EOF" +#!/bin/bash +dev=/dev/ttyS0 +/bin/stty -F $dev sane clocal -crtscts -hupcl +exec <$dev >$dev 2>$dev +echo +echo "Press enter to continue..."; read +cd /root +/usr/bin/env -i HOME=/root PATH=/usr/sbin:/usr/bin:/sbin:/bin TERM=screen-256color /usr/bin/setsid /bin/bash +exec wait +#exec /bin/bash +#exec /usr/bin/env -i /bin/sh +#exec /usr/bin/setsid /bin/sh +EOF +chmod +x "$DESTDIR/etc/sv/ttyS0/run" +ln -sfv "/etc/sv/ttyS0/" "$DESTDIR/etc/service/" + +mkdir -p "$DESTDIR/etc/ssh" +cat >"$DESTDIR/etc/ssh/sshd_config"<<EOF +Port 22 +Protocol 2 +HostKey /etc/ssh/ssh_host_rsa_key +HostKey /etc/ssh/ssh_host_dsa_key +HostKey /etc/ssh/ssh_host_ecdsa_key +UsePrivilegeSeparation yes +KeyRegenerationInterval 3600 +ServerKeyBits 768 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin no +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords no +ChallengeResponseAuthentication no +PasswordAuthentication no +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +AcceptEnv LANG LC_* +Subsystem sftp /usr/lib/openssh/sftp-server +UsePAM yes +AllowUsers calendros +EOF + +cat > "$DESTDIR/etc/apt/sources.list" <<EOF +deb $MIRROR $RELEASE main universe +deb http://security.ubuntu.com/ubuntu/ $RELEASE-security main universe +EOF + +# /etc/default files: +cat > "$DESTDIR/etc/default/console-setup"<<EOF +VERBOSE_OUTPUT="no" +ACTIVE_CONSOLES="/dev/ttyS0" +CHARMAP="UTF-8" +CODESET="Uni2" +FONTFACE="Fixed" +FONTSIZE="16" +if [ -f /etc/default/keyboard ]; then + . /etc/default/keyboard +fi +EOF +cat >"$DESTDIR/etc/default/keyboard"<<EOF +XKBMODEL="pc105" +XKBLAYOUT="fr" +XKBVARIANT="bepo" +XKBOPTIONS="" +EOF +cat >"$DESTDIR/etc/default/locale"<<EOF +LANG="en_US.UTF-8" +LC_TIME="en_DK.UTF-8" +LC_PAPER="en_GB.UTF-8" +LC_MEASUREMENT="en_GB.UTF-8" +EOF + +cat >>"$DESTDIR/etc/bash.bashrc"<<EOF +# enable bash completion in interactive shells +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi +alias ls="ls --color=aut" +alias l="ls -CF" +alias ll="l -lh" +alias la="l -a" +alias e="vim" +alias rm='rm -i' +alias cp='cp -i' +alias mv='mv -i' +export PAGER=less +export EDITOR=vim +export VISUAL=vim +EOF + +mkdir -p "$DESTDIR/etc/vim" +cat >"$DESTDIR/etc/vim/vimrc"<<EOF +set nocompatible +set modelines=0 +set backspace=2 +syntax on +set autoindent +set ts=4 +set shiftwidth=4 +set ruler +set laststatus=2 +set statusline=%<%f%h%m%r%=%l,%c\ %P +set wildmode=list:full +set nobackup nowritebackup +set hlsearch +set whichwrap=<,>,[,] +set scrolloff=1 +EOF + +rm -r "$DESTDIR/etc/skel" +mkdir -p "$DESTDIR/etc/skel" + +cat > "$DESTDIR/init-stage2.sh" << EOF +#!/bin/sh +export PATH="/usr/sbin:/usr/bin:/sbin:/bin" +mount -no remount,rw / +mount -t proc proc /proc +mount -t sysfs sysfs /sys + +/debootstrap/debootstrap --second-stage + +# second stage may unmount this... +[ -e /proc/mounts ] || mount -t proc proc /proc +[ -e /sys/kernel ] || mount -t sysfs sysfs /sys +busybox mdev -s + +echo '------ mounts:' +cat /proc/mounts +echo '------' + +mv /etc/default/extlinux /etc/default/extlinux.dist +cat >/etc/default/extlinux<<EOF2 +EXTLINUX_UPDATE="true" +EXTLINUX_ALTERNATIVES="default" +EXTLINUX_DEFAULT="l0" +EXTLINUX_ENTRIES="all" +EXTLINUX_MEMDISK="true" +EXTLINUX_MEMDISK_DIRECTORY="/boot" +EXTLINUX_MENU_LABEL="Ubuntu GNU/Linux, kernel" +EXTLINUX_OS_PROBER="false" +EXTLINUX_PARAMETERS="ro quiet console=ttyS0,115200n8 panic=120 oops=panic" +EXTLINUX_ROOT="root=/dev/vda" +EXTLINUX_THEME="none" +EXTLINUX_TIMEOUT="1" # wait 1 tenth of a second (0 is wait forever...) +EOF2 +[ -e /dev/root ] || ln -sv /dev/vda /dev/root +extlinux -i /boot/extlinux/ + +passwd -d -l root +useradd -M -b /home -d /home/calendros -U -G sudo -s /bin/bash calendros +mkdir -p /home/calendros/.ssh/ +touch /home/calendros/.ssh/authorized_keys +chmod 700 /home/calendros/.ssh +chmod 600 /home/calendros/.ssh/authorized_keys +chown calendros:calendros -R /home/calendros +echo '. /etc/bash.bashrc' >~root/.bashrc +echo '. ~/.bashrc' >~root/.bash_profile +echo '. /etc/bash.bashrc' >~calendros/.bashrc +echo '. ~/.bashrc' >~calendros/.bash_profile + +locale-gen en_US.UTF-8 en_GB.UTF-8 en_DK.UTF-8 fr_FR.UTF-8 + +# dhclient may erase /etc/resolv.conf, and is not really useful here +#ip link set eth0 up +#dhclient eth0 +#apt-get update + +echo "Dropping a shell, press Ctrl-D or type exit to finish." +/bin/bash + +rm -v /etc/udev/rules.d/70-persistent-*.rules + +echo "Bootstrap ended, poweroff in 10seconds..." +rm /init-stage2.sh +#sleep 10 || exec /bin/bash # for debug +#poweroff & # does not work +sync +fuser -k / +sleep 1 +mount -o remount,ro / +exit 0 # will panic, but does not matter now (don't know how to shutdown o/w) +EOF +chmod +x "$DESTDIR/init-stage2.sh" + +cat >&2 <<EOF +I: please umount destination blockdev... +I: like: sudo umount -v "$DESTDIR" +I: then run vm, deboostrap phase 2 (adjust blockdev)... +I: export DEV=blockdev; qemu-system-x86_64 -machine accel=kvm -m 256 \\ + -monitor unix:/tmp/debootstrap-monitor,server,nowait \\ + -serial unix:/tmp/debootstrap-serial,server \\ + -vga vmware -display none \\ + -drive file="\$DEV",if=virtio \\ + -kernel "$KERNEL" \\ + -append "quiet rootdelay=10 root=/dev/vda init=/init-stage2.sh console=ttyS0,115200n8" +I: To copy this image to another host, remember to run: +I: extlinux -i /yourcopyplace/boot/extlinux/ +I: end of script... +EOF + |