LeMaker Guitar:制作LeMaker Guitar系统镜像

From BananaPro/Pi
Jump to: navigation, search
This page is a translated version of the page LeMaker Guitar:How to make LeMaker Guitar OS image and the translation is 100% complete.

Other languages:
English • ‎中文(简体)‎

注意: 下面的操作在Linux系统PC机上执行,不是在LeMaker Guitar上。
LeMaker Guitar可以从EMMC NAND Flash和Micro SD卡两种不同的存储介质上启动操作系统。这边文章将描述如何利用平台固件包和linux文件系统制作EMMC NAND Flash .fw系统固件文件和Micro SD卡.img系统镜像文件。

前提

获取Linux平台固件包

这个平台固件包内有bootloader.bin, u-boot-dtb.img, misc.img等文件。有两种方式获取:

  • 在GitHub上获取:

https://github.com/LeMaker/hwpack-actions/tree/master/lemaker_guitar

制作根文件系统

在构建系统镜像之前,要有一相应的文件系统,可以参考以下三种方法制作:

使用存在的rootfs压缩包

我们在网上可以找到许多Linux发行版的文件系统压缩包,如Ubuntu, Fedora, Archlinux等等。只需下载压缩包并解压到SD卡或EMMC的第二分区(这里我们假设已经创建了两个分区,第一个是启动分区,第二个是文件系统分区)。例如:可以从以下链接下载Ubunbu Mate的文件系统(for armhf):https://ubuntu-mate.org/armhf-rootfs/

Linaro 文件系统

Linaro提供了一套不同的根文件系统,从以下链接下载并复制到SD卡或EMMC:
http://www.linaro.org/downloads/#dev-builds

使用debootstrap

debootstrap作为一个工具,它可以将Debian/Ubuntu系系统安装到一个已存在系统的子目录中。不需要用安装光盘,只要能访问Debian/Ubuntu软件仓库。
有必要改变root,因为有很多操作需要root权限:

su root

安装需要的安装包

我们需要debootstrap将Debian安装到一个目录之中,对于ARM环境中的chrooting (child rooting)而言, 我们需要qemu。使用下面命令安装必要的安装包:

apt-get install qemu-user-static binfmt-support

使用debootstrap安装Debian/Ubuntu

执行debootstrap:

mkdir ~/rootfs
debootstrap --arch=armhf --foreign $distro ~/rootfs

将$distro替换为相应的Ubuntu/Debian版本,如Ubuntu的‘saucy’、Debian的‘wheezy’,并将文件系统保存到~/rootfs.


在我们从chrooting切换到Debian/Ubuntu下之前,要从当前系统下复制两个文件:

cp /usr/bin/qemu-arm-static ~/rootfs/usr/bin/
cp /etc/resolv.conf ~/rootfs/etc
chroot ~/rootfs
export LANG=C


执行以下命令继续使用debootstrap:

/debootstrap/debootstrap --second-stage


# for Ubuntu
cat <<EOT > etc/apt/sources.list
deb http://ports.ubuntu.com/ $distro main universe
deb-src http://ports.ubuntu.com/ $distro main universe
deb http://ports.ubuntu.com/ $distro-security main universe
deb-src http://ports.ubuntu.com/ $distro-security main universe
deb http://ports.ubuntu.com/ $distro-updates main universe
deb-src http://ports.ubuntu.com/ $distro-updates main universe
EOT#


# for Debian
cat <<EOT > etc/apt/sources.list
deb http://http.debian.net/debian $distro main contrib non-free
deb-src http://http.debian.net/debian $distro main contrib non-free
deb http://http.debian.net/debian $distro-updates main contrib non-free
deb-src http://http.debian.net/debian $distro-updates main contrib non-free
deb http://security.debian.org/debian-security $distro/updates main contrib non-free
deb-src http://security.debian.org/debian-security $distro/updates main contrib non-free
EOT

接下来设置apt:

cat <<EOT > /etc/apt/apt.conf.d/71-no-recommends
APT::Install-Recommends "0";
APT::Install-Suggests "0";
EOT


从服务器更新最新的数据:

apt-get update


使用dpkg脚本进行本地设置(Debian):

apt-get install locales
dpkg-reconfigure locales


选择en_US.UTF-8或你所需要的:

export LANG=en_US.UTF-8

在chroot安装一些有用的安装包:

apt-get install openssh-server


设置root用户密码以便登陆:

passwd


设置主机名:

echo lemaker > /etc/hostname


退出chroot对话:

/etc/init.d/ssh stop
exit

清理支持文件

rm ~/rootfs/usr/bin/qemu-arm-static ~/rootfs/etc/resolv.conf


制作Linux系统镜像

当平台固件包和文件系统准备好之后,参考以下教程创建系统镜像。

为MicroSD卡制做镜像

MicroSD卡规划

MicroSD card layout.png

MicroSD卡规划
名字 开始地址 用途
mbr 0 SD卡的第一引导分区
gpt 0x200 gtb分区表
环境 0x5000 uboot环境变量
bootloader 0x200200 boottraps第一阶段 (bootloader.bin)
uboot 0x300000 uboot bootloader (u-boot-dtb.img)
misc 0x800000 fat分区,包含kernel, initramfs,内核配置文件, uEnv.txt等等…(misc.img)
rootfs 0x3800000 文件系统(rootfs.img)

