天天看點

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

今天開始寫一個專題《OrangePi PC 玩Linux主線核心》。一方面是記錄自己在踩坑過程中的點點滴滴,另一方面是分享自己的心得。目前還不确定要寫幾期,希望大家多多捧場。

首先簡單介紹一下OrangePi PC。OrangePi PC(香橙派平闆)是一款開源的單闆電腦,新一代的arm開發闆,它可以運作Android4.4、Ubuntu、Debian等作業系統。香橙派平闆使用全志H3系統級晶片,同時擁有1GB DDR3 記憶體。産品具體細節可以通路http://www.orangepi.cn/orangepipc/index_cn.html檢視。

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

一、什麼是主線核心?

主線核心(mainline kernel)是由Linus Torvalds親自維護的核心釋出版[1]。既然是Linux之父親自維護的,那核心版本一定總是最新的。雖然win10不一定比win7好,但你一定不會去用win95,最新的版本總是代表了當下最優的發展方向。

二、開發環境搭建

2.1 硬體環境

PC一台,OrangePi PC一塊,8G tf卡一張,USB轉序列槽線一條。

2.2 軟體環境

  • 作業系統:

Deepin V20

  • 應用軟體:

buildroot-2020.11.tar.bz2

gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

balenaEtcher-1.5.45-x64.AppImage

所有用到的軟體我都會提供網盤下載下傳連結。

三、用Buildroot建構第一個主線核心鏡像

3.1 什麼是Buildroot

Buildroot是一個簡單、高效且易于使用的工具,可通過交叉編譯來生成嵌入式Linux系統[2]。你可以和編譯Linux核心一樣,通過buildroot配置,menuconfig修改,編譯出一個完整的可以直接燒寫到機器上運作的Linux系統軟體(包含boot、kernel、rootfs以及rootfs中的各種庫和應用程式)[3]。

以前看好多嵌入式Linux書籍都是從裸機開始講起,光是晶片手冊就能占去1/3,接着是講uboot,又是1/3,最後的核心、根檔案系統以及應用加起來占1/3,反正越是需要作者着墨的地方作者越惜墨,學習者往往越看越沒興趣,越看越不知所雲。其實,這都是因為作者沒能把握好内容的重點。說實話,我學習嵌入式Linux的時候也是一開始信心滿滿,越看書越懵逼,很難将書本上的知識與實際相連接配接。對于初學者而言,更需要的是階段性的成功,先跳過一大堆底層的、深奧的知識,從容易上手的、便于直接開始應用的層面着手,更容易增強信心,加深學習興趣。而Buildroot就是這樣一個工具,可以流水線般完成uboot、mainline kernel以及根檔案系統的編譯和鏡像制作,初學者很快就可以把linux跑起來,大大降低了學習門檻。

3.2 用Buildroot制作鏡像

官方下載下傳網址:https://buildroot.org/download.html

可以使用git拉取:git clone git://git.buildroot.net/buildroot          (說實話,用git下載下傳能把人氣死,我一般不用這種方法。如果你在網絡好的地方那另當别論。)

截至今日(2020年12月4日),最新穩定版是buildroot-2020.11.tar.bz2。将其下載下傳到桌面并解壓。多說一點,現在的linux系統大都比較友善,右擊壓縮包就可以解壓,比敲指令還是要省事不少。

輕按兩下打開buildroot-2020.11檔案夾,可以看到有個board目錄,這裡存放着各種常見的“派”的配置檔案夾,如樹莓派,荔枝派,還有我們的香橙派。

[email protected]:~/Desktop/buildroot-2020.11$ ls board/orangepi/
orangepi-lite   orangepi-one-plus  orangepi-pc-plus  orangepi-r1      orangepi-zero
orangepi-lite2  orangepi-pc        orangepi-plus     orangepi-rk3399  orangepi-zero-plus
orangepi-one    orangepi-pc2       orangepi-prime    orangepi-win     orangepi-zero-plus2
           

