本篇文章的文件系統是瘦身版的,不健全的。但這恰恰是學習內核的好方法,系統運行時會提示缺少什麼,或者異常。當你解決這些問題的時候,就會了解到文件系統爲什麼有這些文件,這些目錄。
網上有很多關於nanopi m3的燒寫開機啓動教程。大多數都是根據友善之臂公司給出的官方教程,這裏我也把官方教程鏈接貼出來:http://www.arm9.net/nanopi-m3.asp。
今天我要記錄的nanopi m3開機啓動教程,是開機啓動linux小系統,進入shell命令行,沒有多餘的東西。整個系統就只有三個東西:U-boot,kernel,rootfs。所以我不需要4G以上的內存卡,有個10幾M就足夠了。所以我隨便找了個以前不用的256M內存卡,準備開始玩一下。
·分析官方鏡像文件
先了解下“敵情”
首先從官網下載了燒寫鏡像文件,我這裏選擇s5p6818-debian-wifiap-sd4g-20161117.img。名字太長了,我直接重名爲debian.img。
用file命令查看下鏡像文件,
jqh@ubuntu:~/work$ file debian.img
debian.img: DOS/MBR boot sector; partition 1 : ID=0x83, start-CHS (0x0,1,1), end-CHS (0x3ff,254,63), startsector 2048, 131072 sectors; partition 2 : ID=0x83, start-CHS (0x0,1,1), end-CHS (0x3ff,254,63), startsector 133120, 7484066 sectors
可以看出,鏡像分成兩個分區partition1~2。第一個分區從2048段開始,總共有131072個段。第二個分區從133120段開始。
那0到2047段怎麼沒有提及。其實第0段是有作用的,可以上網瞭解下,其中一個作用就是描述塊設備的分區情況。第1~2047段,就是引導程序了,包括u-boot。
用fdisk命令查下鏡像文件,
jqh@ubuntu:~/work$ fdisk -lu debian.img
Disk debian.img: 3.6 GiB, 3899999232 bytes, 7617186 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
debian.img1 2048 133119 131072 64M 83 Linux
debian.img2 133120 7617185 7484066 3.6G 83 Linux
這裏我們瞭解到每一個段sector的大小是512字節。所以分區描述段和引導段總大小是1M。第一個分區大小64M,第二個分區大小3.63G,所以知道官方爲什麼需要你準備不小於4G的內存卡了吧。我們這裏只需要前1M數據拿出來,然後自己做2個小分區,一個放內核文件,一個放文件系統就可以了。
格式化256M內存卡
將內存卡以前的分區信息全部幹掉。
jqh@ubuntu:~/work$ ls /dev/sdb*
/dev/sdb
重新建立分區,具體如下圖
然後將兩個分區格式化,第一個分區格式化爲FAT,第二個分區格式化爲ext4(也可以不要fat看個人喜好)。
下圖可以看到格式化,掛載後的信息,
提取debian.img的引導段程序
由上面分析可知,我們只需要debian.img的第1段到2047段就可以了,所以,使用dd命令:
jqh@ubuntu:~/work$ sudo dd if=debian.img of=/dev/sdb bs=512 count=2047 seek=1 skip=1
2047+0 records in
2047+0 records out
1048064 bytes (1.0 MB, 1.0 MiB) copied, 1.10491 s, 949 kB/s
其中seek表示跳過輸入文件多少個bs,skip表示跳過輸出文件多少個bs。
到這裏,引導代碼就提取出來了,趕緊來試試引導程序能不能跑起來。
接上串口115200,8n1,看到如下打印信息:
Welcome to minicom 2.7
OPTIONS: I18n
Compiled on Nov 15 2018, 20:18:47.
Port /dev/ttyUSB0, 06:08:35
Press CTRL-A Z for help on special keys
scratch is broken, clear
watchdog timer star
working to aarch32
waiting for pll change..
--------------------------------------------------------------------------------
Second Boot by Nexell Co. : Ver0.3.6 - Built on Jun 29 2016 15:19:53
--------------------------------------------------------------------------------
DDR3 POR Init Start 0
Lock value = 188
······
mmc0 is current device
Writing to MMC(0)... done
Writing to MMC(0)... done
HDMI: display.0, preset 0 (1280 * 720)
HDMI: PHY Ready!!!
Failed to mount ext2 filesystem...
** Unrecognized filesystem type **
can't find bmp at 0x47000000 (type:0xffff), fb:0x46000000...
LOGO: DRAW FB=0x46000000, X=1280, Y= 720, Bpp=32
Hit any key to stop autoboot: 0
s5p6818#
從打印看,好像不支持FAT,算了我還是把第一個分區格式化爲ext2再試試。
改之後如下圖所示,這裏報錯誤是因爲使用了默認的內核鏡像,我們需要更改默認鏡像名字,或者手動選擇啓動。後面會講到,
下一步把內核放到第一分區。
由於默認的U-boot,引導過程只有1秒的等待時間,如果沒有按鍵,就往下執行。我們可以將這個延時改大一些,免得手忙腳亂。
這樣下次開機,它就會等你10秒了。
·把nanopi m3的內核放到第一個分區
自己編譯一個內核,內核獲取地址:'https://github.com/friendlyarm/linux-3.4.y.git/
編譯方法
make nanopi3_linux_defconfig ARCH=??
make uImage ARCH=?? CROSS_COMPILE=??
·將busybox做好的文件系統放到第二個分區
這裏還需要做一個修改,修改啓動參數bootargs。因爲我們只需要一些簡單的參數就可以了。
我們嘗試啓動內核,在串口輸入如下命令,果然內核啓動成功。
s5p6818# ext4load mmc 0:1 0x48000000 uImage
s5p6818# bootm 0x48000000
## Booting kernel from Legacy Image at 48000000 ...
Image Name: Linux-3.4.39-s5p6818-gc496018
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4431400 Bytes = 4.2 MiB
Load Address: 40008000
Entry Point: 40008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
Starting kernel ...
省略一堆打印信息,進入shell命令行,如下:
查看系統版本
/ # uname -a
Linux NanoPi3 3.4.39-s5p6818-gc496018 #1 SMP PREEMPT Sun Jan 20 00:47:18 PST 2019 armv7l GNU/Linux
查看文件系統
/ # ls
bin etc lost+found sbin usr
dev linuxrc proc sys
說明確實啓動成功。恭喜~~
官方自帶的鏡像u-boot是不支持網絡功能的,後面將會修改u-boot配置,替換當前的U-boot,使得u-boot支持網絡功能,開發樂趣更多,免於不停燒寫內存卡影響壽命。