前瞻
本文为了总结在拿到一个新的开发板后具体该如何操作,包括烧录镜像,配置 k3s 所需环境等操作.
烧录镜像
关于烧录操作,无需多言,请关注这篇文章.本文主要说一下镜像问题.
在选择 OS 镜像的时候,由于 riscv 的实验性,往往在阿里云、清华源等知名镜像源并没有提供,通常是中科院自己的镜像源,而有时有些镜像并没有进行稳定的维护; 甚至有的镜像质量并不好,例如 openEuler24 LTS 竟然不提供 wifi 模块.😇
所以经过我的多次尝试(重新烧录镜像配置环境的折磨)我找到了一款适合实验稳定(暂时稳定)操作的 OS 镜像,RevyOS
其适配了 LicheePi 4A 和 Milk-V Meles 正好都是我手上有的设备;虽然同样使用的是中科院的镜像管理,但是据我在其 github 页面的观察,其 issue 的时间在最近较多,回复也蛮及时; 同时 ChangeLog 也有稳定的更新,故以此为后续的实验镜像.
环境搭建
与我们之前想的一样,就像宝塔这样的软件提供了一键部署,一键配置这样的操作,这对重新构建一个开发板上的系统来说真的是很方便;有机会我们可以把下面的操作全部放在一个脚本中,也做到一键操作.
在第二篇文章中我们说过了如何配置适合容器的 OS 环境, 但是后面在实验中还是遇到了些问题,所以这里重新汇总一下.(并且在实验过程中本文会一直更新)
更改 DNS 配置
如果你的 DNS 服务器地址无法正确解析,请修改 DNS 设置为 8.8.8.8,1.1.1.1等静态公用地址
# 换成自己的网络名称
sudo nmcli connection modify "niuma" ipv4.ignore-auto-dns yes ipv4.dns "8.8.8.8 1.1.1.1"
# 重启连接
sudo nmcli connection down "niuma" && nmcli connection up "niuma"
注意,如果你是在 ssh 或者其他远程连接环境下进行这步操作,那么后续会因为 wifi 断开而无法连接,所以我们推荐执行这步操作在有显示器的环境下进行.
Apt
截止2025.05.13,中科院仓库存在 KEY 过期问题,官方给出了解决方案
我采用的是 ChatGPT 给出的方案,在源地址前面加上[trusted=yes],
sudo vi /etc/apt/sources.list 最终结果如下:
deb [trusted=yes] https://fast-mirror.isrc.ac.cn/revyos/revyos-gles-21 revyos-gles-21 main
deb [trusted=yes] https://fast-mirror.isrc.ac.cn/revyos/revyos-addons revyos-addons main
deb [trusted=yes] https://fast-mirror.isrc.ac.cn/revyos/revyos-kernels revyos-kernels main
deb [trusted=yes] https://fast-mirror.isrc.ac.cn/revyos/revyos-base sid main
之后再进行 apt 操作就可以了.(更新,后续还是建议使用官方的解决方案)
sudo sh -c 'gpg --keyserver keyserver.ubuntu.com --recv-keys 2FB3A9E77911527E && \
gpg --export 2FB3A9E77911527E > /etc/apt/trusted.gpg.d/revyos-keyring.gpg'
sudo apt update; sudo apt upgrade -y
在这个过程中如果遇到 gpg: keyserver receive failed: Server indicated a failure这个问题,通常是网络问题,我们需要先更改 DNS,具体见上方 DNS 操作.
GCC等构建所需工具
我们写一个脚本来一键检测并安装可能所需的工具.
#!/bin/bash
set -e
echo "🔍 检测当前系统包管理器..."
if command -v apt >/dev/null 2>&1; then
echo "✅ 使用 apt 安装依赖..."
sudo apt update
sudo apt install -y \
build-essential \
make \
gcc \
git \
curl \
pkg-config \
libseccomp-dev \
btrfs-progs \
iptables \
libapparmor-dev \
libgpgme-dev \
libdevmapper-dev \
libprotobuf-dev \
protobuf-compiler \
libnl-3-dev \
libnl-route-3-dev \
libnet-dev \
libudev-dev \
libsystemd-dev \
libtool \
autoconf \
automake \
rsync \
unzip \
zstd \
socat
elif command -v dnf >/dev/null 2>&1; then
echo "✅ 使用 dnf 安装依赖..."
sudo dnf install -y \
gcc \
gcc-c++ \
git \
make \
curl \
pkgconf-pkg-config \
libseccomp-devel \
btrfs-progs-devel \
iptables \
libapparmor-devel \
gpgme-devel \
device-mapper-devel \
protobuf-devel \
protobuf-compiler \
libnl3-devel \
libnet-devel \
systemd-devel \
libudev-devel \
libtool \
autoconf \
automake \
rsync \
unzip \
socat
else
echo "❌ 无法识别的包管理器,请手动安装依赖。"
exit 1
fi
echo "✅ 所有依赖安装完毕。你现在可以构建 K3s。"
此脚本来自于 ChatGPT.
Git
apt 安装 Git,并配置镜像地址
git config --global url."https://gh-proxy.com/github.com/" .insteadOf "https://github.com/"
cat .gitconfig
得到我们所配置的地址即为正确.
Docker
第一种安装方式:
sudo apt install docker.io
sudo usermod -aG docker $USER
如果这种不行,请使用这种:(后面的加入 root 组操作是相同的)
sudo apt-get install docker docker-compose
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
最终执行 docker images hello-world 检测是否成功.
配置代理镜像:()
# 修改
vi /etc/docker/daemon.json
# 如果没有这个文件,自己手动新建(我当时只有一个key.json文件)
# 将下面内容复制进去
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.linkedbus.com"
]
}
# 加载配置并重启
sudo systemctl daemon-reload
sudo systemctl restart docker
# 尝试拉取镜像
docker pull busybox
docker run hello-world
注意,这里的代理是对 dockerhub 的代理;不会影响到我们的私有仓库. 🥸 对了,fk GFW ! 如果影响到了私有仓库,请暂时放弃代理.
Golang
这里我们统一采用 go1.22.8 linux/riscv64 这个版本.原因见这篇文章,根据当前你的 k8s 版本进行对应变化.
这里默认你已经有了此版本的 tar 文件(我是通过 scp 传过去的)
sudo tar -C /usr/local -xzf go1.22.8.linux-riscv64.tar.gz
sudo vi ~/.bashrc
# Go environment
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$PATH
export GOPROXY=https://goproxy.cn,direct
#
source ~/.bashrc
使用 go version 检查得到 go1.22.8 这个正确版本.
yq
用来解析 YAML 的工具,之前文章中也提到过.
这里我们与 Golang 一样,从源码构建,因为包管理中的版本太老.
wget https://github.com/mikefarah/yq/releases/download/v4.44.6/yq_linux_riscv64.tar.gz
tar -zvxf yq_linux_riscv64.tar.gz
mv yq_linux_riscv64.tar.gz yq
chmod +x yq
mv yq /usr/local/bin
yq --version
如果你之前用 apt 安装了 yq,可能会存在错误的缓存,可以用hash -r清理缓存.
权限问题
为了方便和避免可能出现的权限问题,我们为源码目录赋予 root 权限
sudo chown -R $(whoami):$(whoami) .
访问仓库网络问题
如果我们访问自己的私有仓库时遇到网络问题,特别是 DNS 解析问题,通常是因为 Network Management 自动为我们设置好了 DNS 服务器地址.
而这篇文章中我们谈到了这些 DNS 服务器很难不出问题,特别是在解析国外的服务器时.
所以我们采用一个最简单的方法,修改 /etc/hosts 文件,将服务器的 IP 加入其中.
# 请换成自己的 ip 与 域名
IP Domain
安装与卸载脚本
实验过程中可能出现问题导致 k3s 不能运行,在此情况下如果我们需要删除 k3s 或者重新安装 k3s,这里给出两种操作的脚本.
卸载脚本
将其从 systemd 管理中移除.
#!/bin/bash
set -e
echo "🔧 停止 k3s 服务(如在运行)..."
sudo systemctl stop k3s || true
echo "🚫 禁用 k3s 服务开机自启..."
sudo systemctl disable k3s || true
echo "🧹 删除 k3s systemd 服务文件..."
sudo rm -f /etc/systemd/system/k3s.service
sudo rm -f /etc/systemd/system/k3s.service.env
echo "🔄 重新加载 systemd 守护进程..."
sudo systemctl daemon-reload
echo "✅ 验证 k3s 服务是否已清除..."
sudo systemctl status k3s || echo "✅ k3s.service 已被成功移除。"
echo "🎉 清理完成。"
安装脚本
将其重新加入 systemd 管理,前提是脚本所在路径与 k3s 二进制文件路径一致,不一致请修改脚本.
#!/bin/bash
set -e
echo "📦 拷贝本地 k3s 到 /usr/local/bin ..."
sudo cp /home/debian/k3s /usr/local/bin/k3s
sudo chmod +x /usr/local/bin/k3s
echo "🔧 配置私有镜像仓库 registries.yaml ..."
sudo mkdir -p /etc/rancher/k3s
cat <<EOF | sudo tee /etc/rancher/k3s/registries.yaml
mirrors:
docker.io:
endpoint:
- "https://jimlt.bfsmlt.top"
EOF
echo "📥 获取 k3s 安装脚本 ..."
curl -sfL https://get.k3s.io -o k3s-install.sh
echo "🚀 执行安装脚本,使用本地可执行文件 ..."
INSTALL_K3S_SKIP_DOWNLOAD="true" bash -x k3s-install.sh
对kubectl命令进行优化
以下两种方法对我们日常使用 kubectl 命令带来了方便。
去sudo化
由于默认的 k3s 配置文件在 /etc/rancher/k3s/k3s.yaml,这是一个只有 root 权限才可以访问的路径,这导致每次我们使用 kubectl 命令需要在前面加上 sudo.
所以我们执行以下步骤将配置文件复制到主用户目录下,并配置好环境变量,使 kubectl 命令默认查找主用户目录下的文件。这样就可以不用再加上 sudo
mkdir -p $HOME/.kube
sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
sudo chmod 600 $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config
# 将上面的 export 命令添加到您的 shell 配置文件 (例如 ~/.bashrc 或 ~/.zshrc) 中,使其永久生效
echo 'export KUBECONFIG=$HOME/.kube/config' >> ~/.bashrc # 如果您使用 bash
source ~/.bashrc # 使更改立即生效
使用kubectl-aliases简化
这是一个别名操作,可以让我们不再输入繁杂的 kubectl 命令,例如将 kubectl get pod 可以简化为 kgpo,具体操作也很简单,按照官网的步骤进行即可。
后续更新
后续更新会根据构建 k3s 的进展以及可能的其他应用例如 Mobilenet 进行补充.
这里是LTX,感谢您阅读这篇博客,人生海海,和自己对话,像只蝴蝶纵横四海。