可以看到,連最新的OrangePi4(orangepi-rk3399)也有了,極大地友善了初學者和極客進行開發。我們這裡檢視orangepi-pc目錄下的readme.txt

OrangePi PC

Intro

=====

This default configuration will allow you to start experimenting with the

buildroot environment for the OrangePi PC. With the current configuration

it will bring-up the board, and allow access through the serial console.

How to build it

===============

Configure Buildroot:

    $ make orangepi_pc_defconfig

Compile everything and build the SD card image:

    $ make

How to write the SD card

========================

Once the build process is finished you will have an image called "sdcard.img"

in the output/images/ directory.

Copy the bootable "sdcard.img" onto an SD card with "dd":

  $ sudo dd if=output/images/sdcard.img of=/dev/sdX

按照readme.txt的說明,生成可燒錄的鏡像就2步,首先執行make orangepi_pc_defconfig配置buildroot,然後make就可以了,最後用dd将鏡像檔案寫入TF卡。回到buildroot-2020.11目錄,在終端下執行 make orangepi_pc_defconfig

[email protected]:~/Desktop/buildroot-2020.11$ make orangepi_pc_defconfig
mkdir -p /home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/lxdialog
PKG_CONFIG_PATH="" make CC="/usr/bin/gcc" HOSTCC="/usr/bin/gcc" \
    obj=/home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config -C support/kconfig -f Makefile.br conf
make[1]: 進入目錄“/home/dpmicro/Desktop/buildroot-2020.11/support/kconfig”
/usr/bin/gcc -DCURSES_LOC="<curses.h>" -DLOCALE  -I/home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config -DCONFIG_=\"\"  -MM *.c > /home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/.depend 2>/dev/null || :
/usr/bin/gcc -DCURSES_LOC="<curses.h>" -DLOCALE  -I/home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config -DCONFIG_=\"\"   -c conf.c -o /home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/conf.o
/usr/bin/gcc -DCURSES_LOC="<curses.h>" -DLOCALE  -I/home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config -DCONFIG_=\"\"  -I. -c /home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/zconf.tab.c -o /home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/zconf.tab.o
/usr/bin/gcc -DCURSES_LOC="<curses.h>" -DLOCALE  -I/home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config -DCONFIG_=\"\"   /home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/conf.o /home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/zconf.tab.o  -o /home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/conf
rm /home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/zconf.tab.c
make[1]: 離開目錄“/home/dpmicro/Desktop/buildroot-2020.11/support/kconfig”
#
# configuration written to /home/dpmicro/Desktop/buildroot-2020.11/.config
#
           

按理來說,接下來就應該執行make了,但是還不行。我們需要配置能在Deepin下運作,并用于編譯産生ARM Cortex-A7平台可用檔案的GCC,也就是傳說中的交叉編譯器。能用來交叉編譯的工具有多個選擇,我們選用linaro推出的GCC,我個人體驗很不錯。官網位址:https://www.linaro.org/downloads/

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

還是那句話,如果你網絡不好,從我的網盤下載下傳吧,否則慢到你懷疑人生。

下載下傳gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz到桌面,解壓,然後我們把解壓後的檔案夾移動到/opt/目錄下。這個路徑不是必須的,你可以任意指定,隻不過按照Deepin的規則,統一放到/opt/目錄下友善管理。移動到這個目錄需要管理者權限,是以加上sudo。

[email protected]:~/Desktop$ sudo mv gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/ /opt/
           

接下來添加環境變量,将GCC的路徑添加到系統變量中。

[email protected]:~/Desktop$ sudo nano /etc/profile
           

在export PATH上方添加一行 PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin  重新開機使環境變量生效。

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin"
fi
PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
export PATH

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
           

測試環境變量是否添加成功。

