This page explains how to install Artix on a USB flash drive. The end result is a persistent installation identical to that on a normal hard drive along with several optimizations aimed at running Linux on removable flash media. It is compatible with both BIOS and UEFI booting modes.
# pacman artools-base gptfdisk
Plug in the drive and determine the device name.
# dmesg | tail
# usb-storage 2-2:1.0: USB Mass Storage device detected # scsi host2: usb-storage 2-2:1.0 # sd 2:0:0:0: [sdb] 965246976 512-byte logical blocks: (494 GB/460 GiB) # sd 2:0:0:0: [sdb] Write Protect is off # sd 2:0:0:0: [sdb] Mode Sense: 43 00 00 00 # sd 2:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA # sdb: # sd 2:0:0:0: [sdb] Attached SCSI removable disk
Use your device's name. For the remainder of this guide, the device name will be referred to as /dev/sdX.
# export TARGET=/dev/sdX
This may not be necessary with the -v switch added to sgdisk below.
Use dd to write the USB with all zeros, permanently erasing all data:
# dd if=/dev/zero of=$TARGET status=progress && sync
Expect this to take a relatively long time (hour++) depending on the size.
Create a 10M BIOS partition, an EFI partition, and a Linux partition with the remaining space (`sgdisk` is in the gptfdisk package):
# sgdisk -o -n -v -I 1:0:+10M -t 1:EF02 -n 2:0:+1024M -t 2:EF00 -n 3:0:0 -t 3:8304 $TARGET # sgdisk -c 1:"BIOS" -c 2:"ESP"
Do not format the `/dev/sdX1` block. This is the BIOS/MBR partition. Format the EFI system partition with a FAT32 filesystem:
# mkfs.fat -F32 ${TARGET}2
Format the Linux partition with an ext4 filesystem:
# mkfs.ext4 ${TARGET}3
Mount the ext4 formatted partition as the root filesystem:
# export MNT=/mnt/usb
# mkdir -p ${MNT}/boot
# mount ${TARGET}2 ${MNT}/boot
# mount ${TARGET}3 $MNT
By default, dinit will installed (alphabetical), adjust if desired as seen in: https://wiki.artixlinux.org/Main/Installation#Install_base_system Note: basestrap is in artools-base
# basestrap $MNT base inetutils base-devel vim htop mc less grub efibootmgr linux linux-firmware
Side note: I could not create directory '/mnt/usb/var': Read-only file system
# umount /dev/sdX1 # fsck -y /dev/sdX1 # mount /dev/sdX1 $MNT
Second try
# basestrap $MNT base inetutils base-devel vim htop mc less grub efibootmgr linux linux-firmware
Add to the above as you like. Configure in chroot as noted below.
Generate a new /etc/fstab using UUIDs as source identifiers:
# fstabgen -U $MNT > ${MNT}/etc/fstab
Unless otherwise noted, all configuration is done within a chroot. Chroot into the new system:
# artix-chroot $MNT # export PS1="(chroot) $PS1"
Use tab-completion to discover the appropriate entries for _region_ and _city_:
# ln -sf /usr/share/zoneinfo/region/city /etc/localtime
substitute en_US.UTF-8 for your desired locale
# sed -i '/en_US.UTF-8/s/^#*//' /etc/locale.gen # locale-gen # echo 'LANG=en_US.UTF-8' > /etc/locale.conf
"ghost" is an example
# export HOSTNAME="ghost"
# cat << EOF > /etc/hosts
# 127.0.0.1 localhost
# ::1 localhost
# 127.0.1.1 ${HOSTNAME}.localdomain ${HOSTNAME}
# EOF
# echo ${HOSTNAME} > /etc/hostname
passwd
Example GRUB install for both BIOS and UEFI booting modes
# grub-install --target=i386-pc --recheck $TARGET # grub-install --target=x86_64-efi --efi-directory /boot --recheck --removable
# grub-mkconfig -o /boot/grub/grub.cfg
# pacman -S networkmanager-dinit # ln -s /etc/dinit.d/NetworkManager /etc/dinit.d/boot.d/
# useradd -m -G wheel -s /bin/bash $USER # passwd $USER
Configure sudo
# sed -i '/%wheel ALL=(ALL:ALL) ALL/s/^# //' /etc/sudoers # visudo -c # check if it parses
# sed -i -s 's/relatime/noatime/' /etc/fstab