[Atlas200DK] 制卡脚本解读

网友投稿 1058 2022-05-29

Atlas200DK制卡脚本解读

[Atlas200DK] 制卡脚本解读

Atlas200DK你可以认为是一个不带显示器/不带键盘的小电脑,其中有arm架构的cpu和AI加速能力的NPU,这里SD卡就充当了硬盘的角色,或者说是系统盘也行;当你买一个电脑时,你需要装一个系统,同理你拿到Atlas200DK,你需要制作一张系统盘。

这里咱不讨论如何制作这张系统盘,在昇腾社区有专门的指导文档,咱们聚焦于制作原理。

制作系统盘需要两个脚本:

https://gitee.com/HuaweiAscend/tools/raw/master/make_sd_card.py

https://gitee.com/HuaweiAscend/tools/raw/master/make_ubuntu_sd.sh

以及两个安装包:

mini_developerkit-xxx.rar

ubuntu-16.04.xx-server-arm64.iso

其中,

make_sd_card.py是入口脚本,用以处理输入参数;

make_ubuntu_sd.sh是制卡脚本;

mini_developerkit-xxx.rar 是开发者板系统运行包,包含开发者板运行依赖的内核、驱动及共享库文件;

ubuntu-16.04.xx-server-arm64.iso 操作系统镜像包,就是一个标准的ubuntu arm包;

由于制卡的命令是:python3 make_sd_card.py local /dev/sda

那么先来看make_sd_card.py

制卡脚本入口(make_sd_card.py)

理解make_sd_card.py只需要理解下面这个命令行;

其中,{dev_name}是插入的SD卡的设备名称;{ubuntu_file_name}是操作系统文件路径,{ascend_developerkit_file_name}是开发者板系统运行包路径;NETWORK_CARD_DEFAULT_IP和USB_CARD_DEFAULT_IP是开发板的默认IP,有了这两个IP,你就可以选择通过网线或者usb线连接开发板,最后一个参数是日志文件。make_sd_card.py中的所有处理逻辑就是为了处理输入,生成这个命令行,为了调用make_ubuntu_sd.sh

制卡脚本

那么我们重点来看真正的制卡脚本:make_ubuntu_sd.sh

该脚本简单来说,就是先在x86机器上(本地)利用qemu制作一个aarch模拟环境,然后将该环境复制到SD卡,即完成SD卡的制作;其中,制作本地aarch模拟环境,则是通过unsquashfs将我们下载的ubuntu arm镜像包中的文件系统(filesystem.squashfs)解压出来而已。

这就是为什么在制卡之前需要你安装qemu-user-static的原因。

另外需要理解的一个概念:

squashfs 是一个高度压缩的只读文件系统,它将整个 Linux 系统环境压缩到一个只有 700M 的只读 squashfs 文件系统,其中的 root 文件系统就被压缩存放在这个文件系统之中。

squashfs 系统支持以回环(loopback)的方式挂载,然后便可以访问其上的文件了,在访问这些文件时,它们就会被解压缩并装载在 RAM 中,而不需要将整个文件解压缩后才去访问其中的文件。

下面是制卡流程:

请结合如下的代码注释进行理解。

# ########################Begin Executing######################################

# ************************Check args*******************************************

function main()

