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:
Simon Bruder 2018-03-18 17:08:55 +00:00
commit 5b2128c5d6
20 changed files with 387 additions and 265 deletions

View file

@ -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

View file

@ -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)

View file

@ -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
View 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

View file

@ -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"]

View file

@ -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

View file

@ -0,0 +1,3 @@
[default]
qemumachine ansible_host=10.2.2.10
spielkiste ansible_host=10.105.255.154

View file

@ -14,6 +14,6 @@
- role: packages
tags:
- packages
- role: labsync_seeder
- role: labsync
tags:
- labsync_seeder
- labsync

View file

@ -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

View 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

View file

@ -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

View 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"

View 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

View file

@ -0,0 +1,7 @@
---
- import_tasks: seeder.yml
tags:
- labsync:seeder
- import_tasks: localboot.yml
tags:
- labsync:localboot

View 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

View file

@ -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"

View file

@ -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

View file

@ -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" ]
}
]
}

View file

@ -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

View file

@ -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
;;