制作ubuntu烧录镜像
象棋小子 1048272975
@H_502_4@一个基本的linux系统由引导加载器、内核和必要的文件组成,可以选择什么被包括进来,然后去编译实现,个性化配置好的linux系统可以制作成一个烧录镜像用于发行共享。1. 资源准备
@H_502_4@一个linux系统需要引导加载器(boot0、uboot),linux内核,根文件系统这几个部分。boot0、uboot、linux内核的编译生成可以查看“Linux内核编译运行”这一章节,ubuntu根文件系统的构建可以查看“构建ubuntu根文件系统”这一章节。1.1. 引导加载器
@H_502_4@编译uboot并打包生成boot0和uboot镜像,把lichee/tools/pack/out目录中的boot0_sdcard.fex和boot_package.fex拷贝到/usr/image目录。1.2. 内核
@H_502_4@编译linux内核生成boot.img,把lichee/out/sun50iw2p1/linux/common目录中的boot.img拷贝到/usr/image目录。1.3. 根文件系统
@H_502_4@构建好的ubuntu根文件系统目录打包生成ubuntu.tar.gz,拷贝到/usr/image/rootfs目录中,并解压。
2. 脚本实现
@H_502_4@通过mkimage.sh脚本来实现ubuntu烧录镜像的制作,主要有以下这几个过程。 @H_502_4@a.判断是否root权限,制作镜像需要root权限。 @H_502_4@b.切换到/usr/image目录,在/usr/image目录中已准备好相应的资源。 @H_502_4@c.整个img不会超过500M,分配500M的空间。分为boot0区域8K位置开始处,uboot区域16400K位置开始处,vfat文件系统启动区域,20M位置开始处,分配100M的空间,剩余空间380M格式化成ext4文件系统,作为根文件系统区域。 @H_502_4@d.把boot0、uboot、boot.img、根文件系统添加到img。 @H_502_4@e.img加入相应的分区表。 @H_502_4@#!/bin/bash @H_502_4@set-e @H_502_4@if[ "$(id -u)" != "0" ]; then @H_502_4@ echo "Script must be run as root!" @H_502_4@ exit 0 @H_502_4@fi @H_502_4@ROOT=/usr/image @H_502_4@cd $ROOT @H_502_4@IMAGE="$ROOT/nanopi-neo2_ubuntu-base-16.04.2.img" @H_502_4@disk_size=500#MiB @H_502_4@boot0="$ROOT/boot0_sdcard.fex" @H_502_4@uboot="$ROOT/boot_package.fex" @H_502_4@echo "Creating image $IMAGE of size $disk_size MiB ..." @H_502_4@#Partition Setup @H_502_4@boot0_position=8 # KiB @H_502_4@uboot_position=16400 # KiB @H_502_4@part_position=20480 # KiB @H_502_4@boot_size=100 # MiB @H_502_4@set-x @H_502_4@dd if=/dev/zero bs=1M count=$((part_position/1024)) of="$IMAGE" @H_502_4@echo "Add boot0 into Image" @H_502_4@dd if="$boot0" conv=notrunc bs=1k seek=$boot0_positionof="$IMAGE" @H_502_4@echo "Add uboot into Image" @H_502_4@dd if="$uboot" conv=notrunc bs=1k seek=$uboot_positionof="$IMAGE" @H_502_4@echo "Create boot file system (VFAT)" @H_502_4@dd if=/dev/zero bs=1M count=${boot_size} of=${IMAGE}1 @H_502_4@mkfs.vfat -n BOOT ${IMAGE}1 @H_502_4@echo "Add boot.img into Image" @H_502_4@mcopy -m -i ${IMAGE}1 ${ROOT}/boot.img :: @H_502_4@dd if=${IMAGE}1 conv=notrunc oflag=append bs=1M seek=$((part_position/1024)) of="$IMAGE" @H_502_4@rm -f ${IMAGE}1 @H_502_4@echo "Create additional ext4 file system for rootfs" @H_502_4@dd if=/dev/zero bs=1M count=$((disk_size-boot_size-part_position/1024))of=${IMAGE}2 @H_502_4@mkfs.ext4 -F -b 4096 -E stride=2,stripe-width=1024 -L rootfs ${IMAGE}2 @H_502_4@if[ ! -d /media/tmp ]; then @H_502_4@ mkdir -p /media/tmp @H_502_4@fi @H_502_4@mount -t ext4 ${IMAGE}2 /media/tmp @H_502_4@echo "Add rootfs into Image" @H_502_4@cp -rfa $ROOT/rootfs/* /media/tmp @H_502_4@umount /media/tmp @H_502_4@dd if=${IMAGE}2 conv=notrunc oflag=append bs=1Mseek=$((part_position/1024+boot_size)) of="$IMAGE" @H_502_4@rm -f ${IMAGE}2 @H_502_4@if[ -d /media/tmp ]; then @H_502_4@ rm -rf /media/tmp @H_502_4@fi @H_502_4@echo "Add partition table" @H_502_4@cat<<EOF | fdisk "$IMAGE" @H_502_4@o @H_502_4@n @H_502_4@p @H_502_4@1 @H_502_4@$((part_position*2)) @H_502_4@+${boot_size}M @H_502_4@t @H_502_4@c @H_502_4@n @H_502_4@p @H_502_4@2 @H_502_4@$((part_position*2+ boot_size*1024*2)) @H_502_4@t @H_502_4@2 @H_502_4@83 @H_502_4@w @H_502_4@EOF @H_502_4@sync @H_502_4@clear3. 开机启动
@H_502_4@用Win32DiskImager工具把做好的镜像nanopi-neo2_ubuntu-base-16.04.2.img烧录进sd卡, 上电启动。 @H_502_4@用df –h命令显示目前所有档案系统的最大可用空间及使用情形。@H_502_4@用mplayer播放mp3音频。