A page in your DokuWiki was added or changed. Here are the details: Date : 2021/01/25 00:19 Browser : Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36 IP-Address : 82.212.29.219 Hostname : HSI-KBW-082-212-029-219.hsi.kabelbw.de Old Revision: https://wiki.x2go.org/doku.php/doc:howto:tce?rev=1611533899 New Revision: https://wiki.x2go.org/doku.php/doc:howto:tce Edit Summary: [Starting the Build] This is part two of the patch to create Images for the Raspberry Pi User : stefanbaur @@ -248,13 +248,16 @@ . ./x2go-tce-config # Create Timestamp LBX2GO_TIMESTAMP=$(date +"%Y%m%d%H%M%S") + + exec > >(tee "/tmp/$LBX2GO_TIMESTAMP.log") 2>&1 # Set Directory name - LBX2GO_TCEDIR="./live-build-x2go-${LBX2GO_TIMESTAMP}-${LBX2GO_IMAGETYPE}-$(echo "$LBX2GO_ARCH" | awk '{print $2}')-${LBX2GO_CONFIG##*/}" + LBX2GO_TCEDIR="./live-build-x2go-${LBX2GO_TIMESTAMP}-${LBX2GO_IMAGETYPE}-$(echo $LBX2GO_ARCH | awk '{print $2}')-${LBX2GO_CONFIG##*/}" if [ -z "$LBX2GO_ARCH" ] || + ( echo "$LBX2GO_ARCH" | grep -q "arm" && [ -z "$LBX2GO_ARCH_MODEL" ] ) || [ -z "$LBX2GO_SPACE" ] || [ -z "$LBX2GO_CONFIG" ] || [ -z "$LBX2GO_DEFAULTS" ] || [ -z "$LBX2GO_DEBVERSION" ] || @@ -264,8 +267,9 @@ [ -z "$LBX2GO_BOOTLOADER" ] || [ -z "$LBX2GO_ARCHIVE_AREAS" ]; then echo -e "One or more of the following variables is unset:" echo -e "LBX2GO_ARCH: '${LBX2GO_ARCH}'" + echo "$LBX2GO_ARCH" | grep -q "arm" && echo -e "LBX2GO_ARCH_MODEL: '${LBX2GO_ARCH_MODEL}'" echo -e "LBX2GO_SPACE: '${LBX2GO_SPACE}'" echo -e "LBX2GO_DEFAULTS: '${LBX2GO_DEFAULTS}'" echo -e "LBX2GO_DEBVERSION: '${LBX2GO_DEBVERSION}'" echo -e "LBX2GO_CONFIG: '${LBX2GO_CONFIG}'" @@ -280,24 +284,82 @@ # This will create a timestamped subdirectory for the build mkdir -p $LBX2GO_TCEDIR cd $LBX2GO_TCEDIR + X2GO_LBCONFIG_STRING=$(cat <<X2GOLBCONFIGSTRING lb config $LBX2GO_ARCH $LBX2GO_SPACE $LBX2GO_DEFAULTS \ --config $LBX2GO_CONFIG --binary-images $LBX2GO_IMAGETYPE \ --archive-areas "$LBX2GO_ARCHIVE_AREAS" \ --bootappend-live "$LBX2GO_BOOTAPPEND_LIVE" + X2GOLBCONFIGSTRING + ) + # Our previous way of doing this had issues with newlines and multiple blanks. So we're now doing a bit + # of sanitizing, then we eval the variable. + X2GO_LBCONFIG_STRING=$(echo "$X2GO_LBCONFIG_STRING" | tr '\n' ' ' | tr -s ' ') + eval "$X2GO_LBCONFIG_STRING" + # This will copy any patches we have prepared if [ -d "../patch" ] ; then cp -a ../patch/* config/ fi + # This will copy any patches we have prepared for minidesktop if [ -d "../patch-minidesktop" ] && (echo "$LBX2GO_CONFIG" | grep -q minidesktop) ; then cp -a ../patch-minidesktop/* config/ fi + + # This checks if a bootloader directory is present (e.g. because of a custom splash.svg) + # and adds all other files that might be missing (live-build won't add them automatically + # if the directory already exists) + if [ -d config/bootloaders ] ; then + rsync -aPH --ignore-existing --exclude="splash.svg" /usr/share/live/build/bootloaders/* config/bootloaders + fi + # When enabled, this silences the audible beep at syslinux/isolinux/pxelinux/extlinux startup. + # Note that this is an accessibility feature for blind users, so use with care. + sed -e "s/$(echo -e "\07")//g" -i config/bootloaders/*/menu.cfg + # This enables an i386-only package in the sources.list file when an i386 build is requested - if echo "$LBX2GO_ARCH" | grep -q -i "i386" ; then + if echo $LBX2GO_ARCH | grep -q -i "i386" ; then sed -i -e 's/# for i386 only #//' config/package-lists/desktop.list.chroot fi + + # This is part of our experimental ARM support + # It adds required arm64-only packages when an arm64 build is requested + if echo $LBX2GO_ARCH | grep -q "arm" ; then + + # firmware for wifi + echo "firmware-brcm80211/buster-backports" >>config/package-lists/raspi.list.chroot + + if [ "$LBX2GO_ARCH_MODEL" = "Pi3" ] ; then + # modules required for Raspberry Pi 3 LAN + echo "crc16" >> config/includes.chroot/etc/initramfs-tools/modules + echo "mii" >> config/includes.chroot/etc/initramfs-tools/modules + echo "smsc95xx" >> config/includes.chroot/etc/initramfs-tools/modules + echo "usbcore" >> config/includes.chroot/etc/initramfs-tools/modules + echo "usbnet" >> config/includes.chroot/etc/initramfs-tools/modules + echo "fake-hwclock" >>config/package-lists/raspi.list.chroot + echo "usbutils" >>config/package-lists/raspi.list.chroot + + # firmware for basic raspi functions - required for boot on Pi3 + echo "raspi3-firmware/buster" >>config/package-lists/raspi.list.chroot + # standard linux kernel - for Pi3 + echo "linux-image-arm64/buster" >>config/package-lists/raspi.list.chroot + + elif [ "$LBX2GO_ARCH_MODEL" = "Pi4" ] ; then + # firmware for basic raspi functions - required for boot on Pi4 + echo "raspi3-firmware/buster-backports" >>config/package-lists/raspi.list.chroot + echo "raspi-firmware/buster-backports" >>config/package-lists/raspi.list.chroot + + # newer linux kernel - required for pi4/pi400 + echo "linux-image-arm64/buster-backports" >>config/package-lists/raspi.list.chroot + + else + echo "WARNING: ARM Platform selected, but unknown model: '$LBX2GO_ARCH_MODEL'. Assuming no additional packages/patches are required." + fi + + fi + + # This is for minidesktop builds only if [ -f config/package-lists/firefox-langpacks.list.chroot ]; then if [ -n "$LBX2GO_LANG" ]; then for LBX2GO_SINGLE_LANG in $(echo "$LBX2GO_LANG" | tr ';' ' '); do @@ -326,108 +388,114 @@ # Here, we should have reached a point where it is safe to point all proxy variables # at the apt-cacher-ng proxy. If you're seeing errors during your build that hint # at files not being downloaded, disable these three entries. export https_proxy=$LB_APT_HTTP_PROXY - export http_proxy=$LB_APT_HTTP_PROXY + export http_proxy=$LB_APT_HTTP_PROXY export ftp_proxy=$LB_APT_FTP_PROXY fi - # This is a crude hack to detect crossbuilds for ARM on Intel/AMD hardware. - # It makes some necessary changes, and also tries to speed up squashfs creation. - if (uname -r | grep -q 'i.86' || uname -r | grep -q 'amd64') && \ - echo "$LBX2GO_ARCH" | grep -q 'arm'; then + # This is part of our experimental ARM support + # It is used when building for the ARM architecture (on Intel/AMD hardware and on ARM). + # It makes some necessary changes, and also tries to speed up squashfs creation when it + # detects a crossbuild environment. + if echo $LBX2GO_ARCH | grep -q 'arm'; then - # This command removes all references to fuseext and x2gothinclient from the - # package list files. Currently needed as there are no ARM packages for either. - echo "WARNING: Removing all references to fuseext and x2gothinclient from the build." - sed -e 's/^.*fuseext.*$//g' -e 's/^.*x2gothinclient.*$//g' -i ./config/package-lists/* + # This command removes all references to fuseext, freerdp-nightly, and x2gothinclient from the + # package list files. Currently needed as there are no ARM packages for any of these. + echo "WARNING: Removing all references to fuseext,freerdp-nightly and x2gothinclient from the build." + sed -e 's/^.*fuseext.*$//g' -e 's/^.*freerdp-nightly.*$//g' -e 's/^.*x2gothinclient.*$//g' -i ./config/package-lists/* - # This command removes the X2Go repository from the directory where additional - # archives are stored. Currently needed as the X2Go repository offers no arm64 + # This command removes the X2Go repository from the directory where additional + # archives are stored. Currently needed as the X2Go repository offers no arm64 # packages, but Debian Buster does - so that's what we're falling back to. echo "WARNING: Removing all references to the X2Go repository from the build." rm ./config/archives/*x2go* - # The following is a hack to reduce squashfs creation time. We're replacing mksquashfs - # in the changeroot environment with a wrapper script that drops the original - # mksquashfs call into a file. + # The following is a hack to reduce squashfs creation time in a crossbuild environment. + # We're replacing mksquashfs in the changeroot with a wrapper script that drops the + # original mksquashfs call into a file. - # We need to do this as a background task, waiting for the mksquashfs executable to - # appear in the changeroot; as the changeroot will only be created later on, once - # lb build is called. - - # The other background task waits until the command file has been created, then - # it applies some necessary patches to it, and starts the mksquashfs command natively - # on the build host, rather than in the changeroot environment. - # This is because in the changeroot, we'd be running the ARM mksquashfs in a qemu - # software emulation of the ARM architecture, while on the host, we can use all the - # native, raw CPU power and cores available to us. + if (uname -r | grep -q 'i.86' || uname -r | grep -q 'amd64') ; then + # We need to do this as a background task, waiting for the mksquashfs executable to + # appear in the changeroot; as the changeroot will only be created later on, once + # lb build is called. - # To make sure we don't have any lingering processes in the background, we're passing - # our own PID along to the background tasks, and tell them to terminate if our PID - # disappears while they're still in their waiting/looping state. + # The other background task waits until the command file has been created, then + # it applies some necessary patches to it, and starts the mksquashfs command natively + # on the build host, rather than in the changeroot environment. + # This is because in the changeroot, we'd be running the ARM mksquashfs in a qemu + # software emulation of the ARM architecture, while on the host, we can use all the + # native, raw CPU power and cores available to us. - MASTERPID=$$ + # To make sure we don't have any lingering processes in the background, we're passing + # our own PID along to the background tasks, and tell them to terminate if our PID + # disappears while they're still in their waiting/looping state. - # Replace mksquashfs in chroot with script - # (script will undo this upon completion) - ( - # wait until the chroot has been populated or until our parent process dies - while ! [ -x ./chroot/usr/bin/mksquashfs ]; do - ps $MASTERPID >/dev/null || exit 1 - sleep 1 - done - # make sure we don't overwrite the real executable if it has already been - # moved out of the way - if ! [ -x ./chroot/usr/bin/mksquashfs.real ]; then - cp ./chroot/usr/bin/mksquashfs ./chroot/usr/bin/mksquashfs.real - fi - echo '#!/bin/bash' >./chroot/usr/bin/mksquashfs - # log the name we've been called with and all parameters into this file - echo 'echo "$0 $@" >/tmp/filesystem.squashfs.temp' >>./chroot/usr/bin/mksquashfs - # once the native mksquashfs is complete, we will remove this file - echo 'while [ -f /tmp/filesystem.squashfs.temp ]; do' >>./chroot/usr/bin/mksquashfs - echo ' sleep 1' >>./chroot/usr/bin/mksquashfs - echo 'done' >>./chroot/usr/bin/mksquashfs - # so let's wait until it has been removed before deleting ourselves ... - echo 'rm /usr/bin/mksquashfs' >>./chroot/usr/bin/mksquashfs - # ... and moving the real executable back into its place - echo 'mv /usr/bin/mksquashfs.real /usr/bin/mksquashfs' >>./chroot/usr/bin/mksquashfs - chmod 755 ./chroot/usr/bin/mksquashfs - ) & + MASTERPID=$$ - # start the native mksquashfs after patching the parameters - ( - # wait until the trigger file has been created or until our parent process dies - while ! [ -f ./chroot/tmp/filesystem.squashfs.temp ]; do - ps $MASTERPID >/dev/null || exit 1 - sleep 1 - done - # using any of the available filters (x86, arm, armthumb) for the - # -Xbcj command results in an unusable squashfs on arm, so we drop the - # parameter completely if it's there. - # also, all absolute paths (detected by beginning with " /") need to be - # prefixed with "./chroot" so the mksquashfs outside the chroot knows where - # to look for the corresponding paths/files. - sed -e 's/ -Xbcj x86/ /g' -e 's# /# ./chroot/#g' -i \ - ./chroot/tmp/filesystem.squashfs.temp - # now let's make this executable - chmod 755 ./chroot/tmp/filesystem.squashfs.temp + # Replace mksquashfs in chroot with script + # (script will undo this upon completion) + ( + # wait until the chroot has been populated or until our parent process dies + while ! [ -x ./chroot/usr/bin/mksquashfs ]; do + ps $MASTERPID >/dev/null || exit 1 + sleep 1 + done + # make sure we don't overwrite the real executable if it has already been + # moved out of the way + if ! [ -x ./chroot/usr/bin/mksquashfs.real ]; then + cp ./chroot/usr/bin/mksquashfs ./chroot/usr/bin/mksquashfs.real + fi + echo '#!/bin/bash' >./chroot/usr/bin/mksquashfs + # log the name we've been called with and all parameters into this file + echo 'echo "$0 $@" >/tmp/filesystem.squashfs.temp' >>./chroot/usr/bin/mksquashfs + # once the native mksquashfs is complete, we will remove this file + echo 'while [ -f /tmp/filesystem.squashfs.temp ]; do' >>./chroot/usr/bin/mksquashfs + echo ' sleep 1' >>./chroot/usr/bin/mksquashfs + echo 'done' >>./chroot/usr/bin/mksquashfs + # so let's wait until it has been removed before deleting ourselves ... + echo 'rm /usr/bin/mksquashfs' >>./chroot/usr/bin/mksquashfs + # ... and moving the real executable back into its place + echo 'mv /usr/bin/mksquashfs.real /usr/bin/mksquashfs' >>./chroot/usr/bin/mksquashfs + chmod 755 ./chroot/usr/bin/mksquashfs + ) & - # we also need to add some more excludes because they shouldn't end up - # in the squashfs - no idea why we don't need them while inside the chroot ... - echo 'proc/*' >>./chroot/excludes - echo 'sys/*' >>./chroot/excludes - echo 'dev/pts/*' >>/.chroot.excludes - # now let's execute the script and, if it terminates without an error, - # we'll move the newly created squashfs into the chroot where the chrooted - # mksquashfs command would have created it; if that worked as well, we'll - # remove the script file so our dummy mksquashfs inside the chroot knows - # it's time to terminate itself. - ./chroot/tmp/filesystem.squashfs.temp && \ - mv ./filesystem.squashfs ./chroot/ && \ - rm ./chroot/tmp/filesystem.squashfs.temp - ) & + # start the native mksquashfs after patching the parameters + ( + # wait until the trigger file has been created or until our parent process dies + while ! [ -f ./chroot/tmp/filesystem.squashfs.temp ]; do + ps $MASTERPID >/dev/null || exit 1 + sleep 1 + done + # using any of the available filters (x86, arm, armthumb) for the + # -Xbcj command results in an unusable squashfs on arm, so we drop the + # parameter completely if it's there. + # also, all absolute paths (detected by beginning with " /") need to be + # prefixed with "./chroot" so the mksquashfs outside the chroot knows where + # to look for the corresponding paths/files. + sed -e 's/ -Xbcj x86/ /g' -e 's# /# ./chroot/#g' -i \ + ./chroot/tmp/filesystem.squashfs.temp + #needs switch from e.g. /bin/mksquashfs to $(which mksquashfs) + sed -e "s#^.*mksquashfs#$(which mksquashfs)#g" -i \ + ./chroot/tmp/filesystem.squashfs.temp + # now let's make this executable + chmod 755 ./chroot/tmp/filesystem.squashfs.temp + + # we also need to add some more excludes because they shouldn't end up + # in the squashfs - no idea why we don't need them while inside the chroot ... + echo 'proc/*' >>./chroot/excludes + echo 'sys/*' >>./chroot/excludes + echo 'dev/pts/*' >>/.chroot.excludes + # now let's execute the script and, if it terminates without an error, + # we'll move the newly created squashfs into the chroot where the chrooted + # mksquashfs command would have created it; if that worked as well, we'll + # remove the script file so our dummy mksquashfs inside the chroot knows + # it's time to terminate itself. + ./chroot/tmp/filesystem.squashfs.temp && \ + mv ./filesystem.squashfs ./chroot/ && \ + rm ./chroot/tmp/filesystem.squashfs.temp + ) & + fi fi if lb build ; then echo -e "Build is done: '$LBX2GO_TCEDIR'" @@ -435,11 +503,51 @@ ln $(realpath ./chroot/initrd.img) ./x2go-tce-initrd.img ln ./binary/live/filesystem.squashfs ./x2go-tce-filesystem.squashfs if [ "$LBX2GO_IMAGETYPE" = "hdd" ] ; then - ln ./live-image-$(echo "$LBX2GO_ARCH" | awk '{print $2}').img \ - ./x2go-tce-live-image-$(echo "$LBX2GO_ARCH" | awk '{print $2}').img + ln ./live-image-$(echo $LBX2GO_ARCH | awk '{print $2}').img \ + ./x2go-tce-live-image-$(echo $LBX2GO_ARCH | awk '{print $2}').img fi + + # This is part of our experimental ARM support + if [ "$LBX2GO_IMAGETYPE" = "hdd" ] && echo $LBX2GO_ARCH | grep -q "arm" ; then + # after the build, let's determine the name of our image file ... + IMAGEFILE="./x2go-tce-live-image-$(echo $LBX2GO_ARCH | awk '{print $2}').img" + + # ... and change the partition type to reflect the file system actually in use for partition 1 + # ("b" is FAT32) + sfdisk --part-type $IMAGEFILE 1 b + + # next, we need to patch two things inside the image, so we need to set up a loop device for it. + FREELOOP=$(losetup -f) # note that this could become a TOCTOU issue if more than 1 process tries to use loop devices + + # as the image is a full disk image containing a partition, we need to jump to the position where the first partition starts + losetup -o 1048576 $FREELOOP $IMAGEFILE + + # now let's mount it + mkdir -p ./tempmount + mount $FREELOOP ./tempmount + + # purge this dir, so we have enough space; we'll return to fill it later + rm ./tempmount/live/* + + # first, we copy the contents of the boot/firmware/ folder to the root directory, because that is where these files are needed + # see if inplace helps against out of space errors + rsync -aP --inplace ./chroot/boot/firmware/* ./tempmount + + mkdir -p ./tempmount/live/ + rsync -aP ./binary/live/*.squashfs ./tempmount/live/ + + # next, we replace the "root=" parameter with the parameters needed for live-booting + sed -e 's#root=/dev/mmcblk0p2 #'"$LBX2GO_BOOTAPPEND_LIVE"' #' -i ./tempmount/cmdline.txt + + # here comes the cleanup part + sync + umount $FREELOOP + losetup -d $FREELOOP + rmdir ./tempmount + fi + if [ "$LBX2GO_IMAGETYPE" = "netboot" ] ; then if [ "$LBX2GO_NOSQUASHFS" = "true" ] ; then (cd binary; echo live$'\n'live/filesystem.squashfs |cpio -o -H newc | gzip --fast) >./x2go-tce-filesystem.cpio.gz cat ./x2go-tce-initrd.img ./x2go-tce-filesystem.cpio.gz >./x2go-tce-initrd-with-fs.img || exit 1 @@ -449,14 +557,14 @@ fi fi if [ "$LBX2GO_IMAGETYPE" = "iso" ] || [ "$LBX2GO_IMAGETYPE" = "iso-hybrid" ] ; then genisoimage -o ./x2go-tce-squashfs-only.iso -R -J -graft-points live/filesystem.squashfs=./x2go-tce-filesystem.squashfs - if [ -e ./live-image-$(echo "$LBX2GO_ARCH" | awk '{print $2}').hybrid.iso ] ; then - ln ./live-image-$(echo "$LBX2GO_ARCH" | awk '{print $2}').hybrid.iso \ - ./original-x2go-tce-live-image-$(echo "$LBX2GO_ARCH" | awk '{print $2}').hybrid.iso - elif [ -e ./live-image-$(echo "$LBX2GO_ARCH" | awk '{print $2}').iso ] ; then - ln ./live-image-$(echo "$LBX2GO_ARCH" | awk '{print $2}').iso \ - ./original-x2go-tce-live-image-$(echo "$LBX2GO_ARCH" | awk '{print $2}').iso + if [ -e ./live-image-$(echo $LBX2GO_ARCH | awk '{print $2}').hybrid.iso ] ; then + ln ./live-image-$(echo $LBX2GO_ARCH | awk '{print $2}').hybrid.iso \ + ./original-x2go-tce-live-image-$(echo $LBX2GO_ARCH | awk '{print $2}').hybrid.iso + elif [ -e ./live-image-$(echo $LBX2GO_ARCH | awk '{print $2}').iso ] ; then + ln ./live-image-$(echo $LBX2GO_ARCH | awk '{print $2}').iso \ + ./original-x2go-tce-live-image-$(echo $LBX2GO_ARCH | awk '{print $2}').iso fi mv ./x2go-tce-filesystem.squashfs ./original-x2go-tce-filesystem.squashfs fi # create timestamp file @@ -485,8 +593,9 @@ fi fi cd .. fi + </code> ===== Netbooting ===== -- This mail was generated by DokuWiki at https://wiki.x2go.org/