7

After having used Xubuntu minimal installations from the netboot (mini.iso) image in multiple previous versions of Ubuntu, I noticed that the netboot installer is no longer actively supported. I would like to know what the "official" way is now to get a Xubuntu 20.04 minimal installation in a virtual machine (since Xubuntu is the only official flavor without a "minimal installation" option in its installer). I am aware of the following options with their respective shortcomings:

  • The Xubuntu Core description on the Xubuntu Website still refers to the mini.iso which is not officially supported for >18.04. There is a mini.iso for 20.04 as described in this post, albeit not officially supported anymore. It could disappear any moment or be discontinued completely for future versions >20.04. For now, this image allows me to install a minimal version of Xubuntu.

  • The Xubuntu Core image cannot be installed as the installer crashes (I tried this multiple times since the release and with different versions of VirtualBox): Installer crash

  • Installing the xubuntu-core package via apt on Ubuntu live server, which is listed as the recommended replacement for the mini.iso, yields >4 GB of used disk space and thus seems to differ significantly from the minimal installation performed by the 20.04 mini.iso as well as the 18.04 mini.iso.

  • Ubuntu Core is not an option for me as it requires creating and linking it to a user account. I have not tried it so far because of this restriction. I would just like to install Xubuntu in a VM and use it offline.

  • Ubuntu Base is too minimal and requires a very high number of preparatory steps. I would just like to install Xubuntu.

Given these options, is there anything that I missed which would give me a Xubuntu 20.04 minimal installation in a way that is officially supported and will likely be supported in future versions?

  • Shame the answer didn't work for you, hoped for an easy solution for you. Two other, notr great, workaround options are, install the full desktop and then manually remove the packages you don't want (could take some time) or install the standard Ubuntu in minimal mode and add xfce to that with sudo apt install tasksel then sudo tasksel install xubuntu-core this may have unforeseen consequences though. Here is a detailed tutorial https://linuxconfig.org/install-xfce-xubuntu-desktop-on-ubuntu-20-04-focal-fossa-linux – Mark Kirby Nov 06 '20 at 11:20
  • @MarkKirby: What do you mean by "unforseen consequences"? – Andreas Unterweger Nov 06 '20 at 11:41
  • Having multiple desktops on the same user can cause all kinds of issues, I can't say what issues could arise, it could also be fine. – Mark Kirby Nov 06 '20 at 11:47
  • Since I do not need multiple desktops I would prefer a solution which does not have potential side effects. – Andreas Unterweger Nov 06 '20 at 11:51
  • @s1mmel: Your link does not work. How exactly do the daily builds answer my question? – Andreas Unterweger Nov 16 '20 at 07:03
  • I thought that 2GB might cheer you up as it its half of what you are getting. The daily builds are vm ready and can e.g. be used with multipass/kvm and other hypervisors. My guess is, that these will sort of replace the netinstaller? I was looking for a similar thing then you were, also with no luck. The daily build images were the only thing I found. I use them with multipass. – s1mmel Nov 16 '20 at 07:09
  • see https://ubuntu.com/download/server and http://cdimages.ubuntu.com/netboot/focal/ mentions it in the first sentence. – s1mmel Nov 16 '20 at 08:52
  • yours would be this one, I guess? http://cdimage.ubuntu.com/xubuntu/daily-live/current/ – s1mmel Nov 16 '20 at 08:53
  • @s1mmel: Thanks for the links. As outlined in my question above, I already tried the 20.04 live server installation and it still yields >4 GB at the first login after the setup is complete. I cannot see any differences between the 20.04 and 21.04 live server installation. Am I missing something? – Andreas Unterweger Nov 16 '20 at 11:41
  • I'm working on a project of my own, to script Ubuntu Base autoinstall. Well, 95% auto.. Goes roughly like this.. boot Ubuntu Server, with autoinstall, in early commands run bunch of commands to setup Ubuntu Base on sda (95% auto is cos of 3 commands I have to enter manually in chroot, can be done by running just one script though), and once you exit chroot it will reboot and hopefully enter Ubuntu Base where you can just run install of xubuntu-core. I'm mostly done, but it's getting late, and I'm stuck with broken grub. Otherwise I think I'm mostly done. Let me know if such setup interests you – LuxZg Nov 16 '20 at 22:45
  • I use multipass and an ubuntu server image and then configure it at install time with a cloud-init.yaml script. You could try that. If you use something else as hypervisor you might have a chance to convert it, so you can use it there. – s1mmel Nov 16 '20 at 23:26
  • @LuxZg: This sounds promising. If you have it ready, feel free to post a full reply. – Andreas Unterweger Nov 17 '20 at 07:29
  • @s1mmel: I did not know of multipass and it looks definitely interesting. However, it seems to be designed to give you a command line and graphical setups seem to be very complicated. I need a full Xubuntu Minimal installation, including the graphical user interface. – Andreas Unterweger Nov 17 '20 at 07:34
  • 1
    @Andreas - I'll try to have something for you today, but it all depends if more issues pop-up. Hope you're not in a hurry, I'd prefer a proper answer, so others can benefit too. Half my research is based on 2 semi-answers that were full of mistakes, so wouldn't like to provide another partial solution ;) – LuxZg Nov 17 '20 at 13:08
  • Sorry, still having trouble with whole mbr/bootloader stuff, now I am trying to switch to syslinux. Anyway, I currently have 80MB boot, 662MB root, and apt-get install xubuntu-core says 1803MB would be used. So roughly 2,5GB size. As soon as I manage to boot it properly :-/ Syslinux now loads but can't load it's ldlinux.c32 dependency despite it being in same dir which is weird.. and it's getting late in the day again :( – LuxZg Nov 17 '20 at 20:30
  • 1AM ... got it to boot, but boy is this minimal... I added nano and ping alright. I don't have patience to wait for 2GB xubuntu install (download actually). Maybe that will fix it being unusable. Will try tomorrow. Basically, you fill your autoinstall's user-data early-commands section with 20 commands, and after reboot you have a 700MB Ubuntu Base. If you add apt install xubuntu-core to those early commands, it will pull everything. But like I said, it's 2GB, my net is slow today, and it's 1AM, so we'll see tomorrow. OS boots, that's what was most annoying. Rest should be ok – LuxZg Nov 17 '20 at 23:48
  • Good news! Finally done and posted. See if it's good for your situation. Keep in mind that after all the tinkering, I have a feeling just installing server in normal way + xubuntu-core will be way easier :) But if you need it mostly automized and you do it ofter, maybe even mutiple times a day, then this is good. Install on my test setup took about 10 minutes (without installing xubuntu-core package, 2GB, slow net, etc). It will mostly depend on your network and disk speed anyway. – LuxZg Nov 18 '20 at 12:00

