# Artix Linux - Install and System Config

**Attribution:**
Most or much of this was generated by or derived from Grok, or else from Artix docs, Arch docs/wiki, or else the docs for the particular programs or packages used. I'm not claiming any of this is mine, just putting it here in one file for future convenience/reference.

I used this approach in December of 2025 to install Artix Linux on a Framework 13in laptop from 2023 q4.

- OS and distro: Artix Linux
- init system: dinit
- partitioning, GUID Partition Table:
    - unencrypted boot partition (size: 512M), UEFI
    - LUKS-encrypted LVM:
        - swap partition (size: amount of memory + 4G)
        - root/default partition (size: remaining space)

For reference, doc page from Artix for installation:
https://wiki.artixlinux.org/Main/Installation

---

## install steps

- [ ] if not already done, download artix ISO (dinit version) and dd it onto a usb drive

- [ ] boot the live usb and select the install option (whatever it may look like)

- [ ] connect to the internet

```bash
connmanctl
//// within connmanctl
enable wifi
scan wifi
agent on
services
connect <wifi_XXXXXXXXXXXXXXXX_managed_psk>
quit
```

- [ ] verify connection using `ping`

- [ ] update live system keys/mirrors

```bash
pacman -Sy artix-keyring
```

- [ ] run lsblk and identify the storage drive on which to install
    - note: when i ran this in 2025 dec on my framework laptop, it was `/dev/nvme0n1`

- [ ] partition the drive

```bash
cfdisk <target storage drive>
# use GPT (guid partition table)
# new partition, size 512M, type 'EFI System'
# new partition, size (remaining), type 'Linux LVM'
# write changes
# quit cfdisk
```

- [ ] set up LVM volumes

```bash
cryptsetup luksFormat --type luks2 /dev/<LVM partition>
cryptsetup open /dev/<LVM partition> artixlvm

pvcreate /dev/mapper/artixlvm
vgcreate artixvg /dev/mapper/artixlvm

lvcreate -L <size of memory + 4G, e.g. 36G> artixvg -n swap
lvcreate -l 100%FREE artixvg -n root
```

- [ ] set filesystems for partitions/volumes

```bash
mkfs.vfat -F32 /dev/<boot partition>
mkfs.ext4 /dev/artixvg/root
mkswap /dev/artixvg/swap
```

- [ ] mount the partitions/volumes

```bash
mount /dev/artixvg/root /mnt
mkdir /mnt/boot
mount /dev/<boot partition> /mnt/boot
swapon /dev/artixvg/swap
```

- [ ] install base system and needed packages

```bash
basestrap /mnt base base-devel linux \
    linux-firmware \
    dinit elogind-dinit \
    lvm2 cryptsetup grub efibootmgr mkinitcpio \
    connman connman-dinit wpa_supplicant \
    git less neovim zsh
```

- [ ] generate fstab
```bash
fstabgen -U /mnt >> /mnt/etc/fstab

# verify (add noatime to ext4 line if desired)
vi /mnt/etc/fstab
```

- [ ] chroot into installed system
```bash
artix-chroot /mnt
```

- [ ] set timezone, hardware clock, locale

```bash
ln -sf /usr/share/zoneinfo/<path to target zone> /etc/localtime
hwclock --systohc

nvim /etc/locale.gen
# uncomment en_US.UTF-8 UTF-8; add others if desired

locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf
```

- [ ] set hostname and /etc/hosts

```bash
echo "<computer name>" > /etc/hostname

nvim /etc/hosts
# ensure /etc/hosts includes the following:
127.0.0.1  localhost
::1        localhost
127.0.1.1  <computer name>.localdomain <computer name>"
```

- [ ] mkinitcpio with hooks

```bash
nvim /etc/mkinitcpio.conf
# go to HOOKS and set it thus:
HOOKS=(base udev autodetect keyboard keymap consolefont modconf block encrypt lvm2 resume filesystems fsck)

mkinitcpio -P
```

- [ ] grub config and install

```bash
blkid
# note the UUID of the LVM/LUKS partition

nvim /etc/default/grub
# ensure the following is set:
GRUB_CMDLINE_LINUX="cryptdevice=UUID=<UUID from blkid above>:artixlvm root=/dev/mapper/artixvg-root resume=/dev/mapper/artixvg-swap quiet rw"

grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Artix
grub-mkconfig -o /boot/grub/grub.cfg
```

- [ ] set up connman for installed system

```bash
mkdir -p /etc/dinit.d/boot.d
ln -s ../connmand /etc/dinit.d/boot.d/connmand
```

- [ ] set root password, set up user

```bash
passwd

useradd -m -G wheel,audio,video,optical,storage <username>
passwd <username>
pacman -S sudo
EDITOR=nvim visudo
# uncomment the line in /etc/sudoers which looks something like the below:
echo "%wheel ALL=(ALL) ALL"
```

- [ ] close stuff out and reboot

```bash
exit
umount -R /mnt
swapoff -a
cryptsetup close cryptlvm # may not work, just ignore and reboot
reboot
```

---

## system config (post install)

_NOTE: don't put anything here which should be in my dotfiles-and-setup scripts instead_

- [ ] set up chrony (for syncing system time with ntp servers)
    - _NOTE: edit defaults in `/etc/chrony/chrony.conf` if desired_

```bash
sudo pacman -S chrony chrony-dinit

# Fallback if dinitctl enable fails (symlink method)
sudo mkdir -p /etc/dinit.d/boot.d
sudo ln -s ../chronyd /etc/dinit.d/boot.d/chronyd
# alt: sudo dinitctl enable chronyd

/etc/dinit.d/chronyd start
# alt: sudo dinitctl start chronyd
```

---

## troubleshooting

if i need to try something again and reopen the LVM, the below should work:

```bash
cryptsetup open /dev/<target device> artixlvm
# enter existing password

vgchange -ay artixvg
# or, if only one VG exists:
vgchange -ay
```

if date/time get messed up (such as due to battery running out), fix with:

```bash
# can manually adjust to local time; grok said "date is UTC if hardware is set that way"
sudo date -s "2025-12-17 12:47:00"
# or, if chrony, ntp, or similar is set up, can trigger sync
chronyd -q
# can check after with `date` or `chronyc tracking`

sudo hwclock -w --utc
```

