树莓派安装配置Manjaro Linux

引言

买了很久的树莓派一直没有充分用起来,最近觉得不能再让它继续吃灰了。想在树莓派上安装Manjaro Linux,并且开启xrdp远程桌面,把配置的过程做一个记录,便于以后参考。

配置简介

硬件

  1. 树莓派4b 8GB内存版
  2. 固态U盘(256GB)

选用固态U盘是因为,与micro SD卡相比,能够获得更高的读写速度,有助于提升系统的性能。

软件

  1. Manjaro Linux 22.12 minimal
  2. KDE Plasma 5
  3. xrdp相关组件

基本流程

graph LR;
	imager[烧录镜像] --> install[安装Manjaro Linux] --> kde[安装KDE Plasma] --> rdp[配置远程桌面]

说明:

  1. 镜像烧录到前面准备的U盘,而不是micro SD卡;
  2. 通过SSH安装Manajaro Linux minimal版。

具体配置过程说明如下。

配置步骤

Manjaro Linux 安装

因为我的树莓派没有外接显示器,所以只能通过SSH远程来安装。

烧录镜像

  • 烧录软件:使用树莓派官方提供的Raspberry Pi Imager
  • 选择镜像:打开Imager,选择Manjaro Arm Minimal 22.12。
  • 选择SD卡:打开Imager,选择插上的U盘即可。
  • 点击烧录即可。

SSH安装Minimal版本

根据Manjaro的官方说明,Manjaro ARM 从22.02版本开始引入Calamares作为初次安装工具。由于Calamares是基于QT的图形应用,所以无法通过命令行安装,因此Manjaro ARM的桌面版本不再支持SSH安装,只能通过SSH安装Minimal版本。具体可参见:

https://forum.manjaro.org/t/manjaro-arm-22-02-released/104156

image-20230105201349303

树莓派联网

将烧录好系统镜像的U盘插到树莓派的USB 3.0接口,插上电源和网线,启动树莓派。如果是路由器下的局域网可以通过路由器查看树莓派的IP地址。另外,也可以使用nmap等端口扫描工具查找树莓派的地址。

以nmap为例,具体命令为:

1
nmap -sn 192.168.1.0/24 | grep -B 2 Pi

image-20230105220230370

  • -sn为仅进行主机发现,不进行端口扫描;
  • 192.168.1.0/24为所在局域网网段;
  • grep -B 2 Pi为找到"Pi"所在的行及其前两行。

说明:

  1. 可以通过网线将计算机与树莓派直连,直接找到树莓派的IP地址;

  2. 在进行主机扫描时,可能不一定有"Raspiberry Pi"的主机名,这个时候可以根据MAC地址来匹配:

    image-20230105221030820

找到树莓派的IP地址后,就可以通过SSH连接树莓派,使用的用户名为root,密码为空,仅初始安装有效

1
ssh root@raspi_ip # raspi_ip为树莓派的IP地址

系统安装

