Tue 18 January 2022

Eğer siz de benim gibi sisteminizde non-free yazılım çalıştırmaktan hoşlanmıyor, yine de oyun oynamayı seviyorsanız, hiç bir performans kaybı olmadan LXC ile tamamen izole edilmiş bir container'a Steam kurup oyunlarınızı oynayabilirsiniz. Üstelik bunu da tamamıyle unprivileged, yani root yetkisine sahip olmadan yapabilirsiniz.

Bu yazı Debian 11 (bullseye) için yazılmıştır.

Öncelikle sisteminize lxc paketini apt ile kurun:

sudo apt install lxc

Ardından yerel kullanıcıya lxc network'unu kullanabilmesi için yetki verin:

echo onur veth lxcbr0 100 | sudo tee /etc/lxc/lxc-usernet

Root ile hostta çalıştırmanız gereken komutlar sadece bu kadar. Artık geri kalan tüm işlemleri hiç bir root yetkisine ihtiyaç duymadan normal kullanıcınız ile yapabilirsiniz.

Ardından ~/.config/lxc/default.conf dosyasını oluşturup aşağıdakileri ekleyin:

lxc.include = /etc/lxc/default.conf

lxc.idmap = u 0 100000 1000
lxc.idmap = g 0 100000 1000
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
lxc.idmap = u 1001 101000 64535
lxc.idmap = g 1001 101000 64535

lxc.apparmor.profile = unconfined

Oluşturmuş olduğunuz idmap, containerlar içerisinde 0 uid'sini hostta 100000 idsine çevirmeye yarıyor. Aynı zamanda hostta bulunan 1000 idli kullanıcıyı da ayni şekilde container içerisinde 1000 idsi ile kullanıyoruz.

Container Oluşturma

Artık LXC sistemde hazır olduğuna göre container oluşturabiliriniz. Bunun için lxc-create komutunu kullanacağız:

lxc-create -n steam -t download -- -d debian -r bullseye -a amd64 --keyserver hkp://keyserver.ubuntu.com

Bu komut steam isimli debian bullseye container'ı oluşturacaktır. Ekran kartı ve pulseaudio'u container içerisinde kullanabilmemiz için bazı mountlar yapmamız gerekli. ~/.local/share/lxc/steam/config dosyasını açın ve aşağıda yer alan mount girdilerini ekleyin, ben nvidia ekran kartı kullandığım için gerekli nvidia aygıtlarını da ekledim:

lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,create=dir
lxc.mount.entry = /dev/dri dev/dri none bind,create=dir
lxc.mount.entry = /run/user/1000/pulse/native tmp/.pulse-native none bind,create=file
lxc.mount.entry = /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry = /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file

Artık container'ınızı başlatabilirsiniz:

lxc-unpriv-start -n steam

Container başladıktan sonra attach olup kendi kullanıcınızı oluşturabilir ve steam kurabilirsiniz. Öncelikle container'a attach olalım:

lxc-unpriv-attach -n steam --clear-env

Container içerisinde çalıştırmanız gereken komutlar:

# Yeni kullanıcı oluşturulması
adduser onur --disabled-login --disabled-password --gecos ''

# Debian contrib ve non-free depolarının eklenmesi
echo deb http://deb.debian.org/debian bullseye main contrib non-free | tee /etc/apt/sources.list

# Steam için gerekli i386 mimarisinin eklenmesi
dpkg --add-architecture i386

# Depoların update edilmesi
apt update

# nvidia sürücülerinin kurulması
# nvidia ekran kartı kullanmıyorsanız bu adımı atlayın
apt install --no-install-recommends nvidia-driver-libs:amd64 nvidia-driver-libs:i386

# Steam kurulması
apt install steam

Artık container'ınız hazır. İsteğinize göre playonlinux veya wine da kurabilirsiniz. Kurulumları tamamladıktan sonra root olduğunuz containerdan çıkın.

Son bir adım olarak host makinede çalışan xorg'a container'ın bağlanabilmesi için yetki vermemiz gerekli. Bunun bir çok yolu var, ben xhost + komutu ile access control'u tamamen disable ediyorum.

Artık steam'i başlatabilirsiniz:

lxc-unpriv-attach -n steam -u 1000 -g 1000 -v PULSE_SERVER=unix:/tmp/.pulse-native steam