[email protected]:~/Desktop$ arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/7.5.0/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: '/home/tcwg-buildslave/workspace/tcwg-make-release_1/snapshots/gcc.git~linaro-7.5-2019.12/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release_1/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release_1/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release_1/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --with-system-zlib --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --with-float=hard --with-fpu=vfpv3-d16 --with-mode=thumb --with-tune=cortex-a9 --with-arch=armv7-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_1/_build/sysroots/arm-linux-gnueabihf --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_1/_build/builds/destdir/x86_64-unknown-linux-gnu/arm-linux-gnueabihf/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabihf --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release_1/_build/builds/destdir/x86_64-unknown-linux-gnu
Thread model: posix
gcc version 7.5.0 (Linaro GCC 7.5-2019.12)
           

出現上述提示表明添加成功。下面使用make menuconfig進行配置。

[email protected]:~/Desktop/buildroot-2020.11$ make menuconfig
mkdir -p /home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/lxdialog
PKG_CONFIG_PATH="" make CC="/usr/bin/gcc" HOSTCC="/usr/bin/gcc" \
    obj=/home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config -C support/kconfig -f Makefile.br mconf
make[1]: 進入目錄“/home/dpmicro/Desktop/buildroot-2020.11/support/kconfig”
 *** Unable to find the ncurses libraries or the
 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.
 *** 
 *** Install ncurses (ncurses-devel or libncurses-dev 
 *** depending on your distribution) and try again.
 *** 
make[1]: *** [Makefile:253:/home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/dochecklxdialog] 錯誤 1
make[1]: 離開目錄“/home/dpmicro/Desktop/buildroot-2020.11/support/kconfig”
make: *** [Makefile:969:/home/dpmicro/Desktop/buildroot-2020.11/output/build/buildroot-config/mconf] 錯誤 2
           

啊哦,需要安裝ncurses庫,按照提示來就好。

[email protected]:~/Desktop/buildroot-2020.11$ sudo apt-get install libncurses-dev
請輸入密碼
[sudo] dpmicro 的密碼:
驗證成功
正在讀取軟體包清單... 完成
正在分析軟體包的依賴關系樹       
正在讀取狀态資訊... 完成       
建議安裝:
  ncurses-doc
下列【新】軟體包将被安裝:
  libncurses-dev
更新了 0 個軟體包,新安裝了 1 個軟體包,要解除安裝 0 個軟體包,有 0 個軟體包未被更新。
需要下載下傳 329 kB 的歸檔。
解壓縮後會消耗 2,270 kB 的額外空間。
擷取:1 https://community-packages.deepin.com/deepin apricot/main amd64 libncurses-dev amd64 6.1+20181013.1-1+dde [329 kB]
已下載下傳 329 kB,耗時 1秒 (645 kB/s)     
正在選中未選擇的軟體包 libncurses-dev:amd64。
(正在讀取資料庫 ... 系統目前共安裝有 260209 個檔案和目錄。)
準備解壓 .../libncurses-dev_6.1+20181013.1-1+dde_amd64.deb  ...
正在解壓 libncurses-dev:amd64 (6.1+20181013.1-1+dde) ...
正在設定 libncurses-dev:amd64 (6.1+20181013.1-1+dde) ...
正在處理用于 man-db (2.8.5-2) 的觸發器 ...
           

現在就可以打開了,如下圖所示。

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻
  • Target options

目标配置。主要用于配置目标處理器的架構、二進制格式、核心、ABI、浮點政策、指令集等,這裡的參數由orangepi_pc_defconfig(在configs目錄下)自動生成,無需改動。

  • Build options

編譯配置。這裡需要配置的是Mirrors and Download locations選項,改幾個下載下傳的網址,不然下載下傳得太慢不利于節能減排。

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

将上圖紅框内的網址改成如圖所示的國内源。

http://mirrors.ustc.edu.cn/kernel.org/

http://mirrors.ustc.edu.cn/gnu/

http://mirrors.163.com/cpan/

  • Toolchain

