微吼云上線多路互動直播服務(wù) 加速多場景互動直播落地
1205
2025-04-01
Atlas200DK制卡腳本解讀
Atlas200DK你可以認(rèn)為是一個(gè)不帶顯示器/不帶鍵盤的小電腦,其中有arm架構(gòu)的cpu和AI加速能力的NPU,這里SD卡就充當(dāng)了硬盤的角色,或者說是系統(tǒng)盤也行;當(dāng)你買一個(gè)電腦時(shí),你需要裝一個(gè)系統(tǒng),同理你拿到Atlas200DK,你需要制作一張系統(tǒng)盤。
這里咱不討論如何制作這張系統(tǒng)盤,在昇騰社區(qū)有專門的指導(dǎo)文檔,咱們聚焦于制作原理。
制作系統(tǒng)盤需要兩個(gè)腳本:
https://gitee.com/HuaweiAscend/tools/raw/master/make_sd_card.py
https://gitee.com/HuaweiAscend/tools/raw/master/make_ubuntu_sd.sh
以及兩個(gè)安裝包:
mini_developerkit-xxx.rar
ubuntu-16.04.xx-server-arm64.iso
其中,
make_sd_card.py是入口腳本,用以處理輸入?yún)?shù);
make_ubuntu_sd.sh是制卡腳本;
mini_developerkit-xxx.rar?是開發(fā)者板系統(tǒng)運(yùn)行包,包含開發(fā)者板運(yùn)行依賴的內(nèi)核、驅(qū)動及共享庫文件;
ubuntu-16.04.xx-server-arm64.iso?操作系統(tǒng)鏡像包,就是一個(gè)標(biāo)準(zhǔn)的ubuntu arm包;
由于制卡的命令是:python3 make_sd_card.py local /dev/sda
那么先來看make_sd_card.py
制卡腳本入口(make_sd_card.py)
理解make_sd_card.py只需要理解下面這個(gè)命令行;
其中,{dev_name}是插入的SD卡的設(shè)備名稱;{ubuntu_file_name}是操作系統(tǒng)文件路徑,{ascend_developerkit_file_name}是開發(fā)者板系統(tǒng)運(yùn)行包路徑;NETWORK_CARD_DEFAULT_IP和USB_CARD_DEFAULT_IP是開發(fā)板的默認(rèn)IP,有了這兩個(gè)IP,你就可以選擇通過網(wǎng)線或者usb線連接開發(fā)板,最后一個(gè)參數(shù)是日志文件。make_sd_card.py中的所有處理邏輯就是為了處理輸入,生成這個(gè)命令行,為了調(diào)用make_ubuntu_sd.sh
制卡腳本
那么我們重點(diǎn)來看真正的制卡腳本:make_ubuntu_sd.sh
該腳本簡單來說,就是先在x86機(jī)器上(本地)利用qemu制作一個(gè)aarch模擬環(huán)境,然后將該環(huán)境復(fù)制到SD卡,即完成SD卡的制作;其中,制作本地aarch模擬環(huán)境,則是通過unsquashfs將我們下載的ubuntu arm鏡像包中的文件系統(tǒng)(filesystem.squashfs)解壓出來而已。
這就是為什么在制卡之前需要你安裝qemu-user-static的原因。
另外需要理解的一個(gè)概念:
squashfs 是一個(gè)高度壓縮的只讀文件系統(tǒng),它將整個(gè) Linux 系統(tǒng)環(huán)境壓縮到一個(gè)只有 700M 的只讀 squashfs 文件系統(tǒng),其中的 root 文件系統(tǒng)就被壓縮存放在這個(gè)文件系統(tǒng)之中。
squashfs 系統(tǒng)支持以回環(huán)(loopback)的方式掛載,然后便可以訪問其上的文件了,在訪問這些文件時(shí),它們就會被解壓縮并裝載在 RAM 中,而不需要將整個(gè)文件解壓縮后才去訪問其中的文件。
下面是制卡流程:
請結(jié)合如下的代碼注釋進(jìn)行理解。
#?########################Begin?Executing######################################
#?************************Check?args*******************************************
function?main()
{
#?判斷參數(shù)是否合法
if?[[?$#?-lt?4?]];then
echo?"Failed:?Number?of?parameter?illegal!?Usage:?
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卡做好準(zhǔn)備;
checkSDCard
if?[?$??-ne?0?];then
return?1
fi
#?************************Extract?ubuntufs**************************************
#?output:squashfs-root/
#?將ubuntu?iso掛載,并將其中的squashfs文件系統(tǒng)解壓出來,輸出為squashfs-root
ubuntufsExtract
if?[?$??-ne?0?];then
return?1
fi
#?end
#?************************Check?architecture************************************
#?檢查操作系統(tǒng)架構(gòu),當(dāng)前是x86系統(tǒng),需要模擬aarch64環(huán)境;
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的模擬環(huán)境里面配置ubuntu系統(tǒng)(arm),包括創(chuàng)建用戶/設(shè)置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盤的三個(gè)分區(qū)
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
#?執(zhí)行完run包的安裝以后,將squashfs-root拷貝到SD卡的第一個(gè)分區(qū),其中的/home拷貝只第二個(gè)分區(qū),/var/log/拷貝至第三個(gè)分區(qū)
echo?"Process:?3/4(Copy?filesystem?and?mini?package?to?SDcard)"
copyFilesToSDcard
if?[?$??-ne?0?];then
return?1
fi
#?end
#?制作本地交叉編譯環(huán)境,其實(shí)就是將aarch64?gnu?libs拷貝本地x86系統(tǒng)上;
echo?"Process:?4/4(Make?sysroot)"
make_sysroot
#?unmount?SD卡的三個(gè)分區(qū),然后就結(jié)束了;
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
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。