阅读视图

发现新文章,点击刷新页面。
🔲 ⭐

给家里云装上 Fedora 41 KDE 后,我是如何配置的

前两天给自己的 N100 小主机重装成了最近发布的 Fedora 41 ( KDE ),也是花了不少时间把整个系统调成自己熟悉的样子,因此开一篇博客记录一下。以下仅为我个人的 HomeServer 小主机使用,不具有普适性。

换官方源

我这里比较适合用上交的源,直接参考他们的文档

sudo sed -e 's/^metalink=/#metalink=/g' -e 's|^#baseurl=http://download.example/pub/|baseurl=https://mirror.sjtu.edu.cn/|g' -i.bak /etc/yum.repos.d/{fedora.repo,fedora-updates.repo}

加 rpmfusion 源

参考 help.cernet.edu.cn 提供的文档

安装源配置文件

sudo yum install --nogpgcheck https://mirror.sjtu.edu.cn/rpmfusion/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirror.sjtu.edu.cn/rpmfusion/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

换源

sudo sed -e 's!^metalink=!#metalink=!g' \
         -e 's!^mirrorlist=!#mirrorlist=!g' \
         -e 's!^#baseurl=!baseurl=!g' \
         -e 's!https\?://download1\.rpmfusion\.org/!https://mirror.sjtu.edu.cn/rpmfusion/!g' \
         -i.bak /etc/yum.repos.d/rpmfusion*.repo

dnf 操作默认使用 [Y/n]

sudo sh -c "echo 'defaultyes=True' >> /etc/dnf/dnf.conf"

移除不想要的软件

libreoffice

sudo dnf remove libreoffice*

discover, flatpak

sudo dnf remove discover flatpak

podman

sudo dnf remove podman

关闭 selinux

sudo sed -i "s|SELINUX=enforcing|SELINUX=disabled|" /etc/selinux/config

vlc,mpv,ffmpeg (补全大部分编码器)

sudo dnf install vlc mpv ffmpeg --allowerasing

docker

sudo dnf install docker

rustdesk

直接去官方的 Github Release 下载安装包

sudo dnf install https://github.com/rustdesk/rustdesk/releases/download/1.3.2/rustdesk-1.3.2-0.x86_64.rpm

尽管 Rustdesk 支持被控端使用 wayland,但因为权限原因需要被控端手动选择被控区域,不适合无人值守的环境,因此还是要换 x11。

安装 x11 支持

sudo dnf install plasma-workspace-x11

使用 x11 启动 sddm

sudo sed -i "s|^#DisplayServer=wayland|DisplayServer=x11|" /etc/sddm.conf

开发相关

sudo dnf install gcc g++ python3-devel

解除 systemd-resolved 53 端口占用

编辑 /usr/lib/systemd/resolved.conf,取消注释,yes 改 no

[Resolve]
# Some examples of DNS servers which may be used for DNS= and FallbackDNS=:

//...

#DNS=
#FallbackDNS=
#Domains=
#DNSSEC=no
#DNSOverTLS=no
#MulticastDNS=yes
#LLMNR=yes
#Cache=yes
#CacheFromLocalhost=no
-#DNSStubListener=yes
+DNSStubListener=no
#DNSStubListenerExtra=
#ReadEtcHosts=yes
#ResolveUnicastSingleLabel=no
#StaleRetentionSec=0

配置 fcitx5

sudo dnf install fcitx5-chinese-addons kcm-fcitx5 fcitx5-autostart

在 设置 - 输入法 中添加拼音

安装词库

https://github.com/felixonmars/fcitx5-pinyin-zhwiki

https://github.com/outloudvi/mw2fcitx

在 wayland 下使用

参考 处理 fcitx5 的文字候选框在 tg 客户端上闪烁的问题

if [ ! "$XDG_SESSION_TYPE" = "tty" ]   # if this is a gui session (not tty)
then
    # let's use fcitx instead of fcitx5 to make flatpak happy
    # this may break behavior for users who have installed both
    # fcitx and fcitx5, let then change the file on their own

    export INPUT_METHOD=fcitx
    export GTK_IM_MODULE=fcitx
    export QT_IM_MODULE=fcitx
    export XMODIFIERS=@im=fcitx
fi
+if [ "$XDG_SESSION_TYPE" = "wayland" ]
+then
+        unset QT_IM_MODULE
+fi

然后仍然要去 设置 - 键盘 - 虚拟键盘 中选中 fcitx5

安装 vscode

sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" | sudo tee /etc/yum.repos.d/vscode.repo > /dev/null
sudo dnf install code

网络优化工具

禁用防火墙

sudo systemctl disable firewalld --now

RPM 构建

参考 以 Archlinux 中 makepkg 的方式打开 rpmbuild

🔲 ⭐

将 Rustdesk 中继服务从 Arch Linux 迁移至 Debian

这次迁移主要是两方面原因,一来是我安装了 Arch Linux 的 VPS 要过期了,续费价格过高,没有续费的动力;二来是手上的 VPS 越来越多,逐渐意识到 Arch Linux 作为滚动发行版,每次安装新的软件都要 Syu 甚至重启系统,实在没有太多的精力去维护,这也是为什么 Arch Linux 仅适合桌面发行版。

原本在 Arch Linux 上部署的 rustdesk server 我是按照这篇文章「(水文)在archlinux上部署rustdesk服务端」部署的。本身没什么技巧,直接从 AUR 安装现成的 rustdesk-server-bin,使用 systemctl 启用 rustdesk-server-hbbr.servicerustdesk-server-hbbs.service 两个服务即可。