工具鍊。同樣需要修改。

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

首先是Toolchain type,這個要改成External toolchain(外部工具鍊),也就是使用我們自己準備好的GCC。Toolchain配置為Custom toolchain(自定義工具鍊)。Toolchain path填寫工具鍊的絕對路徑,本例中為/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/。Toolchain prefix配置為$(ARCH)-linux-gnueabihf。External toolchain gcc version這個選擇GCC的版本,當然是7.x啦。External toolchain kernel headers series這個選擇頭檔案的版本,此處需要檢視一下。

[email protected]:~/Desktop/buildroot-2020.11$ cat /opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/linux/version.h 
#define LINUX_VERSION_CODE 264707
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
           

此處的264707是十進制,先轉換為十六進制

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

也就是十六進制的0x040A03,對應的版本号就是4.10.3,是以External toolchain kernel headers series選擇4.10.x。

External toolchain C library工具鍊C庫選擇glibc/eglibc。最後把C++支援勾上,儲存。

  • System configuration

系統配置。可以修改主機名,歡迎智語等等。但重點是配置Run a getty (login prompt) after boot選項。

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

将TTY port配置為ttyS0,Baudrate(波特率)配置為115200。如果不修改這裡,将導緻shell在系統啟動後不以序列槽做為輸出,看上去好像是系統挂起了[4]。

  • Kernel

保持預設。

  • Target packages

這裡可以選擇需要使用的軟體包。為了可以使用SSH和SCP功能,需要選中Networking applications下的dropbear 。

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

在選中的配置項上按?鍵可以檢視幫助資訊,或者移動左右方向鍵選中Help按鈕按回車檢視幫助資訊。

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻
  • Filesystem images

配置檔案系統。保持預設。

  • Bootloaders

配置引導程式。保持預設。

  • Host utilities

主機需要用到的一些工具軟體。保持預設。

  • Legacy config options

曆史遺留配置,事實上buildroot已不再支援。

配置到這裡,基本上就算OK了,先make一下試試,不行再說。

[email protected]:~/Desktop/buildroot-2020.11$ make
           
>>> host-patchelf 0.9 Building
PATH="/home/dpmicro/Desktop/buildroot-2020.11/output/host/bin:/home/dpmicro/Desktop/buildroot-2020.11/output/host/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin" PKG_CONFIG="/home/dpmicro/Desktop/buildroot-2020.11/output/host/bin/pkg-config" PKG_CONFIG_SYSROOT_DIR="/" PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 PKG_CONFIG_LIBDIR="/home/dpmicro/Desktop/buildroot-2020.11/output/host/lib/pkgconfig:/home/dpmicro/Desktop/buildroot-2020.11/output/host/share/pkgconfig"  /usr/bin/make -j5  -C /home/dpmicro/Desktop/buildroot-2020.11/output/build/host-patchelf-0.9/
make[1]: 進入目錄“/home/dpmicro/Desktop/buildroot-2020.11/output/build/host-patchelf-0.9”
Making all in src
make[2]: 進入目錄“/home/dpmicro/Desktop/buildroot-2020.11/output/build/host-patchelf-0.9/src”
g++ -DPACKAGE_NAME=\"patchelf\" -DPACKAGE_TARNAME=\"patchelf\" -DPACKAGE_VERSION=\"0.9\" -DPACKAGE_STRING=\"patchelf\ 0.9\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"patchelf\" -DVERSION=\"0.9\" -DPAGESIZE=4096 -I.   -I/home/dpmicro/Desktop/buildroot-2020.11/output/host/include -Wall -O2 -I/home/dpmicro/Desktop/buildroot-2020.11/output/host/include -c -o patchelf.o patchelf.cc
/bin/bash: g++:未找到指令
make[2]: *** [Makefile:357:patchelf.o] 錯誤 127
make[2]: 離開目錄“/home/dpmicro/Desktop/buildroot-2020.11/output/build/host-patchelf-0.9/src”
make[1]: *** [Makefile:436:all-recursive] 錯誤 1
make[1]: 離開目錄“/home/dpmicro/Desktop/buildroot-2020.11/output/build/host-patchelf-0.9”
make: *** [package/pkg-generic.mk:250:/home/dpmicro/Desktop/buildroot-2020.11/output/build/host-patchelf-0.9/.stamp_built] 錯誤 2
           

