Skip to content

Instantly share code, notes, and snippets.

@brandimarte
Last active March 13, 2024 13:39
Show Gist options
  • Save brandimarte/9eedf959a248c2a4306ebc874498d460 to your computer and use it in GitHub Desktop.
Save brandimarte/9eedf959a248c2a4306ebc874498d460 to your computer and use it in GitHub Desktop.
Arch Linux installation on Dell XPS 13 Plus 9320

References

ArchWiki: Arch installation guide

ArchWiki: Dell XPS 13 Plus (9320)

!!! Before you start !!!

It's not working:

  • I did not manage to make hibernation to disk to work properly.

  • I did not try to configure the keyboard special keys like volume, mic and brightness.

Backup preinstalled OS

On first run of the preinstalled Ubuntu, create an OS Recovery Media on an external USB flash drive to be able to restore the computer to its factory shipped state, in case Arch installation does not succeed. Optionally, the OS Media can be created after the first boot with the Dell Recovery tool.

Setup BIOS

BIOS is accessed on startup by hitting F2.

  • Under Boot Configuration disable Secure Boot (it can be re-enabled after installation).
  • Under Power, set the Battery Configuration to Custom, starting at 50% and stopping at 80% (to improve battery life).

Create bootable USB flash drive with Arch ISO

Download Arch ISO from a mirror (see Arch Linux Downloads):

# wget https://archlinux.cu.be/iso/2022.10.01/archlinux-x86_64.iso

Verify its signature by comparing the key-fingerprint (4AA4767BBC9C4B1D18AE28B77F2D434B9741E8AC):

# wget https://archlinux.cu.be/iso/2022.10.01/archlinux-x86_64.iso.sig
# gpg --keyserver-options auto-key-retrieve --verify archlinux-x86_64.iso.sig
# gpg --auto-key-locate clear,wkd -v --locate-external-key pierre@archlinux.de

Further signature check (in case it has been manipulated) can be done with a command-line front-end for Sequoia:

# sq wkd get pierre@archlinux.de > release-key.pgp
# sq verify --signer-cert release-key.pgp --detached archlinux-2022.10.01-x86_64.iso.sig archlinux-2022.10.01-x86_64.iso

Additionally check if the image matches the checksum from sha256 or blake2b, where the output should contain a line as archlinux-x86_64.iso: OK:

# wget https://archlinux.cu.be/iso/2022.10.01/sha256sums.txt
# sha256sum -c sha256sums.txt
# wget https://archlinux.cu.be/iso/2022.10.01/b2sums.txt
# b2sum -c b2sums.txt

Create the bootable USB flash drive (the USB drive path /dev/sdX can be retrieved with lsblk):

# sudo dd bs=4M if=archlinux-x86_64.iso of=/dev/sda conv=fsync oflag=direct status=progress

Arch Linux installation

To boot from the USB drive, hit F12 when the system boots up and this will bring to One-Time Boot Settings. There choose UEFI Generic Mass Storage xxx.

In my case the keyboard has US layout, which is already the default. Otherwise it could be set with loadkeys.

Connect to the internet with iwctl:

# iwctl
[iwd]# device list (to get the _device_name_)
[iwd]# station device_name scan
[iwd]# station device_name get-networks (to get the network name _SSID_)
[iwd]# station device_name connect SSID
[iwd]# quit

Check the connection: ping -c 3 www.archlinux.org.

Update the system clock with timedatectl, in my case need to update the time zone:

# timedatectl status (to check if it is correct)
# timedatectl list-timezones (to list available time zones)
# timedatectl set-timezone Europe/Madrid

Disk partitioning, format and mount

No need to create another EFI system partition as it already has one. Just remove main Linux partition and create another one, with a swap space of 33GB at the end (slightly higher than the ram memory size to avoid problems on hibernation).

# parted /dev/nvme0n1
(parted) rm 3
(parted) mkpart primary ext4 9524MB 988GB
(parted) mkpart primary linux-swap 988GB 100%
(parted) quit

I'll not create full system encryption, but instead only encrypt my home directory later at file system level with eCryptfs. Having the root file system not encrypted saved my life a couple of times.

Format the new partitions:

# mkfs.ext4 /dev/nvme0n1p3
# mkswap /dev/nvme0n1p4

Mount the file systems:

# mount /dev/nvme0n1p3 /mnt
# mkdir /mnt/boot
# mount /dev/nvme0n1p1 /mnt/boot
# swapon /dev/nvme0n1p4

Installation

Reorder the mirror list at /etc/pacman.d/mirrorlist if necessary. Then install a minimum set of packages for a functional base system:

# pacstrap -K /mnt base linux linux-firmware sof-firmware netctl wpa_supplicant dhcpcd dialog fwupd grub efibootmgr intel-ucode sudo vim

Create fstab on the new system:

# genfstab -U /mnt >> /mnt/etc/fstab

To continue the configuration, change root into the new system:

# arch-chroot /mnt

Set time zone:

# ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime

Generate /etc/adjtime (hardware clock):

# hwclock --systohc

Uncomment en_US.UTF-8 line in /etc/locale.gen and generate the locales:

# sed -i 's/^#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen
# locale-gen
# echo LANG=en_US.UTF-8 > /etc/locale.conf

Network

Give your machine a nice name:

# echo nice_name > /etc/hostname

Later, after finishing all the rest of configuration, enable netctl-auto systemd unit for automatic connection to known profiles:

# sudo systemctl enable netctl-auto@wlp0s20f3.service
# sudo systemctl start netctl-auto@wlp0s20f3.service

Users

Set the root password:

# passwd

Create a new user user_name:

# useradd -m -G wheel,users -s /bin/bash _user_name_
# passwd _user_name_

Uncomment the line %wheel ALL=(ALL) ALL with visudo:

# visudo

Configure the boot loader

In principle there is no need to edit mkinitcpio configuration file. Only install GRUB EFI application and generate its configuration file:

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

Reboot

Exit chroot, unmount all partitions and reboot:

# exit
# umount -R /mnt
# reboot

Webcan

Efforts to make the webcan work across browsers can be found here. I used @stefanpartheym's script which basically strings together the content of this comment.

$ git clone https://github.com/stefanpartheym/archlinux-ipu6-webcam.git
$ cd archlinux-ipu6-webcam/
$ bash install.sh -a

Note: I need to enable vpn, otherwise v4l2loopback repo could not be cloned.

Camera light blinks after system startup, and it works if I run the command:

$ sudo -E LANG=C gst-launch-1.0 icamerasrc ! video/x-raw,format=NV12,width=1280,height=720 ! videoconvert ! ximagesink

But the camera seems unrecognized by browsers (like firefox and chrome) and video conference apps (like Jitsi).

systemctl status v4l2-relayd shows:

Mar 02 14:47:40 bell v4l2-relayd[7026]: gst_element_set_state: assertion 'GST_IS_ELEMENT (element)' failed

An earlier attempt to install the intel packages one by one failed. Here I put only to remember the steps done. Install kernel drivers for the IPU and sensors, via dkms build:

$ git clone https://github.com/intel/ipu6-drivers.git
$ cd ipu6-drivers
$ cp -r ivsc-driver/backport-include ivsc-driver/drivers ivsc-driver/include .
$ rm -rf ivsc-driver
$ sudo dkms add .
$ sudo dkms autoinstall ipu6-drivers/0.0.0

Install IPU firmware and proprietary image processing libraries:

$ git clone https://github.com/intel/ipu6-camera-bins.git
$ cd ipu6-camera-bins
$ sudo cp -r ipu6ep/include/* /usr/include/
$ sudo cp -r ipu6ep/lib/* /usr/lib/

Install HAL for processing of images in userspace:

$ git clone https://github.com/intel/ipu6-camera-hal.git
$ cd ipu6-camera-hal
$ IPU6_VER=ipu6ep
$ mkdir -p ./build/out/install/usr && cd ./build/
$ cmake -DCMAKE_BUILD_TYPE=Release -DIPU_VER=${IPU6_VER} -DENABLE_VIRTUAL_IPU_PIPE=OFF -DUSE_PG_LITE_PIPE=ON -DUSE_STATIC_GRAPH=OFF -DCMAKE_INSTALL_PREFIX=/usr ..
$ make -j4
$ sudo make install
$ sudo cp ../config/linux/rules.d/60-intel-ipu-* /lib/udev/rules.d/
$ shutdown -r now

Install Gstreamer src plugin:

$ git clone https://github.com/intel/icamerasrc.git
$ cd icamerasrc
$ git checkout icamerasrc_slim_api
$ export CHROME_SLIM_CAMHAL=ON
$ export STRIP_VIRTUAL_CHANNEL_CAMHAL=ON
$ export PKG_CONFIG_PATH="/usr/lib/x86_64-linux-gnu/pkgconfig"
$ export PKG_CONFIG_PATH="/usr/lib/pkgconfig"
$ ./autogen.sh
$ make -j4
$ sudo make install
$ sudo pacman -S rpm-tools
$ make rpm
$ sudo rpm -ivh --force --nodeps rpm/icamerasrc-1.0.0-1.20230306.2d36ade.x86_64.rpm

Install gst good pluglins:

$ sudo pacman -S gst-plugins-good

Now the virtual camera can be launched on a terminal with:

$ sudo -E gst-launch-1.0 icamerasrc buffer-count=7 device-name=ov01a10-uf ! v4l2sink device=/dev/video0

PS: test ok chrome and firefox for lts-kernel (<6.2).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment