[Atlas200DK] 制卡腳本解讀

      網(wǎng)友投稿 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**************************************

      [Atlas200DK] 制卡腳本解讀

      #?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)容。

      上一篇:INDIRECT函數(shù)怎么獲取中間值
      下一篇:wps文字顯示制表符標(biāo)記的方法
      相關(guān)文章
      中文字幕精品三区无码亚洲| 亚洲国产精品无码中文lv| 久久水蜜桃亚洲AV无码精品| 亚洲日韩一区二区一无码| 亚洲中文无码av永久| 亚洲制服中文字幕第一区| 久久久久亚洲AV无码专区首| 亚洲av永久无码精品表情包| 亚洲AV中文无码字幕色三| 久久久久久久综合日本亚洲 | 亚洲白色白色在线播放| 亚洲最新视频在线观看| 久久精品国产精品亚洲蜜月| 久久久久亚洲AV成人无码网站| 久久久久亚洲av无码专区蜜芽| 亚洲午夜精品一区二区| 亚洲人成电影在线天堂| 色播亚洲视频在线观看| 亚洲精品日韩中文字幕久久久| 亚洲成无码人在线观看| 亚洲AV无码一区二区三区在线| 亚洲va乱码一区二区三区| 456亚洲人成影院在线观| 亚洲一区二区三区无码国产| 亚洲精品午夜国产va久久| 亚洲中文字幕日本无线码 | 中文字幕中韩乱码亚洲大片| 亚洲人成精品久久久久| 久久国产精品亚洲综合| 精品亚洲麻豆1区2区3区| 亚洲伊人久久精品| 亚洲私人无码综合久久网| 亚洲1区2区3区精华液| 亚洲国产专区一区| 亚洲精品午夜国产VA久久成人| 亚洲AV无码国产精品色午友在线| 久久亚洲日韩精品一区二区三区| 亚洲欧洲国产精品久久| 中文无码亚洲精品字幕| 亚洲成av人片天堂网老年人| 亚洲一区二区三区自拍公司|