{"id":38182094,"url":"https://github.com/digabi/ytl-linux","last_synced_at":"2026-01-20T18:05:21.081Z","repository":{"id":54577559,"uuid":"302539268","full_name":"digabi/ytl-linux","owner":"digabi","description":"An easy-to-install Linux to run virtual exam server (KTP)","archived":false,"fork":false,"pushed_at":"2026-01-12T14:47:01.000Z","size":5874,"stargazers_count":0,"open_issues_count":11,"forks_count":3,"subscribers_count":20,"default_branch":"main","last_synced_at":"2026-01-12T18:56:28.477Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/digabi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-10-09T05:13:48.000Z","updated_at":"2026-01-12T11:29:16.000Z","dependencies_parsed_at":"2024-12-05T09:25:57.765Z","dependency_job_id":"8ba0618b-726b-48c7-b422-1d811b48dd90","html_url":"https://github.com/digabi/ytl-linux","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/digabi/ytl-linux","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digabi%2Fytl-linux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digabi%2Fytl-linux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digabi%2Fytl-linux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digabi%2Fytl-linux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/digabi","download_url":"https://codeload.github.com/digabi/ytl-linux/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digabi%2Fytl-linux/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28489342,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T22:54:02.790Z","status":"ssl_error","status_checked_at":"2026-01-16T22:50:10.344Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-16T23:55:29.271Z","updated_at":"2026-01-16T23:55:30.073Z","avatar_url":"https://github.com/digabi.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# YTL Linux\n\nThe YTL Linux is an Ubuntu environment which installs automatically\neverything you need to run a virtual Abitti server (Oracle VirtualBox and Naksu). The ultimate goals are:\n * Move the pain of updating servers and finding working combinations of software from the schools to the Matriculation Examination Board (Ylioppilastutkintolautakunta YTL in Finnish).\n * Make the Linux servers more uniform in order to help communication between the schools and the Abitti support in case of trouble.\n * In the long term make it possible to provide remote support during the exams.\n\nThis is the advised way to install a Linux-based Abitti server. For the end-user instructions see [Abitti.fi](https://www.abitti.fi/fi/ohjeet/koetilan-palvelin/).\nIf you have problems with SecureBoot installation see the [tech version of the installation instructions](INSTALL.md).\n\n## USB Monster\n\n### Using USB Monster with YTL Linux\n\nThe default behaviour of Cinnamon (thus, YTL Linux) is to automount all USB memories inserted into\nthe workstation. Before starting to use USB Monster this feature should be disabled by entering\nfollowing commands:\n\n```\ngsettings set org.cinnamon.desktop.media-handling automount-open false\ngsettings set org.cinnamon.desktop.media-handling automount false\n```\n\nThese commands are per-user so your Abitti server user (e.g. the default `school`) can have the automount\non while the USB monster user may have the automount turned off. \n\n### Install USB Monster without YTL Linux\n\nThe YTL Linux contains world-famous [USB Monster](https://github.com/digabi/usb-monster) which handles simulaneous writes\nto massive amount of USB memories. The Matriculation Examination Board uses USB\nMonster to write its fleet for biannual exams.\n\nHere are the steps to install USB Monster to your non-YTL Linux deb-based distro:\n * Import the key: \\\n   `wget -qO- https://linux.abitti.fi/apt-signing-key.pub | sudo tee /etc/apt/trusted.gpg.d/ytl-linux.asc`\n * Add our repo to your sources: \\\n   `sudo bash -c 'echo \"deb https://linux.abitti.fi/deb ytl-linux main\" \u003e/etc/apt/sources.list.d/usbmonster.list'`\n * Update your packages and install: \\\n   `sudo apt update \u0026\u0026 sudo apt install digabi-usb-monster`\n\nAfter this your USB Monster will be updated automatically.\n\nIf you have added the signing key with legacy `apt-key` tool and get `Key is stored in legacy trusted.gpg keyring` errors\nyou can change the location of the key with following procedure:\n\n```\n$ sudo apt-key del \"19A4 3050 953F DEC0 F0D6  2C81 1B26 415C 1E66 6A78\"\nWarning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).\nOK\n$ wget -qO- https://linux.abitti.fi/apt-signing-key.pub | sudo tee /etc/apt/trusted.gpg.d/ytl-linux.asc\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF/OM8EBEADbtIT8en8PLczP2egPDeBXIXaSsQFzGgCBGd1vjCLbe1bhZ3ii\nO/FWr2QqORnbzrNim5VyzeZ8Qq4Yj0XoQNhvkw9eD2old1mThjra5BMesMNXHnEB\nPG6LAfPFDE9hsUaQDIJrHRO09GKlMJDIFX/cSPkzlQw2Pnzf6UTY8E2L6CORPWih\n...\nZZYZdDCRzHPA90AVFdev65Yd+2xt+JjmnbldS6z7HaIiCeT5XhhhgSd9AUoM+Hyu\nNkP7g8coWb57JQj63AgO9ukfqYuR4XqQHW3ga6U4cKhPUU1ChE5H\n=swfs\n-----END PGP PUBLIC KEY BLOCK-----\n```\n\nRun `sudo apt update` and make sure the legacy keyring warning has disappeared.\n\n## Naksu 2\n\nInstall and set up [git-lfs](https://git-lfs.com). \n1. Run `scripts/update-naksu2.sh` to download the latest version of the Naksu 2 deb from GitHub Releases.\n2. Make a commit named 'Update Naksu 2 to x.x.x\"\n3. `git push`\n4. That's it. Naksu will read the latest version from [https://linux.abitti.fi/meta/naksu2-latest-version.json](https://linux.abitti.fi/meta/naksu2-latest-version.json)\n\n## Building the image\n\n### Building the image locally\n\nThe build script will download a Ubuntu installation ISO image and modify\nit so that it will boot by default to an autoinstall mode and download\nour install configuration.\n\nThe build script `build-ytl-image` can be executed with or without Docker. Both\nshould give you a new ISO file `ytl-install-24.iso` which can be tested with\ninstructions given below.\n\n * Building with Docker: `make docker`\n * Building on your bare OS: `./build-ytl-image`\n\n### Testing the image and install script locally\n\nTo test the image and the install script `docs/autoinstall-config-XX/user-data`\nyou can do the following:\n\n * Start a local httpd server at port 8080: `make start-httpd`\n * Run `AUTOINSTALL_URL=http://\u003cyour-ip-address-here-but-not-localhost\u003e:8080/autoinstall-config-24/ ./build-ytl-image` (or same with `make docker` for Docker)\n\n**Note:** On macOS, it is possible to get KVM working for testing, but it's probably easier to use something like https://github.com/utmapp/UTM. After building the ISO, create an x86_64 emulator VM, select the built ytl-install-24.iso, and leave all other options at default.\n\n### Building the image with GitHub automation\n\nPushing a tag of the form 'v24.X' to the digabi/ytl-linux GitHub\nrepository will trigger an action that automatically rebuilds the image\nand uploads it to https://linux.abitti.fi/ytl-install-24.iso .\n\nUse Ubuntu version numbers with local build version number. A build \nnumber two of Ubuntu 24.04.3 would get version number (tag) `v24.04.3-2`.\n\n## Updating configuration\n\nThe installation configuration is in\n[``docs/autoinstall-config-XX/user-data``](https://github.com/digabi/ytl-linux/blob/main/docs/autoinstall-config-XX/user-data)\n(where XX stands 1st part of Ubuntu version number, e.g. 22)\nand the format is documented\n[here](https://ubuntu.com/server/docs/install/autoinstall-reference).\nPushing changes to the file will make\nit available to installers via [GitHub\npages](https://digabi.github.io/ytl-linux/autoinstall-config/user-data)\n\n## APT repository and deb packages\n\nCustom YTL-Linux deb packages can be found in the [packages](./packages) directory.\n\nThe ytl-linux-customize deb package is built automatically by a GitHub action\non pushes to the source code directory. The resulting package, along with any others\nin the debs/ directory (currently none) get pushed to an apt repository at\n\n`deb https://linux.abitti.fi/deb ytl-linux main`\n\nand are signed with the GPG key currently available at\n\n`https://linux.abitti.fi/apt-signing-key.pub`\n\nThe installation ISO image will pull in the ytl-linux-customize package from there.\n\n### Testing deb packages\n\nWhen adding/updating deb packages in this repository remember to test the\npackages in following environments:\n * YTL Linux - the current production version of this very flavour of Ubuntu Linux\n * WSL - the currently instructed environment to run Abitti 2 servers\n\nFor the official instructions on installing production versions see\nhttps://abitti.fi/abitti2/\n\n## Testing instructions\n\nIn its current state the image will fetch the autoinstall configuration\n(located in the docs/autoinstall-config subdirectory) over the network\nfrom GitHub. This can be changed by modifying the build script.\n\n### Testing with VirtualBox\n\nThis option requires VirtualBox to be installed (`sudo apt install virtualbox`). **Note:** VirtualBox is not supported on macOS, as it cannot do x86 emulation on ARM.\n\n```bash\nmake create-vb-vm\n```\n\nVM parameters can be customized; see top of [Makefile](./Makefile) for all available options. E.g.:\n\n```bash\nmake create-vb-vm VM_CPUS=8 VM_MEMORY_SIZE=8192\n```\n\nThe repo folder is automatically mounted into the VirtualBox VM as a shared folder. To access it and build the debs for testing inside the VM, run the following commands:\n\n```\nsudo apt install virtualbox-guest-utils ruby-dev build-essential\nsudo gem i -f fpm\nsudo usermod -aG vboxsf $USER\nsudo reboot now\n```\n\nDebs can then be created with `make deb` and installed with `sudo apt install --reinstall ./ytl-linux-(...).deb`.\n\n### Testing with KVM\n\n```bash\nmake create-kvm-vm\n```\n\n**Note:** The KVM setup does not currently support automatically mounting the repo into the VM as a shared folder for testing.\n\n## Debugging failing installations\n\nWhen installation fails the installer stops and prints a Python traceback or similar\nerror log describing the problem. In this case you can open a new console by\npressing Alt+F2 (Alt+F3...) and study the log files. The most relevant log files\nare:\n * `/var/log/cloud-init-output.log` Output of the cloud-init part of the installation\n * `/var/log/cloud-init.log` Log of the cloud-init part of the installation\n * `/var/log/curtin/install.log` Log of the Curtin part of the installation\n\nIf a package installation failed, look for the syslog identifier of the failing Subiquity task (something like `SyslogIdentifier=subiquity_log.1234`) and then grep it from `/var/log/syslog` to look for the true source of the issue:\n\n```bash\ncat /var/log/syslog | grep -i subiquity_log.1234 | less\n```\n\nThis is because Subiquity outputs are not terribly helpful in these situations because they only state the exit code, not what actually broke - you need to find the output from apt in the syslog for that.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdigabi%2Fytl-linux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdigabi%2Fytl-linux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdigabi%2Fytl-linux/lists"}