milkv-duo256m ubuntu 系统构建与运行

Ubuntu 系统提供的 debootstrap 工具可以帮助我们快速创建指定架构的根文件系统。本次是在 Ubuntu 22.04 使用 debootstrap 工具来创建基于 Ubuntu 22.04 系统的根文件系统,并下载、编译 duo-buildroot-sdk 后更新文件系统,生成 image 文件,并在 Milk-V Duo256M 上运行。

debootstrap

在 Ubuntu 系统里有一个 debootstrap 的工具,可以帮助我们快速制作指定架构的根文件系统。debootstrap 命令最早源自 debian 系统,用来引导一个基础 Debian 系统(一种符合 Linux 文件系统标准(FHS)的根文件系统)。

  1. 安装依赖
shell 复制代码
$ sudo apt-get update
$ sudo apt-get install -y wget git make build-essential libtool rsync ca-certificates joe --no-install-recommends
  1. 安装 duo-buildroot-sdk 编译依赖
shell 复制代码
$ sudo apt-get install -y pkg-config build-essential ninja-build automake autoconf libtool wget curl git gcc libssl-dev bc slib squashfs-tools android-sdk-libsparse-utils jq python3-distutils scons parallel tree python3-dev python3-pip device-tree-compiler ssh cpio fakeroot libncurses5 flex bison libncurses5-dev genext2fs rsync unzip dosfstools mtools tcl openssh-client cmake expect
  1. 安装 debootstrap 工具
shell 复制代码
$ sudo apt install -y debootstrap qemu qemu-user-static binfmt-support dpkg-cross --no-install-recommends
$ sudo update-ca-certificates

编译 duo-buildroot-sdk

  1. 下载源码
shell 复制代码
$ git clone https://github.com/milkv/duo-buildroot-sdk.git --depth=1
$ cd duo-buildroot-sdk
$ wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/16/host-tools.tar.gz
$ tar -xf host-tools.tar.gz
  1. 为了满足 Ubuntu 需要的 systemd 相关依赖,修改 kernel 配置,添加相关所需要的功能。
shell 复制代码
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
CONFIG_ZSMALLOC=y
CONFIG_ZRAM=y

想上诉配置添加到内核配置文件 build/boards/cv181x/cv1812cp_milkv_duo256m_sd/cv1812cp_milkv_duo256m_sd_defconfig 中。

  1. 修改打包 cfg 文件

修改 device/milkv-duo256m-sd/genimage.cfgimage rootfs.ext4 部分设置 size = 1G

shell 复制代码
image rootfs.ext4 {
	ext4 {
		label = "rootfs"
	}
	size = 1G
}
  1. 编译
shell 复制代码
$ ./build.sh milkv-duo256m-sd

生成根文件系统

使用 debootstrap 制作根文件系统会分成两个阶段。

第一阶段

使用 debootstrap 命令来下载软件包,生成最小 bootstrap rootfs

shell 复制代码
$ sudo debootstrap --arch=riscv64 --foreign jammy ./ubuntu-rootfs http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports

其中:

  • --arch:指定要制作文件系统的处理器体系结构, 比如 riscv64
  • jammy: 指定 ubuntu 的版本。 jammy 是 ubuntu 22.04 系统。
  • ubuntu-rootfs: 本地目录, 最后制作好的文件系统会在此目录。
  • --foreign: 只执行引导的初始解包阶段,仅仅下载和解压。
  • http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports: ubuntu 镜像源地址。

第二阶段

需要安装软件包。

因为主机跑在 x86 架构上,而我们要制作的文件系统是跑在 riscv64 上,因此可以使用 qemu-riscv64-static 来模拟成 riscv64 环境的执行环境。

shell 复制代码
$ sudo cp -rf /usr/bin/qemu-riscv64-static ubuntu-rootfs/usr/bin/

使用 debootstrap 命令进行软件包的安装和配置:

shell 复制代码
$ sudo chroot ubuntu-rootfs /bin/bash
$ /debootstrap/debootstrap --second-stage

其中命令参数 --second-stage 表示执行第二阶段的安装。

bash 复制代码
I: Configuring python3...
I: Configuring python3-gi...
I: Configuring python3-netifaces:riscv64...
I: Configuring lsb-release...
I: Configuring python3-pkg-resources...
I: Configuring python3-dbus...
I: Configuring python3-apt...
I: Configuring python3-yaml...
I: Configuring netplan.io...
I: Configuring ubuntu-advantage-tools...
I: Configuring networkd-dispatcher...
I: Configuring kbd...
I: Configuring console-setup-linux...
I: Configuring console-setup...
I: Configuring ubuntu-minimal...
I: Configuring libc-bin...
I: Configuring ca-certificates...
I: Base system installed successfully.

显示 I: Base system installed successfully. 这句话,说明第二阶段已经完成。

配置根文件系统

