手機 - Motorola XT897 - mersdk - 如何不透過VirtualBox執行



參考資料:
https://sailfishos.org/wiki/Application_SDK
https://github.com/Karry/osmscout-sailfish/wiki/Howto-build-for-Sailfish-OS
https://katastrophos.net/andre/blog/2014/03/29/running-sailfishos-build-engine-outside-virtualbox-vm/

步驟如下:
1. 開啟VirtualBox(Sailfish OS Build Engine)
2. 登入ssh並且建立一個新使用者(擁有root權限)
3. 確定權限(xxx是建立的使用者名稱)

$ ssh -p 2222 -i /home/xxx/SailfishOS/vmshare/ssh/private_keys/engine/root root@localhost

4. 複製系統到本地端

$ cd
$ su
# mkdir /opt/sailfishos-buildengine
# rsync --numeric-ids -xazuv -e "ssh -p 2222 -i /home/xxx/SailfishOS/vmshare/ssh/private_keys/engine/root" root@localhost:/ /opt/sailfishos-buildengine 

5. 建立chroot腳本(/opt/run-sailfishos-buildengine.sh)

#!/bin/bash
USER=xxx
USERDIR=/home/$USER
SDK=/opt/SailfishOS
BUILDENGINE=/opt/sailfishos-buildengine

if [ $EUID -ne 0 ]; then
    echo "This script must be run as root." 1>&2
    exit 1
fi

if cmp -s /proc/$PPID/mountinfo /proc/self/mountinfo; then
    exec unshare -m -- "$0" "$@"
    echo "$0 must be run in private namespace."
    exit 1
fi

cleanup()
{
    umount -l $BUILDENGINE/dev/pts
    umount -l $BUILDENGINE/dev
    umount -l $BUILDENGINE/proc
    umount -l $BUILDENGINE/sys
    umount -l $BUILDENGINE/run

    umount -l $BUILDENGINE/home/mersdk/share
    umount -l $BUILDENGINE/home/src1
    umount -l $BUILDENGINE/etc/ssh/authorized_keys
    umount -l $BUILDENGINE/host_targets
    umount -l $BUILDENGINE/etc/mersdk/share
}

trap "cleanup > /dev/null 2>&1; exit" INT QUIT TERM EXIT

mount --make-slave "$(df -P "$BUILDENGINE" | tail -1 | awk '{print $NF}')"

mount --bind /dev "$BUILDENGINE/dev"
mount --bind /dev/pts "$BUILDENGINE/dev/pts"
mount --bind /proc "$BUILDENGINE/proc"
mount --bind /sys "$BUILDENGINE/sys"
mount --bind /run "$BUILDENGINE/run"

mount --bind "$USERDIR" "$BUILDENGINE/home/mersdk/share"
mount --bind "$USERDIR" "$BUILDENGINE/home/src1"
mount --bind "$SDK/mersdk/ssh" "$BUILDENGINE/etc/ssh/authorized_keys"
mount --bind "$SDK/mersdk/targets" "$BUILDENGINE/host_targets"
mount --bind "$SDK/vmshare" "$BUILDENGINE/etc/mersdk/share"

# Rewrite user id and group id entries to match host system's users
updateConfigs()
{
    sed -i -e "s/$1:x:$2:100000:/$1:x:$(id -u $USER):$(id -g $USER):/" "$3/passwd"
    sed -i -e "s/$1:x:100000:/$1:x:$(id -g $USER):/" "$3/group"
    cp /etc/resolv.conf "$3/"
}

updateConfigs mersdk 1001 "$BUILDENGINE/etc"
updateConfigs nemo 100000 "$BUILDENGINE/srv/mer/targets/SailfishOS-armv7hl/etc"
updateConfigs nemo 100000 "$BUILDENGINE/srv/mer/targets/SailfishOS-i486/etc"

cat > "$BUILDENGINE/runmersdkengine.sh" << CONTENT
#!/bin/bash

cleanup()
{
    pkill -KILL -f "/usr/bin/ruby /usr/bin/puma -p 8080 -t 1:1 -e production"
}
trap "cleanup; exit" INT QUIT TERM EXIT

# Fix up permissions to point to new uid/gid of mersdk
mkdir -p /home/deploy/installroot
chown -R mersdk.mersdk /home/deploy/installroot
chown -R mersdk.mersdk /srv/mer/targets/*
find /home/mersdk | grep -v "/home/mersdk/share" | xargs chown mersdk.mersdk

# Run web server of build engine as mersdk in background:
su mersdk -c "cd /usr/lib/sdk-webapp-bundle; /usr/bin/ruby /usr/bin/puma -p 8080 -t 1:1 -e production" &

# Run SSH Server of build engine as root:
/usr/sbin/sshd -p 2222 -D -e -f /etc/ssh/sshd_config_engine
CONTENT

chroot "$BUILDENGINE" sh /runmersdkengine.sh