內容目錄

這裏記錄了我用新的筆記本安裝WSL開發AGL的環境假設與建構步驟。爲了某些開發項目,我從macOS切換到Windows11環境,試用了 Virtualbox和HyperV來建立的大型項目,CPU和IO性能都不及WSL2。在編譯工程允許的條件下,還是用 WSL吧。
[toc]

安裝WSL2

一般市面上配的Windows11筆記本配的都是Home版本,預設不提供 WSL。想要使用Linux子系統?在 Win11 Home下不能直接從應用市場安裝WSL/WSL2,安裝了也用不了。可以參考官網: https://learn.microsoft.com/zh-tw/windows/wsl/install-manual 的特殊方式來安裝WSL。這裏記錄了我的嘗試步驟。

1. 啟用 Home版的 WSL與虛擬機功能:

以管理員身份進入 cmd 或powershell,使用 dism.exe 來啓用WSL與虛擬機平臺功能:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

2. 重啓 Windows安裝WSL2

需要重啟Windows,以讓系統自動安裝WSL與虛擬機功能的設定。
然後,指定要使用WSL2:

wsl --set-default-version 2

3. 安裝 Ubuntu 20.04。

如果在應用商店選 Ubuntu 沒定版次,將會用最後的LTS。由於AGL項目在22.04執行不穩定,指定用 20.04版。

可以從微軟商店安裝,也可以在 Powershell下命令安裝20.04:

Invoke-WebRequest -Uri https://aka.ms/wslubuntu2004 -OutFile Ubuntu.appx -UseBasicParsing

4. 安裝 Windows Terminal

Windows Terminal 可以分頁執行不同 terminal,并且原生支持 Powershell、CMD、linux、multipass等系統的終端。

從應用商店安裝。

Windows Terminal

圖片來源:https://learn.microsoft.com/zh-tw/windows/terminal/install

5. 升級WSLg以提供 GUI服務

内容參考:https://learn.microsoft.com/zh-tw/windows/wsl/tutorials/gui-apps

發現新安裝的WSL2還沒提供GUI功能,需要更新並重啓WSL:

wsl --update
wsl --shutdown

之後以Windows Terminal 打開Ubuntu,啟動機器,就可以安裝圖形 App了。如常用的 gedit:

sudo apt install gedit -y

大功告成!!

官網提供了多個常用的GUI應用安裝方式,其實和標準Ubuntu都一樣的。

6. 加大WSL內置硬碟大小

發現預設250G的HDD對WSL而言可能不夠,需要調整。。。

6.1 cmdline 下關閉wsl、查找 ext4.vhdx 位置 、並執行diskpart:

REM # 终止所有 WSL 实例
wsl --shutdown

REM # 找 Ubuntu實例 的 disk (cmdlimne)

dir ext4.vhdx /s

驱动器 C 中的卷是 OS
 卷的序列号是 D2D8-14EC

 C:\Users\cyue1\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState 的目录

2023/01/06  22:07   151,105,044,480 ext4.vhdx
               1 个文件 151,105,044,480 字节

     所列文件总数:
               1 个文件 151,105,044,480 字节
               0 个目录 728,238,587,904 可用字节

REM #運行diskpart
diskpart

6.2 diskpart 中指定目標類型是 vdisk, 然後擴展找到的 ext4.vhdx 分區來調整。

選擇 vdisk 來擴展文件系統。擴展數值單位為 MB。

  • select vdisk file="絕對路徑\ext4.vhdx":選擇 vdisk的文件。

  • expand vdifk maxium=320000:擴展 vdisk,單位為MB。

  • detail vdisk :查看分區狀況

  • exit:結束 diskpart

我的執行畫面如下:

Microsoft DiskPart 版本 10.0.22621.1

Copyright (C) Microsoft Corporation.
在计算机上: CYUEZENBOOK

DISKPART> select vdisk file="C:\Users\cyue1\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx"

DiskPart 已成功选择虚拟磁盘文件。

DISKPART> detail vdisk

设备类型 ID: 0 (未知)
供应商 ID: {00000000-0000-0000-0000-000000000000} (未知)
状态: 已添加
虚拟大小:  292 GB
物理大小:  140 GB
文件名: C:\Users\cyue1\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx
为子级: 否
父文件名:
找不到关联的磁盘号。

DISKPART> expand vdisk maximum=320000

  100 百分比已完成