SSH连接上树莓派后,会自动进入安装界面。主要包括:

  1. 选择键盘布局(使用us键盘布局)
  2. 输入用户名
  3. 添加用户组(默认即可)
  4. 设置密码
  5. 设置用户全名
  6. 选择时区(中国大陆选择Asia/Shanghai
  7. 选择语言(简体中文为zh_CN.UTF-8
  8. 输入主机名
  9. 确认信息

以下是部分安装截图

选择键盘布局

确认信息

如果信息准确无误,就可以选择Yes,树莓派将会完成安装并重启,等待几分钟,让树莓派完成重启。如果需要修改,选择No,安装会回到第一步重新开始。

源与包管理

设置更新源

与其他linux类似,Manajaro Linux安装完后也需要设置更新源,稍微有些区别的是Manjaro ARM的源包括几个部分:

  • 基本镜像源

    1
    sudo pacman-mirrors -i -c China -m rank

    image-20230106113806735

  • archlinuxarm源

    编辑 /etc/pacman.d/mirrorlist, 在文件的最顶端添加:

    1
    Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/$arch/$repo
  • archlinuxedu源

    Arch4edu 是面向高校用户推出的非官方软件仓库, 支持 Arch Linux 和 Arch Linux ARM, 主要包含高校用户常用的科研、教学及开发软件。

    • 导入 GPG key
    1
    2
    3
    # pacman-key --recv-keys 7931B6D628C8D3BA
    # pacman-key --finger 7931B6D628C8D3BA
    # pacman-key --lsign-key 7931B6D628C8D3BA
    • /etc/pacman.conf 文件末尾添加以下内容:
    1
    2
    [arch4edu]
    Server = https://mirrors.tuna.tsinghua.edu.cn/arch4edu/$arch
  • archlinuxcn源

    Arch Linux 中文社区仓库 是由 Arch Linux 中文社区驱动的非官方用户仓库。包含中文用户常用软件、工具、字体/美化包等。

    /etc/pacman.conf 文件末尾添加以下两行:

    1
    2
    [archlinuxcn]
    Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch

    之后安装 archlinuxcn-keyring 包导入 GPG key。

    image-20230106114525271

添加完源之后,更新pacman数据库以及整个系统

1
2
sudo pacman-mirrors -g #更新源列表
sudo pacman -Syyu

image-20230106114815463

安装yay

pacman是Arch/Manjaro Linux的官方包管理器,yay是一个第三方包管理器, 除了能够查询安装官方包以外,还可以安装AUR仓库的软件。后面在安装xrdp时会用到。使用pacman安装yay:

1
sudo pacman -S yay

yay会优先使用pacman搜索和安装软件包,pacman找不到才会去aur找,如果一个包同时存在于pacman和aur,用yay和用pacman的效果是一模一样的。总结一下 yay 安装软件的方式:

1
2
3
yay -S onlyoffice-bin              # 如果仓库有就安装,没有才从 AUR 安装
yay -S onlyoffice-bin --repo # 只从仓库安装
yay -S onlyoffice-bin --aur # 只从 AUR 安装,--aur 可简写为 -a

安装桌面环境

如果只是将树莓派作为一个服务器使用,实际上是可以不用安装桌面环境的,不过我还是想体验下。Manjaro ARM Linux本身也支持多种桌面环境,包括:

  • KDE Plasma 5
  • Xfce
  • GNOME 3
  • LXDE
  • MATE
  • Cinnamon
  • ……

我选择了KDE Plasma 5

安装KDE基本环境

1
sudo pacman -S plasma kio-extras

安装完基本环境以后,已经可以登录GUI界面,但是如果打开发现基本没什么可用的应用,还需要手动添加各种应用。如果只是为了省事,还可以直接安装KDE应用。

安装过程中有些软件包需要选择,我都是直接选择了1。

image-20230106121047925

安装KDE应用

1
sudo pacman -S kde-applications

KDE应用及其依赖大概有400多个包,大小有3个多G。

image-20230106121257978

安装中文字体

在安装Manjaro Linux的时候,如果选择了中文环境,那么安装好KDE桌面环境以后,很可能无法正常显示,而是一个个的方框,这是因为系统缺少中文字体,解决的办法也很简单:

1
sudo pacman -S wqy-microhei

注销重新进入桌面环境就可以了。

注意:

KDE Plasma 5内置了SDDM作为Dispaly Manager,并且官方推荐使用。但是实际上如果只是为了使用远程桌面,我们并不需要启用SDDM,直接通过startx进入图形界面即可。所以后来实际上我把SDDM相关的包都移除了。

配置远程桌面

我在以前的一篇文章"Mac、Linux、Windows远程桌面工具推荐"里曾经总结过各种不同的远程桌面工具。对于Linux常见的免费方案包括RDP和VNC两类,从体验上来看基于RDP的更加流畅。所以我也想为Manjaro ARM Linux配置xrdp服务,从而可以通过RDP远程访问。之前主要是基于Ubuntu的GNOME桌面配置xrdp,基于KDE还是第一次。网上有些资料,但不是很多,幸运的是还是成功了。

安装xrdp相关包

  • xrdp和xorgxrdp-git

    xrdp 是一个微软远程桌面协议(RDP)的开源实现,它允许你通过图形界面控制远程系统。而xorgxrdp-git则是xrdp使用xorg的驱动。

    如果安装的是xorgxrdp-git是直接从GitHub下载,需要配置上网方式;如果安装xorgxrdp应该不需要(我没有试过)。

    注意:编译安装过程中会提示xorgxrdp-git可能与当前系统架构(aarch64)不兼容,但是仍然要继续编译。

    Should be possible to just add aarch64 to the arch=() line in the PKGBUILD and then build it.

    https://forum.manjaro.org/t/an-arm64-version-of-xrdp/62352/2

    1
    yay -S aur/xrdp aur/xorgxrdp-git

    image-20230106164419048

  • xorg

    安装好xrdpxorgxrdp-git以后,我尝试启动,结果虽然能够连接到RDP服务,但是一旦登录就会闪退,查了一下才发现,我的系统里根本没有xorg。

    xrdp本身不具备桌面服务功能,需要和图形化桌面配合,而xorg是X11的一个实现,提供一个X server,为xrdp提供桌面服务。在Ubuntu GNOME中xorg是默认的,但是在我安装的Manjaro ARM LInux Minimal + KDE Plasma 5中,需要手动安装。我们后面会以xorg的方式登录xrdp。

    首先移除SDDM:

    1
    sudo pacman -Rsnc sddm sddm-kcm

    image-20230106163327145

    然后安装xorg:

    1
    sudo pacman -Sy xorg

    image-20230106163201894

  • xorg-xinit

    xinit程序允许用户手动启动 Xorg 显示服务器。startx 脚本是 xinit 的一个前端。可以用 xinit 在没有窗口管理器的情况下运行 GUI 应用程序。

    image-20230106164021232

复制配置文件

根据网上的说明,为了正常启动需要修改~/.xinitrc文件,但是在我的用户文件夹下并没有这个文件。可能的原因也是我安装的是Minimal版本再安装桌面环境,再安装xorg相关程序,所以没有这个文件。

安装好xorg-xinit以后,会有/etc/X11/xinit/xinitrc这个文件,可以复制到用户文件夹下:

1
cp /etc/X11/xinit/xinitrc ~/.xinitrc

但是,进一步地又发现,这个文件中没有许多资料中提到的get_session()等函数,而如果想要这样的.xinitrc文件可以到Manjaro官方的GitLab项目中复制,具体参见:

https://gitlab.manjaro.org/profiles-and-settings/desktop-settings/-/blob/master/community/mate/skel/.xinitrc

(好像安装manjaro-kde-settings也可以,但是我没有试过)

~/.xinitrc 可以方便地在X服务器启动时运行依赖于X的程序并设置环境变量。如果它存在于用户的主目录中,startxxinit 会执行它。否则 startx 将运行默认的/etc/X11/xinit/xinitrc

修改配置

在完成了前面的准备工作以后,才是修改配置实现RDP远程桌面的重头戏。

  1. 允许任何人启动X Server

    allowed_users=anybody 添加到 /etc/X11/Xwrapper.config 以允许任何人启动 X 服务器。

    如果/etc/X11/Xwrapper.config不存在则需要先创建一个。

  2. 防止黑屏

    连接成功后黑屏的原因可能是D-Bus 未正确初始化造成的。两种修改方案:

    • 修改/etc/xrdp/starwm.sh

      1
      2
      3
      4
      5
      6
      7
      # arch user
      if [ -r ~/.xinitrc ]; then
      #. ~/.xinitrc # <-- Do not call this line; it will crash
      eval $(dbus-launch --sh-syntax) # Add these 2 lines, in order to...
      startplasma-x11 # ...start plasma directly instead of calling . ~/.xinitrc
      exit 0
      fi

      从这个命令可以看出来,其实质时根据~/.xinitrc来判断是Arch User,然后直接执行命令。

    • 修改~/.xinitrc

      • 如果是从GitLab下载的Manjaro 提供的~/.xinitrc,则需要修改两处:

        1
        2
        #DEFAULT_SESSION=startkde                 # <-- bug, the startkde command no longer exists
        DEFAULT_SESSION=startplasma-x11

        以及

        1
        2
        3
        get_session(){
        #local dbus_args=(--sh-syntax --exit-with-session) # <-- the '--exit-with-session' flag causes hang
        local dbus_args=(--sh-syntax)
      • 如果是从/etc/X11/xinit/xinitrc复制过来的,则是:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        # 注释掉最后5行
        #twm &
        #xclock -geometry 50x50-1+1 &
        #xterm -geometry 80x50+494+51 &
        #xterm -geometry 80x20+494-0 &
        #exec xterm -geometry 80x66+0+0 -name login

        # 然后添加我们的配置
        eval $(dbus-launch --sh-syntax)
        startplasma-x1

    还有一种黑屏,我在Ubuntu曾经遇到过,是因为在本地和远程使用同一个账号登录桌面造成的,具体参见:

    https://c-nergy.be/blog/?p=16682

  3. 其他

    • 通过修改 /etc/xrdp/xrdp.ini 可以高度自定义会话管理器 ,例如远程桌面的端口号。
    • 用于启动 XorgXvnc 显示服务器的参数可以在 /etc/xrdp/sesman.ini 中配置。

启动服务

配置完成,启动相关服务

1
2
3
4
sudo systemctl enable xrdp
sudo systemctl enable xrdp-sesman
sudo systemctl start xrdp
sudo systemctl start xrdp-sesman

连接测试

使用RDP客户端,例如Windows自带的mstsc.exe,输入树莓派的IP地址和端口号。

image-20230106211145602

image-20230106211322240

大功告成!

至于体验效果,我只能说一般。

小结

以上是在树莓派上通过SSH安装Manjaro Linux、KDE Plasma 5桌面环境并配置xrdp远程桌面的完整过程。通过这个过程,对xrdp的相关机制更加熟悉了。

参考资料

  1. https://xgjuice.top/archives/1279

  2. 树莓派使用网线直连电脑的方法

  3. Host Discovery Controls | Nmap Network Scanning

  4. https://www.cnblogs.com/wangkongming/p/3684905.html

  5. https://udger.com/resources/mac-address-vendor-detail?name=raspberry_pi_foundation

  6. manjaro 切换国内源及软件安装

  7. https://wiki.archlinux.org/title/xinit

  8. How to make Manjaro (KDE 5) work as a xrdp server?

  9. https://wiki.archlinux.org/title/xrdp

  10. https://rajasekaranp.medium.com/how-to-setup-xrdp-in-manjaro-linux-e176b22bd347

  11. xRDP – xRDP shows only black screen after authentication windows – HowTo Fix !

  12. https://wiki.manjaro.org/index.php/Proper_~/.xinitrc_File

  13. 抛弃DisplayManager,拥抱startx

  14. /etc/X11/xinit/xinitrc missing on Arch linux