【Debian & Arch Linux On Milkv-duo 256M】Milkv-duo 256M 运行 Debian & Arch Linux 系统 视频教程

Learn RISCV, one of the cheapest development boards that can run Debian & Liunx systems

补充: 2023.12.31 自己编译内存全开 duo256M_linux_Kernel_Memory_240M.zip

neofetch

感谢 @taterli Milkv Duo 的 Debian 移植笔记 Milkv-duo duo-debian-full.7z (519M) Download

感谢 @逆影之风 编译duo256M_linux内核systemd duo256M_linux_Kernel_systemd.zip

感谢 @Judehahh Milkv-duo 运行 Arch Linux 系统

Thanks @Spiritdude ArchLinux_Disk_Image

幸运提早收到 Milk-V duo 256M的测试版,咨询了 @taterli 大神;他告诉我只要更换内核Kernel,不用更改 rootfs 很大可能就能启动,经过测试确实如此。

所以 Milkv-duo 256M 运行 Debian & Arch Linux 系统 就很简单了: 下载 Debian & Arch Linux 镜像和Duo 256M内核

Milkv-duo duo-debian-full.7z (519M) Download
duo256M_linux_Kernel_systemd.zip
ArchLinux_Disk_Image

选择你喜欢的 Linux 系统刷到tf卡,windows下直接打开 tf 卡 boot分区替换 内核文件,就能从 duo 64m 的 linux镜像更新到 duo 256m

duo 256m 内核压缩包里有 Debian & Arch Linux 的 串口启动日志

ArchLinux_boot.log
Duo_256M_Debian_boot.log

下面来分享 昨天晚上的踩坑记录

我使用的是 PL230H芯片的 USB 转 TTL线,Windows 11,软件 Xshell,如图接到开发板引脚。

如果你只有 Duo 64M的旧型号,也可以跟我一起做实验的,因为linux系统固件 rootfs是通用的,只是内核不同。

1. 制作 Arch Linux 根文件系统

wget  https://archriscv.felixc.at/images/archriscv-latest.tar.zst
wget https://github.com/milkv-duo/duo-buildroot-sdk/releases/download/Duo-V1.0.7/milkv-duo256m-v1.0.7-2023-1223.img.zip
unzip milkv-duo256m-v1.0.7-2023-1223.img.zip

Duo 64M: milkv-duo-v1.0.7-2023-1223.img.zip
Duo 256M: milkv-duo256m-v1.0.7-2023-1223.img.zip

  • 将 img 镜像与 loop 设备绑定 挂载 rootfs 分区: 由于镜像是多分区img,所以要 losetup 命令绑定设备后才能挂载,如图式和以下命令就能挂载了, 注意 mount /dev/loop0p2 rootfs/ 命令 使用 loop0p2 表示 镜像中的第二个分区

losetup -f   # 查看 可分配设备号 
losetup -P loop0 milkv-duo256m-v1.0.7-2023-1223.img
mkdir rootfs
mount /dev/loop0p2 rootfs/
cd rootfs/
  • 替换 rootfs 到 arch linux 文件系统: 删除原来 -buildroot 文件,解压成 archriscv-latest 解除 img 设备绑定

