制作ubuntu燒錄鏡像
象棋小子 1048272975
一個基本的linux系統由引導加載器、核心和必要的檔案組成,可以選擇什麼被包括進來,然後去編譯實作,個性化配置好的linux系統可以制作成一個燒錄鏡像用于發行共享。
1. 資源準備
一個linux系統需要引導加載器(boot0、uboot),linux核心,根檔案系統這幾個部分。boot0、uboot、linux核心的編譯生成可以檢視“Linux核心編譯運作”這一章節,ubuntu根檔案系統的建構可以檢視“建構ubuntu根檔案系統”這一章節。
1.1. 引導加載器
編譯uboot并打包生成boot0和uboot鏡像,把lichee/tools/pack/out目錄中的boot0_sdcard.fex和boot_package.fex拷貝到/usr/image目錄。
1.2. 核心
編譯linux核心生成boot.img,把lichee/out/sun50iw2p1/linux/common目錄中的boot.img拷貝到/usr/image目錄。
1.3. 根檔案系統
建構好的ubuntu根檔案系統目錄打包生成ubuntu.tar.gz,拷貝到/usr/image/rootfs目錄中,并解壓。

2. 腳本實作
通過mkimage.sh腳本來實作ubuntu燒錄鏡像的制作,主要有以下這幾個過程。
a. 判斷是否root權限,制作鏡像需要root權限。
b. 切換到/usr/image目錄,在/usr/image目錄中已準備好相應的資源。
c. 整個img不會超過500M,配置設定500M的空間。分為boot0區域8K位置開始處,uboot區域16400K位置開始處,vfat檔案系統啟動區域,20M位置開始處,配置設定100M的空間,剩餘空間380M格式化成ext4檔案系統,作為根檔案系統區域。
d. 把boot0、uboot、boot.img、根檔案系統添加到img。
e. img加入相應的分區表。
#!/bin/bash
set-e
if[ "$(id -u)" != "0" ]; then
echo "Script must be run as root!"
exit 0
fi
ROOT=/usr/image
cd $ROOT
IMAGE="$ROOT/nanopi-neo2_ubuntu-base-16.04.2.img"
disk_size=500#MiB
boot0="$ROOT/boot0_sdcard.fex"
uboot="$ROOT/boot_package.fex"
echo "Creating image $IMAGE of size $disk_size MiB ..."
#Partition Setup
boot0_position=8 # KiB
uboot_position=16400 # KiB
part_position=20480 # KiB
boot_size=100 # MiB
set-x
dd if=/dev/zero bs=1M count=$((part_position/1024)) of="$IMAGE"
echo "Add boot0 into Image"
dd if="$boot0" conv=notrunc bs=1k seek=$boot0_positionof="$IMAGE"
echo "Add uboot into Image"
dd if="$uboot" conv=notrunc bs=1k seek=$uboot_positionof="$IMAGE"
echo "Create boot file system (VFAT)"
dd if=/dev/zero bs=1M count=${boot_size} of=${IMAGE}1
mkfs.vfat -n BOOT ${IMAGE}1
echo "Add boot.img into Image"
mcopy -m -i ${IMAGE}1 ${ROOT}/boot.img ::
dd if=${IMAGE}1 conv=notrunc oflag=append bs=1M seek=$((part_position/1024)) of="$IMAGE"
rm -f ${IMAGE}1
echo "Create additional ext4 file system for rootfs"
dd if=/dev/zero bs=1M count=$((disk_size-boot_size-part_position/1024))of=${IMAGE}2
mkfs.ext4 -F -b 4096 -E stride=2,stripe-width=1024 -L rootfs ${IMAGE}2
if[ ! -d /media/tmp ]; then
mkdir -p /media/tmp
fi
mount -t ext4 ${IMAGE}2 /media/tmp
echo "Add rootfs into Image"
cp -rfa $ROOT/rootfs/* /media/tmp
umount /media/tmp
dd if=${IMAGE}2 conv=notrunc oflag=append bs=1Mseek=$((part_position/1024+boot_size)) of="$IMAGE"
rm -f ${IMAGE}2
if[ -d /media/tmp ]; then
rm -rf /media/tmp
fi
echo "Add partition table"
cat<<EOF | fdisk "$IMAGE"
o
n
p
1
$((part_position*2))
+${boot_size}M
t
c
n
p
2
$((part_position*2+ boot_size*1024*2))
t
2
83
w
EOF
sync
clear
3. 開機啟動
用Win32DiskImager工具把做好的鏡像nanopi-neo2_ubuntu-base-16.04.2.img燒錄進sd卡, 上電啟動。
用df –h指令顯示目前所有檔案系統的最大可用空間及使用情形。
用mplayer播放mp3音頻。
4. 附錄
制作好的ubuntu燒錄鏡像及相應的實作腳本。
http://pan.baidu.com/s/1kUJdWMz