DiskPart 已成功扩展虚拟磁盘文件。

DISKPART> exit

6.5 Ubuntu disk 用 resize2fs 調整 Size

先看 ext4 的 DISK mount 在哪,再對其做對應的 diskpart的 resize數值。

sudo -s
mount -t devtmpfs none /dev

mount | grep ext4
/dev/sdc on / type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)
/dev/sdc on /mnt/wslg/distro type ext4 (ro,relatime,discard,errors=remount-ro,data=ordered)
/dev/sdc on /snap type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)

# 發現在 `/dev/sdc`

sudo resize2fs /dev/sdc 320000M  
  • 上一節我們將 vhd 的大小調整爲 320000,也需要在Ubuntu中修正此大小:
sudo resize2fs /dev/sdc 320000M

7. 加大 WSL 可用的 RAM

我的筆記本有32GB的RAM,預設WSL只使用一半,16GB。編譯AGL時發現不太夠,在這裏我修改到24GB。方法是在用戶主目錄下(C:/Users/XXX/)添加 .wslconfig 文件,内容為:

[wsl2]
memory=24GB # Limits VM memory in WSL 2 to 24 GB

8. Terminal 問題

遇到了奇怪的問題,在按下 Tab后 ubuntu 的 terminal 會卡死,需要重啓wsl才正常。
爬文修改 /etc/inputrc ,取消了 # set bell-style none 的注釋符號。然後 reboot ubuntu ,似乎可解決部分狀況。命令如下:

sudo sed -i 's/# set bell-style none/set bell-style none/g' /etc/inputrc 
sudo reboot

9. 安裝 systemd

參考官網:https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/

設置在 WSL 發行版設置中設置的 systemd 標誌
您將需要編輯wsl.conf文件以確保 systemd 在引導時啟動。

需要超級用戶賬號編輯編輯 /etc/wsl.conf文件,如下命令:

sudo nano /etc/wsl.conf

我們要將以下内容添加到此文件:

[boot]
systemd=true

並使用保存和退出(Ctrl+X)關閉 nano 編輯器。
編輯完成後需要重啓wsl,在命令列執行:

wsl --shutdown

再從windows terminal 重新打開 Ubuntu。我們可以執行 systemctl 看 systemd 運行的服務的狀況:

systemctl list-unit-files --type=service

10. HyperV 工具?

(WSL或不需要使用 HyperV工具,僅供參考)

Home 版本的 HyperV 庫要手動添加。執行以下 hyperv.bat

pushd "%~dp0"

dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hv.txt