2 Answers2

5

Using Ubuntu Base with Live auto installer (subiquity) to get minimal Ubuntu/Xubuntu system

Below is an autoinstall template file with which you can auto-install Ubuntu Base 20.10 (and newer) and get relatively minimal installation of Xubuntu from it. As a requirement, you need to have rest of PXE installation environment setup already (see below link for step by step guide). PXE environment is composed of: DHCP service, TFTP server, HTTP(S) server, and optional NFS server. When combined, these offer PXE boot ability for devices in your network. Device itself also needs to support boot from network (either legacy BIOS or UEFI).

I did all my testing using PXE boot, Ubuntu 20.04.1 & 20.10, and autoinstall files (see below, for 20.10). To get details about setting up PXE step by step for 20.04 and newer please read my other guide here: https://askubuntu.com/a/1292097/1080682

Notes: commands listed bellow can also be executed in other ways, eg. manually inside Live-CD or any other live boot session, I've also done it with PXE booting to installer (subiquity) and then doing it over SSH inside subiquity live session. Please make sure that booted session/installer is of same major release as Ubuntu Base you plan to install, eg. Live-CD of Ubuntu 20.10 for creating Ubuntu Base 20.10

Autoinstall script is served via PXE as "user-data" file.

user-data

#cloud-config

autoinstall: version: 1 early-commands: - dd if=/dev/zero of=/dev/sda bs=8M count=30 - (echo o; echo n; echo p; echo 1; echo ""; echo +200M; echo n; echo p; echo 2; echo ''; echo ''; echo a; echo 1; echo p; echo w) | fdisk /dev/sda - mkfs.fat -F 32 -D 0x80 -M 0xF8 -n BOOT /dev/sda1 - mkfs.ext4 -F /dev/sda2 - mkdir /mnt/boot /mnt/root - mount /dev/sda2 /mnt/root - curl http://cdimage.ubuntu.com/ubuntu-base/releases/20.10/release/ubuntu-base-20.10-base-amd64.tar.gz -o /ubuntu-base-20.10-base-amd64.tar.gz - tar -xzvf /ubuntu-base-20.10-base-amd64.tar.gz -C /mnt/root - touch /mnt/root/etc/resolv.conf - echo "nameserver 8.8.8.8" > /mnt/root/etc/resolv.conf - chroot /mnt/root sh -c "apt-get update" - chroot /mnt/root sh -c "apt-get install -y linux-image-5.8.0-28-generic initramfs-tools init dbus iproute2 sudo nano --no-install-recommends" - chroot /mnt/root sh -c "useradd -m ubuntu -s '/bin/bash' && echo ubuntu:ubuntu | chpasswd" - chroot /mnt/root sh -c "addgroup ubuntu adm" - chroot /mnt/root sh -c "addgroup ubuntu sudo" - apt-get update - apt-get install -y syslinux - syslinux -i /dev/sda1 - dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda bs=440 count=1 conv=notrunc - mount /dev/sda1 /mnt/boot - touch /mnt/boot/syslinux.cfg - (echo PROMPT 0; echo DEFAULT base; echo LABEL base; echo KERNEL vmlinuz; echo APPEND root=/dev/sda2 rw; echo INITRD initrd.img) > /mnt/boot/syslinux.cfg - cp /mnt/root/boot/vmlinuz /mnt/boot - cp /mnt/root/boot/initrd.img /mnt/boot - touch /mnt/root/etc/systemd/network/00-wired.network - (echo [Match]; echo Name=enp0s10f0; echo [Network]; echo Address=10.10.2.101/24; echo Gateway=10.10.2.99; echo DNS=8.8.8.8) > /mnt/root/etc/systemd/network/00-wired.network - chroot /mnt/root sh -c "systemctl enable systemd-networkd.service" - chroot /mnt/root sh -c "apt-get clean" - umount /mnt/boot - umount /mnt/root - reboot

