[Atlas200DK] 制卡脚本解读

举报
山人_mhc 发表于 2020/04/11 14:31:36 2020/04/11
【摘要】 理解Atlas200DK制卡脚本: 该脚本简单理解来说,就是先在x86机器上(本地)利用qemu制作一个aarch模拟环境,然后将该环境复制到SD卡,即完成SD卡的制作;其中,制作本地aarch模拟环境,则是通过unsquashfs将我们下载的ubuntu arm镜像包中的文件系统(filesystem.squashfs)解压出来而已。

Atlas200DK制卡脚本解读

Atlas200DK你可以认为是一个不带显示器/不带键盘的小电脑,其中有arm架构的cpuAI加速能力的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_IPUSB_CARD_DEFAULT_IP是开发板的默认IP,有了这两个IP,你就可以选择通过网线或者usb线连接开发板,最后一个参数是日志文件。make_sd_card.py中的所有处理逻辑就是为了处理输入,生成这个命令行,为了调用make_ubuntu_sd.sh

image.png

制卡脚本

那么我们重点来看真正的制卡脚本: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 中,而不需要将整个文件解压缩后才去访问其中的文件。

 

下面是制卡流程:

 

image.png 

 

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

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

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

function main()

{

    # 判断参数是否合法

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

        echo "Failed: Number of parameter illegal! Usage: $0 <dev fullname> <img path> <iso fullname> <mini filename>"

        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

}


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。