这个文章同时作为 Milkv Duo 的白嫖体验文发布在 sophgo 论坛

看到有同志把 Archlinux RISC-V 跑起来了,那 openEuler RISC-V 一定也行

整个过程在 Archlinux 完成,编译过程在 schroot 容器下运行的 Ubuntu 20.04 LTS 完成,环境配置可以参考这篇

neofetch

构建镜像

这部分在 Ubuntu 20.04 LTS 容器下完成

mkdir somewhere && cd somewhere
git clone https://github.com/milkv-duo/duo-buildroot-sdk.git
cd duo-buildroot-sdk/

因为我不太了解它依赖哪些 kernel 配置,所以内核配置完全照抄 Milkv-duo 运行 Arch Linux 系统

vim build/boards/cv180x/cv1800b_milkv_duo_sd/linux/cvitek_cv1800b_milkv_duo_sd_defconfig

# 末尾添加
# for openEuler
CONFIG_CGROUPS=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CPUSETS=y
CONFIG_PROC_PID_CPUSET=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_PAGE_COUNTER=y
CONFIG_MEMCG=y
CONFIG_CGROUP_SCHED=y
CONFIG_NAMESPACES=y
CONFIG_OVERLAY_FS=y
CONFIG_AUTOFS4_FS=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EPOLL=y
CONFIG_IPV6=y
CONFIG_FANOTIFY

由于不使用摄像头(内存也无法支持),将 ION_SIZE 设置为 0M

vim build/boards/cv180x/cv1800b_milkv_duo_sd/memmap.py

# line 43
ION_SIZE = 0

由于 openEuler RISC-V 的 rootfs 会比较大,所以增加镜像的根分区大小

vim milkv/genimage-milkv-duo.cfg

# line 16
size = 2048M

一键编译

./build_milkv.sh

最后可以看到编译成功的 log

Gen image successful: out/milkv-duo-20230815-1447.img

将这个镜像复制出来备用

替换 rootfs

从容器退出,拷贝镜像

cp /PATH/TO/CHROOT/duo-buildroot-sdk/out/milkv-duo-20230815-1447.img .
cp milkv-duo-20230815-1447.img milkv-duo-openeuler.img

查看可用的回环设备,我这里输出为 /dev/loop0

sudo losetup -f

绑定设备

sudo losetup /dev/loop0 milkv-duo-openeuler.img

加载分区,可以看到两个分区

sudo kpartx -av /dev/loop0

add map loop0p1 (254:0): 0 262144 linear 7:0 1
add map loop0p2 (254:1): 0 4194304 linear 7:0 262145

查看设备,可以看到 loop0p1loop0p2 两个分区,其中 loop0p2 为根目录分区

ls /dev/mapper/

control  loop0p1  loop0p2

挂载

sudo mkdir /mnt/sd
sudo mount /dev/mapper/loop0p2 /mnt/sd

下载 oErv 23.03 V1

wget https://mirror.iscas.ac.cn/openeuler-sig-riscv/openEuler-RISC-V/preview/openEuler-23.03-V1-riscv64/openeuler-rootfs.tar.gz

删除一切

cd /mnt/sd
sudo rm -r ./*

解压 oErv rootfs

tar zxvf /PATH/TO/openeuler-rootfs.tar.gz

突然报磁盘空间不足,结果 df -i 发现这个 2G 的分区只有 4096 个 inode ,只好重新 mkfs.ext4 再解压

用同样的方法把原来的镜像的第二分区挂载到 /mnt/sd1 ,复制里面的内核模块和脚本

sudo cp -r /mnt/sd1/mnt/system /mnt/sd/mnt
sudo cp /mnt/sd1/etc/run_usb.sh /mnt/sd/etc/
sudo cp /mnt/sd1/etc/uhubon.sh /mnt/sd/etc/
sudo cp /mnt/sd1/etc/init.d/S99user /mnt/sd/etc/init.d/

chroot 进 rootfs (需要 qemu ),放个 neofetch ,安装 dhcp

# 进入 chroot
sudo cp /etc/resolv.conf /mnt/sd/etc/resolv.conf
chroot /mnt/sd

# 安装 neofetch
wget https://github.com/dylanaraps/neofetch/raw/master/neofetch
mv neofetch /usr/bin/
chmod +x /usr/bin/neofetch

# 安装 dhcp 用于 RNDIS
dnf install dhcp
cat <<EOF >> /etc/dhcp/dhcpd.conf
subnet 192.168.42.0 netmask 255.255.255.0 {
        option routers 192.168.42.1;
        range 192.168.42.100 192.168.42.200;
}
EOF
# systemctl enable dhcpd

解挂

sudo umount /mnt/sd
sudo kpartx -d /dev/loop0
sudo losetup -d /dev/loop0

oErv 启动!

烧录镜像,注意镜像路径和目标设备

dd if=/PATH/TO/milkv-duo-openeuler.img of=/dev/sdX bs=4M status=progress
sync

串口连接

名称脚位
TX16
RX17
GND18

由于暂时没有焊排针,所以是杜邦线直接插在孔位里面和 USB 串口连接,接触居然还不错,通信正常

sudo minicom -D /dev/ttyUSB0

然后就起来了!用户 root ,密码 openEuler12#$

[root@openeuler-riscv64 ~]# neofetch
                 `.cc.`
             ``.cccccccc..`                ----------------------
          `.cccccccccccccccc.`             OS: openEuler 23.03 riscv64
      ``.cccccccccccccccccccccc.``         Host: Cvitek. CV180X ASIC. C906.
   `..cccccccccccccccccccccccccccc..`      Kernel: 5.10.4-tag-
`.ccccccccccccccc/++/ccccccccccccccccc.`   Uptime: 52 secs
.cccccccccccccccmNMMNdo+oso+ccccccccccc.   Shell: bash 5.1.9
.cccccccccc/++odms+//+mMMMMm/:+syso/cccc   Terminal: /dev/ttyS0
.cccccccccyNNMMMs:::/::+o+/:cdMMMMMmcccc   CPU: (1)
.ccccccc:+NmdyyhNNmNNNd:ccccc:oyyyo:cccc   Memory: 33MiB / 55MiB
.ccc:ohdmMs:cccc+mNMNmyccccccccccccccccc
.cc/NMMMMMo////:c:///:cccccccccccccccccc
.cc:syysyNMNNNMNyccccccccccccccccccccccc
.cccccccc+MMMMMNyc:/+++/cccccccccccccccc
.cccccccccohhhs/comMMMMNhccccccccccccccc
.ccccccccccccccc:MMMMMMMM/cccccccccccccc
.ccccccccccccccccsNNNNNd+cccccccccccccc.
`..cccccccccccccccc/+/:cccccccccccccc..`
   ``.cccccccccccccccccccccccccccc.``
       `.cccccccccccccccccccccc.`
          ``.cccccccccccccc.``
              `.cccccccc.`
                 `....`

[root@openeuler-riscv64 ~]#

启用 UNDIS

systemctl start S99user
systemctl start dhcpd

需要进一步工作来自动启用 RNDIS ,但是我就先写到这里了

以及,内存不太够了

说实话那个 SD 卡不是很友好,差点把 LED 抠下来

by ISCAS weilinfox