cd rootfs/
rm -rf ./*
tar -xvf ../archriscv-latest.tar.zst -C .
umount /dev/loop0p2
losetup -d /dev/loop0

root

  • 到这里 制作 Arch Linux 根文件系统 就完成了,只要把 修改过的 img 刷到tf卡就可以试验了。由于我直接挂载到 /root/duo256m/rootfs ,不知道是否会影响到实际系统,应该建立 /mnt/rootfs 用来挂载会安全点。

2. 串行控制台启动实验

  • USB-TTL模块的每个针脚定义如下

OpenSBI v0.9
Platform Name             : Cvitek. CV181X ASIC. C906.
Boot HART ISA             : rv64imafdcvsux
U-Boot 2021.10 (Dec 23 2023 - 12:57:10 +0800) cvitek_cv181x
DRAM:  254 MiB
MMC:   cv-sd@4310000: 0
Loading Environment from nowhere... OK
In:    serial   Out:   serial  Err:   serial
Warning: ethernet@4070000 (eth0) using random MAC address - 0a:38:56:fe:e5:77
Boot from SD ...
switch to partitions #0, OK
mmc0 is current device
2996348 bytes read in 136 ms (21 MiB/s)

[    1.455518] EXT4-fs (mmcblk0p2): recovery complete
[    1.466136] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[    1.474593] VFS: Mounted root (ext4 filesystem) on device 179:2.
[    1.484446] devtmpfs: mounted
[    1.487655] Freeing unused kernel memory: 144K
[    1.492287] Kernel memory protection not selected by kernel config.
[    1.498802] Run /sbin/init as init process
[    1.503063]   with arguments:
[    1.506156]     /sbin/init
[    1.508981]   with environment:
[    1.512251]     HOME=/
[    1.514693]     TERM=linux
[    1.517525] early_time_log: run_init_process: 6768892us
[    2.287850] systemd[1]: System time before build time, advancing clock.
[    2.322839] systemd[1]: Failed to find module 'autofs4'
[    2.363219] systemd[1]: Failed to mount tmpfs (type tmpfs) on /sys/fs/cgroup (MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_STRICTATIME "mode=0755,size=4m,nr_inodes=1k"): No such file or directory
[    2.382091] systemd[1]: Failed to mount cgroup (type cgroup) on /sys/fs/cgroup/systemd (MS_NOSUID|MS_NODEV|MS_NOEXEC "none,name=systemd"): No such file or directory
[!!!!!!] Failed to mount API filesystems.
[    2.420342] systemd[1]: Freezing execution.
  • What!! 你把tf卡刷好,接好USB-TTL线配置好 Xshell 接上USB电源,正兴奋点亮 Duo 256M 开发板,看到 OpenSBI Cvitek. CV181X ASIC. C906 Boot from SD ,然后就 systemd 错误 Failed to find module,Failed to mount cgroup

3. 修改kernel配置,重新编译 duo256M_linux内核systemd 添加相关所需要的功能(主要是为了满足 systemd 的各种依赖)

git clone https://github.com/milkv-duo/duo-buildroot-sdk.git --depth=1
  • 首先使用默认设置编译一次,会帮你下载完整的sdk和工具链

cd duo-buildroot-sdk/
./build.sh lunch
  • 再进入内核目录,配置内核,打开CGROUP , TIMERFD, SIGNALFD这些都是systemd需要的,也要打开.

cd  ~/duo-buildroot-sdk/linux_5.10
make menuconfig
CONFIG_CGROUPS=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
  • duo256M_linux_Kernel_systemd.zip 有 cvitek_cv1812cp_milkv_duo256m_sd_defconfig ,可以查看设置了哪些选项

  • 然后再次编译内核,把新内核 img镜像中 boot.sd 和 fip.bin 文件替换 tf 卡中同名文件,验证是否编译成功

  • 我是使用 @逆影之风 镜像中提取的新内核,更新 Debian & Arch Linux 的镜像都成功启动。

  • 新内核目前没有全启用内存,好像没有启用 swap

补充: 2023.12.31 自己编译内存全开 duo256M_linux_Kernel_Memory_240M.zip

duo256m

编译参数参考文章 《使用menuconfig配置milkv duo linux kernel》

1 Like

2023.12.31 学会自己编译内核了,编译了一个内存全开内核,可使用内存240M

duo256M_linux_Kernel_Memory_240M.zip

Duo256M 编译内核的动态图记录

duo256

修改内存 240M可用设置

$ git diff  memmap.py
+++ b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/memmap.py
@@ -40,10 +40,10 @@ class MemoryMap:
     # =================
     # Multimedia buffer. Used by u-boot/kernel/FreeRTOS
     # =================
-    ION_SIZE = 75 * SIZE_1M
-    H26X_BITSTREAM_SIZE = 2 * SIZE_1M
+    ION_SIZE = 0 * SIZE_1M
+    H26X_BITSTREAM_SIZE = 0 * SIZE_1M
     H26X_ENC_BUFF_SIZE = 0
-    ISP_MEM_BASE_SIZE = 20 * SIZE_1M
+    ISP_MEM_BASE_SIZE = 0 * SIZE_1M
     FREERTOS_RESERVED_ION_SIZE = H26X_BITSTREAM_SIZE + H26X_ENC_BUFF_SIZE + ISP_MEM_BASE_SIZE

2 Likes