SouthFox's Garden

Search IconA magnifying glass icon. 搜索
种植日期: 2025-05-24 上次照料: 2025-05-31

2025-05-24

Steam Deck 下安装 Guix

Steam Deck 下安装 Guix 下的步骤:

教程: Nix on the Steam Deck

步骤

mkdir /home/gnu/store -p
mkdir /home/var-guix

cat > /etc/systemd/system/guix-directory.service <<EOF
[Unit]
Description=Create a `/gnu` directory to be used for bind mounting
PropagatesStopTo=guix-daemon.service
PropagatesStopTo=gnu-store.mount
PropagatesStopTo=var-guix.mount
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=steamos-readonly disable
ExecStart=mkdir -vp /gnu
ExecStart=chmod -v 0755 /gnu
ExecStart=chown -v root /gnu
ExecStart=chgrp -v root /gnu
ExecStart=mkdir -vp /var/guix
ExecStart=chmod -v 0755 /var/guix
ExecStart=chown -v root /var/guix
ExecStart=chgrp -v root /var/guix
ExecStart=steamos-readonly enable
RemainAfterExit=true
EOF

cat > /etc/systemd/system/gnu.mount <<EOF
[Unit]
Description=Mount `/home/gnu` on `/gnu`
PropagatesStopTo=guix-daemon.service
PropagatesStopTo=guix-directory.service
After=guix-directory.service
Requires=guix-directory.service
ConditionPathIsDirectory=/gnu
DefaultDependencies=no
RequiredBy=guix-daemon.service

[Mount]
What=/home/gnu
Where=/gnu
Type=none
DirectoryMode=0755
Options=bind
EOF

cat > /etc/systemd/system/var-guix.mount <<EOF
[Unit]
Description=Mount `/home/var-guix` on `/var/guix`
PropagatesStopTo=guix-daemon.service
PropagatesStopTo=guix-directory.service
After=guix-directory.service
Requires=guix-directory.service
ConditionPathIsDirectory=/var/guix
DefaultDependencies=no
RequiredBy=guix-daemon.service

[Mount]
What=/home/var-guix
Where=/var/guix
Type=none
DirectoryMode=0755
Options=bind
EOF

cat > /etc/systemd/system/ensure-guix-symlinked.service <<EOF
[Unit]
Description=Ensure Guix related units which are symlinked resolve
After=gnu-store.mount
After=var-guix.mount
Requires=guix-directory.service
Requires=gnu-store.mount
Requires=var-guix.mount
DefaultDependencies=no

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/systemctl daemon-reload

[Install]
WantedBy=sysinit.target
EOF

systemctl daemon-reload
systemctl enable --now ensure-guix-symlinked.service.service

wget 'https://git.savannah.gnu.org/gitweb/?p=guix.git;a=blob_plain;f=etc/guix-install.sh;hb=HEAD' -O guix-install.sh
# guix 安装时会在 /usr/local/bin/guix 创建 guix 软链接,虽然系统更新后
# /usr/local 下的目录会被重置掉,但现在暂时 disable readonly 来「欺骗」安装脚本
steamos-readonly disable
# 使用 GUIX_ALLOW_OVERWRITE 环境变量来强制向已存在的 /gnu 目录安装
GUIX_ALLOW_OVERWRITE=t bash guix-install.sh

Misc

sudo vim /etc/systemd/system/guix-daemon.service

[Unit]
Description=Build daemon for GNU Guix

[Service]
ExecStart=/var/guix/profiles/per-user/root/current-guix/bin/guix-daemon \
    --build-users-group=guixbuild --discover=yes
Environment='GUIX_LOCPATH=/var/guix/profiles/per-user/root/guix-profile/lib/locale' LC_ALL=en_US.utf8
StandardOutput=syslog
StandardError=syslog

# Work around a nasty systemd ‘feature’ that kills the entire process tree
# (including the daemon!) if any child, such as cc1plus, runs out of memory.
OOMPolicy=continue

# Despite the name, this is rate-limited: a broken daemon will eventually fail.
Restart=always

# See <https://lists.gnu.org/archive/html/guix-devel/2016-04/msg00608.html>.
# Some package builds (for example, [email protected]) may require even more than
# 1024 tasks.
TasksMax=8192

[Install]
WantedBy=multi-user.target

sudo vim /etc/systemd/system/gnu-store.mount

[Unit]
Description=Read-only /gnu/store for GNU Guix
DefaultDependencies=no
ConditionPathExists=/gnu/store
Before=guix-daemon.service

[Install]
WantedBy=guix-daemon.service

[Mount]
What=/gnu/store
Where=/gnu/store
Type=none
Options=bind,ro

sudo GUIX_BINARY_FILE_NAME=/home/deck/guix-binary-1.4.0.x86_64-linux.tar.xz GUIX_ALLOW_OVERWRITE=t bash guix-install.sh

评论