====== Build a Linux audio system ====== A minimal, basic and KISS manual on how to build a Linux audio system. This manual comprises installation and configuration of a Linux audio system based on Debian 12 with a XFCE desktop environment. ===== Hardware ===== This manual assumes you're on a X86_64 platform. Any notebook or desktop computer using this platform should work but bear in mind that the more powerful your computer, the better it will run a Linux audio system. Linux audio applications and plugins can be very resource intensive so the more CPU and memory, the better. Using an Solid State Drive (SSD) as the main hard drive is also recommended. When using an USB audio interface make sure you're using a quality USB cable in working order and that the USB interface is attached to a USB port with as little other peripherals or other devices connected to it as possible. This can be checked with the ''lsusb'' command. ''lsusb'' indicates bus numbers and devices so it's a matter of figuring out which physical USB port is attached to which bus and then picking the port connected to a bus that has as little other devices attached to it. ''lsubutils'' is part of the usbutils packae. An example of a quality USB cable: https://shop.klotz-ais.com/usb-ab.html ===== Operating system ===== {{https://www.debian.org/Pics/debian-logo-1024x576.png?200 }} This manual starts from a standard Debian 12 "Bookworm" installation with XFCE installed from a live install image. ==== Download the operating system ==== Download the Debian 12 live ISO here: https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-12.2.0-amd64-xfce.iso And transfer it to a USB flash drive with enough space. Bear in mind this operation will erase any data that is currently on the drive. sudo dd if= of= bs=16M status=progress oflag=sync Where '''' is the path to the downloaded ISO file and '''' is the device name of the USB flash drive. Make sure you get the device name right otherwise you might risk overwriting the wrong drive. You can list your drives/device names with ''fdisk -l''. More information can be found here: https://www.debian.org/CD/faq/#write-usb When the copy process is finished you can try booting your computer with the USB flash drive. ==== Install the operating system ==== Once booted from the USB flash drive select "Live System (amd64)" from the boot menu. This will boot your computer into a live Debian environment. This way you can verify if your system can run Debian 12 properly. Now you can click the "Install Debian" icon and select "Launch anyway" when asked. This will start the installation process. Go through all the steps as you see fit. Some tips: * Modern systems with enough memory (>= 16GB) can live without swap * The default filesystem Ext4 is fine for audio work Once the installation is finished reboot your computer into the freshly installed OS and update the system: sudo apt update && sudo apt dist-upgrade ===== Configuration ===== ==== Recommended packages ==== Install the following packages from the default Debian repositories: * rtirq-init * a2jmidid They can be installed in one go: sudo apt install rtirq-init a2jmidid Select "Yes" during the installation of jackd2 when asked to enable real time process priority. ==== Boot settings ==== Boot settings are taken care of in different locations, ''/etc/default/grub'' for the boot loader which allows to set kernel options for kernel parts that are compiled into the kernel and ''/etc/modprobe.d/'' to set kernel module options for kernel parts that get loaded when needed, i.e. when you plug in an USB audio interface after having booted your system. :!: Warning: Using ''mitigations=off'' will make your machine less secure! Use with caution! For more information on the risks see https://meltdownattack.com/ For ''/etc/default/grub'' add the following options to the line that starts with ''GRUB_CMDLINE_LINUX'': mitigations=off usbcore.autosuspend=-1 threadirqs You can do this with an editor as root, so with ''sudo vi'' or ''sudo nano'' in a terminal session. Make sure the line looks like this now: GRUB_CMDLINE_LINUX="mitigations=off usbcore.autosuspend=-1 threadirqs" And update the Grub configuration with ''sudo update-grub''. To activate these Grub settings you will have to reboot your machine. For an explanation of the above options, see [[wiki:system_configuration|]]. ''usbcore.autosuspend=-1'' only applies if you're working with an USB audio interface. This option makes sure your USB device will never be put in a sleep state. For ''/etc/modprobe.d/'' it's a matter of personal preferences i.e. whether you'd want to load USB devices in a certain order or if you'd like to block certain drivers from loading. An example configuration file could look as follows: # Onboard audio options snd-hda-intel index=10 vid=0x8086 pid=0x1e20 # RME Babyface options snd-usb-audio index=0 vid=0x0424 pid=0x3fb7 # Arturia BeatStep Pro options snd-usb-audio index=1 vid=0x1c75 pid=0x0287 # Behringer BCR2000 options snd-usb-audio index=2 vid=0x1397 pid=0x00bc # Edirol UA-25 options snd-usb-audio index=3 vid=0x0582 pid=0x0074 # Akai MPK Mini options snd-usb-audio index=5 vid=0x09e8 pid=0x007c # Prevent Bluetooth modules from loading blacklist bnep blacklist bluetooth blacklist btusb # Prevent nouveau driver from loading blacklist nouveau options nouveau modeset=0 If you'd like to make use of kernel module options you can create a file like ''/etc/modprobe.d/audio.conf'' and add your settings there. These will be picked up during boot time. What the above file does is configuring specific index numbers for different USB devices which ensures a consistent listing of these devices in audio software and prevent certain drivers from loading. ==== User settings ==== Add your user to the audio group. sudo usermod -a -G audio youruser newgrp audio ==== Power management ==== Allow the audio group to set CPU DMA latency. curl -s https://raw.githubusercontent.com/Ardour/ardour/master/tools/udev/99-cpu-dma-latency.rules | sudo tee /etc/udev/rules.d/99-cpu-dma-latency.rules sudo udevadm control --reload-rules sudo udevadm trigger For more info: * https://manual.ardour.org/preferences-and-session-properties/preferences-dialog/#preferences-performance * https://discourse.ardour.org/t/ardour-scheduling-udev-rule-thingie/107230/12 ==== System settings ==== The easiest option to finish up setting your system when starting it up is with a script in ''/usr/local/sbin'' that you call as a service through systemd. Name the script something like ''rt-audio-setup'' and make sure it contains at least the following lines: # Disable CPU frequency scaling systemctl mask ondemand echo -n performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor Create a corresponding systemd service unit file in ''/etc/systemd/system/rt-audio-setup.service'' with the following lines: [Unit] Description=Prepare system for real-time audio [Service] Type=oneshot ExecStart=/usr/local/sbin/rt-audio-setup [Install] WantedBy=multi-user.target And enable and start it: sudo systemctl enable --now rt-audio-setup The script could be extended to configure other settings like disabling hyper threading or unloading unneeded kernel modules when desired. ==== IRQ settings ==== Because of the ''threadirqs'' kernel option it is now possible to prioritize specific IRQ's. Especially USB audio interfaces can benefit from this, having such an interface connected to a port with a prioritized IRQ can reduce crackling and popping caused by xruns. Configuration for these settings is done in ''/etc/default/rtirq''. A generic example could look like this: # IRQ thread service names # (space separated list, from higher to lower priority). RTIRQ_NAME_LIST="xhci ehci snd" # Highest priority. RTIRQ_PRIO_HIGH=90 # Priority decrease step. RTIRQ_PRIO_DECR=5 # Lowest priority. RTIRQ_PRIO_LOW=51 # Whether to reset all IRQ threads to SCHED_OTHER. RTIRQ_RESET_ALL=0 After having adjusted these settings restart ''rtirq'' with ''sudo systemctl restart rtirq''. You can check the current IRQ priorities with ''sudo /etc/init.d/rtirq-init status''. ==== Optional parts ==== === Liquorix kernel === {{https://upload.wikimedia.org/wikipedia/commons/8/85/Liquorice_wheels.jpg?200 |Photo by Pikaluk from UK - Flickr, CC BY 2.0}}The Liquorix project provides a kernel flavor that works well for low latency audio. Download the installer: curl -s -O "https://liquorix.net/install-liquorix.sh" Inspect it if you wish so and when having verified that the script is safe you can run it: sudo bash /path/to/install-liquorix.sh This will install the latest Liquorix kernel available. Reboot to start your system with the Liquorix kernel. ===== Wrapping it up ===== Your system should now be properly configured to be used as a Linux audio system. You can now install your favorite applications and/or plugins. You can of course go further by trying out a real-time kernel, tweaking your filesystem settings or reducing swap usage but in practice the differences will probably be minute. To check if the most important conditions for a well working Linux audio system are met you could run the rtcqs script, see [[wiki:system_configuration#rtcqs]]. ===== Support ===== Got questions? You can always ask at https://linuxmusicians.com/