Above script is just pure script for BIOS / legacy boot, and it should work fine as-is, copy/paste.

To add UEFI capabilities, insert the following lines after apt-get clean and before umount & reboot commands.

    - mkdir -p /mnt/boot/EFI/BOOT/
    - cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /mnt/boot/EFI/BOOT/BOOTX64.EFI
    - cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /mnt/boot/EFI/BOOT/
    - cp /mnt/boot/syslinux.cfg /mnt/boot/EFI/BOOT/syslinux.cfg
    - cp /mnt/root/boot/vmlinuz /mnt/boot/EFI/BOOT/
    - cp /mnt/root/boot/initrd.img /mnt/boot/EFI/BOOT/

Lines to be aware of, which may need changes:

  • useradd and addgroup - change to your own username and password, or leave it for ubuntu/ubuntu
  • /etc/systemd/network/00-*.network - feel free to change the config file name, and make sure to change interface name (in my case enp0s10f0), IP (10.10.2.101/24) and gateway (10.10.2.99) to something that you actually expect
  • if you also install DHCP client package (isc-dhcp-client) you can use something like echo [Match]; echo Name=eth0; echo [Network]; echo DHCP=yes (just check interface name)
  • you can also leave script completely as is, and change both user/password or networking after reboot

Once you run the script through automated installer, it will install Ubuntu Base and reboot. After reboot login with user ubuntu password ubuntu (or your own, if you changed it). Note that I am NOT running installation of xubuntu-core, please see comments in script below, as well as comments under the answer.

More info with details

To explain the process I'm also pasting the script with all comments, for others that want to get more details, understand the process, and expand on it to change it to your liking.

