User:Wizetek
Medium creation
Different methods:
cp
$ cp archlinux.iso /dev/sdX
cat
$ cat archlinux.iso > /dev/sdX
redirection with sudo to avoid 'Permission denied'
$ cat archlinux.iso | sudo tee /dev/sdX > /dev/null
pv
$ pv archlinux.iso > /dev/sdX
tee: include < or the input file gets zeroed out!
$ tee < archlinux.iso > /dev/sdX
tail
$ tail -c +1 archlinux.iso > /dev/sdX
dd
$ dd if=archlinux.iso of=/dev/sdX bs=4M conv=fsync oflag=direct status=progress
Monitor with 'progress' or 'pv'
$ progress -m
$ pv -d $(pidof cp)
Installation
(as of 2020.03)
$ timedatectl set-ntp true $ fdisk /dev/sda $ mkfs.ext4 /dev/sda1 $ mkswap /dev/sda2 $ swapon /dev/sda2 $ mount /dev/sda1 /mnt $ vim /etc/pacman.d/mirrorlist $ pacstrap /mnt base linux linux-firmware $ genfstab -U /mnt >> /mnt/etc/fstab $ arch-chroot /mnt $ pacman -S grub vim man networkmanager $ ln -sf /usr/share/zoneinfo/America/Toronto /etc/localtime $ hwclock --systohc $ vim /etc/locale.gen ... #en_BW ISO-8859-1 en_CA.UTF-8 UTF-8 #en_CA ISO-8859-1 en_GB.UTF-8 UTF-8 ... $ locale-gen $ vim /etc/locale.conf LANG="en_CA.UTF-8" LC_TIME="en_GB.UTF-8" $ hostnamectl set-hostname myhostname $ vim /etc/hosts 127.0.0.1 localhost ::1 localhost 127.0.1.1 myhostname.localdomain myhostname $ mkinitcpio --allpresets $ grub-install --target=i386-pc /dev/sda $ grub-mkconfig -o /boot/grub/grub.cfg $ passwd $ exit $ umount /mnt
Eject installation medium. Reboot. Log in.
Configuration
Enable network
via NetworkManager:
$ systemctl --now enable NetworkManager.service
via systemd-networkd:
$ networkctl list
(DHCP)
$ vim /etc/systemd/network/20-wired.network [Match] Name=ens3 [Network] DHCP=ipv4
(static IP)
$ vim /etc/systemd/network/20-wired.network [Match] Name=enp1s0 [Network] Address=192.168.1.2/24 Gateway=192.168.1.1 DNS=192.168.1.1
$ systemctl --now enable systemd-networkd.service $ systemctl --now enable systemd-resolved.service $ networkctl status
NTP via systemd-timesyncd
$ timedatectl set-ntp true
or
$ systemctl --now enable systemd-timesyncd.service
Swap file
$ dd of=/swapfile if=/dev/zero bs=1G count=4 or $ fallocate -l 4G /swapfile
$ chmod 600 /swapfile
$ mkswap /swapfile or (also set label) $ mkswap -L linux_swap /swapfile or (unset UUID too) $ mkswap -U clear -L linux_swap /swapfile
$ vim /etc/fstab /swapfile none swap defaults 0 0
$ swapon /swapfile or (activate all in /fstab) $ swapon -a
Check:
$ swapon
zram swap
Install:
$ pacman -S zram-generator
Configure:
$ vim /etc/systemd/zram-generator.conf [zram0] zram-size = ram / 2 #zram-size = ram / 1.5 #zram-size = ram / 4096 #zram-size = min(ram / 2, 4096) compression-algorithm = zstd swap-priority = 100 fs-type = swap
Activate:
$ systemctl daemon-reload $ systemctl start systemd-zram-setup@zram0.service
Check:
$ swapon
SSD optimizations: TRIM and swappiness
$ systemctl --now enable fstrim.timer
file_prio (default=200) minus vm.swappiness equals anon_prio
i.e. 200 - 100 = 100 [link]
Set immediately:
$ sysctl -w vm.swappiness=100
Set on boot:
$ vim /etc/sysctl.d/99-swappiness.conf vm.swappiness=100
CPU microcode updates
$ pacman -S intel-ucode or $ pacman -S amd-ucode
$ grub-mkconfig -o /boot/grub/grub.cfg $ reboot
CFS ZEN tweaks
Set scheduler (CFS) to use settings like the linux-zen kernel rather than the defaults which are tweaked for high throughput.
$ paru -S cfs-zen-tweaks $ systemctl daemon-reload $ systemctl enable --now set-cfs-tweaks.service
tty display power saving
$ vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="consoleblank=600"
$ grub-mkconfig -o /boot/grub/grub.cfg $ reboot
Hardware monitoring
$ pacman -S lm_sensors $ sensors-detect $ sensors
Vim configuration
~/.vimrc " Comments start like this, not with # source $VIMRUNTIME/defaults.vim set background=dark "colorscheme elflord set paste set nowrap "set tabstop=4 "set number "set title set laststatus=2 "set showtabline=2 "set mouse=r set mouse= "set clipboard=unnamedplus
GNU Screen configuration
$ cp /etc/screenrc ~/.screenrc
~/.screenrc # Mouse scroll up/down termcapinfo xterm* ti@:te@ # Fix for residual editor text altscreen on
GNU Readline
~/.inputrc $include /etc/inputrc # for PuTTY (letter O, not zero) "\eOC": forward-word "\eOD": backward-word "\e[A":history-search-backward "\e[B":history-search-forward # Shift+up/down/right/left "\e[1;2A":upcase-word "\e[1;2B":downcase-word "\e[1;2C":copy-forward-word "\e[1;2D":copy-backward-word set show-all-if-ambiguous on set echo-control-characters off # Color files by types # Note that this may cause completion text blink in some terminals (e.g. xterm). set colored-stats on # Append char to indicate type set visible-stats on # Mark symlinked directories set mark-symlinked-directories on # Color the common prefix set colored-completion-prefix on # Color the common prefix in menu-complete set menu-complete-display-prefix on
Add Ctrl+left and Ctrl+right to console keymap
$ vim /usr/local/share/kbd/keymaps/personal.map control keycode 105 = Meta_b control keycode 106 = Meta_f
Load for the current session:
$ loadkeys personal.map
Load on startup:
$ vim /etc/vconsole.conf KEYMAP=/usr/local/share/kbd/keymaps/personal.map
Disable power button
$ vim /etc/systemd/logind.conf HandlePowerKey=ignore
Disable Ctrl-Alt-Delete in console
$ systemctl mask ctrl-alt-del.target
Don't clear console on boot
$ mkdir /etc/systemd/system/getty@.service.d
$ vim /etc/systemd/system/getty@.service.d/dontclear.conf [Service] TTYVTDisallocate=no
$ systemctl daemon-reload
Enable reboot and more (REISUB) via Magic SysRq Key
$ vim /etc/sysctl.d/99-sysrq.conf kernel.sysrq=1
Disable account lockout on authentication failure
$ vim /etc/security/faillock.conf deny = 0
sudo
$ sudo visudo Defaults editor=/usr/bin/vim Defaults passwd_timeout=0 Defaults timestamp_timeout=10 Defaults timestamp_type=global Defaults env_keep += "LANG DISPLAY XAUTHORITY" root ALL=(ALL:ALL) ALL %wheel ALL=(ALL:ALL) ALL @includedir /etc/sudoers.d
$ gpasswd -a myusername wheel
Keep aliases after switching user:
~/.bashrc alias sudo='sudo '
pkexec auth for Xorg applications
$ vim ~/.bashrc alias pkexec="pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY $@"
Polkit only allow local admin shutdown/reboot/sleep
If the polkit
package is not installed, only admin can power cycle the system. Once polkit.service
is active, the systemd
owned org.freedesktop.login1.policy
allows users to control power from tty (but not ssh).
$ grep 'action id' /usr/share/polkit-1/actions/org.freedesktop.login1.policy
Override (DO NOT put #comments in this JavaScript file):
$ vim /etc/polkit-1/rules.d/10-only-admin-shutdown.rules polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.login1.power-off" || action.id == "org.freedesktop.login1.power-off-multiple-sessions" || action.id == "org.freedesktop.login1.power-off-ignore-inhibit" || action.id == "org.freedesktop.login1.reboot" || action.id == "org.freedesktop.login1.reboot-multiple-sessions" || action.id == "org.freedesktop.login1.reboot-ignore-inhibit" || action.id == "org.freedesktop.login1.suspend" || action.id == "org.freedesktop.login1.suspend-multiple-sessions" || action.id == "org.freedesktop.login1.suspend-ignore-inhibit" || action.id == "org.freedesktop.login1.hibernate" || action.id == "org.freedesktop.login1.hibernate-multiple-sessions" || action.id == "org.freedesktop.login1.hibernate-ignore-inhibit" || action.id == "org.freedesktop.login1.set-reboot-parameter" || action.id == "org.freedesktop.login1.set-reboot-to-firmware-setup" || action.id == "org.freedesktop.login1.set-reboot-to-boot-loader-menu" || action.id == "org.freedesktop.login1.set-reboot-to-boot-loader-entry" ) { return polkit.Result.AUTH_ADMIN_KEEP; } });
Edit/remove/replace to remove some restrictions:
$ systemctl restart polkit.service // Allow suspending despite inhibitors if (action.id == "org.freedesktop.login1.suspend" || action.id == "org.freedesktop.login1.suspend-multiple-sessions" || action.id == "org.freedesktop.login1.suspend-ignore-inhibit" ) { return polkit.Result.YES; }
Udev device permissions
$ ls -l /dev/tty1 crw--w---- 1 root tty 4, 2 May 23 22:45 /dev/tty1
Check the default rules:
$ grep -m1 'tty\[' /usr/lib/udev/rules.d/50-udev-default.rules SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"
Custom rules must be processed after the default 50- so name the file 51- or 55- or 99- or similar.
(Bad) example:
$ vim /etc/udev/rules.d/51-udev-custom.rules SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0660"
$ reboot $ ls -l /dev/tty1 crw-rw---- 1 root tty 4, 2 May 23 22:50 /dev/tty1
NOTE: Ownership and permissions will change once login occurs on that tty.
Mount NTFS / SMB / SSHFS / systemd automount
/etc/fstab
/dev/sda2 /mnt/windows ntfs-3g uid=myuser,gid=mygroup,dmask=022,fmask=133 0 0 //192.168.1.1/music /mnt/openwrt cifs _netdev,guest,vers=1.0,uid=myuser,gid=mygroup,dir_mode=0555,file_mode=0444,nounix,iocharset=utf8 0 0 pi@raspberrypi:/ /mnt/pi fuse.sshfs _netdev,reconnect,allow_other,default_permissions,ServerAliveInterval=15,ServerAliveCountMax=3 0 0 root@192.168.1.2:/mnt/sda1 /mnt/openwrt fuse.sshfs noauto,_netdev,x-systemd.automount,x-systemd.mount-timeout=10,IdentityFile=/root/.ssh/id_rsa,allow_other,default_permissions 0 0
$ systemctl daemon-reload $ systemctl restart remote-fs.target
udisksctl mount/unmount (removable) device partition
$ udisksctl status
Mount to /run/media/myusername/mydevicelabel:
$ udisksctl mount -b /dev/sdb1 or $ udisksctl mount -b /dev/disk/by-label/mydevicelabel
Umount:
$ udisksctl unmount -b /dev/sdb1 or $ udisksctl unmount -b /dev/disk/by-label/mydevicelabel
Eject:
$ udisksctl power-off -b /dev/sdb
locate DB and update via a cron job
$ pacman -S mlocate $ updatedb $ locate -S
$ pacman -S cronie
$ vim /etc/cron.daily/update_locate_db /usr/bin/updatedb
$ chmod +x /etc/cron.daily/update_locate_db
$ systemctl enable --now cronie.service
$ pacman -S samba $ wget -O /etc/samba/smb.conf 'https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default'
$ vim /etc/samba/smb.conf log file = /var/log/samba/%m.log workgroup = MYWORKGROUP [homes] comment = Home Directories browseable = no writable = yes
$ smbpasswd -a myuser $ systemctl --now enable smb.service $ systemctl --now enable nmb.service
Xorg re-enable zap
For startx:
$ vim ~/.xinitrc setxkbmap -option terminate:ctrl_alt_bksp &
For X login managers and others:
$ vim /etc/X11/xorg.conf.d/10-zap.conf Section "ServerFlags" Option "DontZap" "false" EndSection Section "InputClass" Identifier "Keyboard Defaults" MatchIsKeyboard "yes" Option "XkbOptions" "terminate:ctrl_alt_bksp" EndSection
Xorg and Xfce desktop
$ pacman -S xorg-server $ pacman -S xf86-video-amdgpu xf86-video-ati xf86-video-intel xf86-video-nouveau xf86-video-vesa $ pacman -S xfce4 xfce4-goodies $ pacman -S pulseaudio pulseaudio-alsa pavucontrol $ pacman -S gvfs-smb ntfs-3g $ pacman -S nm-applet $ pacman -S xdg-user-dirs $ xdg-user-dirs-update $ pacman -S lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings $ pacman -S accountsservice $ cp /path/to/myavatar_96x96.png ~/.face $ systemctl --now enable lightdm.service
Xfce: hide Suspend and Hibernate from the logout dialog
$ xfconf-query -c xfce4-session -np '/shutdown/ShowSuspend' -t bool -s false $ xfconf-query -c xfce4-session -np '/shutdown/ShowHibernate' -t bool -s false
Xfce: disable CSD (Client-Side Decorations)
$ xfconf-query -c xsettings -p /Gtk/DialogsUseHeader -s false
Ly - lightweight TUI display manager for console
$ pacman -S ly
$ vim /etc/ly/config.ini # Doom fire animate = true # Focus on the session input field default_input = 0 # Disable F1 shutdown & F2 reboot restart_cmd = /usr/bin/ly-dm shutdown_cmd = /usr/bin/ly-dm # Switch to tty1 tty = 1
$ systemctl edit ly.service [Service] TTYPath=/dev/tty1
$ systemctl disable getty@tty1.service $ systemctl enable ly.service
Qt apps theme appearance
$ pacman -S qt5ct
$ vim .xinitrc export QT_QPA_PLATFORMTHEME=qt5ct
Fonts
DejaVu is modified Bitstream Vera with more Unicode stuff.
$ pacman -S gnu-free-fonts $ pacman -S ttf-dejavu $ pacman -S ttf-liberation $ pacman -S ttf-ubuntu-font-family
Fixed-width/monospaced font for code:
$ pacman -S ttf-input
$ fc-conflist $ cd /etc/fonts/conf.d $ ln -s /usr/share/fontconfig/conf.default/10-hinting-slight.conf $ ln -s /usr/share/fontconfig/conf.default/10-sub-pixel-rgb.conf $ ln -s /usr/share/fontconfig/conf.default/10-yes-antialias.conf $ ln -s /usr/share/fontconfig/conf.default/11-lcdfilter-default.conf $ ln -s /usr/share/fontconfig/conf.default/51-local.conf $ ln -s /usr/share/fontconfig/conf.avail/70-no-bitmaps.conf
...or experiment for best appearance:
$ ln -s /usr/share/fontconfig/conf.avail/10-hinting-full.conf $ ln -s /usr/share/fontconfig/conf.avail/10-sub-pixel-none.conf
BCI (Byte-Code Interpreter) hinting:
$ vim /etc/profile.d/freetype2.sh #truetype:interpreter-version=35 (classic mode, emulates Windows 98; 2.6 default) #truetype:interpreter-version=36 (classic Windows ClearType style) #truetype:interpreter-version=38 ("Infinality" subpixel mode) truetype:interpreter-version=40 (minimal subpixel mode; 2.7 default)
Font families fallback aliases for consistency across all apps:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <alias> <family>serif</family> <prefer> <family>DejaVu Serif</family> <family>Liberation Serif</family> <family>FreeSerif</family> </prefer> </alias> <alias> <family>sans-serif</family> <prefer> <family>DejaVu Sans</family> <family>Liberation Sans</family> <family>FreeSans</family> </prefer> </alias> <alias> <family>monospace</family> <prefer> <family>DejaVu Sans Mono</family> <family>Liberation Mono</family> <family>FreeMono</family> </prefer> </alias> <alias> <family>Arial</family> <prefer> <family>DejaVu Sans</family> </prefer> </alias> <alias> <family>Courier</family> <prefer> <family>DejaVu Sans Mono</family> </prefer> </alias> <alias> <family>Courier New</family> <prefer> <family>DejaVu Sans Mono</family> </prefer> </alias> <alias> <family>Garamond</family> <prefer> <family>DejaVu Serif</family> </prefer> </alias> <alias> <family>Georgia</family> <prefer> <family>DejaVu Serif</family> </prefer> </alias> <alias> <family>Helvetica</family> <prefer> <family>DejaVu Sans</family> </prefer> </alias> <alias> <family>Lucida Console</family> <prefer> <family>DejaVu Sans Mono</family> </prefer> </alias> <alias> <family>Tahoma</family> <prefer> <family>DejaVu Sans</family> </prefer> </alias> <alias> <family>Times</family> <prefer> <family>DejaVu Serif</family> </prefer> </alias> <alias> <family>Times New Roman</family> <prefer> <family>DejaVu Serif</family> </prefer> </alias> <alias> <family>Trebuchet MS</family> <prefer> <family>DejaVu Sans</family> </prefer> </alias> <!-- Default font (no fc-match pattern) --> <match> <edit mode="append" name="family"> <string>DejaVu Sans</string> </edit> </match> </fontconfig>
Check:
$ fc-match $ fc-match sans $ fc-match serif $ fc-match mono $ fc-match "Times New Roman" $ fc-match -a
Screensaver and lock
Power off display after 600 seconds (10 min).
$ xset dpms 0 0 600
Disable/enable DPMS.
$ xset -dpms $ xset +dpms
Screensaver after 5 minutes, release grab after suspend, lock after 1200 seconds (20 min), display off after 600 seconds (10 min), different saver every 60 seconds, password timeout 5 seconds
$ pacman -S xlockmore xautolock
$ xautolock -time 5 -detectsleep -locker "xlock -lockdelay 1200 -dpmsoff 600 -mode random -duration 60 -erasedelay 0 -echokeys -echokey . -timeout 5"
Disable/enable autolock without terminating process.
$ xautolock -disable $ xautolock -enable
Screensaver without lock
$ xautolock -time 5 -detectsleep -locker "xlock -nolock -mode random -duration 60 -erasedelay 0"
Picture slideshow without lock
$ pacman -S feh $ xautolock -time 5 -detectsleep -locker "feh -z -D 5 -F --zoom=fill -Y -r /usr/share/backgrounds"
Xfce custom command to lock on sleep (read by xflock4
)
$ pacman -S i3lock $ xfconf-query --create -c xfce4-session -p /general/LockCommand -t string -s "i3lock -f -c 202020"
Check Xfce lock command.
$ xfconf-query -c xfce4-session -p /general/LockCommand
Reset Xfce lock command.
$ xfconf-query --reset -c xfce4-session -p /general/LockCommand
systemd unit to lock screen upon system sleep
$ vim /etc/systemd/system/lock-on-sleep@.service [Unit] Description=Lock screen on sleep/suspend Before=sleep.target [Service] Type=simple User=%i Environment="DISPLAY=:0" ExecStart=/usr/local/bin/lock-on-sleep # Wait for lock to prevent briefly showing desktop after resume ExecStartPost=sleep 1 [Install] WantedBy=sleep.target #WantedBy=suspend.target
$ vim /usr/local/bin/lock-on-sleep #!/bin/bash xset dpms 0 0 120 # Release grab from 'xlock -nolock' xautolock -unlocknow #xlock -mode random -duration 60 -erasedelay 0 -echokeys -echokey . -timeout 5 i3lock -n -f -c 202020 -i $(shuf -n 1 -e /usr/local/backgrounds/*.png) xset dpms 0 0 600
$ systemctl enable lock-on-sleep@myusername
Reload systemd after any changes to the unit.
$ systemctl daemon-reload
DPI
Calculate proper DPI for specific hardware at https://www.pxcalc.com/
Example: 27" 2560x1440 display
- DPI: 108.79
- Dot Pitch: 0.2335 mm
- Size: 23.53" × 13.24" (59.77 cm × 33.62 cm)
$ pacman -S xorg-xrandr $ xrandr --dpi 109 $ xdpyinfo | grep dots
Login/Desktop Managers in general:
$ vim /etc/xprofile xrandr --dpi 109
or
$ vim ~/.xprofile xrandr --dpi 109
LightDM specifically:
$ vim /etc/lightdm/lightdm-gtk-greeter.conf xft-dpi = 109
X Server:
$ vim /etc/X11/xinit/xserverrc exec /usr/bin/X -dpi 109 -nolisten tcp "$@"
or
$ vim ~/.xserverrc exec /usr/bin/X -dpi 109 -nolisten tcp "$@"
X Resources (if not set by Desktop Environment):
$ vim ~/.Xresources Xft.dpi: 109 Xft.autohint: 0 Xft.lcdfilter: lcddefault Xft.hintstyle: hintfull Xft.hinting: 1 Xft.antialias: 1 Xft.rgba: rgb
Firefox:
- Default DPI is 96. Change it in
about:config
by setting:
layout.css.devPixelsPerPx = x
...where x = DPI / 96
Example: 27" 2560x1440 display, x = 108.79 / 96 = 1.133229167
- Default DPI is 96. System DPI is only used if system DPI > 96. Force using lower system DPI by setting in
about:config
layout.css.dpi = 0
- Default font scale in
about:config
isfont.size.systemFontScale = 100
- Do not increase
Default zoom
inPreferences
x11vnc
$ pacman -S x11vnc $ x11vnc -storepasswd $ x11vnc -usepw -shared -forever -reopen -nolookup
Drop current client connection when new client connects: -nevershared
Ignore options in rc file: -norc
$ vim ~/.x11vncrc desktop My Desktop rfbport 5900 display :0 usepw shared forever reopen nolookup
Run X apps without real X
$ pacman -S xorg-server-xvfb
Virtual framebuffer X -screen num WxHxD (color depth)
$ Xvfb :1 -screen 0 1x1x8 $ DISPLAY=:1 myxapp
xbindkeys
$ pacman -S xbindkeys $ xbindkeys -d > ~/.xbindkeysrc $ vim ~/.xbindkeysrc # Volume up/down via Super + mouse wheel "pamixer -i 5" Mod2+Mod4 + b:4 "pamixer -d 5" Mod2+Mod4 + b:5 # Volume up/down via Super + Keypad +/- "pamixer -i 5" Mod2+Mod4 + KP_Add "pamixer -d 5" Mod2+Mod4 + KP_Subtract # Toggle mute via Super + Keypad * "pamixer -t" Mod2+Mod4 + KP_Multiply # Set volume to 50% via Super + Keypad / "pamixer --set-volume 50" Mod2+Mod4 + KP_Divide # Toggle Play/Pause in active player via Super + Pause/Break "playerctl play-pause" Mod2+Mod4 + Pause
Identify multi key pressed:
$ xbindkeys -mk
Run in foreground first to check if rc file is valid:
$ xbindkeys -n
Intel hardware video acceleration
$ pacman -S intel-media-driver libva-intel-driver libvdpau-va-gl $ pacman -S libva-utils vdpauinfo
Pro audio
CPU frequency governor
$ pacman -S cpupower
$ cpupower frequency-set -g performance $ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
$ cpupower frequency-info ... hardware limits: 800 MHz - 3.00 GHz ...(max 2.4 with turbo boost to 3.0) $ cpupower frequency-set -d 2.4GHz $ cpupower frequency-set -u 3.0GHz
$ vim /etc/default/cpupower $ systemctl enable cpupower.service
Low-latency kernel
Check:
$ uname -v #1 SMP PREEMPT Wed, 18 May 2022 17:30:11 +0000 x86_64 GNU/Linux
Threaded IRQs non-realtime kernel (optional)
Check:
$ zgrep "CONFIG_IRQ_FORCED_THREADING" /proc/config.gz CONFIG_IRQ_FORCED_THREADING=y
Enable:
$ vim /etc/default/grub ... GRUB_CMDLINE_LINUX_DEFAULT="... ... threadirqs" ...
Realtime priority
$ pacman -S realtime-privileges
$ vim /etc/security/limits.d/99-realtime-privileges.conf @realtime - rtprio 98 @realtime - memlock unlimited @realtime - nice -11
(nice uses SCHED_OTHER so it is not applicable to low-latency real-time audio using SCHED_FIFO / SCHED_RR)
$ gpasswd -a myusername realtime
If not using a login manager, configure PAM too:
$ vim /etc/pam.d/su session required pam_limits.so
Log out, log back in.
Check:
$ ulimit -r $ ulimit -a $ chrt -m
Test:
(should not return: Operation not permitted)
$ chrt -v 90 true
MIDI & JACK
$ pacman -S jack2 python-dbus qjackctl a2jmidid alsa-utils
QjackCtl
- Driver: alsa
- Realtime: ✓ (if using linux-rt)
- MIDI Driver: seq
- Output Device: myoutputdevice
- Enable D-Bus interface: ✓
- Enable JACK D-Bus interface: ✓
(Soon to be replaced by PipeWire)
PipeWire
(soon...)
$ pacman -S pipewire $ pacman -S pipewire-alsa pipewire-pulse pipewire-jack
$ pacman -S helvum $ pacman -S easyeffects
DAW, plugin hosts & softsynths
~/.bashrc
# VST3 in ~/.vst3 # VST/VST2 export VST_PATH=/usr/lib/vst:/usr/local/lib/vst:~/.vst # uncommon, only used by Ardour and Qtractor export LXVST_PATH=/usr/lib/lxvst:/usr/local/lib/lxvst:~/.lxvst # current Linux-only native container export LV2_PATH=/usr/lib/lv2:/usr/local/lib/lv2:~/.lv2 # old precursor to LV2 export LADSPA_PATH=/usr/lib/ladspa:/usr/local/lib/ladspa:~/.ladspa # old LADSPA successor export DSSI_PATH=/usr/lib/dssi:/usr/local/lib/dssi:~/.dssi
$ pacman -Sgq vst-plugins | pacman -Si - $ pacman -Si $(pacman -Sgq lv2-plugins)
- DAW (Digital Audio Workstation)
renoise
reaper
bitwig
tracktion-waveform
qtractor (sequencer with DAW features)
ardour
sunvox
- Host
carla
- VST / VST2 / VST3 / lxvst (.so)
surge
helm-synth
vital
dexed
odin2
zynaddsubfx
obxd [old] [new]
xhip
tunefish4
amsynth
digitsvst-git
tal-plugins
uhe-podolski-vst
uhe-triplecheese-vst
uhe-tyrellN6
- LV2 (.so)
yoshimi
bristol (+ pybristol GUI)
calf (various stuff) [1]
synthv1
padthv1
samplv1
drumkv1
Windows© VST (.dll) plugin bridge
$ pacman -S wine-staging winetricks $ pacman -S yabridge yabridgectl
$ wine vst1_installer.exe $ wine vst2_installer.exe ...
$ yabridgectl sync $ yabridgectl status
$ yabridgectl add /custom/path/to/windows/vst $ yabridgectl list $ yabridgectl sync $ yabridgectl status
http://www.linuxsynths.com/index.html
https://distrho.sourceforge.io/ports.php
pacman
package Groups vs Meta packages
- group name alone is not installed; group members are individual packages being installed explicitly
- meta package is installed explicitly; meta depends are individual packages being installed as dependencies
Sync package database from remote repos and install package(s) along with dependencies:
$ pacman -S ttf-dejavu
Refresh the syncdb and update all packages (-w
only download, don't install):
$ pacman -Syu
Best practice: Run within a terminal multiplexer to avoid interruptions due to X/Wayland/desktop/WM/terminal crashes or other issues
alias Syu="screen -DRq Syu bash -c 'sudo pacman -Syu; bash'"
Ignore updates for specified packages:
(This time only)
$ pacman -Syu --ignore linux
(Every time)
/etc/pacman.conf IgnorePkg = linux linux-headers systemd xorg-server
Update the previously ignored packages:
$ pacman -S linux linux-headers
Update and skip dependency checks (e.g. due to conflicts caused by AUR packages):
$ paru -Sd package1-that-couldnt-be-updated $ pacman -S package2
Don't touch/upgrade certain files during update:
/etc/pacman.conf NoUpgrade = etc/passwd etc/group etc/shadow
Search for a string in the package syncdb (-q
quiet):
$ pacman -Ss ttf font
Show info about a package:
$ pacman -Si kodi
List groups:
$ pacman -Sg
List members of group:
$ pacman -Sg kodi-addons
List all dependencies of a package (formatted):
$ pacman -Sp --print-format %n-%v plasma-meta
List packages in a given repository:
$ pacman -Sl core $ pacman -Sl extra $ pacman -Sl community $ pacman -Sl multilib
Install (update) a package from a local file:
$ pacman -U redshifter-20200404-1-any.pkg.tar.xz
Refresh the files syncdb:
$ pacman -Fy
Find files inside packages in syncdb:
$ pacman -F lsusb
Find files inside packages by regex:
$ pacman -Fx "panel.*png"
List all files owned by a package (installed or not, search syncdb):
$ pacman -Fl usbutils
Query installed packages by a string in localdb (empty string = list all):
$ pacman -Qs ttf $ pacman -Qs
List upgradeable (outdated/held) packages:
$ pacman -Qu
List explicitly installed packages:
$ pacman -Qe
List packages installed as dependencies:
$ pacman -Qd
List installed packages not directly required and not optionally required:
$ pacman -Qt
List installed packages optionally required but not directly required:
$ pacman -Qtt
List installed packages that are unrequired dependencies (orphans):
$ pacman -Qtd
List installed native packages:
$ pacman -Qn
List installed foreign packages (e.g. from AUR):
$ pacman -Qm
Show info about an installed package:
$ pacman -Qi usbutils
List files owned by an installed package:
$ pacman -Ql usbutils
Query localdb which installed package owns a file:
$ pacman -Qo /usr/bin/pactl
Work with a local package file (-p
) instead of localdb:
(-i
display info, -l
list files)
$ pacman -Qp redshifter-20200404-1-any.pkg.tar.xz $ pacman -Qip redshifter-20200404-1-any.pkg.tar.xz $ pacman -Qlp redshifter-20200404-1-any.pkg.tar.xz
Remove package only:
$ pacman -R usbutils
Recursively remove a package, its dependencies (if not needed by other packages), and saved files:
$ pacman -Rsn usbutils
(-ss
force remove ALL dependencies)
$ pacman -Rssn usbutils
Cascade remove package and all packages that depend on it:
$ pacman -Rc exo
Maintenance
Install pacdiff
:
$ pacman -S pacman-contrib
Scan for .pacorig
, .pacnew
, .pacsave
files:
$ pacdiff -o
or
$ pacdiff -o -l # use locate $ pacdiff -o -f # use find
Merge or delete .pacorig
, .pacnew
, .pacsave
files:
$ pacdiff
or
$ pacdiff -l $ pacdiff -f $ pacdiff -s # use sudo
Install pacutils
:
$ pacman -S pacutils
Find files not owned by any package:
$ pacreport --unowned-files > /root/pacreport.log
Find wrong permissions by checking package files against MTREE data:
$ paccheck --file-properties --quiet > /root/paccheck.log
Remove orphans (unused packages):
$ pacman -Rsn $(pacman -Qtdq)
Clean uninstalled packages cache and syncdb (-cc
also installed packages cache):
$ pacman -Sc $ pacman -Scc
Check integrity of installed packages (all / specific / filter by missing files):
$ pacman -Qk $ pacman -Qk fontconfig $ pacman -Qk | grep -v '0 missing'
Display modified files:
$ pacman -Qii | awk '/^MODIFIED/ {print $2}'
IF EVER NEEDED, reinstall all native packages:
$ pacman -S $(pacman -Qnq)
Generate mirror list:
$ pacman -S reflector $ reflector --country CA,US --protocol http,https --latest 200 --fastest 5 --sort score --save /etc/pacman.d/mirrorlist
AUR helpers / wrappers
aurget: written in Bash (no longer maintained)
$ wget -O PKGBUILD https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=aurget $ makepkg -si
aurget configuration:
$ cp /usr/share/doc/aurget/samples/aurgetrc ~/.config/aurgetrc
$ vim ~/.config/aurgetrc build_directory="$HOME/Builds" edit_pkgbuilds='never'
paru: written in Rust (pre-made bin package)
$ git clone https://aur.archlinux.org/paru-bin.git $ cd paru-bin $ makepkg -si
paru configuration:
$ cp /etc/paru.conf ~/.config/paru/paru.conf
$ vim ~/.config/paru/paru.conf [options] AurOnly BatchInstall #SkipReview SortBy=popularity
Others:
yay: written in Go
aura: written in Haskell
pikaur: written in Python
https://wiki.archlinux.org/title/AUR_helpers
AUR make a package
Set packager name:
$ vim /etc/makepkg.conf PACKAGER="Your Name <your@email.dom>"
makepkg common options:
$ makepkg -si # build and install
$ makepkg -fs # force rebuild
$ makepkg -fsi # force rebuild and install
Optional validation tool:
$ pacman -S namcap
Build steps:
$ wget -O PKGBUILD https://gitlab.archlinux.org/pacman/pacman/raw/master/proto/PKGBUILD.proto $ vim PKGBUILD $ makepkg -g >> PKGBUILD $ namcap PKGBUILD # for information messages in addition to warnings: namcap -i PKGBUILD $ makepkg -s $ namcap yourpackagename-1.0-1-x86_64.pkg.tar.xz
AUR upload package
# Generate keypair $ ssh-keygen -f ~/.ssh/aur # Change/remove passphrase if needed $ ssh-keygen -p -f ~/.ssh/aur # Change/remove comment if needed $ ssh-keygen -c -f ~/.ssh/aur # Specify private key for AUR remote $ vim ~/.ssh/config Host aur.archlinux.org IdentityFile ~/.ssh/aur User aur
Copy public key ~/.ssh/aur.pub to AURweb under My Account
# Configure git $ git config --global user.name "Your Name" $ git config --global user.email "your@email.dom"
# Method 1: clone empty git repo to create it $ cd ~/Builds $ git clone ssh://aur@aur.archlinux.org/redshifter.git $ cd redshifter $ vim PKGBUILD $ makepkg --printsrcinfo > .SRCINFO $ git add PKGBUILD .SRCINFO $ git commit -m "your comment" $ git push
# Method 2: add empty remote repo to create it $ cd ~/Builds/xhip $ vim PKGBUILD $ makepkg --printsrcinfo > .SRCINFO $ git init $ git add PKGBUILD .SRCINFO $ git commit -m "your comment" $ git remote add origin ssh://aur@aur.archlinux.org/xhip.git $ git push -u origin master
# Method 3a: pull from existing repo $ cd ~/Builds/freepats-ydp-grand-piano $ git init $ git remote add origin ssh://aur@aur.archlinux.org/freepats-ydp-grand-piano.git $ git pull origin master $ vim PKGBUILD $ makepkg --printsrcinfo > .SRCINFO $ git add PKGBUILD .SRCINFO $ git commit -m "your comment" $ git push
# Method 3b: fetch and branch from existing repo $ cd ~/Builds/freepats-ydp-grand-piano $ git init $ git remote add origin ssh://aur@aur.archlinux.org/freepats-ydp-grand-piano.git $ git fetch # git fetch origin master $ git checkout -tb master # git checkout -tb master origin/master $ vim PKGBUILD $ makepkg --printsrcinfo > .SRCINFO $ git add PKGBUILD .SRCINFO $ git commit -m "your comment" $ git push
# More git commands $ git remote -v # See remotes $ git branch -a # See all branches (local and remote) $ git branch -vv # See hash and subject $ git status $ git log # See commits log $ git log -p # See commits diffs (--patch) $ git diff master origin/master $ git diff master...origin/master $ git commit -am "your comment" # Commit all (-a) changed files $ git reset # Reset uncommitted changes $ git revert HEAD # Undo commits
Favorite essential packages
terminator bash-completion vim mc screen nmap htop iftop locate wget rsync x11vnc xbindkeys redshift xrandr pamixer playerctl networkmanager-applet networkmanager-openconnect