[gnome-build-meta/valentindavid/gnome-os-ostree: 13/16] Add OSTree based VM image



commit c6c64cc9f5a8664bfe2f4b52c96c5addf118bce0
Author: Valentin David <valentin david codethink co uk>
Date:   Sun Nov 17 11:48:52 2019 +0100

    Add OSTree based VM image

 elements/vm/deps.bst                        |  27 +++++++
 elements/vm/filesystem.bst                  |  13 ++++
 elements/vm/flathub-config.bst              |  17 ++++
 elements/vm/image.bst                       | 115 ++++++++++++++++++++++++++++
 elements/vm/initial-scripts.bst             |   7 ++
 elements/vm/initramfs.bst                   |  67 ++++++++++++++++
 elements/vm/initramfs/deps.bst              |  15 ++++
 elements/vm/initramfs/initial-scripts.bst   |   7 ++
 elements/vm/ostree-config.bst               |  46 +++++++++++
 elements/vm/repo-deps.bst                   |   5 ++
 elements/vm/repo.bst                        |  40 ++++++++++
 files/vm/flathub-config/add-flathub.preset  |   1 +
 files/vm/flathub-config/add-flathub.service |  12 +++
 files/vm/gnome.gpg                          |  29 +++++++
 files/vm/ostree-config/gnome.conf.in        |   4 +
 files/vm/ostree-config/ostree.conf          |   4 +
 plugins/collect_initial_scripts.py          |  55 +++++++++++++
 project.conf                                |   6 ++
 18 files changed, 470 insertions(+)
