准备工作
虚拟机:VM-Ware 16.2.3
操作系统:Ubuntu Linux 16.04
交叉编译器:arm-linux-gcc-4.6.4
工作文件夹:/home/work
搭建配置好交叉编译环境,完整搭建配置过程可参照下述博文:
ubuntun16.04下arm-linux-gcc交叉编译器的安装配置_arm-linux-gcc安装包-优快云博客
提示:虚拟机中解压完后的原打包文件建议删除,可以节约虚拟机空间。
概述
文件系统:可以简单理解为两个部分,一个是文件,另一个是系统。
文件系统是一个用来组织和管理文件的系统。
有了文件系统之后,就可以轻松操作存储在存储介质上的文件,比如文件的增、删、查、改等基本操作。文件系统的格式有很多种(fat32、ext2、ext3、ntfs等)。
根文件系统:最顶端称为根,在Linux上用“/ ”表示,然后将一个按照特定目录组成的文件系统挂载到根上,这个系统就叫做根文件系统。
Busybox是一个集成大量Linux命令的工具,例如ls,cat,cp等命令,使用busybox可以很容易构建出根文件系统需要的命令。
一、编译Linux命令集
1、获取BusyBox源码
Busybox官方下载地址:BusyBox
busybox功能简介 :busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小,我们平时用的那些linux命令就好比是分立式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍。
在嵌入式linux应用中,busybox有非常广的应用,另外,,大多数linux发行版的安装程序中都有busybox的身影,比如安装linux的时候案ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接。
BusyBox是很多标准的 Linux 工具的一个可执行实现,主要应用于嵌入式linux系统,是一个开源的“万能工具”。
2、虚拟机里BusyBox操作
在 “/home/work” 文件夹中新建rootfs文件夹,将下载的busybox-1.26.2.tar压缩包拷贝到该文件夹,并解压,具体操作如下图所示:
解压结果如下:
3、编辑Makefile
进入Busybox根文件夹,用gedit打开Makefile文件,如下所示:
cd busybox-1.26.2/
gedit Makefile
保存退出。
4、打开Busybox配置菜单
输入make menuconfig,打开编译配置菜单,如所示:
make menuconfig
5、编译Busybox
在busybox的设置菜单中,选中静态编译系统减少出错。如下图所示:
返回顶层菜单。
6、裁剪Linux命令
Busybox支持上百个linux命令,在实际应用中未必都能用到,可以把不用的裁剪掉节省存储空间。另外arm-linux-gcc 4.6.4交叉编译器默认情况下有几个命令编译无法通过,所以也要裁剪掉。
(1)裁剪sync命令
进入Coreutils菜单,去掉选项sync前的星号,如下图所示:
(2)裁剪nsenter命令
进入Linux System Utilities菜单,去掉选项nsenter前的星号,如下图所示:
(3)裁剪nandwrite与nanddump命令
进入Miscellaneous Utilities菜单,去掉选项nandwrite、nanddump前的星号,如下图所示:
保存退出Busybox配置菜单。
7、编译Linux命令
退到Busybox根文件夹,用 “ make ” 进行编译,如下图所示:
用 “ make install ” 命令再次编译,作用是将整合的命令 文件存入_install文件夹,如下图所示:
至此,Linux命令集编译完毕,结果如下图所示:
生成如上图所示的三个文件夹和一个文件后面使用。
二、创建Linux系统根文件
1、创建linux根文件夹
在rootfs目录中新建system目录,进入system目录后,使用下述命令创建需要的文件夹,结果如下所示:
mkdir dev etc lib mnt proc sys tmp var
2、拷贝Linux命令到根文件夹
将Busybox中_install目录中的全部内容拷贝到system根目录(当前目录)中,使用下述命令,结果如下所示:
cp -rf ../busybox-1.26.2/_install/* ./
3、新建登录权限文件
进入到刚才创建的etc目录里,新建passwd文件,命令如下:
touch passwd #可省略
gedit passwd
并在passwd文件中输入以下内容:
root::0:0:root:/:/bin/sh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
操作命令如下图所示:
保存退出。
说明:/etc/passwd
文件存放的是用户的信息。
此时我们新建了四个用户,超级用户的uid为0,在/etc/passwd里面有很多伪用户,这些用户是不能登入的,他们的uid在1-499之间,安装完系统就缺省的添加了这些用户。UID为0的用户就是超级用户。
4、新建profile文件
profile文件是有关Linux环境变量的文件,在etc文件夹里新建profile文件,命令如下:
touch profile #可省略
gedit profile
并输入以下内容:
# Ash profile
# vim: syntax=sh
# No core files by default
Ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
#PS1='[$USER@$HOSTNAME]# '
PS1='\h:\w\$ '
PS2='>'
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
操作过程如下图所示:
保存退出。
说明:/etc/profile:是全局profile文件,设置后会影响到所有用户。
在profile文件添加或修改的内容需要注销系统才能生效。
(注意:profile是unix上才有的;bash_profile是Linux下有的;Linux下,用户目录没有.profile文件;/home/userName/.bash_profile,是隐藏文件,需要使用ls -alh才能看到的。)
Bash登陆 (login) 的时候,profile执行的顺序:先执行全局/etc/profile 接着bash会检查使用者的HOME目录中,是否有 .bash_profile 或者 .bash_login或者 .profile,若有,则会执行其中一个,执行顺序为.bash_profile 最优先 > .bash_login其次 > .profile
常见的环境变量:
PATH:决定了shell将到哪些目录中寻找命令或程序
HOME:当前用户主目录
MAIL:是指当前用户的邮件存放目录。
SHELL:是指当前用户用的是哪种Shell。
HISTSIZE:是指保存历史命令记录的条数。
LOGNAME:是指当前用户的登录名。
HOSTNAME:是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
PS1:是基本提示符,对于root用户是#,对于普通用户是$。
PS2:是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比如下列命令会将提示符修改成字符串“Hello,My NewPrompt 😃 ”。
# PS1=” Hello,My NewPrompt 😃 “
(注意:Linux profile文件在系统启动时将被运行。可以在里面加入其他命令,但是一定要加正确,不然的话系统会启动不起来的。)
5、新建启动脚本文件
在etc目录里创建文件夹init.d,进入init.d文件夹,用gedit创建并编辑rcS文件,并输入以下内容:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
# boot level
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
# 启动时屏蔽中断
trap ":" INT QUIT TSTP
IP=192.168.1.200
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90
# 挂载系统文件夹
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
# 即插即用配置
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
# 创建DEV子文件夹
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/log/boa
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp
# 启动系统日志进程
syslogd
sleep 1
echo " " > /dev/ttySAC2
echo "Starting networking" > /dev/ttySAC2
echo " " > /dev/ttySAC2
sleep 1
echo " " > /dev/ttySAC2
echo -n Try to bring eth0 interface up......>/dev/ttySAC2
echo " " > /dev/ttySAC2
sleep 1
ifconfig eth0 down
ifconfig lo 127.0.0.1
ifconfig eth0 hw ether $MAC
ifconfig eth0 $IP netmask $Mask up
route add default gw $Gateway
echo nameserver $DNS > /etc/resolv.conf
#上面一段中usb0为网卡名称,以开发板ifconfig -a命令为准(与linux版本有关)
echo Done > /dev/ttySAC2
/bin/hostname S601
sleep 1
echo "*************************************" > /dev/ttySAC2
echo " 601 embedded Laboratry " > /dev/ttySAC2
echo "*************************************" > /dev/ttySAC2
sleep 1
操作过程如下图所示:
保存退出。
6、创建U盘热插拔脚本文件
首先,在etc目录里创建并编辑mdev.conf 文件,并输入以下内容:
sd[a-z][0-9] 0:0 666 @/etc/hotplug/usb/udisk_insert
sd[a-z] 0:0 666 $/etc/hotplug/usb/udisk_remove
操作过程如下图所示:
保存退出。
在etc目录里输入下述命令,创建usb目录,如下所示:
mkdir -p hotplug/usb
操作过程如下图所示:
说明:mkdir -p是一个Bash shell中的命令,用于创建目录。与普通的mkdir命令不同,mkdir -p命令可以创建多层目录,即使中间的目录不存在也可以创建。
mkdir -p命令的主要优点是它可以帮助您快速创建多层目录,而无需手动创建每个目录。这在编写脚本或在命令行中执行多个命令时非常有用。
注意:mkdir -p 命令不会覆盖现有目录。如果您尝试创建一个已经存在的目录,则mkdir -p命令将忽略该命令,并继续创建其他目录。
其次,进入usb目录,输入下述命令命令创建udisk_insert脚本,如下所示:
gedit udisk_insert
并输入以下内容:
#!/bin/sh
echo "usbdisk insert!" > /dev/console
if [ -e "/dev/$MDEV" ] ; then
mkdir -p /mnt/usbdisk/$MDEV
mount /dev/$MDEV /mnt/usbdisk/$MDEV
fi
操作过程如下图所示:
保存退出。
最后,usb目录下输入下述命令创建并编辑udisk_remove脚本,如下所示:
gedit udisk_remove
并输入以下内容:
#!/bin/sh
echo "usbdisk remove!" > /dev/console
umount -l /mnt/usbdisk/sd*
rm -rf /mnt/usbdisk/sd*
操作过程如下图所示:
7、修改根文件系统权限
进入rootfs根目录,修改system文件夹内所有文件权限,命令如下:
sudo chmod 777 system -R
#或
# sudo chmod -R 777 system
如下图所示:
三、创建文件系统镜像
1、镜像文件制作工具
拷贝制作工具压缩包 “linux_tools.tgz” 到 rootfs目录下,再使用解压命令 “tar -zxvf linux_tools.tgz”进行解压,过程如下图所示:
解压完成后,将解压后的bin文件夹中的make_ext4fs文件拷贝回到rootfs文件夹,操作命令如下所述(注意操作命令所的目录还是rootfs):
cp -rf usr/local/bin/make_ext4fs ./
操作过程如下图所示:
2、制作镜像文件
在rootfs目录下输入命令:
make_ext4fs -s -l 314572800 -a root -L linux system.img system
操作过程如下图所示:
或下图:
说明: -a root 是指这个img是用于Linux系统;
若为-a system即表示为android系统,挂载点即是/system;
使用这个参数,make_ext4fs会根据private/android_filesystem_config.h里定义好的权限来给文件夹里的所有文件重新设置权限,可以手工修改android_filesystem_config.h来添加权限,重新编译make_ext4fs,也可以不使用 “-a system”参数,这样就会使用文件的默认权限;
-l 3141572800 代表的是分区大小;
-s 就是生成ext4的S模式制作(使用gzip压缩);
-L 创建的镜像标签;
system.img为创建的镜像名称,system为原目录位置。
生成 system.img 即移植后生成的文件系统镜像,如下图所示,到此为止即完成了 linux 文件系统镜像的制作。
后续烧写操作可参照博文:
迅为iTOP-4412精英版之烧写设备树系统_exynos 4412 刷机-优快云博客
将生成的system.img拷贝到fastboot烧写工具根目录下,利用cmd.exe完成系统镜像的烧写即可。
3、错误解决
如果出现下图错误提示:
输入下述命令进行安装操作:
sudo apt install android-tools-fsutils