-
Notifications
You must be signed in to change notification settings - Fork 191
/
build.sh
86 lines (71 loc) · 2.09 KB
/
build.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/bin/bash
# Environment variables for the CentOS cloud image
ARCH="x86_64"
OS_VER="8"
ROOTFS_VER="8.2.2004-20200611.2"
ROOTFS_FN="CentOS-${OS_VER}-GenericCloud-${ROOTFS_VER}.${ARCH}.qcow2"
ROOTFS_URL="http://cloud.centos.org/centos/${OS_VER}/${ARCH}/images/${ROOTFS_FN}"
# Environment variables for Yuk7's wsldl
LNCR_BLD="20040300"
LNCR_ZIP="icons.zip"
LNCR_NAME="CentOS"
LNCR_FN=${LNCR_NAME}.exe
LNCR_ZIPFN=${LNCR_NAME}${OS_VER}.exe
LNCR_URL="https://github.com/yuk7/wsldl/releases/download/${LNCR_BLD}/${LNCR_ZIP}"
# Waits until a file appears or disappears
# - $1 File path to wait for its existence
# - [$2] The string 'a' (default) to wait until the file appears, or 'd' to wait until the file disappears
# - [$3] Timeout in seconds
waitFile() {
local START=$(cut -d '.' -f 1 /proc/uptime)
local MODE=${2:-"a"}
until [[ "${MODE}" = "a" && -e "$1" ]] || [[ "${MODE}" = "d" && ( ! -e "$1" ) ]]; do
sleep 1s
if [ -n "$3" ]; then
local NOW=$(cut -d '.' -f 1 /proc/uptime)
local ELAPSED=$(( NOW - START ))
if [ $ELAPSED -ge "$3" ]; then break; fi
fi
done
}
# Create a work dir
mkdir wsl
cd wsl
# Download the CentOS cloud image and Yuk7's WSLDL
wget --no-verbose ${ROOTFS_URL} -O ${ROOTFS_FN}
wget --no-verbose ${LNCR_URL} -O ${LNCR_ZIP}
# Extract the CentOS WSL launcher
unzip ${LNCR_ZIP} ${LNCR_FN}
# Clean up
rm ${LNCR_ZIP}
# Mount the qcow2 image
sudo mkdir mntfs
sudo modprobe nbd
sudo qemu-nbd -c /dev/nbd0 --read-only ./${ROOTFS_FN}
waitFile /dev/nbd0p1 "a" 30
sudo mount -o ro /dev/nbd0p1 mntfs
# Clone the qcow2 image contents to a writable directory
sudo cp -a mntfs rootfs
# Unmount the qcow2 image
sudo umount mntfs
sudo qemu-nbd -d /dev/nbd0
waitFile /dev/nbd0p1 "d" 30
sudo rmmod nbd
sudo rmdir mntfs
# Clean up
rm ${ROOTFS_FN}
# Create a tar.gz of the rootfs
sudo tar -zcpf rootfs.tar.gz -C ./rootfs .
sudo chown "$(id -un)" rootfs.tar.gz
# Clean up
sudo rm -rf rootfs
# Create the distribution zip of WSL CentOS
mkdir out
mkdir dist
mv -f ${LNCR_FN} ./out/${LNCR_ZIPFN}
mv -f rootfs.tar.gz ./out/
pushd out
zip ../dist/CentOS${OS_VER}.zip ./*
popd
# Clean up
rm -rf out