基于iTOP-4412开发板(精英版)的linux 4.14.2根文件系统移植
Posted 气血龙渊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于iTOP-4412开发板(精英版)的linux 4.14.2根文件系统移植相关的知识,希望对你有一定的参考价值。
准备工作
虚拟机:VM-Ware 15.0 pro
操作系统:Ubuntu Linux 16.04
交叉编译器:arm-linux-gcc 4.6.2g
BusyBox:busybox-1.26.2.tar
工作文件夹:/home/用户名/work
一、编译Linux命令集
1、BusyBox源码获取
Busybox官方下载地址:https://busybox.net/
busybox功能简介https://blog.csdn.net/feelinghappy/article/details/92133067
busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小。我们平时用的那些linux命令就好比是分立式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中busybox有非常广的应用。另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候案ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接。
2、解压缩BusyBox
在工作文件夹中新建rootfs文件夹,将下载的busybox-1.26.2.tar.bz2压缩包拷贝到该文件夹解压:
解压结果:
3、修改Makefile
进入Busybox根文件夹,用gedit打开Makefile文件
修改190行和164行对应的架构(arch)和交叉编译器(CROSS_COMPILE)
存盘退出。
4、打开Busybox配置菜单
输入make menuconfig,打开编译配置菜单:
5、Busybox编译设置
在busybox的设置菜单中,选中静态编译系统减少出错。如图:
返回顶层菜单。
6、裁剪Linux命令
Busybox支持上百个linux命令,在实际应用中未必都能用到,可以把不用的裁剪掉节省存储空间。另外arm-linux-gcc 4.6.2交叉编译器默认情况下有几个命令编译无法通过,所以也要裁剪掉。
a、裁剪掉sync命令
进入Coreutils菜单,去掉选项sync前的星号
b、裁剪掉nsenter命令
进入Linux System Utilities菜单,去掉选项nsenter前的星号
c、裁剪掉nandwrite与nanddump命令
进入Miscellaneous Utilities菜单,去掉选项nandwrite、nanddump前的星号
7、编译Linux命令
退到busybox根文件夹用make编译,结果如图:
用make install命令再次编译,将整合的命令文件存入_install文件夹,结果如图:
至此,Linux命令集编译完毕,结果如下图:
生成的三个文件夹和一个文件后面使用。
二、创建Linux系统根文件
1、新建根文件夹
在rootfs文件夹中新建system文件夹,进入system文件夹后使用命令“mkdir dev etc lib mnt proc sys tmp var”创建linux根文件夹,结果如图:
2、拷贝Linux命令到根文件夹
将Busybox中_install文件夹中的全部内容拷贝到system文件夹,如图:
3、新建登录权限文件
进入到刚才创建的etc文件夹里,新建passwd文件并输入以下内容:
root::0:0:root:/:/bin/sh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
此时我们新建了四个用户,超级用户的uid为0,在/etc/passwd里面有很多伪用户,这些用户是不能登入的,他们的uid在1-499之间,安装完系统就缺省的添加了这些用户。UID为0的用户就是超级用户。
4、新建profile文件
profile文件是有关Linux环境变量的文件,在etc文件夹里新建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文件,设置后会影响到所有用户
/home/username/.profile或.bash_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文件夹里输入mkdir -p etc/hotplug/usb 命令创建usb文件夹,如图:
进入usb文件夹,用gedit udisk_insert命令创建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
用gedit udisk_remove命令创建udisk_remove脚本输入以下内容:
#!/bin/sh
echo "usbdisk remove!" > /dev/console
umount -l /mnt/usbdisk/sd*
rm -rf /mnt/usbdisk/sd*
7、修改根文件系统权限
进入rootfs文件夹,修改system文件夹内所有文件权限:
三、创建文件系统镜像
1、解压镜像文件制作工具
拷贝制作工具压缩包“linux_tools.tgz”到 rootfs目录下,使用解压命令“tar -zxvf linux_tools.tgz”解压,如下图所示。
解压完成后,到里面的bin文件夹把make_ext4fs文件拷贝回到rootfs文件夹
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开发板(精英版)的linux 4.14.2根文件系统移植的主要内容,如果未能解决你的问题,请参考以下文章
基于iTOP-4412开发板(精英版)的linux 4.14.2内核移植
基于iTOP-4412开发板(精英版)的linux 4.14.2内核移植
基于iTOP-4412开发板(精英版)的linux 4.14.2系统LED字符驱动程序设计
基于iTOP-4412开发板(精英版)的linux 4.14.2根文件系统移植