构建SD卡系统

步骤1: 创建一个指定大小的文件。

sudo dd if=/dev/zero of=[system_name].img bs=1M count=3500

步骤2:把文件虚拟成块设备文件。

sudo losetup -f --show {system_name}.img 
/dev/loop0

步骤3:创建分区。

sudo parted /dev/loop0
GNU Parted 2.3
Using /dev/loop0
Welcome to GNU Parted! Type 'help' to view a list of commands.
 
(parted) mklabel gpt             #创建gpt分区表 
(parted) print                   #查看分区
Model: Loopback device (loop)
Disk /dev/loop0: 3670MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
 
Number  Start  End  Size  File system  Name  Flags
 
(parted) unit s                         #设置分区单元大小(512字节)
(parted) mkpart primary 16384 114687    #创建第一个分区:8M-56M                                     
(parted) mkpart primary 114688 -1       #创建第二个分区:56M-END                                    
Warning: You requested a partition from 114688s to 7167999s.              
The closest location we can manage is 114688s to 7167966s.
Is this still acceptable to you?
Yes/No? yes                                                               
(parted) print                          #查看分区                                                    
Model: Loopback device (loop)
Disk /dev/loop0: 7168000s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
 
Number  Start    End       Size      File system  Name     Flags
 1      16384s   114687s   98304s                 primary
 2      114688s  7167966s  7053279s               primary
(parted) q                                #退出
Information: You may need to update /etc/fstab.

步骤4: 查看虚拟设备块分区。

sudo kpartx -av /dev/loop0
add map loop0p1 (252:0): 0 98304 linear /dev/loop0 16384
add map loop0p2 (252:1): 0 7053279 linear /dev/loop0 114688

注意:如果不能找到kpartx,请先安装kpartx。

sudo apt-get install kpartx

步骤5:查看映射设备块文件。

ls -l /dev/mapper/
lrwxrwxrwx 1 root root       7 Aug 10 02:28 loop0p1 -> ../dm-0
lrwxrwxrwx 1 root root       7 Aug 10 02:28 loop0p2 -> ../dm-1

步骤6:格式化分区

sudo mkfs.vfat /dev/mapper/loop0p1   #格式化分区为fat格式
mkfs.vfat 3.0.12 (29 Oct 2011)        
unable to get drive geometry, using default 255/63
 
sudo mkfs.ext4 /dev/mapper/loop0p2   #格式化第二个分区为Ext4格式
mke2fs 1.42 (29-Nov-2011)
Discarding device blocks: done                            
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
220752 inodes, 881659 blocks
44082 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=905969664
27 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

步骤7:写入bootloader到MicroSD卡系统镜像。起始地址:0x200200,第 4097块分区。

sudo dd if=bootloader.bin of=/dev/loop0  bs=512 seek=4097

步骤8:写入uboot到MicroSD卡镜像。起始地址:0x300000。

sudo dd if=u-boot-dtb.img of=/dev/loop0 bs=512 seek=6144

步骤9:写入misc镜像到MicrSD卡的第一个分区。

sudo dd if=misc.img of=/dev/mapper/loop0p1

步骤10:写入rootfs到MicroSD镜像的第二个分区。

sudo mount /dev/mapper/loop0p2 /mnt
sudo cp -a rootfs/* /mnt
sync
sudo umount /mnt

步骤11:卸载块设备文件

sudo kpartx -d /dev/loop0
sudo losetup -d /dev/loop0

步骤12: 卸载镜像文件

sudo kpartx -d /dev/loop0
sudo losetup -d /dev/loop0

到目前为止,制作MicroSD卡系统镜像完成,请参考:LeMaker_Guitar:Quick_Start#Installing_the_OS_image_into_MicroSD_card 使用Win32DiskImager工具,把系统镜像烧写到MicroSD卡。

制做 eMMC NAND Flash的固件包

安装 image-create-tools 工具

git clone https://github.com/LeMaker/image-create-tools.git

执行“./linux-image-create -h”命令,了解linux-image-create更多用法。

cd image-create-tools
sudo ./make-linux-emmc-fw -h
Usage:  make-linux-emmc-fw [options] [parameters]
 
Options:
	-g --cfg     配置系统镜像分区
	-p --hwpack  选择固件压缩包
	-r --rootfs  指定系统文件目录
	-h --help    帮助信息
	-c --clean   清除所有目标文件
	-o --output  配置输出文件名字
 
Example:
	./make-linux-emmc-fw --hwpack xxx_hwpack.tar.[xz|bz2|gz] --rootfs xxx_directory <--cfg xxx/partition.conf> <--output s500_lemaker_guitar>

步骤2:制作一个.fw系统固件文件。

./make-linux-emmc-fw -p [hwpack_pathname]/lemaker_guitar_bbb_hwpack_xxxxxx.tar.xz -r [rootfs_pathname]/rootfs -o s500_lemaker_guitar

现在,制作eMMC NAND Flash系统固件文件完成。请参考LeMaker_Guitar:Quick_Start#Installing_OS_image_into_eMMC_NAND_FlashIH FW Burning Tool工具烧写固件到eMMC NAND Flash。