Rustdesk 现在为 Debian 提供了官方的中继服务器的 deb 包,而谷歌搜了一圈都是下载 zip 包使用 pm2 管理进程,故写下此文。

备份原服务器的 rustdesk 密钥

AUR 上的安装方案将密钥放在 /opt/rustdesk-server/data 直接用 sftp 获取 id_ed25519id_ed25519.pub 两个文件就行。如果是新部署的没有这两个文件也没事,rustdesk 服务在启动时可以自动创建,只不过需要在客户端重新输入公钥。

sftp> get /opt/rustdesk-server/data/id_ed25519
sftp> get /opt/rustdesk-server/data/id_ed25519.pub

在新服务器上下载 deb 包,进行安装

apt install -y curl jq
version=$(curl -s https://api.github.com/repos/rustdesk/rustdesk-server/releases/latest | jq .tag_name)

hbbr_deb=rustdesk-server-hbbr_${version:1:-1}_amd64.deb
hbbs_deb=rustdesk-server-hbbs_${version:1:-1}_amd64.deb
utils_deb=rustdesk-server-utils_${version:1:-1}_amd64.deb

for deb in $hbbr_deb $hbbs_deb $utils_deb
do
    curl -L https://github.com/rustdesk/rustdesk-server/releases/download/${version:1:-1}/${deb} -o ${deb}
done

dpkg -i $hbbr_deb $hbbs_deb $utils_deb
rm $hbbr_deb $hbbs_deb $utils_deb

简单写了个脚本,仅适用 amd64,也没做异常处理,如果服务器在大陆境内需要自行解决 github 下载时可能出现的网络波动问题。

dpkg 安装结束后默认会启用两个 systemd 服务并开机自启,所以不需要使用 systemctl 手动启用。

替换密钥

将刚刚备份的一个公钥和一个私钥放在 Debian 服务器的相应路径,问题是这个路径在哪里呢?

通过翻看 rustdesk 的 service 文件,我们大概可以定位到是在 /var/lib/rustdesk-server/ 路径下的

service 问价你

直接对两个密钥文件进行替换,重启 rustdesk 相关的两个 service 服务即可。

密钥文件

开放服务器防火墙

需要开放如下端口,记得 Linux 的防火墙和云服务供应商面板(如果有的话)上都要开放

  • TCP(21115, 21116, 21117, 21118, 21119)
  • UDP(21116)

客户端设置

id_ed25519.pub 对应客户端中需要输入的 Key,大概长成下面这个样子

rdtxujYccRLXwXOu2KR3V9cGgP51lEdSmE0HJHGNkn4=

ID 服务器直接输入中继服务器的 ip 或者解析到对应 ip 的域名即可,另外两个地址可以不填,RustDesk会自动推导(如果没有特别设定)

成果展示

成果展示

参见

🔲 ⭐

使用动态公网 ip + ddns 实现 rustdesk 的 ip 直连

最近跟风整了一台 n100 的迷你主机装了个 Archlinux 当 HomeServer,搭配上了显卡欺骗器,平常一直远程使用,因此需要实现稳定的远程桌面连接。开源软件 Rustdesk 本身对 Linux 的适配尚可,可惜官方提供的服务器位于境外,且前一阵子因为诈骗相关的风波使得官方对连接做出了一些限制,应当使用自建服务器或者 ip 直连。

单从网络安全的角度出发,最佳实践应该是通过 wireguard 或者别的协议先接入局域网,然后使用局域网内的 ip 直连,这是最稳妥的,但我有点懒,而且我可能会在多个设备上都有控制 HomeServer 的需求,给所有设备配置 wireguard 是一件挺麻烦的事情,因此我决定放弃安全性,直接公网裸奔。

在学校宿舍的电信宽带提供了一个动态公网 ip,因此只需要设置好 ddns 和端口转发就可以拿到一个固定的 domain + port 提供给 rustdesk 直连。

在被控端 Rustdesk 允许直连访问

在「设置」中的「安全」一栏选择「解锁安全设置」,拉到最下面的「安全」栏,勾选「允许 IP 直接访问」,并选择一个端口,范围在 1000 ~35535 之间且不要被本地的其他程序占用,Rustdesk 的默认值为 21118。

可以直接在局域网内的另一台设备进行测试,直接在 Rustdesk 中输入被控端的局域网 ip 和刚刚设置的端口,看看能不能访问得通,如果不行可能需要排查一下被控端访问墙设置的问题。

ddns

由于我的域名是交给 cloudflare 进行解析的,就找了个支持 cloudflare 的 ddns 脚本,大致的部署过程可以参考 「自建基于Cloudflare的DDNS」,不过我小改了一下脚本中获取公网 ipv4 的方式,直接 ssh 到路由器上获取当前的 ipv4 地址,不依赖外部的服务。

WAN_IP=`ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa root@192.168.1.1 'ip -br a' | grep pppoe-wan | awk '{print $3}'`

理论上来说,有不少路由器自身就支持不少域名解析商

端口转发

端口转发需要在路由器的后台设置进行,我这里路由器使用的是 openwrt 系统,大部分路由器应该都支持这个操作。

在「网络」-「防火墙」

选择「端口转发」

新建端口转发,共享名随便填,外部端口是你最终要在主控端输入的端口,内部 IP 地址是被控机 的 IP 地址,可以用 ip -br a 命令看到,内部端口就是上文在 Rustdesk 指定的端口号。

效果

可以直接在主控端口输入 ddns 的域名和端口号,实现远程控制

❌