user-data (with comments)

#cloud-config

autoinstall: version: 1 early-commands:

delete any old partition data, up to 240MB size, if this was reinstall

erases partition tables and whole boot partition as well, by erasing 30x8MB=240MB (partition is 200MB)

- dd if=/dev/zero of=/dev/sda bs=8M count=30

create new 200MB boot partition and rest as root partition

- (echo o; echo n; echo p; echo 1; echo ""; echo +200M; echo n; echo p; echo 2; echo ''; echo ''; echo a; echo 1; echo p; echo w) | fdisk /dev/sda

format boot as FAT 32

- mkfs.fat -F 32 -D 0x80 -M 0xF8 -n BOOT /dev/sda1

format rest as ext4

- mkfs.ext4 -F /dev/sda2

create mount points for boot and root

- mkdir /mnt/boot /mnt/root

don't mount boot yet, as later syslinux requires it unmounted, or mount it here and unmount before syslinux -i

- mount /dev/sda1 /mnt/boot

- mount /dev/sda2 /mnt/root

optional commands to see what's mounted, note if you did not mount it, don't ls it because subiquity installer will fail

- df -h

- ls -al /mnt

- ls -al /mnt/boot

- ls -al /mnt/root

download ubuntu Base from official repo, we download 20.10 below, this will download to / (root) of ubiquity installer, which means - into memory

if you want 20.04 or 20.10 or anything else (future releases) just change following these two lines (curl and tar) to reflect that, plus later in script change kernel version

- curl http://cdimage.ubuntu.com/ubuntu-base/releases/20.10/release/ubuntu-base-20.10-base-amd64.tar.gz -o /ubuntu-base-20.10-base-amd64.tar.gz

extract all files to our sda2, mounted at /mnt/root

- tar -xzvf /ubuntu-base-20.10-base-amd64.tar.gz -C /mnt/root

create temporary resolv.conf in the new system

- touch /mnt/root/etc/resolv.conf
- echo "nameserver 8.8.8.8" > /mnt/root/etc/resolv.conf

chroot to /mnt/root and start executing commands one by one

update apt's package cache

- chroot /mnt/root sh -c "apt-get update"

install Linux image, which will install kernel and create initrd and all

you need to install specific version depending on OS, eg 20.04 will use linux-image-5.4.0-42-generic

we also install: init, dbus, iproute2, sudo, which also pull systemd - to have actually usable system

additionally install nano to be able to edit confs, you can change that to any other editor

- chroot /mnt/root sh -c "apt-get install -y linux-image-5.8.0-28-generic initramfs-tools init dbus iproute2 sudo nano --no-install-recommends"

I personally always install openssh-server as well, ping for debugging

and you may also want to add isc-dhcp-client package to enable networking setup by DHCP server

- chroot /mnt/root sh -c "apt-get install -y openssh-server isc-dhcp-client iputils-ping --no-install-recommends"

add at least one user, here we add user ubuntu with password ubuntu, change it here or later after first login

- chroot /mnt/root sh -c "useradd -m ubuntu -s '/bin/bash' && echo ubuntu:ubuntu | chpasswd"

add this new user to correct groups to enable it to be admin and to have sudo access

- chroot /mnt/root sh -c "addgroup ubuntu adm"
- chroot /mnt/root sh -c "addgroup ubuntu sudo"

this would installs Xubuntu ... or switch to whatever you need... if you install some other package or desktop environment - it will be there after your login

but it is quite large (2GB) so if ANY package fails or throws ANY error - whole subiquity installer crashes; so I recommend this to be done on first interactive login after reboot

- chroot /mnt/root sh -c "apt-get install -y xubuntu-core"

below is syslinux install the easy way, through Ubuntu's official package/repo

get the syslinux package, note this is not in chroot, this installs just to subiquity memory, so we need to run apt update again

- apt-get update
- apt-get install -y syslinux

tell syslinux to install itself to your sda1 which is your boot partition

if you mounted it earlier, unmount boot!! use command below (which is commented out by default)

- umount /mnt/boot

- syslinux -i /dev/sda1