暈,竟然沒有g++,安裝之。

[email protected]:~/Desktop/buildroot-2020.11$ sudo apt-get install g++
           

繼續。。。

經過漫長的等待,終于下載下傳完了,呃不,編譯完了。。。

>>>   Executing post-image script support/scripts/genimage.sh
board/orangepi/orangepi-pc/genimage.cfg:43: no sub-section title/index for 'config'
INFO: cmd: "mkdir -p "/home/dpmicro/Desktop/buildroot-2020.11/output/build/genimage.tmp"" (stderr):
INFO: cmd: "rm -rf "/home/dpmicro/Desktop/buildroot-2020.11/output/build/genimage.tmp"/*" (stderr):
INFO: cmd: "mkdir -p "/home/dpmicro/Desktop/buildroot-2020.11/output/build/genimage.tmp"" (stderr):
INFO: cmd: "cp -a "/tmp/tmp.I9DwEdvhr4" "/home/dpmicro/Desktop/buildroot-2020.11/output/build/genimage.tmp/root"" (stderr):
INFO: cmd: "find '/home/dpmicro/Desktop/buildroot-2020.11/output/build/genimage.tmp/root' -depth -type d -printf '%P\0' | xargs -0 -I {} touch -r '/tmp/tmp.I9DwEdvhr4/{}' '/home/dpmicro/Desktop/buildroot-2020.11/output/build/genimage.tmp/root/{}'" (stderr):
INFO: cmd: "mkdir -p "/home/dpmicro/Desktop/buildroot-2020.11/output/images"" (stderr):
INFO: vfat(boot.vfat): cmd: "dd if=/dev/zero of="/home/dpmicro/Desktop/buildroot-2020.11/output/images/boot.vfat" seek=10485760 count=0 bs=1 2>/dev/null" (stderr):
INFO: vfat(boot.vfat): cmd: "mkdosfs   '/home/dpmicro/Desktop/buildroot-2020.11/output/images/boot.vfat'" (stderr):
INFO: vfat(boot.vfat): adding file 'zImage' as 'zImage' ...
INFO: vfat(boot.vfat): cmd: "MTOOLS_SKIP_CHECK=1 mcopy -bsp -i '/home/dpmicro/Desktop/buildroot-2020.11/output/images/boot.vfat' '/home/dpmicro/Desktop/buildroot-2020.11/output/images/zImage' '::'" (stderr):
INFO: vfat(boot.vfat): adding file 'sun8i-h3-orangepi-pc.dtb' as 'sun8i-h3-orangepi-pc.dtb' ...
INFO: vfat(boot.vfat): cmd: "MTOOLS_SKIP_CHECK=1 mcopy -bsp -i '/home/dpmicro/Desktop/buildroot-2020.11/output/images/boot.vfat' '/home/dpmicro/Desktop/buildroot-2020.11/output/images/sun8i-h3-orangepi-pc.dtb' '::'" (stderr):
INFO: vfat(boot.vfat): adding file 'boot.scr' as 'boot.scr' ...
INFO: vfat(boot.vfat): cmd: "MTOOLS_SKIP_CHECK=1 mcopy -bsp -i '/home/dpmicro/Desktop/buildroot-2020.11/output/images/boot.vfat' '/home/dpmicro/Desktop/buildroot-2020.11/output/images/boot.scr' '::'" (stderr):
INFO: hdimage(sdcard.img): adding partition 'u-boot' from 'u-boot-sunxi-with-spl.bin' ...
INFO: hdimage(sdcard.img): adding partition 'boot' (in MBR) from 'boot.vfat' ...
INFO: hdimage(sdcard.img): adding partition 'rootfs' (in MBR) from 'rootfs.ext4' ...
INFO: hdimage(sdcard.img): writing MBR
           

