Raspberry Pi 400桌面定制

终于入手了 树莓派Raspberry Pi 400 ,我最初的想法是 在树莓派上运行Chromium OS(FydeOS) ,但是似乎目前的FydeOS的显示输出对我的显示器支持存在问题。加上我主要的目标是想研究 Chromium OS 的结构,所以我准备改成直接在 树莓派Raspberry Pi 4 上编译和构建chromium os。但是,Raspberry Pi 400则想先运行轻量级的精简Linux桌面系统,同时编译 Anbox - 在Linux上运行Android程序 来运行Android程序(ARM架构)。

注解

当前Raspberry Pi OS没有提供官方64位操作系统,所以 树莓派Raspberry Pi 400 运行的是32位操作系统。为了能够充分发挥 树莓派Raspberry Pi 4 的64位架构能力( Raspberry Pi Cluster 使用的是 树莓派Raspberry Pi 4 的8G内存硬件 ),同时构建 ARM架构Kubernetes 集群,在服务器端我使用的是64位Ubuntu ARM版本。

目标

  • 使用官方原生Raspberry Pi OS,但是从 Raspberry Pi OS Lite (字符终端版本) 开始定制,只安装最精简的必要软件

  • 在主机上构建 Anbox - 在Linux上运行Android程序 来运行基础的Android应用程序,以便通过 Android Atlas 来弥补Linux的一些商业应用程序不足

    • 由于虚拟化非常消耗资源,实际我把所有ARM虚拟机都运行在 Raspberry Pi Cluster ,远程运行Android程序

  • 本地开发环境通过Docker来构建

    • 为了能够降低客户端资源消耗,我使用多台树莓派和Jetson Nano构建 ARM架构Kubernetes ,所以容器都运行在服务器端,桌面电脑几乎不需要消耗资源

安装

  • SO EASY - 下载、校验、解压、制作启动TF卡:

    openssl sha256 2021-01-11-raspios-buster-armhf-lite.zip
    unzip 2021-01-11-raspios-buster-armhf-lite.zip
    sudo dd if=2021-01-11-raspios-buster-armhf-lite.img of=/dev/sdc bs=100M
    
  • 通过制作的 Raspberry Pi OS Lite TF卡启动树莓派400,可以看到首次启动会扩容根文件系统,然后重启进入字符终端界面

网路设置

既然我们初始安装的是最简化操作系统,我们所有的定制都需要通过网络,所以我们首先需要配置树莓派连接Internet。

修订主机名

  • 通过 hostnamectl 修订主机名:

    hostnamectl set-hostname pi400
    

静态IP配置

  • 默认 /etc/systemd/network 目录下有一个软链接:

    99-default.link -> /dev/null
    

这个实际上没有启用 systemd-networkd 所以移除:

unlink /etc/systemd/network/99-default.link
  • 使用最精简的配置方法 Systemd Networkd服务 配置静态IP,创建:

    systemctl stop dhcpcd
    systemctl disable dhcpcd
    
  • /etc/systemd/network 目录下创建 10-eth0.network

pi_400_desktop/10-eth0.network
1[Match]
2MACAddress=dc:a6:32:fc:9e:26
3
4[Network]
5Address=192.168.6.9/24
6Gateway=192.168.6.200
  • 启动并激活 systemd-networkd

    systemctl start systemd-networkd
    systemctl enable systemd-networkd
    

DNS解析器配置

使用 systemd-resolved 可以实现DNS解析器管理以及本地DNS服务:

  • 修改 /etc/systemd/resolved.conf :

pi_400_desktop/resolved.conf
1[Resolve]
2DNS=192.168.6.200
  • 启动并激活 systemd-resolved

    systemctl start systemd-resolved
    systemctl enable systemd-resolved
    

启动ssh

  • 启动ssh服务并激活:

    systemctl start ssh
    systemctl enable ssh
    

安装使用screen

为了能够不间断更新,强烈建议使用screen运行运维操作:

apt install screen
  • 配置 ~/.screenrc 如下:

../../../linux/ubuntu_linux/screenrc
 1source /etc/screenrc
 2altscreen off
 3hardstatus none
 4caption always "%{= wk}%{wk}%-Lw%{rw} %n+%f %t %{wk}%+Lw %=%c%{= R}%{-}"
 5
 6shelltitle "$ |bash"
 7defscrollback 50000
 8startup_message off
 9escape ^aa
10
11termcapinfo xterm|xterms|xs|rxvt ti@:te@ # scroll bar support
12term rxvt # mouse support
13
14bindkey -k k; screen
15bindkey -k F1 prev
16bindkey -k F2 next
17bindkey -d -k kb stuff ^H
18bind x remove
19bind j eval "focus down"
20bind k eval "focus up"
21bind s eval "split" "focus down" "prev"
22vbell off
23shell -bash
  • 然后执行 screen -S works 启用一个远程控制台,就可以继续执行系统升级更新等操作

