This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
doc:howto:tce [2019/09/17 10:43] stefanbaur [Build system prerequisites for all variants] added netcat to list of required packages |
doc:howto:tce [2022/12/02 13:05] stefanbaur [Live-Patching the Build] |
||
---|---|---|---|
Line 44: | Line 44: | ||
# we have a successful connect on port 3142, assume | # we have a successful connect on port 3142, assume | ||
# it's apt-cacher-ng and use it | # it's apt-cacher-ng and use it | ||
+ | # | ||
if nc -z 127.0.0.1 3142 ; then | if nc -z 127.0.0.1 3142 ; then | ||
- | export https_proxy=http:// | + | # bad idea with apt-cacher-ng, |
- | export http_proxy=http:// | + | # export https_proxy=http:// |
- | export ftp_proxy=http:// | + | # |
+ | # | ||
- | export LB_APT_FTP_PROXY=$ftp_proxy | + | |
- | export LB_APT_HTTP_PROXY=$http_proxy | + | export LB_APT_HTTP_PROXY=http:// |
fi | fi | ||
+ | |||
+ | # set these to true to save source files | ||
+ | #export LB_SOURCE=" | ||
+ | #export LBX2GO_GETSRC=" | ||
# Select ONE of the following git reposities | # Select ONE of the following git reposities | ||
# this one loosely corresponds to " | # this one loosely corresponds to " | ||
#export LBX2GO_CONFIG=' | #export LBX2GO_CONFIG=' | ||
+ | #export LBX2GO_CONFIG=' | ||
+ | export LBX2GO_CONFIG=' | ||
+ | #export LBX2GO_CONFIG=' | ||
# this one loosely corresponds to " | # this one loosely corresponds to " | ||
- | export LBX2GO_CONFIG=' | + | #export LBX2GO_CONFIG=' |
- | # NOTE: Add " | + | #export LBX2GO_CONFIG=' |
- | # NOTE: As of 2019-08-27, buster builds are only available via the github repo and for the feature/ | + | #export LBX2GO_CONFIG=' |
+ | #export LBX2GO_CONFIG=' | ||
+ | # NOTE: Add " | ||
+ | # | ||
+ | # add "-bullseye" | ||
# Select ONE of the following LBX2GO_ARCH lines and comment out the others | # Select ONE of the following LBX2GO_ARCH lines and comment out the others | ||
Line 70: | Line 82: | ||
# 32-Bit, smallest memory footprint - not available on buster | # 32-Bit, smallest memory footprint - not available on buster | ||
# export LBX2GO_ARCH=' | # export LBX2GO_ARCH=' | ||
+ | # For ARM (Raspberry Pi): | ||
+ | #export LBX2GO_ARCH=' | ||
+ | #export LBX2GO_ARCH_MODEL=' | ||
# If you want to use the stock ISO image as created by this script, add your boot parameters here | # If you want to use the stock ISO image as created by this script, add your boot parameters here | ||
- | #export LBX2GO_BOOTAPPEND_LIVE=" | + | # export LBX2GO_BOOTAPPEND_LIVE=" |
+ | export LBX2GO_BOOTAPPEND_LIVE=" | ||
+ | |||
+ | if echo -e " | ||
+ | LBX2GO_BOOTAPPEND_LIVE+=" | ||
+ | export LBX2GO_BOOTAPPEND_LIVE | ||
+ | elif echo -e " | ||
+ | LBX2GO_BOOTAPPEND_LIVE+=' | ||
+ | export LBX2GO_BOOTAPPEND_LIVE | ||
+ | fi | ||
# detect if the selected git repo is meant to build a buster, stretch or jessie image | # detect if the selected git repo is meant to build a buster, stretch or jessie image | ||
if [ -z " | if [ -z " | ||
- | | + | |
- | export LBX2GO_BOOTAPPEND_LIVE+=" | + | |
+ | elif [ -z " | ||
+ | export LBX2GO_DEBVERSION=" | ||
+ | export LBX2GO_BOOTAPPEND_LIVE+=" | ||
+ | elif [ -z " | ||
+ | export LBX2GO_DEBVERSION=" | ||
+ | | ||
elif [ -z " | elif [ -z " | ||
- | | + | |
- | export LBX2GO_BOOTAPPEND_LIVE+=" | + | |
+ | elif [ -z " | ||
+ | export LBX2GO_DEBVERSION=" | ||
+ | | ||
else | else | ||
- | | + | |
fi | fi | ||
# newer versions of live-build use the plural form of this parameter | # newer versions of live-build use the plural form of this parameter | ||
if $(LANG=C lb config --help | grep -q bootloaders) ; then | if $(LANG=C lb config --help | grep -q bootloaders) ; then | ||
- | | + | |
else | else | ||
- | | + | |
fi | fi | ||
# set boot loader type - leave this unchanged unless you really know what you're doing | # set boot loader type - leave this unchanged unless you really know what you're doing | ||
- | export LBX2GO_BOOTLOADER=" | + | if echo $LBX2GO_ARCH | awk ' |
+ | # This is part of our experimental ARM support | ||
+ | LBX2GO_BOOTLOADERPARAMNAME=" | ||
+ | LBX2GO_BOOTLOADER=" | ||
+ | else | ||
+ | | ||
+ | fi | ||
# These options are meant to reduce the image size. | # These options are meant to reduce the image size. | ||
# Feel free to adapt them after consulting "man lb_config" | # Feel free to adapt them after consulting "man lb_config" | ||
- | export LBX2GO_SPACE=' | + | # FIXME export LBX2GO_SPACE=' |
+ | export LBX2GO_SPACE=' | ||
| | ||
| | ||
Line 127: | Line 167: | ||
--distribution $LBX2GO_DEBVERSION" | --distribution $LBX2GO_DEBVERSION" | ||
+ | # This is part of our experimental ARM support | ||
+ | if echo $LBX2GO_ARCH | grep -q ' | ||
+ | export LBX2GO_DEFAULTS+=" | ||
+ | --bootstrap-qemu-static / | ||
+ | --apt-options \" | ||
+ | fi | ||
+ | |||
+ | # This is part of our experimental ARM support | ||
+ | # This makes sure the resulting disk image is at least 1GB in size, even though our build currently requires way less. | ||
+ | # It's unlikely that anyone will need to boot from a smaller partition; but if we let live-build pick the minimum size automatically, | ||
+ | # we will not have enough space left to copy the firmware blobs into the right location. | ||
+ | if echo $LBX2GO_ARCH | grep -q ' | ||
+ | export LBX2GO_DEFAULTS+=" | ||
+ | --hdd-size 1024" | ||
+ | fi | ||
export LBX2GO_ARCHIVE_AREAS=" | export LBX2GO_ARCHIVE_AREAS=" | ||
# This is for minidesktop builds and currently only adds firefox-esr language packs | # This is for minidesktop builds and currently only adds firefox-esr language packs | ||
- | #export LBX2GO_LANG=' | + | # export LBX2GO_LANG=' |
# This is to optimize squashfs size, based on a suggestion by intrigeri from the TAILS team | # This is to optimize squashfs size, based on a suggestion by intrigeri from the TAILS team | ||
# note that this will permanently change / | # note that this will permanently change / | ||
- | sed -i -e 's#MKSQUASHFS_OPTIONS=" | + | # |
+ | # | ||
+ | if dpkg --print-architecture | grep -q 'arm'; then | ||
+ | # on arm, these parameters must not be used; if they' | ||
+ | if grep -q -- '-Xbcj x86 -b 1024K -Xdict-size 1024K' / | ||
+ | apt install --reinstall live-build | ||
+ | fi | ||
+ | # feel free to experiment with these options, but be prepared for subtle breakage | ||
+ | #export MKSQUASHFS_OPTIONS=' | ||
+ | #export MKSQUASHFS_OPTIONS=' | ||
+ | #export MKSQUASHFS_OPTIONS=' | ||
+ | export MKSQUASHFS_OPTIONS='' | ||
+ | else | ||
+ | export MKSQUASHFS_OPTIONS=' | ||
+ | fi | ||
# This removes documentation, | # This removes documentation, | ||
Line 144: | Line 213: | ||
# This patches the squashfs file into the initrd. Only parsed when image type " | # This patches the squashfs file into the initrd. Only parsed when image type " | ||
# Will require boot parameter live-media=/ | # Will require boot parameter live-media=/ | ||
- | # Both TFTP client and TFTP server must support file transfers >32MB for this to work, if you want to deploy this initrd via TFTP, | + | # Both TFTP client and TFTP server must support file transfers >32MB for this to work, if you want to deploy this initrd via TFTP, |
# so e.g. atftpd will not work - tftpd-hpa, however, seems to have no problem with larger files. | # so e.g. atftpd will not work - tftpd-hpa, however, seems to have no problem with larger files. | ||
# When using iPXE, you can use http instead of TFTP. | # When using iPXE, you can use http instead of TFTP. | ||
# This is especially helpful if you want to netboot via http and cannot use the server' | # This is especially helpful if you want to netboot via http and cannot use the server' | ||
- | export LBX2GO_NOSQUASHFS=" | + | #export LBX2GO_NOSQUASHFS=" |
# Select ONE of the following LBX2GO_IMAGETYPE lines and comment out the others | # Select ONE of the following LBX2GO_IMAGETYPE lines and comment out the others | ||
# to create an iso image: | # to create an iso image: | ||
- | # export LBX2GO_IMAGETYPE=' | + | #export LBX2GO_IMAGETYPE=' |
# to create an iso image that can also be dd'ed to USB media: | # to create an iso image that can also be dd'ed to USB media: | ||
- | #export LBX2GO_IMAGETYPE=' | + | export LBX2GO_IMAGETYPE=' |
# to create a netboot-image: | # to create a netboot-image: | ||
- | export LBX2GO_IMAGETYPE=' | + | #export LBX2GO_IMAGETYPE=' |
# /!\ the options below are NOT RECOMMENDED unless you use live-build from Debian Buster /!\ | # /!\ the options below are NOT RECOMMENDED unless you use live-build from Debian Buster /!\ | ||
- | # to create an image that can be written to a hard disk (for older live-build versions, this | + | # (Debian 10) or newer to create an image that can be written to a hard disk (for older |
- | # always results in a "build failed" | + | # live-build versions, this always results in a "build failed" |
- | # live-build from Buster and things will work): | + | # might have worked - use live-build from Buster |
- | # export LBX2GO_IMAGETYPE=' | + | #export LBX2GO_IMAGETYPE=' |
+ | ## This might be required for hdd builds, especially for (u)efi | ||
+ | #export LBX2GO_BOOTLOADER=" | ||
# to create a tar file only (seems to be broken in older live-build versions - Buster works): | # to create a tar file only (seems to be broken in older live-build versions - Buster works): | ||
- | # export LBX2GO_IMAGETYPE=' | + | #export LBX2GO_IMAGETYPE=' |
+ | |||
+ | # This is part of our experimental ARM support | ||
+ | if echo " | ||
+ | # enforce hdd image for arm at the moment (might need to support netboot later on too) | ||
+ | if ! [ " | ||
+ | echo " | ||
+ | export LBX2GO_IMAGETYPE=" | ||
+ | fi | ||
+ | fi | ||
if [ " | if [ " | ||
- | LBX2GO_DEFAULTS+=" | + | |
fi | fi | ||
</ | </ | ||
==== Live-Patching the Build ==== | ==== Live-Patching the Build ==== | ||
- | This patch is required if you need USB mount capability on the ThinClient while [[http:// | + | To add patches that aren't part of any package yet, you can use the directory |
- | Save this script in the directory where you want to save your builds | + | |
- | + | ||
- | < | + | |
- | #!/bin/bash | + | |
- | mkdir -p ./patch/ | + | |
- | wget -O ./ | + | |
- | chmod 755 ./ | + | |
- | </ | + | |
+ | You will need to create a directory structure like ./ | ||
==== Starting the Build ==== | ==== Starting the Build ==== | ||
In the directory where you want to save your builds, save the following file as x2go-tce-build, | In the directory where you want to save your builds, save the following file as x2go-tce-build, | ||
Line 191: | Line 264: | ||
# Create Timestamp | # Create Timestamp | ||
LBX2GO_TIMESTAMP=$(date +" | LBX2GO_TIMESTAMP=$(date +" | ||
+ | |||
+ | exec > >(tee "/ | ||
# Set Directory name | # Set Directory name | ||
Line 196: | Line 271: | ||
if [ -z " | if [ -z " | ||
+ | ( echo " | ||
[ -z " | [ -z " | ||
[ -z " | [ -z " | ||
Line 207: | Line 283: | ||
echo -e "One or more of the following variables is unset:" | echo -e "One or more of the following variables is unset:" | ||
echo -e " | echo -e " | ||
+ | echo " | ||
echo -e " | echo -e " | ||
echo -e " | echo -e " | ||
Line 223: | Line 300: | ||
cd $LBX2GO_TCEDIR | cd $LBX2GO_TCEDIR | ||
+ | X2GO_LBCONFIG_STRING=$(cat << | ||
lb config $LBX2GO_ARCH $LBX2GO_SPACE $LBX2GO_DEFAULTS \ | lb config $LBX2GO_ARCH $LBX2GO_SPACE $LBX2GO_DEFAULTS \ | ||
| | ||
| | ||
| | ||
+ | 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 " | ||
+ | eval " | ||
+ | |||
# This will copy any patches we have prepared | # This will copy any patches we have prepared | ||
if [ -d " | if [ -d " | ||
cp -a ../patch/* config/ | cp -a ../patch/* config/ | ||
fi | fi | ||
+ | |||
# This will copy any patches we have prepared for minidesktop | # This will copy any patches we have prepared for minidesktop | ||
if [ -d " | if [ -d " | ||
cp -a ../ | cp -a ../ | ||
fi | 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/ | ||
+ | rsync -aPH --ignore-existing --exclude=" | ||
+ | fi | ||
+ | # When enabled, this silences the audible beep at syslinux/ | ||
+ | # Note that this is an accessibility feature for blind users, so use with care. | ||
+ | sed -e " | ||
+ | |||
# This enables an i386-only package in the sources.list file when an i386 build is requested | # This enables an i386-only package in the sources.list file when an i386 build is requested | ||
- | if echo "$LBX2GO_ARCH" | + | if echo $LBX2GO_ARCH | grep -q -i " |
sed -i -e 's/# for i386 only #//' config/ | sed -i -e 's/# for i386 only #//' config/ | ||
fi | 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 " | ||
+ | |||
+ | # firmware for wifi | ||
+ | echo " | ||
+ | |||
+ | if [ " | ||
+ | # modules required for Raspberry Pi 3 LAN | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | |||
+ | # firmware for basic raspi functions - required for boot on Pi3 | ||
+ | echo " | ||
+ | # standard linux kernel - for Pi3 | ||
+ | echo " | ||
+ | |||
+ | elif [ " | ||
+ | # firmware for basic raspi functions - required for boot on Pi4 | ||
+ | echo " | ||
+ | echo " | ||
+ | |||
+ | # newer linux kernel - required for pi4/pi400 | ||
+ | echo " | ||
+ | |||
+ | else | ||
+ | echo " | ||
+ | fi | ||
+ | |||
+ | fi | ||
+ | |||
+ | |||
# This is for minidesktop builds only | # This is for minidesktop builds only | ||
if [ -f config/ | if [ -f config/ | ||
if [ -n " | if [ -n " | ||
- | for LBX2GO_SINGLE_LANG in $(echo $LBX2GO_LANG | tr ';' | + | for LBX2GO_SINGLE_LANG in $(echo |
echo "LANG: ' | echo "LANG: ' | ||
sed -i -e ' | sed -i -e ' | ||
Line 260: | Line 395: | ||
chmod 755 ./ | chmod 755 ./ | ||
fi | fi | ||
+ | |||
+ | if [ -n " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | # Here, we should have reached a point where it is safe to point all proxy variables | ||
+ | # at the apt-cacher-ng proxy. | ||
+ | # at files not being downloaded, disable these three entries. | ||
+ | export https_proxy=$LB_APT_HTTP_PROXY | ||
+ | export http_proxy=$LB_APT_HTTP_PROXY | ||
+ | export ftp_proxy=$LB_APT_FTP_PROXY | ||
+ | fi | ||
+ | |||
+ | # 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 ' | ||
+ | |||
+ | # This command removes all references to fuseext, freerdp-nightly, | ||
+ | # package list files. | ||
+ | echo " | ||
+ | sed -e ' | ||
+ | |||
+ | # This command removes the X2Go repository from the directory where additional | ||
+ | # archives are stored. | ||
+ | # packages, but Debian Buster does - so that's what we're falling back to. | ||
+ | echo " | ||
+ | rm ./ | ||
+ | |||
+ | # 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. | ||
+ | |||
+ | if (uname -r | grep -q ' | ||
+ | # 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, | ||
+ | # native, raw CPU power and cores available to us. | ||
+ | |||
+ | # 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' | ||
+ | |||
+ | MASTERPID=$$ | ||
+ | |||
+ | # 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 ./ | ||
+ | ps $MASTERPID >/ | ||
+ | sleep 1 | ||
+ | done | ||
+ | # make sure we don't overwrite the real executable if it has already been | ||
+ | # moved out of the way | ||
+ | if ! [ -x ./ | ||
+ | cp ./ | ||
+ | fi | ||
+ | echo '# | ||
+ | # log the name we've been called with and all parameters into this file | ||
+ | echo 'echo "$0 $@" >/ | ||
+ | # once the native mksquashfs is complete, we will remove this file | ||
+ | echo 'while [ -f / | ||
+ | echo ' | ||
+ | echo ' | ||
+ | # so let's wait until it has been removed before deleting ourselves ... | ||
+ | echo 'rm / | ||
+ | # ... and moving the real executable back into its place | ||
+ | echo 'mv / | ||
+ | chmod 755 ./ | ||
+ | ) & | ||
+ | |||
+ | # start the native mksquashfs after patching the parameters | ||
+ | ( | ||
+ | # wait until the trigger file has been created or until our parent process dies | ||
+ | while ! [ -f ./ | ||
+ | ps $MASTERPID >/ | ||
+ | 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 " | ||
+ | # to look for the corresponding paths/ | ||
+ | sed -e 's/ -Xbcj x86/ /g' -e 's# /# ./ | ||
+ | ./ | ||
+ | #needs switch from e.g. / | ||
+ | sed -e " | ||
+ | ./ | ||
+ | # now let's make this executable | ||
+ | chmod 755 ./ | ||
+ | |||
+ | # we also need to add some more excludes because they shouldn' | ||
+ | # in the squashfs - no idea why we don't need them while inside the chroot ... | ||
+ | echo ' | ||
+ | echo ' | ||
+ | echo ' | ||
+ | # 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. | ||
+ | ./ | ||
+ | mv ./ | ||
+ | rm ./ | ||
+ | ) & | ||
+ | fi | ||
+ | fi | ||
+ | |||
if lb build ; then | if lb build ; then | ||
echo -e "Build is done: ' | echo -e "Build is done: ' | ||
- | ln ./binary/live/vmlinuz ./ | + | ln $(realpath |
- | ln ./binary/live/initrd.img ./ | + | ln $(realpath |
ln ./ | ln ./ | ||
if [ " | if [ " | ||
- | ln ./ | + | ln ./ |
| | ||
fi | fi | ||
+ | |||
+ | # This is part of our experimental ARM support | ||
+ | if [ " | ||
+ | # after the build, let's determine the name of our image file ... | ||
+ | IMAGEFILE=" | ||
+ | |||
+ | # ... and change the partition type to reflect the file system actually in use for partition 1 | ||
+ | # (" | ||
+ | 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 ./ | ||
+ | |||
+ | # first, we copy the contents of the boot/ | ||
+ | # see if inplace helps against out of space errors | ||
+ | rsync -aP --inplace ./ | ||
+ | |||
+ | mkdir -p ./ | ||
+ | rsync -aP ./ | ||
+ | |||
+ | # next, we replace the " | ||
+ | sed -e ' | ||
+ | |||
+ | # here comes the cleanup part | ||
+ | sync | ||
+ | umount $FREELOOP | ||
+ | losetup -d $FREELOOP | ||
+ | rmdir ./tempmount | ||
+ | fi | ||
+ | |||
if [ " | if [ " | ||
if [ " | if [ " | ||
Line 317: | Line 609: | ||
cd .. | cd .. | ||
fi | fi | ||
+ | |||
</ | </ | ||
Line 390: | Line 683: | ||
=== Required unless using the X2Go Session Broker: Adding the x2go-tce.sessions session configuration file to your HTTP or FTP Server === | === Required unless using the X2Go Session Broker: Adding the x2go-tce.sessions session configuration file to your HTTP or FTP Server === | ||
Again, this is assuming you already have an existing, working HTTP or FTP server setup. | Again, this is assuming you already have an existing, working HTTP or FTP server setup. | ||
- | * run X2GoClient on any computer you like, and configure a session the same way it should appear on the ThinClient <note tip>when using a Windows client, run x2goclient.exe --portable, or it will store the session information in the registry, rather than in a " | + | * run X2GoClient on any computer you like, and configure a session the same way it should appear on the ThinClient |
+ | <note tip>when using a Windows client, run x2goclient.exe --portable, or it will store the session information in the registry, rather than in a " | ||
* locate the " | * locate the " | ||
* copy it to x2go-tce.sessions | * copy it to x2go-tce.sessions | ||
Line 667: | Line 962: | ||
* '' | * '' | ||
* '' | * '' | ||
- | * '' | + | * '' |
* '' | * '' | ||
* '' | * '' | ||
Line 1029: | Line 1324: | ||
FIXME Scripts triggered by if-up should check if a new download is really necessary. | FIXME Scripts triggered by if-up should check if a new download is really necessary. | ||
- | FIXME Feature request: In TCE (not MMD), use < | + | ===== List of closed ToDos/ |
+ | * Feature request: In TCE (not MMD), use < | ||
while ! (grep " | while ! (grep " | ||
echo s >/ | echo s >/ | ||
Line 1036: | Line 1332: | ||
echo o >/ | echo o >/ | ||
</ | </ | ||
- | ===== List of closed ToDos/ | + | |
* '' | * '' | ||
* It would be nice to have a boot parameter '' | * It would be nice to have a boot parameter '' |