now that syslinux is installed, burn it's mbr.bin (or maybe gptmbr.bin if you plan to use GPT + UEFI) to start of your disk; note we target whole device "sda" - NOT sda1

- dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda bs=440 count=1 conv=notrunc

now we can safely mount boot partition

- mount /dev/sda1 /mnt/boot

we create syslinux.cfg, I do touch, as if it doesn't exist it will break subiquity again

- touch /mnt/boot/syslinux.cfg

echo your config to it; explaining

PROMPT 0 - don't ask use default / 1 - ask for user input (good for diag); DEFAULT - set which label is default so syslinux can autoboot; LABEL - this is config for our Ubuntu Base OS; KERNEL - vmlinuz or eqivalent kernel name; APPEND - to mount your /root partiton as writeable; INITRD - name of your initrd image

- (echo PROMPT 0; echo DEFAULT base; echo LABEL base; echo KERNEL vmlinuz; echo APPEND root=/dev/sda2 rw; echo INITRD initrd.img) > /mnt/boot/syslinux.cfg

copy vmlinuz & initrd files that you've installed in your chroot, you can specify exact version, just make sure to change syslinux.cfg echo (above) accordingly

can also copy * to copy all, but all we need is these ones really

- cp /mnt/root/boot/vmlinuz /mnt/boot
- cp /mnt/root/boot/initrd.img /mnt/boot

setup EFI boot, you can keep both BIOS and UEFI bootloaders at the same time

install additional package

- apt-get install -y syslinux-efi

create directories, will create both BOOT and parent EFI folders

- mkdir -p /mnt/boot/EFI/BOOT/

copy all files, in order: UEFI bootloader, bootloader's module (required), syslinux config (same as above), kernel and initrd (same as above)

- cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /mnt/boot/EFI/BOOT/BOOTX64.EFI
- cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /mnt/boot/EFI/BOOT/
- cp /mnt/boot/syslinux.cfg /mnt/boot/EFI/BOOT/syslinux.cfg
- cp /mnt/root/boot/vmlinuz /mnt/boot/EFI/BOOT/
- cp /mnt/root/boot/initrd.img /mnt/boot/EFI/BOOT/

now we create network config, make sure to change: interface name, IP, gateway

- touch /mnt/root/etc/systemd/network/00-wired.network
- (echo [Match]; echo Name=enp0s10f0; echo [Network]; echo Address=10.10.2.101/24; echo Gateway=10.10.2.99; echo DNS=8.8.8.8) > /mnt/root/etc/systemd/network/00-wired.network

and enable networkd service so it runs on first boot already

- chroot /mnt/root sh -c "systemctl enable systemd-networkd.service"

this is optional, but cleans 100+MB from our chroot partition

- chroot /mnt/root sh -c "apt-get clean"