在 output/images 目錄下可以找到打包好的鏡像檔案

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

現在把TF卡插到讀卡器裡,然後再插到電腦的USB口上,我們來把鏡像寫入TF卡。按照說明文檔介紹

How to write the SD card

========================

Once the build process is finished you will have an image called "sdcard.img"

in the output/images/ directory.

Copy the bootable "sdcard.img" onto an SD card with "dd":

  $ sudo dd if=output/images/sdcard.img of=/dev/sdX

可以使用dd指令寫入。先檢視TF卡的裝置

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

然後輸入如下指令

[email protected]:~/Desktop/buildroot-2020.11$ sudo dd if=output/images/sdcard.img of=/dev/sdc
           

卸下sdc,然後插拔一下讀卡器,此時電腦會顯示兩個盤符

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

其中10MB卷存放boot.scr  sun8i-h3-orangepi-pc.dtb  zImage,是FAT32格式;rootfs 是根檔案系統。但是不知為何,執行一次dd指令會提示10MB卷需要格式化,插拔後再次執行dd,再插拔就好了。每次這樣會有些煩,我們使用balenaEtcher來寫入鏡像,輕按兩下即可打開,無需安裝。

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

選擇鏡像檔案,選擇寫入盤,Flash!即可。然後把TF卡插入香橙派,上電!等等,為了可以與香橙派互動,我們在香橙派的Debug口接上USB轉序列槽子產品,與電腦相連。接着在軟體商店搜尋PuTTY并安裝。

檢視USB轉序列槽的裝置

[email protected]:~/Desktop$ ls /dev/tty*
/dev/tty    /dev/tty2   /dev/tty31  /dev/tty43  /dev/tty55  /dev/ttyprintk  /dev/ttyS2   /dev/ttyS31
/dev/tty0   /dev/tty20  /dev/tty32  /dev/tty44  /dev/tty56  /dev/ttyS0      /dev/ttyS20  /dev/ttyS4
/dev/tty1   /dev/tty21  /dev/tty33  /dev/tty45  /dev/tty57  /dev/ttyS1      /dev/ttyS21  /dev/ttyS5
/dev/tty10  /dev/tty22  /dev/tty34  /dev/tty46  /dev/tty58  /dev/ttyS10     /dev/ttyS22  /dev/ttyS6
/dev/tty11  /dev/tty23  /dev/tty35  /dev/tty47  /dev/tty59  /dev/ttyS11     /dev/ttyS23  /dev/ttyS7
/dev/tty12  /dev/tty24  /dev/tty36  /dev/tty48  /dev/tty6   /dev/ttyS12     /dev/ttyS24  /dev/ttyS8
/dev/tty13  /dev/tty25  /dev/tty37  /dev/tty49  /dev/tty60  /dev/ttyS13     /dev/ttyS25  /dev/ttyS9
/dev/tty14  /dev/tty26  /dev/tty38  /dev/tty5   /dev/tty61  /dev/ttyS14     /dev/ttyS26  /dev/ttyUSB0
/dev/tty15  /dev/tty27  /dev/tty39  /dev/tty50  /dev/tty62  /dev/ttyS15     /dev/ttyS27
/dev/tty16  /dev/tty28  /dev/tty4   /dev/tty51  /dev/tty63  /dev/ttyS16     /dev/ttyS28
/dev/tty17  /dev/tty29  /dev/tty40  /dev/tty52  /dev/tty7   /dev/ttyS17     /dev/ttyS29
/dev/tty18  /dev/tty3   /dev/tty41  /dev/tty53  /dev/tty8   /dev/ttyS18     /dev/ttyS3
/dev/tty19  /dev/tty30  /dev/tty42  /dev/tty54  /dev/tty9   /dev/ttyS19     /dev/ttyS30
           

