i.MXU6LL - 制作燒錄SD卡詳細步驟
目錄
- i.MXU6LL - 制作燒錄SD卡詳細步驟
-
-
- 1、SD卡分區
- 2、拷貝uboot到SD卡
- 3、拷貝kernel和dtbs到SD卡
- 4、拷貝檔案系統到SD卡
-
本文所有操作均在root模式下進行!
本篇部落格步驟主要參考NXP官方的手冊《i.MX_Linux_Users_Guide.pdf》的這一章節:
1、SD卡分區
提示:我們常用的SD卡一個扇區的大小是512位元組。
先說一下i.MX6ULL使用SD卡啟動時的分區情況,NXP官方給的鏡像布局結構如下所示:
可以看到,上圖将一張SD卡分成了三部分:
- 第一部分:扇區起始位址2,大小為20478個扇區,分區格式為原始格式,用于存放uboot;
- 第二部分:扇區起始位址20480,大小為1024000個扇區,分區格式為FAT,用于存放核心和裝置樹;
- 第三部分:扇區起始位址1228800,大小為SD卡剩餘的空間,分區格式為Ext3或Ext4,用于存放rootfs,也就是檔案系統。
第一部分用于存放UBOOT,無檔案系統格式的要求,是以我們對分區的建立從第二部分開始就可以。
有了以上分區布局後,我們就可以對SD進行分區了。
拿到一張SD卡,首先将SD卡在windows下格式化成FAT32格式:
插入ubuntu系統之前,先使用以下指令檢視一下所有的磁盤:
fdisk -l
将SD卡插入ubuntu,再次輸入以上指令檢視一下所有磁盤,會發現多出來一個/dev/sdb和/dev/sdb1:
其中,/dev/sdb代表的就是SD卡本身,/dev/sdb1代表的是SD卡上的分區一,且格式為FAT32。
注意:SD卡插入ubuntu後,會出現/dev/sdX,具體是/dev/sdb還是/dev/sdc又或者是/dev/sdd要視個人插入ubuntu的USB口裝置情況而定。
接下來對SD卡重新分區:
fdisk /dev/sdb
依次輸入:
d ---> 删除分區
n ---> 建立分區
p ---> 選擇為主分區
1 ---> 分區編号為1
20480 ---> 分區1起始扇區
+500M ---> 分區大小:500MB
p ---> 顯示目前分區
n ---> 建立分區
p ---> 選擇為主分區
2 ---> 分區編号為2
1044480 ---> 分區起始位址
<enter> ---> 敲回車,表示将剩下的所有空間都分給分區2
p ---> 顯示目前分區
w ---> 儲存
如下圖所示:
設定sdb1分區格式為FAT:
sudo mkfs.vfat /dev/sdb1
設定sdb2分區格式為Ext3或Ext4都可以:
sudo mkfs.ext3 /dev/sdb2
或
sudo mkfs.ext4 /dev/sdb2
如下圖:
此時SD卡的分布如下圖所示:
2、拷貝uboot到SD卡
拷貝uboot到SD卡,輸入以下指令:
sudo dd if=u-boot.imx of=/dev/sdb bs=1k seek=1 conv=fsync
從上面我們對SD卡分區的時候知道,第一分區的起始位址是從扇區位址2開始的,SD卡的一個扇區是512位元組,也就是說第一分區的起始位址是SD卡的1K位元組處,上面這條指令中,bs設定dd指令的讀寫塊為1K大小,并且設定seek=1,表示從/dev/sdb開頭的1K位元組處開始寫u-boot.imx,正好就是寫到了u-boot在SD卡中所在的位置處。
問:為什麼從SD卡1K位置處存放uboot而不是從SD卡頭部開始?
答:這是NXP官方規定的,照做就是了。
dd指令可從标準輸入或檔案中讀取資料,根據指定的格式來轉換資料,再輸出到檔案、裝置或标準輸出。詳細指令解釋參見:https://www.runoob.com/linux/linux-comm-dd.html
- if=檔案名:輸入檔案名,預設為标準輸入。即指定源檔案。
- of=檔案名:輸出檔案名,預設為标準輸出。即指定目的檔案。
- bs=bytes:同時設定讀入/輸出的塊大小為bytes個位元組。
- seek=blocks:從輸出檔案開頭跳過blocks個塊後再開始複制。
- conv=<關鍵字>,關鍵字可以有以下11種:
- conversion:用指定的參數轉換檔案。
- ascii:轉換ebcdic為ascii
- ebcdic:轉換ascii為ebcdic
- ibm:轉換ascii為alternate ebcdic
- block:把每一行轉換為長度為cbs,不足部分用空格填充
- unblock:使每一行的長度都為cbs,不足部分用空格填充
- lcase:把大寫字元轉換為小寫字元
- ucase:把小寫字元轉換為大寫字元
- swap:交換輸入的每對位元組
- noerror:出錯時不停止
- notrunc:不截短輸出檔案
- sync:将每個輸入塊填充到ibs個位元組,不足部分用空(NUL)字元補齊。
3、拷貝kernel和dtbs到SD卡
建立挂載點:
mkdir /mountpoint
挂載分區一:
mount /dev/sdb1 /mountpoint
使用cp指令将zImage和*.dtb檔案拷貝進/mountpoint目錄,然後取消挂載:
umount mountpoint
4、拷貝檔案系統到SD卡
挂載分區二:
mount /dev/sdb2 /mountpoint
解包你的檔案系統,假設檔案系統包為:rootfs.tar.bz2
tar -jxvf rootfs.tar.bz2
進入檔案系統目錄:
cd rootfs
拷貝所有檔案到/mountpoint目錄:
cp -a * /mountpoint
然後取消挂載:
umount mountpoint
sync
到此,SD啟動卡就已經制作完成!
ends…