and finally, I leave this uncommented sometimes, to allow me to do anything in interactive bash shell before final reboot (or to just pause and wait for you if you took coffee and don't want your system to reboot unattended)

- bash -c "exec bash"

unmount partitions

- umount /mnt/boot
- umount /mnt/root

and reboot!

- reboot

after reboot login with your user (ubuntu/ubuntu in this script) and complete installation and/or configuration

you can also connect using ssh to this machine, sudo, and install or configure whatever you wish! Congrats!

The script with comments can also be used as-is, copy/paste. As before, please check your user/password, and network (interface name, IP, gateway, etc.) Again, it will NOT install Xubuntu, I have that commented out.

This will boot to bit under 400MB / (root) partition (plus small partition for boot, it's set to 200MB but can be smaller, about 58MB is needed for both BIOS+EFI files). Adding Xubuntu Core requires about 1.8GB (so says apt). After xubuntu-core is installed partition usage grows to 2.4GB, and after apt clean goes down to 1.9GB, so it is more like 1.5GB of extras on top of Ubuntu Base.

Please let me know if you encounter any issues to fix the instructions for everyone.

This was all tested with Ubuntu 20.04.1 (PXE server, Live Install ISO image, and Base image), as well as with 20.10 "client", and should be same or similar for any future release, as long as you change the file names where needed (eg. in curl & tar commands, and where apt installs linux image). Rest should be indentical, until Canonical changes something.

Test environment (both PXE server and services, and test client) were done on Hyper-V VMs.

Note: This was initially for legacy BIOS installs, I have added UEFI support now. Changes are minor for UEFI, syslinux installation was expanded.

Documentation:

Ubuntu Base wiki (outdated)

Ubuntu Base repository

Ubuntu Base Installation Example Guide (heavily outdated, GUI tools)

Edit - 2020-11-22: Modified script for Ubuntu 20.10. If you view revision history, earlier script was for 20.04.1, but I also did some tweaks in meantime, so please compare them to see changes.

Edit - 2020-12-06: Modified script, made it simpler and more straightforward, with better networking, and added EFI bootloader support. I did not write new script for 20.04 but literally only lines with curl, tar and apt-get install of linux-image-x.x.x-xx-generic would need to change, you can check revisions of this answer, and very first version has paths and names for 20.04.1 Ubuntu Base and it's kernel.

LuxZg
  • 547
  • Thank you for your effort. I will try this. Unfortunately, the bounty already expired before you have posted your answer. If it works, I will mark it as the answer for my question. – Andreas Unterweger Nov 18 '20 at 13:29
  • 1
    It's ok, I was working on something similar for my own use already, I just tweaked it a bit for posting. Do let know if it worked fine, I'm gonna continue the work and tweaking, so any feedback is welcome (constructive criticism is welcomed here!) Good luck! – LuxZg Nov 18 '20 at 13:41
  • @AndreasUnterweger - I need to warn you, as I did try this afternoon... Xubuntu is "huge" package by most package measures. And if any package throws an error, apt will exit with error code which is not 0 (zero). Subiquity is extremely sensitive, and will exit as soon as this happens. Probably cos of my connection some random package threw an error after like 1h of downloading and installing. And boom - finished. And then you have to restart from zero. Due to this, I recommend you to install xubuntu-core on your first interactive login (after reboot). Base install lasts 10min, then do xubuntu – LuxZg Nov 18 '20 at 19:00
  • Xubuntu finally installed (in interactive login after first boot). Logged in fine, looks fine, 2.6GB on sda2. Now I can start playing with openbox based minimal GUI :) – LuxZg Nov 18 '20 at 19:41
  • @AndreasUnterweger - I have updated my answer with tweaks and 20.10. I added some things, removed others... should work nicer now. If anyone wants to see previous 20.04 version, see revision history – LuxZg Nov 22 '20 at 19:22
  • 1
    Thanks for your effort. If you could add a bit more details for the prerequisites ("you need to have rest of installation environment setup already"), I will be happy to accept this as an answer. It will help others who find this post to get a fresh VM going. – Andreas Unterweger Nov 23 '20 at 08:47
  • Sure. I expanded the requirements paragraph a bit. And rest of steps and details is covered by To get details about setting up PXE step by step for 20.04 and newer please read my other guide here: https://askubuntu.com/a/1292097/1080682. – LuxZg Nov 23 '20 at 15:23
  • 1
    @AndreasUnterweger I've made a large script rewrite and updated my answer with it. I did networking the "right way" this time, removed a lot of packages (skipping even ubuntu-minimal), added EFI booting, added apt cleanup at the end, and in process lowered initial install to under 400MB (was ~850MB in earlier versions). Also added bunch of new comments, notes and warnings. With this setup, Xubuntu Core is booting to about 1.9GB (after apt cleanup). I believe this will be my last edit and comment, unless someone finds a bug or a way to improve on the answer meaningfully. Cheers! – LuxZg Dec 06 '20 at 15:29
  • Can someone tell me why this has become so incredibly complicated? It used to be just downloading a small ISO and things were all set. Now the user needs to go through hoops and bounds to get an actually worse result. – rbaleksandar Jul 19 '21 at 11:37
-1

You're right. Xubuntu Core fails to install on VirtulaBox 6.1

At this point, the only option is to be online, create a User ID & then take the machine offline.

Please visit https://core.docs.ubuntu.com/en/guides/manage-devices/ to install Xubuntu Core, in case you want to tweak around this req & create a fresh ISO...