# Workstation

- [Workstation](#workstation)
  - [Framework AMD Notes](#framework-amd-notes)
    - [Wifi](#wifi)
    - [Microcode](#microcode)
  - [Base Tools](#base-tools)
  - [ZSH](#zsh)
    - [Aliases](#aliases)
      - [Rollback Pacman Update](#rollback-pacman-update)
  - [Podman](#podman)
  - [Docker](#docker)
  - [QEMU/KVM](#qemukvm)
    - [Arch Guests](#arch-guests)
    - [Restore qcow snapshots](#restore-qcow-snapshots)
    - [Convert qcow to bootable drive](#convert-qcow-to-bootable-drive)
  - [Kubernetes](#kubernetes)
  - [VSCode](#vscode)
    - [Shell](#shell)
    - [Fonts](#fonts)
    - [Navigation](#navigation)
    - [Extensions](#extensions)
  - [Wireguard](#wireguard)
  - [Remote Desktop](#remote-desktop)
  - [Transmission](#transmission)
  - [VLC](#vlc)
  - [Bitwarden](#bitwarden)
  - [Nextcloud](#nextcloud)
  - [Insomnia](#insomnia)
  - [QMK](#qmk)
    - [Initialization](#initialization)
    - [Development](#development)
  - [Cura](#cura)
  - [AWS CLI](#aws-cli)
  - [NSlookup](#nslookup)
  - [rpi-imager](#rpi-imager)
    - [Install rpi-imager](#install-rpi-imager)
    - [Upgrade rpi-imager](#upgrade-rpi-imager)
  - [qFlipper](#qflipper)

## Framework AMD Notes

### Wifi

Install the wireless-regdb to set the regulatory domain to US

```bash
pacman -S wireless-regdb
```

Edit `/etc/conf.d/wireless-regdom` to set the domain

Switch to iwd for the NetworkManager backend.

```bash
pacman -S iwd
```

Edit `/etc/NetworkManager/conf.d/wifi_backend.conf`

```conf
[device]
wifi.backend=iwd
```

Finally, reboot the machine for the changes to take effect.

### Microcode

```bash
pacman -S amd-ucode
```

Edit /boot/loader/entries/.conf and add the following:

```bash
title       Arch Linux (Work)
linux       /vmlinuz-linux
initrd      /amd-ucode.img
initrd      /initramfs-linux.img
options     ...
```

## Base Tools

```bash
pacman -S rsync which git iperf3 pwgen dosfstools exfatprogs
```

## ZSH

```bash
pacman -S zsh grml-zsh-config
chsh -s $(which zsh)
echo "autoload -U compinit; compinit" > ~/.zshrc
```

### Aliases

You can put you aliases in `.zshrc` with the following format:

```bash
alias update='sudo pacman -Syu --noconfirm'
```

It's recommended that for complicated/multiline aliases you create a folder called
`~/.local/scripts` where you store each alias. Make sure to back up this folder!

#### Rollback Pacman Update

This script will grep for all updates performed today and roll them back one by one.

rollback_update.sh

```bash
grep -a upgraded /var/log/pacman.log| grep $(date +"%Y-%m-%d") > /tmp/lastupdates.txt
awk '{print $4}' /tmp/lastupdates.txt > /tmp/lines1;awk '{print $5}' /tmp/lastupdates.txt | sed 's/(/-/g' > /tmp/lines2
paste /tmp/lines1 /tmp/lines2 > /tmp/lines
tr -d "[:blank:]" < /tmp/lines > /tmp/packages
cd /var/cache/pacman/pkg/
for i in $(cat /tmp/packages); do sudo pacman --noconfirm -U "$i"*; done
```

## Podman

Install with the following

`pacman -S podman buildah cni-plugins slirp4netns podman-dnsname aardvark-dns`

Then you can run rootless containers like so:

```bash
podman pull docker.io/library/python:3.11
podman run -it python:3.11 bash

podman network create test
podman pod create --network test --publish 8000:8000 test1
podman run -it --pod test1 python:3.11 bash
```

You can also deploy pods with kubernetes yamls.

```bash
podman network create test
podman kube play --network test podman-deploy.yaml --replace
```

## Docker

```bash
pacman -Sy docker docker-compose
usermod -aG docker ducoterra
```

logout, log back in to use docker as non-root user.

You can use btrfs as your storage driver by following these instructions:

<https://docs.docker.com/storage/storagedriver/btrfs-driver/>

## QEMU/KVM

1. Install virtualization capabilties

    ```bash
    pacman -S qemu-full libvirt iptables-nft dnsmasq virt-manager qemu-desktop swtpm
    usermod -aG libvirt ducoterra
    ```

2. Edit /etc/libvirt/libvirtd.conf

    ```conf
    ...
    unix_sock_group = 'libvirt'
    ...
    unix_sock_rw_perms = '0770'
    ...
    ```

3. Edit /etc/libvirt/qemu.conf

    ```conf
    # Some examples of valid values are:
    #
    #       user = "qemu"   # A user named "qemu"
    #       user = "+0"     # Super user (uid=0)
    #       user = "100"    # A user named "100" or a user with uid=100
    #
    user = "ducoterra"

    # The group for QEMU processes run by the system instance. It can be
    # specified in a similar way to user.
    group = "ducoterra"
    ```

4. `sudo systemctl enable --now libvirtd`
5. `sudo virsh net-autostart default`

If you get a blank screen when launching a VM check that you've used the correct bios -
either secboot or not secboot. This is the most common problem.

### Arch Guests

In order to get drivers for spice you'll need the guest spice drivers:

```bash
sudo pacman -S qemu-guest-agent spice-vdagent
```

### Restore qcow snapshots

```bash
# Create a snapshot
qemu-img snapshot -c snapshot-name /var/lib/libvirt/images/vm-image.qcow2

# List snapshots for a given image
qemu-img snapshot -l /var/lib/libvirt/images/vm-image.qcow2

# Restore snapshot
qemu-img snapshot -a snapshot-name /var/lib/libvirt/images/vm-image.qcow2
```

### Convert qcow to bootable drive

```bash
qemu-img convert -f qcow2 -O raw /var/lib/libvirt/images/vm-image.qcow2 /dev/sdb
```

If you need to resize a windows partition to non-continuous space simply grow the
last partition, shrink it to the end of the drive, then grow the windows partition
with gparted.

## Kubernetes

```bash
pacman -S kubectl helm
```

## VSCode

For the open source version of code install `code`:

```bash
sudo pacman -S code
```

For the proprietary version of vscode install `yay` and then:

```bash
yay -S visual-studio-code-bin
```

### Shell

Edit settings.json

```json
{
    "terminal.integrated.defaultProfile.linux": "zsh",
}
```

### Fonts

Intel One Mono is designed to be easily readable for developers.

<https://github.com/intel/intel-one-mono>

Download and extract the ttf.zip

```bash
mkdir ~/.local/share/fonts
rsync -av /path/to/download/*.ttf ~/.local/share/fonts/
```

Edit settings.json

```json
{
    "editor.fontFamily": "Intel One Mono",
    "editor.fontLigatures": true,
    "terminal.integrated.fontFamily": "Intel One Mono",
}
```

### Navigation

The best navigation shortcut ever is alt+left and alt+right to move the cursor to it's
previous positions.

```json
[
    {
        "key": "alt+left",
        "command": "workbench.action.navigateBack",
        "when": ""
    },
    {
        "key": "alt+right",
        "command": "workbench.action.navigateForward",
        "when": ""
    }
]
```

### Extensions

To save a list of installed extensions run:

```bash
code --list-extensions >> vscode_extensions.txt
```

To install that list of extensions run:

```bash
cat vscode_extensions.txt | xargs -L 1 code --install-extension
```

## Wireguard

Wireguard requires `linux-headers`. If that isn't installed or is misconfigured your
vpn likely won't activate.

```bash
pacman -S wireguard-tools
```

## Remote Desktop

```bash
pacman -S remmina freerdp
```

## Transmission

```bash
pacman -S gtk4 transmission-gtk
```

## VLC

```bash
pacman -S vlc
```

## Bitwarden

<https://bitwarden.com/download/>

```bash
mv ~/Downloads/Bitwarden*.AppImage ~/Applications/Bitwarden.AppImage
chmod +x ~/Applications/*.AppImage
```

```conf
[Desktop Entry]
Name=Bitwarden
Exec=/home/ducoterra/Applications/Bitwarden.AppImage
Icon=/home/ducoterra/.icons/bitwarden.png
Type=Application
```

## Nextcloud

<https://nextcloud.com/install/#install-clients>

```bash
mv ~/Downloads/Nextcloud*.AppImage ~/Applications/Nextcloud.AppImage
chmod +x ~/Applications/*.AppImage
```

```conf
[Desktop Entry]
Name=Nextcloud
Exec=/home/ducoterra/Applications/Nextcloud.AppImage
Icon=/home/ducoterra/.icons/nextcloud.png
Type=Application
```

## Insomnia

<https://github.com/Kong/insomnia/releases/tag/core@2023.5.7>

```bash
mv ~/Downloads/Insomnia*.AppImage ~/Applications/Insomnia.AppImage
chmod +x ~/Applications/*.AppImage
```

```conf
[Desktop Entry]
Name=Insomnia
Exec=/home/ducoterra/Applications/Insomnia.AppImage
Icon=/home/ducoterra/.icons/insomnia.png
Type=Application
```

## QMK

### Initialization

I have a mirror and a fork of the mirror on my personal Gitea. For this strategy you'll
need to checkout the fork and add the mirror. This ensures I'll always have an up-to-date
mirror of qmk while also giving me a repo to make changes for my personal keyboards.

```bash
git clone git@gitea.reeseapps.com:ducoterra/qmk_firmware.git
cd qmk_firmware
git remote add mirror git@gitea.reeseapps.com:mirrors/qmk_firmware.git
git fetch mirror
git rebase mirror/master
pacman -S qmk
qmk setup
sudo cp /home/ducoterra/qmk_firmware/util/udev/50-qmk.rules /etc/udev/rules.d/
qmk config user.keyboard=keychron/q11/ansi_encoder
qmk config user.keymap=ducoterra
```

### Development

Every time you start a project you'll want to sync with the mirror.

```bash
git fetch mirror
git rebase mirror/master
```

Commit to master while you're in the fork.

## Cura

<https://ultimaker.com/software/ultimaker-cura/#links>

```bash
mv ~/Downloads/*Cura*.AppImage ~/Applications/Cura.AppImage
chmod +x ~/Applications/*.AppImage
```

```conf
[Desktop Entry]
Name=Cura
Exec=/home/ducoterra/Applications/Cura.AppImage
Icon=/home/ducoterra/.icons/cura.png
Type=Application
```

## AWS CLI

<https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html>

```bash
# Install less if you don't have it already
pacman -S less

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```

Add the following to your .zshrc:

```bash
complete -C '/usr/local/bin/aws_completer' aws
```

## NSlookup

```bash
pacman -Syu bind
```

## rpi-imager

<https://github.com/raspberrypi/rpi-imager>

```bash
sudo pacman -S cmake qt5-base
```

### Install rpi-imager

```bash
git clone https://github.com/raspberrypi/rpi-imager.git
cd rpi-imager
mkdir -p build
cd build
cmake ../src
make
sudo make install
```

### Upgrade rpi-imager

```bash
```bash
cd rpi-imager
git pull
rm -r build
mkdir -p build
cd build
cmake ../src
make
sudo make install
```

## qFlipper

<https://flipperzero.one/update>

```bash
mv ~/Downloads/*qFlipper*.AppImage ~/Applications/qFlipper.AppImage
chmod +x ~/Applications/*.AppImage
```

```conf
[Desktop Entry]
Name=qFlipper
Exec=/home/ducoterra/Applications/qFlipper.AppImage
Icon=/home/ducoterra/.icons/qFlipper.png
Type=Application
```
