前一篇 以Buildroot 建立ARM的 X11環境裡談到如何利用 buildroot 來建立 XWindows 環境,其最終目的也是為了可以讓 Firefox 運行起來,所以本篇是其後續。
這中間經歷了很多嘗試,但版本間存在著相依性,最後嘗試到可運行的組合是 Ubuntu 14.04 + Firefox 49,終間還包含了一些 tricky 在裡面。
本文需以 Ubuntu 14.04 來進行編譯,以產生 ARM 的 XWindow 和 Firefox 檔案,最終在 Windows QEMU運行。因 Ubuntu 14.04 的內建 QEMU 太舊,無法支援某些功能,只能在較新的版本執行,所以才會採取 Ubuntu 編譯,Windows 執行的方法。
套件安裝
請安裝下列套件,以在過程中正確運行。
1 2 |
sudo apt-get update sudo apt-get install vim qemu-user qemu-system-x86 qemu-system-arm libssl-dev ncurses-dev genext2fs pigz lrzsz unzip git texinfo build-essential net-tools samba ccache autoconf2.13 open-vm-tools |
忽略憑證錯誤
由於 Ubuntu 14.04 已經太舊了,至於有些根憑証已到期,可以下達以下命令,讓wget忽略此問題。
1 |
echo "check_certificate = off" >> ~/.wgetrc |
設定 Samba
由於編譯的環境全在 Ubunu 14.04 ,但QEMU虛擬機卻無法在其上運行,需在 Windows 執行會比較方便。因此需透過 samba 來分享檔案系統,以方便使用與開發。
Linux 設定
編輯 /etc/samba/smb.conf ,將 homes 的部份開啟,並將入 “read only = no”,以進行讀寫。
接著加入與登入帳號相同的 samba 帳號和密碼
1 |
sudo smbpasswd -a ubuntu |
重啟服務
1 2 |
sudo /etc/init.d/smbd restart sudo /etc/init.d/nmbd restart |
Windows 設定
Windows (win10 home) 的部份,則需啟用 SMB 1.0 的協議。從控制台 –> 程式和功能 –> 開啟或關閉 Windows 功能 ,啟用所有 SMB 1.0 服務,然後重開。
瀏覽 Linux 目錄
接著以 Windows 檔案總管開啟 \\LINUX_IP,輸入 Linux 的帳號與密碼,應該就可以存取其家目錄。
範本檔案
為了簡化示範的流程,本文會用一個預先建立的目錄結構與script,來解說命令,檔案會附在文末。請先下載下來後,放在 ubuntu 內。用以下命令解壓縮。
1 2 |
tar zvxf qemu_sys_arm_firefox_template.tar.gz cd qemu_sys_arm_firefox_template |
下載編譯 Buildroot 以建立檔案系統與Toolchain
執行下列命令,下載 buildroot 套件,解壓縮並進入設定畫面
1 2 3 4 |
wget https://buildroot.org/downloads/buildroot-2020.02.11.tar.gz tar zvxf buildroot-2020.02.11.tar.gz cd buildroot-2020.02.11 make menuconfig |
接著直接跳出,如果buildroot編譯後想重新設定,建議將 output 目錄整個刪除,會比較沒有問題。
ARM 設定
將 buildroot 範本設定檔複蓋設定檔,最後下達 make 來編譯。
1 2 |
cp ../buildroot_firefox .config make |
若發生錯誤,可嘗試重編譯幾次 (make) 看看,似忽在 14.04 必定會發生此現象,最後仍可以編譯成功。
解壓 rootfs
完成後,會產生下列檔案
- rootfs : output/images/rootfs.tar
- toolchain 執行檔 : output/host/bin
為了符合範例script的設定,請下達下面命令,將 rootfs.tar 解開
1 2 3 4 |
export PATH=`pwd`/output/host/bin:$PATH cd .. cd sim/rootfs tar vxf ../../buildroot-2020.02.11/output/images/rootfs.tar |
頭一行命令,會先指定 toolchain 的路徑,以方便後面的kernel編譯。
下載並編譯 Kernel 4.4
接下來要下載並編譯 kernel 4.4,編譯器會使用剛 buildroot 所產生的編譯器。
1 2 3 4 |
cd ../devtool wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.4.1.tar.xz tar Jvxf linux-4.4.1.tar.xz cd linux-4.4.1 |
複制範本設定檔,並開始編譯
1 2 |
cp ../kernel_firefox .config make ARCH=arm CROSS_COMPILE=arm-linux- bzImage dtbs -j `nproc` |
編譯 Firefox
下達以下命令,解壓縮原始檔和複製設定參數
1 2 3 4 5 |
cd wget https://archive.mozilla.org/pub/firefox/releases/49.0/source/firefox-49.0.source.tar.xz tar Jvxf ~/firefox-49.0.source.tar.xz cd firefox-49.0 cp ~/qemu_sys_arm_firefox_template/mozconfig_firefox browser/config/mozconfig |
設定環境變數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
export TC=$HOME/qemu_sys_arm_firefox_template/buildroot-2020.02.11/output/host export PATH=$TC/bin/:$PATH export SYSROOT=$TC/arm-buildroot-linux-gnueabi/sysroot export PKG_CONFIG_PATH=$TC/arm-buildroot-linux-gnueabi/sysroot/usr/lib/pkgconfig export CROSS_COMPILE=arm-buildroot-linux-gnueabi- export CC="${CROSS_COMPILE}gcc --sysroot=$SYSROOT" export CXX="${CROSS_COMPILE}g++ --sysroot=$SYSROOT" export CPP="${CROSS_COMPILE}gcc -E --sysroot=$SYSROOT" export AS="${CROSS_COMPILLE}as " export LD="${CROSS_COMPILE}ld --sysroot=$SYSROOT" export STRIP=${CROSS_COMPILE}strip export RANLIB=${CROSS_COMPILE}ranlib export OBJCOPY=${CROSS_COMPILE}objcopy export OBJDUMP=${CROSS_COMPILE}objdump export AR=${CROSS_COMPILE}ar export NM=${CROSS_COMPILE}nm export M4=m4 export TARGET_PREFIX=${CROSS_COMPILE} export CONFIGURE_FLAGS="--target=arm-linux --host=arm-linux --build=i686-linux --with-libtool-sysroot=$SYSROOT" export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types -I$TC/arm-buildroot-linux-gnueabi/sysroot/usr/lib/glib-2.0/include" export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types" export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed" export CPPFLAGS="" export ARCH=arm export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TC/lib/ export MOZCONFIG=$HOME/firefox-49.0/browser/config/mozconfig export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus rm -f $TC/bin/python* ln -s $TC/bin/arm-buildroot-linux-gnueabi-nm $TC/bin/arm-linux-gnueabi-nm ln -s $TC/bin/arm-buildroot-linux-gnueabi-readelf $TC/bin/arm-linux-gnueabi-readelf |
將上面指令貼上,以進行編譯 firefox。
上面有一行 “rm -f $TC/bin/python*” 是特別修改的地方,若使用 firefox 編譯出來的 python 會需要重新下載一些套件,而預設的 python 是沒啟用 https 的,另外官方現在的 pypi repository 改成只支援https而且對 TLS 的版本也有要求,還有憑証也過期了,由於太麻煩,總之要讓其跑起來是失敗了。
所以將自己建出的刪除,採用系統的,就不會需要下載檔案了。
修改檔案與編譯
編輯並移除下列部份 $HOME/firefox-49.0/xpcom/io/nsLocalFileUnix.cpp,這部份我還不確定是在改什麼,等將來有發現問題再修正吧。
然後以 ./mach build 來開始編譯,編譯成功後,以命令 ./mach package 來打包檔案。完整的檔案就會產生在
1 |
obj-arm-buildroot-linux-gnueabi/dist/firefox-49.0.en-US.linux-gnueabi-arm.tar.bz2 |
解壓到 rootfs 下
接下來要將 firefox 檔案放到 rootfs 下
1 2 |
cd ~/qemu_sys_arm_firefox_template/sim/rootfs/ tar jvxf ~/firefox-49.0/obj-arm-buildroot-linux-gnueabi/dist/firefox-49.0.en-US.linux-gnueabi-arm.tar.bz2 |
打包虛擬機檔案
由於種種相依性的問題,目前只能在 Ubuntu 14.04 編譯,在 Windows 上 QEMU 執行,所以要進行一個打包的行為,來將需要的檔案收集起來。我有試過在Ubuntu 18.04虛擬機利運行 QEMU 來執行這些檔案,但會發生滑鼠不能用的情形,我猜有可能是在虛擬機裡再運行一個虛擬機的滑鼠對應問題,也許在實體 Linux 就無此現象。
1 2 |
cd ~/qemu_sys_arm_firefox_template/sim/devtool/linux-4.4.1 ../pack_win_qemu |
此動作可以將需要的 Kernel Image、Device Tree 與檔案系統都放在 pack 目錄下,並生成一個 pack.zip 檔案與 pack 目錄。稍後就可以直接在 Windows 上啟動。
Windows 上啟動 QEMU 開機
當完成上面的動作後,基本上就具備了 rootfs / kernel,就可以準備開機了。在此自前,必需先在 Windows 上安裝 QEMU,此步驟就不在描述。將 runqemu.bat 放進 qemu 安裝目錄,並稍作修改。
1 2 3 4 5 6 |
set PACKDIR=\\192.168.229.150\ubuntu\qemu_sys_arm_firefox_template\sim\devtool\linux-4.4.1\pack set CORES=2 set MEM=1024 qemu-system-arm -M vexpress-a15 -m %MEM% -kernel %PACKDIR%/zImage -dtb %PACKDIR%\vexpress-v2p-ca15-tc1.dtb --append "root=/dev/ram0 console=ttyAMA0 rdinit=/linuxrc" -initrd %PACKDIR%\rootfs.img -drive if=none,file=%PACKDIR%\img.ext2,id=hd0,format=raw -device virtio-blk-device,drive=hd0 -vga std -serial stdio -net user -net nic -smp %CORES% pause |
這個batch檔, 主要是修改 PACKDIR 的部份,將其指向 Linux 下的 pack 目錄。修改完畢後,就可以執行 runqemu.bat 來啟動 QEMU 載入系統。
啟動 Firefox
QEMU 啟動後,會產生一個虛擬的圖型螢幕和文字console。在console進入系統執行下列命令
1 2 3 4 5 6 |
mdev -s killall Xorg ifconfig eth0 10.0.2.15 route add default gw 10.0.2.2 echo nameserver 8.8.8.8 > /etc/resolv.conf xinit & |
此時在虛擬螢幕會執行一個 xterm 的程式,在這個 xterm 的程式裡,我們啟動 firefox,就可以進行瀏覽了。
1 2 |
cd /firefox ./firefox-bin |
Firefox 可以正常啟動並瀏覽了,但由於缺字型,所以中文都是一些麻將。我們可以在找一個 .ttc 的字型放入 rootfs 後,瀏覽時就會有中文了。由於可能有版權的問題,字型的部份請自型尋找。本文所使用的 demo 是由 Ubuntu 18.04 內 /usr/share/fonts 內找到的檔案 NotoSansCJK-Regular.ttc,將其複製到 rootfs 下 ~/qemu_sys_arm_firefox_template/sim/rootfs/usr/share/fonts/google-material/,再次打包運行。
中文就出現了!
結語
有點辛苦的,終於讓 firefox 可以在虛擬機上運行了。仍然是初步,但有進展仍是另人開心的
相關聯結
qemu_sys_arm_firefox_template.tar.gz