for /f %%i in ('findstr /i . hv.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"

del hv.txt

Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL

Pause

將會添加多個 HyperV庫。

AGL 編譯

2022 最新release 的 branch 是 needlefish。但目前在樹莓派4目標平臺上,我只編譯成功上一版的 marlin 的 agl-demo-platform。
AGL官方對樹莓派4平臺的建構工程可以參考:https://docs.automotivelinux.org/en/needlefish/#0_Getting_Started/2_Building_AGL_Image/5_2_Raspberry_Pi_4/
這裏記錄我的方法。

在 .bashrc 建立我的 alias 和環境變數

我在 .bashrc 為 AGL添加了:

#==== AGL
export AGL_TOP=~/AGL
#export AGL_BRANCH=needlefish
export AGL_BRANCH=marlin
#export AGL_BRANCH=master

export AGL_SDK=$AGL_TOP/$AGL_BRANCH

alias agl-create='mkdir -p $AGL_SDK;cd $AGL_SDK;repo init -b $AGL_BRANCH -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo;repo sync'

alias agl-qemu86='cd $AGL_TOP;source $AGL_SDK/meta-agl/scripts/aglsetup.sh -f -m qemux86-64 -b build-${AGL_BRANCH}-x86 agl-demo agl-devel'

alias agl-rpi4='cd $AGL_TOP;source $AGL_SDK/meta-agl/scripts/aglsetup.sh -f -m raspberrypi4 -b build-${AGL_BRANCH}-rpi4 agl-demo'

alias agl-rpi4-devel='cd $AGL_TOP; source $AGL_SDK/meta-agl/scripts/aglsetup.sh -f -m raspberrypi4 -b build-${AGL_BRANCH}-rpi4 agl-demo agl-devel'
#alias agl-rpi4-devel-all='cd $AGL_TOP; source $AGL_SDK/meta-agl/scripts/aglsetup.sh -f -m raspberrypi4 -b build-${AGL_BRANCH}-rrpi4 agl-demo agl-devel agl-all->
alias agl-rpi4-html5='cd $AGL_TOP; source $AGL_SDK/meta-agl/scripts/aglsetup.sh -f -m raspberrypi4 -b build-${AGL_BRANCH}-rrpi4 agl-demo agl-devel agl-image-graphical-html5'


alias agl-cache='mkdir -p ${AGL_SDK}-cache/downloads;mkdir -p ${AGL_SDK}-cache/sstate-cache;ln -s ${AGL_SDK}-cache/downloads downloads; ln -s ${AGL_SDK}-cache/sstate-cache sstate-cache'
alias bb-demo='time bitbake agl-demo-platform'
alias bb-html5='time bitbake agl-demo-platform-html5'

# 下面指令添加 Yacto 和 AGL的源镜像服务
alias bb-addmirrors='sed -i "s@#SSTATE_MIRRORS ?= \"f@SSTATE_MIRRORS ?= \"f@g" conf/local.conf ; sed -i "s@#SSTATE_MIRRORS += \"f@SSTATE_MIRRORS += \"f@g" conf/local.conf'

#alias bb-makelink='ln -s /media/psf/AllFiles/Volumes/Work/AGL/sstate-cache sstate-cache;ln -s /media/psf/AllFiles/Volumes/Work/AGL/downloads downloads'

安裝基礎 toolchain

# AGL marlin 文档只说要:
# - git 1.8.3.1 以上
# - tar 1.2.7 以上
# - python 3.4 以上
# - gcc5 以上
# - curl 加上 yacto 的需求

# yacto说 ubuntu 下要安装(我加上 curl, 比AGL说的多了zstd等。。。):
# (ubuntu22.04 使用 pylint 包更名/取代 pylint3 包)
sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint xterm python3-subunit mesa-common-dev zstd liblz4-tool curl -y

# 使用 python3 取代系统预设的 python2
mkdir -p ~/bin
ln -s /usr/bin/python3 ~/bin/python

安裝 google repo

mkdir -p ~/bin
export PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
# 设定缺省的 git 的用户账号邮箱。repo是用 git 管理/下载工程的。
git config --global user.email "cyue12@me.com"
git config --global user.name "cyue12"

使用 alias 設置並構建工程

# 拉取 repo 工程(根據 $AGL_TOP $AGL_BRANCH $AGL_SDK ,將工程拉到指定位置)
agl-create

# 建立樹莓派需要的 build環境
agl-rpi4

# 把 download 和 sstate 目錄獨立,方便備份並節省不同設置下的下載時間
agl-cache

# 運行 bitbake 建立 agl-demo-platform
bb-demo

除了官方的 AGL_TOP,加上了 AGL_BRANCHAGL_SDK 兩個變數。

此外,我用 alias 建立了幾個別名,來簡化build工作,流程如下:

  • agl-create : 從 repo 拉出當前 AGL_BRANCH 的 SDK (scripts)。
  • agl-rpi4-devel : 建立樹莓派 demo + devel 的 build 目錄,之後將在此目錄build。
  • agl-cache: build目錄下指向我的 cache位置,這樣不同的工程不必重複下載已下載的 sourcecode。
  • bb-demo: 用 bitbake 建立 demo code (qt版GUI)。

RAM 24G、DISK 320G 可以編譯成功 demo


部分 code 需要大量的 RAM 來 build。 我的32GB筆記本的WSL2 預設使用16GB的RAM。可以另開 terminal,用 top 來看系統現況。比如 mozjs 需要 6GB,多工時可能fail,需要多 bitbake幾次。。。

燒錄鏡像到 TF Card

使用樹莓派官網的鏡像燒錄器將鏡像燒錄到TF卡即可運行。鏡像位置在:

<BUILD DIR>/tmp/deploy/images/raspberrypi4-64/agl-demo-platform-raspberrypi4-64.wic.xz 

樹莓派4下的 AGL demo 不支持 USB Boot,只能用傳統的 SD Card Boot。

插上TF卡,接上 HDMI綫、電源、鍵盤鼠標,就可以運行Demo了。也可以接上 USB轉TTL UART綫,用 115200bps 速率登入AGL系統來 debug。

最後修改日期: 2023 年 2 月 4 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。