---
diff --git a/elements/vm/deps.bst b/elements/vm/deps.bst
new file mode 100644
index 00000000..3b722c5b
--- /dev/null
+++ b/elements/vm/deps.bst
@@ -0,0 +1,27 @@
+kind: stack
+
+runtime-depends:
+- freedesktop-sdk.bst:components/util-linux.bst
+- freedesktop-sdk.bst:components/tzdata.bst
+- freedesktop-sdk.bst:components/systemd.bst
+- freedesktop-sdk.bst:components/xorg-server.bst
+- freedesktop-sdk.bst:components/shadow.bst
+- freedesktop-sdk.bst:vm/mesa-default.bst
+
+- core-deps/flatpak.bst
+- vm/initramfs.bst
+- vm/ostree-config.bst
+- core-deps/avahi.bst
+- core-deps/eos-updater.bst
+
+- vm/plymouth-gnome-theme.bst
+- vm/kbd.bst
+
+- freedesktop-sdk.bst:vm/config/pulseaudio.bst
+- freedesktop-sdk.bst:vm/config/sudo.bst
+- freedesktop-sdk.bst:vm/config/journald.bst
+- vm/flathub-config.bst
+
+- sdk-platform.bst
+- core.bst
+- core/systemd-presets.bst
diff --git a/elements/vm/filesystem.bst b/elements/vm/filesystem.bst
new file mode 100644
index 00000000..da7e9f3f
--- /dev/null
+++ b/elements/vm/filesystem.bst
@@ -0,0 +1,13 @@
+kind: compose
+
+build-depends:
+- vm/deps.bst
+
+# Currently we just take everything and remove the
+# devel stuff (headers and static libraries), and debugging
+# symbols which take a huge amount of space, we could
+# refine this and make it much more selective, though.
+config:
+  exclude:
+  - devel
+  - debug
diff --git a/elements/vm/flathub-config.bst b/elements/vm/flathub-config.bst
new file mode 100644
index 00000000..25d2036b
--- /dev/null
+++ b/elements/vm/flathub-config.bst
@@ -0,0 +1,17 @@
+kind: manual
+
+depends:
+- freedesktop-sdk.bst:bootstrap-import.bst
+
+runtime-depends:
+- core-deps/flatpak.bst
+
+config:
+  install-commands:
+  - |
+    install -Dm644 -t "%{install-root}%{indep-libdir}/systemd/system" add-flathub.service
+    install -Dm644 -t "%{install-root}%{indep-libdir}/systemd/system-preset" add-flathub.preset
+
+sources:
+- kind: local
+  path: files/vm/flathub-config
diff --git a/elements/vm/image.bst b/elements/vm/image.bst
new file mode 100644
index 00000000..a1a4cccc
--- /dev/null
+++ b/elements/vm/image.bst
@@ -0,0 +1,115 @@
+kind: script
+
+build-depends:
+- core-deps/ostree.bst
+- vm/qemu-tools.bst
+- freedesktop-sdk.bst:integration/mtab.bst
+- freedesktop-sdk.bst:components/genimage.bst
+- vm/repo.bst
+
+variables:
+  (?):
+  - arch == "x86_64":
+      linux-root: 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709
+  - arch == "i686":
+      linux-root: 44479540-F297-41B2-9AF7-D131D5F0458A
+  - arch == "arm":
+      linux-root: 69DAD710-2CE4-4E3C-B16C-21A1D49ABED3
+  - arch == "aarch64":
+      linux-root: B921B045-1DF0-41C3-AF44-4C6F280D3FAE
+
+  sysroot: "/sysroot"
+
+environment:
+  OSTREE_REPO: "%{sysroot}/ostree/repo"
+
+config:
+  layout:
+  - element: ''
+    destination: '/sysroot'
+  - element: ''
+    destination: '/genimage'
+  - element: vm/repo.bst
+    destination: '/source-repo'
+  - element: core-deps/ostree.bst
+    destination: '/'
+  - element: vm/qemu-tools.bst
+    destination: '/'
+  - element: integration/mtab.bst
+    destination: '/'
+  - element: components/genimage.bst
+    destination: '/'
+
+  commands:
+  - mkdir -p "${OSTREE_REPO}"
+  - ostree init --repo="${OSTREE_REPO}" --mode=bare
+
+  - ostree config --group sysroot set bootloader none
+  - ostree pull-local "/source-repo" %{ostree-branch}
+
+  - mkdir -p "%{sysroot}/boot"
+
+  - ostree admin init-fs "%{sysroot}"
+  - ostree admin os-init --sysroot="%{sysroot}" gnome-os
+  - |
+    ostree admin deploy --os="gnome-os" \
+         --sysroot="%{sysroot}" %{ostree-branch} \
+         --karg="rw" --karg="quiet" --karg="splash"
+
+  - |
+    mkdir -p "%{sysroot}/etc/ostree"
+    cp -r "%{sysroot}"/ostree/boot.1/gnome-os/*/*/etc/ostree/remotes.d "%{sysroot}/etc/ostree/remotes.d"
+
+  - |
+    ostree admin set-origin --sysroot="%{sysroot}" \
+           --index=0 \
+           GnomeOS dummy \
+           %{ostree-branch}
+
+  - |
+    cp -r "%{sysroot}"/ostree/boot.1/gnome-os/*/*/boot/EFI/ "%{sysroot}/boot/"
+
+  - |
+    cat >/genimage/genimage.cfg <<EOF
+    image efi.img {
+        vfat {
+            extraargs = "-F32 -n EFI"
+        }
+        mountpoint = "/boot"
+        size = 100M
+    }
+    image root.img {
+        ext4  {
+            label = "root"
+        }
+        size = 16G
+    }
+    image disk.img {
+        hdimage {
+            align = 1M
+            gpt = true
+        }
+        partition efi {
+            image = "efi.img"
+            partition-type-uuid = "U"
+        }
+        partition root {
+            image = "root.img"
+            partition-type-uuid = "%{linux-root}"
+        }
+    }
+    image disk.qcow2 {
+        qemu {
+        }
+        partition image {
+            image = "disk.img"
+        }
+    }
+    EOF
+
+  - |
+    cd /genimage
+    genimage --rootpath "%{sysroot}"
+
+  - |
+    install -Dm644 -t "%{install-root}" genimage/images/disk.qcow2
diff --git a/elements/vm/initial-scripts.bst b/elements/vm/initial-scripts.bst
new file mode 100644
index 00000000..a811a267
--- /dev/null
+++ b/elements/vm/initial-scripts.bst
@@ -0,0 +1,7 @@
+kind: collect_initial_scripts
+
+build-depends:
+- vm/deps.bst
+
+config:
+  path: /etc/fdsdk/initial_scripts
diff --git a/elements/vm/initramfs.bst b/elements/vm/initramfs.bst
new file mode 100644
index 00000000..8127a743
--- /dev/null
+++ b/elements/vm/initramfs.bst
@@ -0,0 +1,67 @@
+kind: script
+
+build-depends:
+- vm/initramfs/deps.bst
+- vm/initramfs/initial-scripts.bst
+- freedesktop-sdk.bst:vm/prepare-image.bst
+
+variables:
+  uuidnamespace: aea54278-2587-4075-ae67-8688ace4ce3d
+
+config:
+  layout:
+  - element: ''
+    destination: '/tmp'
+  - element: ''
+    destination: '/efi'
+  - element: ''
+    destination: '/var/tmp'
+  - element: vm/initramfs/deps.bst
+    destination: '/'
+  - element: vm/initramfs/initial-scripts.bst
+    destination: '/'
+  - element: vm/prepare-image.bst
+    destination: '/'
+
+  commands:
+  - |
+    prepare-image.sh \
+       --seed "%{uuidnamespace}" \
+       --rootsource /dev/gpt-auto-root \
+        --efisource LABEL=EFI \
+       --efipath /boot \
+       --rootpasswd "root" >/dev/null
+
+  - |
+    mkdir -p "%{install-root}/usr/lib/"
+    cp -r /usr/lib/modules "%{install-root}/usr/lib/"
+
+  - |
+    version="$(ls -1 /lib/modules | head -n1)"
+    mkdir -p "%{install-root}/usr/lib/modules/${version}"
+    dracut -v --fstab \
+           --no-machineid \
+           --kver "${version}" \
+           --add ostree \
+           --add plymouth \
+           --install 'fsck.ext4' \
+           "%{install-root}/usr/lib/modules/${version}/initramfs"
+
+  - |
+    version="$(ls -1 /lib/modules | head -n1)"
+    cp /boot/vmlinuz "%{install-root}/usr/lib/modules/${version}/vmlinuz"
+
+  - dbus-uuidgen >/etc/machine-id
+  - SYSTEMD_RELAX_ESP_CHECKS=1 bootctl --path='/efi' --no-variables install
+  - rm /etc/machine-id
+
+  - |
+    cp -r /efi "%{install-root}/boot"
+
+  - |
+    cat <<EOF >%{install-root}/boot/loader/loader.conf
+    timeout 3
+    editor yes
+    console-mode keep
+    default *
+    EOF
diff --git a/elements/vm/initramfs/deps.bst b/elements/vm/initramfs/deps.bst
new file mode 100644
index 00000000..29872db7
--- /dev/null
+++ b/elements/vm/initramfs/deps.bst
@@ -0,0 +1,15 @@
+kind: stack
+
+runtime-depends:
+- freedesktop-sdk.bst:bootstrap-import.bst
+- freedesktop-sdk.bst:components/util-linux.bst
+- freedesktop-sdk.bst:components/linux.bst
+- freedesktop-sdk.bst:components/systemd.bst
+- freedesktop-sdk.bst:components/dbus.bst
+- freedesktop-sdk.bst:components/dracut.bst
+- freedesktop-sdk.bst:components/os-release.bst
+- freedesktop-sdk.bst:components/shadow.bst
+- freedesktop-sdk.bst:components/tzdata.bst
+- freedesktop-sdk.bst:components/pkg-config.bst
+- core-deps/ostree.bst
+- vm/plymouth-gnome-theme.bst
diff --git a/elements/vm/initramfs/initial-scripts.bst b/elements/vm/initramfs/initial-scripts.bst
new file mode 100644
index 00000000..069d8f3f
--- /dev/null
+++ b/elements/vm/initramfs/initial-scripts.bst
@@ -0,0 +1,7 @@
+kind: collect_initial_scripts
+
+build-depends:
+- vm/initramfs/deps.bst
+
+config:
+  path: /etc/fdsdk/initial_scripts
diff --git a/elements/vm/ostree-config.bst b/elements/vm/ostree-config.bst
new file mode 100644
index 00000000..8bc5232e
--- /dev/null
+++ b/elements/vm/ostree-config.bst
@@ -0,0 +1,46 @@
+kind: manual
+
+build-depends:
+- freedesktop-sdk.bst:bootstrap-import.bst
+- freedesktop-sdk.bst:components/m4.bst
+
+runtime-depends:
+- freedesktop-sdk.bst:components/systemd.bst
+- core-deps/ostree.bst
+
+config:
+  build-commands:
+  - |
+    m4 -DOSTREE_REMOTE_URL="%{ostree-remote-url}" \
+      gnome.conf.in >gnome.conf
+
+  install-commands:
+  - |
+    mkdir %{install-root}/boot
+    mkdir %{install-root}/efi
+    mkdir %{install-root}/etc
+    mkdir %{install-root}/mnt
+    mkdir %{install-root}/run
+    mkdir %{install-root}/opt
+    mkdir %{install-root}/sys
+    mkdir %{install-root}/tmp
+    mkdir %{install-root}/dev
+    mkdir %{install-root}/proc
+
+  - |
+    mkdir -p "%{install-root}/sysroot"
+    ln -s sysroot/ostree "%{install-root}/ostree"
+    ln -s var/home "%{install-root}/home"
+    ln -s var/roothome "%{install-root}/root"
+    ln -s run/media "%{install-root}/media"
+
+  - |
+    install -Dm644 -t "%{install-root}/usr/lib/tmpfiles.d" ostree.conf
+    install -Dm644 *.gpg "%{install-root}/etc/pki/ostree/gnome.gpg"
+    install -Dm644 -t "%{install-root}/etc/ostree/remotes.d" gnome.conf
+
+sources:
+- kind: local
+  path: files/vm/ostree-config
+- kind: local
+  path: files/vm/gnome.gpg
diff --git a/elements/vm/repo-deps.bst b/elements/vm/repo-deps.bst
new file mode 100644
index 00000000..120ad68c
--- /dev/null
+++ b/elements/vm/repo-deps.bst
@@ -0,0 +1,5 @@
+kind: stack
+
+runtime-depends:
+- core-deps/ostree.bst
+- freedesktop-sdk.bst:vm/prepare-image.bst
diff --git a/elements/vm/repo.bst b/elements/vm/repo.bst
new file mode 100644
index 00000000..b2f10f3a
--- /dev/null
+++ b/elements/vm/repo.bst
@@ -0,0 +1,40 @@
+kind: script
+
+build-depends:
+- vm/repo-deps.bst
+- vm/filesystem.bst
+- vm/initial-scripts.bst
+- freedesktop-sdk.bst:vm/prepare-image.bst
+
+variables:
+  uuidnamespace: aea54278-2587-4075-ae67-8688ace4ce3d
+
+environment:
+  OSTREE_REPO: "%{install-root}"
+
+config:
+  layout:
+  - element: ''
+    destination: /tmp
+  - element: vm/repo-deps.bst
+    destination: /
+  - element: vm/filesystem.bst
+    destination: /sysroot
+  - element: vm/initial-scripts.bst
+    destination: /
+
+  commands:
+  - |
+    prepare-image.sh \
+       --sysroot /sysroot \
+       --seed "%{uuidnamespace}" \
+       --rootsource /dev/gpt-auto-root \
+        --efisource LABEL=EFI \
+       --efipath /boot \
+       --rootpasswd "root" >/dev/null
+
+  - mkdir -p "${OSTREE_REPO}"
+  - ostree init --repo="${OSTREE_REPO}" --mode=archive
+  - mv /sysroot/etc /sysroot/usr/etc
+  - ostree commit --branch=%{ostree-branch} --timestamp="$(date --date="@${SOURCE_DATE_EPOCH}" 
--rfc-3339=seconds)" /sysroot
+
diff --git a/files/vm/flathub-config/add-flathub.preset b/files/vm/flathub-config/add-flathub.preset
new file mode 100644
index 00000000..185c4062
--- /dev/null
+++ b/files/vm/flathub-config/add-flathub.preset
@@ -0,0 +1 @@
+enable add-flathub.service
diff --git a/files/vm/flathub-config/add-flathub.service b/files/vm/flathub-config/add-flathub.service
new file mode 100644
index 00000000..0fa35e0a
--- /dev/null
+++ b/files/vm/flathub-config/add-flathub.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Add flathub
+ConditionFirstBoot=yes
+Wants=network-online.target
+After=network-online.target systemd-resolved.service nss-lookup.target
+
+[Service]
+Type=oneshot
+ExecStart=flatpak remote-add flathub https://flathub.org/repo/flathub.flatpakrepo
+
+[Install]
+WantedBy=multi-user.target
diff --git a/files/vm/gnome.gpg b/files/vm/gnome.gpg
new file mode 100644
index 00000000..ecd64cde
--- /dev/null
+++ b/files/vm/gnome.gpg
@@ -0,0 +1,29 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBFuhBAsBEADDIU1v3mx7yvJwwbVw11gBm3HYR1kV0EbTI311nDuZ3oSf3zf9
+Rm2gI73C8v5nq6WcTjwkL0tvArf4OxWNFufWKqa6UfODOzwBXeNhkyZEFvvgI0qi
+f6IIbxMSXgntNmH+sD1quXJ7tiGyf2cA1FzQJJVUMRwsb2yGx3XLIZW7JDZgVJvW
+NVDmPg7unuECRXsmEGFusfiejsIwDLyOzXIushFk7APLR5QWyYdI2Ujb077aaMqo
+Ytfv4Iv1Ulgg44dlKqEqdRCbCtlBfirqbi4zi5TNI3dQbyxiPuCBls18Aw9sRq96
+MmpKlyD02Ig8TxzmVcjAJ2nGN/3ptWOva1Osadkh3GGgxWhPV1WEF66Vfnx07wp3
+8081bnpCl0wDLjGumZ0sIAwQ7g5ZdC8Nulx93iOr5uTixYSvcn0djuEbwDC2Qs0U
+yLP2+uT6OcHyT3PjT5zA3nTrMPsgTNPcK/ajrMVe2XUxml/3vZipBdAeJFhtAfAI
+M2mbXw6h63zcjeNBG7ieqlKvbKf4t9uFhzUGC59T/lef5e4GU+OftEDHSirmBeM9
+kext3mSMuzDNdz5G0UgzBoBMfHnWQOgexCvJanYQ9OvJ57O51E6NaTHW0YePS2fl
+p2nRNyGzeZ5352kZxSxaCorKTDuzhrPHtvXGnzp/n9n10gsYZFH7ZSrKrwARAQAB
+tDVHTk9NRSBCdWlsZCBNZXRhIFNpZ25pbmcgS2V5IDxyZWxlYXNlLXRlYW1AZ25v
+bWUub3JnPokCTgQTAQgAOBYhBKE065L4wSlBNu1a1EZc+7lq3wZXBQJboQQLAhsD
+BQsJCAcCBhUICQoLAgQWAgMBAh4BAheAAAoJEEZc+7lq3wZX0iQP/i8bw8x7LrKm
++2SxSBh900v+gtM0Ev/I0a6arSnDy+RYrLTOmG3E5sjtUosuOALIWnBQuIY8fgJv
+dw/ezzx71Vg8Ztuhav5OmN3dnV/HYNXHVisGnGQd09duY/WAK1qyyxZlnX8z3C8s
++AZUX15BNPFjJTHGuoQzBxlCtJHZSyw7TlXaHWl7TunB85O30kgAAA52cDjYdEmm
+x9IjPBmdBlpR0WZf7BxW3pnFsRdH1+J7UTbzum5WLgu+QXVnTA2bBY2fTOqlgjLS
+lBQjp/iXRM33H45HJJKAxpNiC4JZTeO68/hmnBIdKF182b/2URfIY4lgBnglffdm
+IH9EoKmThXktwOfjUeivsTO+BTpsHKzQ9HNLFJ5FE8qgAdtN4GhHHGA8wapG774I
+OOPhbGHa88LiMLkCQJmj8JBmag77SHz0jMyRDnEfWj+d3tscfJcU3ePP/Aet+1IK
+cWdcyPrzhgYYbzhZzCsKrTpZRa0XDMfb6hzuRVZdt+fX2xiNWcx5UHvpGa7dHork
+WmRlBUVTO0G6yAUKNRZ5fBk4Jt5Uh/aAXBOf4D4uC5sy3OHLL0oG/oRhT7lPwMTX
+NnblEwZgPFDcqGUYSLUFOKyDHqu04hVrzwKgOE4fUBJv4AKtWiEnmPEvEAANe0kK
+hrMbt8BZCpPMnrfB0HohI+KXIfiQAjLv
+=MJcD
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/files/vm/ostree-config/gnome.conf.in b/files/vm/ostree-config/gnome.conf.in
new file mode 100644
index 00000000..2732f205
--- /dev/null
+++ b/files/vm/ostree-config/gnome.conf.in
@@ -0,0 +1,4 @@
+[remote "GnomeOS"]
+url=OSTREE_REMOTE_URL
+gpg-verify=true
+gpgkeypath=/etc/pki/ostree/gnome.gpg
diff --git a/files/vm/ostree-config/ostree.conf b/files/vm/ostree-config/ostree.conf
new file mode 100644
index 00000000..a8531636
--- /dev/null
+++ b/files/vm/ostree-config/ostree.conf
@@ -0,0 +1,4 @@
+d /var/log/journal 0755 root root -
+L /var/home - - - - ../sysroot/home
+d /var/roothome 0700 root root -
+d /run/media 0755 root root -
diff --git a/plugins/collect_initial_scripts.py b/plugins/collect_initial_scripts.py
new file mode 100644
index 00000000..fe3b346d
--- /dev/null
+++ b/plugins/collect_initial_scripts.py
@@ -0,0 +1,55 @@
+import os
+import re
+from buildstream import Element, ElementError, Scope
+
+class ExtractInitialScriptsElement(Element):
+    def configure(self, node):
+        self.node_validate(node, [
+            'path',
+        ])
+
+        self.path = self.node_subst_member(node, 'path')
+
+    def preflight(self):
+        runtime_deps = list(self.dependencies(Scope.RUN, recurse=False))
+        if runtime_deps:
+            raise ElementError("{}: Only build type dependencies supported by collect-integration elements"
+                               .format(self))
+
+        sources = list(self.sources())
+        if sources:
+            raise ElementError("{}: collect-integration elements may not have sources".format(self))
+
+    def get_unique_key(self):
+        key = {
+            'path': self.path,
+        }
+        return key
+
+    def configure_sandbox(self, sandbox):
+        pass
+
+    def stage(self, sandbox):
+        pass
+
+    def assemble(self, sandbox):
+        basedir = sandbox.get_directory()
+        path = os.path.join(basedir, self.path.lstrip(os.sep))
+        index = 0
+        for dependency in self.dependencies(Scope.BUILD):
+            public = dependency.get_public_data('initial-script')
+            if public and 'script' in public:
+                script = self.node_subst_member(public, 'script')
+                index += 1
+                depname = re.sub('[^A-Za-z0-9]', '_', dependency.name)
+                basename = '{:03}-{}'.format(index, depname)
+                filename = os.path.join(path, basename)
+                os.makedirs(path, exist_ok=True)
+                with open(filename, 'w') as f:
+                    f.write(script)
+                os.chmod(filename, 0o755)
+
+        return os.sep
+
+def setup():
+    return ExtractInitialScriptsElement
diff --git a/project.conf b/project.conf
index 54cca149..21d4970d 100644
--- a/project.conf
+++ b/project.conf
@@ -205,6 +205,8 @@ shell:
 
 variables:
   branch: master
+  ostree-branch: "gnome-os/%{arch}/%{branch}"
+  ostree-remote-url: "https://nightly.gnome.org/gnomeos/repo";
   gcc_arch: "%{arch}"
   abi: "gnu"
   gcc_triplet: "%{gcc_arch}-linux-%{abi}"
@@ -284,3 +286,7 @@ plugins:
   sources:
     cargo: 0
     git_tag: 1
+- origin: local
+  path: plugins
+  elements:
+    collect_initial_scripts: 0


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]