Merge branch 'localboot' into 'master'
Implement booting from local disk, fixes #3 Closes #3 See merge request fablab/labsync!7
This commit is contained in:
commit
5b2128c5d6
20 changed files with 387 additions and 265 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
39
Makefile
39
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)
|
||||
|
|
|
|||
|
|
@ -2,7 +2,9 @@ FROM docker:dind
|
|||
|
||||
RUN apk add --no-cache \
|
||||
ansible \
|
||||
mktorrent \
|
||||
openssh-client \
|
||||
rsync \
|
||||
squashfs-tools
|
||||
|
||||
ARG PACKER_VERSION
|
||||
91
docker/entrypoint.sh
Executable file
91
docker/entrypoint.sh
Executable file
|
|
@ -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
|
||||
|
||||
|
|
@ -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"]
|
||||
|
||||
|
|
@ -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
|
||||
3
packer/ansible/inventories/qemu
Normal file
3
packer/ansible/inventories/qemu
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[default]
|
||||
qemumachine ansible_host=10.2.2.10
|
||||
spielkiste ansible_host=10.105.255.154
|
||||
|
|
@ -14,6 +14,6 @@
|
|||
- role: packages
|
||||
tags:
|
||||
- packages
|
||||
- role: labsync_seeder
|
||||
- role: labsync
|
||||
tags:
|
||||
- labsync_seeder
|
||||
- labsync
|
||||
|
|
|
|||
|
|
@ -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
|
||||
17
packer/ansible/roles/labsync/files/labsync-install-localboot.sh
Executable file
17
packer/ansible/roles/labsync/files/labsync-install-localboot.sh
Executable file
|
|
@ -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
|
||||
|
|
@ -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
|
||||
16
packer/ansible/roles/labsync/files/labsync-seeder.sh
Executable file
16
packer/ansible/roles/labsync/files/labsync-seeder.sh
Executable file
|
|
@ -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"
|
||||
30
packer/ansible/roles/labsync/tasks/localboot.yml
Normal file
30
packer/ansible/roles/labsync/tasks/localboot.yml
Normal file
|
|
@ -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
|
||||
7
packer/ansible/roles/labsync/tasks/main.yml
Normal file
7
packer/ansible/roles/labsync/tasks/main.yml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
- import_tasks: seeder.yml
|
||||
tags:
|
||||
- labsync:seeder
|
||||
- import_tasks: localboot.yml
|
||||
tags:
|
||||
- labsync:localboot
|
||||
29
packer/ansible/roles/labsync/tasks/seeder.yml
Normal file
29
packer/ansible/roles/labsync/tasks/seeder.yml
Normal file
|
|
@ -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
|
||||
|
|
@ -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"
|
||||
|
|
@ -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
|
||||
|
|
@ -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" ]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
@ -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
|
||||
;;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue