[IMP] point_of_sale: Refactoring the "build" of the IoT Box
The use of an emulator (qemu) for the IoT Box build posed compatibility and performance issues. So we have the Raspbian filesystem to install and configure packages. closes odoo/odoo#40967 Task: 2145445 X-original-commit: 9c4e23a656bfd7b2f0c40feafadbce1b8d651aa8 Signed-off-by: Quentin Lejeune (qle) <qle@odoo.com>
This commit is contained in:
@@ -8,14 +8,14 @@ __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
__file="${__dir}/$(basename "${BASH_SOURCE[0]}")"
|
||||
__base="$(basename ${__file} .sh)"
|
||||
|
||||
# Since we are emulating, the real /boot is not mounted,
|
||||
# leading to mismatch between kernel image and modules.
|
||||
mount /dev/sda1 /boot
|
||||
|
||||
# Recommends: antiword, graphviz, ghostscript, python-gevent, poppler-utils
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
|
||||
|
||||
echo "export LANGUAGE=en_US.UTF-8" >> ~/.bashrc
|
||||
echo "export LANG=en_US.UTF-8" >> ~/.bashrc
|
||||
echo "export LC_ALL=en_US.UTF-8" >> ~/.bashrc
|
||||
source ~/.bashrc
|
||||
|
||||
apt-get update && apt-get -y upgrade
|
||||
# Do not be too fast to upgrade to more recent firmware and kernel than 4.38
|
||||
@@ -142,30 +142,15 @@ update-rc.d -f nginx remove
|
||||
update-rc.d -f dnsmasq remove
|
||||
update-rc.d timesyncd defaults
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable ramdisks.service
|
||||
systemctl disable dphys-swapfile.service
|
||||
systemctl enable ssh
|
||||
|
||||
# USER PI AUTO LOGIN (from nano raspi-config)
|
||||
# We take the whole algorithm from raspi-config in order to stay compatible with raspbian infrastructure
|
||||
if command -v systemctl > /dev/null && systemctl | grep -q '\-\.mount'; then
|
||||
SYSTEMD=1
|
||||
elif [ -f /etc/init.d/cron ] && [ ! -h /etc/init.d/cron ]; then
|
||||
SYSTEMD=0
|
||||
else
|
||||
echo "Unrecognised init system"
|
||||
return 1
|
||||
fi
|
||||
if [ $SYSTEMD -eq 1 ]; then
|
||||
systemctl set-default graphical.target
|
||||
systemctl disable getty@tty1.service
|
||||
systemctl enable autologin@.service
|
||||
systemctl disable systemd-timesyncd.service
|
||||
systemctl disable hostapd.service
|
||||
else
|
||||
update-rc.d lightdm enable 2
|
||||
fi
|
||||
systemctl set-default graphical.target
|
||||
systemctl disable getty@tty1.service
|
||||
systemctl enable autologin@.service
|
||||
systemctl disable systemd-timesyncd.service
|
||||
systemctl unmask hostapd.service
|
||||
systemctl disable hostapd.service
|
||||
|
||||
# disable overscan in /boot/config.txt, we can't use
|
||||
# overwrite_after_init because it's on a different device
|
||||
@@ -174,10 +159,6 @@ fi
|
||||
# cf: https://www.raspberrypi.org/documentation/configuration/raspi-config.md
|
||||
echo "disable_overscan=1" >> /boot/config.txt
|
||||
|
||||
# https://www.raspberrypi.org/forums/viewtopic.php?p=79249
|
||||
# to not have "setting up console font and keymap" during boot take ages
|
||||
setupcon
|
||||
|
||||
# exclude /drivers folder from git info to be able to load specific drivers
|
||||
echo "addons/hw_drivers/drivers/" > /home/pi/odoo/.git/info/exclude
|
||||
|
||||
@@ -190,6 +171,3 @@ create_ramdisk_dir "/var"
|
||||
create_ramdisk_dir "/etc"
|
||||
create_ramdisk_dir "/tmp"
|
||||
mkdir /root_bypass_ramdisks
|
||||
umount /dev/sda1
|
||||
|
||||
reboot
|
||||
|
||||
@@ -18,22 +18,22 @@ require_command () {
|
||||
}
|
||||
|
||||
require_command kpartx
|
||||
require_command qemu-system-arm
|
||||
require_command qemu-arm-static
|
||||
require_command zerofree
|
||||
|
||||
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
__file="${__dir}/$(basename "${BASH_SOURCE[0]}")"
|
||||
__base="$(basename ${__file} .sh)"
|
||||
|
||||
|
||||
MOUNT_POINT="${__dir}/root_mount"
|
||||
OVERWRITE_FILES_BEFORE_INIT_DIR="${__dir}/overwrite_before_init"
|
||||
OVERWRITE_FILES_AFTER_INIT_DIR="${__dir}/overwrite_after_init"
|
||||
VERSION=13.0
|
||||
REPO=https://github.com/odoo/odoo.git
|
||||
|
||||
if [ ! -f kernel-qemu ] || ! file_exists *raspbian*.img ; then
|
||||
./posbox_download_images.sh
|
||||
if ! file_exists *raspbian*.img ; then
|
||||
wget 'http://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2019-09-30/2019-09-26-raspbian-buster-lite.zip' -O raspbian.img.zip
|
||||
unzip raspbian.img.zip
|
||||
fi
|
||||
|
||||
cp -a *raspbian*.img posbox.img
|
||||
@@ -84,8 +84,12 @@ START_OF_ROOT_PARTITION=$(fdisk -l posbox.img | tail -n 1 | awk '{print $2}')
|
||||
echo 'p'; # print
|
||||
echo 'w') | fdisk posbox.img # write and quit
|
||||
|
||||
LOOP_MAPPER_PATH=$(kpartx -avs posbox.img | tail -n 1 | cut -d ' ' -f 3)
|
||||
LOOP=$(kpartx -avs posbox.img)
|
||||
LOOP_MAPPER_PATH=$(echo "${LOOP}" | tail -n 1 | awk '{print $3}')
|
||||
LOOP_MAPPER_PATH="/dev/mapper/${LOOP_MAPPER_PATH}"
|
||||
LOOP_MAPPER_BOOT=$(echo "${LOOP}" | tail -n 2 | awk 'NR==1 {print $3}')
|
||||
LOOP_MAPPER_BOOT="/dev/mapper/${LOOP_MAPPER_BOOT}"
|
||||
|
||||
sleep 5
|
||||
|
||||
# resize filesystem
|
||||
@@ -94,30 +98,19 @@ resize2fs "${LOOP_MAPPER_PATH}"
|
||||
|
||||
mkdir -p "${MOUNT_POINT}" #-p: no error if existing
|
||||
mount "${LOOP_MAPPER_PATH}" "${MOUNT_POINT}"
|
||||
mount "${LOOP_MAPPER_BOOT}" "${MOUNT_POINT}/boot/"
|
||||
|
||||
QEMU_ARM_STATIC="/usr/bin/qemu-arm-static"
|
||||
cp "${QEMU_ARM_STATIC}" "${MOUNT_POINT}/usr/bin/"
|
||||
|
||||
# 'overlay' the overwrite directory onto the mounted image filesystem
|
||||
cp -a "${OVERWRITE_FILES_BEFORE_INIT_DIR}"/* "${MOUNT_POINT}"
|
||||
chroot "${MOUNT_POINT}" /bin/bash -c "sudo /etc/init_posbox_image.sh"
|
||||
|
||||
# get rid of the git clone
|
||||
rm -rf "${CLONE_DIR}"
|
||||
# and the ngrok usr/bin
|
||||
rm -rf "${OVERWRITE_FILES_BEFORE_INIT_DIR}/usr"
|
||||
|
||||
# get rid of the mount, we have to remount it anyway because we have
|
||||
# to "refresh" the filesystem after qemu modified it
|
||||
sleep 2
|
||||
umount "${MOUNT_POINT}"
|
||||
|
||||
# from http://paulscott.co.za/blog/full-raspberry-pi-raspbian-emulation-with-qemu/
|
||||
# ssh pi@localhost -p10022
|
||||
# as of stretch with newer kernels, the versatile-pb.dtb file is necessary
|
||||
QEMU_OPTS=(-kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -dtb versatile-pb.dtb -no-reboot -serial stdio -append 'root=/dev/sda2 rootfstype=ext4 rw' -hda posbox.img -net user,hostfwd=tcp::10022-:22,hostfwd=tcp::18069-:8069 -net nic)
|
||||
if [ -z ${DISPLAY:-} ] ; then
|
||||
QEMU_OPTS+=(-nographic)
|
||||
fi
|
||||
qemu-system-arm "${QEMU_OPTS[@]}"
|
||||
|
||||
mount "${LOOP_MAPPER_PATH}" "${MOUNT_POINT}"
|
||||
cp -av "${OVERWRITE_FILES_AFTER_INIT_DIR}"/* "${MOUNT_POINT}"
|
||||
|
||||
find "${MOUNT_POINT}"/ -type f -name "*.iotpatch"|while read iotpatch; do
|
||||
@@ -129,11 +122,11 @@ find "${MOUNT_POINT}"/ -type f -name "*.iotpatch"|while read iotpatch; do
|
||||
done
|
||||
|
||||
# cleanup
|
||||
sleep 2
|
||||
umount "${MOUNT_POINT}"
|
||||
rm -r "${MOUNT_POINT}"
|
||||
umount -f "${MOUNT_POINT}"/boot
|
||||
umount -f "${MOUNT_POINT}"
|
||||
|
||||
echo "Running zerofree..."
|
||||
zerofree -v "${LOOP_MAPPER_PATH}" || true
|
||||
|
||||
kpartx -d posbox.img
|
||||
rm -rf "${MOUNT_POINT}"
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
wget 'http://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2019-09-30/2019-09-26-raspbian-buster-lite.zip' -O raspbian.img.zip
|
||||
unzip raspbian.img.zip
|
||||
wget 'https://github.com/dhruvvyas90/qemu-rpi-kernel/raw/master/kernel-qemu-4.14.79-stretch' -O kernel-qemu
|
||||
wget 'https://github.com/dhruvvyas90/qemu-rpi-kernel/raw/master/versatile-pb.dtb'
|
||||
|
||||
Reference in New Issue
Block a user