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/
_______________________________________________
x2go-commits mailing list
x2go-commits@lists.x2go.org
https://lists.x2go.org/listinfo/x2go-commits