最後一個/dev/ttyUSB0便是。打開PuTTY,按下圖配置

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

選中Default Settings并點選Save可以将配置儲存為預設配置,最後點選Open。給闆子上電。

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

這是什麼鬼?折騰了半天,發現是權限不足的問題。。。在Deepin V15上可不是這樣的,看來20收緊了權限控制。

先來建立提權配置檔案[5]

[email protected]:~$ cd /usr/share/polkit-1/actions
[email protected]:/usr/share/polkit-1/actions$ sudo nano org.chiark.putty.policy
           

在建立的檔案中建立如下配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">

<policyconfig>
  <vendor>org.chiark.putty</vendor>
  <vendor_url>https://www.deepin.com/</vendor_url>

  <action id="org.chiark.putty">
    <message>Authentication is required to run the putty</message>
    <message xml:>putty 需要進行身份驗證</message>

    <defaults>
      <allow_any>no</allow_any>
      <allow_inactive>no</allow_inactive>
      <allow_active>yes</allow_active> <!--設定激活驗證模式:no,yes,auth_self,auth_admin,auth_self_keep,auth_admin_keep-->
    </defaults>

    <annotate key="org.freedesktop.policykit.exec.path">/opt/apps/org.chiark.putty/files/bin/putty</annotate> <!--設定程式執行路徑-->
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate> <!--設定是否允許GUI-->
  </action>

</policyconfig>
           

接下來需要修改desktop檔案

[email protected]:/usr/share/polkit-1/actions$ cd /usr/share/applications
[email protected]:/usr/share/applications$ sudo nano org.chiark.putty.desktop
           

在Exec=這一行的路徑前添加pkexec (此處有空格)

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

好,再運作試試。。。OK!給香橙派正式上電!

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

系統順利跑起來了!輸入root回車即可登陸。第一期就先到這裡,完成我們探索主線核心的第一步。

四、補充

4.1 文中用到的軟體包

移動的網盤,和彩雲。雖然需要注冊一下,但至少不限速,還是讓人舒暢不少。

連結: https://caiyun.139.com/m/i?0c5Cg6ku3wYS0  提取碼:HqAG  複制内容打開和彩雲手機APP,操作更友善哦

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

4.2 如何解決依賴包下載下傳慢的問題

如果完全按照本文上述的配置進行編譯,你會發現很多包還是很難下載下傳,畢竟各種開源的軟體不是集中放在哪一個網站上的,僅僅修改幾處網址也是收效甚微。各位網友應該已經注意到了,上面提供的網盤中有個dl.zip壓縮包

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

下載下傳這個壓縮包,将其解壓到buildroot-2020.11目錄下,這裡面包含着的軟體包就是本節文檔所需的全部包,如此一來,在make時便不會再去國外網站下載下傳了。可能有人已經發現了,在Build options下有個Download dir配置項

OrangePi PC 玩Linux主線核心踩坑之旅(一)之制作第一個鏡像一、什麼是主線核心?二、開發環境搭建三、用Buildroot建構第一個主線核心鏡像四、補充參考文獻

可見,預設的包下載下傳目錄就是dl檔案夾。我們也無需改動此配置,以後遇到難以下載下傳的包,可以使用其它離線下載下傳工具下載下傳後,放置到dl目錄下即可。雖然不能完全解決下載下傳慢的問題,但總比盯着螢幕傻等要好的多。

參考文獻

[1]https://blog.csdn.net/qq_43550613/article/details/83536118

[2]https://buildroot.org/

[3]https://www.cnblogs.com/kele-dad/p/8231434.html

[4]https://blog.csdn.net/haimo_free/article/details/107828155

[5]https://bbs.deepin.org/post/151900#mod=viewthread&tid=151900

繼續閱讀