diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 49e7c74..164412e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,34 +1,30 @@ image: docker:latest variables: + GIT_STRATEGY: fetch PACKER_VERSION: 1.2.0 ANNOUNCE: http://10.105.255.0:6969/announce WEBSEED: http://10.105.255.0/labsync/$CI_COMMIT_REF_NAME/$CI_PIPELINE_ID/images - PACKER_DOCKER_IMAGE: ${CI_REGISTRY_IMAGE}/packer - MKTORRENT_DOCKER_IMAGE: ${CI_REGISTRY_IMAGE}/mktorrent + DOCKER_IMAGE: ${CI_REGISTRY_IMAGE}/labsync-builder stages: - prepare - build - torrent -# - deploy -# + services: - docker:dind before_script: - docker info - - apk add --no-cache make + - apk add --no-cache make openssh-client rsync dockerimage: stage: prepare script: - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY - make dockerimg - - docker push $PACKER_DOCKER_IMAGE - - docker push $MKTORRENT_DOCKER_IMAGE - only: - - /ci/ + - docker push $DOCKER_IMAGE tags: - fablab @@ -36,25 +32,14 @@ squashfs: stage: build script: - make images/debian-stretch.squashfs + - echo "$rsa_labsync_raven" > /dev/shm/id_rsa && chmod 600 /dev/shm/id_rsa + - mkdir -p $HOME/.ssh && echo "$hostkeys_raven" >> $HOME/.ssh/known_hosts + - ssh -i /dev/shm/id_rsa labsync@raven.lab.fablab-nea.de "mkdir -p /opt/docker/tftpgen/labsync/${CI_BUILD_REF_NAME}/${CI_PIPELINE_ID}/images/" || true + - rsync -av -e "ssh -l labsync -i /dev/shm/id_rsa" images/ raven.lab.fablab-nea.de:/opt/docker/tftpgen/labsync/${CI_BUILD_REF_NAME}/${CI_PIPELINE_ID}/images/ || true + - ssh -i /dev/shm/id_rsa labsync@raven.lab.fablab-nea.de "cd /opt/docker/tftpgen && make labsync.cfg" || true artifacts: paths: - images expire_in: 2 weeks - only: - - /ci/ tags: - fablab - -mktorrent: - stage: torrent - script: - - make images/debian-stretch.torrent - artifacts: - paths: - - images - expire_in: 2 weeks - only: - - /ci/ - tags: - - fablab - diff --git a/Makefile b/Makefile index b9a7658..f7d042d 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,7 @@ PACKER_VERSION ?= 1.2.0 ANNOUNCE ?= http://10.2.2.1:6969/announce WEBSEED ?= http://10.2.2.1 -PACKER_DOCKER_IMAGE ?= labsync-packer -MKTORRENT_DOCKER_IMAGE ?= labsync-mktorrent +DOCKER_IMAGE ?= labsync-builder CWD=$(abspath $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))) @@ -11,13 +10,13 @@ qemu_ifname_br = brlabsync qemu_ifname_tap = taplabsync qemu_hostname = qemumachine qemu_host_ip = 10.2.2.1 +qemu_network = 10.2.2.0 qemu_netmask = 24 qemu_vm_ip = 10.2.2.10 qemu_disk = tmp/qemu-disk.img qemu_target ?= debian-stretch qemu_kernel = $(qemu_target).linux qemu_torrent = $(qemu_target).torrent - qemu_initramfs = $(shell \ if [ -e $(qemu_target).initramfs.dev ] && [ `date -r $(qemu_target).initramfs.dev +%s` -gt `date -r $(qemu_target).initramfs +%s` ]; then \ echo "$(qemu_target).initramfs.dev"; \ @@ -25,9 +24,10 @@ else \ echo "$(qemu_target).initramfs"; \ fi \ ) +ci_environment=$(shell env | sed -n 's/^\(CI_.*\)=.*/-e \1/p') .PHONY: default -default: dockerimg images/debian-stretch.squashfs images/debian-stretch.torrent +default: dockerimg images/debian-stretch.squashfs .PHONY: clean clean: @@ -36,8 +36,7 @@ clean: .PHONY: dockerimg dockerimg: - docker build -t "$(PACKER_DOCKER_IMAGE)" --build-arg "PACKER_VERSION=$(PACKER_VERSION)" packer/docker - docker build -t "$(MKTORRENT_DOCKER_IMAGE)" mktorrent + docker build -t "$(DOCKER_IMAGE)" --build-arg "PACKER_VERSION=$(PACKER_VERSION)" docker images: [ ! -d "$@" ] && mkdir "$@" @@ -51,19 +50,23 @@ images/debian-stretch.squashfs: images -v "${PWD}/images:/images" \ -e "user=`id -u`" \ -e "group=`id -g`" \ - "$(PACKER_DOCKER_IMAGE)" \ + -e "ANNOUNCE=$(ANNOUNCE)" \ + -e "WEBSEED=$(WEBSEED)" \ + $(ci_environment) \ + "$(DOCKER_IMAGE)" \ debian-stretch images/debian-stretch.torrent: images docker run \ --rm \ - -v "${PWD}/images:/workdir" \ + -v "${PWD}/images:/images" \ -e "user=`id -u`" \ -e "group=`id -g`" \ -e "ANNOUNCE=$(ANNOUNCE)" \ -e "WEBSEED=$(WEBSEED)" \ - "$(MKTORRENT_DOCKER_IMAGE)" \ - debian-stretch.squashfs + -e "TASK=torrent" \ + "$(DOCKER_IMAGE)" \ + debian-stretch # updates the initramfs # only used for development @@ -109,7 +112,7 @@ tmp/tftproot/debian-installer/amd64/boot-screens/txt.cfg: txt.cfg sudo brctl addif $(qemu_ifname_br) $(qemu_ifname_tap) .PHONY: docker-services -docker-services: +docker-services: qemu-network docker-compose up -d .PHONY: qemu-network @@ -119,6 +122,7 @@ qemu-network: /sys/devices/virtual/net/$(qemu_ifname_br)/brif/$(qemu_ifname_tap fi sudo ip link set $(qemu_ifname_tap) up sudo ip link set $(qemu_ifname_br) up + sudo iptables -t nat -A POSTROUTING -s $(qemu_network)/$(qemu_netmask) ! -o $(qemu_ifname_br) -j MASQUERADE .PHONY: qemu qemu: qemu-network $(qemu_disk) docker-services @@ -130,7 +134,18 @@ qemu: qemu-network $(qemu_disk) docker-services -enable-kvm \ -m 1G \ -net nic \ - -net tap,ifname=$(qemu_ifname_tap),script=no,downscript=no + -net tap,ifname=$(qemu_ifname_tap),script=no,downscript=no \ + -boot order=n + +.PHONY: qemu-localboot +qemu-localboot: qemu-network $(qemu_disk) + qemu-system-x86_64 \ + -drive format=raw,file="$(qemu_disk)" \ + -enable-kvm \ + -m 1G \ + -net nic \ + -net tap,ifname=$(qemu_ifname_tap),script=no,downscript=no \ + -boot order=c .PHONY: qemu-tftp docker-services qemu-tftp: tmp/tftproot tmp/tftproot/images tmp/tftproot/debian-installer/amd64/boot-screens/txt.cfg qemu-network $(qemu_disk) diff --git a/packer/docker/Dockerfile b/docker/Dockerfile similarity index 95% rename from packer/docker/Dockerfile rename to docker/Dockerfile index 6b0c57b..5ad9c17 100644 --- a/packer/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,7 +2,9 @@ FROM docker:dind RUN apk add --no-cache \ ansible \ + mktorrent \ openssh-client \ + rsync \ squashfs-tools ARG PACKER_VERSION diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100755 index 0000000..50c592e --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,91 @@ +#!/bin/sh +set -e + +make_torrent() { + (cd /images + if [ "$NAME" = "" ]; then + # remove file extension + NAME="$(echo "$1" | sed 's/\.[^.]*//')" + fi + + if [ "$WEBSEED" = "" ]; then + echo '$WEBSEED not provided' >&2 + exit 1 + fi + if [ "$ANNOUNCE" = "" ]; then + echo '$ANNOUNCE not provided' >&2 + exit 1 + fi + + TORRENT_FILE="$NAME.torrent" + WEBSEED_URL="$WEBSEED/$1" + + if [ -e "$TORRENT_FILE" ]; then rm "$TORRENT_FILE"; fi + + mktorrent-borg \ + -n "$NAME" \ + -a "$ANNOUNCE" \ + -o "$TORRENT_FILE" \ + -l 22 \ + -w "$WEBSEED_URL" \ + "$1" + + if [ "$user" != "" ] && [ "$group" != "" ]; then + chown "$user:$group" "$TORRENT_FILE" + fi + ) +} + +run_packer() { + packer build "$PACKER_JSON" + + mkdir -p build/rootfs + tar xf build/rootfs.tar -C build/rootfs + + mv build/rootfs/artifacts/initramfs "/images/$INITRAMFS_FILE" + mv build/rootfs/artifacts/linux "/images/$LINUX_FILE" + + rm -rf build/rootfs/artifacts + + rm -- \ + build/rootfs/.dockerenv \ + build/rootfs/initrd.* \ + build/rootfs/vmlinuz* + + if [ -e "/images/$SQUASHFS_FILE" ]; then + rm "/images/$SQUASHFS_FILE" + fi + + mksquashfs build/rootfs "/images/$SQUASHFS_FILE" \ + -comp lzo \ + -Xcompression-level 9 + + rm -rf build + + if [ "$user" != "" ] && [ "$group" != "" ]; then + chown $user:$group \ + "/images/$INITRAMFS_FILE" \ + "/images/$LINUX_FILE" \ + "/images/$SQUASHFS_FILE" + fi +} + +NAME="$1" + +if [ "$NAME" = "" ]; then + echo 'no name supplied, stopping.' >&2 + exit 1 +fi + +export PACKER_JSON="$NAME.json" +export INITRAMFS_FILE="$NAME.initramfs" +export LINUX_FILE="$NAME.linux" +export SQUASHFS_FILE="$NAME.squashfs" + +if [ -z "$TASK" ] || [ "$TASK" == "packer" ]; then + run_packer +fi +if [ -z "$TASK" ] || [ "$TASK" == "torrent" ]; then + make_torrent "$NAME.squashfs" +fi + diff --git a/mktorrent/Dockerfile b/mktorrent/Dockerfile deleted file mode 100644 index 6410554..0000000 --- a/mktorrent/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM alpine - -RUN apk add --no-cache mktorrent \ - && mkdir /workdir - -COPY entrypoint.sh /usr/local/bin/entrypoint.sh - -WORKDIR /workdir - -ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] - diff --git a/mktorrent/entrypoint.sh b/mktorrent/entrypoint.sh deleted file mode 100755 index fc058b9..0000000 --- a/mktorrent/entrypoint.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -set -e - -if [ "$NAME" = "" ]; then - # remove file extension - NAME="$(echo "$1" | sed 's/\.[^.]*//')" -fi - -if [ "$WEBSEED" = "" ]; then - echo '$WEBSEED not provided' >&2 - exit 1 -fi -if [ "$ANNOUNCE" = "" ]; then - echo '$ANNOUNCE not provided' >&2 - exit 1 -fi - -TORRENT_FILE="$NAME.torrent" -WEBSEED_URL="$WEBSEED/$1" - -if [ -e "$TORRENT_FILE" ]; then rm "$TORRENT_FILE"; fi - -mktorrent-borg \ - -n "$NAME" \ - -a "$ANNOUNCE" \ - -o "$TORRENT_FILE" \ - -l 22 \ - -w "$WEBSEED_URL" \ - "$1" - -if [ "$user" != "" ] && [ "$group" != "" ]; then - chown "$user:$group" "$TORRENT_FILE" -fi diff --git a/packer/ansible/inventories/qemu b/packer/ansible/inventories/qemu new file mode 100644 index 0000000..90ce6ad --- /dev/null +++ b/packer/ansible/inventories/qemu @@ -0,0 +1,3 @@ +[default] +qemumachine ansible_host=10.2.2.10 +spielkiste ansible_host=10.105.255.154 diff --git a/packer/ansible/playbook.yml b/packer/ansible/playbook.yml index ce42729..0fed1d3 100644 --- a/packer/ansible/playbook.yml +++ b/packer/ansible/playbook.yml @@ -14,6 +14,6 @@ - role: packages tags: - packages - - role: labsync_seeder + - role: labsync tags: - - labsync_seeder + - labsync diff --git a/packer/ansible/roles/labsync/files/labsync-install-localboot.service b/packer/ansible/roles/labsync/files/labsync-install-localboot.service new file mode 100644 index 0000000..80bc0d9 --- /dev/null +++ b/packer/ansible/roles/labsync/files/labsync-install-localboot.service @@ -0,0 +1,11 @@ +[Unit] +Description=creates boot partition and installs grub to disk +After=network.target + +[Service] +ExecStart=/usr/local/sbin/labsync-install-localboot.sh +Type=oneshot +EnvironmentFile=/etc/environment + +[Install] +WantedBy=multi-user.target diff --git a/packer/ansible/roles/labsync/files/labsync-install-localboot.sh b/packer/ansible/roles/labsync/files/labsync-install-localboot.sh new file mode 100755 index 0000000..6e89372 --- /dev/null +++ b/packer/ansible/roles/labsync/files/labsync-install-localboot.sh @@ -0,0 +1,17 @@ +#!/bin/sh +boot_partition='/dev/sda1' +localboot="$(sed -n 's/^.*labsync_localboot=\([^ ]*\).*$/\1/p' /proc/cmdline)" + +if [ -z "$localboot" ]; then + umount "$boot_partition" || true + echo "$boot_partition /boot ext2 defaults 0 0" > /etc/fstab + mke2fs -t ext2 -F "$boot_partition" + mount /boot + rsync -av /usr/local/boot/ /boot/ + grub-install /dev/sda + sed -i 's/^\(GRUB_DEVICE=\).*$/\1""/' /usr/sbin/grub-mkconfig + #sed -i 's/^\(GRUB_CMDLINE_LINUX_DEFAULT=\).*$/\1'"'quiet boot=labsync labsync_localboot=\"$LABSYNC\"'/" /etc/default/grub + sed -i 's/^\(GRUB_CMDLINE_LINUX=\).*$/\1'"'boot=labsync labsync_localboot=\"$LABSYNC\"'/" /etc/default/grub + sed -i 's/^\(GRUB_TIMEOUT\)=.*$/\1=0/' /etc/default/grub + update-grub +fi diff --git a/packer/ansible/roles/labsync_seeder/files/labsync-seeder.service b/packer/ansible/roles/labsync/files/labsync-seeder.service similarity index 86% rename from packer/ansible/roles/labsync_seeder/files/labsync-seeder.service rename to packer/ansible/roles/labsync/files/labsync-seeder.service index 79f2b9c..3e606c2 100644 --- a/packer/ansible/roles/labsync_seeder/files/labsync-seeder.service +++ b/packer/ansible/roles/labsync/files/labsync-seeder.service @@ -6,6 +6,7 @@ After=network.target ExecStart=/usr/local/sbin/labsync-seeder.sh PrivateTmp=yes Type=simple +EnvironmentFile=/etc/environment [Install] WantedBy=multi-user.target diff --git a/packer/ansible/roles/labsync/files/labsync-seeder.sh b/packer/ansible/roles/labsync/files/labsync-seeder.sh new file mode 100755 index 0000000..5b4b203 --- /dev/null +++ b/packer/ansible/roles/labsync/files/labsync-seeder.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e + +cd /tmp + +ln -s "$LABSYNC_SQUASHFS_LV" "$LABSYNC_SQUASHFS_FILE" + +exec aria2c \ + --allow-overwrite \ + --check-integrity \ + --seed-ratio=0.0 \ + --summary-interval=60 \ + --file-allocation=none \ + --enable-dht=false \ + "$LABSYNC_TORRENT" diff --git a/packer/ansible/roles/labsync/tasks/localboot.yml b/packer/ansible/roles/labsync/tasks/localboot.yml new file mode 100644 index 0000000..7335768 --- /dev/null +++ b/packer/ansible/roles/labsync/tasks/localboot.yml @@ -0,0 +1,30 @@ +--- +- name: install dependencies + apt: + name: "{{ item }}" + state: present + with_items: + - grub2 + - rsync + +- name: copy labsync-install-localboot script + copy: + src: labsync-install-localboot.sh + dest: /usr/local/sbin/labsync-install-localboot.sh + owner: root + group: root + mode: "0744" + +- name: copy systemd unit for labsync-install-localboot service + copy: + src: labsync-install-localboot.service + dest: /etc/systemd/system/labsync-install-localboot.service + owner: root + group: root + mode: "0644" + +- name: enable labsync-install-localboot service + file: + src: /etc/systemd/system/labsync-install-localboot.service + dest: /etc/systemd/system/multi-user.target.wants/labsync-install-localboot.service + state: link diff --git a/packer/ansible/roles/labsync/tasks/main.yml b/packer/ansible/roles/labsync/tasks/main.yml new file mode 100644 index 0000000..5520f9a --- /dev/null +++ b/packer/ansible/roles/labsync/tasks/main.yml @@ -0,0 +1,7 @@ +--- +- import_tasks: seeder.yml + tags: + - labsync:seeder +- import_tasks: localboot.yml + tags: + - labsync:localboot diff --git a/packer/ansible/roles/labsync/tasks/seeder.yml b/packer/ansible/roles/labsync/tasks/seeder.yml new file mode 100644 index 0000000..52c542f --- /dev/null +++ b/packer/ansible/roles/labsync/tasks/seeder.yml @@ -0,0 +1,29 @@ +--- +- name: copy labsync-seeder script + copy: + src: labsync-seeder.sh + dest: /usr/local/sbin/labsync-seeder.sh + owner: root + group: root + mode: "0744" + +- name: copy systemd unit for labsync-seeder service + copy: + src: labsync-seeder.service + dest: /etc/systemd/system/labsync-seeder.service + owner: root + group: root + mode: "0644" + +- name: enable labsync-seeder service + file: + src: /etc/systemd/system/labsync-seeder.service + dest: /etc/systemd/system/multi-user.target.wants/labsync-seeder.service + state: link + +#- name: enable labsync-seeder service +# systemd: +# name: labsync-seeder.service +# daemon_reload: yes +# enabled: yes +# masked: no diff --git a/packer/ansible/roles/labsync_seeder/files/labsync-seeder.sh b/packer/ansible/roles/labsync_seeder/files/labsync-seeder.sh deleted file mode 100755 index 27879a4..0000000 --- a/packer/ansible/roles/labsync_seeder/files/labsync-seeder.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -set -e - -set -- $(cat /proc/cmdline) -for x in "$@"; do - arg="$(echo $x | cut -d= -f1)" - case "$arg" in - disk|torrent_file|torrent) - eval $arg="$(echo $x | cut -d= -f2)" - ;; - esac -done - -cd /tmp - -ln -s "${disk}1" "$torrent_file" - -exec aria2c \ ---allow-overwrite \ ---check-integrity \ ---seed-ratio=0.0 \ ---summary-interval=60 \ ---file-allocation=none \ ---enable-dht=false \ -"$torrent" diff --git a/packer/ansible/roles/labsync_seeder/tasks/main.yml b/packer/ansible/roles/labsync_seeder/tasks/main.yml deleted file mode 100644 index be8d91e..0000000 --- a/packer/ansible/roles/labsync_seeder/tasks/main.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- - - name: copy labsync-seeder script - copy: - src: labsync-seeder.sh - dest: /usr/local/sbin/labsync-seeder.sh - owner: root - group: root - mode: "0744" - - - name: copy systemd unit for labsync-seeder service - copy: - src: labsync-seeder.service - dest: /etc/systemd/system/labsync-seeder.service - owner: root - group: root - mode: "0644" - - - name: enable labsync-seeder service - file: - src: /etc/systemd/system/labsync-seeder.service - dest: /etc/systemd/system/multi-user.target.wants/labsync-seeder.service - state: link - -# - name: enable labsync-seeder service -# systemd: -# name: labsync-seeder.service -# daemon_reload: yes -# enabled: yes -# masked: no diff --git a/packer/debian-stretch.json b/packer/debian-stretch.json index 298fcff..06df95d 100644 --- a/packer/debian-stretch.json +++ b/packer/debian-stretch.json @@ -7,7 +7,7 @@ "ci_commit_ref_slug": "{{env `CI_COMMIT_REF_SLUG`}}", "ci_job_name": "{{env `CI_JOB_NAME`}}", "ci_job_stage": "{{env `CI_JOB_STAGE`}}", - "ci_repository_url": "{{env `CI_REPOSITORY_URL`}}", + "ci_project_url": "{{env `CI_PROJECT_URL`}}", "ci_pipeline_triggered": "{{env `PIPELINE_TRIGGERED`}}", "ci_job_manual": "{{env `CI_JOB_MANUAL`}}" }, @@ -32,7 +32,13 @@ { "type": "shell", "inline": [ - "sed -i 's/@@CI_REPOSITORY_URL@@/{{user `ci_repository_url`}}/' /etc/initramfs-tools/scripts/labsync" + "echo \"LABSYNC_JOB_ID='{{user `ci_job_id`}}'\" >> /etc/environment", + "echo \"LABSYNC_COMMIT_SHA='{{user `ci_commit_sha`}}'\" >> /etc/environment", + "echo \"LABSYNC_COMMIT_TAG='{{user `ci_commit_tag`}}'\" >> /etc/environment", + "echo \"LABSYNC_COMMIT_REF_NAME='{{user `ci_commit_ref_name`}}'\" >> /etc/environment", + "echo \"LABSYNC_COMMIT_REF_SLUG='{{user `ci_commit_ref_slug`}}'\" >> /etc/environment", + "echo \"LABSYNC_PROJECT_URL='{{user `ci_project_url`}}'\" >> /etc/environment", + "sed -i 's#@@PROJECT_URL@@#{{user `ci_project_url`}}#' /etc/initramfs-tools/scripts/labsync" ] }, { @@ -43,26 +49,33 @@ { "type": "shell", "inline": [ - "echo \"job: {{user `ci_job_id`}}\" > /.build-info", - "echo \"commit: {{user `ci_commit_sha`}}\" >> /.build-info", - "echo \"commit tag: {{user `ci_commit_tag`}}\" >> /.build-info", - "echo \"commit ref name: {{user `ci_commit_ref_name`}}\" >> /.build-info", - "echo \"commit ref slug: {{user `ci_commit_ref_slug`}}\" >> /.build-info", + "set -x", "apt-get update", "apt-get -y dist-upgrade", - "apt-get -y install aria2 initramfs-tools linux-image-amd64 lvm2 openssh-server python", - "echo 'RESUME=none' > /etc/initramfs-tools/conf.d/resume", + "rmdir /boot && ln -s /usr/local/boot /boot", + "apt-get -y install initramfs-tools || true", "echo squashfs >> /etc/initramfs-tools/modules", "echo overlay >> /etc/initramfs-tools/modules", - "mkdir /artifacts", - "mkinitramfs -o /artifacts/initramfs $(find /boot -name 'vmlinuz-*' -printf '%f\\n' | sed 's/^vmlinuz-//')", - "cp $(find /boot -name 'vmlinuz-*' | sort -V | tail -n 1) /artifacts/linux" + "echo 'RESUME=none' > /etc/initramfs-tools/conf.d/resume", + "mkdir /usr/local/boot", + "apt-get -f -y install aria2 linux-image-amd64 lvm2", + "mkdir /artifacts", + "cp $(find /boot/ -name 'initrd.img-*' | sort -V | tail -n 1) /artifacts/initramfs", + "cp $(find /boot/ -name 'vmlinuz-*' | sort -V | tail -n 1) /artifacts/linux" ] }, + { + "type": "shell", + "inline": [ "apt-get -y install openssh-server python" ] + }, { "type": "ansible", "playbook_file": "ansible/playbook.yml", "user": "root" + }, + { + "type": "shell", + "inline": [ "rm /boot && mkdir /boot" ] } ] } diff --git a/packer/docker/entrypoint.sh b/packer/docker/entrypoint.sh deleted file mode 100755 index 5261f98..0000000 --- a/packer/docker/entrypoint.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh - -set -e - -NAME="$1" - -if [ "$NAME" = "" ]; then - echo 'no name supplied, stopping.' >&2 - exit 1 -fi - -PACKER_JSON="$NAME.json" -INITRAMFS_FILE="$NAME.initramfs" -LINUX_FILE="$NAME.linux" -SQUASHFS_FILE="$NAME.squashfs" - -packer build "$PACKER_JSON" - -mkdir -p build/rootfs -tar xf build/rootfs.tar -C build/rootfs - -mv build/rootfs/artifacts/initramfs "/images/$INITRAMFS_FILE" -mv build/rootfs/artifacts/linux "/images/$LINUX_FILE" - -rm -rf build/rootfs/artifacts - -rm -- \ - build/rootfs/.dockerenv \ - build/rootfs/initrd.* \ - build/rootfs/vmlinuz* - -if [ -e "/images/$SQUASHFS_FILE" ]; then - rm "/images/$SQUASHFS_FILE" -fi - -mksquashfs build/rootfs "/images/$SQUASHFS_FILE" \ - -comp lzo \ - -Xcompression-level 9 - -rm -rf build - -if [ "$user" != "" ] && [ "$group" != "" ]; then - chown $user:$group \ - "/images/$INITRAMFS_FILE" \ - "/images/$LINUX_FILE" \ - "/images/$SQUASHFS_FILE" -fi - - diff --git a/packer/initramfs/labsync b/packer/initramfs/labsync index 2884331..0aada90 100755 --- a/packer/initramfs/labsync +++ b/packer/initramfs/labsync @@ -1,5 +1,17 @@ #!/bin/sh +labsync_set_environment() { + if grep -q "^${1}=" /root/etc/environment; then + sed -i "s/^\(${1}\)=.*$/\1='${2}'/" /root/etc/environment + else + echo "${1}='${2}'" >> /root/etc/environment + fi +} + +labsync_lv_path() { + lvm lvs "$1/$2" -o LV_PATH --noheadings | sed 's/\s//g' +} + labsync_create_or_resize_lv() { vg="$1" lv="$2" @@ -9,7 +21,7 @@ labsync_create_or_resize_lv() { if [ -z "$current_lv_size_bytes" ]; then # no size returned, it's likely that lv doesn't exist - lvm lvcreate -L ${new_size_bytes}b -n "$lv" "$vg" + lvm lvcreate --wipesignatures y -L ${new_size_bytes}b -n "$lv" "$vg" elif [ "$minimum_size_bytes" != "" ] && [ $minimum_size_bytes -gt 0 ]; then # lv already exists if [ $current_lv_size_bytes -lt $minimum_size_bytes ]; then @@ -32,15 +44,17 @@ labsync_err() { } labsync_top() { - # Check if mandatory parameters are missing - if [ -z "${labsync_disk}" ]; then - labsync_err "The disk parameter is missing" - fi - if [ -z "${labsync_partsize_boot}" ]; then - labsync_err "The partsize_boot parameter is missing" - fi - if [ -z "${labsync_torrent}" ]; then - labsync_err "The torrent parameter is missing" + if [ -z ${labsync_localboot} ]; then + # Check if mandatory parameters are missing + if [ -z "${labsync_disk}" ]; then + labsync_err "The disk parameter is missing" + fi + if [ -z "${labsync_partsize_boot}" ]; then + labsync_err "The partsize_boot parameter is missing" + fi + if [ -z "${labsync_torrent}" ]; then + labsync_err "The torrent parameter is missing" + fi fi cat << EOM @@ -52,32 +66,52 @@ Starting "mm "mm"# ##m#" "mmm" "# # # "#mm" m" "" -@@CI_REPOSITORY_URL@@ +@@PROJECT_URL@@ EOM } labsync_premount() { - labsync_info "Configuring networking" - configure_networking + if [ -z "$labsync_localboot" ]; then + labsync_info "Configuring networking" + configure_networking + fi } labsync_mount_root() { - labsync_info "Downloading torrent file from ${labsync_torrent}" - while ! wget -T 10 -O /tmp/torrent "${labsync_torrent}"; do sleep 1; done - aria2c -S /tmp/torrent > /tmp/torrent_info - squashfs_file="$(sed -n '/idx|path\/length/,${s/\s*1|\(.*\)$/\1/p}' /tmp/torrent_info)" - image_size_bytes="$(sed -n 's/Total Length: .*(\([0-9,]*\)).*$/\1/p' /tmp/torrent_info | tr -d ',')" - torrent_name="$(sed -n 's/^Name: \(.*\)$/\1/p' /tmp/torrent_info)" + set -x + sed -i 's/use_lvmetad = 1/use_lvmetad = 0/' /etc/lvm/lvm.conf + vg_name="vglab" + if [ -z "$labsync_localboot" ]; then + labsync_info "Downloading torrent file from ${labsync_torrent}" + while ! wget -T 10 -O /tmp/torrent "${labsync_torrent}"; do sleep 1; done + aria2c -S /tmp/torrent > /tmp/torrent_info + squashfs_file="$(sed -n '/idx|path\/length/,${s/\s*1|\(.*\)$/\1/p}' /tmp/torrent_info)" + image_size_bytes="$(sed -n 's/Total Length: .*(\([0-9,]*\)).*$/\1/p' /tmp/torrent_info | tr -d ',')" + torrent_name="$(sed -n 's/^Name: \(.*\)$/\1/p' /tmp/torrent_info)" - labsync_info "Updating partitions" - size_disk=$(blockdev --getsz ${labsync_disk}) - size_part_1=$((labsync_partsize_boot * 1024 * 1024 / 512)) - size_part_2=$(((size_disk - labsync_partsize_boot) * 1024 * 1024 / 512)) - start_part_2=$((size_part_1 + 2048)) + lv_name_sqashfs="sqfs-$torrent_name" + lv_name_overlay="ovly-$torrent_name" - sfdisk -q ${labsync_disk} << PARTTABLE + labsync_info "Updating partitions" + size_disk=$(blockdev --getsz ${labsync_disk}) + size_part_1=$((labsync_partsize_boot * 1024 * 1024 / 512)) + size_part_2=$(((size_disk - labsync_partsize_boot) * 1024 * 1024 / 512)) + start_part_2=$((size_part_1 + 2048)) + + dmsetup ls --tree + + lvm vgs -o NAME --noheadings | while read vg; do + if [ "$vg" != "$vg_name" ]; then + lvm vgchange -an "$vg" + find /dev -mindepth 1 -maxdepth 1 -name "$vg" -exec dmsetup remove '{}' \; + fi + done + + dmsetup ls --tree + + sfdisk --force -q ${labsync_disk} << PARTTABLE label: dos label-id: 0xdeadbeef device: ${labsync_disk} @@ -87,60 +121,77 @@ ${labsync_disk}1 : start= 2048, size= $size_part_1, type=83 ${labsync_disk}2 : start=$start_part_2, size= $size_part_2, type=8e PARTTABLE + while ! blockdev --rereadpt /dev/sda; do + sleep 1 + done - labsync_info "Doing lvm stuff" - pv_device="${labsync_disk}2" - vg_name="vglab" - lv_name_sqashfs="sqfs-$torrent_name" - lv_name_overlay="ovly-$torrent_name" + labsync_info "Doing lvm stuff" + pv_device="${labsync_disk}2" - lvm pvcreate -t "$pv_device" - pvstatus=$? - if [ $pvstatus -eq 0 ]; then - # is not a physical volume - lvm pvcreate "$pv_device" + lvm pvcreate -t "$pv_device" + pvstatus=$? + if [ $pvstatus -eq 0 ]; then + # is not a physical volume + lvm pvcreate "$pv_device" + fi + + lvm vgcreate -t "$vg_name" "$pv_device" + vgstatus=$? + if [ $? -eq 0 ]; then + lvm vgcreate "$vg_name" "$pv_device" + fi + + labsync_create_or_resize_lv "$vg_name" "$lv_name_sqashfs" $((image_size_bytes * 2)) $image_size_bytes + labsync_create_or_resize_lv "$vg_name" "$lv_name_overlay" $((500 * 1024 * 1024)) + + #lvm vgchange -ay "$vg_name" + #lvm lvscan -a --ignorelockingfailure + #lvm lvchange -aly --ignorelockingfailure "$vg_name/$lv_name_sqashfs" + lv_path_squashfs="$(labsync_lv_path "$vg_name" "$lv_name_sqashfs")" + lv_path_overlay="$(labsync_lv_path "$vg_name" "$lv_name_overlay")" + + mke2fs -q -F -t ext4 "$lv_path_overlay" + + labsync_info "Downloading squashfs image $squashfs_file to $lv_path_squashfs" + (cd /tmp + ln -s "$(realpath "$lv_path_squashfs")" "$squashfs_file" + aria2c \ + --console-log-level=warn \ + --allow-overwrite \ + --check-integrity \ + --seed-time=0 \ + --summary-interval=0 \ + --file-allocation=none \ + --enable-dht=false \ + /tmp/torrent + ) + else + # local boot + lv_name_sqashfs="sqfs-$labsync_localboot" + lv_name_overlay="ovly-$labsync_localboot" + lv_path_squashfs="$(labsync_lv_path "$vg_name" "$lv_name_sqashfs")" + lv_path_overlay="$(labsync_lv_path "$vg_name" "$lv_name_overlay")" fi - lvm vgcreate -t "$vg_name" "$pv_device" - vgstatus=$? - if [ $? -eq 0 ]; then - lvm vgcreate "$vg_name" "$pv_device" - fi - - labsync_create_or_resize_lv "$vg_name" "$lv_name_sqashfs" $((image_size_bytes * 2)) $image_size_bytes - labsync_create_or_resize_lv "$vg_name" "$lv_name_overlay" $((500 * 1024 * 1024)) - - #lvm vgchange -ay "$vg_name" - #lvm lvscan -a --ignorelockingfailure - #lvm lvchange -aly --ignorelockingfailure "$vg_name/$lv_name_sqashfs" - lv_path_squashfs="$(lvm lvs "$vg_name/$lv_name_sqashfs" -o LV_PATH --noheadings --units b --nosuffix | sed 's/\s//g')" - lv_path_overlay="$(lvm lvs "$vg_name/$lv_name_overlay" -o LV_PATH --noheadings --units b --nosuffix | sed 's/\s//g')" - - labsync_info "Downloading squashfs image $squashfs_file to $lv_path_squashfs" - (cd /tmp - ln -s "$(realpath "$lv_path_squashfs")" "$squashfs_file" - aria2c \ - --console-log-level=warn \ - --allow-overwrite \ - --check-integrity \ - --seed-time=0 \ - --summary-interval=0 \ - --file-allocation=none \ - --enable-dht=false \ - /tmp/torrent - ) - labsync_info "Mounting squashfs and overlay" modprobe overlay mkdir -p /root mkdir /ro_root /rw_root mount -t squashfs "$(realpath "$lv_path_squashfs")" /ro_root - mke2fs -q -F -t ext4 "$lv_path_overlay" mount -t ext4 "$lv_path_overlay" /rw_root mkdir -p /rw_root/upper /rw_root/work mount -t overlay overlay -o lowerdir=/ro_root,upperdir=/rw_root/upper,workdir=/rw_root/work /root + if [ -z "$labsync_localboot" ]; then + labsync_set_environment LABSYNC "$torrent_name" + labsync_set_environment LABSYNC_TORRENT "${labsync_torrent}" + labsync_set_environment LABSYNC_SQUASHFS_FILE "$squashfs_file" + labsync_set_environment LABSYNC_SQUASHFS_LV "$lv_path_squashfs" + fi + case "$labsync_wait" in + "") + ;; pause) read x ;;