[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 <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
}
- 点赞
- 收藏
- 关注作者
评论(0)