操作系统更新

  • 操作系统更新:

    apt update
    apt upgrade
    

备份镜像

安装和更新树莓派操作系统是一个比较繁琐的过程(墙内更新树莓派网速非常慢),由于我考虑可能会不断推倒重装,所以考虑在更新完成后先做一次镜像备份。另外,如果需要维护大量的服务器,则可以采用自建Ubuntu软件仓库镜像或者 CentOS本地HTTP软件仓库 来实现大规模操作系统更新。

  • 将TF卡再次插入读卡器,通过以下命令进行备份:

    dd if=/dev/sdc bs=100M status=progress | xz | dd of=raspios-lite.img.xz
    

不过,上述方法对于128G的U盘并不友好,实际上是完全浪费了大量的空间(实际备份数据只有1.3GB)。我想到一个比较好的方法是,直接通过修改官方下载的镜像:先将镜像挂载到本地,然后通过chroot方式进入,更新和修订配置。这样得到的镜像可以直接使用。

注解

How to dd a remote disk using SSH on local machine and save to a local disk 提供了一个远程dd备份的方法可以参考:

ssh user@remote "dd if=/dev/sda | gzip -1 -" | dd of=image.gz

警告

实践发现这种 dd 方式备份效率实在太低,最终我放弃了这个方法。备份建议采用 通过tar备份和恢复Linux系统

修订时区localtime

默认安装完成raspios系统, localtime 时区是 London 修改修订成本地时区,例如 Shanghai

unlink /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

然后通过 date 命令检查一下时间,看看是否正确显示本地时间。

键盘布局

在国内购买的树莓派默认使用US键盘布局,但是树莓派是英国开发的,默认操作系统键盘布局是UK。请参考 How to Change your Keyboard Layout on Raspberry Pi? (Raspbian) 调整键盘布局。

但是,我遇到一个非常奇怪的 Keyboard Layout之谜 ,虽然我通过 raspi-config 配置了 us 类型键盘,但是英文输入时却发现键盘表现为 uk 布局。

原因是输入法 fcitx 默认添加了一个 uk 类型的keyboard,这个配置不在系统配置中,所以不管我怎么调整都无效。详细设置见 Keyboard Layout之谜

基础桌面

我最中意的桌面是轻巧兼功能的 xfce ,同样在 Jetson运行Xfce4桌面 ,现在在Raspberry Pi 400上我也采用Xfce4

apt install xfce4
  • 在用户目录添加 ~/.xinitrc 内容如下:

    exec startxfce4
    
  • 这样就可以通过 startx 命令启动进入桌面

无线设置

首次使用Raspberry Pi 400,终端会提示:

Wi-Fi is currently blocked by rfkill.
Use raspi-config to set the country before use.

raspi-config树莓派工具 是一个终端交互配置工具,非常方便设置一些系统功能。上述提示表明,在启用Wi-Fi之前,首先需要设置 WLAN Contry ,这是因为 5GHz WiFi需要明确设置 country=CN 才能激活使用。 ( 使用wpa_supplicant连接无线网络 实践中可以看到必须设置 country=CN ,如果使用 netplan网络配置 配置,则需要配置 /etc/default/crda 设置项 REGDOMAIN=CN )

应用软件

  • 终端

默认安装的终端是 uxterm ,但是对中文字体显示不友好。所以还是安装Xfce4的默认终端:

apt install xfce4-terminal
  • 浏览器

默认安装的Xfce4桌面已经具备了一些基础软件,不过还需要浏览器。我比较倾向于使用开源的firefox,但是实际工作中很多业务网站已经完全chrome化了(就像当年微软的IE强制使用特殊的功能),导致不得不同时安装两个浏览器:

apt install firefox-esr chromium

firefox-esrExtended Support Release (ESR)

如果需要切换默认浏览器,则执行:

sudo update-alternatives --config x-www-browser
  • 安装中文字体(文泉驿微米黑)和输入法fcitx:

    apt install fonts-wqy-microhei fcitx fcitx-googlepinyin
    

安装fcitx会安装很多依赖软件包,主要是针对qt和gtk的库,非常庞大。如果不需要中文输入,仅仅作为中文浏览可以不安装。

  • 修订 .xinitrc

    export GTK_IM_MODULE=fcitx
    export QT_IM_MODULE=fcitx
    export XMODIFIERS=@im=fcitx
    exec fcitx &
    exec startxfce4
    
  • 重新登陆Xfce4桌面,然后执行 fcitx-configtool 命令进行配置。

  • 安装 Synergy:主机间共享键盘鼠标

  • 安装 VS Code

  • 安装音乐播放软件, 截图和图片浏览:

    apt install audacious flameshot mupdf ristretto