这学期选了大名鼎鼎的 ICS,在刘杰老师班做 RISC-V 的 PA 实验。写一篇博客,来记录踩过的坑和心路历程。

PA 实验手册可参考:PA 实验手册

PA 0 主要是环境的安装和配置,我采取的方案是 MacOS 用 Windows App 连接阿里云服务器 (Ub
untu 22.04) 做实验。本来以为在计算机网络课上完之后,对配置远程连接已经不在话下。但是还是遇到了一些问题

在希望的道路上,曲曲折折的前进

运行环境搭建

1. 环境准备

  • 云服务器:阿里云 Ubuntu 20.04

  • 用户:kasumi(非 root,避免直接用 root 破坏环境)

    • 之前的计网实验我都是用 root 账户做的,还沾沾自喜不用 sudo 真方便,现在看来是隐患极大的…
  • 桌面环境:xfce 4 + xrdp

    • 配置远程桌面 GUI,是为后面的 PA 需要一些图形化内容做准备。这个方案我的 Windows 和 Mac 都可以很方便访问阿里云的 Ubuntu,很方便我做实验和玩耍
  • 目标:能跑 make menuconfig,配置并启动 PA 框架。


2. 安装和基本配置

(1)依赖安装

1
2
3
sudo apt update
sudo apt install build-essential bison flex libreadline-dev gdb git \
libx11-dev libxext-dev libxft-dev

(2)桌面环境 + 远程

1
sudo apt install xfce4 xfce4-terminal xrdp
  • 修改 /etc/xrdp/startwm.sh,最后几行改成:
1
2
. $HOME/.xsessionrc
startxfce4

我最终使用的大概是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1 #!/bin/sh                           2 # xrdp X session start script (c) 2015, 2017, 2021 mirabilos
3 # published under The MirOS Licence
4
5 # Rely on /etc/pam.d/xrdp-sesman using pam_env to load both
6 # /etc/environment and /etc/default/locale to initialise the
7 # locale and the user environment properly.
8
9 if test -r /etc/profile; then
10 . /etc/profile
11 fi
12
13 # test -x /etc/X11/Xsession && exec /etc/X11/Xsession
14 # exec /bin/sh /etc/X11/Xsession
15
16 exec /home/kasumi/.xsession

3. 第一次坑:make menuconfig.config does not exist!

  • 解决:这是正常提示,只要执行一次 make menuconfig 生成 .config 就行。

4. 第二次坑:Gtk-WARNING **: cannot open display

原因

  • DISPLAY 没有配置好
  • DBus 没有启动,DBUS_SESSION_BUS_ADDRESS 环境变量为空
    • 我在尝试通过远程桌面启动桌面端应用时候,通过指令 sudo journalctl -u xrdp -e 查看错误日志发现的这个错误。

解决方案

~/.xsessionrc 写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

# 设置运行目录
export XDG_RUNTIME_DIR="/run/user/$(id -u)"

# 自动启动 dbus
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
eval "$(dbus-launch --sh-syntax --exit-with-session)"
export DBUS_SESSION_BUS_ADDRESS
fi

# 设置 DISPLAY(一般 xrdp 会自动分配,不写也行)
export DISPLAY=:10 # 这里是看日志查看的你的display

然后重新登录 xrdp 会话。
这一步解决了 xfce 4-terminal 打不开 的问题。


5. 第三次坑:fail to load $DBUS_SESSION_BUS_ADDRESS

原因

  • 没有在 .xsessionrc 里启动 dbus-launch

  • 或者 xrdp session 和 dbus session 不在同一个作用域

解决方案

同样通过 .xsessionrc 写自动启动脚本(见上)。
重新登录之后再用:

1
echo $DBUS_SESSION_BUS_ADDRESS

能看到 unix:abstract=/tmp/dbus-xxxx 这样的路径,就说明成功了。


6. 第四次坑:.xsession vs .xsessionrc

  • .xsession:定义启动桌面会话执行的主程序,比如 exec startxfce4

  • .xsessionrc:放环境变量配置(DBus、XDG、DISPLAY 等),会在 .xsession 之前加载

  • 正确做法:不要把 dbus 配置写到 .xsession,应该写在 .xsessionrc


7. 最终状态检查

1
2
3
4
5
6
7
8
echo $DBUS_SESSION_BUS_ADDRESS
# 输出: unix:abstract=/tmp/dbus-xxxx...

echo $XDG_RUNTIME_DIR
# 输出: /run/user/1000

echo $DISPLAY
# 输出: :10 (或 :11)

能正常打开 xfce4-terminalmake menuconfig 也能弹出界面,说明环境搞定。


总结

这次 PA 0 配置踩的几个关键坑:

  1. menuconfig 缺 .config → 实际是正常情况
  2. cannot open display → 缺少 DISPLAY 和 DBus
  3. DBUS_SESSION_BUS_ADDRESS 丢失 → 需要在 .xsessionrc 启动 dbus
  4. 混淆 .xsession 和 .xsessionrc → 前者执行桌面,后者放环境变量

github clone 不了怎么办?

由于国内网络环境,配置好 ssh 后使用 ssh -T git@github.com ping 不同,总是超时。而密钥已经检查无误,使用 ssh -T git@gitee.com 也可以正常 ping 通,这时想起是不是和 github 的网络连接出现了问题,最后使用 ipaddress 查询 github 的地址写入 host 总算解决了。

国内特殊网络环境主要是用 DNS 污染来阻碍访问 github,我们可以用接代理、写 host 的方式解决。这里采取比较简单的后者,且可以解决我的问题。

具体来说:

查询 github ip 地址

image.png

图中的 140.82.114.4 就是 github 的真正 ip 地址

写入 host 文件

ubuntu 的 host 文件存储在 /etc/hosts 文件中,只需要该文件末尾加一行
``140。82.114.4 (你查询到的地址)<空格> github.com 即可

  • 修改后的示意图
  • image.png

经过测试这样就可以正常 clone ICS 的 github 仓库了。


一些收获

本次 PA 0 还要求阅读关于“怎么提问题”的文章并写读后感,我想对于初次尝试的同学,结合自己配环境的心得和痛苦,还是很有话说的。