添加源

shell 复制代码
cat >/etc/apt/sources.list <<EOF
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports jammy main restricted

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports jammy-updates main restricted

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports jammy universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports jammy-updates universe

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports jammy multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports jammy-updates multiverse

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports jammy-backports main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports jammy-security main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports jammy-security universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports jammy-security multiverse
EOF

安装软件包

shell 复制代码
apt update
apt install --no-install-recommends -y util-linux haveged openssh-server systemd kmod \
                                       initramfs-tools conntrack ebtables ethtool iproute2 \
                                       iptables mount socat ifupdown iputils-ping vim dhcpcd5 \
                                       neofetch sudo chrony wget net-tools joe less

配置网络

shell 复制代码
$ mkdir -p /etc/network
cat >>/etc/network/interfaces <<EOF
auto lo
iface lo inet loopback

auto end0
iface end0 inet dhcp

EOF
  • 配置 dns
shell 复制代码
$ cat >/etc/resolv.conf <<EOF
nameserver 1.1.1.1
nameserver 8.8.8.8
EOF

配置时区

shell 复制代码
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

配置 /etc/fstab

shell 复制代码
$ cat >/etc/fstab <<EOF
# <file system>	<mount pt>	<type>	<options>	<dump>	<pass>
/dev/root	/		ext2	rw,noauto	0	1
proc		/proc		proc	defaults	0	0
devpts		/dev/pts	devpts	defaults,gid=5,mode=620,ptmxmode=0666	0	0
tmpfs		/dev/shm	tmpfs	mode=0777	0	0
tmpfs		/tmp		tmpfs	mode=1777	0	0
tmpfs		/run		tmpfs	mode=0755,nosuid,nodev,size=64M	0	0
sysfs		/sys		sysfs	defaults	0	0
#/dev/mmcblk0p3  none            swap    sw              0       0
EOF

配置 /etc/hostname

shell 复制代码
$ echo "milkvduo-ubuntu" > /etc/hostname

配置 /etc/ssh/sshd_config

shell 复制代码
$ sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

配置 /etc/sudoers

设置 root 登录密码为 milkv

shell 复制代码
$ echo "root:milkv" | chpasswd

至此,Ubuntu 根文件系统已经配置完成,退出 bash 至宿主机。

image 打包

将根文件系统通过软链接方式挂载到 duo-buildroot-sdk/install/soc_cv1812cp_milkv_duo256m_sd 目录下,

shell 复制代码
$ rm -rf duo-buildroot-sdk/install/soc_cv1812cp_milkv_duo256m_sd/fs
$ rm -rf duo-buildroot-sdk/install/soc_cv1812cp_milkv_duo256m_sd/br-rootfs
$ ln -s ubuntu-rootfs duo-buildroot-sdk/install/soc_cv1812cp_milkv_duo256m_sd/fs
$ ln -s ubuntu-rootfs duo-buildroot-sdk/install/soc_cv1812cp_milkv_duo256m_sd/br-rootfs

在 bash 下运行以下命令,打包。

shell 复制代码
$ cd duo-buildroot-sdk
$ source device/milkv-duo256m-sd/boardconfig.sh 
$ source build/milkvsetup.sh
$ defconfig cv1812cp_milkv_duo256m_sd
$ bash device/gen_burn_image_sd.sh install/soc_cv1812cp_milkv_duo256m_sd

会在 duo-buildroot-sdk/install/soc_cv1812cp_milkv_duo256m_sd 目录下生成 milkv-duo256m-sd.img 文件,即为打包好的镜像文件。

运行

milkv-duo256m-sd.img 文件烧录到 SD 卡中,启动 Milk-V 开发板,即可运行 Ubuntu 系统。

相关推荐
自信人间三百年1 小时前
数据结构和算法-06线段树-01
java·linux·开发语言·数据结构·算法·leetcode
Allen Bright2 小时前
Linux 中的 mkdir 命令:深入解析
linux·运维·服务器
银河麒麟操作系统2 小时前
【银河麒麟高级服务器操作系统】有关dd及cp测试差异的现象分析详解
java·linux·运维·服务器·前端·网络
滴水之功3 小时前
VMware ubuntu12.04怎么设置静态IP联网
linux·ubuntu
昨天今天明天好多天4 小时前
【Go】Linux、Windows、Mac 搭建Go开发环境
linux·windows·golang
难以触及的高度5 小时前
Linux中所有和$有关的操作
linux·服务器·前端
Chicheng_MA6 小时前
Linux DNS 协议概述
linux·dns
2018_like菜6 小时前
esxi8 虚拟机使用ubuntu22模板后 没有ip配置文件,只有ipv6链接正常使用
linux·服务器·网络
fnd_LN6 小时前
Linux shell的七大功能 ---自动补齐、管道机制、别名
linux·运维·服务器