chore: Bump dadk to 0.2.0 (#1058)

# 概述

把dadk版本升级到0.2.0

dadk 0.2.0能够提升编译速度,并且支持使用dadk对内核进行profiling。
新版dadk的文档: https://docs.dragonos.org.cn/p/dadk/

# 注意

这是一个breaking change,升级后,将无法使用dadk 0.2.0去编译旧的项目。如有需要,请手动降级到dadk 0.1.11:
```shell
cargo install --git  https://git.mirrors.dragonos.org.cn/DragonOS-Community/DADK --tag v0.1.11
```

# 更改列表

* chore: 把管理用户程序编译的dadk配置文件改为新格式的

* feat: 使用新版dadk来创建\挂载\卸载磁盘镜像

* chore: bump dadk min version to 0.2.0

* chore: fix ci

* chore: 更新github ci镜像到1.7

* doc: 添加文档

---------
Co-Authored-by: xuzihao <xuzihao@dragonos.org>
Signed-off-by: longjin <longjin@DragonOS.org>
This commit is contained in:
LoGin
2024-11-27 01:30:31 +08:00
committed by GitHub
parent 539ee3eaeb
commit e8b1db320d
110 changed files with 2216 additions and 1327 deletions

View File

@ -1 +1 @@
v1.6
v1.7

40
tools/check_arch.sh Normal file
View File

@ -0,0 +1,40 @@
#!/bin/bash
BASE_PATH=$(pwd)
# 定义错误信息
ARCH_MISMATCH_ERROR="Error: ARCH in env.mk does not match arch in dadk-manifest.toml"
if [ -z "$ARCH" ]; then
echo "Error: ARCH environment variable is not set." >&2
exit 1
fi
# Check if ROOT_PATH is set
if [ -n "$ROOT_PATH" ]; then
CHECK_PATH="$ROOT_PATH"
else
# Check if the current directory name is "tools"
if [ "$(basename "$BASE_PATH")" = "tools" ]; then
# Try the parent directory's dadk-manifest
CHECK_PATH=$(dirname "$BASE_PATH")/
else
# Otherwise, check the current directory
CHECK_PATH="$BASE_PATH"
fi
fi
echo "Checking $CHECK_PATH"
# 读取dadk-manifest.toml文件中的arch字段
DADK_ARCH=$(grep -oP '(?<=arch = ")[^"]+' $CHECK_PATH/dadk-manifest.toml)
# 检查arch字段是否为x86_64
if [ "$ARCH" != $DADK_ARCH ]; then
echo "$ARCH_MISMATCH_ERROR" >&2
exit 1
else
echo "Arch check passed."
exit 0
fi

View File

@ -1,27 +0,0 @@
# ======检查是否以sudo运行=================
uid=`id -u`
if [ ! $uid == "0" ];then
echo "请以sudo权限运行"
exit
fi
# 检查是否设置ARCH环境变量
if [ ! ${ARCH} ];then
echo "请设置ARCH环境变量"
exit
fi
DISK_NAME=disk-${ARCH}.img
echo "Mounting virtual disk image '${DISK_NAME}'..."
LOOP_DEVICE=$(losetup -f --show -P ../bin/${DISK_NAME}) \
|| exit 1
echo ${LOOP_DEVICE}p1
mkdir -p ../bin/disk_mount/
mount ${LOOP_DEVICE}p1 ../bin/disk_mount/
lsblk

View File

@ -65,7 +65,7 @@ UBOOT_VERSION="v2023.10"
RISCV64_UBOOT_PATH="arch/riscv64/u-boot-${UBOOT_VERSION}-riscv64"
DISK_NAME="disk-${ARCH}.img"
DISK_NAME="disk-image-${ARCH}.img"
QEMU=qemu-system-${ARCH}
QEMU_DISK_IMAGE="../bin/${DISK_NAME}"

View File

@ -1,19 +0,0 @@
# ======检查是否以sudo运行=================
uid=`id -u`
if [ ! $uid == "0" ];then
echo "请以sudo权限运行"
exit
fi
if [ ! ${ARCH} ];then
echo "请设置ARCH环境变量"
exit
fi
DISK_NAME=disk-${ARCH}.img
LOOP_DEVICE=$(lsblk | grep disk_mount|sed 's/.*\(loop[0-9]*\)p1.*/\1/1g'|awk 'END{print $0}')
umount -f ../bin/disk_mount/
losetup -d /dev/$LOOP_DEVICE
echo $LOOP_DEVICE

View File

@ -1,5 +1,5 @@
###############################################
# 该脚本用于将disk_mount目录下的文件写入到disk-${ARCH}.img的第一个分区中,
# 该脚本用于将文件拷贝到磁盘镜像中,
# 并在磁盘镜像中安装grub引导程序
#
# 用法bash write_disk_image.sh --bios legacy/uefi
@ -11,15 +11,16 @@
echo "ARCH=${ARCH}"
# 给ARCH变量赋默认值
export ARCH=${ARCH:=x86_64}
export DADK=${DADK:=dadk}
DISK_NAME=disk-${ARCH}.img
# 内核映像
root_folder=$(dirname $(pwd))
kernel="${root_folder}/bin/kernel/kernel.elf"
boot_folder="${root_folder}/bin/disk_mount/boot"
mount_folder=$($DADK -w $root_folder rootfs show-mountpoint || exit 1)
boot_folder="${mount_folder}/boot"
GRUB_INSTALL_PATH="${boot_folder}/grub"
mount_folder="${root_folder}/bin/disk_mount"
ARGS=`getopt -o p -l bios: -- "$@"`
eval set -- "${ARGS}"
#echo formatted parameters=[$@]
@ -67,34 +68,17 @@ if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then
fi
fi
# 判断是否存在硬盘镜像文件,如果不存在,就创建一个(docker模式下由于镜像中缺少qemu-img不会创建)
if [ ! -f "${root_folder}/bin/${DISK_NAME}" ]; then
echo "创建硬盘镜像文件..."
case "$1" in
--bios)
case "$2" in
uefi)
sudo ARCH=${ARCH} bash ./create_hdd_image.sh -P MBR #GPT分区 用GPT分区uefi启动不了 内核没有针对gpt分区表来做处理
;;
legacy)
sudo ARCH=${ARCH} bash ./create_hdd_image.sh -P MBR #MBR分区
;;
esac
;;
*)
# 默认创建MBR分区
sudo ARCH=${ARCH} bash ./create_hdd_image.sh -P MBR #MBR分区
;;
esac
fi
# 判断是否存在硬盘镜像文件,如果不存在,就创建一个
echo "创建硬盘镜像文件..."
$DADK -w $root_folder rootfs create --skip-if-exists || exit 1
# 拷贝程序到硬盘
mkdir -p ${root_folder}/bin/disk_mount
bash mount_virt_disk.sh || exit 1
$DADK -w $root_folder rootfs mount || exit 1
LOOP_DEVICE=$(lsblk | grep disk_mount|sed 's/.*\(loop[0-9]*\)p1.*/\1/1g'|awk 'END{print $0}')
LOOP_DEVICE=$($DADK -w $root_folder rootfs show-loop-device || exit 1)
echo $LOOP_DEVICE
echo ${mount_folder}
# mkdir -p ${GRUB_INSTALL_PATH}
# 检测grub文件夹是否存在
@ -107,21 +91,20 @@ fi
if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then
cp ${kernel} ${root_folder}/bin/disk_mount/boot/
cp ${kernel} ${mount_folder}/boot/
fi
# 拷贝用户程序到磁盘镜像
mkdir -p ${root_folder}/bin/disk_mount/bin
mkdir -p ${root_folder}/bin/disk_mount/dev
mkdir -p ${root_folder}/bin/disk_mount/proc
mkdir -p ${root_folder}/bin/disk_mount/usr
touch ${root_folder}/bin/disk_mount/dev/keyboard.dev
cp -r ${root_folder}/bin/sysroot/* ${root_folder}/bin/disk_mount/
mkdir -p ${mount_folder}/bin
mkdir -p ${mount_folder}/dev
mkdir -p ${mount_folder}/proc
mkdir -p ${mount_folder}/usr
cp -r ${root_folder}/bin/sysroot/* ${mount_folder}/
# 设置 grub 相关数据
if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then
touch ${root_folder}/bin/disk_mount/boot/grub/grub.cfg
touch ${mount_folder}/boot/grub/grub.cfg
cfg_content='set timeout=15
set default=0
insmod efi_gop
@ -154,7 +137,7 @@ if [ "${INSTALL_GRUB_TO_IMAGE}" = "1" ];then
;;
legacy) #传统bios
if [ ${ARCH} == "x86_64" ];then
${GRUB_PATH_I386_LEGACY_INSTALL} --target=i386-pc --boot-directory=${boot_folder} /dev/$LOOP_DEVICE
${GRUB_PATH_I386_LEGACY_INSTALL} --target=i386-pc --boot-directory=${boot_folder} $LOOP_DEVICE
elif [ ${ARCH} == "riscv64" ];then
install_riscv64_efi
else
@ -165,11 +148,12 @@ if [ "${INSTALL_GRUB_TO_IMAGE}" = "1" ];then
;;
*)
#传统bios
${GRUB_PATH_I386_LEGACY_INSTALL} --target=i386-pc --boot-directory=${boot_folder} /dev/$LOOP_DEVICE
${GRUB_PATH_I386_LEGACY_INSTALL} --target=i386-pc --boot-directory=${boot_folder} $LOOP_DEVICE
;;
esac
fi
sync
bash umount_virt_disk.sh
$DADK -w $root_folder rootfs umount || exit 1