这个文章同时作为 Milkv Duo 的白嫖体验文发布在 sophgo 论坛
看到有同志把 Archlinux RISC-V 跑起来了,那 openEuler RISC-V 一定也行
整个过程在 Archlinux 完成,编译过程在 schroot 容器下运行的 Ubuntu 20.04 LTS 完成,环境配置可以参考这篇
构建镜像
这部分在 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
查看设备,可以看到 loop0p1
和 loop0p2
两个分区,其中 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
串口连接
名称 | 脚位 |
---|---|
TX | 16 |
RX | 17 |
GND | 18 |
由于暂时没有焊排针,所以是杜邦线直接插在孔位里面和 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