{

# 判断参数是否合法

if [[ $# -lt 4 ]];then

echo "Failed: Number of parameter illegal! Usage: $0    "

return 1;

fi

# ***************check network and usb card ip**********************************

checkIps

if [ $? -ne 0 ];then

return 1

fi

# ************************umount dev_name***************************************

# 检查SD卡,并且unmount SD卡,为格式化SD卡做好准备;

checkSDCard

if [ $? -ne 0 ];then

return 1

fi

# ************************Extract ubuntufs**************************************

# output:squashfs-root/

# 将ubuntu iso挂载,并将其中的squashfs文件系统解压出来,输出为squashfs-root

ubuntufsExtract

if [ $? -ne 0 ];then

return 1

fi

# end

# ************************Check architecture************************************

# 检查操作系统架构,当前是x86系统,需要模拟aarch64环境;

arch=$(uname -m)

if [[ ${arch} =~ "x86" ]];then

cp /usr/bin/qemu-aarch64-static ${LogPath}squashfs-root/usr/bin/

if [ $? -ne 0 ];then

echo "Failed: qemu-user-static or binfmt-support not found!"

return 1;

fi

chmod 755 ${LogPath}squashfs-root/usr/bin/qemu-aarch64-static

fi

# end

# ************************Configure ubuntu**************************************

# 在x86的模拟环境里面配置ubuntu系统(arm),包括创建用户/设置IP/安装常用软件等

echo "Process: 1/4(Configure ubuntu filesystem)"

configUbuntu

if [ $? -ne 0 ];then

return 1

fi

# end

# ************************Format SDcard*****************************************

# 格式化SD卡,所以制卡之前并不需要格式化操作;

echo "Process: 2/4(Format SDcard)"

formatSDcard

if [ $? -ne 0 ];then

return 1

fi

# end

# ************************Copy files to SD**************************************

# 分别挂载U盘的三个分区

if [[ -d "${TMPDIR_SD_MOUNT}" ]];then

umount ${TMPDIR_SD_MOUNT} 2>/dev/null

rm -rf ${TMPDIR_SD_MOUNT}

fi

mkdir ${TMPDIR_SD_MOUNT}

mount ${DEV_NAME}$p1 ${TMPDIR_SD_MOUNT} 2>/dev/null  # updated by aman

if [[ -d "${TMPDIR_SD2_MOUNT}" ]];then

umount ${TMPDIR_SD2_MOUNT} 2>/dev/null

rm -rf ${TMPDIR_SD2_MOUNT}

fi

mkdir ${TMPDIR_SD2_MOUNT}

mount ${DEV_NAME}$p2 ${TMPDIR_SD2_MOUNT} 2>/dev/null  # updated by aman

if [[ -d "${TMPDIR_SD3_MOUNT}" ]];then

umount ${TMPDIR_SD3_MOUNT} 2>/dev/null

rm -rf ${TMPDIR_SD3_MOUNT}

fi

mkdir ${TMPDIR_SD3_MOUNT}

mount ${DEV_NAME}$p3 ${TMPDIR_SD3_MOUNT} 2>/dev/null  # updated by aman

# 执行完run包的安装以后,将squashfs-root拷贝到SD卡的第一个分区,其中的/home拷贝只第二个分区,/var/log/拷贝至第三个分区

echo "Process: 3/4(Copy filesystem and mini package to SDcard)"

copyFilesToSDcard

if [ $? -ne 0 ];then

return 1

fi

# end

# 制作本地交叉编译环境,其实就是将aarch64 gnu libs拷贝本地x86系统上;

echo "Process: 4/4(Make sysroot)"

make_sysroot

# unmount SD卡的三个分区,然后就结束了;

umount ${TMPDIR_SD_MOUNT} 2>/dev/null

if [[ $? -ne 0 ]];then

echo "Failed: Umount ${TMPDIR_SD_MOUNT} to SDcard failed!"

return 1

fi

umount ${TMPDIR_SD2_MOUNT} 2>/dev/null

if [[ $? -ne 0 ]];then

echo "Failed: Umount ${TMPDIR_SD2_MOUNT} to SDcard failed!"

return 1

fi

umount ${TMPDIR_SD3_MOUNT} 2>/dev/null

if [[ $? -ne 0 ]];then

echo "Failed: Umount ${TMPDIR_SD3_MOUNT} to SDcard failed!"

return 1

fi

echo "Finished!"

return 0

}

Atlas 200 DK

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:爱“多管闲事”的软件总工程师
下一篇:泛微OA系统“三重一大”解决方案:组织、应用、数据统一,全面移动化
相关文章