|
| 1 | +ARG VERSION=latest |
| 2 | +ARG UBUNTU_QEMU_DIR_DEFAULT="/opt/ubuntu-qemu" |
| 3 | +ARG UBUNTU_QEMU_IMG_DEFAULT="${UBUNTU_QEMU_DIR_DEFAULT}/ubuntu-20.04.img" |
| 4 | + |
| 5 | +FROM ghcr.io/project-chip/chip-build:${VERSION} as build-env |
| 6 | +LABEL org.opencontainers.image.source https://github.com/project-chip/connectedhomeip |
| 7 | + |
| 8 | +ARG BLUEZ_VERSION=5.72 |
| 9 | +ARG ELL_VERSION=0.62 |
| 10 | +ARG KERNEL_VERSION=6.7.3 |
| 11 | +ARG UBUNTU_QEMU_DIR_DEFAULT |
| 12 | +ARG UBUNTU_QEMU_IMG_DEFAULT |
| 13 | + |
| 14 | +ENV UBUNTU_QEMU_DIR=${UBUNTU_QEMU_DIR_DEFAULT} |
| 15 | +ENV UBUNTU_QEMU_IMG=${UBUNTU_QEMU_IMG_DEFAULT} |
| 16 | + |
| 17 | +RUN mkdir -p /tmp/workdir/linux |
| 18 | +COPY files/linux/0001-Bluetooth-MGMT-Synchronize-scan-start-and-LE-Meta-ev.patch /tmp/workdir/linux/0001-Bluetooth-MGMT-Synchronize-scan-start-and-LE-Meta-ev.patch |
| 19 | +COPY files/bluetooth/main.conf /tmp/workdir/main.conf |
| 20 | +RUN set -x \ |
| 21 | + && apt-get update \ |
| 22 | + && DEBIAN_FRONTEND=noninteractive apt-get install -fy \ |
| 23 | + bc \ |
| 24 | + cpio \ |
| 25 | + dwarves \ |
| 26 | + elfutils \ |
| 27 | + fakeroot \ |
| 28 | + libdw-dev \ |
| 29 | + libelf-dev \ |
| 30 | + libell-dev \ |
| 31 | + libell0 \ |
| 32 | + libguestfs-tools \ |
| 33 | + linux-image-generic \ |
| 34 | + ncurses-dev \ |
| 35 | + qemu \ |
| 36 | + xz-utils \ |
| 37 | + zstd \ |
| 38 | + && apt-get clean \ |
| 39 | + && rm -rf /var/lib/apt/lists/* \ |
| 40 | + && rm -rf /var/cache/apt/* \ |
| 41 | + && : # last line |
| 42 | + |
| 43 | +# Download Linux kernel source |
| 44 | +RUN mkdir -p /tmp/workdir/linux \ |
| 45 | + && export MAKEFLAGS=-j$(nproc) \ |
| 46 | + && cd /tmp/workdir \ |
| 47 | + && curl https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${KERNEL_VERSION}.tar.xz -o /tmp/workdir/linux-${KERNEL_VERSION}.tar.xz \ |
| 48 | + && tar -xJf linux-${KERNEL_VERSION}.tar.xz -C /tmp/workdir/linux --strip-components=1 \ |
| 49 | + && rm /tmp/workdir/linux-${KERNEL_VERSION}.tar.xz \ |
| 50 | + # Set configuration for btvirt |
| 51 | + && cd /tmp/workdir/linux \ |
| 52 | + && patch -p1 < /tmp/workdir/linux/0001-Bluetooth-MGMT-Synchronize-scan-start-and-LE-Meta-ev.patch \ |
| 53 | + && make x86_64_defconfig \ |
| 54 | + && ./scripts/config -e BT \ |
| 55 | + && ./scripts/config -e BT_BREDR \ |
| 56 | + && ./scripts/config -e BT_HCIVHCI \ |
| 57 | + && ./scripts/config -e CONFIG_BRIDGE \ |
| 58 | + && ./scripts/config -e CONFIG_CRYPTO_AES \ |
| 59 | + && ./scripts/config -e CONFIG_CRYPTO_CMAC \ |
| 60 | + && ./scripts/config -e CONFIG_CRYPTO_ECB \ |
| 61 | + && ./scripts/config -e CONFIG_CRYPTO_USER \ |
| 62 | + && ./scripts/config -e CONFIG_CRYPTO_USER_API_HASH \ |
| 63 | + && ./scripts/config -e CONFIG_CRYPTO_USER_API_SKCIPHER \ |
| 64 | + && ./scripts/config -e CONFIG_VETH \ |
| 65 | + && ./scripts/config -e MAC80211 \ |
| 66 | + && ./scripts/config -e MAC80211_HWSIM \ |
| 67 | + # Compile |
| 68 | + && make olddefconfig \ |
| 69 | + && make \ |
| 70 | + && mkdir -p /opt/ubuntu-qemu/rootfs \ |
| 71 | + && make modules_install INSTALL_MOD_PATH=/opt/ubuntu-qemu/rootfs \ |
| 72 | + && cp /tmp/workdir/linux/arch/x86/boot/bzImage /opt/ubuntu-qemu/bzImage \ |
| 73 | + # Build bluez |
| 74 | + && git clone git://git.kernel.org/pub/scm/libs/ell/ell.git /tmp/workdir/ell --depth 1 --branch ${ELL_VERSION} \ |
| 75 | + && git clone https://github.com/bluez/bluez.git /tmp/workdir/bluez --depth 1 --branch ${BLUEZ_VERSION} \ |
| 76 | + && cd /tmp/workdir/bluez \ |
| 77 | + && ./bootstrap \ |
| 78 | + && ./configure \ |
| 79 | + --enable-backtrace \ |
| 80 | + --enable-debug \ |
| 81 | + --enable-deprecated \ |
| 82 | + --enable-experimental \ |
| 83 | + --enable-library \ |
| 84 | + --enable-monitor \ |
| 85 | + --enable-pie \ |
| 86 | + --enable-test \ |
| 87 | + --enable-testing \ |
| 88 | + --enable-tools \ |
| 89 | + --enable-tools \ |
| 90 | + --enable-udev \ |
| 91 | + --disable-a2dp \ |
| 92 | + --disable-avrcp \ |
| 93 | + --disable-bap \ |
| 94 | + --disable-bass \ |
| 95 | + --disable-csip \ |
| 96 | + --disable-cups \ |
| 97 | + --disable-cups \ |
| 98 | + --disable-health \ |
| 99 | + --disable-hid \ |
| 100 | + --disable-hid2hci \ |
| 101 | + --disable-hog \ |
| 102 | + --disable-manpages \ |
| 103 | + --disable-mcp \ |
| 104 | + --disable-mesh \ |
| 105 | + --disable-micp \ |
| 106 | + --disable-midi \ |
| 107 | + --disable-network \ |
| 108 | + --disable-obex \ |
| 109 | + --disable-optimization \ |
| 110 | + --disable-sap \ |
| 111 | + --disable-silent-rules \ |
| 112 | + --disable-vcp \ |
| 113 | + --prefix=/usr \ |
| 114 | + --mandir=/usr/share/man \ |
| 115 | + --sysconfdir=/etc \ |
| 116 | + --localstatedir=/var \ |
| 117 | + --with-systemdsystemunitdir=/lib/systemd/system \ |
| 118 | + --with-systemduserunitdir=/usr/lib/systemd \ |
| 119 | + && make \ |
| 120 | + && make install DESTDIR=/opt/ubuntu-qemu/rootfs && mkdir -p /opt/ubuntu-qemu/rootfs/usr/bin && cp /tmp/workdir/bluez/emulator/btvirt /opt/ubuntu-qemu/rootfs/usr/bin \ |
| 121 | + # Download Ubuntu image for QEMU |
| 122 | + && curl https://cloud-images.ubuntu.com/minimal/releases/focal/release/ubuntu-20.04-minimal-cloudimg-amd64.img \ |
| 123 | + -o /tmp/workdir/ubuntu-20.04-minimal-cloudimg-amd64.img \ |
| 124 | + # Prepare ubuntu image |
| 125 | + && qemu-img create -f qcow2 -o preallocation=off $UBUNTU_QEMU_IMG 10G \ |
| 126 | + && virt-resize --expand /dev/sda1 /tmp/workdir/ubuntu-20.04-minimal-cloudimg-amd64.img $UBUNTU_QEMU_IMG \ |
| 127 | + && guestfish -a $UBUNTU_QEMU_IMG \ |
| 128 | + --mount /dev/sda3:/ \ |
| 129 | + --network \ |
| 130 | + copy-in /opt/ubuntu-qemu/rootfs/lib /usr : \ |
| 131 | + copy-in /opt/ubuntu-qemu/rootfs/usr / : \ |
| 132 | + sh 'apt-get remove -y snapd' : \ |
| 133 | + sh 'apt-get update' : \ |
| 134 | + sh 'DEBIAN_FRONTEND=noninteractive apt-get install -y dnsmasq hostapd wpasupplicant iw libdw1 rfkill' : \ |
| 135 | + sh '/usr/bin/systemctl enable bluetooth.service' : \ |
| 136 | + sh '/usr/bin/systemctl disable cloud-init.service' : \ |
| 137 | + sh '/usr/bin/systemctl disable dbus-fi.w1.wpa_supplicant1.service' : \ |
| 138 | + sh '/usr/bin/systemctl disable dnsmasq.service' : \ |
| 139 | + sh '/usr/bin/systemctl disable hostapd.service' : \ |
| 140 | + sh '/usr/bin/systemctl disable lxd-agent.service' : \ |
| 141 | + sh '/usr/bin/systemctl disable systemd-networkd-wait-online.service' : \ |
| 142 | + sh '/usr/bin/systemctl disable systemd-timesyncd.service' : \ |
| 143 | + sh '/usr/bin/systemctl disable wpa_supplicant.service' : \ |
| 144 | + sh '/usr/bin/systemctl mask cloud-init.service' : \ |
| 145 | + sh '/usr/bin/systemctl mask dbus-fi.w1.wpa_supplicant1.service' : \ |
| 146 | + sh '/usr/bin/systemctl mask dnsmasq.service' : \ |
| 147 | + sh '/usr/bin/systemctl mask hostapd.service' : \ |
| 148 | + sh '/usr/bin/systemctl mask lxd-agent.service' : \ |
| 149 | + sh '/usr/bin/systemctl mask systemd-networkd-wait-online.service' : \ |
| 150 | + sh '/usr/bin/systemctl mask systemd-timesyncd.service' : \ |
| 151 | + sh '/usr/bin/systemctl mask wpa_supplicant.service' : \ |
| 152 | + sh 'passwd -d root' : \ |
| 153 | + sh 'ssh-keygen -A' : \ |
| 154 | + sh '/bin/echo -e "PermitRootLogin yes\nPasswordAuthentication yes\nPermitEmptyPasswords yes" > /etc/ssh/sshd_config' : \ |
| 155 | + mkdir-p "/etc/netplan" : \ |
| 156 | + sh '/bin/echo -e "network:\n version: 2\n renderer: networkd\n ethernets:\n enp0s4:\n dhcp4: true\n" > /etc/netplan/01-netcfg.yaml' : \ |
| 157 | + sh 'chmod -R 700 /etc/netplan' : \ |
| 158 | + sh 'sed -i "s#^ExecStart=.*#ExecStart=-/sbin/agetty -o \"-p -- \\\\\\\\u\" -a root --keep-baud 115200,38400,9600 %I \$TERM#" "/usr/lib/systemd/system/serial-getty@.service"' : \ |
| 159 | + mkdir-p "/etc/bluetooth" : \ |
| 160 | + copy-in /tmp/workdir/main.conf /etc/bluetooth : \ |
| 161 | + sh 'sed -i "s#^ExecStart=.*#ExecStart=-/usr/libexec/bluetooth/bluetoothd -E#" /lib/systemd/system/bluetooth.service' : \ |
| 162 | + sh 'rm -f /etc/resolv.conf && /bin/echo -e "nameserver 8.8.8.8" > /etc/resolv.conf' : \ |
| 163 | + sh '/bin/echo -e "host0 /chip 9p trans=virtio,version=9p2000.L 0 0" >> /etc/fstab' : \ |
| 164 | + sh '/bin/echo -e "export PW_ENVIRONMENT_ROOT=/root/pw_root\n[ -x /launcher.sh ] && /launcher.sh\n" >> /root/.profile' : \ |
| 165 | + sh 'DEBIAN_FRONTEND=noninteractive apt-get -y install git gcc g++ pkg-config libssl-dev libdbus-1-dev libglib2.0-dev libavahi-client-dev ninja-build python3 python3-venv python3-dev python3-pip unzip libgirepository1.0-dev libcairo2-dev libreadline-dev' : \ |
| 166 | + sh 'git config --file /root/.gitconfig --add safe.directory "*"' : \ |
| 167 | + sh 'apt-get clean' : \ |
| 168 | + sh 'rm -rf /var/lib/apt/lists/*' : \ |
| 169 | + sh 'rm -rf /var/cache/apt/*' : \ |
| 170 | + sh 'echo Configuration completed.' \ |
| 171 | + && mkdir -p /chip \ |
| 172 | + && rm -rf /opt/ubuntu-qemu/rootfs \ |
| 173 | + && echo -n \ |
| 174 | + "#!/bin/bash\n" \ |
| 175 | + "grep -q 'rootshell' /proc/cmdline && exit\n" \ |
| 176 | + "if [[ -x /chip/runner.sh ]]; then\n" \ |
| 177 | + " echo '### RUNNER START ###'\n" \ |
| 178 | + " cd /chip\n" \ |
| 179 | + " bash /chip/runner.sh\n" \ |
| 180 | + " status=\$?\n" \ |
| 181 | + " echo \"### RUNNER STOP, RETURN: \$status\"\n" \ |
| 182 | + " echo \$status > /chip/runner_status\n" \ |
| 183 | + "else\n" \ |
| 184 | + " read -r -t 5 -p 'Press ENTER to access root shell...' && exit || echo ' timeout.'\n" \ |
| 185 | + "fi\n" \ |
| 186 | + "echo 'Shutting down emulated system...'\n" \ |
| 187 | + "echo o > /proc/sysrq-trigger\n" \ |
| 188 | + | guestfish --rw -a $UBUNTU_QEMU_IMG -m /dev/sda3:/ upload - /launcher.sh : chmod 0755 /launcher.sh \ |
| 189 | + && virt-sparsify --compress ${UBUNTU_QEMU_IMG} ${UBUNTU_QEMU_IMG}.compressed \ |
| 190 | + && mv ${UBUNTU_QEMU_IMG}.compressed ${UBUNTU_QEMU_IMG} \ |
| 191 | + && rm -rf /var/tmp/.guestfs-0/* \ |
| 192 | + && rm -rf /tmp/* \ |
| 193 | + && : # last line |
| 194 | + |
| 195 | +FROM ghcr.io/project-chip/chip-build:${VERSION} |
| 196 | + |
| 197 | +ARG UBUNTU_QEMU_DIR_DEFAULT |
| 198 | +ARG UBUNTU_QEMU_IMG_DEFAULT |
| 199 | + |
| 200 | +ENV UBUNTU_QEMU_DIR=${UBUNTU_QEMU_DIR_DEFAULT} |
| 201 | +ENV UBUNTU_QEMU_IMG=${UBUNTU_QEMU_IMG_DEFAULT} |
| 202 | +ENV PW_ENVIRONMENT_ROOT="/root/pw_root" |
| 203 | + |
| 204 | +RUN set -x \ |
| 205 | + && apt-get update \ |
| 206 | + && DEBIAN_FRONTEND=noninteractive apt-get install -fy \ |
| 207 | + cpu-checker \ |
| 208 | + qemu \ |
| 209 | + qemu-system-x86 \ |
| 210 | + && apt-get clean \ |
| 211 | + && rm -rf /var/lib/apt/lists/* \ |
| 212 | + && rm -rf /var/cache/apt/* \ |
| 213 | + && : # last line |
| 214 | +COPY --from=build-env ${UBUNTU_QEMU_DIR} ${UBUNTU_QEMU_DIR} |
| 215 | + |
| 216 | +WORKDIR /chip |
0 commit comments